{"version":3,"file":"js/1240-7ea47647b72394f4fdc6.js","mappings":"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","sources":["webpack://app/./node_modules/europa/dist/europa.js","webpack://app/./node_modules/inscrybmde/src/js/inscrybmde.js","webpack://app/./node_modules/marked/lib/marked.esm.js"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.Europa = factory());\n}(this, (function () { 'use strict';\n\n /*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n /**\n * A bare-bones constructor for surrogate prototype swapping.\n *\n * @private\n * @constructor\n */\n var Constructor = /* istanbul ignore next */ function() {};\n /**\n * A reference to Object.prototype.hasOwnProperty.\n *\n * @private\n * @type {Function}\n */\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n /**\n * A reference to Array.prototype.slice.\n *\n * @private\n * @type {Function}\n */\n var slice = Array.prototype.slice;\n\n /**\n * Creates an object which inherits the given prototype.\n *\n * Optionally, the created object can be extended further with the specified properties.\n *\n * @param {Object} prototype - the prototype to be inherited by the created object\n * @param {Object} [properties] - the optional properties to be extended by the created object\n * @return {Object} The newly created object.\n * @private\n */\n function createObject(prototype, properties) {\n var result;\n /* istanbul ignore next */\n if (typeof Object.create === 'function') {\n result = Object.create(prototype);\n } else {\n Constructor.prototype = prototype;\n result = new Constructor();\n Constructor.prototype = null;\n }\n\n if (properties) {\n extendObject(true, result, properties);\n }\n\n return result;\n }\n\n /**\n * Extends the constructor to which this method is associated with the prototype and/or\n * statics provided.\n *\n * If name is provided, it will be used as the class name and can be accessed via a special\n * class_ property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * toString), but this is not applicable to the lite version of Nevis.\n *\n * If constructor is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special super_ property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child constructor provided or the one created if none was given.\n * @public\n */\n function extend(name, constructor, prototype, statics) {\n var superConstructor = this;\n\n if (typeof name !== 'string') {\n statics = prototype;\n prototype = constructor;\n constructor = name;\n name = null;\n }\n\n if (typeof constructor !== 'function') {\n statics = prototype;\n prototype = constructor;\n constructor = function() {\n return superConstructor.apply(this, arguments);\n };\n }\n\n extendObject(false, constructor, superConstructor, statics);\n\n constructor.prototype = createObject(superConstructor.prototype, prototype);\n constructor.prototype.constructor = constructor;\n\n constructor.class_ = name || superConstructor.class_;\n constructor.super_ = superConstructor;\n\n return constructor;\n }\n\n /**\n * Extends the specified target object with the properties in each of the sources provided.\n *\n * if any source is null it will be ignored.\n *\n * @param {boolean} own - true to only copy own properties from sources onto\n * target; otherwise false\n * @param {Object} target - the target object which should be extended\n * @param {...Object} [sources] - the source objects whose properties are to be copied onto target\n * @return {void}\n * @private\n */\n function extendObject(own, target, sources) {\n sources = slice.call(arguments, 2);\n\n var property;\n var source;\n\n for (var i = 0, length = sources.length; i < length; i++) {\n source = sources[i];\n\n for (property in source) {\n if (!own || hasOwnProperty.call(source, property)) {\n target[property] = source[property];\n }\n }\n }\n }\n\n var extend_1 = extend;\n\n /**\n * The base class from which all others should extend.\n *\n * @public\n * @constructor\n */\n function Nevis() {}\n Nevis.class_ = 'Nevis';\n Nevis.super_ = Object;\n\n /**\n * Extends the constructor to which this method is associated with the prototype and/or\n * statics provided.\n *\n * If name is provided, it will be used as the class name and can be accessed via a special\n * class_ property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * toString), but this is not applicable to the lite version of Nevis.\n *\n * If constructor is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special super_ property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child constructor provided or the one created if none was given.\n * @public\n * @static\n * @memberof Nevis\n */\n Nevis.extend = extend_1;\n\n var nevis = Nevis;\n\n var lite = nevis;\n\n /**\n * Contains utility methods that are useful throughout the library.\n *\n * @public\n * @class\n * @extends Nevis\n */\n var Utilities = lite.extend(null, {\n\n /**\n * Iterates over own (not inherited) enumerable properties on the specified object.\n *\n * Nothing happens if object is null.\n *\n * @param {Object} object - the object whose own properties are to be iterated over\n * @param {Utilities~ForOwnCallback} callback - the function to be called with the value and key for each own property\n * on object\n * @param {Object} [context] - the value to use this when executing callback\n * @return {void}\n * @public\n * @static\n * @memberof Utilities\n */\n forOwn: function(object, callback, context) {\n if (!object) {\n return;\n }\n\n for (var key in object) {\n if (Utilities.hasOwn(object, key)) {\n callback.call(context, object[key], key, object);\n }\n }\n },\n\n /**\n * Returns whether the specified object has a property with the specified name as an own\n * (not inherited) property.\n *\n * @param {Object} object - the object on which the property is to be checked\n * @param {string} name - the name of the property to be checked\n * @return {boolean} true if object has an own property with name.\n * @public\n * @static\n * @memberof Utilities\n */\n hasOwn: function(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n },\n\n /**\n * Left pads the string provided with the given padding string for the specified number of\n * times.\n *\n * @param {string} [string=\"\"] - the string to be padded\n * @param {number} [times=0] - the number of times to pad string\n * @param {string} [padding=\" \"] - the padding string\n * @return {string} The padded string.\n * @public\n * @static\n * @memberof Utilities\n */\n leftPad: function(string, times, padding) {\n if (string == null) {\n string = '';\n }\n if (times == null) {\n times = 0;\n }\n if (padding == null) {\n padding = ' ';\n }\n if (!padding) {\n return string;\n }\n\n for (var i = 0; i < times; i++) {\n string = padding + string;\n }\n\n return string;\n }\n\n });\n\n var Utilities_1 = Utilities;\n\n /**\n * Called for each own enumerable property on object.\n *\n * @callback Utilities~ForOwnCallback\n * @param {*} value - the value of the property\n * @param {string} key - the name of the property\n * @param {Object} object - the object to which the property belongs\n * @return {void}\n */\n\n /**\n * Contains contextual information for a single conversion process.\n *\n * @param {Europa} europa - the {@link Europa} instance responsible for this conversion\n * @param {Europa~Options} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\n var Conversion = lite.extend(function(europa, options) {\n /**\n * The {@link Europa} instance responsible for this {@link Conversion}.\n *\n * @public\n * @type {Europa}\n * @memberof Conversion#\n */\n this.europa = europa;\n\n /**\n * The options for this {@link Conversion}.\n *\n * @public\n * @type {Europa~Options}\n * @memberof Conversion#\n */\n this.options = options;\n\n /**\n * Whether the buffer is at the start of the current line.\n *\n * @public\n * @type {boolean}\n * @memberof Conversion#\n */\n this.atLeft = true;\n\n /**\n * Whether any white space should be removed from the start of the next output.\n *\n * @public\n * @type {boolean}\n * @memberof Conversion#\n */\n this.atNoWhiteSpace = true;\n\n /**\n * Whether the buffer is at the start of a paragraph.\n *\n * @public\n * @type {boolean}\n * @memberof Conversion#\n */\n this.atParagraph = true;\n\n /**\n * The conversion output buffer to which the Markdown will be written.\n *\n * @public\n * @type {string}\n * @memberof Conversion#\n */\n this.buffer = '';\n\n /**\n * The context for this {@link Conversion}.\n *\n * @public\n * @type {Object.}\n * @memberof Conversion#\n */\n this.context = {};\n\n /**\n * Whether the buffer is currently within a code block.\n *\n * @public\n * @type {boolean}\n * @memberof Conversion#\n */\n this.inCodeBlock = false;\n\n /**\n * Whether the buffer is currently within an ordered list.\n *\n * @public\n * @type {boolean}\n * @memberof Conversion#\n */\n this.inOrderedList = false;\n\n /**\n * Whether the buffer is currently within a preformatted block.\n *\n * @public\n * @type {boolean}\n * @memberof Conversion#\n */\n this.inPreformattedBlock = false;\n\n /**\n * The last string to be output next to the buffer.\n *\n * @public\n * @type {string}\n * @memberof Conversion#\n */\n this.last = null;\n\n /**\n * The start of the current line.\n *\n * @public\n * @type {string}\n * @memberof Conversion#\n */\n this.left = '\\n';\n\n /**\n * The depth of nested lists.\n *\n * @public\n * @type {number}\n * @memberof Conversion#\n */\n this.listDepth = 0;\n\n /**\n * The one-based index for the current list item within the current list.\n *\n * @public\n * @type {number}\n * @memberof Conversion#\n */\n this.listIndex = 1;\n\n this._document = europa.document;\n this._element = null;\n this._tagName = null;\n this._window = europa.window;\n }, {\n\n /**\n * Appends the last output string to the buffer and then queues the specified string to be output.\n *\n * @param {string} string - the string to be appended\n * @return {Conversion} A reference to this {@link Conversion} for chaining purposes.\n * @public\n * @memberof Conversion#\n */\n append: function(string) {\n if (this.last != null) {\n this.buffer += this.last;\n }\n\n this.last = string;\n\n return this;\n },\n\n /**\n * Appends a paragraph to the output buffer.\n *\n * @return {Conversion} A reference to this {@link Conversion} for chaining purposes.\n * @public\n * @memberof Conversion#\n */\n appendParagraph: function() {\n if (this.atParagraph) {\n return this;\n }\n\n if (!this.atLeft) {\n this.append(this.left);\n\n this.atLeft = true;\n }\n\n this.append(this.left);\n\n this.atNoWhiteSpace = true;\n this.atParagraph = true;\n\n return this;\n },\n\n /**\n * Outputs the specified string to the buffer.\n *\n * Optionally, string can be \"cleaned\" before being output. Doing so will replace any certain special\n * characters as well as some white space.\n *\n * @param {string} string - the string to be output\n * @param {boolean} [clean=false] - true to clean string; otherwise false\n * @return {Conversion} A reference to this {@link Conversion} for chaining purposes.\n * @public\n * @memberof Conversion#\n */\n output: function(string, clean) {\n if (!string) {\n return this;\n }\n\n string = string.replace(/\\r\\n/g, '\\n');\n\n if (clean) {\n string = string.replace(/\\n([ \\t]*\\n)+/g, '\\n')\n .replace(/\\n[ \\t]+/g, '\\n')\n .replace(/[ \\t]+/g, ' ');\n\n Utilities_1.forOwn(Conversion.replacements, function(value, key) {\n string = string.replace(Conversion.replacementsRegExp[key], value);\n });\n }\n\n if (!this.inPreformattedBlock) {\n if (this.atNoWhiteSpace) {\n string = string.replace(/^[ \\t\\n]+/, '');\n } else if (/^[ \\t]*\\n/.test(string)) {\n string = string.replace(/^[ \\t\\n]+/, '\\n');\n } else {\n string = string.replace(/^[ \\t]+/, ' ');\n }\n }\n\n if (!string) {\n return this;\n }\n\n this.atLeft = /\\n$/.test(string);\n this.atNoWhiteSpace = /[ \\t\\n]$/.test(string);\n this.atParagraph = /\\n{2}$/.test(string);\n\n return this.append(string.replace(/\\n/g, this.left));\n },\n\n /**\n * Replaces the start of the current line with the string provided.\n *\n * @param {string} string - the string to replace the start of the current line\n * @return {Conversion} A reference to this {@link Conversion} for chaining purposes.\n * @public\n * @memberof Conversion#\n */\n replaceLeft: function(string) {\n if (!this.atLeft) {\n this.append(this.left.replace(/[ ]{2,4}$/, string));\n\n this.atLeft = true;\n this.atNoWhiteSpace = true;\n this.atParagraph = true;\n } else if (this.last) {\n this.last = this.last.replace(/[ ]{2,4}$/, string);\n }\n\n return this;\n }\n\n }, {\n\n /**\n * A map of special characters and their replacements.\n *\n * @public\n * @static\n * @type {Object.}\n * @memberof Conversion\n */\n replacements: {\n '\\\\\\\\': '\\\\\\\\',\n '\\\\[': '\\\\[',\n '\\\\]': '\\\\]',\n '>': '\\\\>',\n '_': '\\\\_',\n '\\\\*': '\\\\*',\n '`': '\\\\`',\n '#': '\\\\#',\n '([0-9])\\\\.(\\\\s|$)': '$1\\\\.$2',\n '\\u00a9': '(c)',\n '\\u00ae': '(r)',\n '\\u2122': '(tm)',\n '\\u00a0': ' ',\n '\\u00b7': '\\\\*',\n '\\u2002': ' ',\n '\\u2003': ' ',\n '\\u2009': ' ',\n '\\u2018': '\\'',\n '\\u2019': '\\'',\n '\\u201c': '\"',\n '\\u201d': '\"',\n '\\u2026': '...',\n '\\u2013': '--',\n '\\u2014': '---'\n },\n\n /**\n * A map of special characters and the regular expression used to identify them.\n *\n * @public\n * @static\n * @type {Object.}\n * @memberof Conversion\n */\n replacementsRegExp: {}\n\n });\n\n Object.defineProperties(Conversion.prototype, {\n\n document: {\n /**\n * Returns the current document for this {@link Conversion}.\n *\n * This may not be the same document as is associated with the {@link Europa} instance as this document may be\n * nested (e.g. a frame).\n *\n * @return {Document} The current document.\n * @public\n * @memberof Conversion#\n * @alias document\n */\n get: function() {\n return this._document;\n }\n },\n\n element: {\n /**\n * Returns the current element for this {@link Conversion}.\n *\n * @return {Element} The current element.\n * @public\n * @memberof Conversion#\n * @alias element\n */\n get: function() {\n return this._element;\n },\n\n /**\n * Sets the current element for this {@link Conversion} to element.\n *\n * @param {Element} element - the current element to be set\n * @return {void}\n * @public\n * @memberof Conversion#\n * @alias element\n */\n set: function(element) {\n this._element = element;\n this._tagName = element && element.tagName ? element.tagName.toLowerCase() : null;\n }\n },\n\n tagName: {\n /**\n * Returns the name of the tag for the current element for this {@link Conversion}.\n *\n * The tag name will always be in lower case, when available.\n *\n * @return {string} The current element's tag name.\n * @public\n * @memberof Conversion#\n * @alias tagName\n */\n get: function() {\n return this._tagName;\n }\n },\n\n window: {\n /**\n * Returns the current window for this {@link Conversion}.\n *\n * This may not be the same window as is associated with the {@link Europa} instance as this window may be nested\n * (e.g. a frame).\n *\n * @return {Window} The current window.\n * @public\n * @memberof Conversion#\n * @alias window\n */\n get: function() {\n return this._window;\n },\n\n /**\n * Sets the current window for this {@link Conversion} to window.\n *\n * This may not be the same window as is associated with the {@link Europa} instance as this window may be nested\n * (e.g. a frame).\n *\n * @param {Window} window - the window to be set\n * @return {void}\n * @public\n * @memberof Conversion#\n * @alias window\n */\n set: function(window) {\n this._window = window;\n this._document = window ? window.document : null;\n }\n }\n\n });\n\n Utilities_1.forOwn(Conversion.replacements, function(value, key) {\n Conversion.replacementsRegExp[key] = new RegExp(key, 'g');\n });\n\n var Conversion_1 = Conversion;\n\n /**\n * Contains utility methods that are useful when dealing with the DOM.\n *\n * @public\n * @class\n * @extends Nevis\n */\n var DOMUtilities = lite.extend(null, {\n\n /**\n * Checks whether the specified element is currently visible using the window provided.\n *\n * This is not a very sophisticated check and could easily be mistaken, but it should catch a lot of the most simple\n * cases.\n *\n * @param {Element} element - the element whose visibility is to be checked\n * @param {Window} window - the window to be used\n * @return {boolean} true if element is visible; otherwise false.\n * @public\n * @static\n * @memberof DOMUtilities\n */\n isVisible: function(element, window) {\n var style = window.getComputedStyle(element);\n\n return style.getPropertyValue('display') !== 'none' && style.getPropertyValue('visibility') !== 'hidden';\n }\n\n });\n\n var DOMUtilities_1 = DOMUtilities;\n\n /**\n * Defines an available option.\n *\n * If defaultValue is a function, it will be called if/when needed and the return value will be used as the\n * default value. If the default value is to be a function itself, then defaultValue must return that\n * function.\n *\n * @param {string} name - the name to be used\n * @param {*} [defaultValue] - the default value to be used\n * @public\n * @class\n * @extends Nevis\n */\n var Option = lite.extend(function(name, defaultValue) {\n /**\n * The name for this {@link Option}.\n *\n * @public\n * @type {string}\n * @memberof Option#\n */\n this.name = name;\n\n this._defaultValue = defaultValue;\n });\n\n Object.defineProperty(Option.prototype, 'defaultValue', {\n /**\n * Returns the default value for this {@link Option}.\n *\n * @return {*} The default value.\n * @public\n * @memberof Option#\n * @alias defaultValue\n */\n get: function() {\n var defaultValue = this._defaultValue;\n\n return typeof defaultValue === 'function' ? defaultValue.call(this) : defaultValue;\n }\n });\n\n var Option_1 = Option;\n\n /**\n * Manages multiple {@link Option} instances that are intended to be used by multiple implementations/instances.\n *\n * @param {Option[]} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\n var OptionParser = lite.extend(function(options) {\n /**\n * The available options for this {@link OptionParser}.\n *\n * @public\n * @type {Option[]}\n * @memberof OptionParser#\n */\n this.options = options;\n }, {\n\n /**\n * Returns whether an option with the specified name is available.\n *\n * @param {string} name - the name of the {@link Option} whose existence is to be checked\n * @return {boolean} true if an {@link Option} exists with name; otherwise\n * false.\n * @public\n * @memberof OptionParser#\n */\n exists: function(name) {\n return this.options.some(function(option) {\n return option.name === name;\n });\n },\n\n /**\n * Parses the specified options, extracting only properties that match valid options and applying default\n * values where required.\n *\n * @param {Object} [options] - the options to be parsed\n * @return {Object.} The parsed options.\n * @public\n * @memberof OptionParser#\n */\n parse: function(options) {\n if (!options) {\n options = {};\n }\n\n var result = {};\n\n this.options.forEach(function(option) {\n var name = option.name;\n var value = options[name] != null ? options[name] : option.defaultValue;\n\n result[name] = value;\n });\n\n return result;\n }\n\n });\n\n var OptionParser_1 = OptionParser;\n\n /**\n * A plugin that can tap into multiple parts in the conversion process while being specific to only a sub-set of tags.\n *\n * @public\n * @class\n * @extends Nevis\n */\n var Plugin = lite.extend({\n\n /**\n * Called after {@link Plugin#convert} and only once all children elements have been converted as well,\n * provided they weren't skipped, and intended for tidying up after the conversion.\n *\n * context can be used to receive any state for a single element conversion from {@link Plugin#before}\n * and {@link Plugin#convert}.\n *\n * @param {Conversion} conversion - the current {@link Conversion}\n * @param {Object.} context - the current context for this {@link Plugin}\n * @return {void}\n * @public\n * @memberof Plugin#\n */\n after: function(conversion, context) {},\n\n /**\n * Called before any elements are converted and intended to setup this {@link Plugin} initially.\n *\n * @param {Conversion} conversion - the current {@link Conversion}\n * @return {void}\n * @public\n * @memberof Plugin#\n */\n afterAll: function(conversion) {},\n\n /**\n * Called immediately before {@link Plugin#convert} and intended for preparing this {@link Plugin} for conversion.\n *\n * context can be used to pass any state for a single element conversion to {@link Plugin#convert} and\n * then to {@link Plugin#after}.\n *\n * @param {Conversion} conversion - the current {@link Conversion}\n * @param {Object.} context - the current context for this {@link Plugin}\n * @return {void}\n * @public\n * @memberof Plugin#\n */\n before: function(conversion, context) {},\n\n /**\n * Called after all elements have been converted and intended to completing any steps for this {@link Plugin}.\n *\n * @param {Conversion} conversion - the current {@link Conversion}\n * @return {void}\n * @public\n * @memberof Plugin#\n */\n beforeAll: function(conversion) {},\n\n /**\n * Converts the current element within the specified conversion which can be used to provide control over\n * the conversion and returns whether the children of the element should be converted.\n *\n * context can be used to pass any state for a single element conversion from {@link Plugin#before} to\n * {@link Plugin#after}.\n *\n * @param {Conversion} conversion - the current {@link Conversion}\n * @param {Object.} context - the current context for this {@link Plugin}\n * @return {boolean} true if the children of the current element should be converted; otherwise\n * false.\n * @public\n * @memberof Plugin#\n */\n convert: function(conversion, context) {\n return true;\n },\n\n /**\n * Returns the names of tags with which this {@link Plugin} should be registered to handle.\n *\n * @return {string[]} The names of supported tags.\n * @public\n * @memberof Plugin#\n */\n getTagNames: function() {\n return [];\n }\n\n });\n\n var Plugin_1 = Plugin;\n\n /**\n * A basic manager for {@link Service} implementations that are mapped to simple names.\n *\n * @public\n * @class\n * @extends Nevis\n */\n var ServiceManager = lite.extend(function() {\n this._services = {};\n }, {\n\n /**\n * Returns the {@link Service} being managed with the specified name.\n *\n * @param {string} name - the name of the {@link Service} to be returned\n * @return {Service} The {@link Service} is being managed with name.\n * @throws {Error} If no {@link Service} is being managed with name.\n * @public\n * @memberof ServiceManager#\n */\n getService: function(name) {\n var service = this._services[name];\n if (!service) {\n throw new Error('Service is not being managed with name: ' + name);\n }\n\n return service;\n },\n\n /**\n * Sets the {@link Service} implementation to be managed for the specified name to the\n * service provided.\n *\n * @param {string} name - the name of the {@link Service} to be managed with name\n * @param {Service} service - the {@link Service} implementation to be managed\n * @return {void}\n * @throws {Error} If a {@link Service} is already being managed with the same name.\n * @public\n * @memberof ServiceManager#\n */\n setService: function(name, service) {\n if (this._services[name]) {\n throw new Error('Service is already managed with name: ' + name);\n }\n\n if (service) {\n this._services[name] = service;\n }\n }\n\n });\n\n var ServiceManager_1 = ServiceManager;\n\n var plugins = {};\n var serviceManager = new ServiceManager_1();\n\n /**\n * Enables configuration of a HTML to Markdown converter that supports HTML strings and DOM elements.\n *\n * @param {Europa~Options} [options] - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\n var Europa = lite.extend(function(options) {\n this._options = new OptionParser_1([\n new Option_1('absolute', false),\n new Option_1('baseUri', function() {\n return serviceManager.getService('window').getDefaultBaseUri();\n }),\n new Option_1('inline', false)\n ])\n .parse(options);\n this._window = null;\n }, {\n\n /**\n * Converts the specified html into Markdown based on the options configured for this {@link Europa}\n * instance.\n *\n * html can either be an HTML string or a DOM element whose HTML contents are to be converted into\n * Markdown.\n *\n * @param {Element|string} html - the HTML (or element whose inner HTML is) to be converted into Markdown\n * @return {string} The Markdown converted from html.\n * @public\n * @memberof Europa#\n */\n convert: function(html) {\n if (!html) {\n return '';\n }\n\n var document = this.document;\n var root;\n\n if (typeof html === 'string') {\n root = document.createElement('div');\n root.innerHTML = html;\n } else {\n root = html;\n }\n\n var conversion = new Conversion_1(this, this._options);\n var wrapper;\n\n if (!document.contains(root)) {\n wrapper = document.createElement('div');\n wrapper.style.display = 'none';\n wrapper.appendChild(root);\n\n document.body.appendChild(wrapper);\n }\n\n try {\n Utilities_1.forOwn(plugins, function(plugin) {\n plugin.beforeAll(conversion);\n });\n\n this.convertElement(root, conversion);\n\n Utilities_1.forOwn(plugins, function(plugin) {\n plugin.afterAll(conversion);\n });\n } finally {\n if (wrapper) {\n document.body.removeChild(wrapper);\n\n wrapper.removeChild(root);\n }\n }\n\n return conversion.append('').buffer.trim();\n },\n\n /**\n * Converts the specified element and it's children into Markdown using the conversion\n * provided.\n *\n * Nothing happens if element is null or is invisible (simplified detection used).\n *\n * @param {Element} element - the element (along well as it's children) to be converted into Markdown\n * @param {Conversion} conversion - the current {@link Conversion}\n * @return {void}\n * @public\n * @memberof Europa#\n */\n convertElement: function(element, conversion) {\n if (!element) {\n return;\n }\n\n var convertChildren = false;\n var window = this.window;\n var context, i, plugin, value;\n\n if (element.nodeType === window.Node.ELEMENT_NODE) {\n if (!DOMUtilities_1.isVisible(element, window)) {\n return;\n }\n\n conversion.element = element;\n\n context = {};\n plugin = plugins[conversion.tagName];\n convertChildren = true;\n\n if (plugin) {\n plugin.before(conversion, context);\n convertChildren = plugin.convert(conversion, context);\n }\n\n if (convertChildren) {\n for (i = 0; i < element.childNodes.length; i++) {\n this.convertElement(element.childNodes[i], conversion);\n }\n }\n\n if (plugin) {\n plugin.after(conversion, context);\n }\n } else if (element.nodeType === window.Node.TEXT_NODE) {\n value = element.nodeValue || '';\n\n if (conversion.inPreformattedBlock) {\n conversion.output(value);\n } else if (conversion.inCodeBlock) {\n conversion.output(value.replace(/`/g, '\\\\`'));\n } else {\n conversion.output(value, true);\n }\n }\n },\n\n /**\n * Releases the window used by this {@link Europa} instance.\n *\n * This allows closeable {@link WindowService} implementations to close the window and free up resources. However,\n * this instance can and will simply retrieve another window from the {@link WindowService} the next time it is\n * required (i.e. {@link Europa#convert} is called).\n *\n * @return {Europa} A reference to this {@link Europa} for chaining purposes.\n * @public\n * @memberof Europa#\n */\n release: function() {\n if (this._window) {\n serviceManager.getService('window').closeWindow(this._window);\n this._window = null;\n }\n\n return this;\n }\n\n }, {\n\n /**\n * A convient reference to {@link Plugin} exposed on {@link Europa} for cases where Europa Core is bundled.\n *\n * @public\n * @static\n * @type {Function}\n * @memberof Europa\n */\n Plugin: Plugin_1,\n\n /**\n * Registers the specified plugin to be used by all {@link Europa} instances.\n *\n * If plugin declares support for a tag name which already has a {@link Plugin} registered for it,\n * plugin will replace the previously registered plugin, but only for conflicting tag names.\n *\n * @param {Plugin} plugin - the {@link Plugin} to be registered\n * @return {void}\n * @public\n * @static\n * @memberof Europa\n */\n register: function(plugin) {\n plugin.getTagNames().forEach(function(tag) {\n plugins[tag] = plugin;\n });\n },\n\n /**\n * Configures the service provided to be used by all {@link Europa} instances.\n *\n * @param {Service} service - the {@link Service} to be configured\n * @return {void}\n * @throws {Error} If a {@link Service} has already been configured with the same name.\n * @public\n * @static\n * @memberof Europa\n */\n use: function(service) {\n serviceManager.setService(service.getName(), service);\n }\n\n });\n\n Object.defineProperties(Europa.prototype, {\n\n document: {\n /**\n * Returns the document to be used for HTML to Markdown conversion by this {@link Europa} instance.\n *\n * @return {Document} The document.\n * @public\n * @memberof Europa#\n * @alias document\n */\n get: function() {\n return this.window.document;\n }\n },\n\n window: {\n /**\n * Returns the window to be used for HTML to Markdown conversion by this {@link Europa} instance.\n *\n * @return {Window} The window.\n * @public\n * @memberof Europa#\n * @alias window\n */\n get: function() {\n if (!this._window) {\n this._window = serviceManager.getService('window').getWindow(this._options.baseUri);\n }\n\n return this._window;\n }\n }\n\n });\n\n var Europa_1$2 = Europa;\n\n /**\n * The options used by {@link Europa}.\n *\n * @typedef {Object} Europa~Options\n * @property {boolean} [absolute=false] - Whether absolute URLS should be used for anchors/images.\n * @property {string} [baseUri] - The base URI for the window. This is ignored in environments where the base URI cannot\n * be changed.\n * @property {boolean} [inline=false] - Whether anchor/image URLs are to be inserted inline.\n */\n\n /**\n * A {@link Plugin} which extracts the URL from an anchor. Anchors without an href are treated as plain\n * text.\n *\n * If the absolute option is enabled, then the URL extracted from the anchor will be absolute. Otherwise,\n * the URL will be exactly as it is in the href attribute.\n *\n * If the inline option is enabled, then the URL (and any title on the anchor) will be\n * inserted immediately after the anchor contents (e.g. [foo](/bar)). Otherwise, all unique URL and title\n * combinations will be indexed (e.g. [foo][anchor0]) and the references will be output at the very end.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var AnchorPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n if (context.value != null) {\n conversion.output(']' + context.value);\n }\n },\n\n /**\n * @override\n */\n afterAll: function(conversion) {\n var anchors = conversion.context.anchors;\n if (!anchors.length) {\n return;\n }\n\n conversion.append('\\n\\n');\n\n for (var i = 0; i < anchors.length; i++) {\n conversion.append('[anchor' + i + ']: ' + anchors[i] + '\\n');\n }\n },\n\n /**\n * @override\n */\n beforeAll: function(conversion) {\n conversion.context.anchorMap = {};\n conversion.context.anchors = [];\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var element = conversion.element;\n var options = conversion.options;\n var href = options.absolute ? element.href : element.getAttribute('href');\n if (!href) {\n return true;\n }\n\n var anchorMap = conversion.context.anchorMap;\n var anchors = conversion.context.anchors;\n var title = element.getAttribute('title');\n var value = title ? href + ' \"' + title + '\"' : href;\n var index;\n\n if (options.inline) {\n context.value = '(' + value + ')';\n } else {\n index = anchorMap[value];\n if (index == null) {\n index = anchors.push(value) - 1;\n\n anchorMap[value] = index;\n }\n\n context.value = '[anchor' + index + ']';\n }\n\n conversion.output('[');\n\n conversion.atNoWhiteSpace = true;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'a' ];\n }\n\n });\n\n Europa_1$2.register(new AnchorPlugin());\n\n /**\n * A {@link Plugin} which outputs the contents in a block quote.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var BlockQuotePlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.atLeft = false;\n conversion.atParagraph = false;\n conversion.left = context.previousLeft;\n\n conversion.appendParagraph();\n },\n\n /**\n * @override\n */\n before: function(conversion, context) {\n context.previousLeft = conversion.left;\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var value = '> ';\n\n conversion.left += value;\n\n if (conversion.atParagraph) {\n conversion.append(value);\n } else {\n conversion.appendParagraph();\n }\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'blockquote',\n 'dd'\n ];\n }\n\n });\n\n Europa_1$2.register(new BlockQuotePlugin());\n\n /**\n * A {@link Plugin} which outputs an inline line break.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var BreakPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion.append(' ' + conversion.left);\n\n conversion.atLeft = true;\n conversion.atNoWhiteSpace = true;\n\n return false;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'br' ];\n }\n\n });\n\n Europa_1$2.register(new BreakPlugin());\n\n /**\n * A {@link Plugin} which outputs the contents in a code block.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var CodePlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n if (!context.skipped) {\n conversion.inCodeBlock = context.previousInCodeBlock;\n\n conversion.output('`');\n }\n },\n\n /**\n * @override\n */\n before: function(conversion, context) {\n context.previousInCodeBlock = conversion.inCodeBlock;\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n if (conversion.inPreformattedBlock) {\n context.skipped = true;\n } else {\n conversion.output('`');\n\n conversion.inCodeBlock = true;\n }\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'code',\n 'kbd',\n 'samp'\n ];\n }\n\n });\n\n Europa_1$2.register(new CodePlugin());\n\n /**\n * A {@link Plugin} which outputs a definition term as strong text.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var DefinitionTermPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.output('**');\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion.appendParagraph();\n\n conversion.output('**');\n\n conversion.atNoWhiteSpace = true;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'dt' ];\n }\n\n });\n\n Europa_1$2.register(new DefinitionTermPlugin());\n\n /**\n * A {@link Plugin} which outputs a details section.\n *\n * If the details has an open attribute then all of its children are converted. Otherwise, only the nested\n * summary, if any, will be converted.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var DetailsPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var element = conversion.element;\n\n conversion.appendParagraph();\n\n if (element.hasAttribute('open')) {\n return true;\n }\n\n var summary = element.querySelector('summary');\n conversion.europa.convertElement(summary, conversion);\n\n return false;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'details' ];\n }\n\n });\n\n Europa_1$2.register(new DetailsPlugin());\n\n /**\n * A {@link Plugin} which outputs as emphasised text.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var EmphasisPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.output('_');\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion.output('_');\n\n conversion.atNoWhiteSpace = true;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'cite',\n 'dfn',\n 'em',\n 'i',\n 'u',\n 'var'\n ];\n }\n\n });\n\n Europa_1$2.register(new EmphasisPlugin());\n\n /**\n * A {@link Plugin} which simply ensures that no children elements are converted.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var EmptyPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n return false;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'applet',\n 'area',\n 'audio',\n 'button',\n 'canvas',\n 'datalist',\n 'embed',\n 'head',\n 'input',\n 'map',\n 'menu',\n 'meter',\n 'noframes',\n 'noscript',\n 'object',\n 'optgroup',\n 'option',\n 'param',\n 'progress',\n 'rp',\n 'rt',\n 'ruby',\n 'script',\n 'select',\n 'style',\n 'textarea',\n 'title',\n 'video'\n ];\n }\n\n });\n\n Europa_1$2.register(new EmptyPlugin());\n\n /**\n * A {@link Plugin} which outputs the contents of nested frame.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var FramePlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.window = context.previousWindow;\n },\n\n /**\n * @override\n */\n before: function(conversion, context) {\n context.previousWindow = conversion.window;\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var window = conversion.element.contentWindow;\n\n if (window) {\n conversion.window = window;\n\n conversion.europa.convertElement(window.document.body, conversion);\n }\n\n return false;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'frame', 'iframe' ];\n }\n\n });\n\n Europa_1$2.register(new FramePlugin());\n\n /**\n * A {@link Plugin} which outputs a heading of various levels.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var HeadingPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var level = parseInt(conversion.tagName.match(/([1-6])$/)[1], 10);\n\n conversion.appendParagraph();\n\n var heading = '';\n for (var i = 0; i < level; i++) {\n heading += '#';\n }\n\n conversion.output(heading + ' ');\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6'\n ];\n }\n\n });\n\n Europa_1$2.register(new HeadingPlugin());\n\n /**\n * A {@link Plugin} which outputs a horizontal rule.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var HorizontalRulePlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion\n .appendParagraph()\n .output('---')\n .appendParagraph();\n\n return false;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'hr' ];\n }\n\n });\n\n Europa_1$2.register(new HorizontalRulePlugin());\n\n /**\n * A {@link Plugin} which extracts the URL from an image.\n *\n * If the absolute option is enabled, then the URL extracted from the image will be absolute. Otherwise,\n * the URL will be exactly as it is in the src attribute.\n *\n * If the inline option is enabled, then the URL will be inserted immediately after the alt on\n * the image (e.g. ![foo](/bar.png)). Otherwise, all unique URLs will be indexed\n * (e.g. ![foo][image0]) and the references will be output at the very end.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var ImagePlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n afterAll: function(conversion) {\n var images = conversion.context.images;\n if (!images.length) {\n return;\n }\n\n conversion.append('\\n\\n');\n\n for (var i = 0; i < images.length; i++) {\n conversion.append('[image' + i + ']: ' + images[i] + '\\n');\n }\n },\n\n /**\n * @override\n */\n beforeAll: function(conversion) {\n conversion.context.imageMap = {};\n conversion.context.images = [];\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var element = conversion.element;\n var options = conversion.options;\n var source = options.absolute ? element.src : element.getAttribute('src');\n if (!source) {\n return false;\n }\n\n var alternativeText = element.getAttribute('alt') || '';\n var imageMap = conversion.context.imageMap;\n var images = conversion.context.images;\n var title = element.getAttribute('title');\n var value = title ? source + ' \"' + title + '\"' : source;\n var index;\n\n if (options.inline) {\n value = '(' + value + ')';\n } else {\n index = imageMap[value];\n if (index == null) {\n index = images.push(value) - 1;\n\n imageMap[value] = index;\n }\n\n value = '[image' + index + ']';\n }\n\n conversion.output('![' + alternativeText + ']' + value);\n\n return false;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'img' ];\n }\n\n });\n\n Europa_1$2.register(new ImagePlugin());\n\n /**\n * A {@link Plugin} which outputs a list item. The prefix for the list item will vary depending on what type of list the\n * item is contained within.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var ListItemPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var value = conversion.inOrderedList ? conversion.listIndex++ + '. ' : '* ';\n\n if (!conversion.atLeft) {\n conversion.append(conversion.left.replace(/[ ]{2,4}$/, '\\n'));\n\n conversion.atLeft = true;\n conversion.atNoWhiteSpace = true;\n conversion.atParagraph = true;\n } else if (conversion.last) {\n conversion.last = conversion.last.replace(/[ ]{2,4}$/, '\\n');\n }\n\n conversion.append(Utilities_1.leftPad(value, (conversion.listDepth - 1) * 2));\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'li' ];\n }\n\n });\n\n Europa_1$2.register(new ListItemPlugin());\n\n /**\n * A {@link Plugin} which outputs an ordered list.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var OrderedListPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.inOrderedList = context.previousInOrderedList;\n conversion.listIndex = context.previousListIndex;\n conversion.listDepth--;\n },\n\n /**\n * @override\n */\n before: function(conversion, context) {\n context.previousInOrderedList = conversion.inOrderedList;\n context.previousListIndex = conversion.listIndex;\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n if (conversion.listDepth === 0) {\n conversion.appendParagraph();\n }\n\n conversion.inOrderedList = true;\n conversion.listIndex = 1;\n conversion.listDepth++;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'ol' ];\n }\n\n });\n\n Europa_1$2.register(new OrderedListPlugin());\n\n /**\n * A {@link Plugin} which outputs a paragraph.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var ParagraphPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion.appendParagraph();\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'address',\n 'article',\n 'aside',\n 'div',\n 'fieldset',\n 'footer',\n 'header',\n 'nav',\n 'p',\n 'section'\n ];\n }\n\n });\n\n Europa_1$2.register(new ParagraphPlugin());\n\n /**\n * A {@link Plugin} which outputs the contents in a preformatted block.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var PreformattedPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.atLeft = false;\n conversion.atParagraph = false;\n conversion.inPreformattedBlock = context.previousInPreformattedBlock;\n conversion.left = context.previousLeft;\n\n conversion.appendParagraph();\n },\n\n /**\n * @override\n */\n before: function(conversion, context) {\n context.previousInPreformattedBlock = conversion.inPreformattedBlock;\n context.previousLeft = conversion.left;\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n var value = ' ';\n\n conversion.left += value;\n\n if (conversion.atParagraph) {\n conversion.append(value);\n } else {\n conversion.appendParagraph();\n }\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'pre' ];\n }\n\n });\n\n Europa_1$2.register(new PreformattedPlugin());\n\n /**\n * A {@link Plugin} which outputs as quoted text.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var QuotePlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.output('\"');\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion.output('\"');\n\n conversion.atNoWhiteSpace = true;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'q' ];\n }\n\n });\n\n Europa_1$2.register(new QuotePlugin());\n\n /**\n * A {@link Plugin} which outputs as strong text.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var StrongPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.output('**');\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n conversion.output('**');\n\n conversion.atNoWhiteSpace = true;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [\n 'b',\n 'strong'\n ];\n }\n\n });\n\n Europa_1$2.register(new StrongPlugin());\n\n /**\n * A {@link Plugin} which outputs an unordered list.\n *\n * @public\n * @class\n * @extends Plugin\n */\n var UnorderedListPlugin = Plugin_1.extend({\n\n /**\n * @override\n */\n after: function(conversion, context) {\n conversion.inOrderedList = context.previousInOrderedList;\n conversion.listIndex = context.previousListIndex;\n conversion.listDepth--;\n },\n\n /**\n * @override\n */\n before: function(conversion, context) {\n context.previousInOrderedList = conversion.inOrderedList;\n context.previousListIndex = conversion.listIndex;\n },\n\n /**\n * @override\n */\n convert: function(conversion, context) {\n if (conversion.listDepth === 0) {\n conversion.appendParagraph();\n }\n\n conversion.inOrderedList = false;\n conversion.listIndex = 1;\n conversion.listDepth++;\n\n return true;\n },\n\n /**\n * @override\n */\n getTagNames: function() {\n return [ 'ul' ];\n }\n\n });\n\n Europa_1$2.register(new UnorderedListPlugin());\n\n var index = Europa_1$2;\n\n /**\n * Defines a service contract that must be met by all implementations.\n *\n * @public\n * @class\n * @extends Nevis\n */\n var Service = lite.extend({\n\n /**\n * Returns the name of this {@link Service}.\n *\n * @return {string} The service name.\n * @public\n * @abstract\n * @memberof Service#\n */\n getName: function() {}\n\n });\n\n var Service_1 = Service;\n\n /**\n * A service used to retrieve the window object for converting HTML to Markdown and, optionally, to close it upon\n * destruction of the {@link Europa} instance. This can be useful to free up resources as/when required in an artificial\n * browser environment.\n *\n * @public\n * @class\n * @extends Service\n */\n var WindowService = Service_1.extend({\n\n /**\n * Closes the specified window but only if this {@link WindowService} is closeable.\n *\n * @param {Window} window - the window to be closed\n * @return {void}\n * @public\n * @memberof WindowService#\n */\n closeWindow: function(window) {\n if (this.isCloseable(window)) {\n window.close();\n }\n },\n\n /**\n * Returns the default base URI for windows provided by this {@link WindowService}.\n *\n * Implementations of {@link WindowService} must override this method with their own specific logic.\n *\n * @return {string} The default base URI.\n * @public\n * @abstract\n * @memberof WindowService#\n */\n getDefaultBaseUri: function() {},\n\n /**\n * @override\n */\n getName: function() {\n return 'window';\n },\n\n /**\n * Returns a window to be used for converting HTML to Markdown using the base URI provided.\n *\n * It's important to note that the base URI cannot be changed in some environments, in which case baseUri\n * will be ignored.\n *\n * Implementations of {@link WindowService} must override this method with their own specific logic.\n *\n * @param {string} baseUri - the base URI to be used\n * @return {Window} The window.\n * @public\n * @abstract\n * @memberof WindowService#\n */\n getWindow: function(baseUri) {},\n\n /**\n * Returns whether the specified window which was retrieved by this {@link WindowService} is closeable.\n *\n * The default implementation of this method will always return false.\n *\n * @param {Window} window - the window to be checked\n * @return {boolean} true if window is closeable; otherwise false.\n * @public\n * @memberof WindowService#\n */\n isCloseable: function(window) {\n return false;\n }\n\n });\n\n var WindowService_1 = WindowService;\n\n /**\n * An implementation of {@link WindowService} intended for use within a browser environment.\n *\n * @public\n * @class\n * @extends WindowService\n */\n var BrowserWindowService = WindowService_1.extend({\n\n /**\n * @override\n */\n getDefaultBaseUri: function() {\n return window.document.baseURI;\n },\n\n /**\n * @override\n */\n getWindow: function(baseUri) {\n return window;\n }\n\n });\n\n var BrowserWindowService_1 = BrowserWindowService;\n\n index.use(new BrowserWindowService_1());\n\n var Europa_1 = index;\n\n return Europa_1;\n\n})));\n\n//# sourceMappingURL=europa.js.map","/*global require,module*/\r\n'use strict';\r\nvar CodeMirror = require('codemirror');\r\nrequire('codemirror/addon/edit/continuelist.js');\r\nrequire('./codemirror/tablist');\r\nrequire('codemirror/addon/display/fullscreen.js');\r\nrequire('codemirror/mode/markdown/markdown.js');\r\nrequire('codemirror/addon/mode/overlay.js');\r\nrequire('codemirror/addon/display/placeholder.js');\r\nrequire('codemirror/addon/selection/mark-selection.js');\r\nrequire('codemirror/mode/gfm/gfm.js');\r\nrequire('codemirror/mode/xml/xml.js');\r\nvar CodeMirrorSpellChecker = require('codemirror-spell-checker');\r\nvar marked = require('marked');\r\n\r\n\r\n// Some variables\r\nvar isMac = /Mac/.test(navigator.platform);\r\n\r\n// Mapping of actions that can be bound to keyboard shortcuts or toolbar buttons\r\nvar bindings = {\r\n 'toggleBold': toggleBold,\r\n 'toggleItalic': toggleItalic,\r\n 'drawLink': drawLink,\r\n 'toggleHeadingSmaller': toggleHeadingSmaller,\r\n 'toggleHeadingBigger': toggleHeadingBigger,\r\n 'drawImage': drawImage,\r\n 'toggleBlockquote': toggleBlockquote,\r\n 'toggleOrderedList': toggleOrderedList,\r\n 'toggleUnorderedList': toggleUnorderedList,\r\n 'toggleCodeBlock': toggleCodeBlock,\r\n 'togglePreview': togglePreview,\r\n 'toggleStrikethrough': toggleStrikethrough,\r\n 'toggleHeading1': toggleHeading1,\r\n 'toggleHeading2': toggleHeading2,\r\n 'toggleHeading3': toggleHeading3,\r\n 'cleanBlock': cleanBlock,\r\n 'drawTable': drawTable,\r\n 'drawHorizontalRule': drawHorizontalRule,\r\n 'undo': undo,\r\n 'redo': redo,\r\n 'toggleSideBySide': toggleSideBySide,\r\n 'toggleFullScreen': toggleFullScreen\r\n};\r\n\r\nvar shortcuts = {\r\n 'toggleBold': 'Cmd-B',\r\n 'toggleItalic': 'Cmd-I',\r\n 'drawLink': 'Cmd-K',\r\n 'toggleHeadingSmaller': 'Cmd-H',\r\n 'toggleHeadingBigger': 'Shift-Cmd-H',\r\n 'cleanBlock': 'Cmd-E',\r\n 'drawImage': 'Cmd-Alt-I',\r\n 'toggleBlockquote': 'Cmd-\\'',\r\n 'toggleOrderedList': 'Cmd-Alt-L',\r\n 'toggleUnorderedList': 'Cmd-L',\r\n 'toggleCodeBlock': 'Cmd-Alt-C',\r\n 'togglePreview': 'Cmd-P',\r\n 'toggleSideBySide': 'F9',\r\n 'toggleFullScreen': 'F11'\r\n};\r\n\r\nvar getBindingName = function (f) {\r\n for (var key in bindings) {\r\n if (bindings[key] === f) {\r\n return key;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nvar isMobile = function () {\r\n var check = false;\r\n (function (a) {\r\n if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(a.substr(0, 4))) check = true;\r\n })(navigator.userAgent || navigator.vendor || window.opera);\r\n return check;\r\n};\r\n\r\n\r\n/**\r\n * Fix shortcut. Mac use Command, others use Ctrl.\r\n */\r\nfunction fixShortcut(name) {\r\n if (isMac) {\r\n name = name.replace('Ctrl', 'Cmd');\r\n } else {\r\n name = name.replace('Cmd', 'Ctrl');\r\n }\r\n return name;\r\n}\r\n\r\n\r\n/**\r\n * Create icon element for toolbar.\r\n */\r\nfunction createIcon(options, enableTooltips, shortcuts) {\r\n options = options || {};\r\n var el = document.createElement('button');\r\n enableTooltips = (enableTooltips == undefined) ? true : enableTooltips;\r\n\r\n if (options.title && enableTooltips) {\r\n el.title = createTooltip(options.title, options.action, shortcuts);\r\n\r\n if (isMac) {\r\n el.title = el.title.replace('Ctrl', '⌘');\r\n el.title = el.title.replace('Alt', '⌥');\r\n }\r\n }\r\n\r\n if (options.noDisable) {\r\n el.classList.add('no-disable');\r\n }\r\n\r\n if (options.noMobile) {\r\n el.classList.add('no-mobile');\r\n }\r\n\r\n el.tabIndex = -1;\r\n\r\n // Create icon element and append as a child to the button\r\n var icon = document.createElement('i');\r\n icon.className = options.className;\r\n el.appendChild(icon);\r\n\r\n return el;\r\n}\r\n\r\nfunction createSep() {\r\n var el = document.createElement('i');\r\n el.className = 'separator';\r\n el.innerHTML = '|';\r\n return el;\r\n}\r\n\r\nfunction createTooltip(title, action, shortcuts) {\r\n var actionName;\r\n var tooltip = title;\r\n\r\n if (action) {\r\n actionName = getBindingName(action);\r\n if (shortcuts[actionName]) {\r\n tooltip += ' (' + fixShortcut(shortcuts[actionName]) + ')';\r\n }\r\n }\r\n\r\n return tooltip;\r\n}\r\n\r\n/**\r\n * The state of CodeMirror at the given position.\r\n */\r\nfunction getState(cm, pos) {\r\n pos = pos || cm.getCursor('start');\r\n var stat = cm.getTokenAt(pos);\r\n if (!stat.type) return {};\r\n\r\n var types = stat.type.split(' ');\r\n\r\n var ret = {},\r\n data, text;\r\n for (var i = 0; i < types.length; i++) {\r\n data = types[i];\r\n if (data === 'strong') {\r\n ret.bold = true;\r\n } else if (data === 'variable-2') {\r\n text = cm.getLine(pos.line);\r\n if (/^\\s*\\d+\\.\\s/.test(text)) {\r\n ret['ordered-list'] = true;\r\n } else {\r\n ret['unordered-list'] = true;\r\n }\r\n } else if (data === 'atom') {\r\n ret.quote = true;\r\n } else if (data === 'em') {\r\n ret.italic = true;\r\n } else if (data === 'quote') {\r\n ret.quote = true;\r\n } else if (data === 'strikethrough') {\r\n ret.strikethrough = true;\r\n } else if (data === 'comment') {\r\n ret.code = true;\r\n } else if (data === 'link') {\r\n ret.link = true;\r\n } else if (data === 'tag') {\r\n ret.image = true;\r\n } else if (data.match(/^header(-[1-6])?$/)) {\r\n ret[data.replace('header', 'heading')] = true;\r\n }\r\n }\r\n return ret;\r\n}\r\n\r\n\r\n// Saved overflow setting\r\nvar saved_overflow = '';\r\n\r\n/**\r\n * Toggle full screen of the editor.\r\n */\r\nfunction toggleFullScreen(editor) {\r\n // Set fullscreen\r\n var cm = editor.codemirror;\r\n cm.setOption('fullScreen', !cm.getOption('fullScreen'));\r\n\r\n\r\n // Prevent scrolling on body during fullscreen active\r\n if (cm.getOption('fullScreen')) {\r\n saved_overflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n } else {\r\n document.body.style.overflow = saved_overflow;\r\n }\r\n\r\n\r\n // Update toolbar class\r\n var wrap = cm.getWrapperElement();\r\n\r\n if (!/fullscreen/.test(wrap.previousSibling.className)) {\r\n wrap.previousSibling.className += ' fullscreen';\r\n } else {\r\n wrap.previousSibling.className = wrap.previousSibling.className.replace(/\\s*fullscreen\\b/, '');\r\n }\r\n\r\n\r\n // Update toolbar button\r\n if (editor.toolbarElements.fullscreen) {\r\n var toolbarButton = editor.toolbarElements.fullscreen;\r\n\r\n if (!/active/.test(toolbarButton.className)) {\r\n toolbarButton.className += ' active';\r\n } else {\r\n toolbarButton.className = toolbarButton.className.replace(/\\s*active\\s*/g, '');\r\n }\r\n }\r\n\r\n\r\n // Hide side by side if needed\r\n var sidebyside = cm.getWrapperElement().nextSibling;\r\n if (/editor-preview-active-side/.test(sidebyside.className))\r\n toggleSideBySide(editor);\r\n}\r\n\r\n\r\n/**\r\n * Action for toggling bold.\r\n */\r\nfunction toggleBold(editor) {\r\n _toggleBlock(editor, 'bold', editor.options.blockStyles.bold);\r\n}\r\n\r\n\r\n/**\r\n * Action for toggling italic.\r\n */\r\nfunction toggleItalic(editor) {\r\n _toggleBlock(editor, 'italic', editor.options.blockStyles.italic);\r\n}\r\n\r\n\r\n/**\r\n * Action for toggling strikethrough.\r\n */\r\nfunction toggleStrikethrough(editor) {\r\n _toggleBlock(editor, 'strikethrough', '~~');\r\n}\r\n\r\n/**\r\n * Action for toggling code block.\r\n */\r\nfunction toggleCodeBlock(editor) {\r\n var fenceCharsToInsert = editor.options.blockStyles.code;\r\n\r\n function fencing_line(line) {\r\n /* return true, if this is a ``` or ~~~ line */\r\n if (typeof line !== 'object') {\r\n throw 'fencing_line() takes a \\'line\\' object (not a line number, or line text). Got: ' + typeof line + ': ' + line;\r\n }\r\n return line.styles && line.styles[2] && line.styles[2].indexOf('formatting-code-block') !== -1;\r\n }\r\n\r\n function token_state(token) {\r\n // base goes an extra level deep when mode backdrops are used, e.g. spellchecker on\r\n return token.state.base.base || token.state.base;\r\n }\r\n\r\n function code_type(cm, line_num, line, firstTok, lastTok) {\r\n /*\r\n * Return \"single\", \"indented\", \"fenced\" or false\r\n *\r\n * cm and line_num are required. Others are optional for efficiency\r\n * To check in the middle of a line, pass in firstTok yourself.\r\n */\r\n line = line || cm.getLineHandle(line_num);\r\n firstTok = firstTok || cm.getTokenAt({\r\n line: line_num,\r\n ch: 1\r\n });\r\n lastTok = lastTok || (!!line.text && cm.getTokenAt({\r\n line: line_num,\r\n ch: line.text.length - 1\r\n }));\r\n var types = firstTok.type ? firstTok.type.split(' ') : [];\r\n if (lastTok && token_state(lastTok).indentedCode) {\r\n // have to check last char, since first chars of first line aren\"t marked as indented\r\n return 'indented';\r\n } else if (types.indexOf('comment') === -1) {\r\n // has to be after \"indented\" check, since first chars of first indented line aren\"t marked as such\r\n return false;\r\n } else if (token_state(firstTok).fencedChars || token_state(lastTok).fencedChars || fencing_line(line)) {\r\n return 'fenced';\r\n } else {\r\n return 'single';\r\n }\r\n }\r\n\r\n function insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert) {\r\n var start_line_sel = cur_start.line + 1,\r\n end_line_sel = cur_end.line + 1,\r\n sel_multi = cur_start.line !== cur_end.line,\r\n repl_start = fenceCharsToInsert + '\\n',\r\n repl_end = '\\n' + fenceCharsToInsert;\r\n if (sel_multi) {\r\n end_line_sel++;\r\n }\r\n // handle last char including \\n or not\r\n if (sel_multi && cur_end.ch === 0) {\r\n repl_end = fenceCharsToInsert + '\\n';\r\n end_line_sel--;\r\n }\r\n _replaceSelection(cm, false, [repl_start, repl_end]);\r\n cm.setSelection({\r\n line: start_line_sel,\r\n ch: 0\r\n }, {\r\n line: end_line_sel,\r\n ch: 0\r\n });\r\n }\r\n\r\n var cm = editor.codemirror,\r\n cur_start = cm.getCursor('start'),\r\n cur_end = cm.getCursor('end'),\r\n tok = cm.getTokenAt({\r\n line: cur_start.line,\r\n ch: cur_start.ch || 1\r\n }), // avoid ch 0 which is a cursor pos but not token\r\n line = cm.getLineHandle(cur_start.line),\r\n is_code = code_type(cm, cur_start.line, line, tok);\r\n var block_start, block_end, lineCount;\r\n\r\n if (is_code === 'single') {\r\n // similar to some InscrybMDE _toggleBlock logic\r\n var start = line.text.slice(0, cur_start.ch).replace('`', ''),\r\n end = line.text.slice(cur_start.ch).replace('`', '');\r\n cm.replaceRange(start + end, {\r\n line: cur_start.line,\r\n ch: 0\r\n }, {\r\n line: cur_start.line,\r\n ch: 99999999999999\r\n });\r\n cur_start.ch--;\r\n if (cur_start !== cur_end) {\r\n cur_end.ch--;\r\n }\r\n cm.setSelection(cur_start, cur_end);\r\n cm.focus();\r\n } else if (is_code === 'fenced') {\r\n if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {\r\n // use selection\r\n\r\n // find the fenced line so we know what type it is (tilde, backticks, number of them)\r\n for (block_start = cur_start.line; block_start >= 0; block_start--) {\r\n line = cm.getLineHandle(block_start);\r\n if (fencing_line(line)) {\r\n break;\r\n }\r\n }\r\n var fencedTok = cm.getTokenAt({\r\n line: block_start,\r\n ch: 1\r\n });\r\n var fence_chars = token_state(fencedTok).fencedChars;\r\n var start_text, start_line;\r\n var end_text, end_line;\r\n // check for selection going up against fenced lines, in which case we don't want to add more fencing\r\n if (fencing_line(cm.getLineHandle(cur_start.line))) {\r\n start_text = '';\r\n start_line = cur_start.line;\r\n } else if (fencing_line(cm.getLineHandle(cur_start.line - 1))) {\r\n start_text = '';\r\n start_line = cur_start.line - 1;\r\n } else {\r\n start_text = fence_chars + '\\n';\r\n start_line = cur_start.line;\r\n }\r\n if (fencing_line(cm.getLineHandle(cur_end.line))) {\r\n end_text = '';\r\n end_line = cur_end.line;\r\n if (cur_end.ch === 0) {\r\n end_line += 1;\r\n }\r\n } else if (cur_end.ch !== 0 && fencing_line(cm.getLineHandle(cur_end.line + 1))) {\r\n end_text = '';\r\n end_line = cur_end.line + 1;\r\n } else {\r\n end_text = fence_chars + '\\n';\r\n end_line = cur_end.line + 1;\r\n }\r\n if (cur_end.ch === 0) {\r\n // full last line selected, putting cursor at beginning of next\r\n end_line -= 1;\r\n }\r\n cm.operation(function () {\r\n // end line first, so that line numbers don't change\r\n cm.replaceRange(end_text, {\r\n line: end_line,\r\n ch: 0\r\n }, {\r\n line: end_line + (end_text ? 0 : 1),\r\n ch: 0\r\n });\r\n cm.replaceRange(start_text, {\r\n line: start_line,\r\n ch: 0\r\n }, {\r\n line: start_line + (start_text ? 0 : 1),\r\n ch: 0\r\n });\r\n });\r\n cm.setSelection({\r\n line: start_line + (start_text ? 1 : 0),\r\n ch: 0\r\n }, {\r\n line: end_line + (start_text ? 1 : -1),\r\n ch: 0\r\n });\r\n cm.focus();\r\n } else {\r\n // no selection, search for ends of this fenced block\r\n var search_from = cur_start.line;\r\n if (fencing_line(cm.getLineHandle(cur_start.line))) { // gets a little tricky if cursor is right on a fenced line\r\n if (code_type(cm, cur_start.line + 1) === 'fenced') {\r\n block_start = cur_start.line;\r\n search_from = cur_start.line + 1; // for searching for \"end\"\r\n } else {\r\n block_end = cur_start.line;\r\n search_from = cur_start.line - 1; // for searching for \"start\"\r\n }\r\n }\r\n if (block_start === undefined) {\r\n for (block_start = search_from; block_start >= 0; block_start--) {\r\n line = cm.getLineHandle(block_start);\r\n if (fencing_line(line)) {\r\n break;\r\n }\r\n }\r\n }\r\n if (block_end === undefined) {\r\n lineCount = cm.lineCount();\r\n for (block_end = search_from; block_end < lineCount; block_end++) {\r\n line = cm.getLineHandle(block_end);\r\n if (fencing_line(line)) {\r\n break;\r\n }\r\n }\r\n }\r\n cm.operation(function () {\r\n cm.replaceRange('', {\r\n line: block_start,\r\n ch: 0\r\n }, {\r\n line: block_start + 1,\r\n ch: 0\r\n });\r\n cm.replaceRange('', {\r\n line: block_end - 1,\r\n ch: 0\r\n }, {\r\n line: block_end,\r\n ch: 0\r\n });\r\n });\r\n cm.focus();\r\n }\r\n } else if (is_code === 'indented') {\r\n if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {\r\n // use selection\r\n block_start = cur_start.line;\r\n block_end = cur_end.line;\r\n if (cur_end.ch === 0) {\r\n block_end--;\r\n }\r\n } else {\r\n // no selection, search for ends of this indented block\r\n for (block_start = cur_start.line; block_start >= 0; block_start--) {\r\n line = cm.getLineHandle(block_start);\r\n if (line.text.match(/^\\s*$/)) {\r\n // empty or all whitespace - keep going\r\n continue;\r\n } else {\r\n if (code_type(cm, block_start, line) !== 'indented') {\r\n block_start += 1;\r\n break;\r\n }\r\n }\r\n }\r\n lineCount = cm.lineCount();\r\n for (block_end = cur_start.line; block_end < lineCount; block_end++) {\r\n line = cm.getLineHandle(block_end);\r\n if (line.text.match(/^\\s*$/)) {\r\n // empty or all whitespace - keep going\r\n continue;\r\n } else {\r\n if (code_type(cm, block_end, line) !== 'indented') {\r\n block_end -= 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n // if we are going to un-indent based on a selected set of lines, and the next line is indented too, we need to\r\n // insert a blank line so that the next line(s) continue to be indented code\r\n var next_line = cm.getLineHandle(block_end + 1),\r\n next_line_last_tok = next_line && cm.getTokenAt({\r\n line: block_end + 1,\r\n ch: next_line.text.length - 1\r\n }),\r\n next_line_indented = next_line_last_tok && token_state(next_line_last_tok).indentedCode;\r\n if (next_line_indented) {\r\n cm.replaceRange('\\n', {\r\n line: block_end + 1,\r\n ch: 0\r\n });\r\n }\r\n\r\n for (var i = block_start; i <= block_end; i++) {\r\n cm.indentLine(i, 'subtract'); // TODO: this doesn't get tracked in the history, so can't be undone :(\r\n }\r\n cm.focus();\r\n } else {\r\n // insert code formatting\r\n var no_sel_and_starting_of_line = (cur_start.line === cur_end.line && cur_start.ch === cur_end.ch && cur_start.ch === 0);\r\n var sel_multi = cur_start.line !== cur_end.line;\r\n if (no_sel_and_starting_of_line || sel_multi) {\r\n insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert);\r\n } else {\r\n _replaceSelection(cm, false, ['`', '`']);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Action for toggling blockquote.\r\n */\r\nfunction toggleBlockquote(editor) {\r\n var cm = editor.codemirror;\r\n _toggleLine(cm, 'quote');\r\n}\r\n\r\n/**\r\n * Action for toggling heading size: normal -> h1 -> h2 -> h3 -> h4 -> h5 -> h6 -> normal\r\n */\r\nfunction toggleHeadingSmaller(editor) {\r\n var cm = editor.codemirror;\r\n _toggleHeading(cm, 'smaller');\r\n}\r\n\r\n/**\r\n * Action for toggling heading size: normal -> h6 -> h5 -> h4 -> h3 -> h2 -> h1 -> normal\r\n */\r\nfunction toggleHeadingBigger(editor) {\r\n var cm = editor.codemirror;\r\n _toggleHeading(cm, 'bigger');\r\n}\r\n\r\n/**\r\n * Action for toggling heading size 1\r\n */\r\nfunction toggleHeading1(editor) {\r\n var cm = editor.codemirror;\r\n _toggleHeading(cm, undefined, 1);\r\n}\r\n\r\n/**\r\n * Action for toggling heading size 2\r\n */\r\nfunction toggleHeading2(editor) {\r\n var cm = editor.codemirror;\r\n _toggleHeading(cm, undefined, 2);\r\n}\r\n\r\n/**\r\n * Action for toggling heading size 3\r\n */\r\nfunction toggleHeading3(editor) {\r\n var cm = editor.codemirror;\r\n _toggleHeading(cm, undefined, 3);\r\n}\r\n\r\n\r\n/**\r\n * Action for toggling ul.\r\n */\r\nfunction toggleUnorderedList(editor) {\r\n var cm = editor.codemirror;\r\n _toggleLine(cm, 'unordered-list');\r\n}\r\n\r\n\r\n/**\r\n * Action for toggling ol.\r\n */\r\nfunction toggleOrderedList(editor) {\r\n var cm = editor.codemirror;\r\n _toggleLine(cm, 'ordered-list');\r\n}\r\n\r\n/**\r\n * Action for clean block (remove headline, list, blockquote code, markers)\r\n */\r\nfunction cleanBlock(editor) {\r\n var cm = editor.codemirror;\r\n _cleanBlock(cm);\r\n}\r\n\r\n/**\r\n * Action for drawing a link.\r\n */\r\nfunction drawLink(editor) {\r\n var cm = editor.codemirror;\r\n var stat = getState(cm);\r\n var options = editor.options;\r\n var url = 'https://';\r\n if (options.promptURLs) {\r\n url = prompt(options.promptTexts.link);\r\n if (!url) {\r\n return false;\r\n }\r\n }\r\n _replaceSelection(cm, stat.link, options.insertTexts.link, url);\r\n}\r\n\r\n/**\r\n * Action for drawing an img.\r\n */\r\nfunction drawImage(editor) {\r\n var cm = editor.codemirror;\r\n var stat = getState(cm);\r\n var options = editor.options;\r\n var url = 'https://';\r\n if (options.promptURLs) {\r\n url = prompt(options.promptTexts.image);\r\n if (!url) {\r\n return false;\r\n }\r\n }\r\n _replaceSelection(cm, stat.image, options.insertTexts.image, url);\r\n}\r\n\r\n/**\r\n * Action for drawing a table.\r\n */\r\nfunction drawTable(editor) {\r\n var cm = editor.codemirror;\r\n var stat = getState(cm);\r\n var options = editor.options;\r\n _replaceSelection(cm, stat.table, options.insertTexts.table);\r\n}\r\n\r\n/**\r\n * Action for drawing a horizontal rule.\r\n */\r\nfunction drawHorizontalRule(editor) {\r\n var cm = editor.codemirror;\r\n var stat = getState(cm);\r\n var options = editor.options;\r\n _replaceSelection(cm, stat.image, options.insertTexts.horizontalRule);\r\n}\r\n\r\n\r\n/**\r\n * Undo action.\r\n */\r\nfunction undo(editor) {\r\n var cm = editor.codemirror;\r\n cm.undo();\r\n cm.focus();\r\n}\r\n\r\n\r\n/**\r\n * Redo action.\r\n */\r\nfunction redo(editor) {\r\n var cm = editor.codemirror;\r\n cm.redo();\r\n cm.focus();\r\n}\r\n\r\n\r\n/**\r\n * Toggle side by side preview\r\n */\r\nfunction toggleSideBySide(editor) {\r\n var cm = editor.codemirror;\r\n var wrapper = cm.getWrapperElement();\r\n var preview = wrapper.nextSibling;\r\n var toolbarButton = editor.toolbarElements['side-by-side'];\r\n var useSideBySideListener = false;\r\n if (/editor-preview-active-side/.test(preview.className)) {\r\n preview.className = preview.className.replace(\r\n /\\s*editor-preview-active-side\\s*/g, ''\r\n );\r\n toolbarButton.className = toolbarButton.className.replace(/\\s*active\\s*/g, '');\r\n wrapper.className = wrapper.className.replace(/\\s*CodeMirror-sided\\s*/g, ' ');\r\n } else {\r\n // When the preview button is clicked for the first time,\r\n // give some time for the transition from editor.css to fire and the view to slide from right to left,\r\n // instead of just appearing.\r\n setTimeout(function () {\r\n if (!cm.getOption('fullScreen'))\r\n toggleFullScreen(editor);\r\n preview.className += ' editor-preview-active-side';\r\n }, 1);\r\n toolbarButton.className += ' active';\r\n wrapper.className += ' CodeMirror-sided';\r\n useSideBySideListener = true;\r\n }\r\n\r\n // Hide normal preview if active\r\n var previewNormal = wrapper.lastChild;\r\n if (/editor-preview-active/.test(previewNormal.className)) {\r\n previewNormal.className = previewNormal.className.replace(\r\n /\\s*editor-preview-active\\s*/g, ''\r\n );\r\n var toolbar = editor.toolbarElements.preview;\r\n var toolbar_div = wrapper.previousSibling;\r\n toolbar.className = toolbar.className.replace(/\\s*active\\s*/g, '');\r\n toolbar_div.className = toolbar_div.className.replace(/\\s*disabled-for-preview*/g, '');\r\n }\r\n\r\n var sideBySideRenderingFunction = function () {\r\n preview.innerHTML = editor.options.previewRender(editor.value(), preview);\r\n };\r\n\r\n if (!cm.sideBySideRenderingFunction) {\r\n cm.sideBySideRenderingFunction = sideBySideRenderingFunction;\r\n }\r\n\r\n if (useSideBySideListener) {\r\n preview.innerHTML = editor.options.previewRender(editor.value(), preview);\r\n cm.on('update', cm.sideBySideRenderingFunction);\r\n } else {\r\n cm.off('update', cm.sideBySideRenderingFunction);\r\n }\r\n\r\n // Refresh to fix selection being off (#309)\r\n cm.refresh();\r\n}\r\n\r\n\r\n/**\r\n * Preview action.\r\n */\r\nfunction togglePreview(editor) {\r\n var cm = editor.codemirror;\r\n var wrapper = cm.getWrapperElement();\r\n var toolbar_div = wrapper.previousSibling;\r\n var toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;\r\n var preview = wrapper.lastChild;\r\n if (!preview || !/editor-preview/.test(preview.className)) {\r\n preview = document.createElement('div');\r\n preview.className = 'editor-preview';\r\n wrapper.appendChild(preview);\r\n }\r\n if (/editor-preview-active/.test(preview.className)) {\r\n preview.className = preview.className.replace(\r\n /\\s*editor-preview-active\\s*/g, ''\r\n );\r\n if (toolbar) {\r\n toolbar.className = toolbar.className.replace(/\\s*active\\s*/g, '');\r\n toolbar_div.className = toolbar_div.className.replace(/\\s*disabled-for-preview*/g, '');\r\n }\r\n } else {\r\n // When the preview button is clicked for the first time,\r\n // give some time for the transition from editor.css to fire and the view to slide from right to left,\r\n // instead of just appearing.\r\n setTimeout(function () {\r\n preview.className += ' editor-preview-active';\r\n }, 1);\r\n if (toolbar) {\r\n toolbar.className += ' active';\r\n toolbar_div.className += ' disabled-for-preview';\r\n }\r\n }\r\n preview.innerHTML = editor.options.previewRender(editor.value(), preview);\r\n\r\n // Turn off side by side if needed\r\n var sidebyside = cm.getWrapperElement().nextSibling;\r\n if (/editor-preview-active-side/.test(sidebyside.className))\r\n toggleSideBySide(editor);\r\n}\r\n\r\nfunction _replaceSelection(cm, active, startEnd, url) {\r\n if (/editor-preview-active/.test(cm.getWrapperElement().lastChild.className))\r\n return;\r\n\r\n var text;\r\n var start = startEnd[0];\r\n var end = startEnd[1];\r\n var startPoint = {},\r\n endPoint = {};\r\n Object.assign(startPoint, cm.getCursor('start'));\r\n Object.assign(endPoint, cm.getCursor('end'));\r\n if (url) {\r\n end = end.replace('#url#', url);\r\n }\r\n if (active) {\r\n text = cm.getLine(startPoint.line);\r\n start = text.slice(0, startPoint.ch);\r\n end = text.slice(startPoint.ch);\r\n cm.replaceRange(start + end, {\r\n line: startPoint.line,\r\n ch: 0\r\n });\r\n } else {\r\n text = cm.getSelection();\r\n cm.replaceSelection(start + text + end);\r\n\r\n startPoint.ch += start.length;\r\n if (startPoint !== endPoint) {\r\n endPoint.ch += start.length;\r\n }\r\n }\r\n cm.setSelection(startPoint, endPoint);\r\n cm.focus();\r\n}\r\n\r\n\r\nfunction _toggleHeading(cm, direction, size) {\r\n if (/editor-preview-active/.test(cm.getWrapperElement().lastChild.className))\r\n return;\r\n\r\n var startPoint = cm.getCursor('start');\r\n var endPoint = cm.getCursor('end');\r\n for (var i = startPoint.line; i <= endPoint.line; i++) {\r\n (function (i) {\r\n var text = cm.getLine(i);\r\n var currHeadingLevel = text.search(/[^#]/);\r\n\r\n if (direction !== undefined) {\r\n if (currHeadingLevel <= 0) {\r\n if (direction == 'bigger') {\r\n text = '###### ' + text;\r\n } else {\r\n text = '# ' + text;\r\n }\r\n } else if (currHeadingLevel == 6 && direction == 'smaller') {\r\n text = text.substr(7);\r\n } else if (currHeadingLevel == 1 && direction == 'bigger') {\r\n text = text.substr(2);\r\n } else {\r\n if (direction == 'bigger') {\r\n text = text.substr(1);\r\n } else {\r\n text = '#' + text;\r\n }\r\n }\r\n } else {\r\n if (size == 1) {\r\n if (currHeadingLevel <= 0) {\r\n text = '# ' + text;\r\n } else if (currHeadingLevel == size) {\r\n text = text.substr(currHeadingLevel + 1);\r\n } else {\r\n text = '# ' + text.substr(currHeadingLevel + 1);\r\n }\r\n } else if (size == 2) {\r\n if (currHeadingLevel <= 0) {\r\n text = '## ' + text;\r\n } else if (currHeadingLevel == size) {\r\n text = text.substr(currHeadingLevel + 1);\r\n } else {\r\n text = '## ' + text.substr(currHeadingLevel + 1);\r\n }\r\n } else {\r\n if (currHeadingLevel <= 0) {\r\n text = '### ' + text;\r\n } else if (currHeadingLevel == size) {\r\n text = text.substr(currHeadingLevel + 1);\r\n } else {\r\n text = '### ' + text.substr(currHeadingLevel + 1);\r\n }\r\n }\r\n }\r\n\r\n cm.replaceRange(text, {\r\n line: i,\r\n ch: 0\r\n }, {\r\n line: i,\r\n ch: 99999999999999\r\n });\r\n })(i);\r\n }\r\n cm.focus();\r\n}\r\n\r\n\r\nfunction _toggleLine(cm, name) {\r\n if (/editor-preview-active/.test(cm.getWrapperElement().lastChild.className))\r\n return;\r\n\r\n var listRegexp = /^(\\s*)(\\*|-|\\+|\\d*\\.)(\\s+)/;\r\n var whitespacesRegexp = /^\\s*/;\r\n\r\n var stat = getState(cm);\r\n var startPoint = cm.getCursor('start');\r\n var endPoint = cm.getCursor('end');\r\n var repl = {\r\n 'quote': /^(\\s*)>\\s+/,\r\n 'unordered-list': listRegexp,\r\n 'ordered-list': listRegexp\r\n };\r\n\r\n var _getChar = function (name, i) {\r\n var map = {\r\n 'quote': '>',\r\n 'unordered-list': '*',\r\n 'ordered-list': '%%i.'\r\n };\r\n\r\n return map[name].replace('%%i', i);\r\n };\r\n\r\n var _checkChar = function (name, char) {\r\n var map = {\r\n 'quote': '>',\r\n 'unordered-list': '*',\r\n 'ordered-list': 'd+.'\r\n };\r\n var rt = new RegExp(map[name]);\r\n\r\n return char && rt.test(char);\r\n };\r\n\r\n var line = 1;\r\n for (var i = startPoint.line; i <= endPoint.line; i++) {\r\n (function (i) {\r\n var text = cm.getLine(i);\r\n if (stat[name]) {\r\n text = text.replace(repl[name], '$1');\r\n } else {\r\n var arr = listRegexp.exec(text);\r\n var char = _getChar(name, line);\r\n if (arr !== null) {\r\n if (_checkChar(name, arr[2])) {\r\n char = '';\r\n }\r\n text = arr[1] + char + arr[3] + text.replace(whitespacesRegexp, '').replace(repl[name], '$1');\r\n } else {\r\n text = char + ' ' + text;\r\n }\r\n line += 1;\r\n }\r\n cm.replaceRange(text, {\r\n line: i,\r\n ch: 0\r\n }, {\r\n line: i,\r\n ch: 99999999999999\r\n });\r\n })(i);\r\n }\r\n cm.focus();\r\n}\r\n\r\nfunction _toggleBlock(editor, type, start_chars, end_chars) {\r\n if (/editor-preview-active/.test(editor.codemirror.getWrapperElement().lastChild.className))\r\n return;\r\n\r\n end_chars = (typeof end_chars === 'undefined') ? start_chars : end_chars;\r\n var cm = editor.codemirror;\r\n var stat = getState(cm);\r\n\r\n var text;\r\n var start = start_chars;\r\n var end = end_chars;\r\n\r\n var startPoint = cm.getCursor('start');\r\n var endPoint = cm.getCursor('end');\r\n\r\n if (stat[type]) {\r\n text = cm.getLine(startPoint.line);\r\n start = text.slice(0, startPoint.ch);\r\n end = text.slice(startPoint.ch);\r\n if (type == 'bold') {\r\n start = start.replace(/(\\*\\*|__)(?![\\s\\S]*(\\*\\*|__))/, '');\r\n end = end.replace(/(\\*\\*|__)/, '');\r\n } else if (type == 'italic') {\r\n start = start.replace(/(\\*|_)(?![\\s\\S]*(\\*|_))/, '');\r\n end = end.replace(/(\\*|_)/, '');\r\n } else if (type == 'strikethrough') {\r\n start = start.replace(/(\\*\\*|~~)(?![\\s\\S]*(\\*\\*|~~))/, '');\r\n end = end.replace(/(\\*\\*|~~)/, '');\r\n }\r\n cm.replaceRange(start + end, {\r\n line: startPoint.line,\r\n ch: 0\r\n }, {\r\n line: startPoint.line,\r\n ch: 99999999999999\r\n });\r\n\r\n if (type == 'bold' || type == 'strikethrough') {\r\n startPoint.ch -= 2;\r\n if (startPoint !== endPoint) {\r\n endPoint.ch -= 2;\r\n }\r\n } else if (type == 'italic') {\r\n startPoint.ch -= 1;\r\n if (startPoint !== endPoint) {\r\n endPoint.ch -= 1;\r\n }\r\n }\r\n } else {\r\n text = cm.getSelection();\r\n if (type == 'bold') {\r\n text = text.split('**').join('');\r\n text = text.split('__').join('');\r\n } else if (type == 'italic') {\r\n text = text.split('*').join('');\r\n text = text.split('_').join('');\r\n } else if (type == 'strikethrough') {\r\n text = text.split('~~').join('');\r\n }\r\n cm.replaceSelection(start + text + end);\r\n\r\n startPoint.ch += start_chars.length;\r\n endPoint.ch = startPoint.ch + text.length;\r\n }\r\n\r\n cm.setSelection(startPoint, endPoint);\r\n cm.focus();\r\n}\r\n\r\nfunction _cleanBlock(cm) {\r\n if (/editor-preview-active/.test(cm.getWrapperElement().lastChild.className))\r\n return;\r\n\r\n var startPoint = cm.getCursor('start');\r\n var endPoint = cm.getCursor('end');\r\n var text;\r\n\r\n for (var line = startPoint.line; line <= endPoint.line; line++) {\r\n text = cm.getLine(line);\r\n text = text.replace(/^[ ]*([# ]+|\\*|-|[> ]+|[0-9]+(.|\\)))[ ]*/, '');\r\n\r\n cm.replaceRange(text, {\r\n line: line,\r\n ch: 0\r\n }, {\r\n line: line,\r\n ch: 99999999999999\r\n });\r\n }\r\n}\r\n\r\n// Merge the properties of one object into another.\r\nfunction _mergeProperties(target, source) {\r\n for (var property in source) {\r\n if (source.hasOwnProperty(property)) {\r\n if (source[property] instanceof Array) {\r\n target[property] = source[property].concat(target[property] instanceof Array ? target[property] : []);\r\n } else if (\r\n source[property] !== null &&\r\n typeof source[property] === 'object' &&\r\n source[property].constructor === Object\r\n ) {\r\n target[property] = _mergeProperties(target[property] || {}, source[property]);\r\n } else {\r\n target[property] = source[property];\r\n }\r\n }\r\n }\r\n\r\n return target;\r\n}\r\n\r\n// Merge an arbitrary number of objects into one.\r\nfunction extend(target) {\r\n for (var i = 1; i < arguments.length; i++) {\r\n target = _mergeProperties(target, arguments[i]);\r\n }\r\n\r\n return target;\r\n}\r\n\r\n/* The right word count in respect for CJK. */\r\nfunction wordCount(data) {\r\n var pattern = /[a-zA-Z0-9_\\u0392-\\u03c9\\u0410-\\u04F9]+|[\\u4E00-\\u9FFF\\u3400-\\u4dbf\\uf900-\\ufaff\\u3040-\\u309f\\uac00-\\ud7af]+/g;\r\n var m = data.match(pattern);\r\n var count = 0;\r\n if (m === null) return count;\r\n for (var i = 0; i < m.length; i++) {\r\n if (m[i].charCodeAt(0) >= 0x4E00) {\r\n count += m[i].length;\r\n } else {\r\n count += 1;\r\n }\r\n }\r\n return count;\r\n}\r\n\r\nvar toolbarBuiltInButtons = {\r\n 'bold': {\r\n name: 'bold',\r\n action: toggleBold,\r\n className: 'fa fa-bold',\r\n title: 'Bold',\r\n default: true\r\n },\r\n 'italic': {\r\n name: 'italic',\r\n action: toggleItalic,\r\n className: 'fa fa-italic',\r\n title: 'Italic',\r\n default: true\r\n },\r\n 'strikethrough': {\r\n name: 'strikethrough',\r\n action: toggleStrikethrough,\r\n className: 'fa fa-strikethrough',\r\n title: 'Strikethrough'\r\n },\r\n 'heading': {\r\n name: 'heading',\r\n action: toggleHeadingSmaller,\r\n className: 'fa fa-header fa-heading',\r\n title: 'Heading',\r\n default: true\r\n },\r\n 'heading-smaller': {\r\n name: 'heading-smaller',\r\n action: toggleHeadingSmaller,\r\n className: 'fa fa-header fa-header-x fa-header-smaller',\r\n title: 'Smaller Heading'\r\n },\r\n 'heading-bigger': {\r\n name: 'heading-bigger',\r\n action: toggleHeadingBigger,\r\n className: 'fa fa-header fa-header-x fa-header-bigger',\r\n title: 'Bigger Heading'\r\n },\r\n 'heading-1': {\r\n name: 'heading-1',\r\n action: toggleHeading1,\r\n className: 'fa fa-header fa-header-x fa-header-1 fa-h1',\r\n title: 'Big Heading'\r\n },\r\n 'heading-2': {\r\n name: 'heading-2',\r\n action: toggleHeading2,\r\n className: 'fa fa-header fa-header-x fa-header-2 fa-h2',\r\n title: 'Medium Heading'\r\n },\r\n 'heading-3': {\r\n name: 'heading-3',\r\n action: toggleHeading3,\r\n className: 'fa fa-header fa-header-x fa-header-3 fa-h3',\r\n title: 'Small Heading'\r\n },\r\n 'separator-1': {\r\n name: 'separator-1'\r\n },\r\n 'code': {\r\n name: 'code',\r\n action: toggleCodeBlock,\r\n className: 'fa fa-code',\r\n title: 'Code'\r\n },\r\n 'quote': {\r\n name: 'quote',\r\n action: toggleBlockquote,\r\n className: 'fa fa-quote-left',\r\n title: 'Quote',\r\n default: true\r\n },\r\n 'unordered-list': {\r\n name: 'unordered-list',\r\n action: toggleUnorderedList,\r\n className: 'fa fa-list-ul',\r\n title: 'Generic List',\r\n default: true\r\n },\r\n 'ordered-list': {\r\n name: 'ordered-list',\r\n action: toggleOrderedList,\r\n className: 'fa fa-list-ol',\r\n title: 'Numbered List',\r\n default: true\r\n },\r\n 'clean-block': {\r\n name: 'clean-block',\r\n action: cleanBlock,\r\n className: 'fa fa-eraser fa-clean-block',\r\n title: 'Clean block'\r\n },\r\n 'separator-2': {\r\n name: 'separator-2'\r\n },\r\n 'link': {\r\n name: 'link',\r\n action: drawLink,\r\n className: 'fa fa-link',\r\n title: 'Create Link',\r\n default: true\r\n },\r\n 'image': {\r\n name: 'image',\r\n action: drawImage,\r\n className: 'fa fa-image',\r\n title: 'Insert Image',\r\n default: true\r\n },\r\n 'table': {\r\n name: 'table',\r\n action: drawTable,\r\n className: 'fa fa-table',\r\n title: 'Insert Table'\r\n },\r\n 'horizontal-rule': {\r\n name: 'horizontal-rule',\r\n action: drawHorizontalRule,\r\n className: 'fa fa-minus',\r\n title: 'Insert Horizontal Line'\r\n },\r\n 'separator-3': {\r\n name: 'separator-3'\r\n },\r\n 'preview': {\r\n name: 'preview',\r\n action: togglePreview,\r\n className: 'fa fa-eye',\r\n noDisable: true,\r\n title: 'Toggle Preview',\r\n default: true\r\n },\r\n 'side-by-side': {\r\n name: 'side-by-side',\r\n action: toggleSideBySide,\r\n className: 'fa fa-columns',\r\n noDisable: true,\r\n noMobile: true,\r\n title: 'Toggle Side by Side',\r\n default: true\r\n },\r\n 'fullscreen': {\r\n name: 'fullscreen',\r\n action: toggleFullScreen,\r\n className: 'fa fa-arrows-alt',\r\n noDisable: true,\r\n noMobile: true,\r\n title: 'Toggle Fullscreen',\r\n default: true\r\n },\r\n 'separator-4': {\r\n name: 'separator-4'\r\n },\r\n 'guide': {\r\n name: 'guide',\r\n action: 'https://www.inscryb.com/InscrybMDE/markdown-guide/',\r\n className: 'fa fa-question-circle',\r\n noDisable: true,\r\n title: 'Markdown Guide',\r\n default: true\r\n },\r\n 'separator-5': {\r\n name: 'separator-5'\r\n },\r\n 'undo': {\r\n name: 'undo',\r\n action: undo,\r\n className: 'fa fa-undo',\r\n noDisable: true,\r\n title: 'Undo'\r\n },\r\n 'redo': {\r\n name: 'redo',\r\n action: redo,\r\n className: 'fa fa-repeat',\r\n noDisable: true,\r\n title: 'Redo'\r\n }\r\n};\r\n\r\nvar insertTexts = {\r\n link: ['[', '](#url#)'],\r\n image: ['![](', '#url#)'],\r\n table: ['', '\\n\\n| Column 1 | Column 2 | Column 3 |\\n| -------- | -------- | -------- |\\n| Text | Text | Text |\\n\\n'],\r\n horizontalRule: ['', '\\n\\n-----\\n\\n']\r\n};\r\n\r\nvar promptTexts = {\r\n link: 'URL for the link:',\r\n image: 'URL of the image:'\r\n};\r\n\r\nvar blockStyles = {\r\n 'bold': '**',\r\n 'code': '```',\r\n 'italic': '*'\r\n};\r\n\r\n/**\r\n * Interface of InscrybMDE.\r\n */\r\nfunction InscrybMDE(options) {\r\n // Handle options parameter\r\n options = options || {};\r\n\r\n\r\n // Used later to refer to it\"s parent\r\n options.parent = this;\r\n\r\n\r\n // Check if Font Awesome needs to be auto downloaded\r\n var autoDownloadFA = true;\r\n\r\n if (options.autoDownloadFontAwesome === false) {\r\n autoDownloadFA = false;\r\n }\r\n\r\n if (options.autoDownloadFontAwesome !== true) {\r\n var styleSheets = document.styleSheets;\r\n for (var i = 0; i < styleSheets.length; i++) {\r\n if (!styleSheets[i].href)\r\n continue;\r\n\r\n if (styleSheets[i].href.indexOf('//maxcdn.bootstrapcdn.com/font-awesome/') > -1) {\r\n autoDownloadFA = false;\r\n }\r\n }\r\n }\r\n\r\n if (autoDownloadFA) {\r\n var link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = 'https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css';\r\n document.getElementsByTagName('head')[0].appendChild(link);\r\n }\r\n\r\n\r\n // Find the textarea to use\r\n if (options.element) {\r\n this.element = options.element;\r\n } else if (options.element === null) {\r\n // This means that the element option was specified, but no element was found\r\n console.log('InscrybMDE: Error. No element was found.');\r\n return;\r\n }\r\n\r\n\r\n // Handle toolbar\r\n if (options.toolbar === undefined) {\r\n // Initialize\r\n options.toolbar = [];\r\n\r\n\r\n // Loop over the built in buttons, to get the preferred order\r\n for (var key in toolbarBuiltInButtons) {\r\n if (toolbarBuiltInButtons.hasOwnProperty(key)) {\r\n if (key.indexOf('separator-') != -1) {\r\n options.toolbar.push('|');\r\n }\r\n\r\n if (toolbarBuiltInButtons[key].default === true || (options.showIcons && options.showIcons.constructor === Array && options.showIcons.indexOf(key) != -1)) {\r\n options.toolbar.push(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n // Handle status bar\r\n if (!options.hasOwnProperty('status')) {\r\n options.status = ['autosave', 'lines', 'words', 'cursor'];\r\n }\r\n\r\n\r\n // Add default preview rendering function\r\n if (!options.previewRender) {\r\n options.previewRender = function (plainText) {\r\n // Note: \"this\" refers to the options object\r\n return this.parent.markdown(plainText);\r\n };\r\n }\r\n\r\n\r\n // Set default options for parsing config\r\n options.parsingConfig = extend({\r\n highlightFormatting: true // needed for toggleCodeBlock to detect types of code\r\n }, options.parsingConfig || {});\r\n\r\n\r\n // Merging the insertTexts, with the given options\r\n options.insertTexts = extend({}, insertTexts, options.insertTexts || {});\r\n\r\n\r\n // Merging the promptTexts, with the given options\r\n options.promptTexts = extend({}, promptTexts, options.promptTexts || {});\r\n\r\n\r\n // Merging the blockStyles, with the given options\r\n options.blockStyles = extend({}, blockStyles, options.blockStyles || {});\r\n\r\n\r\n // Merging the shortcuts, with the given options\r\n options.shortcuts = extend({}, shortcuts, options.shortcuts || {});\r\n\r\n options.minHeight = options.minHeight || '300px';\r\n\r\n\r\n // Change unique_id to uniqueId for backwards compatibility\r\n if (options.autosave != undefined && options.autosave.unique_id != undefined && options.autosave.unique_id != '')\r\n options.autosave.uniqueId = options.autosave.unique_id;\r\n\r\n\r\n // Update this options\r\n this.options = options;\r\n\r\n\r\n // Auto render\r\n this.render();\r\n\r\n\r\n // The codemirror component is only available after rendering\r\n // so, the setter for the initialValue can only run after\r\n // the element has been rendered\r\n if (options.initialValue && (!this.options.autosave || this.options.autosave.foundSavedValue !== true)) {\r\n this.value(options.initialValue);\r\n }\r\n}\r\n\r\n/**\r\n * Default markdown render.\r\n */\r\nInscrybMDE.prototype.markdown = function (text) {\r\n if (marked) {\r\n // Initialize\r\n var markedOptions;\r\n if (this.options && this.options.renderingConfig && this.options.renderingConfig.markedOptions) {\r\n markedOptions = this.options.renderingConfig.markedOptions;\r\n } else {\r\n markedOptions = {};\r\n }\r\n\r\n // Update options\r\n if (this.options && this.options.renderingConfig && this.options.renderingConfig.singleLineBreaks === false) {\r\n markedOptions.breaks = false;\r\n } else {\r\n markedOptions.breaks = true;\r\n }\r\n\r\n if (this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true) {\r\n\r\n /* Get HLJS from config or window */\r\n var hljs = this.options.renderingConfig.hljs || window.hljs;\r\n\r\n /* Check if HLJS loaded */\r\n if (hljs) {\r\n markedOptions.highlight = function (code) {\r\n return hljs.highlightAuto(code).value;\r\n };\r\n }\r\n }\r\n\r\n\r\n // Set options\r\n marked.setOptions(markedOptions);\r\n\r\n\r\n // Return\r\n return marked(text);\r\n }\r\n};\r\n\r\n/**\r\n * Render editor to the given element.\r\n */\r\nInscrybMDE.prototype.render = function (el) {\r\n if (!el) {\r\n el = this.element || document.getElementsByTagName('textarea')[0];\r\n }\r\n\r\n if (this._rendered && this._rendered === el) {\r\n // Already rendered.\r\n return;\r\n }\r\n\r\n this.element = el;\r\n var options = this.options;\r\n\r\n var self = this;\r\n var keyMaps = {};\r\n\r\n for (var key in options.shortcuts) {\r\n // null stands for \"do not bind this command\"\r\n if (options.shortcuts[key] !== null && bindings[key] !== null) {\r\n (function (key) {\r\n keyMaps[fixShortcut(options.shortcuts[key])] = function () {\r\n bindings[key](self);\r\n };\r\n })(key);\r\n }\r\n }\r\n\r\n keyMaps['Enter'] = 'newlineAndIndentContinueMarkdownList';\r\n keyMaps['Tab'] = 'tabAndIndentMarkdownList';\r\n keyMaps['Shift-Tab'] = 'shiftTabAndUnindentMarkdownList';\r\n keyMaps['Esc'] = function (cm) {\r\n if (cm.getOption('fullScreen')) toggleFullScreen(self);\r\n };\r\n\r\n document.addEventListener('keydown', function (e) {\r\n e = e || window.event;\r\n\r\n if (e.keyCode == 27) {\r\n if (self.codemirror.getOption('fullScreen')) toggleFullScreen(self);\r\n }\r\n }, false);\r\n\r\n var mode, backdrop;\r\n if (options.spellChecker !== false) {\r\n mode = 'spell-checker';\r\n backdrop = options.parsingConfig;\r\n backdrop.name = 'gfm';\r\n backdrop.gitHubSpice = false;\r\n\r\n CodeMirrorSpellChecker({\r\n codeMirrorInstance: CodeMirror\r\n });\r\n } else {\r\n mode = options.parsingConfig;\r\n mode.name = 'gfm';\r\n mode.gitHubSpice = false;\r\n }\r\n\r\n this.codemirror = CodeMirror.fromTextArea(el, {\r\n mode: mode,\r\n backdrop: backdrop,\r\n theme: 'paper',\r\n tabSize: (options.tabSize != undefined) ? options.tabSize : 2,\r\n indentUnit: (options.tabSize != undefined) ? options.tabSize : 2,\r\n indentWithTabs: (options.indentWithTabs === false) ? false : true,\r\n lineNumbers: false,\r\n autofocus: (options.autofocus === true) ? true : false,\r\n extraKeys: keyMaps,\r\n lineWrapping: (options.lineWrapping === false) ? false : true,\r\n allowDropFileTypes: ['text/plain'],\r\n placeholder: options.placeholder || el.getAttribute('placeholder') || '',\r\n styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : !isMobile(),\r\n inputStyle: (options.inputStyle != undefined) ? options.inputStyle : isMobile() ? 'contenteditable' : 'textarea',\r\n });\r\n\r\n this.codemirror.getScrollerElement().style.minHeight = options.minHeight;\r\n\r\n if (options.forceSync === true) {\r\n var cm = this.codemirror;\r\n cm.on('change', function () {\r\n cm.save();\r\n });\r\n }\r\n\r\n this.gui = {};\r\n\r\n if (options.toolbar !== false) {\r\n this.gui.toolbar = this.createToolbar();\r\n }\r\n if (options.status !== false) {\r\n this.gui.statusbar = this.createStatusbar();\r\n }\r\n if (options.autosave != undefined && options.autosave.enabled === true) {\r\n this.autosave();\r\n }\r\n\r\n this.gui.sideBySide = this.createSideBySide();\r\n\r\n this._rendered = this.element;\r\n\r\n\r\n // Fixes CodeMirror bug (#344)\r\n var temp_cm = this.codemirror;\r\n setTimeout(function () {\r\n temp_cm.refresh();\r\n }.bind(temp_cm), 0);\r\n};\r\n\r\n// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem throw QuotaExceededError. We're going to detect this and set a variable accordingly.\r\nfunction isLocalStorageAvailable() {\r\n if (typeof localStorage === 'object') {\r\n try {\r\n localStorage.setItem('smde_localStorage', 1);\r\n localStorage.removeItem('smde_localStorage');\r\n } catch (e) {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nInscrybMDE.prototype.autosave = function () {\r\n if (isLocalStorageAvailable()) {\r\n var inscrybmde = this;\r\n\r\n if (this.options.autosave.uniqueId == undefined || this.options.autosave.uniqueId == '') {\r\n console.log('InscrybMDE: You must set a uniqueId to use the autosave feature');\r\n return;\r\n }\r\n\r\n if (inscrybmde.element.form != null && inscrybmde.element.form != undefined) {\r\n inscrybmde.element.form.addEventListener('submit', function () {\r\n localStorage.removeItem('smde_' + inscrybmde.options.autosave.uniqueId);\r\n });\r\n }\r\n\r\n if (this.options.autosave.loaded !== true) {\r\n if (typeof localStorage.getItem('smde_' + this.options.autosave.uniqueId) == 'string' && localStorage.getItem('smde_' + this.options.autosave.uniqueId) != '') {\r\n this.codemirror.setValue(localStorage.getItem('smde_' + this.options.autosave.uniqueId));\r\n this.options.autosave.foundSavedValue = true;\r\n }\r\n\r\n this.options.autosave.loaded = true;\r\n }\r\n\r\n localStorage.setItem('smde_' + this.options.autosave.uniqueId, inscrybmde.value());\r\n\r\n if (typeof this.options.autosave.callback === 'function')\r\n this.options.autosave.callback.call(this);\r\n\r\n var el = document.getElementById('autosaved');\r\n if (el != null && el != undefined && el != '') {\r\n var d = new Date();\r\n var hh = d.getHours();\r\n var m = d.getMinutes();\r\n var dd = 'am';\r\n var h = hh;\r\n if (h >= 12) {\r\n h = hh - 12;\r\n dd = 'pm';\r\n }\r\n if (h == 0) {\r\n h = 12;\r\n }\r\n m = m < 10 ? '0' + m : m;\r\n\r\n el.innerHTML = 'Autosaved: ' + h + ':' + m + ' ' + dd;\r\n }\r\n\r\n this.autosaveTimeoutId = setTimeout(function () {\r\n inscrybmde.autosave();\r\n }, this.options.autosave.delay || 10000);\r\n } else {\r\n console.log('InscrybMDE: localStorage not available, cannot autosave');\r\n }\r\n};\r\n\r\nInscrybMDE.prototype.clearAutosavedValue = function () {\r\n if (isLocalStorageAvailable()) {\r\n if (this.options.autosave == undefined || this.options.autosave.uniqueId == undefined || this.options.autosave.uniqueId == '') {\r\n console.log('InscrybMDE: You must set a uniqueId to clear the autosave value');\r\n return;\r\n }\r\n\r\n localStorage.removeItem('smde_' + this.options.autosave.uniqueId);\r\n } else {\r\n console.log('InscrybMDE: localStorage not available, cannot autosave');\r\n }\r\n};\r\n\r\nInscrybMDE.prototype.createSideBySide = function () {\r\n var cm = this.codemirror;\r\n var wrapper = cm.getWrapperElement();\r\n var preview = wrapper.nextSibling;\r\n\r\n if (!preview || !/editor-preview-side/.test(preview.className)) {\r\n preview = document.createElement('div');\r\n preview.className = 'editor-preview-side';\r\n wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);\r\n }\r\n\r\n if (this.options.syncSideBySidePreviewScroll === false) return preview;\r\n // Syncs scroll editor -> preview\r\n var cScroll = false;\r\n var pScroll = false;\r\n cm.on('scroll', function (v) {\r\n if (cScroll) {\r\n cScroll = false;\r\n return;\r\n }\r\n pScroll = true;\r\n var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight;\r\n var ratio = parseFloat(v.getScrollInfo().top) / height;\r\n var move = (preview.scrollHeight - preview.clientHeight) * ratio;\r\n preview.scrollTop = move;\r\n });\r\n\r\n // Syncs scroll preview -> editor\r\n preview.onscroll = function () {\r\n if (pScroll) {\r\n pScroll = false;\r\n return;\r\n }\r\n cScroll = true;\r\n var height = preview.scrollHeight - preview.clientHeight;\r\n var ratio = parseFloat(preview.scrollTop) / height;\r\n var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;\r\n cm.scrollTo(0, move);\r\n };\r\n return preview;\r\n};\r\n\r\nInscrybMDE.prototype.createToolbar = function (items) {\r\n items = items || this.options.toolbar;\r\n\r\n if (!items || items.length === 0) {\r\n return;\r\n }\r\n var i;\r\n for (i = 0; i < items.length; i++) {\r\n if (toolbarBuiltInButtons[items[i]] != undefined) {\r\n items[i] = toolbarBuiltInButtons[items[i]];\r\n }\r\n }\r\n\r\n var bar = document.createElement('div');\r\n bar.className = 'editor-toolbar';\r\n\r\n var self = this;\r\n\r\n var toolbarData = {};\r\n self.toolbar = items;\r\n\r\n for (i = 0; i < items.length; i++) {\r\n if (items[i].name == 'guide' && self.options.toolbarGuideIcon === false)\r\n continue;\r\n\r\n if (self.options.hideIcons && self.options.hideIcons.indexOf(items[i].name) != -1)\r\n continue;\r\n\r\n // Fullscreen does not work well on mobile devices (even tablets)\r\n // In the future, hopefully this can be resolved\r\n if ((items[i].name == 'fullscreen' || items[i].name == 'side-by-side') && isMobile())\r\n continue;\r\n\r\n\r\n // Don't include trailing separators\r\n if (items[i] === '|') {\r\n var nonSeparatorIconsFollow = false;\r\n\r\n for (var x = (i + 1); x < items.length; x++) {\r\n if (items[x] !== '|' && (!self.options.hideIcons || self.options.hideIcons.indexOf(items[x].name) == -1)) {\r\n nonSeparatorIconsFollow = true;\r\n }\r\n }\r\n\r\n if (!nonSeparatorIconsFollow)\r\n continue;\r\n }\r\n\r\n\r\n // Create the icon and append to the toolbar\r\n (function (item) {\r\n var el;\r\n if (item === '|') {\r\n el = createSep();\r\n } else {\r\n el = createIcon(item, self.options.toolbarTips, self.options.shortcuts);\r\n }\r\n\r\n // bind events, special for info\r\n if (item.action) {\r\n if (typeof item.action === 'function') {\r\n el.onclick = function (e) {\r\n e.preventDefault();\r\n item.action(self);\r\n };\r\n } else if (typeof item.action === 'string') {\r\n el.onclick = function (e) {\r\n e.preventDefault();\r\n window.open(item.action, '_blank');\r\n };\r\n }\r\n }\r\n\r\n toolbarData[item.name || item] = el;\r\n bar.appendChild(el);\r\n })(items[i]);\r\n }\r\n\r\n self.toolbarElements = toolbarData;\r\n\r\n var cm = this.codemirror;\r\n cm.on('cursorActivity', function () {\r\n var stat = getState(cm);\r\n\r\n for (var key in toolbarData) {\r\n (function (key) {\r\n var el = toolbarData[key];\r\n if (stat[key]) {\r\n el.className += ' active';\r\n } else if (key != 'fullscreen' && key != 'side-by-side') {\r\n el.className = el.className.replace(/\\s*active\\s*/g, '');\r\n }\r\n })(key);\r\n }\r\n });\r\n\r\n var cmWrapper = cm.getWrapperElement();\r\n cmWrapper.parentNode.insertBefore(bar, cmWrapper);\r\n return bar;\r\n};\r\n\r\nInscrybMDE.prototype.createStatusbar = function (status) {\r\n // Initialize\r\n status = status || this.options.status;\r\n var options = this.options;\r\n var cm = this.codemirror;\r\n\r\n\r\n // Make sure the status variable is valid\r\n if (!status || status.length === 0)\r\n return;\r\n\r\n\r\n // Set up the built-in items\r\n var items = [];\r\n var i, onUpdate, defaultValue;\r\n\r\n for (i = 0; i < status.length; i++) {\r\n // Reset some values\r\n onUpdate = undefined;\r\n defaultValue = undefined;\r\n\r\n\r\n // Handle if custom or not\r\n if (typeof status[i] === 'object') {\r\n items.push({\r\n className: status[i].className,\r\n defaultValue: status[i].defaultValue,\r\n onUpdate: status[i].onUpdate\r\n });\r\n } else {\r\n var name = status[i];\r\n\r\n if (name === 'words') {\r\n defaultValue = function (el) {\r\n el.innerHTML = wordCount(cm.getValue());\r\n };\r\n onUpdate = function (el) {\r\n el.innerHTML = wordCount(cm.getValue());\r\n };\r\n } else if (name === 'lines') {\r\n defaultValue = function (el) {\r\n el.innerHTML = cm.lineCount();\r\n };\r\n onUpdate = function (el) {\r\n el.innerHTML = cm.lineCount();\r\n };\r\n } else if (name === 'cursor') {\r\n defaultValue = function (el) {\r\n el.innerHTML = '0:0';\r\n };\r\n onUpdate = function (el) {\r\n var pos = cm.getCursor();\r\n el.innerHTML = pos.line + ':' + pos.ch;\r\n };\r\n } else if (name === 'autosave') {\r\n defaultValue = function (el) {\r\n if (options.autosave != undefined && options.autosave.enabled === true) {\r\n el.setAttribute('id', 'autosaved');\r\n }\r\n };\r\n }\r\n\r\n items.push({\r\n className: name,\r\n defaultValue: defaultValue,\r\n onUpdate: onUpdate\r\n });\r\n }\r\n }\r\n\r\n\r\n // Create element for the status bar\r\n var bar = document.createElement('div');\r\n bar.className = 'editor-statusbar';\r\n\r\n\r\n // Create a new span for each item\r\n for (i = 0; i < items.length; i++) {\r\n // Store in temporary variable\r\n var item = items[i];\r\n\r\n\r\n // Create span element\r\n var el = document.createElement('span');\r\n el.className = item.className;\r\n\r\n\r\n // Ensure the defaultValue is a function\r\n if (typeof item.defaultValue === 'function') {\r\n item.defaultValue(el);\r\n }\r\n\r\n\r\n // Ensure the onUpdate is a function\r\n if (typeof item.onUpdate === 'function') {\r\n // Create a closure around the span of the current action, then execute the onUpdate handler\r\n this.codemirror.on('update', (function (el, item) {\r\n return function () {\r\n item.onUpdate(el);\r\n };\r\n }(el, item)));\r\n }\r\n\r\n\r\n // Append the item to the status bar\r\n bar.appendChild(el);\r\n }\r\n\r\n\r\n // Insert the status bar into the DOM\r\n var cmWrapper = this.codemirror.getWrapperElement();\r\n cmWrapper.parentNode.insertBefore(bar, cmWrapper.nextSibling);\r\n return bar;\r\n};\r\n\r\n/**\r\n * Get or set the text content.\r\n */\r\nInscrybMDE.prototype.value = function (val) {\r\n var cm = this.codemirror;\r\n if (val === undefined) {\r\n return cm.getValue();\r\n } else {\r\n cm.getDoc().setValue(val);\r\n if (this.isPreviewActive()) {\r\n var wrapper = cm.getWrapperElement();\r\n var preview = wrapper.lastChild;\r\n preview.innerHTML = this.options.previewRender(val, preview);\r\n }\r\n return this;\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Bind static methods for exports.\r\n */\r\nInscrybMDE.toggleBold = toggleBold;\r\nInscrybMDE.toggleItalic = toggleItalic;\r\nInscrybMDE.toggleStrikethrough = toggleStrikethrough;\r\nInscrybMDE.toggleBlockquote = toggleBlockquote;\r\nInscrybMDE.toggleHeadingSmaller = toggleHeadingSmaller;\r\nInscrybMDE.toggleHeadingBigger = toggleHeadingBigger;\r\nInscrybMDE.toggleHeading1 = toggleHeading1;\r\nInscrybMDE.toggleHeading2 = toggleHeading2;\r\nInscrybMDE.toggleHeading3 = toggleHeading3;\r\nInscrybMDE.toggleCodeBlock = toggleCodeBlock;\r\nInscrybMDE.toggleUnorderedList = toggleUnorderedList;\r\nInscrybMDE.toggleOrderedList = toggleOrderedList;\r\nInscrybMDE.cleanBlock = cleanBlock;\r\nInscrybMDE.drawLink = drawLink;\r\nInscrybMDE.drawImage = drawImage;\r\nInscrybMDE.drawTable = drawTable;\r\nInscrybMDE.drawHorizontalRule = drawHorizontalRule;\r\nInscrybMDE.undo = undo;\r\nInscrybMDE.redo = redo;\r\nInscrybMDE.togglePreview = togglePreview;\r\nInscrybMDE.toggleSideBySide = toggleSideBySide;\r\nInscrybMDE.toggleFullScreen = toggleFullScreen;\r\n\r\n/**\r\n * Bind instance methods for exports.\r\n */\r\nInscrybMDE.prototype.toggleBold = function () {\r\n toggleBold(this);\r\n};\r\nInscrybMDE.prototype.toggleItalic = function () {\r\n toggleItalic(this);\r\n};\r\nInscrybMDE.prototype.toggleStrikethrough = function () {\r\n toggleStrikethrough(this);\r\n};\r\nInscrybMDE.prototype.toggleBlockquote = function () {\r\n toggleBlockquote(this);\r\n};\r\nInscrybMDE.prototype.toggleHeadingSmaller = function () {\r\n toggleHeadingSmaller(this);\r\n};\r\nInscrybMDE.prototype.toggleHeadingBigger = function () {\r\n toggleHeadingBigger(this);\r\n};\r\nInscrybMDE.prototype.toggleHeading1 = function () {\r\n toggleHeading1(this);\r\n};\r\nInscrybMDE.prototype.toggleHeading2 = function () {\r\n toggleHeading2(this);\r\n};\r\nInscrybMDE.prototype.toggleHeading3 = function () {\r\n toggleHeading3(this);\r\n};\r\nInscrybMDE.prototype.toggleCodeBlock = function () {\r\n toggleCodeBlock(this);\r\n};\r\nInscrybMDE.prototype.toggleUnorderedList = function () {\r\n toggleUnorderedList(this);\r\n};\r\nInscrybMDE.prototype.toggleOrderedList = function () {\r\n toggleOrderedList(this);\r\n};\r\nInscrybMDE.prototype.cleanBlock = function () {\r\n cleanBlock(this);\r\n};\r\nInscrybMDE.prototype.drawLink = function () {\r\n drawLink(this);\r\n};\r\nInscrybMDE.prototype.drawImage = function () {\r\n drawImage(this);\r\n};\r\nInscrybMDE.prototype.drawTable = function () {\r\n drawTable(this);\r\n};\r\nInscrybMDE.prototype.drawHorizontalRule = function () {\r\n drawHorizontalRule(this);\r\n};\r\nInscrybMDE.prototype.undo = function () {\r\n undo(this);\r\n};\r\nInscrybMDE.prototype.redo = function () {\r\n redo(this);\r\n};\r\nInscrybMDE.prototype.togglePreview = function () {\r\n togglePreview(this);\r\n};\r\nInscrybMDE.prototype.toggleSideBySide = function () {\r\n toggleSideBySide(this);\r\n};\r\nInscrybMDE.prototype.toggleFullScreen = function () {\r\n toggleFullScreen(this);\r\n};\r\n\r\nInscrybMDE.prototype.isPreviewActive = function () {\r\n var cm = this.codemirror;\r\n var wrapper = cm.getWrapperElement();\r\n var preview = wrapper.lastChild;\r\n\r\n return /editor-preview-active/.test(preview.className);\r\n};\r\n\r\nInscrybMDE.prototype.isSideBySideActive = function () {\r\n var cm = this.codemirror;\r\n var wrapper = cm.getWrapperElement();\r\n var preview = wrapper.nextSibling;\r\n\r\n return /editor-preview-active-side/.test(preview.className);\r\n};\r\n\r\nInscrybMDE.prototype.isFullscreenActive = function () {\r\n var cm = this.codemirror;\r\n\r\n return cm.getOption('fullScreen');\r\n};\r\n\r\nInscrybMDE.prototype.getState = function () {\r\n var cm = this.codemirror;\r\n\r\n return getState(cm);\r\n};\r\n\r\nInscrybMDE.prototype.toTextArea = function () {\r\n var cm = this.codemirror;\r\n var wrapper = cm.getWrapperElement();\r\n\r\n if (wrapper.parentNode) {\r\n if (this.gui.toolbar) {\r\n wrapper.parentNode.removeChild(this.gui.toolbar);\r\n }\r\n if (this.gui.statusbar) {\r\n wrapper.parentNode.removeChild(this.gui.statusbar);\r\n }\r\n if (this.gui.sideBySide) {\r\n wrapper.parentNode.removeChild(this.gui.sideBySide);\r\n }\r\n }\r\n\r\n cm.toTextArea();\r\n\r\n if (this.autosaveTimeoutId) {\r\n clearTimeout(this.autosaveTimeoutId);\r\n this.autosaveTimeoutId = undefined;\r\n this.clearAutosavedValue();\r\n }\r\n};\r\n\r\nmodule.exports = InscrybMDE;\r\n","/**\n * marked v5.1.2 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction getDefaults() {\n return {\n async: false,\n baseUrl: null,\n breaks: false,\n extensions: null,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n hooks: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: null,\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartypants: false,\n tokenizer: null,\n walkTokens: null,\n xhtml: false\n };\n}\n\nlet defaults = getDefaults();\n\nfunction changeDefaults(newDefaults) {\n defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n } else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n/**\n * @param {string} html\n */\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\n\n/**\n * @param {string | RegExp} regex\n * @param {string} opt\n */\nfunction edit(regex, opt) {\n regex = typeof regex === 'string' ? regex : regex.source;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n val = val.source || val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: () => {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n/**\n * @param {boolean} sanitize\n * @param {string} base\n * @param {string} href\n */\nfunction cleanUrl(sanitize, base, href) {\n if (sanitize) {\n let prot;\n try {\n prot = decodeURIComponent(unescape(href))\n .replace(nonWordAndColonTest, '')\n .toLowerCase();\n } catch (e) {\n return null;\n }\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return null;\n }\n }\n if (base && !originIndependentUrl.test(href)) {\n href = resolveUrl(base, href);\n }\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return null;\n }\n return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n/**\n * @param {string} base\n * @param {string} href\n */\nfunction resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (justDomain.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = rtrim(base, '/', true);\n }\n }\n base = baseUrls[' ' + base];\n const relativeBase = base.indexOf(':') === -1;\n\n if (href.substring(0, 2) === '//') {\n if (relativeBase) {\n return href;\n }\n return base.replace(protocol, '$1') + href;\n } else if (href.charAt(0) === '/') {\n if (relativeBase) {\n return href;\n }\n return base.replace(domain, '$1') + href;\n } else {\n return base + href;\n }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false,\n curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(/ \\|/);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) { cells.shift(); }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) { cells.pop(); }\n\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param {string} str\n * @param {string} c\n * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n const l = str.length;\n let level = 0,\n i = 0;\n for (; i < l; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction checkDeprecations(opt, callback) {\n if (!opt || opt.silent) {\n return;\n }\n\n if (callback) {\n console.warn('marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async');\n }\n\n if (opt.sanitize || opt.sanitizer) {\n console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n }\n\n if (opt.highlight || opt.langPrefix !== 'language-') {\n console.warn('marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight.');\n }\n\n if (opt.mangle) {\n console.warn('marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.');\n }\n\n if (opt.baseUrl) {\n console.warn('marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url.');\n }\n\n if (opt.smartypants) {\n console.warn('marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants.');\n }\n\n if (opt.xhtml) {\n console.warn('marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml.');\n }\n\n if (opt.headerIds || opt.headerPrefix) {\n console.warn('marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.');\n }\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n const href = link.href;\n const title = link.title ? escape(link.title) : null;\n const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n const token = {\n type: 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text)\n };\n lexer.state.inLink = false;\n return token;\n }\n return {\n type: 'image',\n raw,\n href,\n title,\n text: escape(text)\n };\n}\n\nfunction indentCodeCompensation(raw, text) {\n const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nclass Tokenizer {\n constructor(options) {\n this.options = options || defaults;\n }\n\n space(src) {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n }\n\n code(src) {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text\n };\n }\n }\n\n fences(src) {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '');\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n text\n };\n }\n }\n\n heading(src) {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (/#$/.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n\n hr(src) {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n }\n\n blockquote(src) {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ *>[ \\t]?/gm, '');\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n const tokens = this.lexer.blockTokens(text);\n this.lexer.state.top = top;\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens,\n text\n };\n }\n }\n\n list(src) {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine,\n line, nextLine, rawLine, itemContents, endEarly;\n\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n\n // Check if current bullet point can start a new List Item\n while (src) {\n endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n nextLine = src.split('\\n', 1)[0];\n\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimLeft();\n } else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n blankLine = false;\n\n if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n\n // Check if following lines should be included in List Item\n while (src) {\n rawLine = src.split('\\n', 1)[0];\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(src)) {\n break;\n }\n\n if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLine.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.search(/[^ ]/) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLine.slice(indent);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimRight();\n list.items[list.items.length - 1].text = itemContents.trimRight();\n list.raw = list.raw.trimRight();\n\n const l = list.items.length;\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (i = 0; i < l; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (i = 0; i < l; i++) {\n list.items[i].loose = true;\n }\n }\n\n return list;\n }\n }\n\n html(src) {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: !this.options.sanitizer\n && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: cap[0]\n };\n if (this.options.sanitize) {\n const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n token.type = 'paragraph';\n token.text = text;\n token.tokens = this.lexer.inline(text);\n }\n return token;\n }\n }\n\n def(src) {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title\n };\n }\n }\n\n table(src) {\n const cap = this.rules.block.table.exec(src);\n if (cap) {\n const item = {\n type: 'table',\n header: splitCells(cap[1]).map(c => { return { text: c }; }),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n item.raw = cap[0];\n\n let l = item.align.length;\n let i, j, k, row;\n for (i = 0; i < l; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n l = item.rows.length;\n for (i = 0; i < l; i++) {\n item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => { return { text: c }; });\n }\n\n // parse child tokens inside headers and cells\n\n // header child tokens\n l = item.header.length;\n for (j = 0; j < l; j++) {\n item.header[j].tokens = this.lexer.inline(item.header[j].text);\n }\n\n // cell child tokens\n l = item.rows.length;\n for (j = 0; j < l; j++) {\n row = item.rows[j];\n for (k = 0; k < row.length; k++) {\n row[k].tokens = this.lexer.inline(row[k].text);\n }\n }\n\n return item;\n }\n }\n }\n\n lheading(src) {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1])\n };\n }\n }\n\n paragraph(src) {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n\n text(src) {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0])\n };\n }\n }\n\n escape(src) {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape(cap[1])\n };\n }\n }\n\n tag(src) {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: this.options.sanitize\n ? 'text'\n : 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: this.options.sanitize\n ? (this.options.sanitizer\n ? this.options.sanitizer(cap[0])\n : escape(cap[0]))\n : cap[0]\n };\n }\n }\n\n link(src) {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^$/.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (/^$/.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n }, cap[0], this.lexer);\n }\n }\n\n reflink(src, links) {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = links[link.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n }\n\n emStrong(src, maskedSrc, prevChar = '') {\n let match = this.rules.inline.emStrong.lDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u)) return;\n\n const nextChar = match[1] || match[2] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n const lLength = match[0].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = rDelim.length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n\n const raw = src.slice(0, lLength + match.index + rLength + 1);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n }\n }\n\n codespan(src) {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text\n };\n }\n }\n\n br(src) {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n }\n\n del(src) {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2])\n };\n }\n }\n\n autolink(src, mangle) {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n href = 'mailto:' + text;\n } else {\n text = escape(cap[1]);\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n\n url(src, mangle) {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n\n inlineText(src, smartypants) {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n let text;\n if (this.lexer.state.inRawBlock) {\n text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0];\n } else {\n text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text\n };\n }\n }\n}\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n newline: /^(?: *(?:\\n|$))+/,\n code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|\\\\n*|$)' // (4)\n + '|\\\\n*|$)' // (5)\n + '|)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n table: noopTest,\n lheading: /^((?:(?!^bull ).|\\n(?!\\n|bull ))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n .replace('label', block._label)\n .replace('title', block._title)\n .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n .replace('bull', block.bullet)\n .getRegex();\n\nblock.list = edit(block.list)\n .replace(/bull/g, block.bullet)\n .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n .replace('def', '\\\\n+(?=' + block.def.source + ')')\n .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n + '|track|ul';\nblock._comment = /|$)/;\nblock.html = edit(block.html, 'i')\n .replace('comment', block._comment)\n .replace('tag', block._tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nblock.lheading = edit(block.lheading)\n .replace(/bull/g, block.bullet) // lists can interrupt\n .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} ')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', ')|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n .replace('paragraph', block.paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = { ...block };\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = {\n ...block.normal,\n table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n};\n\nblock.gfm.table = edit(block.gfm.table)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} ')\n .replace('blockquote', ' {0,3}>')\n .replace('code', ' {4}[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', ')|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.gfm.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} ')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('table', block.gfm.table) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', ')|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = {\n ...block.normal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+? *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', block._comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(block.normal._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', block.lheading)\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .getRegex()\n};\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment'\n + '|^' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. \n + '|^' // declaration, e.g. \n + '|^', // CDATA section\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n reflinkSearch: 'reflink|nolink(?!\\\\()',\n emStrong: {\n lDelim: /^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/,\n // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.\n // | Skip orphan inside strong | Consume to delim | (1) #*** | (2) a***#, a*** | (3) #***a, ***a | (4) ***# | (5) #***# | (6) a***a\n rDelimAst: /^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])/,\n rDelimUnd: /^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ // ^- Not allowed for _\n },\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\`^|~';\ninline.punctuation = edit(inline.punctuation, 'u').replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, \ninline.blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\ninline.anyPunctuation = /\\\\[punct]/g;\ninline._escapes = /\\\\([punct])/g;\n\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\n\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim, 'u')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline.anyPunctuation = edit(inline.anyPunctuation, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline._escapes = edit(inline._escapes, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._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])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n .replace('scheme', inline._scheme)\n .replace('email', inline._email)\n .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n .replace('comment', inline._comment)\n .replace('attribute', inline._attribute)\n .getRegex();\n\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n .replace('label', inline._label)\n .replace('href', inline._href)\n .replace('title', inline._title)\n .getRegex();\n\ninline.reflink = edit(inline.reflink)\n .replace('label', inline._label)\n .replace('ref', block._label)\n .getRegex();\n\ninline.nolink = edit(inline.nolink)\n .replace('ref', block._label)\n .getRegex();\n\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n .replace('reflink', inline.reflink)\n .replace('nolink', inline.nolink)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = { ...inline };\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = {\n ...inline.normal,\n strong: {\n start: /^__|\\*\\*/,\n middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n endAst: /\\*\\*(?!\\*)/g,\n endUnd: /__(?!_)/g\n },\n em: {\n start: /^_|\\*/,\n middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n endAst: /\\*(?!\\*)/g,\n endUnd: /_(?!_)/g\n },\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', inline._label)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', inline._label)\n .getRegex()\n};\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = {\n ...inline.normal,\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\ 0.5) {\n ch = 'x' + ch.toString(16);\n }\n out += '&#' + ch + ';';\n }\n\n return out;\n}\n\n/**\n * Block Lexer\n */\nclass Lexer {\n constructor(options) {\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || defaults;\n this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n\n const rules = {\n block: block.normal,\n inline: inline.normal\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new Lexer(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline(src, options) {\n const lexer = new Lexer(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n let next;\n while (next = this.inlineQueue.shift()) {\n this.inlineTokens(next.src, next.tokens);\n }\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src, tokens = []) {\n if (this.options.pedantic) {\n src = src.replace(/\\t/g, ' ').replace(/^ +$/gm, '');\n } else {\n src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n return leading + ' '.repeat(tabs.length);\n });\n }\n\n let token, lastToken, cutSrc, lastParagraphClipped;\n\n while (src) {\n if (this.options.extensions\n && this.options.extensions.block\n && this.options.extensions.block.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach(function(getStartIndex) {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = (cutSrc.length !== src.length);\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src, tokens = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src, tokens = []) {\n let token, lastToken, cutSrc;\n\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match;\n let keepPrevChar, prevChar;\n\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n // extensions\n if (this.options.extensions\n && this.options.extensions.inline\n && this.options.extensions.inline.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src, mangle)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach(function(getStartIndex) {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n\n/**\n * Renderer\n */\nclass Renderer {\n constructor(options) {\n this.options = options || defaults;\n }\n\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/\\S*/)[0];\n if (this.options.highlight) {\n const out = this.options.highlight(code, lang);\n if (out != null && out !== code) {\n escaped = true;\n code = out;\n }\n }\n\n code = code.replace(/\\n$/, '') + '\\n';\n\n if (!lang) {\n return '
'\n        + (escaped ? code : escape(code, true))\n        + '
\\n';\n }\n\n return '
'\n      + (escaped ? code : escape(code, true))\n      + '
\\n';\n }\n\n /**\n * @param {string} quote\n */\n blockquote(quote) {\n return `
\\n${quote}
\\n`;\n }\n\n html(html, block) {\n return html;\n }\n\n /**\n * @param {string} text\n * @param {string} level\n * @param {string} raw\n * @param {any} slugger\n */\n heading(text, level, raw, slugger) {\n if (this.options.headerIds) {\n const id = this.options.headerPrefix + slugger.slug(raw);\n return `${text}\\n`;\n }\n\n // ignore IDs\n return `${text}\\n`;\n }\n\n hr() {\n return this.options.xhtml ? '
\\n' : '
\\n';\n }\n\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul',\n startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '\\n';\n }\n\n /**\n * @param {string} text\n */\n listitem(text) {\n return `
  • ${text}
  • \\n`;\n }\n\n checkbox(checked) {\n return ' ';\n }\n\n /**\n * @param {string} text\n */\n paragraph(text) {\n return `

    ${text}

    \\n`;\n }\n\n /**\n * @param {string} header\n * @param {string} body\n */\n table(header, body) {\n if (body) body = `${body}`;\n\n return '\\n'\n + '\\n'\n + header\n + '\\n'\n + body\n + '
    \\n';\n }\n\n /**\n * @param {string} content\n */\n tablerow(content) {\n return `\\n${content}\\n`;\n }\n\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? `<${type} align=\"${flags.align}\">`\n : `<${type}>`;\n return tag + content + `\\n`;\n }\n\n /**\n * span level renderer\n * @param {string} text\n */\n strong(text) {\n return `${text}`;\n }\n\n /**\n * @param {string} text\n */\n em(text) {\n return `${text}`;\n }\n\n /**\n * @param {string} text\n */\n codespan(text) {\n return `${text}`;\n }\n\n br() {\n return this.options.xhtml ? '
    ' : '
    ';\n }\n\n /**\n * @param {string} text\n */\n del(text) {\n return `${text}`;\n }\n\n /**\n * @param {string} href\n * @param {string} title\n * @param {string} text\n */\n link(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n let out = '
    ';\n return out;\n }\n\n /**\n * @param {string} href\n * @param {string} title\n * @param {string} text\n */\n image(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n\n let out = `\"${text}\"`;\n' : '>';\n return out;\n }\n\n text(text) {\n return text;\n }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n\n em(text) {\n return text;\n }\n\n codespan(text) {\n return text;\n }\n\n del(text) {\n return text;\n }\n\n html(text) {\n return text;\n }\n\n text(text) {\n return text;\n }\n\n link(href, title, text) {\n return '' + text;\n }\n\n image(href, title, text) {\n return '' + text;\n }\n\n br() {\n return '';\n }\n}\n\n/**\n * Slugger generates header id\n */\nclass Slugger {\n constructor() {\n this.seen = {};\n }\n\n /**\n * @param {string} value\n */\n serialize(value) {\n return value\n .toLowerCase()\n .trim()\n // remove html tags\n .replace(/<[!\\/a-z].*?>/ig, '')\n // remove unwanted chars\n .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n .replace(/\\s/g, '-');\n }\n\n /**\n * Finds the next safe (unique) slug to use\n * @param {string} originalSlug\n * @param {boolean} isDryRun\n */\n getNextSafeSlug(originalSlug, isDryRun) {\n let slug = originalSlug;\n let occurenceAccumulator = 0;\n if (this.seen.hasOwnProperty(slug)) {\n occurenceAccumulator = this.seen[originalSlug];\n do {\n occurenceAccumulator++;\n slug = originalSlug + '-' + occurenceAccumulator;\n } while (this.seen.hasOwnProperty(slug));\n }\n if (!isDryRun) {\n this.seen[originalSlug] = occurenceAccumulator;\n this.seen[slug] = 0;\n }\n return slug;\n }\n\n /**\n * Convert string to unique id\n * @param {object} [options]\n * @param {boolean} [options.dryrun] Generates the next unique slug without\n * updating the internal accumulator.\n */\n slug(value, options = {}) {\n const slug = this.serialize(value);\n return this.getNextSafeSlug(slug, options.dryrun);\n }\n}\n\n/**\n * Parsing & Compiling\n */\nclass Parser {\n constructor(options) {\n this.options = options || defaults;\n this.options.renderer = this.options.renderer || new Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new TextRenderer();\n this.slugger = new Slugger();\n }\n\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new Parser(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens, options) {\n const parser = new Parser(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens, top = true) {\n let out = '',\n i,\n j,\n k,\n l2,\n l3,\n row,\n cell,\n header,\n body,\n token,\n ordered,\n start,\n loose,\n itemBody,\n item,\n checked,\n task,\n checkbox,\n ret;\n\n const l = tokens.length;\n for (i = 0; i < l; i++) {\n token = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n\n switch (token.type) {\n case 'space': {\n continue;\n }\n case 'hr': {\n out += this.renderer.hr();\n continue;\n }\n case 'heading': {\n out += this.renderer.heading(\n this.parseInline(token.tokens),\n token.depth,\n unescape(this.parseInline(token.tokens, this.textRenderer)),\n this.slugger);\n continue;\n }\n case 'code': {\n out += this.renderer.code(token.text,\n token.lang,\n token.escaped);\n continue;\n }\n case 'table': {\n header = '';\n\n // header\n cell = '';\n l2 = token.header.length;\n for (j = 0; j < l2; j++) {\n cell += this.renderer.tablecell(\n this.parseInline(token.header[j].tokens),\n { header: true, align: token.align[j] }\n );\n }\n header += this.renderer.tablerow(cell);\n\n body = '';\n l2 = token.rows.length;\n for (j = 0; j < l2; j++) {\n row = token.rows[j];\n\n cell = '';\n l3 = row.length;\n for (k = 0; k < l3; k++) {\n cell += this.renderer.tablecell(\n this.parseInline(row[k].tokens),\n { header: false, align: token.align[k] }\n );\n }\n\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote': {\n body = this.parse(token.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list': {\n ordered = token.ordered;\n start = token.start;\n loose = token.loose;\n l2 = token.items.length;\n\n body = '';\n for (j = 0; j < l2; j++) {\n item = token.items[j];\n checked = item.checked;\n task = item.task;\n\n itemBody = '';\n if (item.task) {\n checkbox = this.renderer.checkbox(checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n } else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox\n });\n }\n } else {\n itemBody += checkbox;\n }\n }\n\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, checked);\n }\n\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html': {\n out += this.renderer.html(token.text, token.block);\n continue;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(this.parseInline(token.tokens));\n continue;\n }\n case 'text': {\n body = token.tokens ? this.parseInline(token.tokens) : token.text;\n while (i + 1 < l && tokens[i + 1].type === 'text') {\n token = tokens[++i];\n body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n let out = '',\n i,\n token,\n ret;\n\n const l = tokens.length;\n for (i = 0; i < l; i++) {\n token = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token.text);\n break;\n }\n case 'html': {\n out += renderer.html(token.text);\n break;\n }\n case 'link': {\n out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n break;\n }\n case 'image': {\n out += renderer.image(token.href, token.title, token.text);\n break;\n }\n case 'strong': {\n out += renderer.strong(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'em': {\n out += renderer.em(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token.text);\n break;\n }\n case 'br': {\n out += renderer.br();\n break;\n }\n case 'del': {\n out += renderer.del(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'text': {\n out += renderer.text(token.text);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n\nclass Hooks {\n constructor(options) {\n this.options = options || defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess'\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html) {\n return html;\n }\n}\n\nclass Marked {\n defaults = getDefaults();\n options = this.setOptions;\n\n parse = this.#parseMarkdown(Lexer.lex, Parser.parse);\n parseInline = this.#parseMarkdown(Lexer.lexInline, Parser.parseInline);\n\n Parser = Parser;\n parser = Parser.parse;\n Renderer = Renderer;\n TextRenderer = TextRenderer;\n Lexer = Lexer;\n lexer = Lexer.lex;\n Tokenizer = Tokenizer;\n Slugger = Slugger;\n Hooks = Hooks;\n\n constructor(...args) {\n this.use(...args);\n }\n\n walkTokens(tokens, callback) {\n let values = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n for (const cell of token.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of token.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n values = values.concat(this.walkTokens(token.items, callback));\n break;\n }\n default: {\n if (this.defaults.extensions && this.defaults.extensions.childTokens && this.defaults.extensions.childTokens[token.type]) { // Walk any extensions\n this.defaults.extensions.childTokens[token.type].forEach((childTokens) => {\n values = values.concat(this.walkTokens(token[childTokens], callback));\n });\n } else if (token.tokens) {\n values = values.concat(this.walkTokens(token.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n use(...args) {\n const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack };\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if (ext.renderer) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if (ext.tokenizer) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n if (extensions[ext.level]) {\n extensions[ext.level].unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if (ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new Renderer(this.defaults);\n for (const prop in pack.renderer) {\n const prevRenderer = renderer[prop];\n // Replace renderer with func to run extension, but fall back if false\n renderer[prop] = (...args) => {\n let ret = pack.renderer[prop].apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new Tokenizer(this.defaults);\n for (const prop in pack.tokenizer) {\n const prevTokenizer = tokenizer[prop];\n // Replace tokenizer with func to run extension, but fall back if false\n tokenizer[prop] = (...args) => {\n let ret = pack.tokenizer[prop].apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new Hooks();\n for (const prop in pack.hooks) {\n const prevHook = hooks[prop];\n if (Hooks.passThroughHooks.has(prop)) {\n hooks[prop] = (arg) => {\n if (this.defaults.async) {\n return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n\n const ret = pack.hooks[prop].call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n hooks[prop] = (...args) => {\n let ret = pack.hooks[prop].apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n opts.walkTokens = function(token) {\n let values = [];\n values.push(pack.walkTokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n #parseMarkdown(lexer, parser) {\n return (src, opt, callback) => {\n if (typeof opt === 'function') {\n callback = opt;\n opt = null;\n }\n\n const origOpt = { ...opt };\n opt = { ...this.defaults, ...origOpt };\n const throwError = this.#onError(opt.silent, opt.async, callback);\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n checkDeprecations(opt, callback);\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n }\n\n if (callback) {\n const highlight = opt.highlight;\n let tokens;\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n tokens = lexer(src, opt);\n } catch (e) {\n return throwError(e);\n }\n\n const done = (err) => {\n let out;\n\n if (!err) {\n try {\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n out = parser(tokens, opt);\n if (opt.hooks) {\n out = opt.hooks.postprocess(out);\n }\n } catch (e) {\n err = e;\n }\n }\n\n opt.highlight = highlight;\n\n return err\n ? throwError(err)\n : callback(null, out);\n };\n\n if (!highlight || highlight.length < 3) {\n return done();\n }\n\n delete opt.highlight;\n\n if (!tokens.length) return done();\n\n let pending = 0;\n this.walkTokens(tokens, (token) => {\n if (token.type === 'code') {\n pending++;\n setTimeout(() => {\n highlight(token.text, token.lang, (err, code) => {\n if (err) {\n return done(err);\n }\n if (code != null && code !== token.text) {\n token.text = code;\n token.escaped = true;\n }\n\n pending--;\n if (pending === 0) {\n done();\n }\n });\n }, 0);\n }\n });\n\n if (pending === 0) {\n done();\n }\n\n return;\n }\n\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n .then(src => lexer(src, opt))\n .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n .then(tokens => parser(tokens, opt))\n .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n .catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n const tokens = lexer(src, opt);\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch (e) {\n return throwError(e);\n }\n };\n }\n\n #onError(silent, async, callback) {\n return (e) => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '

    An error occurred:

    '\n          + escape(e.message + '', true)\n          + '
    ';\n if (async) {\n return Promise.resolve(msg);\n }\n if (callback) {\n callback(null, msg);\n return;\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n if (callback) {\n callback(e);\n return;\n }\n throw e;\n };\n }\n}\n\nconst markedInstance = new Marked(defaults);\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n return markedInstance.parse(src, opt, callback);\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n markedInstance.setOptions(opt);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens, callback) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Parse Inline\n * @param {string} src\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.Hooks = Hooks;\nmarked.parse = marked;\n\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = Parser.parse;\nconst lexer = Lexer.lex;\n\nexport { Hooks, Lexer, Marked, Parser, Renderer, Slugger, TextRenderer, Tokenizer, defaults, getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n"],"names":["module","exports","Constructor","hasOwnProperty","Object","prototype","slice","Array","createObject","properties","result","create","extendObject","extend","name","constructor","statics","superConstructor","this","apply","arguments","class_","super_","own","target","sources","property","source","i","length","call","extend_1","Nevis","lite","Utilities","forOwn","object","callback","context","key","hasOwn","leftPad","string","times","padding","Utilities_1","Conversion","europa","options","atLeft","atNoWhiteSpace","atParagraph","buffer","inCodeBlock","inOrderedList","inPreformattedBlock","last","left","listDepth","listIndex","_document","document","_element","_tagName","_window","window","append","appendParagraph","output","clean","replace","replacements","value","replacementsRegExp","test","replaceLeft","defineProperties","get","element","set","tagName","toLowerCase","RegExp","Conversion_1","DOMUtilities_1","isVisible","style","getComputedStyle","getPropertyValue","Option","defaultValue","_defaultValue","defineProperty","Option_1","OptionParser_1","exists","some","option","parse","forEach","Plugin_1","after","conversion","afterAll","before","beforeAll","convert","getTagNames","ServiceManager","_services","getService","service","Error","setService","plugins","serviceManager","Europa","_options","getDefaultBaseUri","html","root","createElement","innerHTML","wrapper","contains","display","appendChild","body","plugin","convertElement","removeChild","trim","convertChildren","nodeType","Node","ELEMENT_NODE","childNodes","TEXT_NODE","nodeValue","release","closeWindow","Plugin","register","tag","use","getName","getWindow","baseUri","Europa_1$2","AnchorPlugin","anchors","anchorMap","href","absolute","getAttribute","index","title","inline","push","BlockQuotePlugin","previousLeft","BreakPlugin","CodePlugin","skipped","previousInCodeBlock","DefinitionTermPlugin","DetailsPlugin","hasAttribute","summary","querySelector","EmphasisPlugin","EmptyPlugin","FramePlugin","previousWindow","contentWindow","HeadingPlugin","level","parseInt","match","heading","HorizontalRulePlugin","ImagePlugin","images","imageMap","src","alternativeText","ListItemPlugin","OrderedListPlugin","previousInOrderedList","previousListIndex","ParagraphPlugin","PreformattedPlugin","previousInPreformattedBlock","QuotePlugin","StrongPlugin","UnorderedListPlugin","BrowserWindowService_1","isCloseable","close","baseURI","factory","CodeMirror","CodeMirrorSpellChecker","marked","isMac","navigator","platform","bindings","toggleBold","toggleItalic","drawLink","toggleHeadingSmaller","toggleHeadingBigger","drawImage","toggleBlockquote","toggleOrderedList","toggleUnorderedList","toggleCodeBlock","togglePreview","toggleStrikethrough","toggleHeading1","toggleHeading2","toggleHeading3","cleanBlock","drawTable","drawHorizontalRule","undo","redo","toggleSideBySide","toggleFullScreen","shortcuts","getBindingName","f","isMobile","a","check","userAgent","vendor","opera","substr","fixShortcut","createIcon","enableTooltips","el","undefined","action","actionName","tooltip","createTooltip","noDisable","classList","add","noMobile","tabIndex","icon","className","createSep","getState","cm","pos","getCursor","stat","getTokenAt","type","data","text","types","split","ret","bold","getLine","line","quote","italic","strikethrough","code","link","image","saved_overflow","editor","codemirror","setOption","getOption","overflow","wrap","getWrapperElement","previousSibling","toolbarElements","fullscreen","toolbarButton","sidebyside","nextSibling","_toggleBlock","blockStyles","fenceCharsToInsert","fencing_line","styles","indexOf","token_state","token","state","base","code_type","line_num","firstTok","lastTok","getLineHandle","ch","indentedCode","fencedChars","block_start","block_end","lineCount","cur_start","cur_end","tok","is_code","start","end","replaceRange","setSelection","focus","start_text","start_line","end_text","end_line","fence_chars","operation","search_from","next_line","next_line_last_tok","indentLine","no_sel_and_starting_of_line","sel_multi","start_line_sel","end_line_sel","repl_start","repl_end","_replaceSelection","insertFencingAtSelection","_toggleLine","_toggleHeading","lastChild","startPoint","endPoint","_cleanBlock","url","promptURLs","prompt","promptTexts","insertTexts","table","horizontalRule","preview","useSideBySideListener","setTimeout","previewNormal","toolbar","toolbar_div","sideBySideRenderingFunction","previewRender","on","off","refresh","active","startEnd","assign","getSelection","replaceSelection","direction","size","currHeadingLevel","search","listRegexp","whitespacesRegexp","repl","_getChar","_checkChar","char","rt","arr","exec","start_chars","end_chars","join","_mergeProperties","concat","wordCount","m","count","charCodeAt","toolbarBuiltInButtons","default","InscrybMDE","parent","autoDownloadFA","autoDownloadFontAwesome","styleSheets","rel","getElementsByTagName","console","log","showIcons","status","plainText","markdown","parsingConfig","highlightFormatting","minHeight","autosave","unique_id","uniqueId","render","initialValue","foundSavedValue","isLocalStorageAvailable","localStorage","setItem","removeItem","e","markedOptions","renderingConfig","singleLineBreaks","breaks","codeSyntaxHighlighting","hljs","highlight","highlightAuto","setOptions","_rendered","mode","backdrop","self","keyMaps","addEventListener","event","keyCode","spellChecker","gitHubSpice","codeMirrorInstance","fromTextArea","theme","tabSize","indentUnit","indentWithTabs","lineNumbers","autofocus","extraKeys","lineWrapping","allowDropFileTypes","placeholder","styleSelectedText","inputStyle","getScrollerElement","forceSync","save","gui","createToolbar","statusbar","createStatusbar","enabled","sideBySide","createSideBySide","temp_cm","bind","inscrybmde","form","loaded","getItem","setValue","getElementById","d","Date","hh","getHours","getMinutes","dd","h","autosaveTimeoutId","delay","clearAutosavedValue","parentNode","insertBefore","syncSideBySidePreviewScroll","cScroll","pScroll","v","height","getScrollInfo","clientHeight","ratio","parseFloat","top","move","scrollHeight","scrollTop","onscroll","scrollTo","items","bar","toolbarData","toolbarGuideIcon","hideIcons","nonSeparatorIconsFollow","x","item","toolbarTips","onclick","preventDefault","open","cmWrapper","onUpdate","getValue","setAttribute","val","getDoc","isPreviewActive","isSideBySideActive","isFullscreenActive","toTextArea","clearTimeout","getDefaults","async","baseUrl","extensions","gfm","headerIds","headerPrefix","hooks","langPrefix","mangle","pedantic","renderer","sanitize","sanitizer","silent","smartypants","tokenizer","walkTokens","xhtml","defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","escape","encode","unescapeTest","unescape","_","n","charAt","String","fromCharCode","substring","caret","edit","regex","opt","obj","getRegex","nonWordAndColonTest","originIndependentUrl","cleanUrl","prot","decodeURIComponent","baseUrls","justDomain","rtrim","relativeBase","protocol","domain","resolveUrl","encodeURI","noopTest","splitCells","tableRow","cells","offset","str","escaped","curr","shift","pop","splice","c","invert","l","suffLen","currChar","outputLink","cap","raw","lexer","inLink","tokens","inlineTokens","Tokenizer","space","rules","block","newline","codeBlockStyle","fences","matchIndentToCode","indentToCode","map","node","matchIndentInNode","indentInNode","indentCodeCompensation","lang","_escapes","trimmed","depth","hr","blockquote","blockTokens","list","istask","ischecked","indent","blankLine","endsWithBlankLine","nextLine","rawLine","itemContents","endEarly","bull","isordered","ordered","loose","itemRegex","t","repeat","trimLeft","nextBulletRegex","Math","min","hrRegex","fencesBeginRegex","headingBeginRegex","task","checked","trimRight","spacers","filter","hasMultipleLineBreaks","pre","def","header","align","rows","j","k","row","lheading","paragraph","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","b","findClosingBracket","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","lDelim","punctuation","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","rDelimAst","rDelimUnd","lastIndex","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","prevCapZero","_backpedal","inlineText","_paragraph","_label","_title","bullet","listItemStart","_tag","_comment","normal","reflinkSearch","out","random","toString","_punctuation","blockSkip","anyPunctuation","_scheme","_email","_attribute","_href","strong","middle","endAst","endUnd","em","_extended_email","Lexer","inlineQueue","lex","lexInline","next","lastToken","cutSrc","lastParagraphClipped","leading","tabs","extTokenizer","startBlock","startIndex","Infinity","tempSrc","tempStart","getStartIndex","errMsg","error","keepPrevChar","keys","includes","lastIndexOf","startInline","Renderer","infostring","slugger","slug","listitem","checkbox","tablerow","content","tablecell","flags","TextRenderer","Slugger","seen","serialize","getNextSafeSlug","originalSlug","isDryRun","occurenceAccumulator","dryrun","Parser","textRenderer","parseInline","l2","l3","cell","itemBody","renderers","parser","unshift","Hooks","static","Set","preprocess","postprocess","markedInstance","args","values","childTokens","pack","opts","ext","prevRenderer","prop","prevTokenizer","prevHook","passThroughHooks","has","arg","Promise","resolve","then","origOpt","throwError","warn","checkDeprecations","done","err","pending","all","catch","message","msg","reject"],"sourceRoot":""}