aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/MenuItem.mjs39
-rw-r--r--src/css/index.css5
-rw-r--r--src/editor.mjs33
3 files changed, 49 insertions, 28 deletions
diff --git a/src/MenuItem.mjs b/src/MenuItem.mjs
index 50afdb5..1b04d1c 100644
--- a/src/MenuItem.mjs
+++ b/src/MenuItem.mjs
@@ -1,3 +1,39 @@
1import { createGeoLink } from './dumbymap'
2
3export class GeoLink {
4
5 constructor({ range }) {
6 this.range = range
7 }
8
9 createElement = () => {
10 const element = document.createElement('div')
11 element.className = 'menu-item-add-geolink'
12 element.innerText = "Add GeoLink"
13 element.onclick = this.addGeoLinkbyRange
14
15 return element
16 }
17
18 addGeoLinkbyRange = () => {
19 const range = this.range
20 const content = range.toString()
21 // FIXME Apply geolink only on matching sub-range
22 const match = content.match(/(^\D*[\d.]+)\D+([\d.]+)\D*$/)
23 if (!match) return false
24
25 const [x, y] = match.slice(1)
26 const anchor = document.createElement('a')
27 anchor.textContent = content
28 // FIXME apply WGS84
29 anchor.href = `geo:${y},${x}?xy=${x},${y}`
30
31 if (createGeoLink(anchor)) {
32 range.deleteContents()
33 range.insertNode(anchor)
34 }
35 }
36}
1export class Suggestion { 37export class Suggestion {
2 constructor({ text, replace }) { 38 constructor({ text, replace }) {
3 this.text = text 39 this.text = text
@@ -13,7 +49,8 @@ export class Suggestion {
13 } 49 }
14 option.classList.add('container__suggestion'); 50 option.classList.add('container__suggestion');
15 option.onmouseover = () => { 51 option.onmouseover = () => {
16 Array.from(menu.children).forEach(s => s.classList.remove('focus')) 52 Array.from(option.parentElement?.children ?? [])
53 .forEach(s => s.classList.remove('focus'))
17 option.classList.add('focus') 54 option.classList.add('focus')
18 } 55 }
19 option.onmouseout = () => { 56 option.onmouseout = () => {
diff --git a/src/css/index.css b/src/css/index.css
index 4737535..e4d29da 100644
--- a/src/css/index.css
+++ b/src/css/index.css
@@ -163,3 +163,8 @@ body {
163 } 163 }
164 } 164 }
165} 165}
166
167.menu-item-add-geolink {
168 padding: 0.5rem;
169 cursor: pointer;
170}
diff --git a/src/editor.mjs b/src/editor.mjs
index 32929ea..297d75a 100644
--- a/src/editor.mjs
+++ b/src/editor.mjs
@@ -1,8 +1,8 @@
1/*global EasyMDE*/ 1/*global EasyMDE*/
2/*eslint no-undef: "error"*/ 2/*eslint no-undef: "error"*/
3import { markdown2HTML, generateMaps, createGeoLink } from './dumbymap' 3import { markdown2HTML, generateMaps } from './dumbymap'
4import { defaultAliases, parseConfigsFromYaml } from 'mapclay' 4import { defaultAliases, parseConfigsFromYaml } from 'mapclay'
5import { Suggestion } from './MenuItem' 5import { GeoLink, Suggestion } from './MenuItem'
6 6
7// Set up Containers {{{ 7// Set up Containers {{{
8 8
@@ -157,7 +157,7 @@ const debounceForMap = (() => {
157 let timer = null; 157 let timer = null;
158 158
159 return function(...args) { 159 return function(...args) {
160 dumbymap = generateMaps.apply(this, args) 160 dumbymap = generateMaps.apply(this, args)
161 // clearTimeout(timer); 161 // clearTimeout(timer);
162 // timer = setTimeout(() => { 162 // timer = setTimeout(() => {
163 // dumbymap = generateMaps.apply(this, args) 163 // dumbymap = generateMaps.apply(this, args)
@@ -576,36 +576,15 @@ layoutObserver.observe(HtmlContainer, {
576}); 576});
577// }}} 577// }}}
578// ContextMenu {{{ 578// ContextMenu {{{
579const addGeoLinkbyRange = (range) => {
580 const content = range.toString()
581 const match = content.match(/(^\D*[\d\.]+)\D+([\d\.]+)\D*$/)
582 // TODO add more suggestion
583 if (!match) return false
584
585 const [x, y] = match.slice(1)
586 const anchor = document.createElement('a')
587 anchor.textContent = content
588 // FIXME apply WGS84
589 anchor.href = `geo:${y},${x}?xy=${x},${y}`
590
591 if (createGeoLink(anchor)) {
592 range.deleteContents()
593 range.insertNode(anchor)
594 }
595
596}
597document.oncontextmenu = (e) => { 579document.oncontextmenu = (e) => {
598 const selection = document.getSelection() 580 const selection = document.getSelection()
599 const range = selection.getRangeAt(0) 581 const range = selection.getRangeAt(0)
600 if (!cm.hasFocus() && selection) { 582 if (!cm.hasFocus() && selection) {
601 e.preventDefault() 583 e.preventDefault()
602 menu.innerHTML = '' 584 menu.innerHTML = ''
603 menu.style.cssText = `display: block; left: ${e.clientX + 10}px; top: ${e.clientY + 5}px; width: 100px; height: 100px;` 585 menu.style.cssText = `display: block; left: ${e.clientX + 10}px; top: ${e.clientY + 5}px;`
604 menu.innerHTML = '<div style="cursor: pointer;">Create Geo-Link</div>' 586 const addGeoLink = new GeoLink({ range })
605 menu.firstChild.onclick = () => { 587 menu.appendChild(addGeoLink.createElement())
606 // menu.style.display = 'none'
607 addGeoLinkbyRange(range)
608 }
609 } 588 }
610} 589}
611 590