diff --git a/package.json b/package.json index 5947d79..428b3f7 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,7 @@ "type": "module", "dependencies": { "@icelab/defo": "^0.0.3", - "hanami-assets": "^2.1.0-rc.3", - "tiny-markdown-editor": "^0.1.8" + "hanami-assets": "^2.1.0-rc.3" }, "devDependencies": { "@tailwindcss/typography": "^0.5.8", diff --git a/public/assets/admin/app.js b/public/assets/admin/app.js index 4542924..6262847 100644 --- a/public/assets/admin/app.js +++ b/public/assets/admin/app.js @@ -1,3176 +1,10 @@ (() => { - var __create = Object.create; - var __defProp = Object.defineProperty; - var __getOwnPropDesc = Object.getOwnPropertyDescriptor; - var __getOwnPropNames = Object.getOwnPropertyNames; - var __getProtoOf = Object.getPrototypeOf; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - }; - var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; - }; - var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod - )); - - // node_modules/tiny-markdown-editor/lib/svg/svg.js - var require_svg = __commonJS({ - "node_modules/tiny-markdown-editor/lib/svg/svg.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = void 0; - var svg = { - blockquote: ``, - bold: ``, - clear_formatting: ``, - code: ``, - h1: ``, - h2: ``, - hr: ``, - image: ``, - italic: ``, - link: ``, - ol: ``, - strikethrough: ``, - ul: `` - }; - var _default = exports.default = svg; - } - }); - - // node_modules/tiny-markdown-editor/lib/TinyMDECommandBar.js - var require_TinyMDECommandBar = __commonJS({ - "node_modules/tiny-markdown-editor/lib/TinyMDECommandBar.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = void 0; - var _svg = _interopRequireDefault(require_svg()); - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - var isMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform); - var DefaultCommands = { - "bold": { - name: "bold", - action: "bold", - innerHTML: _svg.default.bold, - title: "Bold", - hotkey: "Mod-B" - }, - "italic": { - name: "italic", - action: "italic", - innerHTML: _svg.default.italic, - title: "Italic", - hotkey: "Mod-I" - }, - "strikethrough": { - name: "strikethrough", - action: "strikethrough", - innerHTML: _svg.default.strikethrough, - title: "Strikethrough", - hotkey: "Mod2-Shift-5" - }, - "code": { - name: "code", - action: "code", - innerHTML: _svg.default.code, - title: "Format as code" - }, - "h1": { - name: "h1", - action: "h1", - innerHTML: _svg.default.h1, - title: "Level 1 heading", - hotkey: "Mod-Shift-1" - }, - "h2": { - name: "h2", - action: "h2", - innerHTML: _svg.default.h2, - title: "Level 2 heading", - hotkey: "Mod-Shift-2" - }, - "ul": { - name: "ul", - action: "ul", - innerHTML: _svg.default.ul, - title: "Bulleted list" - }, - "ol": { - name: "ol", - action: "ol", - innerHTML: _svg.default.ol, - title: "Numbered list" - }, - "blockquote": { - name: "blockquote", - action: "blockquote", - innerHTML: _svg.default.blockquote, - title: "Quote", - hotkey: "Mod2-Shift-Q" - }, - "insertLink": { - name: "insertLink", - action: (editor) => { - if (editor.isInlineFormattingAllowed()) - editor.wrapSelection("[", "]()"); - }, - enabled: (editor, focus, anchor) => editor.isInlineFormattingAllowed(focus, anchor) ? false : null, - innerHTML: _svg.default.link, - title: "Insert link", - hotkey: "Mod-K" - }, - "insertImage": { - name: "insertImage", - action: (editor) => { - if (editor.isInlineFormattingAllowed()) - editor.wrapSelection("![", "]()"); - }, - enabled: (editor, focus, anchor) => editor.isInlineFormattingAllowed(focus, anchor) ? false : null, - innerHTML: _svg.default.image, - title: "Insert image", - hotkey: "Mod2-Shift-I" - }, - "hr": { - name: "hr", - action: (editor) => editor.paste("\n***\n"), - enabled: () => false, - innerHTML: _svg.default.hr, - title: "Insert horizontal line", - hotkey: "Mod2-Shift-L" - } - }; - var CommandBar = class { - constructor(props) { - this.e = null; - this.editor = null; - this.commands = []; - this.buttons = {}; - this.state = {}; - this.hotkeys = []; - let element = props.element; - if (element && !element.tagName) { - element = document.getElementById(props.element); - } - if (!element) { - element = document.body; - } - this.createCommandBarElement(element, props.commands || ["bold", "italic", "strikethrough", "|", "code", "|", "h1", "h2", "|", "ul", "ol", "|", "blockquote", "hr", "|", "insertLink", "insertImage"]); - document.addEventListener("keydown", (e) => this.handleKeydown(e)); - if (props.editor) - this.setEditor(props.editor); - } - createCommandBarElement(parentElement, commands) { - this.e = document.createElement("div"); - this.e.className = "TMCommandBar"; - for (let command of commands) { - if (command == "|") { - let el = document.createElement("div"); - el.className = "TMCommandDivider"; - this.e.appendChild(el); - } else { - let commandName; - if (typeof command == "string") { - if (DefaultCommands[command]) { - commandName = command; - this.commands[commandName] = DefaultCommands[commandName]; - } else { - continue; - } - } else if (typeof command == "object" && command.name) { - commandName = command.name; - this.commands[commandName] = {}; - if (DefaultCommands[commandName]) - Object.assign(this.commands[commandName], DefaultCommands[commandName]); - Object.assign(this.commands[commandName], command); - } else { - continue; - } - let title = this.commands[commandName].title || commandName; - if (this.commands[commandName].hotkey) { - const keys = this.commands[commandName].hotkey.split("-"); - let modifiers = []; - let modifierexplanation = []; - for (let i = 0; i < keys.length - 1; i++) { - switch (keys[i]) { - case "Ctrl": - modifiers.push("ctrlKey"); - modifierexplanation.push("Ctrl"); - break; - case "Cmd": - modifiers.push("metaKey"); - modifierexplanation.push("\u2318"); - break; - case "Alt": - modifiers.push("altKey"); - modifierexplanation.push("Alt"); - break; - case "Option": - modifiers.push("altKey"); - modifierexplanation.push("\u2325"); - break; - case "Win": - modifiers.push("metaKey"); - modifierexplanation.push("\u229E Win"); - break; - case "Shift": - modifiers.push("shiftKey"); - modifierexplanation.push("\u21E7"); - break; - case "Mod": - if (isMacLike) { - modifiers.push("metaKey"); - modifierexplanation.push("\u2318"); - } else { - modifiers.push("ctrlKey"); - modifierexplanation.push("Ctrl"); - } - break; - case "Mod2": - modifiers.push("altKey"); - if (isMacLike) - modifierexplanation.push("\u2325"); - else - modifierexplanation.push("Alt"); - break; - } - } - modifierexplanation.push(keys[keys.length - 1]); - let hotkey = { - modifiers, - command: commandName - }; - if (keys[keys.length - 1].match(/^[0-9]$/)) { - hotkey.code = `Digit${keys[keys.length - 1]}`; - } else { - hotkey.key = keys[keys.length - 1].toLowerCase(); - } - this.hotkeys.push(hotkey); - title = title.concat(` (${modifierexplanation.join("+")})`); - } - this.buttons[commandName] = document.createElement("div"); - this.buttons[commandName].className = "TMCommandButton TMCommandButton_Disabled"; - this.buttons[commandName].title = title; - this.buttons[commandName].innerHTML = this.commands[commandName].innerHTML; - this.buttons[commandName].addEventListener("mousedown", (e) => this.handleClick(commandName, e)); - this.e.appendChild(this.buttons[commandName]); - } - } - parentElement.appendChild(this.e); - } - handleClick(commandName, event) { - if (!this.editor) - return; - event.preventDefault(); - if (typeof this.commands[commandName].action == "string") { - if (this.state[commandName] === false) - this.editor.setCommandState(commandName, true); - else - this.editor.setCommandState(commandName, false); - } else if (typeof this.commands[commandName].action == "function") { - this.commands[commandName].action(this.editor); - } - } - setEditor(editor) { - this.editor = editor; - editor.addEventListener("selection", (e) => this.handleSelection(e)); - } - handleSelection(event) { - if (event.commandState) { - for (let command in this.commands) { - if (event.commandState[command] === void 0) { - if (this.commands[command].enabled) - this.state[command] = this.commands[command].enabled(this.editor, event.focus, event.anchor); - else - this.state[command] = event.focus ? false : null; - } else { - this.state[command] = event.commandState[command]; - } - if (this.state[command] === true) { - this.buttons[command].className = "TMCommandButton TMCommandButton_Active"; - } else if (this.state[command] === false) { - this.buttons[command].className = "TMCommandButton TMCommandButton_Inactive"; - } else { - this.buttons[command].className = "TMCommandButton TMCommandButton_Disabled"; - } - } - } - } - handleKeydown(event) { - outer: - for (let hotkey of this.hotkeys) { - if (hotkey.key && event.key.toLowerCase() == hotkey.key || hotkey.code && event.code == hotkey.code) { - for (let modifier of hotkey.modifiers) { - if (!event[modifier]) - continue outer; - } - this.handleClick(hotkey.command, event); - return; - } - } - } - }; - var _default = exports.default = CommandBar; - } - }); - - // node_modules/core-js/internals/global.js - var require_global = __commonJS({ - "node_modules/core-js/internals/global.js"(exports, module) { - "use strict"; - var check = function(it) { - return it && it.Math === Math && it; - }; - module.exports = // eslint-disable-next-line es/no-global-this -- safe - check(typeof globalThis == "object" && globalThis) || check(typeof window == "object" && window) || // eslint-disable-next-line no-restricted-globals -- safe - check(typeof self == "object" && self) || check(typeof global == "object" && global) || check(typeof exports == "object" && exports) || // eslint-disable-next-line no-new-func -- fallback - function() { - return this; - }() || Function("return this")(); - } - }); - - // node_modules/core-js/internals/fails.js - var require_fails = __commonJS({ - "node_modules/core-js/internals/fails.js"(exports, module) { - "use strict"; - module.exports = function(exec) { - try { - return !!exec(); - } catch (error) { - return true; - } - }; - } - }); - - // node_modules/core-js/internals/descriptors.js - var require_descriptors = __commonJS({ - "node_modules/core-js/internals/descriptors.js"(exports, module) { - "use strict"; - var fails = require_fails(); - module.exports = !fails(function() { - return Object.defineProperty({}, 1, { get: function() { - return 7; - } })[1] !== 7; - }); - } - }); - - // node_modules/core-js/internals/function-bind-native.js - var require_function_bind_native = __commonJS({ - "node_modules/core-js/internals/function-bind-native.js"(exports, module) { - "use strict"; - var fails = require_fails(); - module.exports = !fails(function() { - var test = function() { - }.bind(); - return typeof test != "function" || test.hasOwnProperty("prototype"); - }); - } - }); - - // node_modules/core-js/internals/function-uncurry-this.js - var require_function_uncurry_this = __commonJS({ - "node_modules/core-js/internals/function-uncurry-this.js"(exports, module) { - "use strict"; - var NATIVE_BIND = require_function_bind_native(); - var FunctionPrototype = Function.prototype; - var call = FunctionPrototype.call; - var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); - module.exports = NATIVE_BIND ? uncurryThisWithBind : function(fn) { - return function() { - return call.apply(fn, arguments); - }; - }; - } - }); - - // node_modules/core-js/internals/document-all.js - var require_document_all = __commonJS({ - "node_modules/core-js/internals/document-all.js"(exports, module) { - "use strict"; - var documentAll = typeof document == "object" && document.all; - var IS_HTMLDDA = typeof documentAll == "undefined" && documentAll !== void 0; - module.exports = { - all: documentAll, - IS_HTMLDDA - }; - } - }); - - // node_modules/core-js/internals/is-callable.js - var require_is_callable = __commonJS({ - "node_modules/core-js/internals/is-callable.js"(exports, module) { - "use strict"; - var $documentAll = require_document_all(); - var documentAll = $documentAll.all; - module.exports = $documentAll.IS_HTMLDDA ? function(argument) { - return typeof argument == "function" || argument === documentAll; - } : function(argument) { - return typeof argument == "function"; - }; - } - }); - - // node_modules/core-js/internals/is-null-or-undefined.js - var require_is_null_or_undefined = __commonJS({ - "node_modules/core-js/internals/is-null-or-undefined.js"(exports, module) { - "use strict"; - module.exports = function(it) { - return it === null || it === void 0; - }; - } - }); - - // node_modules/core-js/internals/require-object-coercible.js - var require_require_object_coercible = __commonJS({ - "node_modules/core-js/internals/require-object-coercible.js"(exports, module) { - "use strict"; - var isNullOrUndefined = require_is_null_or_undefined(); - var $TypeError = TypeError; - module.exports = function(it) { - if (isNullOrUndefined(it)) - throw new $TypeError("Can't call method on " + it); - return it; - }; - } - }); - - // node_modules/core-js/internals/to-object.js - var require_to_object = __commonJS({ - "node_modules/core-js/internals/to-object.js"(exports, module) { - "use strict"; - var requireObjectCoercible = require_require_object_coercible(); - var $Object = Object; - module.exports = function(argument) { - return $Object(requireObjectCoercible(argument)); - }; - } - }); - - // node_modules/core-js/internals/has-own-property.js - var require_has_own_property = __commonJS({ - "node_modules/core-js/internals/has-own-property.js"(exports, module) { - "use strict"; - var uncurryThis = require_function_uncurry_this(); - var toObject = require_to_object(); - var hasOwnProperty = uncurryThis({}.hasOwnProperty); - module.exports = Object.hasOwn || function hasOwn(it, key) { - return hasOwnProperty(toObject(it), key); - }; - } - }); - - // node_modules/core-js/internals/function-name.js - var require_function_name = __commonJS({ - "node_modules/core-js/internals/function-name.js"(exports, module) { - "use strict"; - var DESCRIPTORS = require_descriptors(); - var hasOwn = require_has_own_property(); - var FunctionPrototype = Function.prototype; - var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; - var EXISTS = hasOwn(FunctionPrototype, "name"); - var PROPER = EXISTS && function something() { - }.name === "something"; - var CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, "name").configurable); - module.exports = { - EXISTS, - PROPER, - CONFIGURABLE - }; - } - }); - - // node_modules/core-js/internals/define-global-property.js - var require_define_global_property = __commonJS({ - "node_modules/core-js/internals/define-global-property.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var defineProperty = Object.defineProperty; - module.exports = function(key, value) { - try { - defineProperty(global2, key, { value, configurable: true, writable: true }); - } catch (error) { - global2[key] = value; - } - return value; - }; - } - }); - - // node_modules/core-js/internals/shared-store.js - var require_shared_store = __commonJS({ - "node_modules/core-js/internals/shared-store.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var defineGlobalProperty = require_define_global_property(); - var SHARED = "__core-js_shared__"; - var store = global2[SHARED] || defineGlobalProperty(SHARED, {}); - module.exports = store; - } - }); - - // node_modules/core-js/internals/inspect-source.js - var require_inspect_source = __commonJS({ - "node_modules/core-js/internals/inspect-source.js"(exports, module) { - "use strict"; - var uncurryThis = require_function_uncurry_this(); - var isCallable = require_is_callable(); - var store = require_shared_store(); - var functionToString = uncurryThis(Function.toString); - if (!isCallable(store.inspectSource)) { - store.inspectSource = function(it) { - return functionToString(it); - }; - } - module.exports = store.inspectSource; - } - }); - - // node_modules/core-js/internals/weak-map-basic-detection.js - var require_weak_map_basic_detection = __commonJS({ - "node_modules/core-js/internals/weak-map-basic-detection.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var isCallable = require_is_callable(); - var WeakMap = global2.WeakMap; - module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); - } - }); - - // node_modules/core-js/internals/is-object.js - var require_is_object = __commonJS({ - "node_modules/core-js/internals/is-object.js"(exports, module) { - "use strict"; - var isCallable = require_is_callable(); - var $documentAll = require_document_all(); - var documentAll = $documentAll.all; - module.exports = $documentAll.IS_HTMLDDA ? function(it) { - return typeof it == "object" ? it !== null : isCallable(it) || it === documentAll; - } : function(it) { - return typeof it == "object" ? it !== null : isCallable(it); - }; - } - }); - - // node_modules/core-js/internals/document-create-element.js - var require_document_create_element = __commonJS({ - "node_modules/core-js/internals/document-create-element.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var isObject = require_is_object(); - var document2 = global2.document; - var EXISTS = isObject(document2) && isObject(document2.createElement); - module.exports = function(it) { - return EXISTS ? document2.createElement(it) : {}; - }; - } - }); - - // node_modules/core-js/internals/ie8-dom-define.js - var require_ie8_dom_define = __commonJS({ - "node_modules/core-js/internals/ie8-dom-define.js"(exports, module) { - "use strict"; - var DESCRIPTORS = require_descriptors(); - var fails = require_fails(); - var createElement = require_document_create_element(); - module.exports = !DESCRIPTORS && !fails(function() { - return Object.defineProperty(createElement("div"), "a", { - get: function() { - return 7; - } - }).a !== 7; - }); - } - }); - - // node_modules/core-js/internals/v8-prototype-define-bug.js - var require_v8_prototype_define_bug = __commonJS({ - "node_modules/core-js/internals/v8-prototype-define-bug.js"(exports, module) { - "use strict"; - var DESCRIPTORS = require_descriptors(); - var fails = require_fails(); - module.exports = DESCRIPTORS && fails(function() { - return Object.defineProperty(function() { - }, "prototype", { - value: 42, - writable: false - }).prototype !== 42; - }); - } - }); - - // node_modules/core-js/internals/an-object.js - var require_an_object = __commonJS({ - "node_modules/core-js/internals/an-object.js"(exports, module) { - "use strict"; - var isObject = require_is_object(); - var $String = String; - var $TypeError = TypeError; - module.exports = function(argument) { - if (isObject(argument)) - return argument; - throw new $TypeError($String(argument) + " is not an object"); - }; - } - }); - - // node_modules/core-js/internals/function-call.js - var require_function_call = __commonJS({ - "node_modules/core-js/internals/function-call.js"(exports, module) { - "use strict"; - var NATIVE_BIND = require_function_bind_native(); - var call = Function.prototype.call; - module.exports = NATIVE_BIND ? call.bind(call) : function() { - return call.apply(call, arguments); - }; - } - }); - - // node_modules/core-js/internals/get-built-in.js - var require_get_built_in = __commonJS({ - "node_modules/core-js/internals/get-built-in.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var isCallable = require_is_callable(); - var aFunction = function(argument) { - return isCallable(argument) ? argument : void 0; - }; - module.exports = function(namespace, method) { - return arguments.length < 2 ? aFunction(global2[namespace]) : global2[namespace] && global2[namespace][method]; - }; - } - }); - - // node_modules/core-js/internals/object-is-prototype-of.js - var require_object_is_prototype_of = __commonJS({ - "node_modules/core-js/internals/object-is-prototype-of.js"(exports, module) { - "use strict"; - var uncurryThis = require_function_uncurry_this(); - module.exports = uncurryThis({}.isPrototypeOf); - } - }); - - // node_modules/core-js/internals/engine-user-agent.js - var require_engine_user_agent = __commonJS({ - "node_modules/core-js/internals/engine-user-agent.js"(exports, module) { - "use strict"; - module.exports = typeof navigator != "undefined" && String(navigator.userAgent) || ""; - } - }); - - // node_modules/core-js/internals/engine-v8-version.js - var require_engine_v8_version = __commonJS({ - "node_modules/core-js/internals/engine-v8-version.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var userAgent = require_engine_user_agent(); - var process = global2.process; - var Deno = global2.Deno; - var versions = process && process.versions || Deno && Deno.version; - var v8 = versions && versions.v8; - var match; - var version; - if (v8) { - match = v8.split("."); - version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); - } - if (!version && userAgent) { - match = userAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = userAgent.match(/Chrome\/(\d+)/); - if (match) - version = +match[1]; - } - } - module.exports = version; - } - }); - - // node_modules/core-js/internals/symbol-constructor-detection.js - var require_symbol_constructor_detection = __commonJS({ - "node_modules/core-js/internals/symbol-constructor-detection.js"(exports, module) { - "use strict"; - var V8_VERSION = require_engine_v8_version(); - var fails = require_fails(); - var global2 = require_global(); - var $String = global2.String; - module.exports = !!Object.getOwnPropertySymbols && !fails(function() { - var symbol = Symbol("symbol detection"); - return !$String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances - !Symbol.sham && V8_VERSION && V8_VERSION < 41; - }); - } - }); - - // node_modules/core-js/internals/use-symbol-as-uid.js - var require_use_symbol_as_uid = __commonJS({ - "node_modules/core-js/internals/use-symbol-as-uid.js"(exports, module) { - "use strict"; - var NATIVE_SYMBOL = require_symbol_constructor_detection(); - module.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == "symbol"; - } - }); - - // node_modules/core-js/internals/is-symbol.js - var require_is_symbol = __commonJS({ - "node_modules/core-js/internals/is-symbol.js"(exports, module) { - "use strict"; - var getBuiltIn = require_get_built_in(); - var isCallable = require_is_callable(); - var isPrototypeOf = require_object_is_prototype_of(); - var USE_SYMBOL_AS_UID = require_use_symbol_as_uid(); - var $Object = Object; - module.exports = USE_SYMBOL_AS_UID ? function(it) { - return typeof it == "symbol"; - } : function(it) { - var $Symbol = getBuiltIn("Symbol"); - return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); - }; - } - }); - - // node_modules/core-js/internals/try-to-string.js - var require_try_to_string = __commonJS({ - "node_modules/core-js/internals/try-to-string.js"(exports, module) { - "use strict"; - var $String = String; - module.exports = function(argument) { - try { - return $String(argument); - } catch (error) { - return "Object"; - } - }; - } - }); - - // node_modules/core-js/internals/a-callable.js - var require_a_callable = __commonJS({ - "node_modules/core-js/internals/a-callable.js"(exports, module) { - "use strict"; - var isCallable = require_is_callable(); - var tryToString = require_try_to_string(); - var $TypeError = TypeError; - module.exports = function(argument) { - if (isCallable(argument)) - return argument; - throw new $TypeError(tryToString(argument) + " is not a function"); - }; - } - }); - - // node_modules/core-js/internals/get-method.js - var require_get_method = __commonJS({ - "node_modules/core-js/internals/get-method.js"(exports, module) { - "use strict"; - var aCallable = require_a_callable(); - var isNullOrUndefined = require_is_null_or_undefined(); - module.exports = function(V, P) { - var func = V[P]; - return isNullOrUndefined(func) ? void 0 : aCallable(func); - }; - } - }); - - // node_modules/core-js/internals/ordinary-to-primitive.js - var require_ordinary_to_primitive = __commonJS({ - "node_modules/core-js/internals/ordinary-to-primitive.js"(exports, module) { - "use strict"; - var call = require_function_call(); - var isCallable = require_is_callable(); - var isObject = require_is_object(); - var $TypeError = TypeError; - module.exports = function(input, pref) { - var fn, val; - if (pref === "string" && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) - return val; - if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) - return val; - if (pref !== "string" && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) - return val; - throw new $TypeError("Can't convert object to primitive value"); - }; - } - }); - - // node_modules/core-js/internals/is-pure.js - var require_is_pure = __commonJS({ - "node_modules/core-js/internals/is-pure.js"(exports, module) { - "use strict"; - module.exports = false; - } - }); - - // node_modules/core-js/internals/shared.js - var require_shared = __commonJS({ - "node_modules/core-js/internals/shared.js"(exports, module) { - "use strict"; - var IS_PURE = require_is_pure(); - var store = require_shared_store(); - (module.exports = function(key, value) { - return store[key] || (store[key] = value !== void 0 ? value : {}); - })("versions", []).push({ - version: "3.33.3", - mode: IS_PURE ? "pure" : "global", - copyright: "\xA9 2014-2023 Denis Pushkarev (zloirock.ru)", - license: "https://github.com/zloirock/core-js/blob/v3.33.3/LICENSE", - source: "https://github.com/zloirock/core-js" - }); - } - }); - - // node_modules/core-js/internals/uid.js - var require_uid = __commonJS({ - "node_modules/core-js/internals/uid.js"(exports, module) { - "use strict"; - var uncurryThis = require_function_uncurry_this(); - var id = 0; - var postfix = Math.random(); - var toString = uncurryThis(1 .toString); - module.exports = function(key) { - return "Symbol(" + (key === void 0 ? "" : key) + ")_" + toString(++id + postfix, 36); - }; - } - }); - - // node_modules/core-js/internals/well-known-symbol.js - var require_well_known_symbol = __commonJS({ - "node_modules/core-js/internals/well-known-symbol.js"(exports, module) { - "use strict"; - var global2 = require_global(); - var shared = require_shared(); - var hasOwn = require_has_own_property(); - var uid = require_uid(); - var NATIVE_SYMBOL = require_symbol_constructor_detection(); - var USE_SYMBOL_AS_UID = require_use_symbol_as_uid(); - var Symbol2 = global2.Symbol; - var WellKnownSymbolsStore = shared("wks"); - var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol2["for"] || Symbol2 : Symbol2 && Symbol2.withoutSetter || uid; - module.exports = function(name) { - if (!hasOwn(WellKnownSymbolsStore, name)) { - WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol2, name) ? Symbol2[name] : createWellKnownSymbol("Symbol." + name); - } - return WellKnownSymbolsStore[name]; - }; - } - }); - - // node_modules/core-js/internals/to-primitive.js - var require_to_primitive = __commonJS({ - "node_modules/core-js/internals/to-primitive.js"(exports, module) { - "use strict"; - var call = require_function_call(); - var isObject = require_is_object(); - var isSymbol = require_is_symbol(); - var getMethod = require_get_method(); - var ordinaryToPrimitive = require_ordinary_to_primitive(); - var wellKnownSymbol = require_well_known_symbol(); - var $TypeError = TypeError; - var TO_PRIMITIVE = wellKnownSymbol("toPrimitive"); - module.exports = function(input, pref) { - if (!isObject(input) || isSymbol(input)) - return input; - var exoticToPrim = getMethod(input, TO_PRIMITIVE); - var result; - if (exoticToPrim) { - if (pref === void 0) - pref = "default"; - result = call(exoticToPrim, input, pref); - if (!isObject(result) || isSymbol(result)) - return result; - throw new $TypeError("Can't convert object to primitive value"); - } - if (pref === void 0) - pref = "number"; - return ordinaryToPrimitive(input, pref); - }; - } - }); - - // node_modules/core-js/internals/to-property-key.js - var require_to_property_key = __commonJS({ - "node_modules/core-js/internals/to-property-key.js"(exports, module) { - "use strict"; - var toPrimitive = require_to_primitive(); - var isSymbol = require_is_symbol(); - module.exports = function(argument) { - var key = toPrimitive(argument, "string"); - return isSymbol(key) ? key : key + ""; - }; - } - }); - - // node_modules/core-js/internals/object-define-property.js - var require_object_define_property = __commonJS({ - "node_modules/core-js/internals/object-define-property.js"(exports) { - "use strict"; - var DESCRIPTORS = require_descriptors(); - var IE8_DOM_DEFINE = require_ie8_dom_define(); - var V8_PROTOTYPE_DEFINE_BUG = require_v8_prototype_define_bug(); - var anObject = require_an_object(); - var toPropertyKey = require_to_property_key(); - var $TypeError = TypeError; - var $defineProperty = Object.defineProperty; - var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - var ENUMERABLE = "enumerable"; - var CONFIGURABLE = "configurable"; - var WRITABLE = "writable"; - exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (typeof O === "function" && P === "prototype" && "value" in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { - var current = $getOwnPropertyDescriptor(O, P); - if (current && current[WRITABLE]) { - O[P] = Attributes.value; - Attributes = { - configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], - enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], - writable: false - }; - } - } - return $defineProperty(O, P, Attributes); - } : $defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (IE8_DOM_DEFINE) - try { - return $defineProperty(O, P, Attributes); - } catch (error) { - } - if ("get" in Attributes || "set" in Attributes) - throw new $TypeError("Accessors not supported"); - if ("value" in Attributes) - O[P] = Attributes.value; - return O; - }; - } - }); - - // node_modules/core-js/internals/create-property-descriptor.js - var require_create_property_descriptor = __commonJS({ - "node_modules/core-js/internals/create-property-descriptor.js"(exports, module) { - "use strict"; - module.exports = function(bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value - }; - }; - } - }); - - // node_modules/core-js/internals/create-non-enumerable-property.js - var require_create_non_enumerable_property = __commonJS({ - "node_modules/core-js/internals/create-non-enumerable-property.js"(exports, module) { - "use strict"; - var DESCRIPTORS = require_descriptors(); - var definePropertyModule = require_object_define_property(); - var createPropertyDescriptor = require_create_property_descriptor(); - module.exports = DESCRIPTORS ? function(object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); - } : function(object, key, value) { - object[key] = value; - return object; - }; - } - }); - - // node_modules/core-js/internals/shared-key.js - var require_shared_key = __commonJS({ - "node_modules/core-js/internals/shared-key.js"(exports, module) { - "use strict"; - var shared = require_shared(); - var uid = require_uid(); - var keys = shared("keys"); - module.exports = function(key) { - return keys[key] || (keys[key] = uid(key)); - }; - } - }); - - // node_modules/core-js/internals/hidden-keys.js - var require_hidden_keys = __commonJS({ - "node_modules/core-js/internals/hidden-keys.js"(exports, module) { - "use strict"; - module.exports = {}; - } - }); - - // node_modules/core-js/internals/internal-state.js - var require_internal_state = __commonJS({ - "node_modules/core-js/internals/internal-state.js"(exports, module) { - "use strict"; - var NATIVE_WEAK_MAP = require_weak_map_basic_detection(); - var global2 = require_global(); - var isObject = require_is_object(); - var createNonEnumerableProperty = require_create_non_enumerable_property(); - var hasOwn = require_has_own_property(); - var shared = require_shared_store(); - var sharedKey = require_shared_key(); - var hiddenKeys = require_hidden_keys(); - var OBJECT_ALREADY_INITIALIZED = "Object already initialized"; - var TypeError2 = global2.TypeError; - var WeakMap = global2.WeakMap; - var set; - var get; - var has; - var enforce = function(it) { - return has(it) ? get(it) : set(it, {}); - }; - var getterFor = function(TYPE) { - return function(it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw new TypeError2("Incompatible receiver, " + TYPE + " required"); - } - return state; - }; - }; - if (NATIVE_WEAK_MAP || shared.state) { - store = shared.state || (shared.state = new WeakMap()); - store.get = store.get; - store.has = store.has; - store.set = store.set; - set = function(it, metadata) { - if (store.has(it)) - throw new TypeError2(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - store.set(it, metadata); - return metadata; - }; - get = function(it) { - return store.get(it) || {}; - }; - has = function(it) { - return store.has(it); - }; - } else { - STATE = sharedKey("state"); - hiddenKeys[STATE] = true; - set = function(it, metadata) { - if (hasOwn(it, STATE)) - throw new TypeError2(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function(it) { - return hasOwn(it, STATE) ? it[STATE] : {}; - }; - has = function(it) { - return hasOwn(it, STATE); - }; - } - var store; - var STATE; - module.exports = { - set, - get, - has, - enforce, - getterFor - }; - } - }); - - // node_modules/core-js/internals/make-built-in.js - var require_make_built_in = __commonJS({ - "node_modules/core-js/internals/make-built-in.js"(exports, module) { - "use strict"; - var uncurryThis = require_function_uncurry_this(); - var fails = require_fails(); - var isCallable = require_is_callable(); - var hasOwn = require_has_own_property(); - var DESCRIPTORS = require_descriptors(); - var CONFIGURABLE_FUNCTION_NAME = require_function_name().CONFIGURABLE; - var inspectSource = require_inspect_source(); - var InternalStateModule = require_internal_state(); - var enforceInternalState = InternalStateModule.enforce; - var getInternalState = InternalStateModule.get; - var $String = String; - var defineProperty = Object.defineProperty; - var stringSlice = uncurryThis("".slice); - var replace = uncurryThis("".replace); - var join = uncurryThis([].join); - var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function() { - return defineProperty(function() { - }, "length", { value: 8 }).length !== 8; - }); - var TEMPLATE = String(String).split("String"); - var makeBuiltIn = module.exports = function(value, name, options) { - if (stringSlice($String(name), 0, 7) === "Symbol(") { - name = "[" + replace($String(name), /^Symbol\(([^)]*)\)/, "$1") + "]"; - } - if (options && options.getter) - name = "get " + name; - if (options && options.setter) - name = "set " + name; - if (!hasOwn(value, "name") || CONFIGURABLE_FUNCTION_NAME && value.name !== name) { - if (DESCRIPTORS) - defineProperty(value, "name", { value: name, configurable: true }); - else - value.name = name; - } - if (CONFIGURABLE_LENGTH && options && hasOwn(options, "arity") && value.length !== options.arity) { - defineProperty(value, "length", { value: options.arity }); - } - try { - if (options && hasOwn(options, "constructor") && options.constructor) { - if (DESCRIPTORS) - defineProperty(value, "prototype", { writable: false }); - } else if (value.prototype) - value.prototype = void 0; - } catch (error) { - } - var state = enforceInternalState(value); - if (!hasOwn(state, "source")) { - state.source = join(TEMPLATE, typeof name == "string" ? name : ""); - } - return value; - }; - Function.prototype.toString = makeBuiltIn(function toString() { - return isCallable(this) && getInternalState(this).source || inspectSource(this); - }, "toString"); - } - }); - - // node_modules/core-js/internals/define-built-in-accessor.js - var require_define_built_in_accessor = __commonJS({ - "node_modules/core-js/internals/define-built-in-accessor.js"(exports, module) { - "use strict"; - var makeBuiltIn = require_make_built_in(); - var defineProperty = require_object_define_property(); - module.exports = function(target, name, descriptor) { - if (descriptor.get) - makeBuiltIn(descriptor.get, name, { getter: true }); - if (descriptor.set) - makeBuiltIn(descriptor.set, name, { setter: true }); - return defineProperty.f(target, name, descriptor); - }; - } - }); - - // node_modules/core-js/internals/regexp-flags.js - var require_regexp_flags = __commonJS({ - "node_modules/core-js/internals/regexp-flags.js"(exports, module) { - "use strict"; - var anObject = require_an_object(); - module.exports = function() { - var that = anObject(this); - var result = ""; - if (that.hasIndices) - result += "d"; - if (that.global) - result += "g"; - if (that.ignoreCase) - result += "i"; - if (that.multiline) - result += "m"; - if (that.dotAll) - result += "s"; - if (that.unicode) - result += "u"; - if (that.unicodeSets) - result += "v"; - if (that.sticky) - result += "y"; - return result; - }; - } - }); - - // node_modules/core-js/modules/es.regexp.flags.js - var require_es_regexp_flags = __commonJS({ - "node_modules/core-js/modules/es.regexp.flags.js"() { - "use strict"; - var global2 = require_global(); - var DESCRIPTORS = require_descriptors(); - var defineBuiltInAccessor = require_define_built_in_accessor(); - var regExpFlags = require_regexp_flags(); - var fails = require_fails(); - var RegExp2 = global2.RegExp; - var RegExpPrototype = RegExp2.prototype; - var FORCED = DESCRIPTORS && fails(function() { - var INDICES_SUPPORT = true; - try { - RegExp2(".", "d"); - } catch (error) { - INDICES_SUPPORT = false; - } - var O = {}; - var calls = ""; - var expected = INDICES_SUPPORT ? "dgimsy" : "gimsy"; - var addGetter = function(key2, chr) { - Object.defineProperty(O, key2, { get: function() { - calls += chr; - return true; - } }); - }; - var pairs = { - dotAll: "s", - global: "g", - ignoreCase: "i", - multiline: "m", - sticky: "y" - }; - if (INDICES_SUPPORT) - pairs.hasIndices = "d"; - for (var key in pairs) - addGetter(key, pairs[key]); - var result = Object.getOwnPropertyDescriptor(RegExpPrototype, "flags").get.call(O); - return result !== expected || calls !== expected; - }); - if (FORCED) - defineBuiltInAccessor(RegExpPrototype, "flags", { - configurable: true, - get: regExpFlags - }); - } - }); - - // node_modules/tiny-markdown-editor/lib/grammar.js - var require_grammar = __commonJS({ - "node_modules/tiny-markdown-editor/lib/grammar.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.htmlBlockGrammar = exports.commands = void 0; - exports.htmlescape = htmlescape; - exports.punctuationTrailing = exports.punctuationLeading = exports.lineGrammar = exports.inlineGrammar = void 0; - require_es_regexp_flags(); - var replacements = { - ASCIIPunctuation: /[!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~\\]/, - NotTriggerChar: /[^`_*[\]()<>!~]/, - Scheme: /[A-Za-z][A-Za-z0-9+.-]{1,31}/, - Email: /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/, - // From CommonMark spec - HTMLOpenTag: //, - HTMLCloseTag: /<\/HTMLTagName\s*>/, - HTMLTagName: /[A-Za-z][A-Za-z0-9-]*/, - HTMLComment: //, - HTMLPI: /<\?(?:|.|(?:[^?]|\?[^>])*)\?>/, - HTMLDeclaration: /]*>/, - HTMLCDATA: //, - HTMLAttribute: /\s+[A-Za-z_:][A-Za-z0-9_.:-]*(?:HTMLAttValue)?/, - HTMLAttValue: /\s*=\s*(?:(?:'[^']*')|(?:"[^"]*")|(?:[^\s"'=<>`]+))/, - KnownTag: /address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul/ - }; - var punctuationLeading = exports.punctuationLeading = new RegExp(/^(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])/); - var punctuationTrailing = exports.punctuationTrailing = new RegExp(/(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])$/); - var lineGrammar = exports.lineGrammar = { - TMH1: { - regexp: /^( {0,3}#\s)(.*?)((?:\s+#+\s*)?)$/, - replacement: '$1$$2$3' - }, - TMH2: { - regexp: /^( {0,3}##\s)(.*?)((?:\s+#+\s*)?)$/, - replacement: '$1$$2$3' - }, - TMH3: { - regexp: /^( {0,3}###\s)(.*?)((?:\s+#+\s*)?)$/, - replacement: '$1$$2$3' - }, - TMH4: { - regexp: /^( {0,3}####\s)(.*?)((?:\s+#+\s*)?)$/, - replacement: '$1$$2$3' - }, - TMH5: { - regexp: /^( {0,3}#####\s)(.*?)((?:\s+#+\s*)?)$/, - replacement: '$1$$2$3' - }, - TMH6: { - regexp: /^( {0,3}######\s)(.*?)((?:\s+#+\s*)?)$/, - replacement: '$1$$2$3' - }, - TMBlockquote: { - regexp: /^( {0,3}>[ ]?)(.*)$/, - replacement: '$1$$2' - }, - TMCodeFenceBacktickOpen: { - regexp: /^( {0,3}(?````*)\s*)([^`]*?)(\s*)$/, - replacement: '$1$3$4' - }, - TMCodeFenceTildeOpen: { - regexp: /^( {0,3}(?~~~~*)\s*)(.*?)(\s*)$/, - replacement: '$1$3$4' - }, - TMCodeFenceBacktickClose: { - regexp: /^( {0,3}(?````*))(\s*)$/, - replacement: '$1$3' - }, - TMCodeFenceTildeClose: { - regexp: /^( {0,3}(?~~~~*))(\s*)$/, - replacement: '$1$3' - }, - TMBlankLine: { - regexp: /^([ \t]*)$/, - replacement: "$0" - }, - TMSetextH1Marker: { - regexp: /^ {0,3}=+\s*$/, - replacement: '$0' - }, - TMSetextH2Marker: { - regexp: /^ {0,3}-+\s*$/, - replacement: '$0' - }, - TMHR: { - regexp: /^( {0,3}(\*[ \t]*\*[ \t]*\*[ \t*]*)|(-[ \t]*-[ \t]*-[ \t-]*)|(_[ \t]*_[ \t]*_[ \t_]*))$/, - replacement: '$0' - }, - TMUL: { - regexp: /^( {0,3}[+*-] {1,4})(.*)$/, - replacement: '$1$$2' - }, - TMOL: { - regexp: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/, - replacement: '$1$$2' - }, - // TODO: This is currently preventing sublists (and any content within list items, really) from working - TMIndentedCode: { - regexp: /^( {4}|\t)(.*)$/, - replacement: '$1$2' - }, - TMLinkReferenceDefinition: { - // TODO: Link destination can't include unbalanced parantheses, but we just ignore that here - regexp: /^( {0,3}\[\s*)([^\s\]](?:[^\]]|\\\])*?)(\s*\]:\s*)((?:[^\s<>]+)|(?:<(?:[^<>\\]|\\.)*>))?(\s*)((?:\((?:[^()\\]|\\.)*\))|(?:"(?:[^"\\]|\\.)*")|(?:'(?:[^'\\]|\\.)*'))?(\s*)$/, - replacement: '$1$2$3$4$5$6$7', - labelPlaceholder: 2 - // this defines which placeholder in the above regex is the link "label" - } - }; - var htmlBlockGrammar = exports.htmlBlockGrammar = [{ - start: /^ {0,3}<(?:script|pre|style)(?:\s|>|$)/i, - end: /(?:<\/script>|<\/pre>|<\/style>)/i, - paraInterrupt: true - }, { - start: /^ {0,3}/, - paraInterrupt: true - }, { - start: /^ {0,3}<\?/, - end: /\?>/, - paraInterrupt: true - }, { - start: /^ {0,3}/, - paraInterrupt: true - }, { - start: /^ {0,3}/, - paraInterrupt: true - }, { - start: /^ {0,3}(?:<|<\/)(?:KnownTag)(?:\s|>|\/>|$)/i, - end: false, - paraInterrupt: true - }, { - start: /^ {0,3}(?:HTMLOpenTag|HTMLCloseTag)\s*$/, - end: false, - paraInterrupt: false - }]; - var inlineGrammar = exports.inlineGrammar = { - escape: { - regexp: /^\\(ASCIIPunctuation)/, - replacement: '\\$1' - }, - code: { - regexp: /^(`+)((?:[^`])|(?:[^`].*?[^`]))(\1)/, - replacement: '$1$2$3' - }, - autolink: { - regexp: /^<((?:Scheme:[^\s<>]*)|(?:Email))>/, - replacement: '<$1>' - }, - html: { - regexp: /^((?:HTMLOpenTag)|(?:HTMLCloseTag)|(?:HTMLComment)|(?:HTMLPI)|(?:HTMLDeclaration)|(?:HTMLCDATA))/, - replacement: '$1' - }, - linkOpen: { - regexp: /^\[/, - replacement: "" - }, - imageOpen: { - regexp: /^!\[/, - replacement: "" - }, - linkLabel: { - regexp: /^(\[\s*)([^\]]*?)(\s*\])/, - replacement: "", - labelPlaceholder: 2 - }, - default: { - regexp: /^(.|(?:NotTriggerChar+))/, - replacement: "$1" - } - }; - var replacementRegexp = new RegExp(Object.keys(replacements).join("|")); - var inlineRules = [...Object.keys(inlineGrammar)]; - for (let rule of inlineRules) { - let re = inlineGrammar[rule].regexp.source; - while (re.match(replacementRegexp)) { - re = re.replace(replacementRegexp, (string) => { - return replacements[string].source; - }); - } - inlineGrammar[rule].regexp = new RegExp(re, inlineGrammar[rule].regexp.flags); - } - for (let rule of htmlBlockGrammar) { - let re = rule.start.source; - while (re.match(replacementRegexp)) { - re = re.replace(replacementRegexp, (string) => { - return replacements[string].source; - }); - } - rule.start = new RegExp(re, rule.start.flags); - } - function htmlescape(string) { - return (string ? string : "").replace(/&/g, "&").replace(//g, ">"); - } - var commands = exports.commands = { - // Replacements for unset for inline commands are '' by default - bold: { - type: "inline", - className: "TMStrong", - set: { - pre: "**", - post: "**" - }, - unset: { - prePattern: /(?:\*\*|__)$/, - postPattern: /^(?:\*\*|__)/ - } - }, - italic: { - type: "inline", - className: "TMEm", - set: { - pre: "*", - post: "*" - }, - unset: { - prePattern: /(?:\*|_)$/, - postPattern: /^(?:\*|_)/ - } - }, - code: { - type: "inline", - className: "TMCode", - set: { - pre: "`", - post: "`" - }, - unset: { - prePattern: /`+$/, - postPattern: /^`+/ - } - // FIXME this doesn't ensure balanced backticks right now - }, - strikethrough: { - type: "inline", - className: "TMStrikethrough", - set: { - pre: "~~", - post: "~~" - }, - unset: { - prePattern: /~~$/, - postPattern: /^~~/ - } - }, - h1: { - type: "line", - className: "TMH1", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "# $2" - }, - unset: { - pattern: /^( {0,3}#\s+)(.*?)((?:\s+#+\s*)?)$/, - replacement: "$2" - } - }, - h2: { - type: "line", - className: "TMH2", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "## $2" - }, - unset: { - pattern: /^( {0,3}##\s+)(.*?)((?:\s+#+\s*)?)$/, - replacement: "$2" - } - }, - h3: { - type: "line", - className: "TMH3", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "### $2" - }, - unset: { - pattern: /^( {0,3}###\s+)(.*?)((?:\s+#+\s*)?)$/, - replacement: "$2" - } - }, - h4: { - type: "line", - className: "TMH4", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "#### $2" - }, - unset: { - pattern: /^( {0,3}####\s+)(.*?)((?:\s+#+\s*)?)$/, - replacement: "$2" - } - }, - h5: { - type: "line", - className: "TMH5", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "##### $2" - }, - unset: { - pattern: /^( {0,3}#####\s+)(.*?)((?:\s+#+\s*)?)$/, - replacement: "$2" - } - }, - h6: { - type: "line", - className: "TMH6", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "###### $2" - }, - unset: { - pattern: /^( {0,3}######\s+)(.*?)((?:\s+#+\s*)?)$/, - replacement: "$2" - } - }, - ul: { - type: "line", - className: "TMUL", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "- $2" - }, - unset: { - pattern: /^( {0,3}[+*-] {1,4})(.*)$/, - replacement: "$2" - } - }, - ol: { - type: "line", - className: "TMOL", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "$#. $2" - }, - unset: { - pattern: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/, - replacement: "$2" - } - }, - blockquote: { - type: "line", - className: "TMBlockquote", - set: { - pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, - replacement: "> $2" - }, - unset: { - pattern: /^( {0,3}>[ ]?)(.*)$/, - replacement: "$2" - } - } - }; - } - }); - - // node_modules/tiny-markdown-editor/lib/TinyMDE.js - var require_TinyMDE = __commonJS({ - "node_modules/tiny-markdown-editor/lib/TinyMDE.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = void 0; - var _grammar = require_grammar(); - var Editor = class { - constructor() { - let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - this.e = null; - this.textarea = null; - this.lines = []; - this.lineElements = []; - this.lineTypes = []; - this.lineCaptures = []; - this.lineReplacements = []; - this.linkLabels = []; - this.lineDirty = []; - this.lastCommandState = null; - this.listeners = { - change: [], - selection: [] - }; - let element = props.element; - this.textarea = props.textarea; - if (this.textarea && !this.textarea.tagName) { - this.textarea = document.getElementById(this.textarea); - if (!element) - element = this.textarea; - } - if (element && !element.tagName) { - element = document.getElementById(props.element); - } - if (!element) { - element = document.getElementsByTagName("body")[0]; - } - if (element.tagName == "TEXTAREA") { - this.textarea = element; - element = this.textarea.parentNode; - } - if (this.textarea) { - this.textarea.style.display = "none"; - } - this.createEditorElement(element); - this.setContent(props.content || (this.textarea ? this.textarea.value : false) || "# Hello TinyMDE!\nEdit **here**"); - } - /** - * Creates the editor element inside the target element of the DOM tree - * @param element The target element of the DOM tree - */ - createEditorElement(element) { - this.e = document.createElement("div"); - this.e.className = "TinyMDE"; - this.e.contentEditable = true; - this.e.style.whiteSpace = "pre-wrap"; - this.e.style.webkitUserModify = "read-write-plaintext-only"; - if (this.textarea && this.textarea.parentNode == element && this.textarea.nextSibling) { - element.insertBefore(this.e, this.textarea.nextSibling); - } else { - element.appendChild(this.e); - } - this.e.addEventListener("input", (e) => this.handleInputEvent(e)); - document.addEventListener("selectionchange", (e) => this.handleSelectionChangeEvent(e)); - this.e.addEventListener("paste", (e) => this.handlePaste(e)); - this.lineElements = this.e.childNodes; - } - /** - * Sets the editor content. - * @param {string} content The new Markdown content - */ - setContent(content) { - while (this.e.firstChild) { - this.e.removeChild(this.e.firstChild); - } - this.lines = content.split(/(?:\r\n|\r|\n)/); - this.lineDirty = []; - for (let lineNum = 0; lineNum < this.lines.length; lineNum++) { - let le = document.createElement("div"); - this.e.appendChild(le); - this.lineDirty.push(true); - } - this.lineTypes = new Array(this.lines.length); - this.updateFormatting(); - this.fireChange(); - } - /** - * Gets the editor content as a Markdown string. - * @returns {string} The editor content as a markdown string - */ - getContent() { - return this.lines.join("\n"); - } - /** - * This is the main method to update the formatting (from this.lines to HTML output) - */ - updateFormatting() { - this.updateLineTypes(); - this.updateLinkLabels(); - this.applyLineTypes(); - } - /** - * Updates this.linkLabels: For every link reference definition (line type TMLinkReferenceDefinition), we collect the label - */ - updateLinkLabels() { - this.linkLabels = []; - for (let l = 0; l < this.lines.length; l++) { - if (this.lineTypes[l] == "TMLinkReferenceDefinition") { - this.linkLabels.push(this.lineCaptures[l][_grammar.lineGrammar.TMLinkReferenceDefinition.labelPlaceholder]); - } - } - } - /** - * Helper function to replace placeholders from a RegExp capture. The replacement string can contain regular dollar placeholders (e.g., $1), - * which are interpreted like in String.replace(), but also double dollar placeholders ($$1). In the case of double dollar placeholders, - * Markdown inline grammar is applied on the content of the captured subgroup, i.e., $$1 processes inline Markdown grammar in the content of the - * first captured subgroup, and replaces `$$1` with the result. - * - * @param {string} replacement The replacement string, including placeholders. - * @param capture The result of a RegExp.exec() call - * @returns The replacement string, with placeholders replaced from the capture result. - */ - replace(replacement, capture) { - return replacement.replace(/(\${1,2})([0-9])/g, (str, p1, p2) => { - if (p1 == "$") - return (0, _grammar.htmlescape)(capture[p2]); - else - return `${this.processInlineStyles(capture[p2])}`; - }); - } - /** - * Applies the line types (from this.lineTypes as well as the capture result in this.lineReplacements and this.lineCaptures) - * and processes inline formatting for all lines. - */ - applyLineTypes() { - for (let lineNum = 0; lineNum < this.lines.length; lineNum++) { - if (this.lineDirty[lineNum]) { - let contentHTML = this.replace(this.lineReplacements[lineNum], this.lineCaptures[lineNum]); - this.lineElements[lineNum].className = this.lineTypes[lineNum]; - this.lineElements[lineNum].removeAttribute("style"); - this.lineElements[lineNum].innerHTML = contentHTML == "" ? "
" : contentHTML; - } - this.lineElements[lineNum].dataset.lineNum = lineNum; - } - } - /** - * Determines line types for all lines based on the line / block grammar. Captures the results of the respective line - * grammar regular expressions. - * Updates this.lineTypes, this.lineCaptures, and this.lineReplacements. - */ - updateLineTypes() { - let codeBlockType = false; - let codeBlockSeqLength = 0; - let htmlBlock = false; - for (let lineNum = 0; lineNum < this.lines.length; lineNum++) { - let lineType = "TMPara"; - let lineCapture = [this.lines[lineNum]]; - let lineReplacement = "$$0"; - if (codeBlockType == "TMCodeFenceBacktickOpen") { - let capture = _grammar.lineGrammar.TMCodeFenceBacktickClose.regexp.exec(this.lines[lineNum]); - if (capture && capture.groups["seq"].length >= codeBlockSeqLength) { - lineType = "TMCodeFenceBacktickClose"; - lineReplacement = _grammar.lineGrammar.TMCodeFenceBacktickClose.replacement; - lineCapture = capture; - codeBlockType = false; - } else { - lineType = "TMFencedCodeBacktick"; - lineReplacement = "$0"; - lineCapture = [this.lines[lineNum]]; - } - } else if (codeBlockType == "TMCodeFenceTildeOpen") { - let capture = _grammar.lineGrammar.TMCodeFenceTildeClose.regexp.exec(this.lines[lineNum]); - if (capture && capture.groups["seq"].length >= codeBlockSeqLength) { - lineType = "TMCodeFenceTildeClose"; - lineReplacement = _grammar.lineGrammar.TMCodeFenceTildeClose.replacement; - lineCapture = capture; - codeBlockType = false; - } else { - lineType = "TMFencedCodeTilde"; - lineReplacement = "$0"; - lineCapture = [this.lines[lineNum]]; - } - } - if (lineType == "TMPara" && htmlBlock === false) { - for (let htmlBlockType of _grammar.htmlBlockGrammar) { - if (this.lines[lineNum].match(htmlBlockType.start)) { - if (htmlBlockType.paraInterrupt || lineNum == 0 || !(this.lineTypes[lineNum - 1] == "TMPara" || this.lineTypes[lineNum - 1] == "TMUL" || this.lineTypes[lineNum - 1] == "TMOL" || this.lineTypes[lineNum - 1] == "TMBlockquote")) { - htmlBlock = htmlBlockType; - break; - } - } - } - } - if (htmlBlock !== false) { - lineType = "TMHTMLBlock"; - lineReplacement = "$0"; - lineCapture = [this.lines[lineNum]]; - if (htmlBlock.end) { - if (this.lines[lineNum].match(htmlBlock.end)) { - htmlBlock = false; - } - } else { - if (lineNum == this.lines.length - 1 || this.lines[lineNum + 1].match(_grammar.lineGrammar.TMBlankLine.regexp)) { - htmlBlock = false; - } - } - } - if (lineType == "TMPara") { - for (let type in _grammar.lineGrammar) { - if (_grammar.lineGrammar[type].regexp) { - let capture = _grammar.lineGrammar[type].regexp.exec(this.lines[lineNum]); - if (capture) { - lineType = type; - lineReplacement = _grammar.lineGrammar[type].replacement; - lineCapture = capture; - break; - } - } - } - } - if (lineType == "TMCodeFenceBacktickOpen" || lineType == "TMCodeFenceTildeOpen") { - codeBlockType = lineType; - codeBlockSeqLength = lineCapture.groups["seq"].length; - } - if ((lineType == "TMIndentedCode" || lineType == "TMLinkReferenceDefinition") && lineNum > 0 && (this.lineTypes[lineNum - 1] == "TMPara" || this.lineTypes[lineNum - 1] == "TMUL" || this.lineTypes[lineNum - 1] == "TMOL" || this.lineTypes[lineNum - 1] == "TMBlockquote")) { - lineType = "TMPara"; - lineCapture = [this.lines[lineNum]]; - lineReplacement = "$$0"; - } - if (lineType == "TMSetextH2Marker") { - let capture = _grammar.lineGrammar.TMUL.regexp.exec(this.lines[lineNum]); - if (capture) { - lineType = "TMUL"; - lineReplacement = _grammar.lineGrammar.TMUL.replacement; - lineCapture = capture; - } - } - if (lineType == "TMSetextH1Marker" || lineType == "TMSetextH2Marker") { - if (lineNum == 0 || this.lineTypes[lineNum - 1] != "TMPara") { - let capture = _grammar.lineGrammar.TMHR.regexp.exec(this.lines[lineNum]); - if (capture) { - lineType = "TMHR"; - lineCapture = capture; - lineReplacement = _grammar.lineGrammar.TMHR.replacement; - } else { - lineType = "TMPara"; - lineCapture = [this.lines[lineNum]]; - lineReplacement = "$$0"; - } - } else { - let headingLine = lineNum - 1; - const headingLineType = lineType == "TMSetextH1Marker" ? "TMSetextH1" : "TMSetextH2"; - do { - if (this.lineTypes[headingLineType] != headingLineType) { - this.lineTypes[headingLine] = headingLineType; - this.lineDirty[headingLineType] = true; - } - this.lineReplacements[headingLine] = "$$0"; - this.lineCaptures[headingLine] = [this.lines[headingLine]]; - headingLine--; - } while (headingLine >= 0 && this.lineTypes[headingLine] == "TMPara"); - } - } - if (this.lineTypes[lineNum] != lineType) { - this.lineTypes[lineNum] = lineType; - this.lineDirty[lineNum] = true; - } - this.lineReplacements[lineNum] = lineReplacement; - this.lineCaptures[lineNum] = lineCapture; - } - } - /** - * Updates all line contents from the HTML, then re-applies formatting. - */ - updateLineContentsAndFormatting() { - this.clearDirtyFlag(); - this.updateLineContents(); - this.updateFormatting(); - } - /** - * Attempts to parse a link or image at the current position. This assumes that the opening [ or ![ has already been matched. - * Returns false if this is not a valid link, image. See below for more information - * @param {string} originalString The original string, starting at the opening marker ([ or ![) - * @param {boolean} isImage Whether or not this is an image (opener == ![) - * @returns false if not a valid link / image. - * Otherwise returns an object with two properties: output is the string to be included in the processed output, - * charCount is the number of input characters (from originalString) consumed. - */ - parseLinkOrImage(originalString, isImage) { - let textOffset = isImage ? 2 : 1; - let opener = originalString.substr(0, textOffset); - let type = isImage ? "TMImage" : "TMLink"; - let currentOffset = textOffset; - let bracketLevel = 1; - let linkText = false; - let linkRef = false; - let linkLabel = []; - let linkDetails = []; - textOuter: - while (currentOffset < originalString.length && linkText === false) { - let string = originalString.substr(currentOffset); - for (let rule of ["escape", "code", "autolink", "html"]) { - let cap = _grammar.inlineGrammar[rule].regexp.exec(string); - if (cap) { - currentOffset += cap[0].length; - continue textOuter; - } - } - if (string.match(_grammar.inlineGrammar.imageOpen.regexp)) { - bracketLevel++; - currentOffset += 2; - continue textOuter; - } - if (string.match(_grammar.inlineGrammar.linkOpen.regexp)) { - bracketLevel++; - if (!isImage) { - if (this.parseLinkOrImage(string, false)) { - return false; - } - } - currentOffset += 1; - continue textOuter; - } - if (string.match(/^\]/)) { - bracketLevel--; - if (bracketLevel == 0) { - linkText = originalString.substr(textOffset, currentOffset - textOffset); - currentOffset++; - continue textOuter; - } - } - currentOffset++; - } - if (linkText === false) - return false; - let nextChar = currentOffset < originalString.length ? originalString.substr(currentOffset, 1) : ""; - if (nextChar == "[") { - let string = originalString.substr(currentOffset); - let cap = _grammar.inlineGrammar.linkLabel.regexp.exec(string); - if (cap) { - currentOffset += cap[0].length; - linkLabel.push(cap[1], cap[2], cap[3]); - if (cap[_grammar.inlineGrammar.linkLabel.labelPlaceholder]) { - linkRef = cap[_grammar.inlineGrammar.linkLabel.labelPlaceholder]; - } else { - linkRef = linkText.trim(); - } - } else { - return false; - } - } else if (nextChar != "(") { - linkRef = linkText.trim(); - } else { - currentOffset++; - let parenthesisLevel = 1; - inlineOuter: - while (currentOffset < originalString.length && parenthesisLevel > 0) { - let string = originalString.substr(currentOffset); - let cap = /^\s+/.exec(string); - if (cap) { - switch (linkDetails.length) { - case 0: - linkDetails.push(cap[0]); - break; - case 1: - linkDetails.push(cap[0]); - break; - case 2: - if (linkDetails[0].match(//)) { - if (linkDetails.length == 1) - linkDetails.push(""); - linkDetails.push(">"); - currentOffset++; - continue inlineOuter; - } - cap = /^["']/.exec(string); - if (cap && (linkDetails.length == 0 || linkDetails.length == 1 || linkDetails.length == 4)) { - while (linkDetails.length < 4) - linkDetails.push(""); - linkDetails.push(cap[0]); - currentOffset++; - continue inlineOuter; - } - if (cap && (linkDetails.length == 5 || linkDetails.length == 6) && linkDetails[4] == cap[0]) { - if (linkDetails.length == 5) - linkDetails.push(""); - linkDetails.push(cap[0]); - currentOffset++; - continue inlineOuter; - } - if (string.match(/^\(/)) { - switch (linkDetails.length) { - case 0: - linkDetails.push(""); - case 1: - linkDetails.push(""); - case 2: - linkDetails[1] = linkDetails[1].concat("("); - if (!linkDetails[0].match(/<$/)) - parenthesisLevel++; - break; - case 3: - linkDetails.push(""); - case 4: - linkDetails.push("("); - break; - case 5: - linkDetails.push(""); - case 6: - if (linkDetails[4] == "(") - return false; - linkDetails[5] = linkDetails[5].concat("("); - break; - default: - return false; - } - currentOffset++; - continue inlineOuter; - } - if (string.match(/^\)/)) { - if (linkDetails.length <= 2) { - while (linkDetails.length < 2) - linkDetails.push(""); - if (!linkDetails[0].match(/<$/)) - parenthesisLevel--; - if (parenthesisLevel > 0) { - linkDetails[1] = linkDetails[1].concat(")"); - } - } else if (linkDetails.length == 5 || linkDetails.length == 6) { - if (linkDetails[4] == "(") { - if (linkDetails.length == 5) - linkDetails.push(""); - linkDetails.push(")"); - } else { - if (linkDetails.length == 5) - linkDetails.push(")"); - else - linkDetails[5] = linkDetails[5].concat(")"); - } - } else { - parenthesisLevel--; - } - if (parenthesisLevel == 0) { - while (linkDetails.length < 7) - linkDetails.push(""); - } - currentOffset++; - continue inlineOuter; - } - cap = /^./.exec(string); - if (cap) { - switch (linkDetails.length) { - case 0: - linkDetails.push(""); - case 1: - linkDetails.push(cap[0]); - break; - case 2: - linkDetails[1] = linkDetails[1].concat(cap[0]); - break; - case 3: - return false; - case 4: - return false; - case 5: - linkDetails.push(""); - case 6: - linkDetails[5] = linkDetails[5].concat(cap[0]); - break; - default: - return false; - } - currentOffset += cap[0].length; - continue inlineOuter; - } - throw "Infinite loop"; - } - if (parenthesisLevel > 0) - return false; - } - if (linkRef !== false) { - let valid = false; - for (let label2 of this.linkLabels) { - if (label2 == linkRef) { - valid = true; - break; - } - } - let label = valid ? "TMLinkLabel TMLinkLabel_Valid" : "TMLinkLabel TMLinkLabel_Invalid"; - let output = `${opener}${this.processInlineStyles(linkText)}]`; - if (linkLabel.length >= 3) { - output = output.concat(`${linkLabel[0]}`, `${linkLabel[1]}`, `${linkLabel[2]}`); - } - return { - output, - charCount: currentOffset - }; - } else if (linkDetails) { - while (linkDetails.length < 7) { - linkDetails.push(""); - } - return { - output: `${opener}${this.processInlineStyles(linkText)}](${linkDetails[0]}${linkDetails[1]}${linkDetails[2]}${linkDetails[3]}${linkDetails[4]}${linkDetails[5]}${linkDetails[6]})`, - charCount: currentOffset - }; - } - return false; - } - /** - * Formats a markdown string as HTML, using Markdown inline formatting. - * @param {string} originalString The input (markdown inline formatted) string - * @returns {string} The HTML formatted output - */ - processInlineStyles(originalString) { - let processed = ""; - let stack = []; - let offset = 0; - let string = originalString; - outer: - while (string) { - for (let rule of ["escape", "code", "autolink", "html"]) { - let cap2 = _grammar.inlineGrammar[rule].regexp.exec(string); - if (cap2) { - string = string.substr(cap2[0].length); - offset += cap2[0].length; - processed += _grammar.inlineGrammar[rule].replacement.replace(/\$([1-9])/g, (str, p1) => (0, _grammar.htmlescape)(cap2[p1])); - continue outer; - } - } - let potentialLink = string.match(_grammar.inlineGrammar.linkOpen.regexp); - let potentialImage = string.match(_grammar.inlineGrammar.imageOpen.regexp); - if (potentialImage || potentialLink) { - let result = this.parseLinkOrImage(string, potentialImage); - if (result) { - processed = `${processed}${result.output}`; - string = string.substr(result.charCount); - offset += result.charCount; - continue outer; - } - } - let cap = /(^\*+)|(^_+)/.exec(string); - if (cap) { - let delimCount = cap[0].length; - const delimString = cap[0]; - const currentDelimiter = cap[0][0]; - string = string.substr(cap[0].length); - const preceding = offset > 0 ? originalString.substr(0, offset) : " "; - const following = offset + cap[0].length < originalString.length ? string : " "; - const punctuationFollows = following.match(_grammar.punctuationLeading); - const punctuationPrecedes = preceding.match(_grammar.punctuationTrailing); - const whitespaceFollows = following.match(/^\s/); - const whitespacePrecedes = preceding.match(/\s$/); - let canOpen = !whitespaceFollows && (!punctuationFollows || !!whitespacePrecedes || !!punctuationPrecedes); - let canClose = !whitespacePrecedes && (!punctuationPrecedes || !!whitespaceFollows || !!punctuationFollows); - if (currentDelimiter == "_" && canOpen && canClose) { - canOpen = punctuationPrecedes; - canClose = punctuationFollows; - } - if (canClose) { - let stackPointer = stack.length - 1; - while (delimCount && stackPointer >= 0) { - if (stack[stackPointer].delimiter == currentDelimiter) { - while (stackPointer < stack.length - 1) { - const entry = stack.pop(); - processed = `${entry.output}${entry.delimString.substr(0, entry.count)}${processed}`; - } - if (delimCount >= 2 && stack[stackPointer].count >= 2) { - processed = `${currentDelimiter}${currentDelimiter}${processed}${currentDelimiter}${currentDelimiter}`; - delimCount -= 2; - stack[stackPointer].count -= 2; - } else { - processed = `${currentDelimiter}${processed}${currentDelimiter}`; - delimCount -= 1; - stack[stackPointer].count -= 1; - } - if (stack[stackPointer].count == 0) { - let entry = stack.pop(); - processed = `${entry.output}${processed}`; - stackPointer--; - } - } else { - stackPointer--; - } - } - } - if (delimCount && canOpen) { - stack.push({ - delimiter: currentDelimiter, - delimString, - count: delimCount, - output: processed - }); - processed = ""; - delimCount = 0; - } - if (delimCount) { - processed = `${processed}${delimString.substr(0, delimCount)}`; - } - offset += cap[0].length; - continue outer; - } - cap = /^~~/.exec(string); - if (cap) { - let consumed = false; - let stackPointer = stack.length - 1; - while (!consumed && stackPointer >= 0) { - if (stack[stackPointer].delimiter == "~") { - while (stackPointer < stack.length - 1) { - const entry2 = stack.pop(); - processed = `${entry2.output}${entry2.delimString.substr(0, entry2.count)}${processed}`; - } - processed = `~~${processed}~~`; - let entry = stack.pop(); - processed = `${entry.output}${processed}`; - consumed = true; - } else { - stackPointer--; - } - } - if (!consumed) { - stack.push({ - delimiter: "~", - delimString: "~~", - count: 2, - output: processed - }); - processed = ""; - } - offset += cap[0].length; - string = string.substr(cap[0].length); - continue outer; - } - cap = _grammar.inlineGrammar.default.regexp.exec(string); - if (cap) { - string = string.substr(cap[0].length); - offset += cap[0].length; - processed += _grammar.inlineGrammar.default.replacement.replace(/\$([1-9])/g, (str, p1) => (0, _grammar.htmlescape)(cap[p1])); - continue outer; - } - throw "Infinite loop!"; - } - while (stack.length) { - const entry = stack.pop(); - processed = `${entry.output}${entry.delimString.substr(0, entry.count)}${processed}`; - } - return processed; - } - /** - * Clears the line dirty flag (resets it to an array of false) - */ - clearDirtyFlag() { - this.lineDirty = new Array(this.lines.length); - for (let i = 0; i < this.lineDirty.length; i++) { - this.lineDirty[i] = false; - } - } - /** - * Updates the class properties (lines, lineElements) from the DOM. - * @returns true if contents changed - */ - updateLineContents() { - let lineDelta = this.e.childElementCount - this.lines.length; - if (lineDelta) { - let firstChangedLine = 0; - while (firstChangedLine <= this.lines.length && firstChangedLine <= this.lineElements.length && this.lineElements[firstChangedLine] && this.lines[firstChangedLine] == this.lineElements[firstChangedLine].textContent) { - firstChangedLine++; - } - let lastChangedLine = -1; - while (-lastChangedLine < this.lines.length && -lastChangedLine < this.lineElements.length && this.lines[this.lines.length + lastChangedLine] == this.lineElements[this.lineElements.length + lastChangedLine].textContent) { - lastChangedLine--; - } - let linesToDelete = this.lines.length + lastChangedLine + 1 - firstChangedLine; - if (linesToDelete < -lineDelta) - linesToDelete = -lineDelta; - if (linesToDelete < 0) - linesToDelete = 0; - let linesToAdd = []; - for (let l = 0; l < linesToDelete + lineDelta; l++) { - linesToAdd.push(this.lineElements[firstChangedLine + l].textContent); - } - this.spliceLines(firstChangedLine, linesToDelete, linesToAdd, false); - } else { - for (let line = 0; line < this.lineElements.length; line++) { - let e = this.lineElements[line]; - let ct = e.textContent; - if (this.lines[line] !== ct) { - this.lines[line] = ct; - this.lineDirty[line] = true; - } - } - } - } - /** - * Processes a new paragraph. - * @param sel The current selection - */ - processNewParagraph(sel) { - if (!sel) - return; - this.updateLineContents(); - let continuableType = false; - let checkLine = sel.col > 0 ? sel.row : sel.row - 1; - switch (this.lineTypes[checkLine]) { - case "TMUL": - continuableType = "TMUL"; - break; - case "TMOL": - continuableType = "TMOL"; - break; - case "TMIndentedCode": - continuableType = "TMIndentedCode"; - break; - } - let lines = this.lines[sel.row].replace(/\n\n$/, "\n").split(/(?:\r\n|\n|\r)/); - if (lines.length == 1) { - this.updateFormatting(); - return; - } - this.spliceLines(sel.row, 1, lines, true); - sel.row++; - sel.col = 0; - if (continuableType) { - let capture = _grammar.lineGrammar[continuableType].regexp.exec(this.lines[sel.row - 1]); - if (capture) { - if (capture[2]) { - if (continuableType == "TMOL") { - capture[1] = capture[1].replace(/\d{1,9}/, (result) => { - return parseInt(result[0]) + 1; - }); - } - this.lines[sel.row] = `${capture[1]}${this.lines[sel.row]}`; - this.lineDirty[sel.row] = true; - sel.col = capture[1].length; - } else { - this.lines[sel.row - 1] = ""; - this.lineDirty[sel.row - 1] = true; - } - } - } - this.updateFormatting(); - } - // /** - // * Processes a "delete" input action. - // * @param {object} focus The selection - // * @param {boolean} forward If true, performs a forward delete, otherwise performs a backward delete - // */ - // processDelete(focus, forward) { - // if (!focus) return; - // let anchor = this.getSelection(true); - // // Do we have a non-empty selection? - // if (focus.col != anchor.col || focus.row != anchor.row) { - // // non-empty. direction doesn't matter. - // this.paste('', anchor, focus); - // } else { - // if (forward) { - // if (focus.col < this.lines[focus.row].length) this.paste('', {row: focus.row, col: focus.col + 1}, focus); - // else if (focus.col < this.lines.length) this.paste('', {row: focus.row + 1, col: 0}, focus); - // // Otherwise, we're at the very end and can't delete forward - // } else { - // if (focus.col > 0) this.paste('', {row: focus.row, col: focus.col - 1}, focus); - // else if (focus.row > 0) this.paste('', {row: focus.row - 1, col: this.lines[focus.row - 1].length - 1}, focus); - // // Otherwise, we're at the very beginning and can't delete backwards - // } - // } - // } - /** - * Gets the current position of the selection counted by row and column of the editor Markdown content (as opposed to the position in the DOM). - * - * @param {boolean} getAnchor if set to true, gets the selection anchor (start point of the selection), otherwise gets the focus (end point). - * @return {object} An object representing the selection, with properties col and row. - */ - getSelection() { - let getAnchor = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false; - const selection = window.getSelection(); - let startNode = getAnchor ? selection.anchorNode : selection.focusNode; - if (!startNode) - return null; - let offset = startNode.nodeType === Node.TEXT_NODE ? getAnchor ? selection.anchorOffset : selection.focusOffset : 0; - if (startNode == this.e) { - return { - row: 0, - col: offset - }; - } - let col = this.computeColumn(startNode, offset); - if (col === null) - return null; - let node = startNode; - while (node.parentElement != this.e) { - node = node.parentElement; - } - let row = 0; - if (node.dataset && node.dataset.lineNum && (!node.previousSibling || node.previousSibling.dataset.lineNum != node.dataset.lineNum)) { - row = parseInt(node.dataset.lineNum); - } else { - while (node.previousSibling) { - row++; - node = node.previousSibling; - } - } - return { - row, - col, - node: startNode - }; - } - /** - * Computes a column within an editor line from a node and offset within that node. - * @param {Node} startNode The node - * @param {int} offset THe selection - * @returns {int} the column, or null if the node is not inside the editor - */ - computeColumn(startNode, offset) { - let node = startNode; - let col = offset; - while (node && node.parentNode != this.e) { - node = node.parentNode; - } - if (node == null) - return null; - node = startNode; - while (node.parentNode != this.e) { - if (node.previousSibling) { - node = node.previousSibling; - col += node.textContent.length; - } else { - node = node.parentNode; - } - } - return col; - } - /** - * Computes DOM node and offset within that node from a position expressed as row and column. - * @param {int} row Row (line number) - * @param {int} col Column - * @returns An object with two properties: node and offset. offset may be null; - */ - computeNodeAndOffset(row, col) { - let bindRight = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false; - if (row >= this.lineElements.length) { - row = this.lineElements.length - 1; - col = this.lines[row].length; - } - if (col > this.lines[row].length) { - col = this.lines[row].length; - } - const parentNode = this.lineElements[row]; - let node = parentNode.firstChild; - let childrenComplete = false; - let rv = { - node: parentNode.firstChild ? parentNode.firstChild : parentNode, - offset: 0 - }; - while (node != parentNode) { - if (!childrenComplete && node.nodeType === Node.TEXT_NODE) { - if (node.nodeValue.length >= col) { - if (bindRight && node.nodeValue.length == col) { - rv = { - node, - offset: col - }; - col = 0; - } else { - return { - node, - offset: col - }; - } - } else { - col -= node.nodeValue.length; - } - } - if (!childrenComplete && node.firstChild) { - node = node.firstChild; - } else if (node.nextSibling) { - childrenComplete = false; - node = node.nextSibling; - } else { - childrenComplete = true; - node = node.parentNode; - } - } - return rv; - } - /** - * Sets the selection based on rows and columns within the editor Markdown content. - * @param {object} focus Object representing the selection, needs to have properties row and col. - */ - setSelection(focus) { - let anchor = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null; - if (!focus) - return; - let range = document.createRange(); - let { - node: focusNode, - offset: focusOffset - } = this.computeNodeAndOffset(focus.row, focus.col, anchor && anchor.row == focus.row && anchor.col > focus.col); - let anchorNode = null, anchorOffset = null; - if (anchor && (anchor.row != focus.row || anchor.col != focus.col)) { - let { - node, - offset - } = this.computeNodeAndOffset(anchor.row, anchor.col, focus.row == anchor.row && focus.col > anchor.col); - anchorNode = node; - anchorOffset = offset; - } - if (anchorNode) - range.setStart(anchorNode, anchorOffset); - else - range.setStart(focusNode, focusOffset); - range.setEnd(focusNode, focusOffset); - let windowSelection = window.getSelection(); - windowSelection.removeAllRanges(); - windowSelection.addRange(range); - } - /** - * Event handler for input events - */ - handleInputEvent(event) { - let focus = this.getSelection(); - if ((event.inputType == "insertParagraph" || event.inputType == "insertLineBreak") && focus) { - this.clearDirtyFlag(); - this.processNewParagraph(focus); - } else { - if (!this.e.firstChild) { - this.e.innerHTML = '

'; - } else { - for (let childNode = this.e.firstChild; childNode; childNode = childNode.nextSibling) { - if (childNode.nodeType != 3 || childNode.tagName != "DIV") { - let divWrapper = document.createElement("div"); - this.e.insertBefore(divWrapper, childNode); - this.e.removeChild(childNode); - divWrapper.appendChild(childNode); - } - } - } - this.updateLineContentsAndFormatting(); - } - if (focus) - this.setSelection(focus); - this.fireChange(); - } - /** - * Event handler for "selectionchange" events. - */ - handleSelectionChangeEvent() { - this.fireSelection(); - } - /** - * Convenience function to "splice" new lines into the arrays this.lines, this.lineDirty, this.lineTypes, and the DOM elements - * underneath the editor element. - * This method is essentially Array.splice, only that the third parameter takes an un-spread array (and the forth parameter) - * determines whether the DOM should also be adjusted. - * - * @param {int} startLine Position at which to start changing the array of lines - * @param {int} linesToDelete Number of lines to delete - * @param {array} linesToInsert Array of strings representing the lines to be inserted - * @param {boolean} adjustLineElements If true, then
elements are also inserted in the DOM at the respective position - */ - spliceLines(startLine) { - let linesToDelete = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; - let linesToInsert = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : []; - let adjustLineElements = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : true; - if (adjustLineElements) { - for (let i = 0; i < linesToDelete; i++) { - this.e.removeChild(this.e.childNodes[startLine]); - } - } - let insertedBlank = []; - let insertedDirty = []; - for (let i = 0; i < linesToInsert.length; i++) { - insertedBlank.push(""); - insertedDirty.push(true); - if (adjustLineElements) { - if (this.e.childNodes[startLine]) - this.e.insertBefore(document.createElement("div"), this.e.childNodes[startLine]); - else - this.e.appendChild(document.createElement("div")); - } - } - this.lines.splice(startLine, linesToDelete, ...linesToInsert); - this.lineTypes.splice(startLine, linesToDelete, ...insertedBlank); - this.lineDirty.splice(startLine, linesToDelete, ...insertedDirty); - } - /** - * Event handler for the "paste" event - */ - handlePaste(event) { - event.preventDefault(); - let text = (event.originalEvent || event).clipboardData.getData("text/plain"); - this.paste(text); - } - /** - * Pastes the text at the current selection (or at the end, if no current selection) - * @param {string} text - */ - paste(text) { - let anchor = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null; - let focus = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null; - if (!anchor) - anchor = this.getSelection(true); - if (!focus) - focus = this.getSelection(false); - let beginning, end; - if (!focus) { - focus = { - row: this.lines.length - 1, - col: this.lines[this.lines.length - 1].length - }; - } - if (!anchor) { - anchor = focus; - } - if (anchor.row < focus.row || anchor.row == focus.row && anchor.col <= focus.col) { - beginning = anchor; - end = focus; - } else { - beginning = focus; - end = anchor; - } - let insertedLines = text.split(/(?:\r\n|\r|\n)/); - let lineBefore = this.lines[beginning.row].substr(0, beginning.col); - let lineEnd = this.lines[end.row].substr(end.col); - insertedLines[0] = lineBefore.concat(insertedLines[0]); - let endColPos = insertedLines[insertedLines.length - 1].length; - insertedLines[insertedLines.length - 1] = insertedLines[insertedLines.length - 1].concat(lineEnd); - this.spliceLines(beginning.row, 1 + end.row - beginning.row, insertedLines); - focus.row = beginning.row + insertedLines.length - 1; - focus.col = endColPos; - this.updateFormatting(); - this.setSelection(focus); - this.fireChange(); - } - /** - * Computes the (lowest in the DOM tree) common ancestor of two DOM nodes. - * @param {Node} node1 the first node - * @param {Node} node2 the second node - * @returns {Node} The commen ancestor node, or null if there is no common ancestor - */ - computeCommonAncestor(node1, node2) { - if (!node1 || !node2) - return null; - if (node1 == node2) - return node1; - const ancestry = (node) => { - let ancestry3 = []; - while (node) { - ancestry3.unshift(node); - node = node.parentNode; - } - return ancestry3; - }; - const ancestry1 = ancestry(node1); - const ancestry2 = ancestry(node2); - if (ancestry1[0] != ancestry2[0]) - return null; - let i; - for (i = 0; ancestry1[i] == ancestry2[i]; i++) - ; - return ancestry1[i - 1]; - } - /** - * Finds the (lowest in the DOM tree) enclosing DOM node with a given class. - * @param {object} focus The focus selection object - * @param {object} anchor The anchor selection object - * @param {string} className The class name to find - * @returns {Node} The enclosing DOM node with the respective class (inside the editor), if there is one; null otherwise. - */ - computeEnclosingMarkupNode(focus, anchor, className) { - let node = null; - if (!focus) - return null; - if (!anchor) { - node = focus.node; - } else { - if (focus.row != anchor.row) - return null; - node = this.computeCommonAncestor(focus.node, anchor.node); - } - if (!node) - return null; - while (node != this.e) { - if (node.className && node.className.includes(className)) - return node; - node = node.parentNode; - } - return null; - } - /** - * Returns the state (true / false) of all commands. - * @param focus Focus of the selection. If not given, assumes the current focus. - */ - getCommandState() { - let focus = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null; - let anchor = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null; - let commandState = {}; - if (!focus) - focus = this.getSelection(false); - if (!anchor) - anchor = this.getSelection(true); - if (!focus) { - for (let cmd in _grammar.commands) { - commandState[cmd] = null; - } - return commandState; - } - if (!anchor) - anchor = focus; - let start, end; - if (anchor.row < focus.row || anchor.row == focus.row && anchor.col < focus.col) { - start = anchor; - end = focus; - } else { - start = focus; - end = anchor; - } - if (end.row > start.row && end.col == 0) { - end.row--; - end.col = this.lines[end.row].length; - } - for (let cmd in _grammar.commands) { - if (_grammar.commands[cmd].type == "inline") { - if (!focus || focus.row != anchor.row || !this.isInlineFormattingAllowed(focus, anchor)) { - commandState[cmd] = null; - } else { - commandState[cmd] = !!this.computeEnclosingMarkupNode(focus, anchor, _grammar.commands[cmd].className) || // ... or if it's an empty string preceded by and followed by formatting markers, e.g. **|** where | is the cursor - focus.col == anchor.col && !!this.lines[focus.row].substr(0, focus.col).match(_grammar.commands[cmd].unset.prePattern) && !!this.lines[focus.row].substr(focus.col).match(_grammar.commands[cmd].unset.postPattern); - } - } - if (_grammar.commands[cmd].type == "line") { - if (!focus) { - commandState[cmd] = null; - } else { - let state = this.lineTypes[start.row] == _grammar.commands[cmd].className; - for (let line = start.row; line <= end.row; line++) { - if (this.lineTypes[line] == _grammar.commands[cmd].className != state) { - state = null; - break; - } - } - commandState[cmd] = state; - } - } - } - return commandState; - } - /** - * Sets a command state - * @param {string} command - * @param {boolean} state - */ - setCommandState(command, state) { - if (_grammar.commands[command].type == "inline") { - let anchor = this.getSelection(true); - let focus = this.getSelection(false); - if (!anchor) - anchor = focus; - if (!anchor) - return; - if (anchor.row != focus.row) - return; - if (!this.isInlineFormattingAllowed(focus, anchor)) - return; - let markupNode = this.computeEnclosingMarkupNode(focus, anchor, _grammar.commands[command].className); - this.clearDirtyFlag(); - if (markupNode) { - this.lineDirty[focus.row] = true; - const startCol = this.computeColumn(markupNode, 0); - const len = markupNode.textContent.length; - const left = this.lines[focus.row].substr(0, startCol).replace(_grammar.commands[command].unset.prePattern, ""); - const mid = this.lines[focus.row].substr(startCol, len); - const right = this.lines[focus.row].substr(startCol + len).replace(_grammar.commands[command].unset.postPattern, ""); - this.lines[focus.row] = left.concat(mid, right); - anchor.col = left.length; - focus.col = anchor.col + len; - this.updateFormatting(); - this.setSelection(focus, anchor); - } else if (focus.col == anchor.col && !!this.lines[focus.row].substr(0, focus.col).match(_grammar.commands[command].unset.prePattern) && !!this.lines[focus.row].substr(focus.col).match(_grammar.commands[command].unset.postPattern)) { - this.lineDirty[focus.row] = true; - const left = this.lines[focus.row].substr(0, focus.col).replace(_grammar.commands[command].unset.prePattern, ""); - const right = this.lines[focus.row].substr(focus.col).replace(_grammar.commands[command].unset.postPattern, ""); - this.lines[focus.row] = left.concat(right); - focus.col = anchor.col = left.length; - this.updateFormatting(); - this.setSelection(focus, anchor); - } else { - let { - startCol, - endCol - } = focus.col < anchor.col ? { - startCol: focus.col, - endCol: anchor.col - } : { - startCol: anchor.col, - endCol: focus.col - }; - let match = this.lines[focus.row].substr(startCol, endCol - startCol).match(/^(?\s*).*\S(?\s*)$/); - if (match) { - startCol += match.groups.leading.length; - endCol -= match.groups.trailing.length; - } - focus.col = startCol; - anchor.col = endCol; - this.wrapSelection(_grammar.commands[command].set.pre, _grammar.commands[command].set.post, focus, anchor); - } - } else if (_grammar.commands[command].type == "line") { - let anchor = this.getSelection(true); - let focus = this.getSelection(false); - if (!anchor) - anchor = focus; - if (!focus) - return; - this.clearDirtyFlag(); - let start = anchor.row > focus.row ? focus : anchor; - let end = anchor.row > focus.row ? anchor : focus; - if (end.row > start.row && end.col == 0) { - end.row--; - } - for (let line = start.row; line <= end.row; line++) { - if (state && this.lineTypes[line] != _grammar.commands[command].className) { - this.lines[line] = this.lines[line].replace(_grammar.commands[command].set.pattern, _grammar.commands[command].set.replacement.replace("$#", line - start.row + 1)); - this.lineDirty[line] = true; - } - if (!state && this.lineTypes[line] == _grammar.commands[command].className) { - this.lines[line] = this.lines[line].replace(_grammar.commands[command].unset.pattern, _grammar.commands[command].unset.replacement); - this.lineDirty[line] = true; - } - } - this.updateFormatting(); - this.setSelection({ - row: end.row, - col: this.lines[end.row].length - }, { - row: start.row, - col: 0 - }); - } - } - /** - * Returns whether or not inline formatting is allowed at the current focus - * @param {object} focus The current focus - */ - isInlineFormattingAllowed() { - const sel = window.getSelection(); - if (!sel) - return false; - if (sel.isCollapsed && sel.focusNode.nodeType == 3 && sel.focusOffset == sel.focusNode.nodeValue.length) { - let node; - for (node = sel.focusNode; node && node.nextSibling == null; node = node.parentNode) - ; - if (node && node.nextSibling.className && node.nextSibling.className.includes("TMInlineFormatted")) - return true; - } - let ancestor = this.computeCommonAncestor(sel.focusNode, sel.anchorNode); - if (!ancestor) - return false; - while (ancestor && ancestor != this.e) { - if (ancestor.className && (ancestor.className.includes("TMInlineFormatted") || ancestor.className.includes("TMBlankLine"))) - return true; - ancestor = ancestor.parentNode; - } - return false; - } - /** - * Wraps the current selection in the strings pre and post. If the selection is not on one line, returns. - * @param {string} pre The string to insert before the selection. - * @param {string} post The string to insert after the selection. - * @param {object} focus The current selection focus. If null, selection will be computed. - * @param {object} anchor The current selection focus. If null, selection will be computed. - */ - wrapSelection(pre, post) { - let focus = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null; - let anchor = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null; - if (!focus) - focus = this.getSelection(false); - if (!anchor) - anchor = this.getSelection(true); - if (!focus || !anchor || focus.row != anchor.row) - return; - this.lineDirty[focus.row] = true; - const startCol = focus.col < anchor.col ? focus.col : anchor.col; - const endCol = focus.col < anchor.col ? anchor.col : focus.col; - const left = this.lines[focus.row].substr(0, startCol).concat(pre); - const mid = endCol == startCol ? "" : this.lines[focus.row].substr(startCol, endCol - startCol); - const right = post.concat(this.lines[focus.row].substr(endCol)); - this.lines[focus.row] = left.concat(mid, right); - anchor.col = left.length; - focus.col = anchor.col + mid.length; - this.updateFormatting(); - this.setSelection(focus, anchor); - } - /** - * Toggles the command state for a command (true <-> false) - * @param {string} command The editor command - */ - toggleCommandState(command) { - if (!this.lastCommandState) - this.lastCommandState = this.getCommandState(); - this.setCommandState(command, !this.lastCommandState[command]); - } - /** - * Fires a change event. Updates the linked textarea and notifies any event listeners. - */ - fireChange() { - if (!this.textarea && !this.listeners.change.length) - return; - const content = this.getContent(); - if (this.textarea) - this.textarea.value = content; - for (let listener of this.listeners.change) { - listener({ - content, - linesDirty: this.linesDirty - }); - } - } - /** - * Fires a "selection changed" event. - */ - fireSelection() { - if (this.listeners.selection && this.listeners.selection.length) { - let focus = this.getSelection(false); - let anchor = this.getSelection(true); - let commandState = this.getCommandState(focus, anchor); - if (this.lastCommandState) { - Object.assign(this.lastCommandState, commandState); - } else { - this.lastCommandState = Object.assign({}, commandState); - } - for (let listener of this.listeners.selection) { - listener({ - focus, - anchor, - commandState: this.lastCommandState - }); - } - } - } - /** - * Adds an event listener. - * @param {string} type The type of event to listen to. Can be 'change' or 'selection' - * @param {*} listener Function of the type (event) => {} to be called when the event occurs. - */ - addEventListener(type, listener) { - if (type.match(/^(?:change|input)$/i)) { - this.listeners.change.push(listener); - } - if (type.match(/^(?:selection|selectionchange)$/i)) { - this.listeners.selection.push(listener); - } - } - }; - var _default = exports.default = Editor; - } - }); - - // node_modules/tiny-markdown-editor/lib/index.js - var require_lib = __commonJS({ - "node_modules/tiny-markdown-editor/lib/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: true - }); - Object.defineProperty(exports, "CommandBar", { - enumerable: true, - get: function() { - return _TinyMDECommandBar.default; - } - }); - Object.defineProperty(exports, "Editor", { - enumerable: true, - get: function() { - return _TinyMDE.default; - } - }); - var _TinyMDECommandBar = _interopRequireDefault(require_TinyMDECommandBar()); - var _TinyMDE = _interopRequireDefault(require_TinyMDE()); - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - } - }); - - // node_modules/@icelab/defo/dist/index.bundle.js - var require_index_bundle = __commonJS({ - "node_modules/@icelab/defo/dist/index.bundle.js"(exports, module) { - !function(e, t) { - "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = e || self).Defo = t(); - }(exports, function() { - "use strict"; - function e(e2, t2) { - return function(e3, t3) { - return Object.keys(e3.dataset).filter((e4) => 0 === e4.indexOf(t3)); - }(e2, t2).length > 0; - } - function t(e2) { - return e2.charAt(0).toUpperCase() + e2.slice(1); - } - function r(e2) { - try { - return JSON.parse(e2); - } catch (e3) { - } - return e2; - } - function o({ prefix: e2, scope: t2, views: r2 }) { - Object.keys(r2).forEach((o2) => { - const a2 = `data-${e2}-${s = o2, s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase()}`; - var s; - let i = Array.prototype.slice.call(t2.querySelectorAll(`[${a2}]`)); - t2.hasAttribute(a2) && (i = [t2].concat(i)), i.forEach((t3) => { - n(t3, e2, r2, o2); - }); - }); - } - function n(e2, o2, n2, a2) { - if (e2._defoUpdate && e2._defoUpdate[a2]) - return; - const s = n2[a2], i = function(e3, r2) { - return `${o3 = e3, o3.replace(/^[_.\- ]+/, "").toLowerCase().replace(/[_.\- ]+(\w|$)/g, (e4, t2) => t2.toUpperCase()).replace(/\d+(\w|$)/g, (e4) => e4.toUpperCase())}${t(r2)}`; - var o3; - }(o2, a2); - if (!s || !(i in e2.dataset)) - return; - const c = s(e2, r(e2.dataset[i])); - e2._defoUpdate = e2._defoUpdate || {}, e2._defoDestroy = e2._defoDestroy || {}, e2._defoUpdate[a2] = function(e3) { - return function(t2, o3) { - t2 = t2 ? r(t2) : t2, o3 = o3 ? r(o3) : o3, Promise.resolve(e3).then((e4) => { - e4.update && e4.update(t2, o3); - }); - }; - }(c), e2._defoDestroy[a2] = function(e3, t2, r2) { - return function() { - Promise.resolve(e3).then((e4) => { - e4.destroy && (e4.destroy(), delete t2._defoUpdate[r2], delete t2._defoDestroy[r2]); - }); - }; - }(c, e2, a2); - } - function a({ prefix: r2, scope: a2, views: s }) { - const i = new MutationObserver((a3) => { - a3.forEach((a4) => { - const i2 = a4.target; - if ("attributes" === a4.type && function(e2, t2) { - return 0 === e2.indexOf(`data-${t2}-`); - }(a4.attributeName, r2)) { - const e2 = a4.attributeName.split("-").slice(2).map((e3, r3) => r3 > 0 ? t(e3) : e3).join(""); - i2.hasAttribute(a4.attributeName) ? null !== a4.oldValue ? i2._defoUpdate[e2](i2.getAttribute(a4.attributeName), a4.oldValue) : n(i2, r2, s, e2) : i2._defoDestroy[e2](); - } else - "childList" === a4.type && (Array.prototype.slice.call(a4.removedNodes).filter((e2) => e2.nodeType === e2.ELEMENT_NODE).filter((t2) => e(t2, r2)).forEach((e2) => { - Object.keys(e2._defoDestroy).forEach((t2) => { - e2._defoDestroy[t2](); - }); - }), Array.prototype.slice.call(a4.addedNodes).filter((e2) => e2.nodeType === e2.ELEMENT_NODE).forEach((e2) => { - Promise.resolve(e2).then((e3) => { - o({ prefix: r2, scope: e3, views: s }); - }); - })); - }); - }); - return i.observe(a2, { attributes: true, attributeOldValue: true, childList: true, characterData: false, subtree: true }), o({ prefix: r2, scope: a2, views: s }), i; - } - return function({ prefix: e2 = "defo", scope: t2 = document.documentElement, views: r2 = {} } = {}) { - const o2 = a({ prefix: e2, scope: t2, views: r2 }); - return { destroy: () => { - o2.disconnect(); - } }; - }; - }); - } - }); - // slices/admin/assets/js/app.js - var import_tiny_markdown_editor = __toESM(require_lib(), 1); - var import_defo = __toESM(require_index_bundle(), 1); (function() { document.addEventListener("alpine:init", () => { Alpine.magic("clipboard", () => { return (subject) => navigator.clipboard.writeText(subject); }); }); - document.addEventListener("DOMContentLoaded", function() { - const views = { - markdown: (el, attrs) => { - var tinyMDE = new import_tiny_markdown_editor.default.Editor({ textarea: attrs.editorId }); - return { - update: (newName, oldName) => { - }, - destroy: () => { - } - }; - } - }; - (0, import_defo.default)({ views }); - }); })(); })(); diff --git a/slices/admin/assets/js/app.js b/slices/admin/assets/js/app.js index 4afc554..2632e6f 100644 --- a/slices/admin/assets/js/app.js +++ b/slices/admin/assets/js/app.js @@ -1,29 +1,10 @@ import "../../../../slices/main/assets/builds/app.css"; import "../css/app.css"; -import TinyMDE from "tiny-markdown-editor"; -import defo from "@icelab/defo"; - (function() { document.addEventListener('alpine:init', () => { Alpine.magic('clipboard', () => { return subject => navigator.clipboard.writeText(subject) }) }) - - document.addEventListener("DOMContentLoaded", function () { - const views = { - markdown: (el, attrs) => { - - var tinyMDE = new TinyMDE.Editor({textarea: attrs.editorId}); - - return { - update: (newName, oldName) => {}, - destroy: () => {} - }; - } - }; - - defo({views}); - }); })(); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cfaeff3..5e86e5d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,11 +303,6 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -core-js@^3.6.5: - version "3.33.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.3.tgz#3c644a323f0f533a0d360e9191e37f7fc059088d" - integrity sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw== - cross-spawn@^7.0.0: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -897,13 +892,6 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -tiny-markdown-editor@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/tiny-markdown-editor/-/tiny-markdown-editor-0.1.8.tgz#bef845be1bea105224898a300bb27d0800a87a08" - integrity sha512-NQNeVTwAwkzTOyL2KPm6jzpP08ygZ3eK7EQH2XZd5xwRLXuivYHArrGqsTbjfCk1Hla+PAA6uI1Uz5D15CP7uA== - dependencies: - core-js "^3.6.5" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"