diff options
Diffstat (limited to 'resources/js/writing_create.js')
| -rw-r--r-- | resources/js/writing_create.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/resources/js/writing_create.js b/resources/js/writing_create.js new file mode 100644 index 0000000..cd44a66 --- /dev/null +++ b/resources/js/writing_create.js @@ -0,0 +1,67 @@ +import $ from 'jquery'; +import { marked } from 'marked'; + +marked.use({ breaks: true }); + +const dom = {}; +const editorHistory = []; + +$(document).ready(() => { + initDOM(); + + dom.inputText.addEventListener('input', () => { + dom.contentPreview.innerHTML = marked.parse(dom.inputText.value); + }); + + // 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); + } + }); +} + +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); +} |
