sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit fe56e8fe02b2be19b455652ace77959ef13feeb7
parent 462eba9c8b1178fd37130739863486e273c2ef54
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date:   Fri,  9 Nov 2007 18:42:51 +0000

added chronic support thanks to Marcus Williams

git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@688 5c8cc53c-5e98-4d25-b20a-d8db53a31250

Diffstat:
M lib/sup.rb | 26 ++++++++++++++------------
M lib/sup/index.rb | 37 +++++++++++++++++++++++++++++++++----
M lib/sup/modes/search-results-mode.rb | 2 +-
3 files changed, 48 insertions(+), 17 deletions(-)
diff --git a/lib/sup.rb b/lib/sup.rb
@@ -214,6 +214,20 @@ require "sup/hook"
 ## time.
 Redwood::HookManager.new Redwood::HOOK_DIR
 
+## everything we need to get logging working
+require "sup/buffer"
+require "sup/keymap"
+require "sup/mode"
+require "sup/modes/scroll-mode"
+require "sup/modes/text-mode"
+require "sup/modes/log-mode"
+require "sup/logger"
+module Redwood
+  def log s; Logger.log s; end
+  module_function :log
+end
+
+## now everything else (which can feel free to call Redwood::log at load time)
 require "sup/update"
 require "sup/suicide"
 require "sup/message-chunks"
@@ -227,9 +241,6 @@ require "sup/account"
 require "sup/thread"
 require "sup/index"
 require "sup/textfield"
-require "sup/buffer"
-require "sup/keymap"
-require "sup/mode"
 require "sup/colormap"
 require "sup/label"
 require "sup/contact"
@@ -237,8 +248,6 @@ require "sup/tagger"
 require "sup/draft"
 require "sup/poll"
 require "sup/crypto"
-require "sup/modes/scroll-mode"
-require "sup/modes/text-mode"
 require "sup/modes/line-cursor-mode"
 require "sup/modes/help-mode"
 require "sup/modes/edit-message-mode"
@@ -255,18 +264,11 @@ require "sup/modes/search-results-mode"
 require "sup/modes/person-search-results-mode"
 require "sup/modes/inbox-mode"
 require "sup/modes/buffer-list-mode"
-require "sup/modes/log-mode"
 require "sup/modes/poll-mode"
 require "sup/modes/file-browser-mode"
 require "sup/modes/completion-mode"
-require "sup/logger"
 require "sup/sent"
 
-module Redwood
-  def log s; Logger.log s; end
-  module_function :log
-end
-
 $:.each do |base|
   d = File.join base, "sup/share/modes/"
   Redwood::Mode.load_all_modes d if File.directory? d
diff --git a/lib/sup/index.rb b/lib/sup/index.rb
@@ -1,8 +1,14 @@
 ## the index structure for redwood. interacts with ferret.
 
-require 'thread'
 require 'fileutils'
 require 'ferret'
+begin
+  require 'chronic'
+  $have_chronic = true
+rescue LoadError => e
+  Redwood::log "'chronic' library not found. run 'gem install chronic' to install."
+  $have_chronic = false
+end
 
 module Redwood
 
@@ -371,8 +377,10 @@ EOS
 
 protected
 
+  ## do any specialized parsing
+  ## returns nil and flashes error message if parsing failed
   def parse_user_query_string str
-    str2 = str.gsub(/(to|from):(\S+)/) do
+    result = str.gsub(/\b(to|from):(\S+)\b/) do
       field, name = $1, $2
       if(p = ContactManager.contact_for(name))
         [field, p.email]
@@ -381,8 +389,29 @@ protected
       end.join(":")
     end
     
-    Redwood::log "translated #{str} to #{str2}" unless str2 == str
-    @qparser.parse str2
+    if $have_chronic
+      chronic_failure = false
+      result = result.gsub(/\b(before|after):(\((.+?)\)\B|(\S+)\b)/) do
+        break if chronic_failure
+        field, datestr = $1, ($3 || $4)
+        realdate = Chronic.parse datestr
+        if realdate
+          Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate}"
+          if field == "after"
+            "date:(>= #{sprintf "%012d", realdate.to_i})"
+          else
+            "date:(<= #{sprintf "%012d", realdate.to_i})"
+          end
+        else
+          BufferManager.flash "Don't understand date #{datestr.inspect}!"
+          chronic_failure = true
+        end
+      end
+      result = nil if chronic_failure
+    end
+    
+    Redwood::log "translated #{str.inspect} to #{result}" unless result == str
+    @qparser.parse result if result
   end
 
   def build_query opts
diff --git a/lib/sup/modes/search-results-mode.rb b/lib/sup/modes/search-results-mode.rb
@@ -24,7 +24,7 @@ class SearchResultsMode < ThreadIndexMode
 
   def self.spawn_from_query text
     begin
-      qobj = Index.parse_user_query_string text
+      qobj = Index.parse_user_query_string(text) or return
       short_text = text.length < 20 ? text : text[0 ... 20] + "..."
       mode = SearchResultsMode.new qobj
       BufferManager.spawn "search: \"#{short_text}\"", mode