diff --git a/shaarli-pro/editlink.html b/shaarli-pro/editlink.html index 51db5ae..9ce3d7e 100644 --- a/shaarli-pro/editlink.html +++ b/shaarli-pro/editlink.html @@ -54,13 +54,15 @@
+
-
+
+
{if="$formatter==='markdown'"}
@@ -70,12 +72,13 @@
-
+
+
@@ -121,7 +124,7 @@
{if="empty($batch_mode)"} {include="page.footer"} -{if="$link_is_new && $async_metadata"}{/if} +{if="$link_is_new && $async_metadata"}{/if} {/if} diff --git a/shaarli-pro/js/metadata.min.js b/shaarli-pro/js/metadata.min.js new file mode 100644 index 0000000..befde7f --- /dev/null +++ b/shaarli-pro/js/metadata.min.js @@ -0,0 +1,62 @@ +(function () { + var loaded = false; + var tried = {}; + + function toAbsolute(url) { + try { + return new URL(url, window.location.href).toString(); + } catch (e) { + return url; + } + } + + function loadNext(candidates, index) { + if (loaded || index >= candidates.length) { + return; + } + + var src = toAbsolute(candidates[index]); + if (tried[src]) { + loadNext(candidates, index + 1); + return; + } + tried[src] = true; + + var script = document.createElement('script'); + script.src = src; + script.async = false; + script.onload = function () { + loaded = true; + }; + script.onerror = function () { + script.remove(); + loadNext(candidates, index + 1); + }; + document.head.appendChild(script); + } + + var rootPath = (window.shaarli && window.shaarli.rootPath) || ''; + var basePath = (window.shaarli && window.shaarli.basePath) || ''; + var assetPath = (window.shaarli && window.shaarli.assetPath) || ''; + + var candidates = []; + + if (assetPath) { + candidates.push(assetPath.replace(/\/tpl\/shaarli-pro\/?$/, '/tpl/default') + '/js/metadata.min.js'); + } + + if (basePath) { + candidates.push(basePath + '/tpl/default/js/metadata.min.js'); + candidates.push(basePath + '/js/metadata.min.js'); + } + + if (rootPath) { + candidates.push(rootPath + '/tpl/default/js/metadata.min.js'); + candidates.push(rootPath + '/js/metadata.min.js'); + } + + candidates.push('/js/metadata.min.js'); + candidates.push('/tpl/default/js/metadata.min.js'); + + loadNext(candidates, 0); +})(); diff --git a/shaarli-pro/js/script.js b/shaarli-pro/js/script.js index 9f48252..fa5dddf 100644 --- a/shaarli-pro/js/script.js +++ b/shaarli-pro/js/script.js @@ -1177,6 +1177,7 @@ document.addEventListener('DOMContentLoaded', () => { // Markdown editor if (descriptionSource && editorMount && window.toastui && window.toastui.Editor) { const previewStyle = window.innerWidth < 992 ? 'tab' : 'vertical'; + let sourceSyncTimer = null; const markdownEditor = new window.toastui.Editor({ el: editorMount, @@ -1189,7 +1190,26 @@ document.addEventListener('DOMContentLoaded', () => { usageStatistics: false, }); + // Shaarli metadata script updates the textarea value asynchronously. + // Mirror that value into Toast UI only if the editor is still empty. + sourceSyncTimer = window.setInterval(() => { + const sourceValue = (descriptionSource.value || '').trim(); + if (!sourceValue) return; + + const editorValue = (markdownEditor.getMarkdown() || '').trim(); + if (!editorValue) { + markdownEditor.setMarkdown(descriptionSource.value || '', false); + } + + window.clearInterval(sourceSyncTimer); + sourceSyncTimer = null; + }, 250); + form.addEventListener('submit', () => { + if (sourceSyncTimer) { + window.clearInterval(sourceSyncTimer); + sourceSyncTimer = null; + } descriptionSource.value = markdownEditor.getMarkdown(); }); } else if (editorMount) { diff --git a/shaarli-pro/page.footer.html b/shaarli-pro/page.footer.html index 1d334ca..e2e5009 100644 --- a/shaarli-pro/page.footer.html +++ b/shaarli-pro/page.footer.html @@ -43,6 +43,8 @@ }); {/if} + +