diff --git a/contrib/admin/theme.php b/contrib/admin/theme.php index edd9877d..038b9be7 100644 --- a/contrib/admin/theme.php +++ b/contrib/admin/theme.php @@ -32,12 +32,36 @@ class AdminPageTheme extends Themelet { "; $page->add_block(new Block("Misc Admin Tools", $html)); - + + /* First check + Requires you to click the checkbox to enable the delete by query form */ + $dbqcheck = " + if(document.getElementById("dbqcheck").checked == false){ + document.getElementById("dbqtags").disabled = true; + document.getElementById("dbqsubmit").disabled = true; + }else{ + document.getElementById("dbqtags").disabled = false; + document.getElementById("dbqsubmit").disabled = false; + }"; + + /* Second check + Requires you to confirm the deletion by clicking ok. */ $html = " - ".make_form(make_link("admin_utils"))." + " + + .make_form(make_link("admin_utils"),"post",false,false,"return checkform()")." + - - + + "; $page->add_block(new Block("Delete by Query", $html)); diff --git a/contrib/home/theme.php b/contrib/home/theme.php index 1fe601ff..21364625 100644 --- a/contrib/home/theme.php +++ b/contrib/home/theme.php @@ -47,7 +47,7 @@ EOD $counter_html diff --git a/core/database.class.php b/core/database.class.php index 69d54e9e..53ed4b4d 100644 --- a/core/database.class.php +++ b/core/database.class.php @@ -75,6 +75,7 @@ class MySQL extends DBEngine { $data = str_replace("SCORE_DATETIME", "DATETIME", $data); $data = str_replace("SCORE_NOW", "\"1970-01-01\"", $data); $data = str_replace("SCORE_STRNORM", "", $data); + $data = str_replace("SCORE_ILIKE", "LIKE", $data); return $data; } @@ -96,6 +97,7 @@ class PostgreSQL extends DBEngine { $data = str_replace("SCORE_DATETIME", "TIMESTAMP", $data); $data = str_replace("SCORE_NOW", "current_time", $data); $data = str_replace("SCORE_STRNORM", "lower", $data); + $data = str_replace("SCORE_ILIKE", "ILIKE", $data); return $data; } @@ -142,6 +144,7 @@ class SQLite extends DBEngine { $data = str_replace("SCORE_BOOL", "CHAR(1)", $data); $data = str_replace("SCORE_NOW", "\"1970-01-01\"", $data); $data = str_replace("SCORE_STRNORM", "", $data); + $data = str_replace("SCORE_ILIKE", "LIKE", $data); $cols = array(); $extras = ""; foreach(explode(",", $data) as $bit) { diff --git a/core/util.inc.php b/core/util.inc.php index 98f17866..6c727710 100644 --- a/core/util.inc.php +++ b/core/util.inc.php @@ -129,34 +129,9 @@ function to_shorthand_int($int) { * @retval string */ function autodate($date, $html=true) { - global $config; - - $format = $config->get_string('autodate_format', "F j, Y"); - $seconds = time() - strtotime($date); - $ago = seconds_to_time($seconds) . " ago"; - $on = "on " . date($format, strtotime($date)); - - if($config->get_bool('use_autodate', true)) { - return ($html ? "$ago" : $ago); - } - else { - return $on; - } -} - -/** - * Turn a number of seconds into a vague human timespan, eg 142 -> "2 minutes" - * - * @retval string - */ -function seconds_to_time($seconds) { - if($seconds<60) return $seconds . " second" . plural($seconds); $seconds = round($seconds/60); - if($seconds<60) return $seconds . " minute" . plural($seconds); $seconds = round($seconds/60); - if($seconds<24) return $seconds . " hour" . plural($seconds); $seconds = round($seconds/24); - if($seconds<7) return $seconds . " day" . plural($seconds); $seconds = round($seconds/7); - if($seconds<4) return $seconds . " week" . plural($seconds); $seconds = round($seconds/4); - if($seconds<12) return $seconds . " month" . plural($seconds); $seconds = round($seconds/12); - return $seconds . " year" . plural($seconds); + $cpu = date('c', strtotime($date)); + $hum = date('F j, Y', strtotime($date)); + return ($html ? "" : $hum); } @@ -279,13 +254,16 @@ function make_http($link) { * * @retval string */ -function make_form($target, $method="POST", $multipart=False, $form_id="") { +function make_form($target, $method="POST", $multipart=False, $form_id="", $onsubmit="") { global $user; $auth = $user->get_auth_html(); $extra = empty($form_id) ? '' : " id='$form_id'"; if($multipart) { $extra .= " enctype='multipart/form-data'"; } + if($onsubmit) { + $extra .= " onsubmit='$onsubmit'"; + } return "
$auth"; } diff --git a/ext/comment/theme.php b/ext/comment/theme.php index f48a7b25..264cd67b 100644 --- a/ext/comment/theme.php +++ b/ext/comment/theme.php @@ -179,6 +179,7 @@ class CommentListTheme extends Themelet { return "
+ $h_userlink: $h_comment $h_dellink
diff --git a/ext/setup/main.php b/ext/setup/main.php index f1885568..7e7337e8 100644 --- a/ext/setup/main.php +++ b/ext/setup/main.php @@ -169,10 +169,8 @@ class Setup extends SimpleExtension { $config->set_default_string("main_page", "post/list"); $config->set_default_string("base_href", "./index.php?q="); $config->set_default_string("theme", "default"); - $config->set_default_bool("use_autodate", true); $config->set_default_bool("word_wrap", true); $config->set_default_bool("comment_captcha", false); - $config->set_default_string("autodate_format", "F j, Y"); // Automatic caching is disabled by default $config->set_default_string("autocache_location", "data/cache"); $config->set_default_bool("autocache_css", false); diff --git a/ext/tag_list/main.php b/ext/tag_list/main.php index d4f99d9f..0b1c537e 100644 --- a/ext/tag_list/main.php +++ b/ext/tag_list/main.php @@ -141,7 +141,7 @@ class TagList implements Extension { $tag_data = $database->get_col(" SELECT DISTINCT - substr(tag, 1, 1) + SCORE_STRNORM(substr(tag, 1, 1)) FROM tags WHERE count >= :tags_min ORDER BY substr(tag, 1, 1) @@ -184,7 +184,7 @@ class TagList implements Extension { FLOOR(LOG(2.7, LOG(2.7, count - :tags_min2 + 1)+1)*1.5*100)/100 AS scaled FROM tags WHERE count >= :tags_min - AND tag LIKE :starts_with + AND tag SCORE_ILIKE :starts_with ORDER BY tag ", array("tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with)); @@ -216,7 +216,7 @@ class TagList implements Extension { SELECT tag, count FROM tags WHERE count >= :tags_min - AND tag LIKE :starts_with + AND tag SCORE_ILIKE :starts_with ORDER BY tag ", array("tags_min"=>$tags_min, "starts_with"=>$starts_with)); diff --git a/ext/tag_list/theme.php b/ext/tag_list/theme.php index f0fac49b..99d83664 100644 --- a/ext/tag_list/theme.php +++ b/ext/tag_list/theme.php @@ -52,8 +52,12 @@ class TagListTheme extends Themelet { $html .= " $count"; } } - - $page->add_block(new Block("Related", $html, "left")); + + if($config->get_string('tag_list_image_type')=="tags"){ + $page->add_block(new Block("Tags", $html, "left", 10));} + else{ + $page->add_block(new Block("Related Tags", $html, "left", 10)); + } } diff --git a/ext/upload/theme.php b/ext/upload/theme.php index 50895783..fae6501f 100644 --- a/ext/upload/theme.php +++ b/ext/upload/theme.php @@ -27,11 +27,11 @@ class UploadTheme extends Themelet { if($i==0){ $upload_list .= "
" . - "". + "". "
"; }else{ $upload_list .="
- "; }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 = "";