Kaynağa Gözat

Added commit info from RSS.

Daniel Buckmaster 11 yıl önce
ebeveyn
işleme
380f112bd1
3 değiştirilmiş dosya ile 288 ekleme ve 21 silme
  1. 20 7
      css/main.css
  2. 53 14
      index.html
  3. 215 0
      js/jquery.timeago.js

+ 20 - 7
css/main.css

@@ -116,13 +116,13 @@ a.media-subheading:hover {
 .site .banner {
   /* Gradient generated using http://www.colorzilla.com/gradient-editor/ */
   background: #aa0000; /* Old browsers */
-  background: -moz-linear-gradient(top, #aa0000 0%, #770000 100%); /* FF3.6+ */
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#aa0000), color-stop(100%,#770000)); /* Chrome,Safari4+ */
-  background: -webkit-linear-gradient(top, #aa0000 0%,#770000 100%); /* Chrome10+,Safari5.1+ */
-  background: -o-linear-gradient(top, #aa0000 0%,#770000 100%); /* Opera 11.10+ */
-  background: -ms-linear-gradient(top, #aa0000 0%,#770000 100%); /* IE10+ */
-  background: linear-gradient(to bottom, #aa0000 0%,#770000 100%); /* W3C */
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#aa0000', endColorstr='#770000',GradientType=0 ); /* IE6-9 */
+  background: -moz-linear-gradient(top, #aa0000 0%, #660000 100%); /* FF3.6+ */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#aa0000), color-stop(100%,#660000)); /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #aa0000 0%,#660000 100%); /* Chrome10+,Safari5.1+ */
+  background: -o-linear-gradient(top, #aa0000 0%,#660000 100%); /* Opera 11.10+ */
+  background: -ms-linear-gradient(top, #aa0000 0%,#660000 100%); /* IE10+ */
+  background: linear-gradient(to bottom, #aa0000 0%,#660000 100%); /* W3C */
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#aa0000', endColorstr='#660000',GradientType=0 ); /* IE6-9 */
   color: white;
 }
 
@@ -163,6 +163,19 @@ a.media-subheading:hover {
   list-style-type: lower-alpha;
 }
 
+.site .timeago {
+  font-size: smaller;
+  color: gray;
+  margin-top: 0;
+  margin-left: 0.5em;
+}
+
+pre.inline {
+  display: inline;
+  padding: 3px;
+  margin: 0 5px;
+}
+
 /*-----------------------------------------------------------------------------
  * Static pages
  */

+ 53 - 14
index.html

@@ -56,28 +56,26 @@ root: .
 
 <div class="container">
     <div class="row">
-        <div class="col-sm-6">
+        <div class="col-sm-4">
+            <h2 class="status">Activity</h2>
+            <p id="activity-loading">Loading activity...</p>
+        </div>
+
+        <div class="col-sm-4">
             <h2 class="status">Status</h2>
-            <table class="borderless history table">
+            <table class="borderless table">
                 <tr>
-                    <td>Current version</td>
-                    <td>Torque 3D 3.5.1 <br />
-                        Project Manager 2.1 <br />
+                    <td>Continuous</td>
+                    <td><img src="http://builds.garagegames.com/app/rest/builds/buildType:(id:bt79)/statusIcon"></img></td>
                 </tr>
-
                 <tr>
-                    <td>Build</td>
-                    <td>
-                        <table>
-                            <tr><td>Nightly:</td><td>&nbsp;<img src="http://builds.garagegames.com/app/rest/builds/buildType:(id:bt79)/statusIcon"></img></td></tr>
-                            <tr><td>Release:</td><td>&nbsp;<img src="http://builds.garagegames.com/app/rest/builds/buildType:(id:bt79)/statusIcon"></img></td></tr>
-                        </table>
-                    </td>
+                    <td>Release</td>
+                    <td><img src="http://builds.garagegames.com/app/rest/builds/buildType:(id:bt79)/statusIcon"></img></td>
                 </tr>
             </table>
         </div>
 
-        <div class="col-sm-6">
+        <div class="col-sm-4">
             <h2>Issues</h2>
             <ul>
                 <li><a href="https://github.com/GarageGames/Torque3D/issues/new">Report an issue</a></li>
@@ -116,6 +114,7 @@ root: .
 {% endif %}
 
 <script type="text/javascript" src="{{page.root}}/js/jquery.cycle.all.js"></script>
+<script type="text/javascript" src="{{page.root}}/js/jquery.timeago.js"></script>
 <script type="text/javascript">
 $(document).ready(function() {
   var images = {
@@ -152,6 +151,7 @@ $(document).ready(function() {
     return o;
   }
 
+  // TODO: ensure no duplicate images occur.
   function createBreaks() {
     var breaks = $('div.break');
     var delay = 0;
@@ -169,5 +169,44 @@ $(document).ready(function() {
   };
 
   createBreaks();
+
+  var numResults = 2;
+  var feed = 'https://github.com/GarageGames/Torque3D/commits/development.atom';
+  var googleAPI = document.location.protocol +
+    '//ajax.googleapis.com/ajax/services/feed/load?' +
+    'v=1.0' +
+    '&num=' + numResults +
+    '&callback=?&q=';
+  var url = googleAPI + encodeURIComponent(feed);
+  $.ajax({
+    url: url,
+    dataType: 'json',
+    success: function (data) {
+      if(data.responseData.feed && data.responseData.feed.entries) {
+        var list = $('<ul/>').addClass('list-unstyled');
+        $.each(data.responseData.feed.entries, function (i, e) {
+          var li = $('<li/>').appendTo(list);
+          var hash = e.link.split('/').pop().substr(0, 6);
+          var hashel = $('<pre/>').addClass('inline').appendTo(li);
+          hashel.append($('<a/>')
+            .text(hash)
+            .attr('href', e.link)
+            .attr('target', '_blank'));
+
+          var content = e.contentSnippet.split('\n').pop();
+          li.append($('<span/>')
+            .addClass('commit')
+            .text(content));
+
+          var d = new Date(e.publishedDate);
+          var stamp = $('<p/>').addClass('timeago').text('by ' + e.author + ' ').appendTo(li);
+          stamp.append($('<span/>')
+            .attr('title', d.toISOString())
+            .timeago());
+        });
+        $('#activity-loading').replaceWith(list);
+      }
+    }
+  });
 });
 </script>

+ 215 - 0
js/jquery.timeago.js

@@ -0,0 +1,215 @@
+/**
+ * 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").
+ *
+ * @name timeago
+ * @version 1.4.1
+ * @requires jQuery v1.2.3+
+ * @author Ryan McGeary
+ * @license MIT License - http://www.opensource.org/licenses/mit-license.php
+ *
+ * For usage and examples, visit:
+ * http://timeago.yarp.com/
+ *
+ * Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
+ */
+
+(function (factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module.
+    define(['jquery'], factory);
+  } else {
+    // Browser globals
+    factory(jQuery);
+  }
+}(function ($) {
+  $.timeago = function(timestamp) {
+    if (timestamp instanceof Date) {
+      return inWords(timestamp);
+    } else if (typeof timestamp === "string") {
+      return inWords($.timeago.parse(timestamp));
+    } else if (typeof timestamp === "number") {
+      return inWords(new Date(timestamp));
+    } else {
+      return inWords($.timeago.datetime(timestamp));
+    }
+  };
+  var $t = $.timeago;
+
+  $.extend($.timeago, {
+    settings: {
+      refreshMillis: 60000,
+      allowPast: true,
+      allowFuture: false,
+      localeTitle: false,
+      cutoff: 0,
+      strings: {
+        prefixAgo: null,
+        prefixFromNow: null,
+        suffixAgo: "ago",
+        suffixFromNow: "from now",
+        inPast: 'any moment now',
+        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",
+        wordSeparator: " ",
+        numbers: []
+      }
+    },
+
+    inWords: function(distanceMillis) {
+      if(!this.settings.allowPast && ! this.settings.allowFuture) {
+          throw 'timeago allowPast and allowFuture settings can not both be set to false.';
+      }
+
+      var $l = this.settings.strings;
+      var prefix = $l.prefixAgo;
+      var suffix = $l.suffixAgo;
+      if (this.settings.allowFuture) {
+        if (distanceMillis < 0) {
+          prefix = $l.prefixFromNow;
+          suffix = $l.suffixFromNow;
+        }
+      }
+
+      if(!this.settings.allowPast && distanceMillis >= 0) {
+        return this.settings.strings.inPast;
+      }
+
+      var seconds = Math.abs(distanceMillis) / 1000;
+      var minutes = seconds / 60;
+      var hours = minutes / 60;
+      var days = hours / 24;
+      var years = days / 365;
+
+      function substitute(stringOrFunction, number) {
+        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
+        var value = ($l.numbers && $l.numbers[number]) || number;
+        return string.replace(/%d/i, value);
+      }
+
+      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 < 42 && substitute($l.day, 1) ||
+        days < 30 && substitute($l.days, Math.round(days)) ||
+        days < 45 && substitute($l.month, 1) ||
+        days < 365 && substitute($l.months, Math.round(days / 30)) ||
+        years < 1.5 && substitute($l.year, 1) ||
+        substitute($l.years, Math.round(years));
+
+      var separator = $l.wordSeparator || "";
+      if ($l.wordSeparator === undefined) { separator = " "; }
+      return $.trim([prefix, words, suffix].join(separator));
+    },
+
+    parse: function(iso8601) {
+      var s = $.trim(iso8601);
+      s = s.replace(/\.\d+/,""); // remove milliseconds
+      s = s.replace(/-/,"/").replace(/-/,"/");
+      s = s.replace(/T/," ").replace(/Z/," UTC");
+      s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
+      s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
+      return new Date(s);
+    },
+    datetime: function(elem) {
+      var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
+      return $t.parse(iso8601);
+    },
+    isTime: function(elem) {
+      // jQuery's `is()` doesn't play well with HTML5 in IE
+      return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
+    }
+  });
+
+  // functions that can be called via $(el).timeago('action')
+  // init is default when no action is given
+  // functions are called with context of a single element
+  var functions = {
+    init: function(){
+      var refresh_el = $.proxy(refresh, this);
+      refresh_el();
+      var $s = $t.settings;
+      if ($s.refreshMillis > 0) {
+        this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
+      }
+    },
+    update: function(time){
+      var parsedTime = $t.parse(time);
+      $(this).data('timeago', { datetime: parsedTime });
+      if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString());
+      refresh.apply(this);
+    },
+    updateFromDOM: function(){
+      $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
+      refresh.apply(this);
+    },
+    dispose: function () {
+      if (this._timeagoInterval) {
+        window.clearInterval(this._timeagoInterval);
+        this._timeagoInterval = null;
+      }
+    }
+  };
+
+  $.fn.timeago = function(action, options) {
+    var fn = action ? functions[action] : functions.init;
+    if(!fn){
+      throw new Error("Unknown function name '"+ action +"' for timeago");
+    }
+    // each over objects here and call the requested function
+    this.each(function(){
+      fn.call(this, options);
+    });
+    return this;
+  };
+
+  function refresh() {
+    var data = prepareData(this);
+    var $s = $t.settings;
+
+    if (!isNaN(data.datetime)) {
+      if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
+        $(this).text(inWords(data.datetime));
+      }
+    }
+    return this;
+  }
+
+  function prepareData(element) {
+    element = $(element);
+    if (!element.data("timeago")) {
+      element.data("timeago", { datetime: $t.datetime(element) });
+      var text = $.trim(element.text());
+      if ($t.settings.localeTitle) {
+        element.attr("title", element.data('timeago').datetime.toLocaleString());
+      } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
+        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());
+  }
+
+  // fix for IE6 suckage
+  document.createElement("abbr");
+  document.createElement("time");
+}));
+