summaryrefslogtreecommitdiff
path: root/resources/js/writing_create.js
diff options
context:
space:
mode:
Diffstat (limited to 'resources/js/writing_create.js')
-rw-r--r--resources/js/writing_create.js67
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);
+}