From fe56e8fe02b2be19b455652ace77959ef13feeb7 Mon Sep 17 00:00:00 2001 From: wmorgan Date: Fri, 9 Nov 2007 18:42:51 +0000 Subject: [PATCH] added chronic support thanks to Marcus Williams git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@688 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- lib/sup.rb | 26 ++++++++++--------- lib/sup/index.rb | 37 +++++++++++++++++++++++++--- 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 index 7702953..83ed101 100644 --- 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 index 6a499c9..538cdda 100644 --- 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 index 8917d5e..feef1c3 100644 --- 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 -- 2.45.2