Local time for LOR

Местное время для Linux.Org.ru

  1. // ==UserScript==
  2. // @name Local time for LOR
  3. // @name:en Local time for LOR
  4. // @description:ru Местное время для Linux.Org.ru
  5. // @description:en Local time userscript for Linux.Org.Ru
  6. // @namespace https://maximov.space/userscripts
  7. // @include https://www.linux.org.ru/*
  8. // @version 0.6.2
  9. // @grant none
  10. // @description Местное время для Linux.Org.ru
  11. // ==/UserScript==
  12.  
  13. /******/ (function(modules) { // webpackBootstrap
  14. /******/ // The module cache
  15. /******/ var installedModules = {};
  16.  
  17. /******/ // The require function
  18. /******/ function __webpack_require__(moduleId) {
  19.  
  20. /******/ // Check if module is in cache
  21. /******/ if(installedModules[moduleId])
  22. /******/ return installedModules[moduleId].exports;
  23.  
  24. /******/ // Create a new module (and put it into the cache)
  25. /******/ var module = installedModules[moduleId] = {
  26. /******/ exports: {},
  27. /******/ id: moduleId,
  28. /******/ loaded: false
  29. /******/ };
  30.  
  31. /******/ // Execute the module function
  32. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  33.  
  34. /******/ // Flag the module as loaded
  35. /******/ module.loaded = true;
  36.  
  37. /******/ // Return the exports of the module
  38. /******/ return module.exports;
  39. /******/ }
  40.  
  41.  
  42. /******/ // expose the modules object (__webpack_modules__)
  43. /******/ __webpack_require__.m = modules;
  44.  
  45. /******/ // expose the module cache
  46. /******/ __webpack_require__.c = installedModules;
  47.  
  48. /******/ // __webpack_public_path__
  49. /******/ __webpack_require__.p = "";
  50.  
  51. /******/ // Load entry module and return exports
  52. /******/ return __webpack_require__(0);
  53. /******/ })
  54. /************************************************************************/
  55. /******/ ([
  56. /* 0 */
  57. /***/ function(module, exports, __webpack_require__) {
  58.  
  59. var _date = __webpack_require__(1);
  60.  
  61. var _dateFormat = __webpack_require__(3);
  62.  
  63. var _schedule = __webpack_require__(5);
  64.  
  65. var TABULAR_VIEW_RE = /^\/(forum\/\w+|notifications|tracker)\/?$/;
  66.  
  67. function shortDates() {
  68. return TABULAR_VIEW_RE.test(window.location.pathname);
  69. }
  70.  
  71. var setLocalTime = function setLocalTime(elem) {
  72. // Chromium-based browsers don't yet recognize HTMLTimeElement,
  73. // so `dateTime` is undefined, then use `getAttribute` instead.
  74. var time = elem.dateTime ? elem.dateTime : elem.getAttribute('datetime');
  75. var date = new Date(time);
  76.  
  77. var update = function update(date) {
  78. return elem.textContent = (0, _dateFormat.display)(date, _dateFormat.FORMAT.ELAPSED, { shortDates: shortDates() });
  79. };
  80.  
  81. var scheduleUpdateDays = function scheduleUpdateDays() {
  82. return (0, _schedule.schedule)(update, { stop: (0, _schedule.after)({ days: 2 }), every: { hours: 1 } }, date);
  83. };
  84. var scheduleUpdateMinutes = function scheduleUpdateMinutes() {
  85. return (0, _schedule.schedule)(update, { stop: (0, _schedule.after)({ hours: 1 }), every: { seconds: 10 } }, date);
  86. };
  87.  
  88. update(date);
  89. elem.setAttribute('data-tooltip', (0, _dateFormat.display)(date, _dateFormat.FORMAT.EXACT));
  90.  
  91. if (!(0, _date.elapsed)(date, { hours: 1 })) {
  92. scheduleUpdateMinutes().then(scheduleUpdateDays);
  93. } else if (!(0, _date.elapsed)(date, { days: 2 })) {
  94. scheduleUpdateDays();
  95. }
  96. };
  97.  
  98. var css = '\ntime[data-tooltip] {\n border-bottom: 2px dotted grey;\n cursor: pointer;\n}\ntime[data-tooltip]:hover {\n position: relative;\n}\ntime[data-tooltip]:hover:after {\n font-size: small;\n content: attr(data-tooltip);\n padding: 0.3em 0.5em;\n color: #333;\n position: absolute;\n left: 2em;\n top: 150%;\n white-space: nowrap;\n z-index: 20;\n border-radius: 0.5em;\n box-shadow: 0px 0px 4px #222;\n background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);\n background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #eeeeee),color-stop(1, #cccccc));\n background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);\n background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);\n background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);\n background-image: -o-linear-gradient(top, #eeeeee, #cccccc);\n}\n';
  99.  
  100. var style = document.createElement('style');
  101. style.type = 'text/css';
  102. style.innerHTML = css;
  103. document.body.appendChild(style);
  104.  
  105. var _iteratorNormalCompletion = true;
  106. var _didIteratorError = false;
  107. var _iteratorError = undefined;
  108.  
  109. try {
  110. for (var _iterator = document.querySelectorAll('time')[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  111. var time = _step.value;
  112.  
  113. setLocalTime(time);
  114. }
  115. } catch (err) {
  116. _didIteratorError = true;
  117. _iteratorError = err;
  118. } finally {
  119. try {
  120. if (!_iteratorNormalCompletion && _iterator.return) {
  121. _iterator.return();
  122. }
  123. } finally {
  124. if (_didIteratorError) {
  125. throw _iteratorError;
  126. }
  127. }
  128. }
  129.  
  130. /***/ },
  131. /* 1 */
  132. /***/ function(module, exports, __webpack_require__) {
  133.  
  134. Object.defineProperty(exports, "__esModule", {
  135. value: true
  136. });
  137. exports.elapsed = exports.minutesElapsedSince = exports.sameDay = exports.yesterday = exports.getDay = exports.getMonth = exports.getYear = undefined;
  138.  
  139. var _delay = __webpack_require__(2);
  140.  
  141. var getYear = exports.getYear = function getYear(date) {
  142. return date.getFullYear();
  143. };
  144. var getMonth = exports.getMonth = function getMonth(date) {
  145. return date.getMonth() + 1;
  146. };
  147. var getDay = exports.getDay = function getDay(date) {
  148. return date.getDate();
  149. };
  150.  
  151. var yesterday = exports.yesterday = function yesterday(date) {
  152. var newDate = new Date(date);
  153. newDate.setDate(date.getDate() - 1);
  154. return newDate;
  155. };
  156.  
  157. var sameDay = exports.sameDay = function sameDay(date1, date2) {
  158. return getYear(date1) === getYear(date2) && getMonth(date1) === getMonth(date2) && getDay(date1) === getDay(date2);
  159. };
  160.  
  161. var minutesElapsedSince = exports.minutesElapsedSince = function minutesElapsedSince(date) {
  162. var now = new Date();
  163. var minutesDiff = (now - date) / _delay.FACTORS.minutes;
  164. var roundingFunction = minutesDiff < 1 ? Math.ceil : Math.floor;
  165. return roundingFunction(minutesDiff);
  166. };
  167.  
  168. var elapsed = exports.elapsed = function elapsed(date, delay) {
  169. return new Date() - date >= (0, _delay.translateDelay)(delay);
  170. };
  171.  
  172. /***/ },
  173. /* 2 */
  174. /***/ function(module, exports) {
  175.  
  176. Object.defineProperty(exports, "__esModule", {
  177. value: true
  178. });
  179. var FACTORS = exports.FACTORS = {
  180. millis: 1,
  181. millisecond: 1,
  182. milliseconds: 1,
  183. seconds: 1000,
  184. second: 1000,
  185. minutes: 1000 * 60,
  186. minute: 1000 * 60,
  187. hours: 1000 * 60 * 60,
  188. hour: 1000 * 60 * 60,
  189. days: 1000 * 60 * 60 * 24,
  190. day: 1000 * 60 * 60 * 24
  191. };
  192. var units = Object.keys(FACTORS);
  193.  
  194. var translateDelay = exports.translateDelay = function translateDelay(delay) {
  195. var translated = 0;
  196. var _iteratorNormalCompletion = true;
  197. var _didIteratorError = false;
  198. var _iteratorError = undefined;
  199.  
  200. try {
  201. for (var _iterator = units[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  202. var unit = _step.value;
  203.  
  204. var value = delay[unit] || 0;
  205. translated += value * FACTORS[unit];
  206. }
  207. } catch (err) {
  208. _didIteratorError = true;
  209. _iteratorError = err;
  210. } finally {
  211. try {
  212. if (!_iteratorNormalCompletion && _iterator.return) {
  213. _iterator.return();
  214. }
  215. } finally {
  216. if (_didIteratorError) {
  217. throw _iteratorError;
  218. }
  219. }
  220. }
  221.  
  222. return translated;
  223. };
  224.  
  225. /***/ },
  226. /* 3 */
  227. /***/ function(module, exports, __webpack_require__) {
  228.  
  229. Object.defineProperty(exports, "__esModule", {
  230. value: true
  231. });
  232. exports.display = exports.displayMinutes = exports.displayDate = exports.FORMAT = undefined;
  233.  
  234. var _util = __webpack_require__(4);
  235.  
  236. var _date = __webpack_require__(1);
  237.  
  238. var FORMAT = exports.FORMAT = {
  239. EXACT: 'EXACT',
  240. ELAPSED: 'ELAPSED'
  241. };
  242.  
  243. var displayDate = exports.displayDate = function displayDate(date, format) {
  244. var verbose = format === FORMAT.ELAPSED;
  245.  
  246. var year = (0, _date.getYear)(date).toString();
  247. var month = (0, _util.zeroPad)((0, _date.getMonth)(date), 2);
  248. var day = (0, _util.zeroPad)((0, _date.getDay)(date), 2);
  249.  
  250. var now = new Date();
  251.  
  252. var dateString = undefined;
  253.  
  254. if (verbose && (0, _date.sameDay)(date, now)) {
  255. dateString = 'сегодня';
  256. } else if (verbose && (0, _date.sameDay)(date, (0, _date.yesterday)(now))) {
  257. dateString = 'вчера';
  258. } else {
  259. dateString = day + '.' + month + '.' + year;
  260. }
  261.  
  262. return dateString;
  263. };
  264.  
  265. var pluralizeMinutes = function pluralizeMinutes(minutes) {
  266. var lastDigit = minutes % 10;
  267.  
  268. if (minutes >= 10 && minutes <= 20 || lastDigit == 0 || lastDigit >= 5) return "минут";
  269. if (lastDigit == 1) return "минута";
  270. return "минуты";
  271. };
  272.  
  273. var displayMinutes = exports.displayMinutes = function displayMinutes(elapsedMinutes) {
  274. if (elapsedMinutes === 1) {
  275. return 'минуту назад';
  276. }
  277. var minutesString = pluralizeMinutes(elapsedMinutes);
  278. return elapsedMinutes + ' ' + minutesString + ' назад';
  279. };
  280.  
  281. var display = exports.display = function display(date, format) {
  282. var options = arguments.length <= 2 || arguments[2] === undefined ? { shortDates: false } : arguments[2];
  283.  
  284. var verbose = format === FORMAT.ELAPSED;
  285.  
  286. if (verbose) {
  287. var elapsedMinutes = (0, _date.minutesElapsedSince)(date);
  288.  
  289. if (elapsedMinutes < 60) {
  290. return displayMinutes(elapsedMinutes);
  291. }
  292. }
  293.  
  294. var hour = (0, _util.zeroPad)(date.getHours(), 2);
  295. var minute = (0, _util.zeroPad)(date.getMinutes(), 2);
  296. var seconds = (0, _util.zeroPad)(date.getSeconds(), 2);
  297.  
  298. var dateString = displayDate(date, format);
  299.  
  300. dateString = dateString + ' ' + hour + ':' + minute;
  301.  
  302. if (!options.shortDates) {
  303. dateString = dateString + ':' + seconds;
  304. }
  305.  
  306. return dateString;
  307. };
  308.  
  309. /***/ },
  310. /* 4 */
  311. /***/ function(module, exports) {
  312.  
  313. Object.defineProperty(exports, "__esModule", {
  314. value: true
  315. });
  316. var zeroPad = exports.zeroPad = function zeroPad(num, places) {
  317. var numString = num.toString();
  318. var zero = places - numString.length + 1;
  319. return Array(+(zero > 0 && zero)).join('0') + num;
  320. };
  321.  
  322. /***/ },
  323. /* 5 */
  324. /***/ function(module, exports, __webpack_require__) {
  325.  
  326. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
  327.  
  328. Object.defineProperty(exports, "__esModule", {
  329. value: true
  330. });
  331. exports.schedule = exports.after = undefined;
  332.  
  333. var _delay = __webpack_require__(2);
  334.  
  335. var _date = __webpack_require__(1);
  336.  
  337. var after = exports.after = function after(delay) {
  338. return function (date) {
  339. return (0, _date.elapsed)(date, delay);
  340. };
  341. };
  342.  
  343. var schedule = exports.schedule = function schedule(action, options) {
  344. for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
  345. args[_key - 2] = arguments[_key];
  346. }
  347.  
  348. options = options || {};
  349.  
  350. return new Promise(function (resolve, reject) {
  351. if (!options.every) return reject(new Error('options.every not set'));
  352. if (!options.stop) return reject(new Error('options.stop not set'));
  353.  
  354. if (typeof options.stop !== 'function') return reject(new Error('options.stop is not a function'));
  355. if (_typeof(options.every) !== 'object') return reject(new Error('options.every is not an object'));
  356.  
  357. var interval = undefined;
  358.  
  359. interval = setInterval(function () {
  360. var _options;
  361.  
  362. var result = action.apply(undefined, args);
  363. if ((_options = options).stop.apply(_options, args)) {
  364. clearInterval(interval);
  365. return resolve(result);
  366. }
  367. }, (0, _delay.translateDelay)(options.every));
  368. });
  369. };
  370.  
  371. /***/ }
  372. /******/ ]);