Merge branch 'master' into trinidad

This commit is contained in:
friendica 2015-01-06 11:40:31 -08:00
commit 7ee5567421
3 changed files with 217 additions and 140 deletions

View File

@ -347,6 +347,11 @@ surfer@debian:/var/www$ git config --global user.name "Your Name"
surfer@debian:/var/www$ git config --global user.email "your@mail.com" surfer@debian:/var/www$ git config --global user.email "your@mail.com"
[/code] [/code]
Create a descriptive topic branch
[code]
surfer@debian:/var/www$ git checkout -b dev_beginning
[/code]
Make sure your local repository is up-to-date with the main project. Make sure your local repository is up-to-date with the main project.
Add the original repository as a remote named upstream if not done yet Add the original repository as a remote named upstream if not done yet
[code] [code]
@ -356,11 +361,7 @@ surfer@debian:/var/www$ git remote add upstream https://github.com/friendica/red
Fetch the newest work from that remote Fetch the newest work from that remote
[code] [code]
surfer@debian:/var/www$ git fetch upstream surfer@debian:/var/www$ git fetch upstream
[/code] surfer@debian:/var/www$ git merge upstream/master
Create a descriptive topic branch
[code]
surfer@debian:/var/www$ git checkout -b dev_beginning
[/code] [/code]
Hint: You can list the branches Hint: You can list the branches
@ -382,12 +383,12 @@ surfer@debian:/var/www$ git add doc/dev_beginner.bb
Commit the changes to your local branch. This will open an editor to provide a message. Commit the changes to your local branch. This will open an editor to provide a message.
[code] [code]
surfer@debian:/var/www$ git commit surfer@debian:/var/www$ git commit -a
[/code] [/code]
Push back up to the same topic branch online Push back up to the same topic branch online
[code] [code]
surfer@debian:/var/www$ git push origin dev_beginning surfer@debian:/var/www$ git push
[/code] [/code]
Now you can go to your (online) account at github and create the pull request. Now you can go to your (online) account at github and create the pull request.

View File

@ -3,7 +3,7 @@
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
* *
* @name timeago * @name timeago
* @version 0.11.4 * @version 1.4.1
* @requires jQuery v1.2.3+ * @requires jQuery v1.2.3+
* @author Ryan McGeary * @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php * @license MIT License - http://www.opensource.org/licenses/mit-license.php
@ -11,142 +11,211 @@
* For usage and examples, visit: * For usage and examples, visit:
* http://timeago.yarp.com/ * http://timeago.yarp.com/
* *
* Copyright (c) 2008-2012, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) * Copyright (c) 2008-2013, Ryan McGeary (ryan -[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 if (typeof timestamp === "number") {
return inWords(new Date(timestamp));
} else {
return inWords($.timeago.datetime(timestamp));
}
};
var $t = $.timeago;
$.extend($.timeago, { (function (factory) {
settings: { if (typeof define === 'function' && define.amd) {
refreshMillis: 60000, // AMD. Register as an anonymous module.
allowFuture: false, define(['jquery'], factory);
strings: { } else {
prefixAgo: null, // Browser globals
prefixFromNow: null, factory(jQuery);
suffixAgo: "ago", }
suffixFromNow: "from now", }(function ($) {
seconds: "less than a minute", $.timeago = function(timestamp) {
minute: "about a minute", if (timestamp instanceof Date) {
minutes: "%d minutes", return inWords(timestamp);
hour: "about an hour", } else if (typeof timestamp === "string") {
hours: "about %d hours", return inWords($.timeago.parse(timestamp));
day: "a day", } else if (typeof timestamp === "number") {
days: "%d days", return inWords(new Date(timestamp));
month: "about a month", } else {
months: "%d months", return inWords($.timeago.datetime(timestamp));
year: "about a year", }
years: "%d years", };
wordSeparator: " ", var $t = $.timeago;
numbers: []
}
},
inWords: function(distanceMillis) {
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;
}
}
var seconds = Math.abs(distanceMillis) / 1000; $.extend($.timeago, {
var minutes = seconds / 60; settings: {
var hours = minutes / 60; refreshMillis: 60000,
var days = hours / 24; allowPast: true,
var years = days / 365; 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: []
}
},
function substitute(stringOrFunction, number) { inWords: function(distanceMillis) {
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; if(!this.settings.allowPast && ! this.settings.allowFuture) {
var value = ($l.numbers && $l.numbers[number]) || number; throw 'timeago allowPast and allowFuture settings can not both be set to false.';
return string.replace(/%d/i, value); }
}
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || var $l = this.settings.strings;
seconds < 90 && substitute($l.minute, 1) || var prefix = $l.prefixAgo;
minutes < 45 && substitute($l.minutes, Math.round(minutes)) || var suffix = $l.suffixAgo;
minutes < 90 && substitute($l.hour, 1) || if (this.settings.allowFuture) {
hours < 24 && substitute($l.hours, Math.round(hours)) || if (distanceMillis < 0) {
hours < 42 && substitute($l.day, 1) || prefix = $l.prefixFromNow;
days < 30 && substitute($l.days, Math.round(days)) || suffix = $l.suffixFromNow;
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 === undefined ? " " : $l.wordSeparator; if(!this.settings.allowPast && distanceMillis >= 0) {
return $.trim([prefix, words, suffix].join(separator)); return this.settings.strings.inPast;
}, }
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
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");
}
});
$.fn.timeago = function() { var seconds = Math.abs(distanceMillis) / 1000;
var self = this; var minutes = seconds / 60;
self.each(refresh); var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;
var $s = $t.settings; function substitute(stringOrFunction, number) {
if ($s.refreshMillis > 0) { var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
setInterval(function() { self.each(refresh); }, $s.refreshMillis); var value = ($l.numbers && $l.numbers[number]) || number;
} return string.replace(/%d/i, value);
return self; }
};
function refresh() { var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
var data = prepareData(this); seconds < 90 && substitute($l.minute, 1) ||
if (!isNaN(data.datetime)) { minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
$(this).text(inWords(data.datetime)); minutes < 90 && substitute($l.hour, 1) ||
} hours < 24 && substitute($l.hours, Math.round(hours)) ||
return this; 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));
function prepareData(element) { var separator = $l.wordSeparator || "";
element = $(element); if ($l.wordSeparator === undefined) { separator = " "; }
if (!element.data("timeago")) { return $.trim([prefix, words, suffix].join(separator));
element.data("timeago", { datetime: $t.datetime(element) }); },
var text = $.trim(element.text());
if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
element.attr("title", text);
}
}
return element.data("timeago");
}
function inWords(date) { parse: function(iso8601) {
return $t.inWords(distance(date)); 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");
}
});
function distance(date) { // functions that can be called via $(el).timeago('action')
return (new Date().getTime() - date.getTime()); // 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;
}
}
};
// fix for IE6 suckage $.fn.timeago = function(action, options) {
document.createElement("abbr"); var fn = action ? functions[action] : functions.init;
document.createElement("time"); if(!fn){
}(jQuery)); 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() {
//check if it's still visible
if(!$.contains(document.documentElement,this)){
//stop if it has been removed
$(this).timeago("dispose");
return this;
}
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");
}));

