File: index.js

package info (click to toggle)
golang-github-alecthomas-chroma 0.10.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,652 kB
  • sloc: python: 426; javascript: 79; makefile: 34; sh: 32
file content (88 lines) | stat: -rw-r--r-- 3,052 bytes parent folder | download | duplicates (4)
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
86
87
88
document.addEventListener("DOMContentLoaded", function () {
    var style = document.createElement('style');
    var ref = document.querySelector('script');
    ref.parentNode.insertBefore(style, ref);

    var form = document.getElementById('chroma');
    var textArea = form.elements["text"];
    var styleSelect = form.elements["style"];
    var languageSelect = form.elements["language"];
    var csrfToken = form.elements["gorilla.csrf.Token"].value;
    var output = document.getElementById("output");
    var htmlCheckbox = document.getElementById("html");

    (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {
        $notification = $delete.parentNode;
        $delete.addEventListener('click', () => {
            $notification.parentNode.removeChild($notification);
        });
    });

    function debounce(func, wait, immediate) {
        var timeout;
        return function () {
            var context = this, args = arguments;
            var later = function () {
                timeout = null;
                if (!immediate) func.apply(context, args);
            };
            var callNow = immediate && !timeout;
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
            if (callNow) func.apply(context, args);
        };
    }

    function getFormJSON() {
        return {
            "language": languageSelect.value,
            "style": styleSelect.value,
            "text": textArea.value,
            "classes": htmlCheckbox.checked,
        }
    }

    function update(event) {
        fetch("api/render", {
            method: 'POST',
            mode: 'cors',
            cache: 'no-cache',
            credentials: 'same-origin',
            headers: {
                'X-CSRF-Token': csrfToken,
                'Content-Type': 'application/json',
            },
            redirect: 'follow',
            referrer: 'no-referrer',
            body: JSON.stringify(getFormJSON()),
        }).then(data => {
            data.json().then(
                value => {
                    if (value.language) {
                        languageSelect.value = value.language;
                    }
                    style.innerHTML = "#output { " + value.background + "}";
                    if (htmlCheckbox.checked) {
                        output.innerText = value.html;
                    } else {
                        output.innerHTML = value.html;
                    }
                }
            );
        }).catch(reason => {
            console.log(reason);
        });

        event.preventDefault();
    }

    var eventHandler = (event) => update(event);
    var debouncedEventHandler = debounce(eventHandler, 250);

    languageSelect.addEventListener('change', eventHandler);
    styleSelect.addEventListener('change', eventHandler);
    htmlCheckbox.addEventListener('change', eventHandler);

    textArea.addEventListener('input', debouncedEventHandler);
    textArea.addEventListener('change', debouncedEventHandler);
});