diff --git a/sushy/utils.hy b/sushy/utils.hy index 78e028f..1d3506f 100644 --- a/sushy/utils.hy +++ b/sushy/utils.hy @@ -2,6 +2,7 @@ [collections [OrderedDict]] [base64 [urlsafe-b64encode]] [bottle [request response]] + [calendar [timegm]] [datetime [datetime]] [dateutil.parser [parse :as parse-date]] [functools [wraps]] @@ -37,6 +38,14 @@ "20:30-21:29" "at dinnertime" "21:30-22:29" "at night" "22:30-23:59" "late night"}) + +(def *readable-intervals* + {31556926 "year" + 2592000 "month" + 604800 "week" + 86400 "day" + 3600 "hour" + 60 "minute"}) (setv *utc* (timezone "UTC")) @@ -200,6 +209,7 @@ (defn fuzzy-time [date] + ; describes a date as a time of day (let [[when (.strftime date "%H:%M")]] (.get *time-intervals* @@ -207,6 +217,31 @@ (sorted (.keys *time-intervals*)))) "sometime"))) + +(defn time-chunks [begin-interval &optional [end-interval nil]] + ; breaks down a time interval into a sequence of time chunks + (let [[chunks (apply sorted [(.keys *readable-intervals*)] {"reverse" true})] + [the-end (if end-interval end-interval (datetime.now))] + [interval (- (timegm (.timetuple the-end)) (timegm (.timetuple begin-interval)))] + [values []]] + (for [i chunks] + (setv (, d r) (divmod interval i)) + (.append values (, (int d) (.get *readable-intervals* i))) + (setv interval r)) + (filter (fn [x] (pos? (get x 0))) values))) + + +(defn string-plurals [chunk] + (let [[(, v s) chunk]] + (.join " " (map str (, v (if (> v 1) (+ s "s") s)))))) + + +(defn time-since [begin-interval &optional [end-interval nil]] + (let [[chunks (list (map string-plurals (time-chunks begin-interval end-interval)))]] + (if (not (len (list chunks))) + "sometime" + (.join ", " (take 2 chunks))))) + (defmacro timeit [block iterations] `(let [[t (time)]] diff --git a/themes/blog/views/search.tpl b/themes/blog/views/search.tpl index 2e2250b..e5dbc4d 100644 --- a/themes/blog/views/search.tpl +++ b/themes/blog/views/search.tpl @@ -1,5 +1,6 @@ <% from itertools import islice +from sushy.utils import time_since if defined("query"): headers['title'] = "Search results for '%s'" % query items = list(islice(results,0,20)) @@ -12,7 +13,6 @@ if defined("query"): - @@ -21,10 +21,9 @@ if defined("query"): %for i in items: - - + %end
Score Page Content Modified
{{!i["score"]}} {{!i["title"]}} {{!i["content"]}}{{!i["mtime"]}}{{!time_since(i["mtime"])}} ago