Commit | Line | Data |
---|---|---|
ffe0b2f4 | 1 | (() => { |
cf7b74e9 JC |
2 | const comments = document.querySelectorAll("tr.comtr"); |
3 | const morelink = document.querySelectorAll("a.morelink"); | |
4 | ||
5 | const elements = [...Array.from(comments), ...Array.from(morelink)] | |
ffe0b2f4 | 6 | |
cf7b74e9 JC |
7 | let elementsIndex = 0; |
8 | let selectedComment = elements[elementsIndex] | |
ffe0b2f4 JC |
9 | selectedComment.style.outline = '1px dashed black'; |
10 | ||
11 | const visible = (element) => { | |
12 | let bounds = element.getBoundingClientRect(); | |
13 | return bounds.top >= 0 && bounds.bottom <= window.innerHeight; | |
14 | } | |
15 | ||
16 | const changeWithVisibleCallback = (comment, callback) => { | |
17 | if (comment == null) { | |
18 | return; | |
19 | } | |
20 | selectedComment.style.outline = ''; | |
21 | selectedComment = comment; | |
22 | selectedComment.style.outline = '1px dashed black'; | |
23 | if (!visible(comment)) { | |
24 | callback(); | |
25 | } | |
26 | } | |
27 | ||
28 | const change = (comment) => { | |
cf7b74e9 | 29 | elementsIndex = elements.indexOf(comment); |
ffe0b2f4 JC |
30 | changeWithVisibleCallback(comment, () => {}); |
31 | } | |
32 | ||
33 | // Curry callback for moving downpage | |
cf7b74e9 JC |
34 | const changeDownpage = () => { |
35 | elementsIndex = Math.min(elementsIndex + 1, elements.length); | |
36 | changeWithVisibleCallback(elements[elementsIndex], () => {window.scrollTo(0, window.scrollY + selectedComment.offsetHeight)}); | |
ffe0b2f4 JC |
37 | } |
38 | ||
39 | // Curry callback for moving up page | |
cf7b74e9 JC |
40 | const changeUppage = () => { |
41 | elementsIndex = Math.max(elementsIndex - 1, 0); | |
42 | changeWithVisibleCallback(elements[elementsIndex], () => {window.scrollTo(0, window.scrollY - selectedComment.offsetHeight)}); | |
ffe0b2f4 | 43 | } |
ec8ce8db | 44 | |
ffe0b2f4 JC |
45 | document.addEventListener("click", (e) => { |
46 | change(e.target.closest("tr.athing")); | |
47 | }) | |
48 | document.addEventListener("keydown", (e) => { | |
49 | if (e.isComposing) { | |
ec8ce8db | 50 | return; |
ffe0b2f4 | 51 | } |
ec8ce8db JC |
52 | switch (e.key) { |
53 | case "j": | |
54 | do { | |
cf7b74e9 | 55 | changeDownpage(); |
ec8ce8db JC |
56 | } while (selectedComment.classList.contains("noshow")); |
57 | break; | |
58 | case "k": | |
59 | do { | |
cf7b74e9 | 60 | changeUppage(); |
ec8ce8db JC |
61 | } while (selectedComment.classList.contains("noshow")); |
62 | break; | |
63 | case "m": | |
64 | case "Enter": | |
65 | let togg = selectedComment.querySelector(".togg"); | |
ec8ce8db JC |
66 | if (togg) { |
67 | togg.click(); | |
68 | } | |
cf7b74e9 JC |
69 | else if (elementsIndex == elements.length - 1) { |
70 | selectedComment.click(); | |
ec8ce8db JC |
71 | } |
72 | break; | |
73 | case "p": | |
74 | while (selectedComment.querySelector("td.ind").firstElementChild.width != 0) { | |
cf7b74e9 | 75 | changeUppage(); |
ec8ce8db JC |
76 | } |
77 | break; | |
78 | default: | |
79 | //noop | |
ffe0b2f4 JC |
80 | } |
81 | }) | |
82 | })(); |