You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CheezeNotes/static/modules/mdnotes.js

144 lines
3.7 KiB

import { getStartPositionInLine, setStartPositionInLine } from './position.js';
import { formatLine, load, save, formatTable, redrawTables } from './md.js';
function timeoutSave() {
if (window.tos !== null) {
window.clearTimeout(window.tos);
}
window.tos = window.setTimeout(onsave, 5000);
}
function ontextarea(e) {
let ta = document.getElementById('ta');
if (ta.style.display == 'none') {
ta.style.display = 'inline';
} else {
ta.style.display = 'none';
}
}
function onsave(e) {
save(document.getElementById('ta'), document.getElementById('mdnotes'));
}
function onload(e) {
load(document.getElementById('ta'), document.getElementById('mdnotes'));
}
function onedit(e) {
timeoutSave();
let ret = getStartPositionInLine();
let line = ret[0];
let position = ret[1];
if (line.innerText == '\n') {
line.className = 'mdnotes_line';
line.classList.add('body');
return;
}
let prevline = line.previousSibling;
if (prevline != null && prevline.innerText == '\n') {
prevline.className = 'mdnotes_line';
prevline.classList.add('body');
}
let newline = formatLine(line.innerText);
line.parentNode.replaceChild(newline, line);
formatTable(newline, dpwidth());
setStartPositionInLine(newline, position);
}
function onkeydown(e) {
if (e.key != 'Tab') {
return true;
}
e.preventDefault();
let key = ' ';
let ret = getStartPositionInLine();
let line = ret[0];
let position = ret[1];
let txt = line.innerText;
if (position == 0) {
line.innerHTML = key + txt; // 4 espaces =>  
} else {
line.innerHTML = txt.substring(0, position) + key + txt.substring(position, txt.length);
}
setStartPositionInLine(line, position + 1);
onedit(e);
return false;
}
function onkeypress(e) {
if (e.key == 'Escape') {
e.preventDefault();
document.getElementById('mdnotes').blur();
onsave();
return false;
}
if (e.key == 'Enter') {
}
}
function onkeyup(e) {
if (e.key == 'Escape') {
e.preventDefault();
document.getElementById('mdnotes').blur();
onsave();
return false;
}
}
function onpaste(e) {
timeoutSave();
let data = e.clipboardData.getData('text/plain');
if (data.match(/ \w+:\/\/.*/i)) {
data = '[](' + data + ')';
e.clipBoard.setData('text/plain', data);
}
}
function oncopy(e) {
alert(e.clipboardData.getData('text/plain'));
}
var _dpwidth = null;
function dpwidth(div) {
if (_dpwidth != null) {
return _dpwidth;
}
let dp = document.createElement('span');
dp.classList.add('tokenfictif');
div.append(dp);
dp.innerText = ':';
_dpwidth = dp.getBoundingClientRect().width;
div.removeChild(dp);
return _dpwidth;
}
function init(pagename = null) {
/*if (pagename != null) {
window.history.replaceState(null, '', '/page/' + pagename);
}*/
let mdnotesdiv = document.getElementById('mdnotes');
dpwidth(mdnotesdiv);
mdnotesdiv.addEventListener('input', onedit);
mdnotesdiv.addEventListener('keyup', onkeyup);
mdnotesdiv.addEventListener('keypress', onkeypress);
mdnotesdiv.addEventListener('keydown', onkeydown);
mdnotesdiv.addEventListener('paste', onpaste);
mdnotesdiv.addEventListener('copy', oncopy);
mdnotesdiv.addEventListener('blur', () => {redrawTables(mdnotesdiv);});
mdnotesdiv.addEventListener('focus', () => {redrawTables(mdnotesdiv, dpwidth());});
let saveButton = document.getElementById('saveButton');
saveButton.addEventListener('click', onsave);
taButton.addEventListener('click', ontextarea);
onload();
}
export { init };