-
Notifications
You must be signed in to change notification settings - Fork 5
/
duolingo_discussiontime.user.js
86 lines (74 loc) · 2.4 KB
/
duolingo_discussiontime.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// ==UserScript==
// @name DuoDiscussionTime
// @namespace https://github.com/liuch/duolingo-scripts
// @include https://forum.duolingo.com/*
// @version 0.3.1
// @grant none
// @description The script shows the exact time when a comment was created.
// @description:ru Скрипт показывает точное время создания комментария.
// @updateURL https://github.com/liuch/duolingo-scripts/raw/master/duolingo_discussiontime.meta.js
// @downloadURL https://github.com/liuch/duolingo-scripts/raw/master/duolingo_discussiontime.user.js
// @author FieryCat aka liuch
// @license MIT License
// ==/UserScript==
function inject(f) { //Inject the script into the document
var script = document.createElement('script');
script.type = 'text/javascript';
script.setAttribute('name', 'duodiscussiontime');
script.textContent = '(' + f.toString() + ')()';
document.head.appendChild(script);
}
inject(f);
function f() {
var loc_reg = new RegExp("^/(comment|topic)/");
function update_comment(footer_el, date) {
var date_el = footer_el.querySelector(".iif_C"); // post
if (!date_el) {
date_el = footer_el.querySelector("_1xBLK"); // discussion list
if (!date_el) { // comments
var t = footer_el.childNodes[1];
if (t && t.tagName == "SPAN") {
date_el = t;
}
}
}
if (date_el && !date_el.classList.contains("duo-discussion-time-date")) {
date_el.setAttribute("title", date.toLocaleString());
date_el.className += " duo-discussion-time-date";
}
}
function update_all_comments() {
var metas = document.querySelectorAll("meta[itemprop=dateCreated]");
var m;
for (var i = 0; i < metas.length; ++i) {
m = metas[i];
if (m.parentElement)
update_comment(m.parentElement, new Date(m.getAttribute("content")));
}
}
function try_update() {
if (!loc_reg.exec(document.location.pathname))
return;
update_all_comments();
}
var observer = null;
var root_el = null;
function start_observe() {
observer.observe(root_el, { childList: true, subtree: true });
}
function stop_observe() {
observer.disconnect();
}
function set_observe() {
root_el = document.getElementsByTagName("body")[0];
if (root_el) {
observer = new MutationObserver(function(mutations) {
stop_observe();
try_update();
start_observe();
});
start_observe();
}
}
setTimeout(set_observe, 100);
}