summaryrefslogtreecommitdiff
path: root/resources/js/writing_create.js
blob: 9a036b18b82070a03e4ee5237ad5f58c3131d439 (plain)
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
import { marked } from 'marked';

const dom = {};
const editorHistory = [];

document.addEventListener('DOMContentLoaded', () => {
    if (typeof marked === 'undefined') {
        console.error("marked lib not loaded");
        return;
    }

    initDOM();

    marked.use({ breaks: true });

    // Restore autosaved draft
    const restoredContent = localStorage.getItem('writing_draft_content');
    if (restoredContent !== null) {
        const expiration = parseInt(localStorage.getItem('writing_draft_expiration') || '0');
        if (expiration < Date.now()) {
            localStorage.removeItem('writing_draft_content');
            localStorage.removeItem('writing_draft_expiration');
        } else {
            dom.inputText.value = restoredContent;
            dom.contentPreview.innerHTML = marked.parse(dom.inputText.value);
        }
    }

    // Periodically save contents to localStorage to prevent data loss
    setInterval(() => {
        localStorage.setItem('writing_draft_content', dom.inputText.value);
        localStorage.setItem('writing_draft_expiration', String(Date.now() + 1000 * 3600 * 96));
    }, 5000);

    // Clear draft on successful submit
    document.getElementById('writing-form')?.addEventListener('submit', () => {
        localStorage.removeItem('writing_draft_content');
        localStorage.removeItem('writing_draft_expiration');
    });
});

function initDOM() {
    dom.inputText       = document.getElementById('input_content');
    dom.contentPreview  = document.getElementById('content_preview');
    dom.findStr         = document.getElementById('input_findstr');
    dom.replaceStr      = document.getElementById('input_replacestr');
    dom.btnReplace      = document.getElementById('button_replace');
    dom.btnUndo         = document.getElementById('button_undo');
    dom.toggleMultiline = document.getElementById('input_multiline');

    dom.btnReplace.addEventListener('click', performReplace);
    dom.btnUndo.addEventListener('click', () => {
        if (editorHistory.length > 0) {
            dom.inputText.value = editorHistory.pop();
            dom.contentPreview.innerHTML = marked.parse(dom.inputText.value);
        }
    });
    dom.inputText.addEventListener('input', () => {
        dom.contentPreview.innerHTML = marked.parse(dom.inputText.value);
    });
}

function performReplace() {
    editorHistory.push(dom.inputText.value);

    const flags = dom.toggleMultiline.checked ? 'gm' : 'g';
    const regex = new RegExp(dom.findStr.value, flags);
    dom.inputText.value = dom.inputText.value.replace(regex, dom.replaceStr.value);
    dom.contentPreview.innerHTML = marked.parse(dom.inputText.value);
}