diff options
author | Hsieh Chin Fan <pham@topo.tw> | 2024-10-28 12:23:25 +0800 |
---|---|---|
committer | Hsieh Chin Fan <pham@topo.tw> | 2024-10-28 19:44:05 +0800 |
commit | 6d8400e11ac5ebb05b43a12367384e686f834d7c (patch) | |
tree | b82e4d38d71921943dcb9882ee4333d0d0cb94c9 /src/MenuItem.mjs | |
parent | 65680175fc04e71b362458745727974af73f711c (diff) |
feat: add menu-item for edit map without editor
Diffstat (limited to 'src/MenuItem.mjs')
-rw-r--r-- | src/MenuItem.mjs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/MenuItem.mjs b/src/MenuItem.mjs index d9645f7..eb683ea 100644 --- a/src/MenuItem.mjs +++ b/src/MenuItem.mjs | |||
@@ -523,3 +523,36 @@ export const addMarker = ({ | |||
523 | callback?.(marker) | 523 | callback?.(marker) |
524 | }, | 524 | }, |
525 | }) | 525 | }) |
526 | |||
527 | /** | ||
528 | * editByRawText. | ||
529 | * | ||
530 | * @param {HTMLElement} ele | ||
531 | */ | ||
532 | export const editMapByRawText = (ele) => new Item({ | ||
533 | text: 'Edit by Raw Text', | ||
534 | onclick: () => { | ||
535 | const maps = Array.from(ele.querySelectorAll('.mapclay')) | ||
536 | if (!maps) return false | ||
537 | |||
538 | const rect = ele.getBoundingClientRect() | ||
539 | const textArea = document.createElement('textarea') | ||
540 | textArea.className = 'edit-map' | ||
541 | textArea.style.cssText = `width: ${rect.width}px; height: ${rect.height}px;` | ||
542 | textArea.value = maps.map(map => map.dataset.mapclay ?? '') | ||
543 | .join('---') | ||
544 | .replaceAll(',', '\n') | ||
545 | .replaceAll(/["{}]/g, '') | ||
546 | .replaceAll(/:(\w)/g, ': $1') | ||
547 | |||
548 | textArea.addEventListener('focusout', () => { | ||
549 | const code = document.createElement('code') | ||
550 | code.className = 'map' | ||
551 | code.textContent = textArea.value | ||
552 | textArea.replaceWith(code) | ||
553 | }) | ||
554 | ele.replaceChildren(textArea) | ||
555 | |||
556 | return true | ||
557 | }, | ||
558 | }) | ||