1
0
mirror of https://github.com/alecthomas/chroma.git synced 2025-03-27 21:49:13 +02:00

89 lines
3.0 KiB
JavaScript
Raw Normal View History

2019-07-16 15:45:06 +10:00
document.addEventListener("DOMContentLoaded", function () {
2019-07-16 18:45:54 +10:00
var style = document.createElement('style');
var ref = document.querySelector('script');
ref.parentNode.insertBefore(style, ref);
2019-07-16 15:45:06 +10:00
var form = document.getElementById('chroma');
2019-07-16 18:45:54 +10:00
var textArea = form.elements["text"];
2019-07-16 21:31:37 +10:00
var styleSelect = form.elements["style"];
var languageSelect = form.elements["language"];
2019-07-16 18:45:54 +10:00
var csrfToken = form.elements["gorilla.csrf.Token"].value;
var output = document.getElementById("output");
2019-07-16 21:31:37 +10:00
var htmlCheckbox = document.getElementById("html");
2019-07-16 18:45:54 +10:00
2019-07-16 22:08:09 +10:00
(document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {
$notification = $delete.parentNode;
$delete.addEventListener('click', () => {
$notification.parentNode.removeChild($notification);
});
});
2019-07-16 18:45:54 +10:00
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);
};
2019-07-16 21:31:37 +10:00
}
2019-07-16 18:45:54 +10:00
function getFormJSON() {
return {
2019-07-16 21:31:37 +10:00
"language": languageSelect.value,
"style": styleSelect.value,
"text": textArea.value,
"classes": htmlCheckbox.checked,
2019-07-16 18:45:54 +10:00
}
}
function update(event) {
fetch("api/render", {
2019-07-16 21:31:37 +10:00
method: 'POST',
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
2019-07-16 18:45:54 +10:00
headers: {
'X-CSRF-Token': csrfToken,
'Content-Type': 'application/json',
},
2019-07-16 21:31:37 +10:00
redirect: 'follow',
referrer: 'no-referrer',
2019-07-16 18:45:54 +10:00
body: JSON.stringify(getFormJSON()),
}).then(data => {
data.json().then(
value => {
2019-07-16 21:31:37 +10:00
if (value.language) {
languageSelect.value = value.language;
}
2019-07-16 18:45:54 +10:00
style.innerHTML = "#output { " + value.background + "}";
2019-07-16 21:31:37 +10:00
if (htmlCheckbox.checked) {
output.innerText = value.html;
} else {
output.innerHTML = value.html;
}
2019-07-16 18:45:54 +10:00
}
);
}).catch(reason => {
console.log(reason);
2019-07-16 21:31:37 +10:00
});
2019-07-16 18:45:54 +10:00
event.preventDefault();
}
var eventHandler = (event) => update(event);
var debouncedEventHandler = debounce(eventHandler, 250);
2019-07-16 21:31:37 +10:00
languageSelect.addEventListener('change', eventHandler);
styleSelect.addEventListener('change', eventHandler);
htmlCheckbox.addEventListener('change', eventHandler);
2019-07-16 18:45:54 +10:00
textArea.addEventListener('input', debouncedEventHandler);
2019-07-16 21:31:37 +10:00
textArea.addEventListener('change', debouncedEventHandler);
2019-07-16 15:45:06 +10:00
});