Added commit info from RSS.

This commit is contained in:
Daniel Buckmaster 2014-05-10 12:37:32 +10:00
parent cb33135800
commit 380f112bd1
3 changed files with 290 additions and 23 deletions

View file

@ -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
*/

View file

@ -56,28 +56,26 @@ root: .
<div class="container">
<div class="row">
<div class="col-sm-6">
<h2 class="status">Status</h2>
<table class="borderless history table">
<tr>
<td>Current version</td>
<td>Torque 3D 3.5.1 <br />
Project Manager 2.1 <br />
</tr>
<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 table">
<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>Continuous</td>
<td><img src="http://builds.garagegames.com/app/rest/builds/buildType:(id:bt79)/statusIcon"></img></td>
</tr>
<tr>
<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
js/jquery.timeago.js Normal file
View file

@ -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");
}));