forked from kovidgoyal/calibre
-
Notifications
You must be signed in to change notification settings - Fork 0
/
toc.js
82 lines (76 loc) · 3.01 KB
/
toc.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
/* vim:fileencoding=utf-8
*
* Copyright (C) 2019 Kovid Goyal <kovid at kovidgoyal.net>
*
* Distributed under terms of the GPLv3 license
*/
/*jshint esversion: 6 */
(function() {
"use strict";
var com_id = "COM_ID";
var com_counter = 0;
var dark_css = CSS;
var settings = SETTINGS;
function onclick(event) {
// We dont want this event to trigger onclick on this element's parent
// block, if any.
event.stopPropagation();
var frac = window.pageYOffset/document.body.scrollHeight;
var loc = [];
var totals = [];
var block = event.currentTarget;
var parent = block;
while (parent && parent.tagName && parent.tagName.toLowerCase() !== 'body') {
totals.push(parent.parentNode.children.length);
var num = 0;
var sibling = parent.previousElementSibling;
while (sibling) {
num += 1;
sibling = sibling.previousElementSibling;
}
loc.push(num);
parent = parent.parentNode;
}
loc.reverse();
totals.reverse();
com_counter += 1;
window.calibre_toc_data = [block.tagName.toLowerCase(), block.id, loc, totals, frac];
document.title = com_id + '-' + com_counter;
}
function find_blocks() {
for (let elem of document.body.getElementsByTagName('*')) {
var style = window.getComputedStyle(elem);
if (style.display === 'block' || style.display === 'flex-box' || style.display === 'box') {
elem.addEventListener('click', onclick);
elem.addEventListener('mouseover', function(ev) { this.classList.add('calibre_toc_hover'); ev.stopPropagation(); });
elem.addEventListener('mouseout', function(ev) { this.classList.remove('calibre_toc_hover'); ev.stopPropagation(); });
}
}
}
function apply_body_colors(event) {
if (document.documentElement) {
if (settings.bg) document.documentElement.style.backgroundColor = settings.bg;
if (settings.fg) document.documentElement.style.color = settings.fg;
}
if (document.body) {
if (settings.bg) document.body.style.backgroundColor = settings.bg;
if (settings.fg) document.body.style.color = settings.fg;
}
}
function apply_css() {
var css = '';
css += '.calibre_toc_hover:hover { cursor: pointer !important; border-top: solid 5px green !important }\n\n';
if (settings.link) css += 'html > body :link, html > body :link * { color: ' + settings.link + ' !important; }\n\n';
if (settings.is_dark_theme) { css += dark_css; }
var style = document.createElement('style');
style.textContent = css;
document.documentElement.appendChild(style);
}
apply_body_colors();
function apply_all() {
apply_css();
apply_body_colors();
find_blocks();
}
document.addEventListener("DOMContentLoaded", apply_all);
})();