View File

@ -135,11 +135,13 @@
function showHideComments(id) { function showHideComments(id) {
if( $('#collapsed-comments-' + id).is(':visible')) { if( $('#collapsed-comments-' + id).is(':visible')) {
$('#collapsed-comments-' + id + ' .autotime').timeago('dispose');
$('#collapsed-comments-' + id).slideUp(); $('#collapsed-comments-' + id).slideUp();
$('#hide-comments-' + id).html(aStr['showmore']); $('#hide-comments-' + id).html(aStr['showmore']);
$('#hide-comments-total-' + id).show(); $('#hide-comments-total-' + id).show();
} }
else { else {
$('#collapsed-comments-' + id + ' .autotime').timeago();
$('#collapsed-comments-' + id).slideDown(); $('#collapsed-comments-' + id).slideDown();
$('#hide-comments-' + id).html(aStr['showfewer']); $('#hide-comments-' + id).html(aStr['showfewer']);
$('#hide-comments-total-' + id).hide(); $('#hide-comments-total-' + id).hide();
@ -452,6 +454,7 @@ function updateConvItems(mode,data) {
$('.thread-wrapper.toplevel_item',data).each(function() { $('.thread-wrapper.toplevel_item',data).each(function() {
var ident = $(this).attr('id'); var ident = $(this).attr('id');
// This should probably use the context argument instead
var commentWrap = $('#'+ident+' .collapsed-comments').attr('id'); var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
var itmId = 0; var itmId = 0;
var isVisible = false; var isVisible = false;
@ -468,7 +471,7 @@ function updateConvItems(mode,data) {
$('#' + prev).after($(this)); $('#' + prev).after($(this));
if(isVisible) if(isVisible)
showHideComments(itmId); showHideComments(itmId);
$(".autotime",this).timeago(); $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
} }
else { else {
$('img',this).each(function() { $('img',this).each(function() {
@ -479,7 +482,7 @@ function updateConvItems(mode,data) {
$('#' + ident).replaceWith($(this)); $('#' + ident).replaceWith($(this));
if(isVisible) if(isVisible)
showHideComments(itmId); showHideComments(itmId);
$(".autotime",this).timeago(); $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
} }
prev = ident; prev = ident;
}); });
@ -510,7 +513,7 @@ function updateConvItems(mode,data) {
$('#threads-end').before($(this)); $('#threads-end').before($(this));
if(isVisible) if(isVisible)
showHideComments(itmId); showHideComments(itmId);
$(".autotime",this).timeago(); $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
} }
else { else {
$('img',this).each(function() { $('img',this).each(function() {
@ -521,7 +524,7 @@ function updateConvItems(mode,data) {
$('#' + ident).replaceWith($(this)); $('#' + ident).replaceWith($(this));
if(isVisible) if(isVisible)
showHideComments(itmId); showHideComments(itmId);
$(".autotime",this).timeago(); $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
} }
}); });
@ -555,7 +558,7 @@ function updateConvItems(mode,data) {
$('#' + prev).after($(this)); $('#' + prev).after($(this));
if(isVisible) if(isVisible)
showHideComments(itmId); showHideComments(itmId);
$(".autotime",this).timeago(); $("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
} }
prev = ident; prev = ident;
@ -598,7 +601,11 @@ function updateConvItems(mode,data) {
$(".wall-item-body, .contact-info").each(function() { $(".wall-item-body, .contact-info").each(function() {
if($(this).height() > divmore_height + 10) { if($(this).height() > divmore_height + 10) {
if(! $(this).hasClass('divmore')) { if(! $(this).hasClass('divmore')) {
$(this).readmore({collapsedHeight: divmore_height, moreLink: '<a href="#" class="divgrow-showmore">'+aStr['divgrowmore']+'</a>', lessLink: '<a href="#">'+aStr['divgrowless']+'</a>'}); $(this).readmore({
collapsedHeight: divmore_height,
moreLink: '<a href="#" class="divgrow-showmore">'+aStr['divgrowmore']+'</a>',
lessLink: '<a href="#">'+aStr['divgrowless']+'</a>'
});
$(this).addClass('divmore'); $(this).addClass('divmore');
} }
} }