712f14a1a1cd

Add timeago.js to generate "ago" dates on the fly.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Tue, 02 Feb 2010 20:46:15 -0500
parents 938cf9c8cdb8
children 24ade3f9c58c
branches/tags (none)
files layout/_post.html layout/skeleton/_base.html media/js/jquery.timeago.js media/js/sjl-gallery.js media/js/sjl.js

Changes

--- a/layout/_post.html	Mon Feb 01 21:17:36 2010 -0500
+++ b/layout/_post.html	Tue Feb 02 20:46:15 2010 -0500
@@ -13,7 +13,11 @@
     
     <div id="leaf-stats">
         <p>
-            Posted {{ page.created|timesince }} ago on {{ page.created|date:"F j, Y" }}
+            Posted
+            <span class="timeago"
+                  title="{{ page.created|date:"Y-m-d" }}T{{ page.created|date:"H:i:s" }}">
+            </span>
+            on {{ page.created|date:"F j, Y" }}
             {% if page.categories %}
                 and tagged as
 {% for category in page.categories %}{% if not forloop.first %}{% if forloop.last %} and {% else %}, {% endif %}{% endif %}<a href="{{ page.node.ancestors.1.url }}/{{ category }}/">{{ category }}</a>{% endfor %}.
--- a/layout/skeleton/_base.html	Mon Feb 01 21:17:36 2010 -0500
+++ b/layout/skeleton/_base.html	Tue Feb 02 20:46:15 2010 -0500
@@ -30,8 +30,9 @@
         
         {% block js %}
             <script src="/media/js/jquery.js" type="text/javascript"></script>
+            <script src="/media/js/jquery.timeago.js" type="text/javascript"></script>
             <script src="/media/js/jquery.colorbox.js" type="text/javascript"></script>
-            <script src="/media/js/sjl-gallery.js" type="text/javascript"></script>
+            <script src="/media/js/sjl.js" type="text/javascript"></script>
             <script src="/mint/?js" type="text/javascript"></script>
             
             {% block extra_js %}{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/media/js/jquery.timeago.js	Tue Feb 02 20:46:15 2010 -0500
@@ -0,0 +1,140 @@
+/*
+ * timeago: a jQuery plugin, version: 0.8.1 (2010-01-04)
+ * @requires jQuery v1.2.3 or later
+ *
+ * Timeago is a jQuery plugin that makes it easy to support automatically
+ * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
+ *
+ * For usage and examples, visit:
+ * http://timeago.yarp.com/
+ *
+ * Licensed under the MIT:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Copyright (c) 2008-2010, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)
+ */
+(function($) {
+  $.timeago = function(timestamp) {
+    if (timestamp instanceof Date) return inWords(timestamp);
+    else if (typeof timestamp == "string") return inWords($.timeago.parse(timestamp));
+    else return inWords($.timeago.datetime(timestamp));
+  };
+  var $t = $.timeago;
+
+  $.extend($.timeago, {
+    settings: {
+      refreshMillis: 60000,
+      allowFuture: false,
+      strings: {
+        prefixAgo: null,
+        prefixFromNow: null,
+        suffixAgo: "ago",
+        suffixFromNow: "from now",
+        ago: null, // DEPRECATED, use suffixAgo
+        fromNow: null, // DEPRECATED, use suffixFromNow
+        seconds: "less than a minute",
+        minute: "about a minute",
+        minutes: "%d minutes",
+        hour: "about an hour",
+        hours: "about %d hours",
+        day: "a day",
+        days: "%d days",
+        month: "about a month",
+        months: "%d months",
+        year: "about a year",
+        years: "%d years"
+      }
+    },
+    inWords: function(distanceMillis) {
+      var $l = this.settings.strings;
+      var prefix = $l.prefixAgo;
+      var suffix = $l.suffixAgo || $l.ago;
+      if (this.settings.allowFuture) {
+        if (distanceMillis < 0) {
+          prefix = $l.prefixFromNow;
+          suffix = $l.suffixFromNow || $l.fromNow;
+        }
+        distanceMillis = Math.abs(distanceMillis);
+      }
+
+      var seconds = distanceMillis / 1000;
+      var minutes = seconds / 60;
+      var hours = minutes / 60;
+      var days = hours / 24;
+      var years = days / 365;
+
+      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
+        seconds < 90 && substitute($l.minute, 1) ||
+        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
+        minutes < 90 && substitute($l.hour, 1) ||
+        hours < 24 && substitute($l.hours, Math.round(hours)) ||
+        hours < 48 && substitute($l.day, 1) ||
+        days < 30 && substitute($l.days, Math.floor(days)) ||
+        days < 60 && substitute($l.month, 1) ||
+        days < 365 && substitute($l.months, Math.floor(days / 30)) ||
+        years < 2 && substitute($l.year, 1) ||
+        substitute($l.years, Math.floor(years));
+
+      return $.trim([prefix, words, suffix].join(" "));
+    },
+    parse: function(iso8601) {
+      var s = $.trim(iso8601);
+      s = s.replace(/-/,"/").replace(/-/,"/");
+      s = s.replace(/T/," ").replace(/Z/," UTC");
+      s = s.replace(/([\+-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
+      return new Date(s);
+    },
+    datetime: function(elem) {
+      // jQuery's `is()` doesn't play well with HTML5 in IE
+      var isTime = $(elem).get(0).tagName.toLowerCase() == 'time'; // $(elem).is('time');
+      var iso8601 = isTime ? $(elem).attr('datetime') : $(elem).attr('title');
+      return $t.parse(iso8601);
+    }
+  });
+
+  $.fn.timeago = function() {
+    var self = this;
+    self.each(refresh);
+
+    var $s = $t.settings;
+    if ($s.refreshMillis > 0) {
+      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
+    }
+    return self;
+  };
+
+  function refresh() {
+    var data = prepareData(this);
+    if (!isNaN(data.datetime)) {
+      $(this).text(inWords(data.datetime));
+    }
+    return this;
+  }
+
+  function prepareData(element) {
+    element = $(element);
+    if (element.data("timeago") === undefined) {
+      element.data("timeago", { datetime: $t.datetime(element) });
+      var text = $.trim(element.text());
+      if (text.length > 0) element.attr("title", text);
+    }
+    return element.data("timeago");
+  }
+
+  function inWords(date) {
+    return $t.inWords(distance(date));
+  }
+
+  function distance(date) {
+    return (new Date().getTime() - date.getTime());
+  }
+
+  function substitute(stringOrFunction, value) {
+    var string = $.isFunction(stringOrFunction) ? stringOrFunction(value) : stringOrFunction;
+    return string.replace(/%d/i, value);
+  }
+
+  // fix for IE6 suckage
+  document.createElement('abbr');
+  document.createElement('time');
+})(jQuery);
\ No newline at end of file
--- a/media/js/sjl-gallery.js	Mon Feb 01 21:17:36 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-$(function() {
-    $("div.gallery a").colorbox();
-});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/media/js/sjl.js	Tue Feb 02 20:46:15 2010 -0500
@@ -0,0 +1,7 @@
+$(function() {
+  jQuery('span.timeago').timeago();
+});
+
+$(function() {
+    $("div.gallery a").colorbox();
+});
\ No newline at end of file