+ ## do any specialized parsing
+ ## returns nil and flashes error message if parsing failed
+ def parse_user_query_string str
+ result = str.gsub(/\b(to|from):(\S+)\b/) do
+ field, name = $1, $2
+ if(p = ContactManager.contact_for(name))
+ [field, p.email]
+ else
+ [field, name]
+ end.join(":")
+ end
+
+ if $have_chronic
+ chronic_failure = false
+ result = result.gsub(/\b(before|on|in|after):(\((.+?)\)\B|(\S+)\b)/) do
+ break if chronic_failure
+ field, datestr = $1, ($3 || $4)
+ realdate = Chronic.parse(datestr, :guess => false, :context => :none)
+ if realdate
+ case field
+ when "after"
+ Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate.end}"
+ "date:(>= #{sprintf "%012d", realdate.end.to_i})"
+ when "before"
+ Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate.begin}"
+ "date:(<= #{sprintf "%012d", realdate.begin.to_i})"
+ else
+ Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate}"
+ "date:(<= #{sprintf "%012d", realdate.end.to_i}) date:(>= #{sprintf "%012d", realdate.begin.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
+