diff options
| author | Hsieh Chin Fan <pham@topo.tw> | 2024-10-06 20:05:19 +0800 |
|---|---|---|
| committer | Hsieh Chin Fan <pham@topo.tw> | 2024-10-07 16:15:56 +0800 |
| commit | ee7f8fa6c770e6063a0dcedcaadd0e9635b0298e (patch) | |
| tree | a06e683a3a0f1a8e61c93affe5a61007f7f59877 | |
| parent | 31cc063c23df57832779b004a22d85cd6cf5caf0 (diff) | |
feat: use dumbymap.utils to expose contenxtmenu
| -rw-r--r-- | src/dumbymap.mjs | 7 | ||||
| -rw-r--r-- | src/editor.mjs | 36 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/dumbymap.mjs b/src/dumbymap.mjs index a31274e..dde0b00 100644 --- a/src/dumbymap.mjs +++ b/src/dumbymap.mjs | |||
| @@ -135,6 +135,13 @@ export const generateMaps = (container, { delay } = {}) => { | |||
| 135 | Array.from( | 135 | Array.from( |
| 136 | container.querySelectorAll('.mapclay[data-render=fulfilled]') | 136 | container.querySelectorAll('.mapclay[data-render=fulfilled]') |
| 137 | ).sort((a, b) => a.style.order > b.style.order), | 137 | ).sort((a, b) => a.style.order > b.style.order), |
| 138 | setContextMenu: (menuCallback) => { | ||
| 139 | const originalCallback = container.oncontextmenu | ||
| 140 | container.oncontextmenu = (e) => { | ||
| 141 | const menu = originalCallback(e) | ||
| 142 | menuCallback(e, menu) | ||
| 143 | } | ||
| 144 | }, | ||
| 138 | focusNextMap: throttle(utils.focusNextMap, utils.focusDelay), | 145 | focusNextMap: throttle(utils.focusNextMap, utils.focusDelay), |
| 139 | switchToNextLayout: throttle(utils.switchToNextLayout, 300) | 146 | switchToNextLayout: throttle(utils.switchToNextLayout, 300) |
| 140 | } | 147 | } |
diff --git a/src/editor.mjs b/src/editor.mjs index 46d91af..1b31535 100644 --- a/src/editor.mjs +++ b/src/editor.mjs | |||
| @@ -12,6 +12,7 @@ const context = document.querySelector('[data-mode]') | |||
| 12 | const dumbyContainer = document.querySelector('.DumbyMap') | 12 | const dumbyContainer = document.querySelector('.DumbyMap') |
| 13 | const textArea = document.querySelector('.editor textarea') | 13 | const textArea = document.querySelector('.editor textarea') |
| 14 | let dumbymap | 14 | let dumbymap |
| 15 | let refLinks = [] | ||
| 15 | 16 | ||
| 16 | /** | 17 | /** |
| 17 | * Watch for changes of editing mode | 18 | * Watch for changes of editing mode |
| @@ -191,6 +192,17 @@ const editor = new EasyMDE({ | |||
| 191 | 192 | ||
| 192 | const cm = editor.codemirror | 193 | const cm = editor.codemirror |
| 193 | 194 | ||
| 195 | |||
| 196 | const getRefLinks = () => editor.value() | ||
| 197 | .split('\n') | ||
| 198 | .map(line => { | ||
| 199 | const [, ref, link] = line.match(/\[([^\[\]]+)\]:\s+(.+)/) ?? [] | ||
| 200 | return { ref, link } | ||
| 201 | }) | ||
| 202 | .filter(({ ref, link }) => ref && link) | ||
| 203 | |||
| 204 | refLinks = getRefLinks() | ||
| 205 | |||
| 194 | /** | 206 | /** |
| 195 | * get state of website from hash string | 207 | * get state of website from hash string |
| 196 | * | 208 | * |
| @@ -385,6 +397,26 @@ const completeForCodeBlock = change => { | |||
| 385 | // })() | 397 | // })() |
| 386 | 398 | ||
| 387 | /** | 399 | /** |
| 400 | * menuForEditor. | ||
| 401 | * | ||
| 402 | * @param {Event} event -- Event for context menu | ||
| 403 | * @param {HTMLElement} menu -- menu of dumbymap | ||
| 404 | */ | ||
| 405 | const menuForEditor = (event, menu) => { | ||
| 406 | if (context.dataset.mode !== 'editing') { | ||
| 407 | const switchToEditingMode = new Item({ | ||
| 408 | innerHTML: '<strong>EDIT</strong>', | ||
| 409 | onclick: () => context.dataset.mode = 'editing' | ||
| 410 | }) | ||
| 411 | menu.appendChild(switchToEditingMode) | ||
| 412 | } | ||
| 413 | |||
| 414 | // Prevent menu appears outside of window | ||
| 415 | menu.style.transform = '' | ||
| 416 | shiftByWindow(menu) | ||
| 417 | } | ||
| 418 | |||
| 419 | /** | ||
| 388 | * update content of HTML about Dumbymap | 420 | * update content of HTML about Dumbymap |
| 389 | */ | 421 | */ |
| 390 | const updateDumbyMap = () => { | 422 | const updateDumbyMap = () => { |
| @@ -411,6 +443,8 @@ const updateDumbyMap = () => { | |||
| 411 | menu.style.transform = '' | 443 | menu.style.transform = '' |
| 412 | shiftByWindow(menu) | 444 | shiftByWindow(menu) |
| 413 | } | 445 | } |
| 446 | // Set oncontextmenu callback | ||
| 447 | dumbymap.utils.setContextMenu(menuForEditor) | ||
| 414 | } | 448 | } |
| 415 | updateDumbyMap() | 449 | updateDumbyMap() |
| 416 | 450 | ||
| @@ -782,6 +816,8 @@ cm.on('cursorActivity', _ => { | |||
| 782 | } | 816 | } |
| 783 | }) | 817 | }) |
| 784 | cm.on('blur', () => { | 818 | cm.on('blur', () => { |
| 819 | refLinks = getRefLinks() | ||
| 820 | |||
| 785 | if (menu.checkVisibility()) { | 821 | if (menu.checkVisibility()) { |
| 786 | cm.focus() | 822 | cm.focus() |
| 787 | } else { | 823 | } else { |