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:
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