-
";
}else{
$upload_list .=
- "
".
"";
@@ -113,15 +113,31 @@ class UploadTheme extends Themelet {
{
/* Danbooru > Shimmie Bookmarklet.
This "should" work on any site running danbooru, unless for some odd reason they switched around the id's or aren't using post/list.
+ Most likely this will stop working when Danbooru updates to v2, all depends if they switch the ids or not >_>.
+ Clicking the link on a danbooru image page should give you something along the lines of:
+ 'http://www.website.com/shimmie/upload?url="http://sonohara.donmai.us/data/crazylongurl.jpg&tags="too many tags"&rating="s"&source="http://danbooru.donmai.us/post/show/012345/"'
+ TODO: Possibly make the entire/most of the script into a .js file, and just make the bookmarklet load it on click (Something like that?)
*/
$title = "Danbooru to " . $config->get_string('title');
- $html .= '
' .
- $title . ' (As above, Click on a Danbooru-run image page. (This also grabs the tags, rating & source!))';
+ $html .= '
' .
+ $title . ' (As above, Click on a Danbooru-run image page. (This also grabs the tags/rating/source!))';
}
diff --git a/ext/user/main.php b/ext/user/main.php
index 0b1073fa..fc0da212 100644
--- a/ext/user/main.php
+++ b/ext/user/main.php
@@ -166,8 +166,8 @@ class UserPage extends SimpleExtension {
public function onUserPageBuilding(Event $event) {
global $page, $user, $config;
- $h_join_date = html_escape($event->display_user->join_date);
- $event->add_stats("Join date: $h_join_date", 10);
+ $h_join_date = autodate($event->display_user->join_date);
+ $event->add_stats("Joined: $h_join_date", 10);
$av = $event->display_user->get_avatar_html();
if($av) $event->add_stats($av, 0);
diff --git a/lib/jquery.timeago.js b/lib/jquery.timeago.js
new file mode 100644
index 00000000..24ac69c7
--- /dev/null
+++ b/lib/jquery.timeago.js
@@ -0,0 +1,146 @@
+/**
+ * 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 0.10.0
+ * @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-2011, 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",
+ 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",
+ 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;
+ 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 < 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(/\.\d\d\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) {
+ // 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")) {
+ 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());
+ }
+
+ // fix for IE6 suckage
+ document.createElement("abbr");
+ document.createElement("time");
+}(jQuery));
diff --git a/lib/shimmie.js b/lib/shimmie.js
index 6e72770c..258d592b 100644
--- a/lib/shimmie.js
+++ b/lib/shimmie.js
@@ -26,6 +26,7 @@ $(document).ready(function() {
$confirm.dialog('open');
});
+ $("time").timeago();
});
var defaultTexts = new Array();
diff --git a/themes/danbooru/layout.class.php b/themes/danbooru/layout.class.php
index 5045adcc..cfdcc91f 100644
--- a/themes/danbooru/layout.class.php
+++ b/themes/danbooru/layout.class.php
@@ -88,7 +88,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
if(empty($this->subheading)) {
$subheading = "";
diff --git a/themes/danbooru/view.theme.php b/themes/danbooru/view.theme.php
index e9538640..49663fa4 100644
--- a/themes/danbooru/view.theme.php
+++ b/themes/danbooru/view.theme.php
@@ -6,7 +6,7 @@ class CustomViewImageTheme extends ViewImageTheme {
$page->set_title("Image {$image->id}: ".html_escape($image->get_tag_list()));
$page->set_heading(html_escape($image->get_tag_list()));
$page->add_block(new Block("Navigation", $this->build_navigation($image), "left", 0));
- $page->add_block(new Block("Statistics", $this->build_stats($image), "left", 10));
+ $page->add_block(new Block("Statistics", $this->build_stats($image), "left", 15));
$page->add_block(new Block(null, $this->build_image_editor($image, $editor_parts), "main", 10));
$page->add_block(new Block(null, $this->build_pin($image), "main", 11));
}
diff --git a/themes/default/layout.class.php b/themes/default/layout.class.php
index 3ee91b82..0c733c1b 100644
--- a/themes/default/layout.class.php
+++ b/themes/default/layout.class.php
@@ -42,7 +42,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
$wrapper = "";
if(strlen($page->heading) > 100) {
diff --git a/themes/default/style.css b/themes/default/style.css
index 811fc9d7..db384169 100644
--- a/themes/default/style.css
+++ b/themes/default/style.css
@@ -128,6 +128,10 @@ UL {
.comment {
text-align: left;
}
+.comment .timeago {
+ float: right;
+ font-size: 75%;
+}
.more:after {
content: " >>>";
diff --git a/themes/flat/layout.class.php b/themes/flat/layout.class.php
index f0e9a95b..c4fe7a05 100644
--- a/themes/flat/layout.class.php
+++ b/themes/flat/layout.class.php
@@ -42,7 +42,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
$subheading = empty($page->subheading) ? "" : "
{$page->subheading}
";
$wrapper = "";
diff --git a/themes/futaba/layout.class.php b/themes/futaba/layout.class.php
index 51f76716..21dacbc5 100644
--- a/themes/futaba/layout.class.php
+++ b/themes/futaba/layout.class.php
@@ -37,7 +37,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
if(empty($page->subheading)) {
$subheading = "";
diff --git a/themes/lite/layout.class.php b/themes/lite/layout.class.php
index c7273ab3..5053515f 100644
--- a/themes/lite/layout.class.php
+++ b/themes/lite/layout.class.php
@@ -138,7 +138,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
$subheading = empty($page->subheading) ? "" : "
{$page->subheading}
";
$wrapper = "";
diff --git a/themes/lite/view.theme.php b/themes/lite/view.theme.php
index 0bb17d06..5eb9d195 100644
--- a/themes/lite/view.theme.php
+++ b/themes/lite/view.theme.php
@@ -3,6 +3,7 @@
class CustomViewImageTheme extends ViewImageTheme {
public function display_page($image, $editor_parts) {
global $page;
+ $metatags = str_replace(" ", ", ", html_escape($image->get_tag_list()));
$page->set_title("Image {$image->id}: ".html_escape($image->get_tag_list()));
$page->set_heading(html_escape($image->get_tag_list()));
$page->add_html_header("
");
@@ -11,7 +12,7 @@ class CustomViewImageTheme extends ViewImageTheme {
$page->add_html_header("
get_thumb_link())."\">");
$page->add_html_header("
id}"))."\">");
$page->add_block(new Block("Navigation", $this->build_navigation($image), "left", 0));
- $page->add_block(new Block("Statistics", $this->build_stats($image), "left", 10));
+ $page->add_block(new Block("Statistics", $this->build_stats($image), "left", 15));
$page->add_block(new Block(null, $this->build_image_editor($image, $editor_parts), "main", 10));
$page->add_block(new Block(null, $this->build_pin($image), "main", 11));
}
diff --git a/themes/old_default/layout.class.php b/themes/old_default/layout.class.php
index cb4e6952..5dff2b59 100644
--- a/themes/old_default/layout.class.php
+++ b/themes/old_default/layout.class.php
@@ -37,7 +37,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
$subheading = empty($page->subheading) ? "" : "
{$page->subheading}
";
$wrapper = "";
diff --git a/themes/warm/layout.class.php b/themes/warm/layout.class.php
index c843eb3a..680bdcc4 100644
--- a/themes/warm/layout.class.php
+++ b/themes/warm/layout.class.php
@@ -47,7 +47,7 @@ class Layout {
$debug = get_debug_info();
- $contact = empty($contact_link) ? "" : "
Contact";
+ $contact = empty($contact_link) ? "" : "
Contact";
$subheading = empty($page->subheading) ? "" : "
{$page->subheading}
";
$wrapper = "";