Tumblr Timestamp

Adds Timestamp on Dashboard (even on private blogs)

当前为 2015-01-23 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Tumblr Timestamp
  3. // @namespace http://wolfspirals.tumblr.com/
  4. // @version 0.7
  5. // @description Adds Timestamp on Dashboard (even on private blogs)
  6. // @include *://www.tumblr.com/*
  7. // @grant gm_uwin
  8. // @copyright 2015+, Allyson Moisan
  9. // ==/UserScript==
  10.  
  11. (function () {
  12. // insertionQuery v1.0.0 (2014-03-06)
  13. // license:MIT
  14. // naugtur <naugtur@gmail.com> (http://naugtur.pl/)
  15. var insertionQ = function(){"use strict";function a(a,b){var d,e="insQ_"+g++,f=function(a){(a.animationName===e||a[i]===e)&&(c(a.target)||b(a.target))};d=document.createElement("style"),d.innerHTML="@"+j+"keyframes "+e+" { from { outline: 1px solid transparent } to { outline: 0px solid transparent } }\n"+a+" { animation-duration: 0.001s; animation-name: "+e+"; "+j+"animation-duration: 0.001s; "+j+"animation-name: "+e+"; } ",document.head.appendChild(d);var h=setTimeout(function(){document.addEventListener("animationstart",f,!1),document.addEventListener("MSAnimationStart",f,!1),document.addEventListener("webkitAnimationStart",f,!1)},n.timeout);return{destroy:function(){clearTimeout(h),d&&(document.head.removeChild(d),d=null),document.removeEventListener("animationstart",f),document.removeEventListener("MSAnimationStart",f),document.removeEventListener("webkitAnimationStart",f)}}}function b(a){a.QinsQ=!0}function c(a){return n.strictlyNew&&a.QinsQ===!0}function d(a){return c(a.parentNode)?a:d(a.parentNode)}function e(a){for(b(a),a=a.firstChild;a;a=a.nextSibling)void 0!==a&&1===a.nodeType&&e(a)}function f(f,g){var h=[],i=function(){var a;return function(){clearTimeout(a),a=setTimeout(function(){h.forEach(e),g(h),h=[]},10)}}();return a(f,function(a){if(!c(a)){b(a);var e=d(a);h.indexOf(e)<0&&h.push(e),i()}})}var g=100,h=!1,i="animationName",j="",k="Webkit Moz O ms Khtml".split(" "),l="",m=document.createElement("div"),n={strictlyNew:!0,timeout:20};if(m.style.animationName&&(h=!0),h===!1)for(var o=0;o<k.length;o++)if(void 0!==m.style[k[o]+"AnimationName"]){l=k[o],i=l+"AnimationName",j="-"+l.toLowerCase()+"-",h=!0;break}var p=function(b){return h&&b.match(/[^{}]/)?(n.strictlyNew&&e(document.body),{every:function(c){return a(b,c)},summary:function(a){return f(b,a)}}):!1};return p.config=function(a){for(var b in a)a.hasOwnProperty(b)&&(n[b]=a[b])},p}();
  16. var gm_uwin = ( function() {
  17. var a;
  18. try {
  19. a = unsafeWindow == window ? false : unsafeWindow;
  20. // Chrome: window == unsafeWindow
  21. } catch(e) {
  22. }
  23. return a || ( function() {
  24. var el = document.createElement('p');
  25. el.setAttribute('onclick', 'return window;');
  26. return el.onclick();
  27. }());
  28. }());
  29. var $ = gm_uwin.jQuery;
  30. if ( typeof $ !== "undefined") {
  31. $(document).ready(function() {
  32. $("head").append('<style type="text/css"> .post_timestamp { font-weight: normal; clear: both; position: absolute; top: 16px; left: 20px; font-size: 11px; } </style>');
  33. if ($('li.post_container').length > 0) {
  34. $('li.post_container').each(function(i, v) {
  35. processPostDate(v);
  36. });
  37. }
  38. insertionQ('li.post_container').every(function(v) {
  39. processPostDate(v);
  40. });
  41. });
  42. }
  43. function parsePostDate(post) {
  44. var postDate = new Date(), timeBox = $(post).contents().find("a.post_permalink").get(0);
  45. if (typeof timeBox != "undefined") {
  46. var timeText = timeBox.title.substr(timeBox.title.indexOf(" - ") + 3);
  47. if(timeText.length > 0) {
  48. if(timeText.indexOf("day") > -1) {
  49. // post time is not today, within past week
  50. var txtDay = timeText.substr(0, timeText.indexOf(",")),
  51. numDay = getDayChange(txtDay, postDate.getDay()),
  52. ap = timeText.substr(timeText.length - 2),
  53. hr = parseInt(timeText.substr(timeText.indexOf(", ") + 2, timeText.indexOf(":")), 0),
  54. mn = parseInt(timeText.substr(timeText.indexOf(":") + 1, 2), 10);
  55. if ((postDate.getDate() + numDay) < -1){
  56. postDate.setDate(-1);
  57. postDate.setDate(postDate.getDate() + numDay + 1);
  58. } else {
  59. postDate.setDate(postDate.getDate() + numDay);
  60. }
  61. if (hr !== 12) {
  62. hr = hr + ((ap === "am") ? 0 : 12);
  63. } else {
  64. hr = hr - ((ap === "am") ? 12 : 0);
  65. }
  66. postDate.setHours(hr);
  67. postDate.setMinutes(mn);
  68. } else if (timeText.indexOf(",") > -1) {
  69. // post time is older than a week
  70. var dateParts = timeText.split(" ");
  71. if (dateParts.length > 3) { // happened another year
  72. var year = parseInt(dateParts[2].substr(0, 4)),
  73. month = getMonthNumber(dateParts[0]),
  74. date = parseInt(dateParts[1], 0),
  75. ap = dateParts[3].substr(dateParts[3].length - 2),
  76. hr = parseInt(dateParts[3].substr(0, dateParts[3].indexOf(":")), 0),
  77. mn = parseInt(dateParts[3].substr(dateParts[3].indexOf(":") + 1, 2), 10),
  78. sec = postDate.getSeconds(),
  79. ms = postDate.getMilliseconds();
  80. if (hr !== 12) {
  81. hr = hr + ((ap === "am") ? 0 : 12);
  82. } else {
  83. hr = hr - ((ap === "am") ? 12 : 0);
  84. }
  85. postDate = new Date(year, month, date, hr, mn, sec, ms);
  86. } else { // happened this year
  87. var year = postDate.getFullYear(),
  88. month = getMonthNumber(dateParts[0]),
  89. date = parseInt(dateParts[1], 0),
  90. ap = dateParts[2].substr(dateParts[2].length - 2),
  91. hr = parseInt(dateParts[2].substr(0, dateParts[2].indexOf(":")), 0),
  92. mn = parseInt(dateParts[2].substr(dateParts[2].indexOf(":") + 1, 2), 10),
  93. sec = postDate.getSeconds(),
  94. ms = postDate.getMilliseconds();
  95. if (hr !== 12) {
  96. hr = hr + ((ap === "am") ? 0 : 12);
  97. } else {
  98. hr = hr - ((ap === "am") ? 12 : 0);
  99. }
  100. postDate = new Date(year, month, date, hr, mn, sec, ms);
  101. }
  102. } else {
  103. // post time is today
  104. var ap = timeText.substr(timeText.length - 2),
  105. hr = parseInt(timeText.substr(0, timeText.indexOf(":")), 0),
  106. mn = parseInt(timeText.substr(timeText.indexOf(":") + 1, 2), 10);
  107. if (hr !== 12) {
  108. hr = hr + ((ap === "am") ? 0 : 12);
  109. } else {
  110. hr = hr - ((ap === "am") ? 12 : 0);
  111. }
  112. postDate.setHours(hr);
  113. postDate.setMinutes(mn);
  114. }
  115. }
  116. return postDate;
  117. } else {
  118. return false;
  119. }
  120. }
  121. function getDayChange(oldDayText, newDay){
  122. var oldDay = -1;
  123. switch (oldDayText) {
  124. case "Monday":
  125. oldDay = 1;
  126. break;
  127. case "Tuesday":
  128. oldDay = 2;
  129. break;
  130. case "Wednesday":
  131. oldDay = 3;
  132. break;
  133. case "Thursday":
  134. oldDay = 4;
  135. break;
  136. case "Friday":
  137. oldDay = 5;
  138. break;
  139. case "Saturday":
  140. oldDay = 6;
  141. break;
  142. default:
  143. oldDay = 0;
  144. break;
  145. }
  146. var retday = oldDay - newDay;
  147. if (newDay < oldDay) {
  148. retday = retday - 7;
  149. }
  150. return retday;
  151. }
  152. function getMonthNumber(monthText) {
  153. var monthNum = -1;
  154. switch (monthText) {
  155. case "February":
  156. monthNum = 1;
  157. break;
  158. case "March":
  159. monthNum = 2;
  160. break;
  161. case "April":
  162. monthNum = 3;
  163. break;
  164. case "May":
  165. monthNum = 4;
  166. break;
  167. case "June":
  168. monthNum = 5;
  169. break;
  170. case "July":
  171. monthNum = 6;
  172. break;
  173. case "August":
  174. monthNum = 7;
  175. break;
  176. case "September":
  177. monthNum = 8;
  178. break;
  179. case "October":
  180. monthNum = 9;
  181. break;
  182. case "November":
  183. monthNum = 10;
  184. break;
  185. case "December":
  186. monthNum = 11;
  187. break;
  188. default:
  189. monthNum = 0;
  190. break;
  191. }
  192. return monthNum;
  193. }
  194. function relativePostTime(current, previous) {
  195.  
  196. var msPerMinute = 60 * 1000;
  197. var msPerHour = msPerMinute * 60;
  198. var msPerDay = msPerHour * 24;
  199. var msPerWeek = msPerDay * 7;
  200. var msPerMonth = msPerDay * 30;
  201. var msPerYear = msPerDay * 365;
  202. var elapsed = ((current > previous) ? (current - previous) : (previous - current));
  203. if (elapsed < msPerMinute) {
  204. return 'a few seconds ago';
  205. } else if (elapsed < msPerHour) {
  206. var ret = Math.round(elapsed/msPerMinute);
  207. if (ret === 1) {
  208. return ret + ' minute ago';
  209. } else {
  210. return ret + ' minutes ago';
  211. }
  212. } else if (elapsed < msPerDay ) {
  213. var ret = Math.round(elapsed/msPerHour);
  214. if (ret === 1) {
  215. return ret + ' hour ago';
  216. } else {
  217. return ret + ' hours ago';
  218. }
  219. } else if (elapsed < msPerWeek ) {
  220. var ret = Math.round(elapsed/msPerDay);
  221. if (ret === 1) {
  222. return ret + ' day ago';
  223. } else {
  224. return ret + ' days ago';
  225. }
  226. } else if (elapsed < msPerMonth ) {
  227. var ret = Math.round(elapsed/msPerWeek);
  228. if (ret === 1) {
  229. return ret + ' week ago';
  230. } else {
  231. return ret + ' weeks ago';
  232. }
  233. } else if (elapsed < msPerYear) {
  234. var ret = Math.round(elapsed/msPerMonth);
  235. if (ret === 1) {
  236. return ret + ' month ago';
  237. } else {
  238. return ret + ' months ago';
  239. }
  240. } else {
  241. var ret = Math.round(elapsed/msPerYear);
  242. if (ret === 1) {
  243. return ret + ' year ago';
  244. } else {
  245. return ret + ' years ago';
  246. }
  247. }
  248. }
  249.  
  250. function formatDate(myDate) {
  251. var weekDays = [], monthNames = [], theDate = myDate.getDate(), finalReturn = "";
  252. weekDays[0] = "Sun";
  253. weekDays[1] = "Mon";
  254. weekDays[2] = "Tue";
  255. weekDays[3] = "Wed";
  256. weekDays[4] = "Thu";
  257. weekDays[5] = "Fri";
  258. weekDays[6] = "Sat";
  259. monthNames[0] = "January";
  260. monthNames[1] = "February";
  261. monthNames[2] = "March";
  262. monthNames[3] = "April";
  263. monthNames[4] = "May";
  264. monthNames[5] = "June";
  265. monthNames[6] = "July";
  266. monthNames[7] = "August";
  267. monthNames[8] = "September";
  268. monthNames[9] = "October";
  269. monthNames[10] = "November";
  270. monthNames[11] = "December";
  271. finalReturn += weekDays[myDate.getDay()] + " " + monthNames[myDate.getMonth()] + " " + myDate.getDate().toString();
  272. if(myDate.getDate() === 1 || myDate.getDate() === 21 || myDate.getDate() === 31) {
  273. finalReturn += "st, ";
  274. } else if (myDate.getDate() === 2 || myDate.getDate() === 22) {
  275. finalReturn += "nd, ";
  276. } else if (myDate.getDate() === 3 || myDate.getDate() === 23) {
  277. finalReturn += "rd, ";
  278. } else {
  279. finalReturn += "th, ";
  280. }
  281. finalReturn += myDate.getFullYear().toString() + " at ";
  282. if (myDate.getHours() === 0) {
  283. finalReturn += (myDate.getHours() + 12).toString() + ":";
  284. } else if (myDate.getHours() <= 12) {
  285. finalReturn += (myDate.getHours()).toString() + ":";
  286. } else {
  287. finalReturn += (myDate.getHours() - 12).toString() + ":";
  288. }
  289. if (myDate.getMinutes() < 10) {
  290. finalReturn += "0" + myDate.getMinutes().toString() + " ";
  291. } else {
  292. finalReturn += myDate.getMinutes().toString() + " ";
  293. }
  294. if(myDate.getHours() < 12) {
  295. finalReturn += "AM";
  296. } else {
  297. finalReturn += "PM";
  298. }
  299. return finalReturn;
  300. }
  301. function insertPostDate(post, postTime, relativeTime) {
  302. var d = document.createElement("div");
  303. d.setAttribute("class", "post_timestamp");
  304. $(d).html(formatDate(postTime) + " &bull; " + relativeTime);
  305. $(d).appendTo($(post).contents().find("div.post_header").get(0));
  306. }
  307. function processPostDate(post) {
  308. if ($(post).children("div.post_timestamp").length === 0) {
  309. var postTime = parsePostDate(post);
  310. if (postTime) {
  311. var relativeTime = relativePostTime((new Date()).getTime(), postTime.getTime());
  312. insertPostDate(post, postTime, relativeTime);
  313. }
  314. return false;
  315. }
  316. }
  317. })();