(function () { if (window.DokuWikiProsemirrorFileStatePolyfill) return; function mergeAttrsFromHiddenJson(state, input, ownAttrs) { if (!input || !state || !state.doc) return null; const json = state.doc.toJSON(); let existingAttrs = {}; if (input.value) { try { const existingJson = JSON.parse(input.value); if (existingJson && typeof existingJson === 'object' && existingJson.attrs && typeof existingJson.attrs === 'object') { existingAttrs = existingJson.attrs; } } catch (e) { // Ignore invalid JSON and rebuild from the current editor state. } } json.attrs = { ...(json.attrs || {}), ...existingAttrs, ...(ownAttrs || {}) }; input.value = JSON.stringify(json); return json; } function makeBurstScheduler(callback) { let scheduled = false; function runOnce() { if (scheduled) return; scheduled = true; window.requestAnimationFrame(() => { scheduled = false; callback(); }); } return function scheduleBurst() { runOnce(); window.setTimeout(runOnce, 0); window.setTimeout(runOnce, 100); window.setTimeout(runOnce, 300); }; } function bindCommonEditorLifecycle(options) { const onSwitchToText = options && options.onSwitchToText ? options.onSwitchToText : function () {}; const onSubmit = options && options.onSubmit ? options.onSubmit : function () {}; const onEditorToggle = options && options.onEditorToggle ? options.onEditorToggle : function () {}; const onAfterSwitch = options && options.onAfterSwitch ? options.onAfterSwitch : function () {}; document.addEventListener('mousedown', (event) => { const target = event.target instanceof Element ? event.target : null; if (!target || !target.closest('.plugin_prosemirror_useWYSIWYG')) return; onSwitchToText(); }, true); document.addEventListener('click', (event) => { const target = event.target instanceof Element ? event.target : null; if (!target) return; if (target.closest('.plugin_prosemirror_useWYSIWYG')) { onEditorToggle(); } const submitControl = target.closest('#dw__editform button[type="submit"], #dw__editform input[type="submit"]'); if (!submitControl) return; onSubmit(); }, true); document.addEventListener('submit', (event) => { const form = event.target instanceof HTMLFormElement ? event.target : null; if (!form || form.id !== 'dw__editform') return; onSubmit(); }, true); jQuery(window).on('fastwiki:afterSwitch', function () { onAfterSwitch(); }); } function addPolyfillScript(eventData, pluginBase) { if (empty(eventData) || !Array.isArray(eventData.script)) return; const src = DOKU_BASE + 'lib/plugins/' + pluginBase + '/script/prosemirror_file_state_polyfill.js'; eventData.script.push({ type: 'text/javascript', src: src, _data: '', defer: 'defer' }); } function empty(value) { return value === null || typeof value === 'undefined'; } window.DokuWikiProsemirrorFileStatePolyfill = { addPolyfillScript: addPolyfillScript, bindCommonEditorLifecycle: bindCommonEditorLifecycle, makeBurstScheduler: makeBurstScheduler, mergeAttrsFromHiddenJson: mergeAttrsFromHiddenJson }; })();