{"version":3,"file":"js/2597.bebe396e.js","mappings":"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","sources":["webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/dom.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/render-type.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/cards/image.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/section-types.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/tag-names.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/array-utils.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/sanitization-utils.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/render-utils.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/renderers/0-2.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/utils/marker-types.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/renderers/0-3.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/renderer-factory.js","webpack://dicom-frontend/./node_modules/mobiledoc-dom-renderer/lib/index.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/cards/image.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/index.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/renderer-factory.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/renderers/0-2.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/renderers/0-3.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/utils/dom.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/utils/marker-types.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/utils/render-type.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/utils/section-types.js","webpack://dicom-frontend/./node_modules/mobiledoc-html-renderer/dist/commonjs/mobiledoc-html-renderer/utils/tag-names.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/cards/image.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/edit-history.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/edit-state.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/editor.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/event-manager.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/key-commands.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/mutation-handler.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/post.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/post/post-inserter.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/selection-change-observer.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/selection-manager.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/text-input-handler.js","webpack://dicom-frontend/./node_modules/mobiledoc-kit/dist/commonjs/mobiledoc-kit/editor/text-input-handlers.js"],"sourcesContent":["const NBSP = '\\u00A0';\nconst EMSP = '\\u2003';\n\nfunction prepareText(text) {\n return text.replace(/ /g, ' ' + NBSP).replace(/\\t/g, EMSP);\n}\n\nexport function createTextNode(dom, text) {\n return dom.createTextNode(prepareText(text));\n}\n\nexport function normalizeTagName(tagName) {\n return tagName.toLowerCase();\n}\n","export default 'dom';\n","import RENDER_TYPE from '../utils/render-type';\n\nexport default {\n name: 'image',\n type: RENDER_TYPE,\n render({payload, env: {dom}}) {\n let img = dom.createElement('img');\n img.src = payload.src;\n return img;\n }\n};\n","export const MARKUP_SECTION_TYPE = 1;\nexport const IMAGE_SECTION_TYPE = 2;\nexport const LIST_SECTION_TYPE = 3;\nexport const CARD_SECTION_TYPE = 10;\n","import {\n MARKUP_SECTION_TYPE,\n LIST_SECTION_TYPE\n} from './section-types';\nimport { normalizeTagName } from './dom';\n\nconst MARKUP_SECTION_TAG_NAMES = [\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pull-quote', 'aside'\n].map(normalizeTagName);\n\nconst MARKUP_SECTION_ELEMENT_NAMES = [\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'aside'\n].map(normalizeTagName);\n\nconst LIST_SECTION_TAG_NAMES = [\n 'ul', 'ol'\n].map(normalizeTagName);\n\nconst MARKUP_TYPES = [\n 'b', 'i', 'strong', 'em', 'a', 'u', 'sub', 'sup', 's', 'code'\n].map(normalizeTagName);\n\nfunction contains(array, item) {\n return array.indexOf(item) !== -1;\n}\n\nexport function isValidSectionTagName(tagName, sectionType) {\n tagName = normalizeTagName(tagName);\n\n switch (sectionType) {\n case MARKUP_SECTION_TYPE:\n return contains(MARKUP_SECTION_TAG_NAMES, tagName);\n case LIST_SECTION_TYPE:\n return contains(LIST_SECTION_TAG_NAMES, tagName);\n default:\n throw new Error(`Cannot validate tagName for unknown section type \"${sectionType}\"`);\n }\n}\n\nexport function isMarkupSectionElementName(tagName) {\n tagName = normalizeTagName(tagName);\n return contains(MARKUP_SECTION_ELEMENT_NAMES, tagName);\n}\n\nexport function isValidMarkerType(type) {\n type = normalizeTagName(type);\n return contains(MARKUP_TYPES, type);\n}\n","export function includes(array, detectValue) {\n for (let i=0;i < array.length;i++) {\n let value = array[i];\n if (value === detectValue) {\n return true;\n }\n }\n return false;\n}\n\n\n/**\n * @param {Array} array of key1,value1,key2,value2,...\n * @return {Object} {key1:value1, key2:value2, ...}\n * @private\n */\nexport function kvArrayToObject(array) {\n if (!Array.isArray(array)) { return {}; }\n\n const obj = {};\n for (let i = 0; i < array.length; i+=2) {\n let [key, value] = [array[i], array[i+1]];\n obj[key] = value;\n }\n return obj;\n}\n\n/**\n * @param {Object} {key1:value1, key2:value2, ...}\n * @return {Array} array of key1,value1,key2,value2,...\n * @private\n */\nexport function objectToSortedKVArray(obj) {\n const keys = Object.keys(obj).sort();\n const result = [];\n keys.forEach(k => {\n result.push(k);\n result.push(obj[k]);\n });\n return result;\n}\n","import { includes } from './array-utils';\n\nconst PROTOCOL_REGEXP = /.+:/i;\n\nconst badProtocols = [\n 'javascript', // jshint ignore:line\n 'vbscript' // jshint ignore:line\n];\n\nfunction getProtocol(url) {\n let matches = url && url.match(PROTOCOL_REGEXP);\n let protocol = matches && matches[0] && matches[0].split(':')[0] || '';\n return protocol;\n}\n\nexport function sanitizeHref(url) {\n let protocol = getProtocol(url).toLowerCase().replace(/ /g, '');\n if (includes(badProtocols, protocol)) {\n return `unsafe:${url}`;\n }\n return url;\n}\n\n/**\n * @param attributes array\n * @return obj with normalized attribute names (lowercased)\n */\nexport function reduceAttributes(attributes) {\n let obj = {};\n for (let i = 0; i < attributes.length; i += 2) {\n let key = attributes[i];\n let val = attributes[i+1];\n obj[key.toLowerCase()] = val;\n }\n return obj;\n}\n","import {\n isMarkupSectionElementName\n} from '../utils/tag-names';\nimport {\n sanitizeHref\n} from './sanitization-utils';\n\nexport const VALID_ATTRIBUTES = [\n 'data-md-text-align'\n];\n\nfunction _isValidAttribute(attr) {\n return VALID_ATTRIBUTES.indexOf(attr) !== -1;\n}\n\nfunction handleMarkupSectionAttribute(element, attributeKey, attributeValue) {\n if (!_isValidAttribute(attributeKey)) {\n throw new Error(`Cannot use attribute: ${attributeKey}`);\n }\n\n element.setAttribute(attributeKey, attributeValue);\n}\n\nexport function defaultSectionElementRenderer(tagName, dom, attrsObj = {}) {\n let element;\n if (isMarkupSectionElementName(tagName)) {\n element = dom.createElement(tagName);\n\n Object.keys(attrsObj).forEach(k => {\n handleMarkupSectionAttribute(element, k, attrsObj[k]);\n });\n } else {\n element = dom.createElement('div');\n element.setAttribute('class', tagName);\n }\n\n return element;\n}\n\nfunction sanitizeAttribute(tagName, attrName, attrValue) {\n if (tagName === 'a' && attrName === 'href') {\n return sanitizeHref(attrValue);\n } else {\n return attrValue;\n }\n}\n\nexport function defaultMarkupElementRenderer(tagName, dom, attrsObj) {\n let element = dom.createElement(tagName);\n Object.keys(attrsObj).forEach(attrName => {\n let attrValue = attrsObj[attrName];\n attrValue = sanitizeAttribute(tagName, attrName, attrValue);\n element.setAttribute(attrName, attrValue);\n });\n return element;\n}\n\n","import { createTextNode } from '../utils/dom';\nimport ImageCard from '../cards/image';\nimport RENDER_TYPE from '../utils/render-type';\nimport {\n MARKUP_SECTION_TYPE,\n IMAGE_SECTION_TYPE,\n LIST_SECTION_TYPE,\n CARD_SECTION_TYPE\n} from '../utils/section-types';\nimport {\n isValidSectionTagName,\n isValidMarkerType\n} from '../utils/tag-names';\nimport {\n reduceAttributes\n} from '../utils/sanitization-utils';\nimport {\n defaultSectionElementRenderer,\n defaultMarkupElementRenderer\n} from '../utils/render-utils';\n\nexport const MOBILEDOC_VERSION = '0.2.0';\n\nconst IMAGE_SECTION_TAG_NAME = 'img';\n\nfunction validateVersion(version) {\n if (version !== MOBILEDOC_VERSION) {\n throw new Error(`Unexpected Mobiledoc version \"${version}\"`);\n }\n}\n\nexport default class Renderer {\n constructor(mobiledoc, options) {\n let {\n cards,\n cardOptions,\n unknownCardHandler,\n markupElementRenderer,\n sectionElementRenderer,\n dom\n } = options;\n let {\n version,\n sections: sectionData\n } = mobiledoc;\n validateVersion(version);\n\n const [markerTypes, sections] = sectionData;\n\n this.dom = dom;\n this.root = dom.createDocumentFragment();\n this.markerTypes = markerTypes;\n this.sections = sections;\n this.cards = cards;\n this.cardOptions = cardOptions;\n this.unknownCardHandler = unknownCardHandler || this._defaultUnknownCardHandler;\n\n this.sectionElementRenderer = {\n '__default__': defaultSectionElementRenderer\n };\n Object.keys(sectionElementRenderer).forEach(key => {\n this.sectionElementRenderer[key.toLowerCase()] = sectionElementRenderer[key];\n });\n\n this.markupElementRenderer = {\n '__default__': defaultMarkupElementRenderer\n };\n Object.keys(markupElementRenderer).forEach(key => {\n this.markupElementRenderer[key.toLowerCase()] = markupElementRenderer[key];\n });\n\n this._renderCallbacks = [];\n this._teardownCallbacks = [];\n this._renderedChildNodes = [];\n }\n\n get _defaultUnknownCardHandler() {\n return ({env: {name}}) => {\n throw new Error(`Card \"${name}\" not found but no unknownCardHandler was registered`);\n };\n }\n\n render() {\n this.sections.forEach(section => {\n let rendered = this.renderSection(section);\n if (rendered) {\n this.root.appendChild(rendered);\n }\n });\n for (let i = 0; i < this._renderCallbacks.length; i++) {\n this._renderCallbacks[i]();\n }\n // maintain a reference to child nodes so they can be cleaned up later by teardown\n this._renderedChildNodes = [];\n let node = this.root.firstChild;\n while (node) {\n this._renderedChildNodes.push(node);\n node = node.nextSibling;\n }\n return { result: this.root, teardown: () => this.teardown() };\n }\n\n teardown() {\n for (let i=0; i < this._teardownCallbacks.length; i++) {\n this._teardownCallbacks[i]();\n }\n for (let i=0; i < this._renderedChildNodes.length; i++) {\n let node = this._renderedChildNodes[i];\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n }\n\n renderSection(section) {\n const [type] = section;\n switch (type) {\n case MARKUP_SECTION_TYPE:\n return this.renderMarkupSection(section);\n case IMAGE_SECTION_TYPE:\n return this.renderImageSection(section);\n case LIST_SECTION_TYPE:\n return this.renderListSection(section);\n case CARD_SECTION_TYPE:\n return this.renderCardSection(section);\n default:\n throw new Error(`Cannot render mobiledoc section of type \"${type}\"`);\n }\n }\n\n renderMarkersOnElement(element, markers) {\n let elements = [element];\n let currentElement = element;\n\n let pushElement = (openedElement) => {\n currentElement.appendChild(openedElement);\n elements.push(openedElement);\n currentElement = openedElement;\n };\n\n for (let i=0, l=markers.length; i {\n element.appendChild(this.renderListItem(li));\n });\n return element;\n }\n\n renderImageSection([type, src]) {\n let element = this.dom.createElement(IMAGE_SECTION_TAG_NAME);\n element.src = src;\n return element;\n }\n\n findCard(name) {\n for (let i=0; i < this.cards.length; i++) {\n if (this.cards[i].name === name) {\n return this.cards[i];\n }\n }\n if (name === ImageCard.name) {\n return ImageCard;\n }\n return this._createUnknownCard(name);\n }\n\n _createUnknownCard(name) {\n return {\n name,\n type: RENDER_TYPE,\n render: this.unknownCardHandler\n };\n }\n\n _createCardArgument(card, payload={}) {\n let env = {\n name: card.name,\n isInEditor: false,\n dom: this.dom,\n didRender: (callback) => this._registerRenderCallback(callback),\n onTeardown: (callback) => this._registerTeardownCallback(callback)\n };\n\n let options = this.cardOptions;\n\n return { env, options, payload };\n }\n\n _registerRenderCallback(callback) {\n this._renderCallbacks.push(callback);\n }\n\n _registerTeardownCallback(callback) {\n this._teardownCallbacks.push(callback);\n }\n\n renderCardSection([type, name, payload]) {\n let card = this.findCard(name);\n\n let cardArg = this._createCardArgument(card, payload);\n let rendered = card.render(cardArg);\n\n this._validateCardRender(rendered, card.name);\n\n return rendered;\n }\n\n _validateCardRender(rendered, cardName) {\n if (!rendered) {\n return;\n }\n\n if (typeof rendered !== 'object') {\n throw new Error(`Card \"${cardName}\" must render ${RENDER_TYPE}, but result was \"${rendered}\"`);\n }\n }\n\n renderMarkupSection([type, tagName, markers]) {\n tagName = tagName.toLowerCase();\n if (!isValidSectionTagName(tagName, MARKUP_SECTION_TYPE)) {\n return;\n }\n\n let renderer = this.sectionElementRendererFor(tagName);\n let element = renderer(tagName, this.dom);\n\n this.renderMarkersOnElement(element, markers);\n return element;\n }\n\n sectionElementRendererFor(tagName) {\n return this.sectionElementRenderer[tagName] ||\n this.sectionElementRenderer.__default__;\n }\n}\n\n","export const MARKUP_MARKER_TYPE = 0;\nexport const ATOM_MARKER_TYPE = 1;","import { createTextNode } from '../utils/dom';\nimport ImageCard from '../cards/image';\nimport RENDER_TYPE from '../utils/render-type';\nimport {\n MARKUP_SECTION_TYPE,\n IMAGE_SECTION_TYPE,\n LIST_SECTION_TYPE,\n CARD_SECTION_TYPE\n} from '../utils/section-types';\nimport {\n isValidSectionTagName,\n isValidMarkerType\n} from '../utils/tag-names';\nimport {\n reduceAttributes\n} from '../utils/sanitization-utils';\nimport {\n defaultSectionElementRenderer,\n defaultMarkupElementRenderer\n} from '../utils/render-utils';\n\nimport {\n MARKUP_MARKER_TYPE,\n ATOM_MARKER_TYPE\n} from '../utils/marker-types';\n\nexport const MOBILEDOC_VERSION_0_3_0 = '0.3.0';\nexport const MOBILEDOC_VERSION_0_3_1 = '0.3.1';\nexport const MOBILEDOC_VERSION_0_3_2 = '0.3.2';\n\nconst IMAGE_SECTION_TAG_NAME = 'img';\n\nfunction validateVersion(version) {\n switch (version) {\n case MOBILEDOC_VERSION_0_3_0:\n case MOBILEDOC_VERSION_0_3_1:\n case MOBILEDOC_VERSION_0_3_2:\n return;\n default:\n throw new Error(`Unexpected Mobiledoc version \"${version}\"`);\n }\n}\n\nexport default class Renderer {\n constructor(mobiledoc, state) {\n\n let {\n cards,\n cardOptions,\n atoms,\n unknownCardHandler,\n unknownAtomHandler,\n markupElementRenderer,\n sectionElementRenderer,\n dom\n } = state;\n let {\n version,\n sections,\n atoms: atomTypes,\n cards: cardTypes,\n markups: markerTypes\n } = mobiledoc;\n validateVersion(version);\n\n this.dom = dom;\n this.root = this.dom.createDocumentFragment();\n this.sections = sections;\n this.atomTypes = atomTypes;\n this.cardTypes = cardTypes;\n this.markerTypes = markerTypes;\n this.cards = cards;\n this.atoms = atoms;\n this.cardOptions = cardOptions;\n this.unknownCardHandler = unknownCardHandler || this._defaultUnknownCardHandler;\n this.unknownAtomHandler = unknownAtomHandler || this._defaultUnknownAtomHandler;\n\n this.sectionElementRenderer = {\n '__default__': defaultSectionElementRenderer\n };\n Object.keys(sectionElementRenderer).forEach(key => {\n this.sectionElementRenderer[key.toLowerCase()] = sectionElementRenderer[key];\n });\n\n this.markupElementRenderer = {\n '__default__': defaultMarkupElementRenderer\n };\n Object.keys(markupElementRenderer).forEach(key => {\n this.markupElementRenderer[key.toLowerCase()] = markupElementRenderer[key];\n });\n\n this._renderCallbacks = [];\n this._teardownCallbacks = [];\n }\n\n get _defaultUnknownCardHandler() {\n return ({env: {name}}) => {\n throw new Error(`Card \"${name}\" not found but no unknownCardHandler was registered`);\n };\n }\n\n get _defaultUnknownAtomHandler() {\n return ({env: {name}}) => {\n throw new Error(`Atom \"${name}\" not found but no unknownAtomHandler was registered`);\n };\n }\n\n render() {\n this.sections.forEach(section => {\n let rendered = this.renderSection(section);\n if (rendered) {\n this.root.appendChild(rendered);\n }\n });\n for (let i=0; i < this._renderCallbacks.length; i++) {\n this._renderCallbacks[i]();\n }\n // maintain a reference to child nodes so they can be cleaned up later by teardown\n this._renderedChildNodes = Array.prototype.slice.call(this.root.childNodes);\n return { result: this.root, teardown: () => this.teardown() };\n }\n\n teardown() {\n for (let i=0; i < this._teardownCallbacks.length; i++) {\n this._teardownCallbacks[i]();\n }\n for (let i=0; i < this._renderedChildNodes.length; i++) {\n let node = this._renderedChildNodes[i];\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n }\n\n renderSection(section) {\n const [type] = section;\n switch (type) {\n case MARKUP_SECTION_TYPE:\n return this.renderMarkupSection(section);\n case IMAGE_SECTION_TYPE:\n return this.renderImageSection(section);\n case LIST_SECTION_TYPE:\n return this.renderListSection(section);\n case CARD_SECTION_TYPE:\n return this.renderCardSection(section);\n default:\n throw new Error(`Cannot render mobiledoc section of type \"${type}\"`);\n }\n }\n\n renderMarkersOnElement(element, markers) {\n let elements = [element];\n let currentElement = element;\n\n let pushElement = (openedElement) => {\n currentElement.appendChild(openedElement);\n elements.push(openedElement);\n currentElement = openedElement;\n };\n\n for (let i=0, l=markers.length; i {\n element.appendChild(this.renderListItem(li));\n });\n return element;\n }\n\n renderImageSection([type, src]) {\n let element = this.dom.createElement(IMAGE_SECTION_TAG_NAME);\n element.src = src;\n return element;\n }\n\n findCard(name) {\n for (let i=0; i < this.cards.length; i++) {\n if (this.cards[i].name === name) {\n return this.cards[i];\n }\n }\n if (name === ImageCard.name) {\n return ImageCard;\n }\n return this._createUnknownCard(name);\n }\n\n _findCardByIndex(index) {\n let cardType = this.cardTypes[index];\n if (!cardType) {\n throw new Error(`No card definition found at index ${index}`);\n }\n\n let [ name, payload ] = cardType;\n let card = this.findCard(name);\n\n return {\n card,\n payload\n };\n }\n\n _createUnknownCard(name) {\n return {\n name,\n type: RENDER_TYPE,\n render: this.unknownCardHandler\n };\n }\n\n _createCardArgument(card, payload={}) {\n let env = {\n name: card.name,\n isInEditor: false,\n dom: this.dom,\n didRender: (callback) => this._registerRenderCallback(callback),\n onTeardown: (callback) => this._registerTeardownCallback(callback)\n };\n\n let options = this.cardOptions;\n\n return { env, options, payload };\n }\n\n _registerTeardownCallback(callback) {\n this._teardownCallbacks.push(callback);\n }\n\n _registerRenderCallback(callback) {\n this._renderCallbacks.push(callback);\n }\n\n renderCardSection([type, index]) {\n let { card, payload } = this._findCardByIndex(index);\n\n let cardArg = this._createCardArgument(card, payload);\n let rendered = card.render(cardArg);\n\n this._validateCardRender(rendered, card.name);\n\n return rendered;\n }\n\n _validateCardRender(rendered, cardName) {\n if (!rendered) {\n return;\n }\n\n if (typeof rendered !== 'object') {\n throw new Error(`Card \"${cardName}\" must render ${RENDER_TYPE}, but result was \"${rendered}\"`);\n }\n }\n\n findAtom(name) {\n for (let i=0; i < this.atoms.length; i++) {\n if (this.atoms[i].name === name) {\n return this.atoms[i];\n }\n }\n return this._createUnknownAtom(name);\n }\n\n _createUnknownAtom(name) {\n return {\n name,\n type: RENDER_TYPE,\n render: this.unknownAtomHandler\n };\n }\n\n _createAtomArgument(atom, value, payload) {\n let env = {\n name: atom.name,\n isInEditor: false,\n dom: this.dom,\n onTeardown: (callback) => this._registerTeardownCallback(callback)\n };\n\n let options = this.cardOptions;\n\n return { env, options, value, payload };\n }\n\n _validateAtomRender(rendered, atomName) {\n if (!rendered) {\n return;\n }\n\n if (typeof rendered !== 'object') {\n throw new Error(`Atom \"${atomName}\" must render ${RENDER_TYPE}, but result was \"${rendered}\"`);\n }\n }\n\n _findAtomByIndex(index) {\n let atomType = this.atomTypes[index];\n if (!atomType) {\n throw new Error(`No atom definition found at index ${index}`);\n }\n\n let [ name, value, payload ] = atomType;\n let atom = this.findAtom(name);\n\n return {\n atom,\n value,\n payload\n };\n }\n\n _renderAtom(index) {\n let { atom, value, payload } = this._findAtomByIndex(index);\n\n let atomArg = this._createAtomArgument(atom, value, payload);\n let rendered = atom.render(atomArg);\n\n this._validateAtomRender(rendered, atom.name);\n\n return rendered || createTextNode(this.dom, '');\n }\n\n renderMarkupSection([type, tagName, markers, attributes = []]) {\n tagName = tagName.toLowerCase();\n if (!isValidSectionTagName(tagName, MARKUP_SECTION_TYPE)) {\n return;\n }\n\n let attrsObj = reduceAttributes(attributes);\n let renderer = this.sectionElementRendererFor(tagName);\n let element = renderer(tagName, this.dom, attrsObj);\n\n this.renderMarkersOnElement(element, markers);\n return element;\n }\n\n sectionElementRendererFor(tagName) {\n return this.sectionElementRenderer[tagName] ||\n this.sectionElementRenderer.__default__;\n }\n}\n\n"," import Renderer_0_2, {\n MOBILEDOC_VERSION as MOBILEDOC_VERSION_0_2\n } from './renderers/0-2';\n import Renderer_0_3, {\n MOBILEDOC_VERSION_0_3_0,\n MOBILEDOC_VERSION_0_3_1,\n MOBILEDOC_VERSION_0_3_2\n } from './renderers/0-3';\n import RENDER_TYPE from './utils/render-type';\n\n/**\n * runtime DOM renderer\n * renders a mobiledoc to DOM\n *\n * input: mobiledoc\n * output: DOM\n */\n\n function validateCards(cards) {\n if (!Array.isArray(cards)) {\n throw new Error('`cards` must be passed as an array');\n }\n for (let i=0; i < cards.length; i++) {\n let card = cards[i];\n if (card.type !== RENDER_TYPE) {\n throw new Error(`Card \"${card.name}\" must be of type \"${RENDER_TYPE}\", was \"${card.type}\"`);\n }\n if (!card.render) {\n throw new Error(`Card \"${card.name}\" must define \\`render\\``);\n }\n }\n }\n\n function validateAtoms(atoms) {\n if (!Array.isArray(atoms)) {\n throw new Error('`atoms` must be passed as an array');\n }\n for (let i=0; i < atoms.length; i++) {\n let atom = atoms[i];\n if (atom.type !== RENDER_TYPE) {\n throw new Error(`Atom \"${atom.name}\" must be type \"${RENDER_TYPE}\", was \"${atom.type}\"`);\n }\n if (!atom.render) {\n throw new Error(`Atom \"${atom.name}\" must define \\`render\\``);\n }\n }\n }\n\n export default class RendererFactory {\n constructor({\n cards=[],\n atoms=[],\n cardOptions={},\n unknownCardHandler,\n unknownAtomHandler,\n markupElementRenderer={},\n sectionElementRenderer={},\n dom,\n markupSanitizer=null\n }={}) {\n validateCards(cards);\n validateAtoms(atoms);\n\n if (!dom) {\n if (typeof window === 'undefined') {\n throw new Error('A `dom` option must be provided to the renderer when running without window.document');\n }\n dom = window.document;\n }\n\n this.options = {\n cards,\n atoms,\n cardOptions,\n unknownCardHandler,\n unknownAtomHandler,\n markupElementRenderer,\n sectionElementRenderer,\n dom,\n markupSanitizer\n };\n }\n\n render(mobiledoc) {\n let { version } = mobiledoc;\n switch (version) {\n case MOBILEDOC_VERSION_0_2:\n case undefined:\n case null:\n return new Renderer_0_2(mobiledoc, this.options).render();\n case MOBILEDOC_VERSION_0_3_0:\n case MOBILEDOC_VERSION_0_3_1:\n case MOBILEDOC_VERSION_0_3_2:\n return new Renderer_0_3(mobiledoc, this.options).render();\n default:\n throw new Error(`Unexpected Mobiledoc version \"${version}\"`);\n }\n }\n }\n","import RendererFactory from './renderer-factory';\nimport RENDER_TYPE from './utils/render-type';\n\nexport { RENDER_TYPE };\n\nexport function registerGlobal(window) {\n window.MobiledocDOMRenderer = RendererFactory;\n}\n\nexport default RendererFactory;\n","'use strict';\n\nvar _utilsRenderType = require('../utils/render-type');\n\nexports['default'] = {\n name: 'image-card',\n type: _utilsRenderType['default'],\n render: function render(_ref) {\n var env = _ref.env;\n var options = _ref.options;\n var payload = _ref.payload;\n\n if (payload.src) {\n return '';\n }\n }\n};","'use strict';\n\nexports.registerGlobal = registerGlobal;\n\nvar _rendererFactory = require('./renderer-factory');\n\nvar _utilsRenderType = require('./utils/render-type');\n\nfunction registerGlobal(window) {\n window.MobiledocHTMLRenderer = _rendererFactory['default'];\n}\n\nexports.RENDER_TYPE = _utilsRenderType['default'];\nexports['default'] = _rendererFactory['default'];","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _renderers02 = require('./renderers/0-2');\n\nvar _renderers03 = require('./renderers/0-3');\n\nvar _utilsRenderType = require('./utils/render-type');\n\nfunction validateCards(cards) {\n if (!Array.isArray(cards)) {\n throw new Error('`cards` must be passed as an array');\n }\n for (var i = 0; i < cards.length; i++) {\n var card = cards[i];\n if (card.type !== _utilsRenderType['default']) {\n throw new Error('Card \"' + card.name + '\" must be of type \"' + _utilsRenderType['default'] + '\", was \"' + card.type + '\"');\n }\n if (!card.render) {\n throw new Error('Card \"' + card.name + '\" must define `render`');\n }\n }\n}\n\nfunction validateAtoms(atoms) {\n if (!Array.isArray(atoms)) {\n throw new Error('`atoms` must be passed as an array');\n }\n for (var i = 0; i < atoms.length; i++) {\n var atom = atoms[i];\n if (atom.type !== _utilsRenderType['default']) {\n throw new Error('Atom \"' + atom.name + '\" must be type \"' + _utilsRenderType['default'] + '\", was \"' + atom.type + '\"');\n }\n if (!atom.render) {\n throw new Error('Atom \"' + atom.name + '\" must define `render`');\n }\n }\n}\n\nvar RendererFactory = (function () {\n function RendererFactory() {\n var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var cards = _ref.cards;\n var atoms = _ref.atoms;\n var cardOptions = _ref.cardOptions;\n var unknownCardHandler = _ref.unknownCardHandler;\n var unknownAtomHandler = _ref.unknownAtomHandler;\n var sectionElementRenderer = _ref.sectionElementRenderer;\n\n _classCallCheck(this, RendererFactory);\n\n cards = cards || [];\n validateCards(cards);\n atoms = atoms || [];\n validateAtoms(atoms);\n cardOptions = cardOptions || {};\n\n this.state = {\n cards: cards,\n atoms: atoms,\n cardOptions: cardOptions,\n unknownCardHandler: unknownCardHandler,\n unknownAtomHandler: unknownAtomHandler,\n sectionElementRenderer: sectionElementRenderer\n };\n }\n\n _createClass(RendererFactory, [{\n key: 'render',\n value: function render(mobiledoc) {\n var version = mobiledoc.version;\n\n switch (version) {\n case _renderers02.MOBILEDOC_VERSION:\n case undefined:\n case null:\n return new _renderers02['default'](mobiledoc, this.state).render();\n case _renderers03.MOBILEDOC_VERSION_0_3_0:\n case _renderers03.MOBILEDOC_VERSION_0_3_1:\n return new _renderers03['default'](mobiledoc, this.state).render();\n default:\n throw new Error('Unexpected Mobiledoc version \"' + version + '\"');\n }\n }\n }]);\n\n return RendererFactory;\n})();\n\nexports['default'] = RendererFactory;","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsDom = require('../utils/dom');\n\nvar _cardsImage = require('../cards/image');\n\nvar _utilsRenderType = require('../utils/render-type');\n\nvar _utilsSectionTypes = require('../utils/section-types');\n\nvar _utilsTagNames = require('../utils/tag-names');\n\nvar MOBILEDOC_VERSION = '0.2.0';\n\nexports.MOBILEDOC_VERSION = MOBILEDOC_VERSION;\n/**\n * runtime HTML renderer\n * renders a mobiledoc to HTML\n *\n * input: mobiledoc\n * output: HTML\n */\n\nfunction createElementFromMarkerType() {\n var _ref = arguments.length <= 0 || arguments[0] === undefined ? ['', []] : arguments[0];\n\n var _ref2 = _slicedToArray(_ref, 2);\n\n var tagName = _ref2[0];\n var attributes = _ref2[1];\n\n var element = (0, _utilsDom.createElement)(tagName);\n attributes = attributes || [];\n\n for (var i = 0, l = attributes.length; i < l; i = i + 2) {\n var propName = attributes[i],\n propValue = attributes[i + 1];\n (0, _utilsDom.setAttribute)(element, propName, propValue);\n }\n return element;\n}\n\nfunction validateVersion(version) {\n if (version !== MOBILEDOC_VERSION) {\n throw new Error('Unexpected Mobiledoc version \"' + version + '\"');\n }\n}\n\nvar Renderer = (function () {\n function Renderer(mobiledoc, state) {\n _classCallCheck(this, Renderer);\n\n var cards = state.cards;\n var cardOptions = state.cardOptions;\n var unknownCardHandler = state.unknownCardHandler;\n var sectionElementRenderer = state.sectionElementRenderer;\n var version = mobiledoc.version;\n var sectionData = mobiledoc.sections;\n\n validateVersion(version);\n\n var _sectionData = _slicedToArray(sectionData, 2);\n\n var markerTypes = _sectionData[0];\n var sections = _sectionData[1];\n\n this.root = (0, _utilsDom.createDocumentFragment)();\n this.markerTypes = markerTypes;\n this.sections = sections;\n this.cards = cards;\n this.cardOptions = cardOptions;\n this.unknownCardHandler = unknownCardHandler || this._defaultUnknownCardHandler;\n\n this.sectionElementRenderer = {};\n if (sectionElementRenderer) {\n for (var key in sectionElementRenderer) {\n if (sectionElementRenderer.hasOwnProperty(key)) {\n this.sectionElementRenderer[key.toLowerCase()] = sectionElementRenderer[key];\n }\n }\n }\n\n this._teardownCallbacks = [];\n }\n\n _createClass(Renderer, [{\n key: 'render',\n value: function render() {\n var _this = this;\n\n this.sections.forEach(function (section) {\n var rendered = _this.renderSection(section);\n if (rendered) {\n (0, _utilsDom.appendChild)(_this.root, rendered);\n }\n });\n\n return { result: this.root.toString(), teardown: function teardown() {\n return _this.teardown();\n } };\n }\n }, {\n key: 'teardown',\n value: function teardown() {\n for (var i = 0; i < this._teardownCallbacks.length; i++) {\n this._teardownCallbacks[i]();\n }\n }\n }, {\n key: 'renderSection',\n value: function renderSection(section) {\n var _section = _slicedToArray(section, 1);\n\n var type = _section[0];\n\n switch (type) {\n case _utilsSectionTypes.MARKUP_SECTION_TYPE:\n return this.renderMarkupSection(section);\n case _utilsSectionTypes.IMAGE_SECTION_TYPE:\n return this.renderImageSection(section);\n case _utilsSectionTypes.LIST_SECTION_TYPE:\n return this.renderListSection(section);\n case _utilsSectionTypes.CARD_SECTION_TYPE:\n return this.renderCardSection(section);\n default:\n throw new Error('Renderer cannot render type \"' + type + '\"');\n }\n }\n }, {\n key: 'renderListSection',\n value: function renderListSection(_ref3) {\n var _this2 = this;\n\n var _ref32 = _slicedToArray(_ref3, 3);\n\n var type = _ref32[0];\n var tagName = _ref32[1];\n var items = _ref32[2];\n\n if (!(0, _utilsTagNames.isValidSectionTagName)(tagName, _utilsSectionTypes.LIST_SECTION_TYPE)) {\n return;\n }\n var element = (0, _utilsDom.createElement)(tagName);\n items.forEach(function (li) {\n (0, _utilsDom.appendChild)(element, _this2.renderListItem(li));\n });\n return element;\n }\n }, {\n key: 'renderListItem',\n value: function renderListItem(markers) {\n var element = (0, _utilsDom.createElement)('li');\n this._renderMarkersOnElement(element, markers);\n return element;\n }\n }, {\n key: 'renderImageSection',\n value: function renderImageSection(_ref4) {\n var _ref42 = _slicedToArray(_ref4, 2);\n\n var type = _ref42[0];\n var url = _ref42[1];\n\n var element = (0, _utilsDom.createElement)('img');\n (0, _utilsDom.setAttribute)(element, 'src', url);\n return element;\n }\n }, {\n key: 'findCard',\n value: function findCard(name) {\n for (var i = 0; i < this.cards.length; i++) {\n if (this.cards[i].name === name) {\n return this.cards[i];\n }\n }\n if (name === _cardsImage['default'].name) {\n return _cardsImage['default'];\n }\n return this._createUnknownCard(name);\n }\n }, {\n key: '_createUnknownCard',\n value: function _createUnknownCard(name) {\n return {\n name: name,\n type: _utilsRenderType['default'],\n render: this.unknownCardHandler\n };\n }\n }, {\n key: 'renderCardSection',\n value: function renderCardSection(_ref5) {\n var _ref52 = _slicedToArray(_ref5, 3);\n\n var type = _ref52[0];\n var name = _ref52[1];\n var payload = _ref52[2];\n\n var card = this.findCard(name);\n\n var cardWrapper = this._createCardElement();\n var cardArg = this._createCardArgument(card, payload);\n var rendered = card.render(cardArg);\n\n this._validateCardRender(rendered, card.name);\n\n if (rendered) {\n (0, _utilsDom.appendChild)(cardWrapper, rendered);\n }\n\n return cardWrapper;\n }\n }, {\n key: '_registerTeardownCallback',\n value: function _registerTeardownCallback(callback) {\n this._teardownCallbacks.push(callback);\n }\n }, {\n key: '_createCardArgument',\n value: function _createCardArgument(card) {\n var _this3 = this;\n\n var payload = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var env = {\n name: card.name,\n isInEditor: false,\n onTeardown: function onTeardown(callback) {\n return _this3._registerTeardownCallback(callback);\n }\n };\n\n var options = this.cardOptions;\n\n return { env: env, options: options, payload: payload };\n }\n }, {\n key: '_validateCardRender',\n value: function _validateCardRender(rendered, cardName) {\n if (!rendered) {\n return;\n }\n\n if (typeof rendered !== 'string') {\n throw new Error('Card \"' + cardName + '\" must render ' + _utilsRenderType['default'] + ', but result was ' + typeof rendered + '\"');\n }\n }\n }, {\n key: '_createCardElement',\n value: function _createCardElement() {\n return (0, _utilsDom.createElement)('div');\n }\n }, {\n key: 'renderMarkupSection',\n value: function renderMarkupSection(_ref6) {\n var _ref62 = _slicedToArray(_ref6, 3);\n\n var type = _ref62[0];\n var tagName = _ref62[1];\n var markers = _ref62[2];\n\n if (!(0, _utilsTagNames.isValidSectionTagName)(tagName, _utilsSectionTypes.MARKUP_SECTION_TYPE)) {\n return;\n }\n var renderer = _utilsDom.createElement;\n var lowerCaseTagName = tagName.toLowerCase();\n if (this.sectionElementRenderer[lowerCaseTagName]) {\n renderer = this.sectionElementRenderer[lowerCaseTagName];\n }\n var element = renderer(tagName);\n this._renderMarkersOnElement(element, markers);\n return element;\n }\n }, {\n key: '_renderMarkersOnElement',\n value: function _renderMarkersOnElement(element, markers) {\n var elements = [element];\n var currentElement = element;\n\n for (var i = 0, l = markers.length; i < l; i++) {\n var marker = markers[i];\n\n var _marker = _slicedToArray(marker, 3);\n\n var openTypes = _marker[0];\n var closeCount = _marker[1];\n var text = _marker[2];\n\n for (var j = 0, m = openTypes.length; j < m; j++) {\n var markerType = this.markerTypes[openTypes[j]];\n\n var _markerType = _slicedToArray(markerType, 1);\n\n var tagName = _markerType[0];\n\n if ((0, _utilsTagNames.isValidMarkerType)(tagName)) {\n var openedElement = createElementFromMarkerType(markerType);\n (0, _utilsDom.appendChild)(currentElement, openedElement);\n elements.push(openedElement);\n currentElement = openedElement;\n } else {\n closeCount--;\n }\n }\n\n (0, _utilsDom.appendChild)(currentElement, (0, _utilsDom.createTextNode)(text));\n\n for (var j = 0, m = closeCount; j < m; j++) {\n elements.pop();\n currentElement = elements[elements.length - 1];\n }\n }\n }\n }, {\n key: '_defaultUnknownCardHandler',\n get: function get() {\n return function (_ref7) {\n var name = _ref7.env.name;\n\n throw new Error('Card \"' + name + '\" not found but no unknownCardHandler was registered');\n };\n }\n }]);\n\n return Renderer;\n})();\n\nexports['default'] = Renderer;","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsDom = require('../utils/dom');\n\nvar _cardsImage = require('../cards/image');\n\nvar _utilsRenderType = require('../utils/render-type');\n\nvar _utilsSectionTypes = require('../utils/section-types');\n\nvar _utilsTagNames = require('../utils/tag-names');\n\nvar _utilsMarkerTypes = require('../utils/marker-types');\n\nvar MOBILEDOC_VERSION_0_3_0 = '0.3.0';\nexports.MOBILEDOC_VERSION_0_3_0 = MOBILEDOC_VERSION_0_3_0;\nvar MOBILEDOC_VERSION_0_3_1 = '0.3.1';\nexports.MOBILEDOC_VERSION_0_3_1 = MOBILEDOC_VERSION_0_3_1;\nvar MOBILEDOC_VERSION = MOBILEDOC_VERSION_0_3_0;\n\nexports.MOBILEDOC_VERSION = MOBILEDOC_VERSION;\n/**\n * runtime HTML renderer\n * renders a mobiledoc to HTML\n *\n * input: mobiledoc\n * output: HTML\n */\n\nfunction createElementFromMarkerType() {\n var _ref = arguments.length <= 0 || arguments[0] === undefined ? ['', []] : arguments[0];\n\n var _ref2 = _slicedToArray(_ref, 2);\n\n var tagName = _ref2[0];\n var attributes = _ref2[1];\n\n var element = (0, _utilsDom.createElement)(tagName);\n attributes = attributes || [];\n\n for (var i = 0, l = attributes.length; i < l; i = i + 2) {\n var propName = attributes[i],\n propValue = attributes[i + 1];\n (0, _utilsDom.setAttribute)(element, propName, propValue);\n }\n return element;\n}\n\nfunction validateVersion(version) {\n if (version !== MOBILEDOC_VERSION_0_3_0 && version !== MOBILEDOC_VERSION_0_3_1) {\n throw new Error('Unexpected Mobiledoc version \"' + version + '\"');\n }\n}\n\nvar Renderer = (function () {\n function Renderer(mobiledoc, state) {\n _classCallCheck(this, Renderer);\n\n var cards = state.cards;\n var cardOptions = state.cardOptions;\n var atoms = state.atoms;\n var unknownCardHandler = state.unknownCardHandler;\n var unknownAtomHandler = state.unknownAtomHandler;\n var sectionElementRenderer = state.sectionElementRenderer;\n var version = mobiledoc.version;\n var sections = mobiledoc.sections;\n var atomTypes = mobiledoc.atoms;\n var cardTypes = mobiledoc.cards;\n var markerTypes = mobiledoc.markups;\n\n validateVersion(version);\n\n this.root = (0, _utilsDom.createDocumentFragment)();\n this.sections = sections;\n this.atomTypes = atomTypes;\n this.cardTypes = cardTypes;\n this.markerTypes = markerTypes;\n this.cards = cards;\n this.atoms = atoms;\n this.cardOptions = cardOptions;\n this.unknownCardHandler = unknownCardHandler || this._defaultUnknownCardHandler;\n this.unknownAtomHandler = unknownAtomHandler || this._defaultUnknownAtomHandler;\n\n this.sectionElementRenderer = {};\n if (sectionElementRenderer) {\n for (var key in sectionElementRenderer) {\n if (sectionElementRenderer.hasOwnProperty(key)) {\n this.sectionElementRenderer[key.toLowerCase()] = sectionElementRenderer[key];\n }\n }\n }\n\n this._teardownCallbacks = [];\n }\n\n _createClass(Renderer, [{\n key: 'render',\n value: function render() {\n var _this = this;\n\n this.sections.forEach(function (section) {\n var rendered = _this.renderSection(section);\n if (rendered) {\n (0, _utilsDom.appendChild)(_this.root, rendered);\n }\n });\n\n return { result: this.root.toString(), teardown: function teardown() {\n return _this.teardown();\n } };\n }\n }, {\n key: 'teardown',\n value: function teardown() {\n for (var i = 0; i < this._teardownCallbacks.length; i++) {\n this._teardownCallbacks[i]();\n }\n }\n }, {\n key: 'renderSection',\n value: function renderSection(section) {\n var _section = _slicedToArray(section, 1);\n\n var type = _section[0];\n\n switch (type) {\n case _utilsSectionTypes.MARKUP_SECTION_TYPE:\n return this.renderMarkupSection(section);\n case _utilsSectionTypes.IMAGE_SECTION_TYPE:\n return this.renderImageSection(section);\n case _utilsSectionTypes.LIST_SECTION_TYPE:\n return this.renderListSection(section);\n case _utilsSectionTypes.CARD_SECTION_TYPE:\n return this.renderCardSection(section);\n default:\n throw new Error('Renderer cannot render type \"' + type + '\"');\n }\n }\n }, {\n key: 'renderListSection',\n value: function renderListSection(_ref3) {\n var _this2 = this;\n\n var _ref32 = _slicedToArray(_ref3, 3);\n\n var type = _ref32[0];\n var tagName = _ref32[1];\n var items = _ref32[2];\n\n if (!(0, _utilsTagNames.isValidSectionTagName)(tagName, _utilsSectionTypes.LIST_SECTION_TYPE)) {\n return;\n }\n var element = (0, _utilsDom.createElement)(tagName);\n items.forEach(function (li) {\n (0, _utilsDom.appendChild)(element, _this2.renderListItem(li));\n });\n return element;\n }\n }, {\n key: 'renderListItem',\n value: function renderListItem(markers) {\n var element = (0, _utilsDom.createElement)('li');\n this._renderMarkersOnElement(element, markers);\n return element;\n }\n }, {\n key: 'renderImageSection',\n value: function renderImageSection(_ref4) {\n var _ref42 = _slicedToArray(_ref4, 2);\n\n var type = _ref42[0];\n var url = _ref42[1];\n\n var element = (0, _utilsDom.createElement)('img');\n (0, _utilsDom.setAttribute)(element, 'src', url);\n return element;\n }\n }, {\n key: 'findCard',\n value: function findCard(name) {\n for (var i = 0; i < this.cards.length; i++) {\n if (this.cards[i].name === name) {\n return this.cards[i];\n }\n }\n if (name === _cardsImage['default'].name) {\n return _cardsImage['default'];\n }\n return this._createUnknownCard(name);\n }\n }, {\n key: '_findCardByIndex',\n value: function _findCardByIndex(index) {\n var cardType = this.cardTypes[index];\n if (!cardType) {\n throw new Error('No card definition found at index ' + index);\n }\n\n var _cardType = _slicedToArray(cardType, 2);\n\n var name = _cardType[0];\n var payload = _cardType[1];\n\n var card = this.findCard(name);\n\n return {\n card: card,\n payload: payload\n };\n }\n }, {\n key: '_createUnknownCard',\n value: function _createUnknownCard(name) {\n return {\n name: name,\n type: _utilsRenderType['default'],\n render: this.unknownCardHandler\n };\n }\n }, {\n key: 'renderCardSection',\n value: function renderCardSection(_ref5) {\n var _ref52 = _slicedToArray(_ref5, 2);\n\n var type = _ref52[0];\n var index = _ref52[1];\n\n var _findCardByIndex2 = this._findCardByIndex(index);\n\n var card = _findCardByIndex2.card;\n var payload = _findCardByIndex2.payload;\n\n var cardWrapper = this._createCardElement();\n var cardArg = this._createCardArgument(card, payload);\n var rendered = card.render(cardArg);\n\n this._validateCardRender(rendered, card.name);\n\n if (rendered) {\n (0, _utilsDom.appendChild)(cardWrapper, rendered);\n }\n\n return cardWrapper;\n }\n }, {\n key: '_registerTeardownCallback',\n value: function _registerTeardownCallback(callback) {\n this._teardownCallbacks.push(callback);\n }\n }, {\n key: '_createCardArgument',\n value: function _createCardArgument(card) {\n var _this3 = this;\n\n var payload = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var env = {\n name: card.name,\n isInEditor: false,\n onTeardown: function onTeardown(callback) {\n return _this3._registerTeardownCallback(callback);\n }\n };\n\n var options = this.cardOptions;\n\n return { env: env, options: options, payload: payload };\n }\n }, {\n key: '_validateCardRender',\n value: function _validateCardRender(rendered, cardName) {\n if (!rendered) {\n return;\n }\n\n if (typeof rendered !== 'string') {\n throw new Error('Card \"' + cardName + '\" must render ' + _utilsRenderType['default'] + ', but result was ' + typeof rendered + '\"');\n }\n }\n }, {\n key: '_createCardElement',\n value: function _createCardElement() {\n return (0, _utilsDom.createElement)('div');\n }\n }, {\n key: 'renderMarkupSection',\n value: function renderMarkupSection(_ref6) {\n var _ref62 = _slicedToArray(_ref6, 3);\n\n var type = _ref62[0];\n var tagName = _ref62[1];\n var markers = _ref62[2];\n\n if (!(0, _utilsTagNames.isValidSectionTagName)(tagName, _utilsSectionTypes.MARKUP_SECTION_TYPE)) {\n return;\n }\n var renderer = _utilsDom.createElement;\n var lowerCaseTagName = tagName.toLowerCase();\n if (this.sectionElementRenderer[lowerCaseTagName]) {\n renderer = this.sectionElementRenderer[lowerCaseTagName];\n }\n\n var element = renderer(tagName);\n this._renderMarkersOnElement(element, markers);\n return element;\n }\n }, {\n key: 'findAtom',\n value: function findAtom(name) {\n for (var i = 0; i < this.atoms.length; i++) {\n if (this.atoms[i].name === name) {\n return this.atoms[i];\n }\n }\n return this._createUnknownAtom(name);\n }\n }, {\n key: '_createUnknownAtom',\n value: function _createUnknownAtom(name) {\n return {\n name: name,\n type: _utilsRenderType['default'],\n render: this.unknownAtomHandler\n };\n }\n }, {\n key: '_createAtomArgument',\n value: function _createAtomArgument(atom, value, payload) {\n var _this4 = this;\n\n var env = {\n name: atom.name,\n onTeardown: function onTeardown(callback) {\n return _this4._registerTeardownCallback(callback);\n }\n };\n\n var options = this.cardOptions;\n\n return { env: env, options: options, value: value, payload: payload };\n }\n }, {\n key: '_validateAtomRender',\n value: function _validateAtomRender(rendered, atomName) {\n if (!rendered) {\n return;\n }\n\n if (typeof rendered !== 'string') {\n throw new Error('Atom \"' + atomName + '\" must render ' + _utilsRenderType['default'] + ', but result was ' + typeof rendered + '\"');\n }\n }\n }, {\n key: '_findAtomByIndex',\n value: function _findAtomByIndex(index) {\n var atomType = this.atomTypes[index];\n if (!atomType) {\n throw new Error('No atom definition found at index ' + index);\n }\n\n var _atomType = _slicedToArray(atomType, 3);\n\n var name = _atomType[0];\n var value = _atomType[1];\n var payload = _atomType[2];\n\n var atom = this.findAtom(name);\n\n return {\n atom: atom,\n value: value,\n payload: payload\n };\n }\n }, {\n key: '_renderAtom',\n value: function _renderAtom(index) {\n var _findAtomByIndex2 = this._findAtomByIndex(index);\n\n var atom = _findAtomByIndex2.atom;\n var value = _findAtomByIndex2.value;\n var payload = _findAtomByIndex2.payload;\n\n var atomArg = this._createAtomArgument(atom, value, payload);\n var rendered = atom.render(atomArg);\n\n this._validateAtomRender(rendered, atom.name);\n\n return rendered || (0, _utilsDom.createTextNode)('');\n }\n }, {\n key: '_renderMarkersOnElement',\n value: function _renderMarkersOnElement(element, markers) {\n var elements = [element];\n var currentElement = element;\n\n for (var i = 0, l = markers.length; i < l; i++) {\n var marker = markers[i];\n\n var _marker = _slicedToArray(marker, 4);\n\n var type = _marker[0];\n var openTypes = _marker[1];\n var closeCount = _marker[2];\n var value = _marker[3];\n\n for (var j = 0, m = openTypes.length; j < m; j++) {\n var markerType = this.markerTypes[openTypes[j]];\n\n var _markerType = _slicedToArray(markerType, 1);\n\n var tagName = _markerType[0];\n\n if ((0, _utilsTagNames.isValidMarkerType)(tagName)) {\n var openedElement = createElementFromMarkerType(markerType);\n (0, _utilsDom.appendChild)(currentElement, openedElement);\n elements.push(openedElement);\n currentElement = openedElement;\n } else {\n closeCount--;\n }\n }\n\n switch (type) {\n case _utilsMarkerTypes.MARKUP_MARKER_TYPE:\n (0, _utilsDom.appendChild)(currentElement, (0, _utilsDom.createTextNode)(value));\n break;\n case _utilsMarkerTypes.ATOM_MARKER_TYPE:\n (0, _utilsDom.appendChild)(currentElement, this._renderAtom(value));\n break;\n default:\n throw new Error('Unknown markup type (' + type + ')');\n }\n\n for (var j = 0, m = closeCount; j < m; j++) {\n elements.pop();\n currentElement = elements[elements.length - 1];\n }\n }\n }\n }, {\n key: '_defaultUnknownCardHandler',\n get: function get() {\n return function (_ref7) {\n var name = _ref7.env.name;\n\n throw new Error('Card \"' + name + '\" not found but no unknownCardHandler was registered');\n };\n }\n }, {\n key: '_defaultUnknownAtomHandler',\n get: function get() {\n return function (_ref8) {\n var name = _ref8.env.name;\n\n throw new Error('Atom \"' + name + '\" not found but no unknownAtomHandler was registered');\n };\n }\n }]);\n\n return Renderer;\n})();\n\nexports['default'] = Renderer;","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nexports.createElement = createElement;\nexports.appendChild = appendChild;\nexports.createTextNode = createTextNode;\nexports.setAttribute = setAttribute;\nexports.createDocumentFragment = createDocumentFragment;\nexports.normalizeTagName = normalizeTagName;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar VOID_TAGS = 'area base br col command embed hr img input keygen link meta param source track wbr'.split(' ');\n\nvar Element = (function () {\n function Element(tagName) {\n _classCallCheck(this, Element);\n\n this.tagName = tagName.toLowerCase();\n this.isVoid = VOID_TAGS.indexOf(this.tagName) !== -1;\n this.childNodes = [];\n this.attributes = [];\n }\n\n _createClass(Element, [{\n key: 'appendChild',\n value: function appendChild(element) {\n this.childNodes.push(element);\n }\n }, {\n key: 'setAttribute',\n value: function setAttribute(propName, propValue) {\n this.attributes.push(propName, propValue);\n }\n }, {\n key: 'toString',\n value: function toString() {\n var html = '<' + this.tagName;\n\n if (this.attributes.length) {\n for (var i = 0; i < this.attributes.length; i = i + 2) {\n var propName = this.attributes[i],\n propValue = this.attributes[i + 1];\n html += ' ' + propName + '=\"' + propValue + '\"';\n }\n }\n html += '>';\n\n if (!this.isVoid) {\n for (var i = 0; i < this.childNodes.length; i++) {\n html += this.childNodes[i].toString();\n }\n html += '';\n }\n\n return html;\n }\n }]);\n\n return Element;\n})();\n\nfunction addHTMLSpaces(text) {\n return text.replace(/ /g, '  ');\n}\n\nvar TextNode = (function () {\n function TextNode(value) {\n _classCallCheck(this, TextNode);\n\n this.value = value;\n }\n\n _createClass(TextNode, [{\n key: 'toString',\n value: function toString() {\n return addHTMLSpaces(this.value);\n }\n }]);\n\n return TextNode;\n})();\n\nfunction createElement(tagName) {\n return new Element(tagName);\n}\n\nfunction appendChild(target, child) {\n target.appendChild(child);\n}\n\nfunction createTextNode(text) {\n return new TextNode(text);\n}\n\nfunction setAttribute(element, propName, propValue) {\n element.setAttribute(propName, propValue);\n}\n\nfunction createDocumentFragment() {\n return createElement('div');\n}\n\nfunction normalizeTagName(name) {\n return name.toLowerCase();\n}","\"use strict\";\n\nvar MARKUP_MARKER_TYPE = 0;\nexports.MARKUP_MARKER_TYPE = MARKUP_MARKER_TYPE;\nvar ATOM_MARKER_TYPE = 1;\nexports.ATOM_MARKER_TYPE = ATOM_MARKER_TYPE;","'use strict';\n\nexports['default'] = 'html';","\"use strict\";\n\nvar MARKUP_SECTION_TYPE = 1;\nexports.MARKUP_SECTION_TYPE = MARKUP_SECTION_TYPE;\nvar IMAGE_SECTION_TYPE = 2;\nexports.IMAGE_SECTION_TYPE = IMAGE_SECTION_TYPE;\nvar LIST_SECTION_TYPE = 3;\nexports.LIST_SECTION_TYPE = LIST_SECTION_TYPE;\nvar CARD_SECTION_TYPE = 10;\nexports.CARD_SECTION_TYPE = CARD_SECTION_TYPE;","'use strict';\n\nexports.isValidSectionTagName = isValidSectionTagName;\nexports.isValidMarkerType = isValidMarkerType;\n\nvar _sectionTypes = require('./section-types');\n\nvar _dom = require('./dom');\n\nvar MARKUP_SECTION_TAG_NAMES = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pull-quote', 'aside'].map(_dom.normalizeTagName);\n\nvar LIST_SECTION_TAG_NAMES = ['ul', 'ol'].map(_dom.normalizeTagName);\n\nvar MARKUP_TYPES = ['b', 'i', 'strong', 'em', 'a', 'u', 'sub', 'sup', 's', 'code'].map(_dom.normalizeTagName);\n\nfunction contains(array, item) {\n return array.indexOf(item) !== -1;\n}\n\nfunction isValidSectionTagName(tagName, sectionType) {\n tagName = (0, _dom.normalizeTagName)(tagName);\n\n switch (sectionType) {\n case _sectionTypes.MARKUP_SECTION_TYPE:\n return contains(MARKUP_SECTION_TAG_NAMES, tagName);\n case _sectionTypes.LIST_SECTION_TYPE:\n return contains(LIST_SECTION_TAG_NAMES, tagName);\n default:\n throw new Error('Cannot validate tagName for unknown section type \"' + sectionType + '\"');\n }\n}\n\nfunction isValidMarkerType(type) {\n type = (0, _dom.normalizeTagName)(type);\n return contains(MARKUP_TYPES, type);\n}","'use strict';\n\nvar _utilsPlaceholderImageSrc = require('../utils/placeholder-image-src');\n\nexports['default'] = {\n name: 'image',\n type: 'dom',\n\n render: function render(_ref) {\n var env = _ref.env;\n var options = _ref.options;\n var payload = _ref.payload;\n\n var img = document.createElement('img');\n img.src = payload.src || _utilsPlaceholderImageSrc['default'];\n return img;\n }\n};","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _parsersMobiledoc = require('../parsers/mobiledoc');\n\nvar _utilsFixedQueue = require('../utils/fixed-queue');\n\nfunction findLeafSectionAtIndex(post, index) {\n var section = undefined;\n post.walkAllLeafSections(function (_section, _index) {\n if (index === _index) {\n section = _section;\n }\n });\n return section;\n}\n\nvar Snapshot = (function () {\n function Snapshot(editor) {\n _classCallCheck(this, Snapshot);\n\n this.mobiledoc = editor.serialize();\n this.editor = editor;\n\n this.snapshotRange();\n }\n\n _createClass(Snapshot, [{\n key: 'snapshotRange',\n value: function snapshotRange() {\n var _editor = this.editor;\n var range = _editor.range;\n var cursor = _editor.cursor;\n\n if (cursor.hasCursor() && !range.isBlank) {\n var head = range.head;\n var tail = range.tail;\n\n this.range = {\n head: [head.leafSectionIndex, head.offset],\n tail: [tail.leafSectionIndex, tail.offset]\n };\n }\n }\n }, {\n key: 'getRange',\n value: function getRange(post) {\n if (this.range) {\n var _range = this.range;\n var head = _range.head;\n var tail = _range.tail;\n var _head = head;\n\n var _head2 = _slicedToArray(_head, 2);\n\n var headLeafSectionIndex = _head2[0];\n var headOffset = _head2[1];\n var _tail = tail;\n\n var _tail2 = _slicedToArray(_tail, 2);\n\n var tailLeafSectionIndex = _tail2[0];\n var tailOffset = _tail2[1];\n\n var headSection = findLeafSectionAtIndex(post, headLeafSectionIndex);\n var tailSection = findLeafSectionAtIndex(post, tailLeafSectionIndex);\n\n head = headSection.toPosition(headOffset);\n tail = tailSection.toPosition(tailOffset);\n\n return head.toRange(tail);\n }\n }\n }]);\n\n return Snapshot;\n})();\n\nexports.Snapshot = Snapshot;\n\nvar EditHistory = (function () {\n function EditHistory(editor, queueLength) {\n _classCallCheck(this, EditHistory);\n\n this.editor = editor;\n this._undoStack = new _utilsFixedQueue['default'](queueLength);\n this._redoStack = new _utilsFixedQueue['default'](queueLength);\n\n this._pendingSnapshot = null;\n }\n\n _createClass(EditHistory, [{\n key: 'snapshot',\n value: function snapshot() {\n // update the current snapshot with the range read from DOM\n if (this._pendingSnapshot) {\n this._pendingSnapshot.snapshotRange();\n }\n }\n }, {\n key: 'storeSnapshot',\n value: function storeSnapshot() {\n // store pending snapshot\n if (this._pendingSnapshot) {\n this._undoStack.push(this._pendingSnapshot);\n this._redoStack.clear();\n }\n\n // take new pending snapshot to store next time `storeSnapshot` is called\n this._pendingSnapshot = new Snapshot(this.editor);\n }\n }, {\n key: 'stepBackward',\n value: function stepBackward(postEditor) {\n // Throw away the pending snapshot\n this._pendingSnapshot = null;\n\n var snapshot = this._undoStack.pop();\n if (snapshot) {\n this._redoStack.push(new Snapshot(this.editor));\n this._restoreFromSnapshot(snapshot, postEditor);\n }\n }\n }, {\n key: 'stepForward',\n value: function stepForward(postEditor) {\n var snapshot = this._redoStack.pop();\n if (snapshot) {\n this._undoStack.push(new Snapshot(this.editor));\n this._restoreFromSnapshot(snapshot, postEditor);\n }\n postEditor.cancelSnapshot();\n }\n }, {\n key: '_restoreFromSnapshot',\n value: function _restoreFromSnapshot(snapshot, postEditor) {\n var mobiledoc = snapshot.mobiledoc;\n var editor = this.editor;\n var builder = editor.builder;\n var post = editor.post;\n\n var restoredPost = _parsersMobiledoc['default'].parse(builder, mobiledoc);\n\n postEditor.removeAllSections();\n postEditor.migrateSectionsFromPost(restoredPost);\n\n // resurrect snapshotted range if it exists\n var newRange = snapshot.getRange(post);\n if (newRange) {\n postEditor.setRange(newRange);\n }\n }\n }]);\n\n return EditHistory;\n})();\n\nexports['default'] = EditHistory;","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsArrayUtils = require('../utils/array-utils');\n\nvar _utilsCursorRange = require('../utils/cursor/range');\n\n/**\n * Used by {@link Editor} to manage its current state (cursor, active markups\n * and active sections).\n * @private\n */\n\nvar EditState = (function () {\n function EditState(editor) {\n _classCallCheck(this, EditState);\n\n this.editor = editor;\n\n var defaultState = {\n range: _utilsCursorRange['default'].blankRange(),\n activeMarkups: [],\n activeSections: [],\n activeSectionTagNames: []\n };\n\n this.prevState = this.state = defaultState;\n }\n\n _createClass(EditState, [{\n key: 'updateRange',\n value: function updateRange(newRange) {\n this.prevState = this.state;\n this.state = this._readState(newRange);\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.editor = null;\n this.prevState = this.state = null;\n }\n\n /**\n * @return {Boolean}\n */\n }, {\n key: 'rangeDidChange',\n value: function rangeDidChange() {\n var range = this.state.range;\n var prevRange = this.prevState.range;\n\n return !prevRange.isEqual(range);\n }\n\n /**\n * @return {Boolean} Whether the input mode (active markups or active section tag names)\n * has changed.\n */\n }, {\n key: 'inputModeDidChange',\n value: function inputModeDidChange() {\n var state = this.state;\n var prevState = this.prevState;\n\n return !(0, _utilsArrayUtils.isArrayEqual)(state.activeMarkups, prevState.activeMarkups) || !(0, _utilsArrayUtils.isArrayEqual)(state.activeSectionTagNames, prevState.activeSectionTagNames);\n }\n\n /**\n * @return {Range}\n */\n }, {\n key: 'toggleMarkupState',\n\n /**\n * Update the editor's markup state. This is used when, e.g.,\n * a user types meta+B when the editor has a cursor but no selected text;\n * in this case the editor needs to track that it has an active \"b\" markup\n * and apply it to the next text the user types.\n */\n value: function toggleMarkupState(markup) {\n if ((0, _utilsArrayUtils.contains)(this.activeMarkups, markup)) {\n this._removeActiveMarkup(markup);\n } else {\n this._addActiveMarkup(markup);\n }\n }\n }, {\n key: '_readState',\n value: function _readState(range) {\n var state = {\n range: range,\n activeMarkups: this._readActiveMarkups(range),\n activeSections: this._readActiveSections(range)\n };\n // Section objects are 'live', so to check that they changed, we\n // need to map their tagNames now (and compare to mapped tagNames later).\n // In addition, to catch changes from ul -> ol, we keep track of the\n // un-nested tag names (otherwise we'd only see li -> li change)\n state.activeSectionTagNames = state.activeSections.map(function (s) {\n return s.isNested ? s.parent.tagName : s.tagName;\n });\n return state;\n }\n }, {\n key: '_readActiveSections',\n value: function _readActiveSections(range) {\n var head = range.head;\n var tail = range.tail;\n var post = this.editor.post;\n\n if (range.isBlank) {\n return [];\n } else {\n return post.sections.readRange(head.section, tail.section);\n }\n }\n }, {\n key: '_readActiveMarkups',\n value: function _readActiveMarkups(range) {\n var post = this.editor.post;\n\n return post.markupsInRange(range);\n }\n }, {\n key: '_removeActiveMarkup',\n value: function _removeActiveMarkup(markup) {\n var index = this.state.activeMarkups.indexOf(markup);\n this.state.activeMarkups.splice(index, 1);\n }\n }, {\n key: '_addActiveMarkup',\n value: function _addActiveMarkup(markup) {\n this.state.activeMarkups.push(markup);\n }\n }, {\n key: 'range',\n get: function get() {\n return this.state.range;\n }\n\n /**\n * @return {Section[]}\n */\n }, {\n key: 'activeSections',\n get: function get() {\n return this.state.activeSections;\n }\n\n /**\n * @return {Markup[]}\n */\n }, {\n key: 'activeMarkups',\n get: function get() {\n return this.state.activeMarkups;\n }\n }]);\n\n return EditState;\n})();\n\nexports['default'] = EditState;","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _viewsTooltip = require('../views/tooltip');\n\nvar _post = require('./post');\n\nvar _cardsImage = require('../cards/image');\n\nvar _utilsKey = require('../utils/key');\n\nvar _parsersMobiledoc = require('../parsers/mobiledoc');\n\nvar _parsersHtml = require('../parsers/html');\n\nvar _parsersDom = require('../parsers/dom');\n\nvar _renderersEditorDom = require('../renderers/editor-dom');\n\nvar _modelsRenderTree = require('../models/render-tree');\n\nvar _renderersMobiledoc = require('../renderers/mobiledoc');\n\nvar _utilsMerge = require('../utils/merge');\n\nvar _utilsDomUtils = require('../utils/dom-utils');\n\nvar _utilsArrayUtils = require('../utils/array-utils');\n\nvar _utilsElementUtils = require('../utils/element-utils');\n\nvar _utilsCursor = require('../utils/cursor');\n\nvar _utilsCursorRange = require('../utils/cursor/range');\n\nvar _utilsCursorPosition = require('../utils/cursor/position');\n\nvar _modelsPostNodeBuilder = require('../models/post-node-builder');\n\nvar _textInputHandlers = require('./text-input-handlers');\n\nvar _keyCommands = require('./key-commands');\n\nvar _modelsCard = require('../models/card');\n\nvar _utilsAssert = require('../utils/assert');\n\nvar _editorMutationHandler = require('../editor/mutation-handler');\n\nvar _editorEditHistory = require('../editor/edit-history');\n\nvar _editorEventManager = require('../editor/event-manager');\n\nvar _editorEditState = require('../editor/edit-state');\n\nvar _mobiledocHtmlRenderer = require('mobiledoc-html-renderer');\n\nvar _mobiledocTextRenderer = require('mobiledoc-text-renderer');\n\nvar _modelsLifecycleCallbacks = require('../models/lifecycle-callbacks');\n\nvar _utilsLogManager = require('../utils/log-manager');\n\nvar _utilsToRange = require('../utils/to-range');\n\nvar _utilsMobiledocError = require('../utils/mobiledoc-error');\n\n// This export may later be deprecated, but re-export it from the renderer here\n// for consumers that may depend on it.\nObject.defineProperty(exports, 'EDITOR_ELEMENT_CLASS_NAME', {\n enumerable: true,\n get: function get() {\n return _renderersEditorDom.EDITOR_ELEMENT_CLASS_NAME;\n }\n});\n\nvar defaults = {\n placeholder: 'Write here...',\n spellcheck: true,\n autofocus: true,\n undoDepth: 5,\n cards: [],\n atoms: [],\n cardOptions: {},\n unknownCardHandler: function unknownCardHandler(_ref) {\n var env = _ref.env;\n\n throw new _utilsMobiledocError['default']('Unknown card encountered: ' + env.name);\n },\n unknownAtomHandler: function unknownAtomHandler(_ref2) {\n var env = _ref2.env;\n\n throw new _utilsMobiledocError['default']('Unknown atom encountered: ' + env.name);\n },\n mobiledoc: null,\n html: null\n};\n\nvar CALLBACK_QUEUES = {\n DID_UPDATE: 'didUpdate',\n WILL_RENDER: 'willRender',\n DID_RENDER: 'didRender',\n WILL_DELETE: 'willDelete',\n DID_DELETE: 'didDelete',\n CURSOR_DID_CHANGE: 'cursorDidChange',\n DID_REPARSE: 'didReparse',\n POST_DID_CHANGE: 'postDidChange',\n INPUT_MODE_DID_CHANGE: 'inputModeDidChange'\n};\n\n/**\n * The Editor is a core component of mobiledoc-kit. After instantiating\n * an editor, use {@link Editor#render} to display the editor on the web page.\n *\n * An editor uses a {@link Post} internally to represent the displayed document.\n * The post can be serialized as mobiledoc using {@link Editor#serialize}. Mobiledoc\n * is the transportable \"over-the-wire\" format (JSON) that is suited for persisting\n * and sharing between editors and renderers (for display, e.g.), whereas the Post\n * model is better suited for programmatic editing.\n *\n * The editor will call registered callbacks for certain state changes. These are:\n * * {@link Editor#cursorDidChange} -- The cursor position or selection changed.\n * * {@link Editor#postDidChange} -- The contents of the post changed due to user input or\n * programmatic editing. This hook can be used with {@link Editor#serialize}\n * to auto-save a post as it is being edited.\n * * {@link Editor#inputModeDidChange} -- The active section(s) or markup(s) at the current cursor\n * position or selection have changed. This hook can be used with\n * {@link Editor#activeMarkups} and {@link Editor#activeSections} to implement\n * a custom toolbar.\n * * {@link Editor#onTextInput} -- Register callbacks when the user enters text\n * that matches a given string or regex.\n */\n\nvar Editor = (function () {\n /**\n * @param {Object} [options]\n * @param {Object} [options.mobiledoc] The mobiledoc to load into the editor.\n * Supersedes `options.html`.\n * @param {String|DOM} [options.html] The html (as a string or DOM fragment)\n * to parse and load into the editor.\n * Will be ignored if `options.mobiledoc` is also passed.\n * @param {Array} [options.parserPlugins=[]]\n * @param {Array} [options.cards=[]] The cards that the editor may render.\n * @param {Array} [options.atoms=[]] The atoms that the editor may render.\n * @param {Function} [options.unknownCardHandler] Invoked by the editor's renderer\n * whenever it encounters an unknown card.\n * @param {Function} [options.unknownAtomHandler] Invoked by the editor's renderer\n * whenever it encounters an unknown atom.\n * @param {String} [options.placeholder] Default text to show before user starts typing.\n * @param {Boolean} [options.spellcheck=true] Whether to enable spellcheck\n * @param {Boolean} [options.autofocus=true] Whether to focus the editor when it is first rendered.\n * @param {number} [options.undoDepth=5] How many undo levels will be available.\n * Set to 0 to disable undo/redo functionality.\n * @return {Editor}\n * @public\n */\n\n function Editor() {\n var _this = this;\n\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n _classCallCheck(this, Editor);\n\n (0, _utilsAssert['default'])('editor create accepts an options object. For legacy usage passing an element for the first argument, consider the `html` option for loading DOM or HTML posts. For other cases call `editor.render(domNode)` after editor creation', options && !options.nodeType);\n this._views = [];\n this.isEditable = null;\n this._parserPlugins = options.parserPlugins || [];\n\n // FIXME: This should merge onto this.options\n (0, _utilsMerge.mergeWithOptions)(this, defaults, options);\n this.cards.push(_cardsImage['default']);\n\n _keyCommands.DEFAULT_KEY_COMMANDS.forEach(function (kc) {\n return _this.registerKeyCommand(kc);\n });\n\n this._logManager = new _utilsLogManager['default']();\n this._parser = new _parsersDom['default'](this.builder);\n var cards = this.cards;\n var atoms = this.atoms;\n var unknownCardHandler = this.unknownCardHandler;\n var unknownAtomHandler = this.unknownAtomHandler;\n var cardOptions = this.cardOptions;\n\n this._renderer = new _renderersEditorDom['default'](this, cards, atoms, unknownCardHandler, unknownAtomHandler, cardOptions);\n\n this.post = this.loadPost();\n this._renderTree = new _modelsRenderTree['default'](this.post);\n\n this._editHistory = new _editorEditHistory['default'](this, this.undoDepth);\n this._eventManager = new _editorEventManager['default'](this);\n this._mutationHandler = new _editorMutationHandler['default'](this);\n this._editState = new _editorEditState['default'](this);\n this._callbacks = new _modelsLifecycleCallbacks['default']((0, _utilsArrayUtils.values)(CALLBACK_QUEUES));\n\n _textInputHandlers.DEFAULT_TEXT_INPUT_HANDLERS.forEach(function (handler) {\n return _this.onTextInput(handler);\n });\n\n this.hasRendered = false;\n }\n\n /**\n * Turns on verbose logging for the editor.\n * @param {Array} [logTypes=[]] If present, only the given log types will be logged.\n * @public\n */\n\n _createClass(Editor, [{\n key: 'enableLogging',\n value: function enableLogging() {\n var logTypes = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];\n\n if (logTypes.length === 0) {\n this._logManager.enableAll();\n } else {\n this._logManager.enableTypes(logTypes);\n }\n }\n\n /**\n * Disable all logging\n * @public\n */\n }, {\n key: 'disableLogging',\n value: function disableLogging() {\n this._logManager.disable();\n }\n\n /**\n * @private\n */\n }, {\n key: 'loggerFor',\n value: function loggerFor(type) {\n return this._logManager['for'](type);\n }\n\n /**\n * The editor's instance of a post node builder.\n * @type {PostNodeBuilder}\n */\n }, {\n key: 'loadPost',\n value: function loadPost() {\n var mobiledoc = this.mobiledoc;\n var html = this.html;\n\n if (mobiledoc) {\n return _parsersMobiledoc['default'].parse(this.builder, mobiledoc);\n } else if (html) {\n if (typeof html === 'string') {\n var options = { plugins: this._parserPlugins };\n return new _parsersHtml['default'](this.builder, options).parse(this.html);\n } else {\n var dom = html;\n return this._parser.parse(dom);\n }\n } else {\n return this.builder.createPost();\n }\n }\n }, {\n key: 'rerender',\n value: function rerender() {\n var _this2 = this;\n\n var postRenderNode = this.post.renderNode;\n\n // if we haven't rendered this post's renderNode before, mark it dirty\n if (!postRenderNode.element) {\n (0, _utilsAssert['default'])('Must call `render` before `rerender` can be called', this.hasRendered);\n postRenderNode.element = this.element;\n postRenderNode.markDirty();\n }\n\n this.runCallbacks(CALLBACK_QUEUES.WILL_RENDER);\n this._mutationHandler.suspendObservation(function () {\n _this2._renderer.render(_this2._renderTree);\n });\n this.runCallbacks(CALLBACK_QUEUES.DID_RENDER);\n }\n\n /**\n * @param {Element} element The DOM element to render into.\n * Its contents will be replaced by the editor's rendered post.\n * @public\n */\n }, {\n key: 'render',\n value: function render(element) {\n (0, _utilsAssert['default'])('Cannot render an editor twice. Use `rerender` to update the ' + 'rendering of an existing editor instance.', !this.hasRendered);\n\n element.spellcheck = this.spellcheck;\n\n (0, _utilsDomUtils.clearChildNodes)(element);\n\n this.element = element;\n\n if (this.isEditable === null) {\n this.enableEditing();\n }\n\n this._addTooltip();\n\n // A call to `run` will trigger the didUpdatePostCallbacks hooks with a\n // postEditor.\n this.run(function () {});\n\n // Only set `hasRendered` to true after calling `run` to ensure that\n // no cursorDidChange or other callbacks get fired before the editor is\n // done rendering\n this.hasRendered = true;\n this.rerender();\n\n this._mutationHandler.init();\n this._eventManager.init();\n\n if (this.autofocus) {\n this.selectRange(this.post.headPosition());\n }\n }\n }, {\n key: '_addTooltip',\n value: function _addTooltip() {\n this.addView(new _viewsTooltip['default']({\n rootElement: this.element,\n showForTag: 'a'\n }));\n }\n }, {\n key: 'registerKeyCommand',\n\n /**\n * @param {Object} keyCommand The key command to register. It must specify a\n * modifier key (meta, ctrl, etc), a string representing the ascii key, and\n * a `run` method that will be passed the editor instance when the key command\n * is invoked\n * @public\n */\n value: function registerKeyCommand(rawKeyCommand) {\n var keyCommand = (0, _keyCommands.buildKeyCommand)(rawKeyCommand);\n (0, _utilsAssert['default'])('Key Command is not valid', (0, _keyCommands.validateKeyCommand)(keyCommand));\n this.keyCommands.unshift(keyCommand);\n }\n\n /**\n * Convenience for {@link PostEditor#deleteAtPosition}. Deletes and puts the\n * cursor in the new position.\n * @public\n */\n }, {\n key: 'deleteAtPosition',\n value: function deleteAtPosition(position, direction, _ref3) {\n var unit = _ref3.unit;\n\n this.run(function (postEditor) {\n var nextPosition = postEditor.deleteAtPosition(position, direction, { unit: unit });\n postEditor.setRange(nextPosition);\n });\n }\n\n /**\n * Convenience for {@link PostEditor#deleteRange}. Deletes and puts the\n * cursor in the new position.\n * @param {Range} range\n * @public\n */\n }, {\n key: 'deleteRange',\n value: function deleteRange(range) {\n this.run(function (postEditor) {\n var nextPosition = postEditor.deleteRange(range);\n postEditor.setRange(nextPosition);\n });\n }\n\n /**\n * @private\n */\n }, {\n key: 'performDelete',\n value: function performDelete() {\n var _ref4 = arguments.length <= 0 || arguments[0] === undefined ? { direction: _utilsKey.DIRECTION.BACKWARD, unit: 'char' } : arguments[0];\n\n var direction = _ref4.direction;\n var unit = _ref4.unit;\n var range = this.range;\n\n this.runCallbacks(CALLBACK_QUEUES.WILL_DELETE, [range, direction, unit]);\n if (range.isCollapsed) {\n this.deleteAtPosition(range.head, direction, { unit: unit });\n } else {\n this.deleteRange(range);\n }\n this.runCallbacks(CALLBACK_QUEUES.DID_DELETE, [range, direction, unit]);\n }\n }, {\n key: 'handleNewline',\n value: function handleNewline(event) {\n if (!this.hasCursor()) {\n return;\n }\n\n event.preventDefault();\n\n var range = this.range;\n\n this.run(function (postEditor) {\n var cursorSection = undefined;\n if (!range.isCollapsed) {\n var nextPosition = postEditor.deleteRange(range);\n cursorSection = nextPosition.section;\n if (cursorSection && cursorSection.isBlank) {\n postEditor.setRange(cursorSection.headPosition());\n return;\n }\n }\n cursorSection = postEditor.splitSection(range.head)[1];\n postEditor.setRange(cursorSection.headPosition());\n });\n }\n }, {\n key: 'showPrompt',\n value: function showPrompt(message, defaultValue, callback) {\n callback(window.prompt(message, defaultValue));\n }\n\n /**\n * Notify the editor that the post did change, and run associated\n * callbacks.\n * @private\n */\n }, {\n key: '_postDidChange',\n value: function _postDidChange() {\n this.runCallbacks(CALLBACK_QUEUES.POST_DID_CHANGE);\n }\n\n /**\n * Selects the given range or position. If given a collapsed range or a position, this positions the cursor\n * at the range's position. Otherwise a selection is created in the editor\n * surface encompassing the range.\n * @param {Range|Position} range\n */\n }, {\n key: 'selectRange',\n value: function selectRange(range) {\n range = (0, _utilsToRange['default'])(range);\n\n this.cursor.selectRange(range);\n this.range = range;\n }\n }, {\n key: '_readRangeFromDOM',\n value: function _readRangeFromDOM() {\n if (!this.isEditable) {\n return;\n }\n this.range = this.cursor.offsets;\n }\n }, {\n key: 'setPlaceholder',\n value: function setPlaceholder(placeholder) {\n (0, _utilsElementUtils.setData)(this.element, 'placeholder', placeholder);\n }\n }, {\n key: '_reparsePost',\n value: function _reparsePost() {\n var post = this._parser.parse(this.element);\n this.run(function (postEditor) {\n postEditor.removeAllSections();\n postEditor.migrateSectionsFromPost(post);\n postEditor.setRange(_utilsCursorRange['default'].blankRange());\n });\n\n this.runCallbacks(CALLBACK_QUEUES.DID_REPARSE);\n this._postDidChange();\n }\n }, {\n key: '_reparseSections',\n value: function _reparseSections() {\n var _this3 = this;\n\n var sections = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];\n\n var currentRange = undefined;\n sections.forEach(function (section) {\n _this3._parser.reparseSection(section, _this3._renderTree);\n });\n this._removeDetachedSections();\n\n if (this._renderTree.isDirty) {\n currentRange = this.range;\n }\n\n // force the current snapshot's range to remain the same rather than\n // rereading it from DOM after the new character is applied and the browser\n // updates the cursor position\n var range = this._editHistory._pendingSnapshot.range;\n this.run(function () {\n _this3._editHistory._pendingSnapshot.range = range;\n });\n this.rerender();\n if (currentRange) {\n this.selectRange(currentRange);\n }\n\n this.runCallbacks(CALLBACK_QUEUES.DID_REPARSE);\n this._postDidChange();\n }\n\n // FIXME this should be able to be removed now -- if any sections are detached,\n // it's due to a bug in the code.\n }, {\n key: '_removeDetachedSections',\n value: function _removeDetachedSections() {\n (0, _utilsArrayUtils.forEach)((0, _utilsArrayUtils.filter)(this.post.sections, function (s) {\n return !s.renderNode.isAttached();\n }), function (s) {\n return s.renderNode.scheduleForRemoval();\n });\n }\n\n /**\n * The sections from the cursor's selection start to the selection end\n * @type {Section[]}\n */\n }, {\n key: 'detectMarkupInRange',\n value: function detectMarkupInRange(range, markupTagName) {\n var markups = this.post.markupsInRange(range);\n return (0, _utilsArrayUtils.detect)(markups, function (markup) {\n return markup.hasTag(markupTagName);\n });\n }\n\n /**\n * @type {Markup[]}\n * @public\n */\n }, {\n key: 'hasActiveMarkup',\n\n /**\n * @param {Markup|String} markup A markup instance, or a string (e.g. \"b\")\n * @return {boolean}\n */\n value: function hasActiveMarkup(markup) {\n var matchesFn = undefined;\n if (typeof markup === 'string') {\n (function () {\n var tagName = (0, _utilsDomUtils.normalizeTagName)(markup);\n matchesFn = function (m) {\n return m.tagName === tagName;\n };\n })();\n } else {\n matchesFn = function (m) {\n return m === markup;\n };\n }\n\n return !!(0, _utilsArrayUtils.detect)(this.activeMarkups, matchesFn);\n }\n\n /**\n * @param {String} version The mobiledoc version to serialize to.\n * @return {Mobiledoc} Serialized mobiledoc\n * @public\n */\n }, {\n key: 'serialize',\n value: function serialize() {\n var version = arguments.length <= 0 || arguments[0] === undefined ? _renderersMobiledoc.MOBILEDOC_VERSION : arguments[0];\n\n return this.serializePost(this.post, 'mobiledoc', { version: version });\n }\n\n /**\n * Serialize the editor's post to the requested format.\n * Note that only mobiledoc format is lossless. If cards or atoms are present\n * in the post, the html and text formats will omit them in output because\n * the editor does not have access to the html and text versions of the\n * cards/atoms.\n * @param {string} format The format to serialize ('mobiledoc', 'text', 'html')\n * @return {Object|String} The editor's post, serialized to {format}\n * @public\n */\n }, {\n key: 'serializeTo',\n value: function serializeTo(format) {\n var post = this.post;\n return this.serializePost(post, format);\n }\n\n /**\n * @param {Post}\n * @param {String} format Same as {serializeTo}\n * @param {Object} [options]\n * @param {String} [options.version=MOBILEDOC_VERSION] version to serialize to\n * @return {Object|String}\n * @private\n */\n }, {\n key: 'serializePost',\n value: function serializePost(post, format) {\n var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n var validFormats = ['mobiledoc', 'html', 'text'];\n (0, _utilsAssert['default'])('Unrecognized serialization format ' + format, (0, _utilsArrayUtils.contains)(validFormats, format));\n\n if (format === 'mobiledoc') {\n var version = options.version || _renderersMobiledoc.MOBILEDOC_VERSION;\n return _renderersMobiledoc['default'].render(post, version);\n } else {\n var rendered = undefined;\n var mobiledoc = this.serializePost(post, 'mobiledoc');\n var unknownCardHandler = function unknownCardHandler() {};\n var unknownAtomHandler = function unknownAtomHandler() {};\n var rendererOptions = { unknownCardHandler: unknownCardHandler, unknownAtomHandler: unknownAtomHandler };\n\n switch (format) {\n case 'html':\n rendered = new _mobiledocHtmlRenderer['default'](rendererOptions).render(mobiledoc);\n return rendered.result;\n case 'text':\n rendered = new _mobiledocTextRenderer['default'](rendererOptions).render(mobiledoc);\n return rendered.result;\n }\n }\n }\n }, {\n key: 'addView',\n value: function addView(view) {\n this._views.push(view);\n }\n }, {\n key: 'removeAllViews',\n value: function removeAllViews() {\n this._views.forEach(function (v) {\n return v.destroy();\n });\n this._views = [];\n }\n\n /**\n * Whether the editor has a cursor (or a selected range).\n * It is possible for the editor to be focused but not have a selection.\n * In this case, key events will fire but the editor will not be able to\n * determine a cursor position, so they will be ignored.\n * @return {boolean}\n * @public\n */\n }, {\n key: 'hasCursor',\n value: function hasCursor() {\n return this.cursor.hasCursor();\n }\n\n /**\n * Tears down the editor's attached event listeners and views.\n * @public\n */\n }, {\n key: 'destroy',\n value: function destroy() {\n this.isDestroyed = true;\n if (this._hasSelection()) {\n this.cursor.clearSelection();\n }\n if (this._hasFocus()) {\n this.element.blur(); // FIXME This doesn't blur the element on IE11\n }\n this._mutationHandler.destroy();\n this._eventManager.destroy();\n this.removeAllViews();\n this._renderer.destroy();\n this._editState.destroy();\n }\n\n /**\n * Keep the user from directly editing the post using the keyboard and mouse.\n * Modification via the programmatic API is still permitted.\n * @see Editor#enableEditing\n * @public\n */\n }, {\n key: 'disableEditing',\n value: function disableEditing() {\n if (this.isEditable === false) {\n return;\n }\n\n this.isEditable = false;\n if (this.hasRendered) {\n this.element.setAttribute('contentEditable', false);\n this.setPlaceholder('');\n this.selectRange(_utilsCursorRange['default'].blankRange());\n }\n }\n\n /**\n * Allow the user to directly interact with editing a post via keyboard and mouse input.\n * Editor instances are editable by default. Use this method to re-enable\n * editing after disabling it.\n * @see Editor#disableEditing\n * @public\n */\n }, {\n key: 'enableEditing',\n value: function enableEditing() {\n this.isEditable = true;\n if (this.element) {\n this.element.setAttribute('contentEditable', true);\n this.setPlaceholder(this.placeholder);\n }\n }\n\n /**\n * Change a cardSection into edit mode\n * If called before the card has been rendered, it will be marked so that\n * it is rendered in edit mode when it gets rendered.\n * @param {CardSection} cardSection\n * @public\n */\n }, {\n key: 'editCard',\n value: function editCard(cardSection) {\n this._setCardMode(cardSection, _modelsCard.CARD_MODES.EDIT);\n }\n\n /**\n * Change a cardSection into display mode\n * If called before the card has been rendered, it will be marked so that\n * it is rendered in display mode when it gets rendered.\n * @param {CardSection} cardSection\n * @return undefined\n * @public\n */\n }, {\n key: 'displayCard',\n value: function displayCard(cardSection) {\n this._setCardMode(cardSection, _modelsCard.CARD_MODES.DISPLAY);\n }\n\n /**\n * Run a new post editing session. Yields a block with a new {@link PostEditor}\n * instance. This instance can be used to interact with the post abstract.\n * Rendering will be deferred until after the callback is completed.\n *\n * Usage:\n * ```\n * let markerRange = this.range;\n * editor.run((postEditor) => {\n * postEditor.deleteRange(markerRange);\n * // editing surface not updated yet\n * postEditor.schedule(() => {\n * console.log('logs during rerender flush');\n * });\n * // logging not yet flushed\n * });\n * // editing surface now updated.\n * // logging now flushed\n * ```\n *\n * @param {Function} callback Called with an instance of\n * {@link PostEditor} as its argument.\n * @return {Mixed} The return value of `callback`.\n * @public\n */\n }, {\n key: 'run',\n value: function run(callback) {\n var postEditor = new _post['default'](this);\n postEditor.begin();\n this._editHistory.snapshot();\n var result = callback(postEditor);\n this.runCallbacks(CALLBACK_QUEUES.DID_UPDATE, [postEditor]);\n postEditor.complete();\n this._readRangeFromDOM();\n\n if (postEditor._shouldCancelSnapshot) {\n this._editHistory._pendingSnapshot = null;\n }\n this._editHistory.storeSnapshot();\n\n return result;\n }\n\n /**\n * @param {Function} callback Called with `postEditor` as its argument.\n * @public\n */\n }, {\n key: 'didUpdatePost',\n value: function didUpdatePost(callback) {\n this.addCallback(CALLBACK_QUEUES.DID_UPDATE, callback);\n }\n\n /**\n * @param {Function} callback Called when the post has changed, either via\n * user input or programmatically. Use with {@link Editor#serialize} to\n * retrieve the post in portable mobiledoc format.\n */\n }, {\n key: 'postDidChange',\n value: function postDidChange(callback) {\n this.addCallback(CALLBACK_QUEUES.POST_DID_CHANGE, callback);\n }\n\n /**\n * Register a handler that will be invoked by the editor after the user enters\n * matching text.\n * @param {Object} inputHandler\n * @param {String} [inputHandler.text] Required if `match` is not provided\n * @param {RegExp} [inputHandler.match] Required if `text` is not provided\n * @param {Function} inputHandler.run This callback is invoked with the {@link Editor}\n * instance and an array of matches. If `text` was provided,\n * the matches array will equal [`text`], and if a `match`\n * regex was provided the matches array will be the result of\n * `match.exec` on the matching text. The callback is called\n * after the matching text has been inserted.\n * @public\n */\n }, {\n key: 'onTextInput',\n value: function onTextInput(inputHandler) {\n this._eventManager.registerInputHandler(inputHandler);\n }\n\n /**\n * @param {Function} callback Called when the editor's state (active markups or\n * active sections) has changed, either via user input or programmatically\n */\n }, {\n key: 'inputModeDidChange',\n value: function inputModeDidChange(callback) {\n this.addCallback(CALLBACK_QUEUES.INPUT_MODE_DID_CHANGE, callback);\n }\n\n /**\n * @param {Function} callback This callback will be called before the editor\n * is rendered.\n * @public\n */\n }, {\n key: 'willRender',\n value: function willRender(callback) {\n this.addCallback(CALLBACK_QUEUES.WILL_RENDER, callback);\n }\n\n /**\n * @param {Function} callback This callback will be called after the editor\n * is rendered.\n * @public\n */\n }, {\n key: 'didRender',\n value: function didRender(callback) {\n this.addCallback(CALLBACK_QUEUES.DID_RENDER, callback);\n }\n\n /**\n * @param {Function} callback This callback will be called before deleting.\n * @public\n */\n }, {\n key: 'willDelete',\n value: function willDelete(callback) {\n this.addCallback(CALLBACK_QUEUES.WILL_DELETE, callback);\n }\n\n /**\n * @param {Function} callback This callback will be called after deleting.\n * @public\n */\n }, {\n key: 'didDelete',\n value: function didDelete(callback) {\n this.addCallback(CALLBACK_QUEUES.DID_DELETE, callback);\n }\n\n /**\n * @param {Function} callback This callback will be called every time the cursor\n * position (or selection) changes.\n * @public\n */\n }, {\n key: 'cursorDidChange',\n value: function cursorDidChange(callback) {\n this.addCallback(CALLBACK_QUEUES.CURSOR_DID_CHANGE, callback);\n }\n }, {\n key: '_rangeDidChange',\n value: function _rangeDidChange() {\n if (this.hasRendered) {\n this.runCallbacks(CALLBACK_QUEUES.CURSOR_DID_CHANGE);\n }\n }\n }, {\n key: '_inputModeDidChange',\n value: function _inputModeDidChange() {\n this.runCallbacks(CALLBACK_QUEUES.INPUT_MODE_DID_CHANGE);\n }\n }, {\n key: '_insertEmptyMarkupSectionAtCursor',\n value: function _insertEmptyMarkupSectionAtCursor() {\n var _this4 = this;\n\n this.run(function (postEditor) {\n var section = postEditor.builder.createMarkupSection('p');\n postEditor.insertSectionBefore(_this4.post.sections, section);\n postEditor.setRange(section.toRange());\n });\n }\n\n /**\n * Toggles the given markup at the editor's current {@link Range}.\n * If the range is collapsed this changes the editor's state so that the\n * next characters typed will be affected. If there is text selected\n * (aka a non-collapsed range), the selections' markup will be toggled.\n * If the editor is not focused and has no active range, nothing happens.\n * @param {String} markup E.g. \"b\", \"em\", \"a\"\n * @public\n * @see PostEditor#toggleMarkup\n */\n }, {\n key: 'toggleMarkup',\n value: function toggleMarkup(markup) {\n markup = this.builder.createMarkup(markup);\n var range = this.range;\n\n if (range.isCollapsed) {\n this._editState.toggleMarkupState(markup);\n this._inputModeDidChange();\n\n // when clicking a button to toggle markup, the button can end up being focused,\n // so ensure the editor is focused\n this._ensureFocus();\n } else {\n this.run(function (postEditor) {\n return postEditor.toggleMarkup(markup, range);\n });\n }\n }\n\n // If the editor has a selection but is not focused, focus it\n }, {\n key: '_ensureFocus',\n value: function _ensureFocus() {\n if (this._hasSelection() && !this._hasFocus()) {\n this.focus();\n }\n }\n }, {\n key: 'focus',\n value: function focus() {\n this.element.focus();\n }\n\n /**\n * Whether there is a selection inside the editor's element.\n * It's possible to have a selection but not have focus.\n * @see #_hasFocus\n * @return {Boolean}\n */\n }, {\n key: '_hasSelection',\n value: function _hasSelection() {\n var cursor = this.cursor;\n\n return this.hasRendered && (cursor._hasCollapsedSelection() || cursor._hasSelection());\n }\n\n /**\n * Whether the editor's element is focused\n * It's possible to be focused but have no selection\n * @see #_hasSelection\n * @return {Boolean}\n */\n }, {\n key: '_hasFocus',\n value: function _hasFocus() {\n return document.activeElement === this.element;\n }\n\n /**\n * Toggles the tagName for the current active section(s). This will skip\n * non-markerable sections. E.g. if the editor's range includes a \"P\" MarkupSection\n * and a CardSection, only the MarkupSection will be toggled.\n * @param {String} tagName The new tagname to change to.\n * @public\n * @see PostEditor#toggleSection\n */\n }, {\n key: 'toggleSection',\n value: function toggleSection(tagName) {\n var _this5 = this;\n\n this.run(function (postEditor) {\n return postEditor.toggleSection(tagName, _this5.range);\n });\n }\n\n /**\n * Finds and runs the first matching key command for the event\n *\n * If multiple commands are bound to a key combination, the\n * first matching one is run.\n *\n * If a command returns `false` then the next matching command\n * is run instead.\n *\n * @param {Event} event The keyboard event triggered by the user\n * @return {Boolean} true when a command was successfully run\n * @private\n */\n }, {\n key: 'handleKeyCommand',\n value: function handleKeyCommand(event) {\n var keyCommands = (0, _keyCommands.findKeyCommands)(this.keyCommands, event);\n for (var i = 0; i < keyCommands.length; i++) {\n var keyCommand = keyCommands[i];\n if (keyCommand.run(this) !== false) {\n event.preventDefault();\n return true;\n }\n }\n return false;\n }\n\n /**\n * Inserts the text at the current cursor position. If the editor has\n * no current cursor position, nothing will be inserted. If the editor's\n * range is not collapsed, it will be deleted before insertion.\n *\n * @param {String} text\n * @public\n */\n }, {\n key: 'insertText',\n value: function insertText(text) {\n if (!this.hasCursor()) {\n return;\n }\n if (this.post.isBlank) {\n this._insertEmptyMarkupSectionAtCursor();\n }\n var activeMarkups = this.activeMarkups;\n var range = this.range;\n var position = this.range.head;\n\n this.run(function (postEditor) {\n if (!range.isCollapsed) {\n position = postEditor.deleteRange(range);\n }\n\n postEditor.insertTextWithMarkup(position, text, activeMarkups);\n });\n }\n\n /**\n * Inserts an atom at the current cursor position. If the editor has\n * no current cursor position, nothing will be inserted. If the editor's\n * range is not collapsed, it will be deleted before insertion.\n * @param {String} atomName\n * @param {String} [atomText='']\n * @param {Object} [atomPayload={}]\n * @return {Atom} The inserted atom.\n * @public\n */\n }, {\n key: 'insertAtom',\n value: function insertAtom(atomName) {\n var atomText = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1];\n var atomPayload = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n if (!this.hasCursor()) {\n return;\n }\n if (this.post.isBlank) {\n this._insertEmptyMarkupSectionAtCursor();\n }\n\n var atom = undefined;\n var range = this.range;\n\n this.run(function (postEditor) {\n var position = range.head;\n\n atom = postEditor.builder.createAtom(atomName, atomText, atomPayload);\n if (!range.isCollapsed) {\n position = postEditor.deleteRange(range);\n }\n\n postEditor.insertMarkers(position, [atom]);\n });\n return atom;\n }\n\n /**\n * Inserts a card at the section after the current cursor position. If the editor has\n * no current cursor position, nothing will be inserted. If the editor's\n * range is not collapsed, it will be deleted before insertion. If the cursor is in\n * a blank section, it will be replaced with a card section.\n * The editor's cursor will be placed at the end of the inserted card.\n * @param {String} cardName\n * @param {Object} [cardPayload={}]\n * @param {Boolean} [inEditMode=false] Whether the card should be inserted in edit mode.\n * @return {Card} The inserted Card section.\n * @public\n */\n }, {\n key: 'insertCard',\n value: function insertCard(cardName) {\n var _this6 = this;\n\n var cardPayload = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n var inEditMode = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\n if (!this.hasCursor()) {\n return;\n }\n if (this.post.isBlank) {\n this._insertEmptyMarkupSectionAtCursor();\n }\n\n var card = undefined;\n var range = this.range;\n\n this.run(function (postEditor) {\n var position = range.tail;\n card = postEditor.builder.createCardSection(cardName, cardPayload);\n if (inEditMode) {\n _this6.editCard(card);\n }\n\n if (!range.isCollapsed) {\n position = postEditor.deleteRange(range);\n }\n\n var section = position.section;\n if (section.isNested) {\n section = section.parent;\n }\n\n if (section.isBlank) {\n postEditor.replaceSection(section, card);\n } else {\n var collection = _this6.post.sections;\n postEditor.insertSectionBefore(collection, card, section.next);\n }\n\n // It is important to explicitly set the range to the end of the card.\n // Otherwise it is possible to create an inconsistent state in the\n // browser. For instance, if the user clicked a button that\n // called `editor.insertCard`, the editor surface may retain\n // the selection but lose focus, and the next keystroke by the user\n // will cause an unexpected DOM mutation (which can wipe out the\n // card).\n // See: https://github.com/bustlelabs/mobiledoc-kit/issues/286\n postEditor.setRange(card.tailPosition());\n });\n return card;\n }\n\n /**\n * @param {integer} x x-position in viewport\n * @param {integer} y y-position in viewport\n * @return {Position|null}\n */\n }, {\n key: 'positionAtPoint',\n value: function positionAtPoint(x, y) {\n return _utilsCursorPosition['default'].atPoint(x, y, this);\n }\n\n /**\n * @private\n */\n }, {\n key: '_setCardMode',\n value: function _setCardMode(cardSection, mode) {\n var renderNode = cardSection.renderNode;\n if (renderNode && renderNode.isRendered) {\n var cardNode = renderNode.cardNode;\n cardNode[mode]();\n } else {\n cardSection.setInitialMode(mode);\n }\n }\n }, {\n key: 'triggerEvent',\n value: function triggerEvent(context, eventName, event) {\n this._eventManager._trigger(context, eventName, event);\n }\n }, {\n key: 'addCallback',\n value: function addCallback() {\n var _callbacks;\n\n (_callbacks = this._callbacks).addCallback.apply(_callbacks, arguments);\n }\n }, {\n key: 'addCallbackOnce',\n value: function addCallbackOnce() {\n var _callbacks2;\n\n (_callbacks2 = this._callbacks).addCallbackOnce.apply(_callbacks2, arguments);\n }\n }, {\n key: 'runCallbacks',\n value: function runCallbacks() {\n var _callbacks3;\n\n if (this.isDestroyed) {\n // TODO warn that callback attempted after editor was destroyed\n return;\n }\n (_callbacks3 = this._callbacks).runCallbacks.apply(_callbacks3, arguments);\n }\n }, {\n key: 'builder',\n get: function get() {\n if (!this._builder) {\n this._builder = new _modelsPostNodeBuilder['default']();\n }\n return this._builder;\n }\n }, {\n key: 'keyCommands',\n get: function get() {\n if (!this._keyCommands) {\n this._keyCommands = [];\n }\n return this._keyCommands;\n }\n }, {\n key: 'cursor',\n get: function get() {\n return new _utilsCursor['default'](this);\n }\n\n /**\n * Return the current range for the editor (may be cached).\n * @return {Range}\n */\n }, {\n key: 'range',\n get: function get() {\n return this._editState.range;\n },\n set: function set(newRange) {\n this._editState.updateRange(newRange);\n\n if (this._editState.rangeDidChange()) {\n this._rangeDidChange();\n }\n\n if (this._editState.inputModeDidChange()) {\n this._inputModeDidChange();\n }\n }\n }, {\n key: 'activeSections',\n get: function get() {\n return this._editState.activeSections;\n }\n }, {\n key: 'activeSection',\n get: function get() {\n var activeSections = this.activeSections;\n\n return activeSections[activeSections.length - 1];\n }\n }, {\n key: 'activeMarkups',\n get: function get() {\n return this._editState.activeMarkups;\n }\n }]);\n\n return Editor;\n})();\n\nexports['default'] = Editor;","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsAssert = require('../utils/assert');\n\nvar _utilsParseUtils = require('../utils/parse-utils');\n\nvar _utilsArrayUtils = require('../utils/array-utils');\n\nvar _utilsKey = require('../utils/key');\n\nvar _utilsCharacters = require('../utils/characters');\n\nvar _editorTextInputHandler = require('../editor/text-input-handler');\n\nvar _editorSelectionManager = require('../editor/selection-manager');\n\nvar _utilsBrowser = require('../utils/browser');\n\nvar ELEMENT_EVENT_TYPES = ['keydown', 'keyup', 'cut', 'copy', 'paste', 'keypress', 'drop'];\n\nvar EventManager = (function () {\n function EventManager(editor) {\n _classCallCheck(this, EventManager);\n\n this.editor = editor;\n this.logger = editor.loggerFor('event-manager');\n this._textInputHandler = new _editorTextInputHandler['default'](editor);\n this._listeners = [];\n this.modifierKeys = {\n shift: false,\n alt: false,\n ctrl: false\n };\n\n this._selectionManager = new _editorSelectionManager['default'](this.editor, this.selectionDidChange.bind(this));\n }\n\n _createClass(EventManager, [{\n key: 'init',\n value: function init() {\n var _this = this;\n\n var element = this.editor.element;\n\n (0, _utilsAssert['default'])('Cannot init EventManager without element', !!element);\n\n ELEMENT_EVENT_TYPES.forEach(function (type) {\n _this._addListener(element, type);\n });\n\n this._selectionManager.start();\n }\n }, {\n key: 'registerInputHandler',\n value: function registerInputHandler(inputHandler) {\n this._textInputHandler.register(inputHandler);\n }\n }, {\n key: '_addListener',\n value: function _addListener(context, type) {\n var _this2 = this;\n\n (0, _utilsAssert['default'])('Missing listener for ' + type, !!this[type]);\n\n var listener = function listener(event) {\n return _this2._handleEvent(type, event);\n };\n context.addEventListener(type, listener);\n this._listeners.push([context, type, listener]);\n }\n }, {\n key: '_removeListeners',\n value: function _removeListeners() {\n this._listeners.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 3);\n\n var context = _ref2[0];\n var type = _ref2[1];\n var listener = _ref2[2];\n\n context.removeEventListener(type, listener);\n });\n this._listeners = [];\n }\n\n // This is primarily useful for programmatically simulating events on the\n // editor from the tests.\n }, {\n key: '_trigger',\n value: function _trigger(context, type, event) {\n (0, _utilsArrayUtils.forEach)((0, _utilsArrayUtils.filter)(this._listeners, function (_ref3) {\n var _ref32 = _slicedToArray(_ref3, 2);\n\n var _context = _ref32[0];\n var _type = _ref32[1];\n\n return _context === context && _type === type;\n }), function (_ref4) {\n var _ref42 = _slicedToArray(_ref4, 3);\n\n var context = _ref42[0];\n var type = _ref42[1];\n var listener = _ref42[2];\n\n listener.call(context, event);\n });\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this._textInputHandler.destroy();\n this._selectionManager.destroy();\n this._removeListeners();\n }\n }, {\n key: '_handleEvent',\n value: function _handleEvent(type, event) {\n var element = event.target;\n\n if (!this.isElementAddressable(element)) {\n // abort handling this event\n return true;\n }\n\n this[type](event);\n }\n }, {\n key: 'isElementAddressable',\n value: function isElementAddressable(element) {\n return this.editor.cursor.isAddressable(element);\n }\n }, {\n key: 'selectionDidChange',\n value: function selectionDidChange(selection /*, prevSelection */) {\n var shouldNotify = true;\n var anchorNode = selection.anchorNode;\n\n if (!this.isElementAddressable(anchorNode)) {\n if (!this.editor.range.isBlank) {\n // Selection changed from something addressable to something\n // not-addressable -- e.g., blur event, user clicked outside editor,\n // etc\n shouldNotify = true;\n } else {\n // selection changes wholly outside the editor should not trigger\n // change notifications\n shouldNotify = false;\n }\n }\n\n if (shouldNotify) {\n this.editor._readRangeFromDOM();\n }\n }\n }, {\n key: 'keypress',\n value: function keypress(event) {\n var editor = this.editor;\n var _textInputHandler = this._textInputHandler;\n\n if (!editor.hasCursor()) {\n return;\n }\n\n var key = _utilsKey['default'].fromEvent(event);\n if (!key.isPrintable()) {\n return;\n } else {\n event.preventDefault();\n }\n\n _textInputHandler.handle(key.toString());\n }\n }, {\n key: 'keydown',\n value: function keydown(event) {\n var editor = this.editor;\n\n if (!editor.hasCursor()) {\n return;\n }\n if (!editor.isEditable) {\n return;\n }\n\n var key = _utilsKey['default'].fromEvent(event);\n this._updateModifiersFromKey(key, { isDown: true });\n\n if (editor.handleKeyCommand(event)) {\n return;\n }\n\n if (editor.post.isBlank) {\n editor._insertEmptyMarkupSectionAtCursor();\n }\n\n var range = editor.range;\n\n switch (true) {\n // FIXME This should be restricted to only card/atom boundaries\n case key.isHorizontalArrowWithoutModifiersOtherThanShift():\n var newRange = undefined;\n if (key.isShift()) {\n newRange = range.extend(key.direction * 1);\n } else {\n newRange = range.move(key.direction);\n }\n\n editor.selectRange(newRange);\n event.preventDefault();\n break;\n case key.isDelete():\n var direction = key.direction;\n\n var unit = 'char';\n if (this.modifierKeys.alt && _utilsBrowser['default'].isMac()) {\n unit = 'word';\n } else if (this.modifierKeys.ctrl && _utilsBrowser['default'].isWin()) {\n unit = 'word';\n }\n editor.performDelete({ direction: direction, unit: unit });\n event.preventDefault();\n break;\n case key.isEnter():\n editor.handleNewline(event);\n break;\n case key.isTab():\n event.preventDefault();\n editor.insertText(_utilsCharacters.TAB);\n break;\n }\n }\n }, {\n key: 'keyup',\n value: function keyup(event) {\n var editor = this.editor;\n\n if (!editor.hasCursor()) {\n return;\n }\n var key = _utilsKey['default'].fromEvent(event);\n this._updateModifiersFromKey(key, { isDown: false });\n }\n }, {\n key: 'cut',\n value: function cut(event) {\n event.preventDefault();\n\n this.copy(event);\n this.editor.performDelete();\n }\n }, {\n key: 'copy',\n value: function copy(event) {\n event.preventDefault();\n\n var editor = this.editor;\n var _editor = this.editor;\n var range = _editor.range;\n var post = _editor.post;\n\n post = post.trimTo(range);\n\n var data = {\n html: editor.serializePost(post, 'html'),\n text: editor.serializePost(post, 'text'),\n mobiledoc: editor.serializePost(post, 'mobiledoc')\n };\n\n (0, _utilsParseUtils.setClipboardData)(event, data, window);\n }\n }, {\n key: 'paste',\n value: function paste(event) {\n event.preventDefault();\n\n var editor = this.editor;\n\n var range = editor.range;\n\n if (!range.isCollapsed) {\n editor.performDelete();\n }\n var position = editor.range.head;\n var targetFormat = this.modifierKeys.shift ? 'text' : 'html';\n var pastedPost = (0, _utilsParseUtils.parsePostFromPaste)(event, editor, { targetFormat: targetFormat });\n\n editor.run(function (postEditor) {\n var nextPosition = postEditor.insertPost(position, pastedPost);\n postEditor.setRange(nextPosition);\n });\n }\n }, {\n key: 'drop',\n value: function drop(event) {\n event.preventDefault();\n\n var x = event.clientX;\n var y = event.clientY;\n var editor = this.editor;\n\n var position = editor.positionAtPoint(x, y);\n if (!position) {\n this.logger.log('Could not find drop position');\n return;\n }\n\n var post = (0, _utilsParseUtils.parsePostFromDrop)(event, editor, { logger: this.logger });\n if (!post) {\n this.logger.log('Could not determine post from drop event');\n return;\n }\n\n editor.run(function (postEditor) {\n var nextPosition = postEditor.insertPost(position, post);\n postEditor.setRange(nextPosition);\n });\n }\n }, {\n key: '_updateModifiersFromKey',\n value: function _updateModifiersFromKey(key, _ref5) {\n var isDown = _ref5.isDown;\n\n if (key.isShiftKey()) {\n this.modifierKeys.shift = isDown;\n } else if (key.isAltKey()) {\n this.modifierKeys.alt = isDown;\n } else if (key.isCtrlKey()) {\n this.modifierKeys.ctrl = isDown;\n }\n }\n }]);\n\n return EventManager;\n})();\n\nexports['default'] = EventManager;","'use strict';\n\nexports.buildKeyCommand = buildKeyCommand;\nexports.validateKeyCommand = validateKeyCommand;\nexports.findKeyCommands = findKeyCommands;\n\nfunction _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\nvar _utilsKey = require('../utils/key');\n\nvar _utilsArrayUtils = require('../utils/array-utils');\n\nvar _utilsAssert = require('../utils/assert');\n\nvar _utilsBrowser = require('../utils/browser');\n\nfunction selectAll(editor) {\n var post = editor.post;\n\n editor.selectRange(post.toRange());\n}\n\nfunction gotoStartOfLine(editor) {\n var range = editor.range;\n var section = range.tail.section;\n\n editor.run(function (postEditor) {\n postEditor.setRange(section.headPosition());\n });\n}\n\nfunction gotoEndOfLine(editor) {\n var range = editor.range;\n var section = range.tail.section;\n\n editor.run(function (postEditor) {\n postEditor.setRange(section.tailPosition());\n });\n}\n\nfunction deleteToEndOfSection(editor) {\n var range = editor.range;\n\n if (range.isCollapsed) {\n var _range = range;\n var head = _range.head;\n var section = _range.head.section;\n\n range = head.toRange(section.tailPosition());\n }\n editor.run(function (postEditor) {\n var nextPosition = postEditor.deleteRange(range);\n postEditor.setRange(nextPosition);\n });\n}\n\nfunction toggleLink(editor) {\n if (editor.range.isCollapsed) {\n return;\n }\n\n var selectedText = editor.cursor.selectedText();\n var defaultUrl = '';\n if (selectedText.indexOf('http') !== -1) {\n defaultUrl = selectedText;\n }\n\n var range = editor.range;\n\n var hasLink = editor.detectMarkupInRange(range, 'a');\n\n if (hasLink) {\n editor.run(function (postEditor) {\n return postEditor.toggleMarkup('a');\n });\n } else {\n editor.showPrompt('Enter a URL', defaultUrl, function (url) {\n if (!url) {\n return;\n }\n\n editor.run(function (postEditor) {\n var markup = postEditor.builder.createMarkup('a', { href: url });\n postEditor.toggleMarkup(markup);\n });\n });\n }\n}\n\nvar DEFAULT_KEY_COMMANDS = [{\n str: 'META+B',\n run: function run(editor) {\n editor.toggleMarkup('strong');\n }\n}, {\n str: 'CTRL+B',\n run: function run(editor) {\n editor.toggleMarkup('strong');\n }\n}, {\n str: 'META+I',\n run: function run(editor) {\n editor.toggleMarkup('em');\n }\n}, {\n str: 'CTRL+I',\n run: function run(editor) {\n editor.toggleMarkup('em');\n }\n}, {\n str: 'CTRL+K',\n run: function run(editor) {\n if (_utilsBrowser['default'].isMac()) {\n return deleteToEndOfSection(editor);\n } else if (_utilsBrowser['default'].isWin()) {\n return toggleLink(editor);\n }\n }\n}, {\n str: 'CTRL+A',\n run: function run(editor) {\n if (_utilsBrowser['default'].isMac()) {\n gotoStartOfLine(editor);\n } else {\n selectAll(editor);\n }\n }\n}, {\n str: 'META+A',\n run: function run(editor) {\n if (_utilsBrowser['default'].isMac()) {\n selectAll(editor);\n }\n }\n}, {\n str: 'CTRL+E',\n run: function run(editor) {\n if (_utilsBrowser['default'].isMac()) {\n gotoEndOfLine(editor);\n }\n }\n}, {\n str: 'META+K',\n run: function run(editor) {\n return toggleLink(editor);\n }\n\n}, {\n str: 'META+Z',\n run: function run(editor) {\n editor.run(function (postEditor) {\n postEditor.undoLastChange();\n });\n }\n}, {\n str: 'META+SHIFT+Z',\n run: function run(editor) {\n editor.run(function (postEditor) {\n postEditor.redoLastChange();\n });\n }\n}, {\n str: 'CTRL+Z',\n run: function run(editor) {\n if (_utilsBrowser['default'].isMac()) {\n return false;\n }\n editor.run(function (postEditor) {\n return postEditor.undoLastChange();\n });\n }\n}, {\n str: 'CTRL+SHIFT+Z',\n run: function run(editor) {\n if (_utilsBrowser['default'].isMac()) {\n return false;\n }\n editor.run(function (postEditor) {\n return postEditor.redoLastChange();\n });\n }\n}];\n\nexports.DEFAULT_KEY_COMMANDS = DEFAULT_KEY_COMMANDS;\nfunction modifierNamesToMask(modiferNames) {\n var defaultVal = 0;\n return (0, _utilsArrayUtils.reduce)(modiferNames, function (sum, name) {\n var modifier = _utilsKey.MODIFIERS[name.toUpperCase()];\n (0, _utilsAssert['default'])('No modifier named \"' + name + '\" found', !!modifier);\n return sum + modifier;\n }, defaultVal);\n}\n\nfunction characterToCode(character) {\n var upperCharacter = character.toUpperCase();\n var special = _utilsKey.SPECIAL_KEYS[upperCharacter];\n if (special) {\n return special;\n } else {\n (0, _utilsAssert['default'])('Only 1 character can be used in a key command str (got \"' + character + '\")', character.length === 1);\n return upperCharacter.charCodeAt(0);\n }\n}\n\nfunction buildKeyCommand(keyCommand) {\n var str = keyCommand.str;\n\n if (!str) {\n return keyCommand;\n }\n (0, _utilsAssert['default'])('[deprecation] Key commands no longer use the `modifier` property', !keyCommand.modifier);\n\n var _str$split$reverse = str.split('+').reverse();\n\n var _str$split$reverse2 = _toArray(_str$split$reverse);\n\n var character = _str$split$reverse2[0];\n\n var modifierNames = _str$split$reverse2.slice(1);\n\n keyCommand.modifierMask = modifierNamesToMask(modifierNames);\n keyCommand.code = characterToCode(character);\n\n return keyCommand;\n}\n\nfunction validateKeyCommand(keyCommand) {\n return !!keyCommand.code && !!keyCommand.run;\n}\n\nfunction findKeyCommands(keyCommands, keyEvent) {\n var key = _utilsKey['default'].fromEvent(keyEvent);\n\n return (0, _utilsArrayUtils.filter)(keyCommands, function (_ref) {\n var modifierMask = _ref.modifierMask;\n var code = _ref.code;\n\n return key.keyCode === code && key.modifierMask === modifierMask;\n });\n}","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsSet = require('../utils/set');\n\nvar _utilsArrayUtils = require('../utils/array-utils');\n\nvar _utilsAssert = require('../utils/assert');\n\nvar _utilsDomUtils = require('../utils/dom-utils');\n\nvar MUTATION = {\n NODES_CHANGED: 'childList',\n CHARACTER_DATA: 'characterData'\n};\n\nvar MutationHandler = (function () {\n function MutationHandler(editor) {\n var _this = this;\n\n _classCallCheck(this, MutationHandler);\n\n this.editor = editor;\n this.logger = editor.loggerFor('mutation-handler');\n this.renderTree = null;\n this._isObserving = false;\n\n this._observer = new MutationObserver(function (mutations) {\n _this._handleMutations(mutations);\n });\n }\n\n _createClass(MutationHandler, [{\n key: 'init',\n value: function init() {\n this.startObserving();\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.stopObserving();\n this._observer = null;\n }\n }, {\n key: 'suspendObservation',\n value: function suspendObservation(callback) {\n this.stopObserving();\n callback();\n this.startObserving();\n }\n }, {\n key: 'stopObserving',\n value: function stopObserving() {\n if (this._isObserving) {\n this._isObserving = false;\n this._observer.disconnect();\n }\n }\n }, {\n key: 'startObserving',\n value: function startObserving() {\n if (!this._isObserving) {\n var editor = this.editor;\n\n (0, _utilsAssert['default'])('Cannot observe un-rendered editor', editor.hasRendered);\n\n this._isObserving = true;\n this.renderTree = editor._renderTree;\n\n this._observer.observe(editor.element, {\n characterData: true,\n childList: true,\n subtree: true\n });\n }\n }\n }, {\n key: 'reparsePost',\n value: function reparsePost() {\n this.editor._reparsePost();\n }\n }, {\n key: 'reparseSections',\n value: function reparseSections(sections) {\n this.editor._reparseSections(sections);\n }\n\n /**\n * for each mutation:\n * * find the target nodes:\n * * if nodes changed, target nodes are:\n * * added nodes\n * * the target from which removed nodes were removed\n * * if character data changed\n * * target node is the mutation event's target (text node)\n * * filter out nodes that are no longer attached (parentNode is null)\n * * for each remaining node:\n * * find its section, add to sections-to-reparse\n * * if no section, reparse all (and break)\n */\n }, {\n key: '_handleMutations',\n value: function _handleMutations(mutations) {\n var reparsePost = false;\n var sections = new _utilsSet['default']();\n\n for (var i = 0; i < mutations.length; i++) {\n if (reparsePost) {\n break;\n }\n\n var nodes = this._findTargetNodes(mutations[i]);\n\n for (var j = 0; j < nodes.length; j++) {\n var node = nodes[j];\n var renderNode = this._findRenderNodeFromNode(node);\n if (renderNode) {\n if (renderNode.reparsesMutationOfChildNode(node)) {\n var section = this._findSectionFromRenderNode(renderNode);\n if (section) {\n sections.add(section);\n } else {\n reparsePost = true;\n }\n }\n } else {\n reparsePost = true;\n break;\n }\n }\n }\n\n if (reparsePost) {\n this.logger.log('reparsePost (' + mutations.length + ' mutations)');\n this.reparsePost();\n } else if (sections.length) {\n this.logger.log('reparse ' + sections.length + ' sections (' + mutations.length + ' mutations)');\n this.reparseSections(sections.toArray());\n }\n }\n }, {\n key: '_findTargetNodes',\n value: function _findTargetNodes(mutation) {\n var nodes = [];\n\n switch (mutation.type) {\n case MUTATION.CHARACTER_DATA:\n nodes.push(mutation.target);\n break;\n case MUTATION.NODES_CHANGED:\n (0, _utilsArrayUtils.forEach)(mutation.addedNodes, function (n) {\n return nodes.push(n);\n });\n if (mutation.removedNodes.length) {\n nodes.push(mutation.target);\n }\n break;\n }\n\n var element = this.editor.element;\n var attachedNodes = (0, _utilsArrayUtils.filter)(nodes, function (node) {\n return (0, _utilsDomUtils.containsNode)(element, node);\n });\n return attachedNodes;\n }\n }, {\n key: '_findSectionRenderNodeFromNode',\n value: function _findSectionRenderNodeFromNode(node) {\n return this.renderTree.findRenderNodeFromElement(node, function (rn) {\n return rn.postNode.isSection;\n });\n }\n }, {\n key: '_findRenderNodeFromNode',\n value: function _findRenderNodeFromNode(node) {\n return this.renderTree.findRenderNodeFromElement(node);\n }\n }, {\n key: '_findSectionFromRenderNode',\n value: function _findSectionFromRenderNode(renderNode) {\n var sectionRenderNode = this._findSectionRenderNodeFromNode(renderNode.element);\n return sectionRenderNode && sectionRenderNode.postNode;\n }\n }]);\n\n return MutationHandler;\n})();\n\nexports['default'] = MutationHandler;","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsCursorPosition = require('../utils/cursor/position');\n\nvar _utilsCursorRange = require('../utils/cursor/range');\n\nvar _utilsArrayUtils = require('../utils/array-utils');\n\nvar _utilsKey = require('../utils/key');\n\nvar _modelsLifecycleCallbacks = require('../models/lifecycle-callbacks');\n\nvar _utilsAssert = require('../utils/assert');\n\nvar _utilsDomUtils = require('../utils/dom-utils');\n\nvar _postPostInserter = require('./post/post-inserter');\n\nvar _utilsDeprecate = require('../utils/deprecate');\n\nvar _utilsToRange = require('../utils/to-range');\n\nvar FORWARD = _utilsKey.DIRECTION.FORWARD;\nvar BACKWARD = _utilsKey.DIRECTION.BACKWARD;\n\nfunction isListSectionTagName(tagName) {\n return tagName === 'ul' || tagName === 'ol';\n}\n\nvar CALLBACK_QUEUES = {\n BEFORE_COMPLETE: 'beforeComplete',\n COMPLETE: 'complete',\n AFTER_COMPLETE: 'afterComplete'\n};\n\n/**\n * The PostEditor is used to modify a post. It should not be instantiated directly.\n * Instead, a new instance of a PostEditor is created by the editor and passed\n * as the argument to the callback in {@link Editor#run}.\n *\n * Usage:\n * ```\n * editor.run((postEditor) => {\n * // postEditor is an instance of PostEditor that can operate on the\n * // editor's post\n * });\n * ```\n */\n\nvar PostEditor = (function () {\n /**\n * @private\n */\n\n function PostEditor(editor) {\n var _this = this;\n\n _classCallCheck(this, PostEditor);\n\n this.editor = editor;\n this.builder = this.editor.builder;\n this._callbacks = new _modelsLifecycleCallbacks['default']((0, _utilsArrayUtils.values)(CALLBACK_QUEUES));\n\n this._didComplete = false;\n\n this._renderRange = function () {\n return _this.editor.selectRange(_this._range);\n };\n this._postDidChange = function () {\n return _this.editor._postDidChange();\n };\n this._rerender = function () {\n return _this.editor.rerender();\n };\n }\n\n _createClass(PostEditor, [{\n key: 'addCallback',\n value: function addCallback() {\n var _callbacks;\n\n (_callbacks = this._callbacks).addCallback.apply(_callbacks, arguments);\n }\n }, {\n key: 'addCallbackOnce',\n value: function addCallbackOnce() {\n var _callbacks2;\n\n (_callbacks2 = this._callbacks).addCallbackOnce.apply(_callbacks2, arguments);\n }\n }, {\n key: 'runCallbacks',\n value: function runCallbacks() {\n var _callbacks3;\n\n (_callbacks3 = this._callbacks).runCallbacks.apply(_callbacks3, arguments);\n }\n }, {\n key: 'begin',\n value: function begin() {\n // cache the editor's range\n this._range = this.editor.range;\n }\n\n /**\n * Schedules to select the given range on the editor after the postEditor\n * has completed its work. This also updates the postEditor's active range\n * (so that multiple calls to range-changing methods on the postEditor will\n * update the correct range).\n *\n * Usage:\n * let range = editor.range;\n * editor.run(postEditor => {\n * let nextPosition = postEditor.deleteRange(range);\n *\n * // Will position the editor's cursor at `nextPosition` after\n * // the postEditor finishes work and the editor rerenders.\n * postEditor.setRange(nextPosition);\n * });\n * @param {Range|Position} range\n * @public\n */\n }, {\n key: 'setRange',\n value: function setRange(range) {\n range = (0, _utilsToRange['default'])(range);\n\n // TODO validate that the range is valid\n // (does not contain marked-for-removal head or tail sections?)\n this._range = range;\n this.scheduleAfterRender(this._renderRange, true);\n }\n\n /**\n * Delete a range from the post\n *\n * Usage:\n * ```\n * let { range } = editor;\n * editor.run((postEditor) => {\n * let nextPosition = postEditor.deleteRange(range);\n * postEditor.setRange(nextPosition);\n * });\n * ```\n * @param {Range} range Cursor Range object with head and tail Positions\n * @return {Position} The position where the cursor would go after deletion\n * @public\n */\n }, {\n key: 'deleteRange',\n value: function deleteRange(range) {\n (0, _utilsAssert['default'])(\"Must pass MobiledocKit Range to `deleteRange`\", range instanceof _utilsCursorRange['default']);\n\n var head = range.head;\n var headSection = range.head.section;\n var tail = range.tail;\n var tailSection = range.tail.section;\n var post = this.editor.post;\n\n if (headSection === tailSection) {\n return this.cutSection(headSection, head, tail);\n }\n\n var nextSection = headSection.nextLeafSection();\n\n var nextPos = this.cutSection(headSection, head, headSection.tailPosition());\n // cutSection can replace the section, so re-read headSection here\n headSection = nextPos.section;\n\n // Remove sections in the middle of the range\n while (nextSection !== tailSection) {\n var tmp = nextSection;\n nextSection = nextSection.nextLeafSection();\n this.removeSection(tmp);\n }\n\n var tailPos = this.cutSection(tailSection, tailSection.headPosition(), tail);\n // cutSection can replace the section, so re-read tailSection here\n tailSection = tailPos.section;\n\n if (tailSection.isBlank) {\n this.removeSection(tailSection);\n } else {\n // If head and tail sections are markerable, join them\n // Note: They may not be the same section type. E.g. this may join\n // a tail section that was a list item onto a markup section, or vice versa.\n // (This is the desired behavior.)\n if (headSection.isMarkerable && tailSection.isMarkerable) {\n headSection.join(tailSection);\n this._markDirty(headSection);\n this.removeSection(tailSection);\n } else if (headSection.isBlank) {\n this.removeSection(headSection);\n nextPos = tailPos;\n }\n }\n\n if (post.isBlank) {\n post.sections.append(this.builder.createMarkupSection('p'));\n nextPos = post.headPosition();\n }\n\n return nextPos;\n }\n\n /**\n * Note: This method may replace `section` with a different section.\n *\n * \"Cut\" out the part of the section inside `headOffset` and `tailOffset`.\n * If section is markerable this splits markers that straddle the head or tail (if necessary),\n * and removes markers that are wholly inside the offsets.\n * If section is a card, this may replace it with a blank markup section if the\n * positions contain the entire card.\n *\n * @param {Section} section\n * @param {Position} head\n * @param {Position} tail\n * @return {Position}\n * @private\n */\n }, {\n key: 'cutSection',\n value: function cutSection(section, head, tail) {\n var _this2 = this;\n\n (0, _utilsAssert['default'])('Must pass head position and tail position to `cutSection`', head instanceof _utilsCursorPosition['default'] && tail instanceof _utilsCursorPosition['default']);\n (0, _utilsAssert['default'])('Must pass positions within same section to `cutSection`', head.section === tail.section);\n\n if (section.isBlank || head.isEqual(tail)) {\n return head;\n }\n if (section.isCardSection) {\n if (head.isHead() && tail.isTail()) {\n var newSection = this.builder.createMarkupSection();\n this.replaceSection(section, newSection);\n return newSection.headPosition();\n } else {\n return tail;\n }\n }\n\n var range = head.toRange(tail);\n this.splitMarkers(range).forEach(function (m) {\n return _this2.removeMarker(m);\n });\n\n return head;\n }\n }, {\n key: '_coalesceMarkers',\n value: function _coalesceMarkers(section) {\n if (section.isMarkerable) {\n this._removeBlankMarkers(section);\n this._joinSimilarMarkers(section);\n }\n }\n }, {\n key: '_removeBlankMarkers',\n value: function _removeBlankMarkers(section) {\n var _this3 = this;\n\n (0, _utilsArrayUtils.forEach)((0, _utilsArrayUtils.filter)(section.markers, function (m) {\n return m.isBlank;\n }), function (m) {\n return _this3.removeMarker(m);\n });\n }\n\n // joins markers that have identical markups\n }, {\n key: '_joinSimilarMarkers',\n value: function _joinSimilarMarkers(section) {\n var marker = section.markers.head;\n var nextMarker = undefined;\n while (marker && marker.next) {\n nextMarker = marker.next;\n\n if (marker.canJoin(nextMarker)) {\n nextMarker.value = marker.value + nextMarker.value;\n this._markDirty(nextMarker);\n this.removeMarker(marker);\n }\n\n marker = nextMarker;\n }\n }\n }, {\n key: 'removeMarker',\n value: function removeMarker(marker) {\n this._scheduleForRemoval(marker);\n if (marker.section) {\n this._markDirty(marker.section);\n marker.section.markers.remove(marker);\n }\n }\n }, {\n key: '_scheduleForRemoval',\n value: function _scheduleForRemoval(postNode) {\n var _this4 = this;\n\n if (postNode.renderNode) {\n postNode.renderNode.scheduleForRemoval();\n\n this.scheduleRerender();\n this.scheduleDidUpdate();\n }\n var removedAdjacentToList = postNode.prev && postNode.prev.isListSection || postNode.next && postNode.next.isListSection;\n if (removedAdjacentToList) {\n this.addCallback(CALLBACK_QUEUES.BEFORE_COMPLETE, function () {\n return _this4._joinContiguousListSections();\n });\n }\n }\n }, {\n key: '_joinContiguousListSections',\n value: function _joinContiguousListSections() {\n var _this5 = this;\n\n var post = this.editor.post;\n\n var range = this._range;\n var prev = undefined;\n var groups = [];\n var currentGroup = undefined;\n\n // FIXME do we need to force a re-render of the range if changed sections\n // are contained within the range?\n var updatedHead = null;\n (0, _utilsArrayUtils.forEach)(post.sections, function (section) {\n if (prev && prev.isListSection && section.isListSection && prev.tagName === section.tagName) {\n\n currentGroup = currentGroup || [prev];\n currentGroup.push(section);\n } else {\n if (currentGroup) {\n groups.push(currentGroup);\n }\n currentGroup = null;\n }\n prev = section;\n });\n\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n (0, _utilsArrayUtils.forEach)(groups, function (group) {\n var list = group[0];\n (0, _utilsArrayUtils.forEach)(group, function (listSection) {\n if (listSection === list) {\n return;\n }\n\n var currentHead = range.head;\n var prevPosition = undefined;\n\n // FIXME is there a currentHead if there is no range?\n // is the current head a list item in the section\n if (!range.isBlank && currentHead.section.isListItem && currentHead.section.parent === listSection) {\n prevPosition = list.tailPosition();\n }\n _this5._joinListSections(list, listSection);\n if (prevPosition) {\n updatedHead = prevPosition.move(FORWARD);\n }\n });\n });\n\n if (updatedHead) {\n this.setRange(updatedHead);\n }\n }\n }, {\n key: '_joinListSections',\n value: function _joinListSections(baseList, nextList) {\n baseList.join(nextList);\n this._markDirty(baseList);\n this.removeSection(nextList);\n }\n }, {\n key: '_markDirty',\n value: function _markDirty(postNode) {\n var _this6 = this;\n\n if (postNode.renderNode) {\n postNode.renderNode.markDirty();\n\n this.scheduleRerender();\n this.scheduleDidUpdate();\n }\n if (postNode.section) {\n this._markDirty(postNode.section);\n }\n if (postNode.isMarkerable) {\n this.addCallback(CALLBACK_QUEUES.BEFORE_COMPLETE, function () {\n return _this6._coalesceMarkers(postNode);\n });\n }\n }\n\n /**\n * @param {Position} position object with {section, offset} the marker and offset to delete from\n * @param {Number} direction The direction to delete in (default is BACKWARD)\n * @return {Position} for positioning the cursor\n * @public\n * @deprecated after v0.10.3\n */\n }, {\n key: 'deleteFrom',\n value: function deleteFrom(position) {\n var direction = arguments.length <= 1 || arguments[1] === undefined ? _utilsKey.DIRECTION.BACKWARD : arguments[1];\n\n (0, _utilsDeprecate['default'])(\"`postEditor#deleteFrom is deprecated. Use `deleteAtPosition(position, direction=BACKWARD, {unit}={unit: 'char'})` instead\");\n return this.deleteAtPosition(position, direction, { unit: 'char' });\n }\n\n /**\n * Delete 1 `unit` (can be 'char' or 'word') in the given `direction` at the given\n * `position`. In almost all cases this will be equivalent to deleting the range formed\n * by expanding the position 1 unit in the given direction. The exception is when deleting\n * backward from the beginning of a list item, which reverts the list item into a markup section\n * instead of joining it with its previous list item (if any).\n *\n * Usage:\n *\n * let position = section.tailPosition();\n * // Section has text of \"Howdy!\"\n * editor.run((postEditor) => {\n * postEditor.deleteAtPosition(position);\n * });\n * // section has text of \"Howdy\"\n *\n * @param {Position} position The position to delete at\n * @param {Direction} [direction=DIRECTION.BACKWARD] direction The direction to delete in\n * @param {Object} [options]\n * @param {String} [options.unit=\"char\"] The unit of deletion (\"word\" or \"char\")\n * @return {Position}\n */\n }, {\n key: 'deleteAtPosition',\n value: function deleteAtPosition(position) {\n var direction = arguments.length <= 1 || arguments[1] === undefined ? _utilsKey.DIRECTION.BACKWARD : arguments[1];\n\n var _ref = arguments.length <= 2 || arguments[2] === undefined ? { unit: 'char' } : arguments[2];\n\n var unit = _ref.unit;\n\n if (direction === _utilsKey.DIRECTION.BACKWARD) {\n return this._deleteAtPositionBackward(position, unit);\n } else {\n return this._deleteAtPositionForward(position, unit);\n }\n }\n }, {\n key: '_deleteAtPositionBackward',\n value: function _deleteAtPositionBackward(position, unit) {\n if (position.isHead() && position.section.isListItem) {\n this.toggleSection('p', position);\n return this._range.head;\n } else {\n var prevPosition = unit === 'word' ? position.moveWord(BACKWARD) : position.move(BACKWARD);\n var range = prevPosition.toRange(position);\n return this.deleteRange(range);\n }\n }\n }, {\n key: '_deleteAtPositionForward',\n value: function _deleteAtPositionForward(position, unit) {\n var nextPosition = unit === 'word' ? position.moveWord(FORWARD) : position.move(FORWARD);\n var range = position.toRange(nextPosition);\n return this.deleteRange(range);\n }\n\n /**\n * Split markers at two positions, once at the head, and if necessary once\n * at the tail.\n *\n * Usage:\n * ```\n * let range = editor.range;\n * editor.run((postEditor) => {\n * postEditor.splitMarkers(range);\n * });\n * ```\n * The return value will be marker object completely inside the offsets\n * provided. Markers outside of the split may also have been modified.\n *\n * @param {Range} markerRange\n * @return {Array} of markers that are inside the split\n * @private\n */\n }, {\n key: 'splitMarkers',\n value: function splitMarkers(range) {\n var post = this.editor.post;\n var head = range.head;\n var tail = range.tail;\n\n this.splitSectionMarkerAtOffset(head.section, head.offset);\n this.splitSectionMarkerAtOffset(tail.section, tail.offset);\n\n return post.markersContainedByRange(range);\n }\n }, {\n key: 'splitSectionMarkerAtOffset',\n value: function splitSectionMarkerAtOffset(section, offset) {\n var _this7 = this;\n\n var edit = section.splitMarkerAtOffset(offset);\n edit.removed.forEach(function (m) {\n return _this7.removeMarker(m);\n });\n }\n\n /**\n * Split the section at the position.\n *\n * Usage:\n * ```\n * let position = editor.cursor.offsets.head;\n * editor.run((postEditor) => {\n * postEditor.splitSection(position);\n * });\n * // Will result in the creation of two new sections\n * // replacing the old one at the cursor position\n * ```\n * The return value will be the two new sections. One or both of these\n * sections can be blank (contain only a blank marker), for example if the\n * headMarkerOffset is 0.\n *\n * @param {Position} position\n * @return {Array} new sections, one for the first half and one for the second (either one can be null)\n * @public\n */\n }, {\n key: 'splitSection',\n value: function splitSection(position) {\n var _this8 = this;\n\n var section = position.section;\n\n if (section.isCardSection) {\n return this._splitCardSection(section, position);\n } else if (section.isListItem) {\n var isLastAndBlank = section.isBlank && !section.next;\n if (isLastAndBlank) {\n // if is last, replace the item with a blank markup section\n var _parent = section.parent;\n var collection = this.editor.post.sections;\n var blank = this.builder.createMarkupSection();\n this.removeSection(section);\n this.insertSectionBefore(collection, blank, _parent.next);\n\n return [null, blank];\n } else {\n var _splitListItem2 = this._splitListItem(section, position);\n\n var _splitListItem22 = _slicedToArray(_splitListItem2, 2);\n\n var pre = _splitListItem22[0];\n var post = _splitListItem22[1];\n\n return [pre, post];\n }\n } else {\n var splitSections = section.splitAtPosition(position);\n splitSections.forEach(function (s) {\n return _this8._coalesceMarkers(s);\n });\n this._replaceSection(section, splitSections);\n\n return splitSections;\n }\n }\n\n /**\n * @param {Section} cardSection\n * @param {Position} position to split at\n * @return {Section[]} 2-item array of pre and post-split sections\n * @private\n */\n }, {\n key: '_splitCardSection',\n value: function _splitCardSection(cardSection, position) {\n var offset = position.offset;\n\n (0, _utilsAssert['default'])('Cards section must be split at offset 0 or 1', offset === 0 || offset === 1);\n\n var newSection = this.builder.createMarkupSection();\n var nextSection = undefined;\n var surroundingSections = undefined;\n\n if (offset === 0) {\n nextSection = cardSection;\n surroundingSections = [newSection, cardSection];\n } else {\n nextSection = cardSection.next;\n surroundingSections = [cardSection, newSection];\n }\n\n var collection = this.editor.post.sections;\n this.insertSectionBefore(collection, newSection, nextSection);\n\n return surroundingSections;\n }\n\n /**\n * @param {Section} section\n * @param {Section} newSection\n * @return null\n * @public\n */\n }, {\n key: 'replaceSection',\n value: function replaceSection(section, newSection) {\n if (!section) {\n // FIXME should a falsy section be a valid argument?\n this.insertSectionBefore(this.editor.post.sections, newSection, null);\n } else {\n this._replaceSection(section, [newSection]);\n }\n }\n }, {\n key: 'moveSectionBefore',\n value: function moveSectionBefore(collection, renderedSection, beforeSection) {\n var newSection = renderedSection.clone();\n this.removeSection(renderedSection);\n this.insertSectionBefore(collection, newSection, beforeSection);\n return newSection;\n }\n\n /**\n * @param {Section} section A section that is already in DOM\n * @public\n */\n }, {\n key: 'moveSectionUp',\n value: function moveSectionUp(renderedSection) {\n var isFirst = !renderedSection.prev;\n if (isFirst) {\n return renderedSection;\n }\n\n var collection = renderedSection.parent.sections;\n var beforeSection = renderedSection.prev;\n return this.moveSectionBefore(collection, renderedSection, beforeSection);\n }\n\n /**\n * @param {Section} section A section that is already in DOM\n * @public\n */\n }, {\n key: 'moveSectionDown',\n value: function moveSectionDown(renderedSection) {\n var isLast = !renderedSection.next;\n if (isLast) {\n return renderedSection;\n }\n\n var beforeSection = renderedSection.next.next;\n var collection = renderedSection.parent.sections;\n return this.moveSectionBefore(collection, renderedSection, beforeSection);\n }\n\n /**\n * Insert an array of markers at the given position. If the position is in\n * a non-markerable section (like a card section), this method throws an error.\n *\n * @param {Position} position\n * @param {Marker[]} markers\n * @return {Position} The position that represents the end of the inserted markers.\n * @public\n */\n }, {\n key: 'insertMarkers',\n value: function insertMarkers(position, markers) {\n var _this9 = this;\n\n var section = position.section;\n var offset = position.offset;\n\n (0, _utilsAssert['default'])('Cannot insert markers at non-markerable position', section.isMarkerable);\n\n var edit = section.splitMarkerAtOffset(offset);\n edit.removed.forEach(function (marker) {\n return _this9._scheduleForRemoval(marker);\n });\n\n var prevMarker = section.markerBeforeOffset(offset);\n markers.forEach(function (marker) {\n section.markers.insertAfter(marker, prevMarker);\n offset += marker.length;\n prevMarker = marker;\n });\n\n this._coalesceMarkers(section);\n this._markDirty(section);\n\n var nextPosition = section.toPosition(offset);\n this.setRange(nextPosition);\n return nextPosition;\n }\n\n /**\n * Inserts text with the given markups, ignoring the existing markups at\n * the position, if any.\n *\n * @param {Position} position\n * @param {String} text\n * @param {Markup[]} markups\n * @return {Position} position at the end of the inserted text\n */\n }, {\n key: 'insertTextWithMarkup',\n value: function insertTextWithMarkup(position, text) {\n var markups = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2];\n var section = position.section;\n\n if (!section.isMarkerable) {\n return;\n }\n var marker = this.builder.createMarker(text, markups);\n return this.insertMarkers(position, [marker]);\n }\n\n /**\n * Insert the text at the given position\n * Inherits the markups already at that position, if any.\n *\n * @param {Position} position\n * @param {String} text\n * @return {Position} position at the end of the inserted text.\n */\n }, {\n key: 'insertText',\n value: function insertText(position, text) {\n var section = position.section;\n\n if (!section.isMarkerable) {\n return;\n }\n var markups = position.marker && position.marker.markups;\n markups = markups || [];\n return this.insertTextWithMarkup(position, text, markups);\n }\n }, {\n key: '_replaceSection',\n value: function _replaceSection(section, newSections) {\n var _this10 = this;\n\n var nextSection = section.next;\n var collection = section.parent.sections;\n\n var nextNewSection = newSections[0];\n if (nextNewSection.isMarkupSection && section.isListItem) {\n // put the new section after the ListSection (section.parent)\n // instead of after the ListItem\n collection = section.parent.parent.sections;\n nextSection = section.parent.next;\n }\n\n newSections.forEach(function (s) {\n return _this10.insertSectionBefore(collection, s, nextSection);\n });\n this.removeSection(section);\n }\n\n /**\n * Given a markerRange (for example `editor.range`) mark all markers\n * inside it as a given markup. The markup must be provided as a post\n * abstract node.\n *\n * Usage:\n *\n * let range = editor.range;\n * let strongMarkup = editor.builder.createMarkup('strong');\n * editor.run((postEditor) => {\n * postEditor.addMarkupToRange(range, strongMarkup);\n * });\n * // Will result some markers possibly being split, and the markup\n * // being applied to all markers between the split.\n *\n * @param {Range} range\n * @param {Markup} markup A markup post abstract node\n * @public\n */\n }, {\n key: 'addMarkupToRange',\n value: function addMarkupToRange(range, markup) {\n var _this11 = this;\n\n if (range.isCollapsed) {\n return;\n }\n\n var markers = this.splitMarkers(range);\n if (markers.length) {\n (function () {\n // We insert the new markup at a consistent index across the range.\n // If we just push on the end of the list, it can end up in different positions\n // of the markup stack. This results in unnecessary closing and re-opening of\n // the markup each time it changes position.\n // If we just push it at the beginning of the list, this causes unnecessary closing\n // and re-opening of surrounding tags.\n // So, we look for any tags open across the whole range, and push into the stack\n // at the end of those.\n // Prompted by https://github.com/bustlelabs/mobiledoc-kit/issues/360\n\n var markupsOpenAcrossRange = (0, _utilsArrayUtils.reduce)(markers, function (soFar, marker) {\n return (0, _utilsArrayUtils.commonItems)(soFar, marker.markups);\n }, markers[0].markups);\n var indexToInsert = markupsOpenAcrossRange.length;\n\n markers.forEach(function (marker) {\n marker.addMarkupAtIndex(markup, indexToInsert);\n _this11._markDirty(marker);\n });\n })();\n }\n }\n\n /**\n * Given a markerRange (for example `editor.range`) remove the given\n * markup from all contained markers.\n *\n * Usage:\n * ```\n * let { range } = editor;\n * let markup = markerRange.headMarker.markups[0];\n * editor.run(postEditor => {\n * postEditor.removeMarkupFromRange(range, markup);\n * });\n * // Will result in some markers possibly being split, and the markup\n * // being removed from all markers between the split.\n * ```\n * @param {Range} range Object with offsets\n * @param {Markup|Function} markupOrCallback A markup post abstract node or\n * a function that returns true when passed a markup that should be removed\n * @private\n */\n }, {\n key: 'removeMarkupFromRange',\n value: function removeMarkupFromRange(range, markupOrMarkupCallback) {\n var _this12 = this;\n\n if (range.isCollapsed) {\n return;\n }\n\n this.splitMarkers(range).forEach(function (marker) {\n marker.removeMarkup(markupOrMarkupCallback);\n _this12._markDirty(marker);\n });\n }\n\n /**\n * Toggle the given markup in the given range (or at the position given). If the range/position\n * has the markup, the markup will be removed. If nothing in the range/position\n * has the markup, the markup will be added to everything in the range/position.\n *\n * Usage:\n * ```\n * // Remove any 'strong' markup if it exists in the selection, otherwise\n * // make it all 'strong'\n * editor.run(postEditor => postEditor.toggleMarkup('strong'));\n *\n * // add/remove a link to 'bustle.com' to the selection\n * editor.run(postEditor => {\n * const linkMarkup = postEditor.builder.createMarkup('a', {href: 'http://bustle.com'});\n * postEditor.toggleMarkup(linkMarkup);\n * });\n * ```\n * @param {Markup|String} markupOrString Either a markup object created using\n * the builder (useful when adding a markup with attributes, like an 'a' markup),\n * or, if a string, the tag name of the markup (e.g. 'strong', 'em') to toggle.\n * @param {Range|Position} range in which to toggle. Defaults to current editor range.\n * @public\n */\n }, {\n key: 'toggleMarkup',\n value: function toggleMarkup(markupOrMarkupString) {\n var range = arguments.length <= 1 || arguments[1] === undefined ? this._range : arguments[1];\n\n range = (0, _utilsToRange['default'])(range);\n var markup = typeof markupOrMarkupString === 'string' ? this.builder.createMarkup(markupOrMarkupString) : markupOrMarkupString;\n\n var hasMarkup = this.editor.detectMarkupInRange(range, markup.tagName);\n // FIXME: This implies only a single markup in a range. This may not be\n // true for links (which are not the same object instance like multiple\n // strong tags would be).\n if (hasMarkup) {\n this.removeMarkupFromRange(range, hasMarkup);\n } else {\n this.addMarkupToRange(range, markup);\n }\n\n this.setRange(range);\n }\n\n /**\n * Toggles the tagName of the active section or sections in the given range/position.\n * If every section has the tag name, they will all be reset to default sections.\n * Otherwise, every section will be changed to the requested type\n *\n * @param {String} sectionTagName A valid markup section or\n * list section tag name (e.g. 'blockquote', 'h2', 'ul')\n * @param {Range|Position} range The range over which to toggle.\n * Defaults to the current editor range.\n * @public\n */\n }, {\n key: 'toggleSection',\n value: function toggleSection(sectionTagName) {\n var _this13 = this;\n\n var range = arguments.length <= 1 || arguments[1] === undefined ? this._range : arguments[1];\n\n range = (0, _utilsToRange['default'])(range);\n\n sectionTagName = (0, _utilsDomUtils.normalizeTagName)(sectionTagName);\n var post = this.editor.post;\n\n var nextRange = range;\n\n var everySectionHasTagName = true;\n post.walkMarkerableSections(range, function (section) {\n if (!_this13._isSameSectionType(section, sectionTagName)) {\n everySectionHasTagName = false;\n }\n });\n\n var tagName = everySectionHasTagName ? 'p' : sectionTagName;\n var firstChanged = undefined;\n post.walkMarkerableSections(range, function (section) {\n var changedSection = _this13.changeSectionTagName(section, tagName);\n firstChanged = firstChanged || changedSection;\n });\n\n if (firstChanged) {\n nextRange = firstChanged.headPosition().toRange();\n }\n this.setRange(nextRange);\n }\n }, {\n key: '_isSameSectionType',\n value: function _isSameSectionType(section, sectionTagName) {\n return section.isListItem ? section.parent.tagName === sectionTagName : section.tagName === sectionTagName;\n }\n\n /**\n * @param {Markerable} section\n * @private\n */\n }, {\n key: 'changeSectionTagName',\n value: function changeSectionTagName(section, newTagName) {\n (0, _utilsAssert['default'])('Cannot pass non-markerable section to `changeSectionTagName`', section.isMarkerable);\n\n if (isListSectionTagName(newTagName)) {\n return this._changeSectionToListItem(section, newTagName);\n } else if (section.isListItem) {\n return this._changeSectionFromListItem(section, newTagName);\n } else {\n section.tagName = newTagName;\n this._markDirty(section);\n return section;\n }\n }\n\n /**\n * Splits the item at the position given.\n * If the position is at the start or end of the item, the pre- or post-item\n * will contain a single empty (\"\") marker.\n * @param {ListItem} item\n * @param {Position} position\n * @return {Array} the pre-item and post-item on either side of the split\n * @private\n */\n }, {\n key: '_splitListItem',\n value: function _splitListItem(item, position) {\n var section = position.section;\n var offset = position.offset;\n\n (0, _utilsAssert['default'])('Cannot split list item at position that does not include item', item === section);\n\n item.splitMarkerAtOffset(offset);\n var prevMarker = item.markerBeforeOffset(offset);\n var preItem = this.builder.createListItem(),\n postItem = this.builder.createListItem();\n\n var currentItem = preItem;\n item.markers.forEach(function (marker) {\n currentItem.markers.append(marker.clone());\n if (marker === prevMarker) {\n currentItem = postItem;\n }\n });\n this._replaceSection(item, [preItem, postItem]);\n return [preItem, postItem];\n }\n\n /**\n * Splits the list at the position given.\n * @return {Array} pre-split list and post-split list, either of which could\n * be blank (0-item list) if the position is at the start or end of the list.\n *\n * Note: Contiguous list sections will be joined in the before_complete queue\n * of the postEditor.\n *\n * @private\n */\n }, {\n key: '_splitListAtPosition',\n value: function _splitListAtPosition(list, position) {\n (0, _utilsAssert['default'])('Cannot split list at position not in list', position.section.parent === list);\n\n var positionIsMiddle = !position.isHead() && !position.isTail();\n if (positionIsMiddle) {\n var item = position.section;\n\n var _splitListItem3 = // jshint ignore:line\n this._splitListItem(item, position);\n\n var _splitListItem32 = _slicedToArray(_splitListItem3, 2);\n\n var pre = _splitListItem32[0];\n var post = _splitListItem32[1];\n\n position = pre.tailPosition();\n }\n\n var preList = this.builder.createListSection(list.tagName);\n var postList = this.builder.createListSection(list.tagName);\n\n var preItem = position.section;\n var currentList = preList;\n list.items.forEach(function (item) {\n // If this item matches the start item and the position is at its start,\n // it should be appended to the postList instead of the preList\n if (item === preItem && position.isEqual(item.headPosition())) {\n currentList = postList;\n }\n currentList.items.append(item.clone());\n // If we just appended the preItem, append the remaining items to the postList\n if (item === preItem) {\n currentList = postList;\n }\n });\n\n this._replaceSection(list, [preList, postList]);\n return [preList, postList];\n }\n\n /**\n * @return Array of [prev, mid, next] lists. `prev` and `next` can\n * be blank, depending on the position of `item`. `mid` will always\n * be a 1-item list containing `item`. `prev` and `next` will be\n * removed in the before_complete queue if they are blank\n * (and still attached).\n *\n * @private\n */\n }, {\n key: '_splitListAtItem',\n value: function _splitListAtItem(list, item) {\n var _this14 = this;\n\n var next = list;\n var prev = this.builder.createListSection(next.tagName);\n var mid = this.builder.createListSection(next.tagName);\n\n var addToPrev = true;\n // must turn the LinkedList into an array so that we can remove items\n // as we iterate through it\n var items = next.items.toArray();\n items.forEach(function (i) {\n var listToAppend = undefined;\n if (i === item) {\n addToPrev = false;\n listToAppend = mid;\n } else if (addToPrev) {\n listToAppend = prev;\n } else {\n return; // break after iterating prev and mid parts of the list\n }\n listToAppend.join(i);\n _this14.removeSection(i);\n });\n var found = !addToPrev;\n (0, _utilsAssert['default'])('Cannot split list at item that is not present in the list', found);\n\n var collection = this.editor.post.sections;\n this.insertSectionBefore(collection, mid, next);\n this.insertSectionBefore(collection, prev, mid);\n\n // Remove possibly blank prev/next lists\n this.addCallback(CALLBACK_QUEUES.BEFORE_COMPLETE, function () {\n [prev, next].forEach(function (_list) {\n var isAttached = !!_list.parent;\n if (_list.isBlank && isAttached) {\n _this14.removeSection(_list);\n }\n });\n });\n\n return [prev, mid, next];\n }\n }, {\n key: '_changeSectionFromListItem',\n value: function _changeSectionFromListItem(section, newTagName) {\n (0, _utilsAssert['default'])('Must pass list item to `_changeSectionFromListItem`', section.isListItem);\n\n var listSection = section.parent;\n var markupSection = this.builder.createMarkupSection(newTagName);\n markupSection.join(section);\n\n var _splitListAtItem2 = this._splitListAtItem(listSection, section);\n\n var _splitListAtItem22 = _slicedToArray(_splitListAtItem2, 3);\n\n var prev = _splitListAtItem22[0];\n var mid = _splitListAtItem22[1];\n var next = _splitListAtItem22[2];\n // jshint ignore:line\n this.replaceSection(mid, markupSection);\n return markupSection;\n }\n }, {\n key: '_changeSectionToListItem',\n value: function _changeSectionToListItem(section, newTagName) {\n var isAlreadyCorrectListItem = section.isListItem && section.parent.tagName === newTagName;\n\n if (isAlreadyCorrectListItem) {\n return section;\n }\n\n var listSection = this.builder.createListSection(newTagName);\n listSection.join(section);\n\n var sectionToReplace = undefined;\n if (section.isListItem) {\n var _splitListAtItem3 = this._splitListAtItem(section.parent, section);\n\n var _splitListAtItem32 = _slicedToArray(_splitListAtItem3, 3);\n\n var prev = _splitListAtItem32[0];\n var mid = _splitListAtItem32[1];\n var next = _splitListAtItem32[2];\n // jshint ignore:line\n sectionToReplace = mid;\n } else {\n sectionToReplace = section;\n }\n this.replaceSection(sectionToReplace, listSection);\n return listSection;\n }\n\n /**\n * Insert a given section before another one, updating the post abstract\n * and the rendered UI.\n *\n * Usage:\n * ```\n * let markerRange = editor.range;\n * let sectionWithCursor = markerRange.headMarker.section;\n * let section = editor.builder.createCardSection('my-image');\n * let collection = sectionWithCursor.parent.sections;\n * editor.run((postEditor) => {\n * postEditor.insertSectionBefore(collection, section, sectionWithCursor);\n * });\n * ```\n * @param {LinkedList} collection The list of sections to insert into\n * @param {Object} section The new section\n * @param {Object} beforeSection Optional The section \"before\" is relative to,\n * if falsy the new section will be appended to the collection\n * @public\n */\n }, {\n key: 'insertSectionBefore',\n value: function insertSectionBefore(collection, section, beforeSection) {\n collection.insertBefore(section, beforeSection);\n this._markDirty(section.parent);\n }\n\n /**\n * Insert the given section after the current active section, or, if no\n * section is active, at the end of the document.\n * @param {Section} section\n * @public\n */\n }, {\n key: 'insertSection',\n value: function insertSection(section) {\n var activeSection = this.editor.activeSection;\n var nextSection = activeSection && activeSection.next;\n\n var collection = this.editor.post.sections;\n this.insertSectionBefore(collection, section, nextSection);\n }\n\n /**\n * Insert the given section at the end of the document.\n * @param {Section} section\n * @public\n */\n }, {\n key: 'insertSectionAtEnd',\n value: function insertSectionAtEnd(section) {\n this.insertSectionBefore(this.editor.post.sections, section, null);\n }\n\n /**\n * Insert the `post` at the given position in the editor's post.\n * @param {Position} position\n * @param {Post} post\n * @private\n */\n }, {\n key: 'insertPost',\n value: function insertPost(position, newPost) {\n var post = this.editor.post;\n var inserter = new _postPostInserter['default'](this, post);\n var nextPosition = inserter.insert(position, newPost);\n return nextPosition;\n }\n\n /**\n * Remove a given section from the post abstract and the rendered UI.\n *\n * Usage:\n * ```\n * let { range } = editor;\n * let sectionWithCursor = range.head.section;\n * editor.run((postEditor) => {\n * postEditor.removeSection(sectionWithCursor);\n * });\n * ```\n * @param {Object} section The section to remove\n * @public\n */\n }, {\n key: 'removeSection',\n value: function removeSection(section) {\n var parent = section.parent;\n this._scheduleForRemoval(section);\n parent.sections.remove(section);\n\n if (parent.isListSection) {\n this._scheduleListRemovalIfEmpty(parent);\n }\n }\n }, {\n key: 'removeAllSections',\n value: function removeAllSections() {\n var _this15 = this;\n\n this.editor.post.sections.toArray().forEach(function (section) {\n _this15.removeSection(section);\n });\n }\n }, {\n key: 'migrateSectionsFromPost',\n value: function migrateSectionsFromPost(post) {\n var _this16 = this;\n\n post.sections.toArray().forEach(function (section) {\n post.sections.remove(section);\n _this16.insertSectionBefore(_this16.editor.post.sections, section, null);\n });\n }\n }, {\n key: '_scheduleListRemovalIfEmpty',\n value: function _scheduleListRemovalIfEmpty(listSection) {\n var _this17 = this;\n\n this.addCallback(CALLBACK_QUEUES.BEFORE_COMPLETE, function () {\n // if the list is attached and blank after we do other rendering stuff,\n // remove it\n var isAttached = !!listSection.parent;\n if (isAttached && listSection.isBlank) {\n _this17.removeSection(listSection);\n }\n });\n }\n\n /**\n * A method for adding work the deferred queue\n *\n * @param {Function} callback to run during completion\n * @param {Boolean} [once=false] Whether to only schedule the callback once.\n * @public\n */\n }, {\n key: 'schedule',\n value: function schedule(callback) {\n var once = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];\n\n (0, _utilsAssert['default'])('Work can only be scheduled before a post edit has completed', !this._didComplete);\n if (once) {\n this.addCallbackOnce(CALLBACK_QUEUES.COMPLETE, callback);\n } else {\n this.addCallback(CALLBACK_QUEUES.COMPLETE, callback);\n }\n }\n\n /**\n * A method for adding work the deferred queue. The callback will only\n * be added to the queue once, even if `scheduleOnce` is called multiple times.\n * The function cannot be an anonymous function.\n *\n * @param {Function} callback to run during completion\n * @public\n */\n }, {\n key: 'scheduleOnce',\n value: function scheduleOnce(callback) {\n this.schedule(callback, true);\n }\n\n /**\n * Add a rerender job to the queue\n *\n * @public\n */\n }, {\n key: 'scheduleRerender',\n value: function scheduleRerender() {\n this.scheduleOnce(this._rerender);\n }\n\n /**\n * Schedule a notification that the post has been changed.\n * The notification will result in the editor firing its `postDidChange`\n * hook after the postEditor completes its work (at the end of {@link Editor#run}).\n *\n * @public\n */\n }, {\n key: 'scheduleDidUpdate',\n value: function scheduleDidUpdate() {\n this.scheduleOnce(this._postDidChange);\n }\n }, {\n key: 'scheduleAfterRender',\n value: function scheduleAfterRender(callback) {\n var once = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];\n\n if (once) {\n this.addCallbackOnce(CALLBACK_QUEUES.AFTER_COMPLETE, callback);\n } else {\n this.addCallback(CALLBACK_QUEUES.AFTER_COMPLETE, callback);\n }\n }\n\n /**\n * Flush any work on the queue. {@link Editor#run} calls this method; it\n * should not be called directly.\n *\n * @private\n */\n }, {\n key: 'complete',\n value: function complete() {\n (0, _utilsAssert['default'])('Post editing can only be completed once', !this._didComplete);\n\n this.runCallbacks(CALLBACK_QUEUES.BEFORE_COMPLETE);\n this._didComplete = true;\n this.runCallbacks(CALLBACK_QUEUES.COMPLETE);\n this.runCallbacks(CALLBACK_QUEUES.AFTER_COMPLETE);\n }\n }, {\n key: 'undoLastChange',\n value: function undoLastChange() {\n this.editor._editHistory.stepBackward(this);\n }\n }, {\n key: 'redoLastChange',\n value: function redoLastChange() {\n this.editor._editHistory.stepForward(this);\n }\n }, {\n key: 'cancelSnapshot',\n value: function cancelSnapshot() {\n this._shouldCancelSnapshot = true;\n }\n }]);\n\n return PostEditor;\n})();\n\nexports['default'] = PostEditor;","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsAssert = require('../../utils/assert');\n\nvar _modelsTypes = require('../../models/types');\n\nvar MARKERABLE = 'markerable',\n NESTED_MARKERABLE = 'nested_markerable',\n NON_MARKERABLE = 'non_markerable';\n\nvar Visitor = (function () {\n function Visitor(inserter, cursorPosition) {\n _classCallCheck(this, Visitor);\n\n var postEditor = inserter.postEditor;\n var post = inserter.post;\n\n this.postEditor = postEditor;\n this._post = post;\n this.cursorPosition = cursorPosition;\n this.builder = this.postEditor.builder;\n\n this._hasInsertedFirstLeafSection = false;\n }\n\n _createClass(Visitor, [{\n key: 'visit',\n value: function visit(node) {\n var method = node.type;\n (0, _utilsAssert['default'])('Cannot visit node of type ' + node.type, !!this[method]);\n this[method](node);\n }\n }, {\n key: '_canMergeSection',\n value: function _canMergeSection(section) {\n if (this._hasInsertedFirstLeafSection) {\n return false;\n } else {\n return this._isMarkerable && section.isMarkerable;\n }\n }\n }, {\n key: _modelsTypes.POST_TYPE,\n value: function value(node) {\n var _this = this;\n\n if (this.cursorSection.isBlank && !this._isNested) {\n // replace blank section with entire post\n var newSections = node.sections.map(function (s) {\n return s.clone();\n });\n this._replaceSection(this.cursorSection, newSections);\n } else {\n node.sections.forEach(function (section) {\n return _this.visit(section);\n });\n }\n }\n }, {\n key: _modelsTypes.MARKUP_SECTION_TYPE,\n value: function value(node) {\n this[MARKERABLE](node);\n }\n }, {\n key: _modelsTypes.LIST_SECTION_TYPE,\n value: function value(node) {\n var _this2 = this;\n\n var hasNext = !!node.next;\n node.items.forEach(function (item) {\n return _this2.visit(item);\n });\n\n if (this._isNested && hasNext) {\n this._breakNestedAtCursor();\n }\n }\n }, {\n key: _modelsTypes.LIST_ITEM_TYPE,\n value: function value(node) {\n this[NESTED_MARKERABLE](node);\n }\n }, {\n key: _modelsTypes.CARD_TYPE,\n value: function value(node) {\n this[NON_MARKERABLE](node);\n }\n }, {\n key: _modelsTypes.IMAGE_SECTION_TYPE,\n value: function value(node) {\n this[NON_MARKERABLE](node);\n }\n }, {\n key: NON_MARKERABLE,\n value: function value(section) {\n if (this._isNested) {\n this._breakNestedAtCursor();\n } else if (!this.cursorSection.isBlank) {\n this._breakAtCursor();\n }\n\n this._insertLeafSection(section);\n }\n }, {\n key: MARKERABLE,\n value: function value(section) {\n if (this._canMergeSection(section)) {\n this._mergeSection(section);\n } else if (this._isNested && this._isMarkerable) {\n // If we are attaching a markerable section to a list item,\n // insert a linebreak then merge the section onto the resulting blank list item\n this._breakAtCursor();\n\n // Advance the cursor to the head of the blank list item\n var nextPosition = this.cursorSection.next.headPosition();\n this.cursorPosition = nextPosition;\n\n // Merge this section onto the list item\n this._mergeSection(section);\n } else {\n this._breakAtCursor();\n this._insertLeafSection(section);\n }\n }\n }, {\n key: NESTED_MARKERABLE,\n value: function value(section) {\n if (this._canMergeSection(section)) {\n this._mergeSection(section);\n return;\n }\n\n section = this._isNested ? section : this._wrapNestedSection(section);\n this._breakAtCursor();\n this._insertLeafSection(section);\n }\n\n // break out of a nested cursor position\n }, {\n key: '_breakNestedAtCursor',\n value: function _breakNestedAtCursor() {\n (0, _utilsAssert['default'])('Cannot call _breakNestedAtCursor if not nested', this._isNested);\n\n var parent = this.cursorSection.parent;\n var cursorAtEndOfList = this.cursorPosition.isEqual(parent.tailPosition());\n\n if (cursorAtEndOfList) {\n var blank = this.builder.createMarkupSection();\n this._insertSectionAfter(blank, parent);\n } else {\n var _breakListAtCursor2 = this._breakListAtCursor();\n\n var _breakListAtCursor22 = _slicedToArray(_breakListAtCursor2, 3);\n\n var pre = _breakListAtCursor22[0];\n var blank = _breakListAtCursor22[1];\n var post = _breakListAtCursor22[2];\n // jshint ignore:line\n this.cursorPosition = blank.tailPosition();\n }\n }\n }, {\n key: '_breakListAtCursor',\n value: function _breakListAtCursor() {\n (0, _utilsAssert['default'])('Cannot _splitParentSection if cursor position is not nested', this._isNested);\n\n var list = this.cursorSection.parent,\n position = this.cursorPosition,\n blank = this.builder.createMarkupSection();\n\n var _postEditor$_splitListAtPosition = this.postEditor._splitListAtPosition(list, position);\n\n var _postEditor$_splitListAtPosition2 = _slicedToArray(_postEditor$_splitListAtPosition, 2);\n\n var pre = _postEditor$_splitListAtPosition2[0];\n var post = _postEditor$_splitListAtPosition2[1];\n\n var collection = this._post.sections,\n reference = post;\n this.postEditor.insertSectionBefore(collection, blank, reference);\n return [pre, blank, post];\n }\n }, {\n key: '_wrapNestedSection',\n value: function _wrapNestedSection(section) {\n var tagName = section.parent.tagName;\n var parent = this.builder.createListSection(tagName);\n parent.items.append(section.clone());\n return parent;\n }\n }, {\n key: '_mergeSection',\n value: function _mergeSection(section) {\n (0, _utilsAssert['default'])('Can only merge markerable sections', this._isMarkerable && section.isMarkerable);\n this._hasInsertedFirstLeafSection = true;\n\n var markers = section.markers.map(function (m) {\n return m.clone();\n });\n var position = this.postEditor.insertMarkers(this.cursorPosition, markers);\n\n this.cursorPosition = position;\n }\n\n // Can be called to add a line break when in a nested section or a parent\n // section.\n }, {\n key: '_breakAtCursor',\n value: function _breakAtCursor() {\n if (this.cursorSection.isBlank) {\n return;\n } else if (this._isMarkerable) {\n this._breakMarkerableAtCursor();\n } else {\n this._breakNonMarkerableAtCursor();\n }\n }\n\n // Inserts a blank section before/after the cursor,\n // depending on cursor position.\n }, {\n key: '_breakNonMarkerableAtCursor',\n value: function _breakNonMarkerableAtCursor() {\n var collection = this._post.sections,\n blank = this.builder.createMarkupSection(),\n reference = this.cursorPosition.isHead() ? this.cursorSection : this.cursorSection.next;\n this.postEditor.insertSectionBefore(collection, blank, reference);\n this.cursorPosition = blank.tailPosition();\n }\n }, {\n key: '_breakMarkerableAtCursor',\n value: function _breakMarkerableAtCursor() {\n var _postEditor$splitSection = // jshint ignore:line\n this.postEditor.splitSection(this.cursorPosition);\n\n var _postEditor$splitSection2 = _slicedToArray(_postEditor$splitSection, 2);\n\n var pre = _postEditor$splitSection2[0];\n var post = _postEditor$splitSection2[1];\n\n this.cursorPosition = pre.tailPosition();\n }\n }, {\n key: '_replaceSection',\n value: function _replaceSection(section, newSections) {\n var _this3 = this;\n\n (0, _utilsAssert['default'])('Cannot replace section that does not have parent.sections', section.parent && section.parent.sections);\n (0, _utilsAssert['default'])('Must pass enumerable to _replaceSection', !!newSections.forEach);\n\n var collection = section.parent.sections;\n var reference = section.next;\n this.postEditor.removeSection(section);\n newSections.forEach(function (section) {\n _this3.postEditor.insertSectionBefore(collection, section, reference);\n });\n var lastSection = newSections[newSections.length - 1];\n\n this.cursorPosition = lastSection.tailPosition();\n }\n }, {\n key: '_insertSectionBefore',\n value: function _insertSectionBefore(section, reference) {\n var collection = this.cursorSection.parent.sections;\n this.postEditor.insertSectionBefore(collection, section, reference);\n\n this.cursorPosition = section.tailPosition();\n }\n\n // Insert a section after the parent section.\n // E.g., add a markup section after a list section\n }, {\n key: '_insertSectionAfter',\n value: function _insertSectionAfter(section, parent) {\n (0, _utilsAssert['default'])('Cannot _insertSectionAfter nested section', !parent.isNested);\n var reference = parent.next;\n var collection = this._post.sections;\n this.postEditor.insertSectionBefore(collection, section, reference);\n this.cursorPosition = section.tailPosition();\n }\n }, {\n key: '_insertLeafSection',\n value: function _insertLeafSection(section) {\n (0, _utilsAssert['default'])('Can only _insertLeafSection when cursor is at end of section', this.cursorPosition.isTail());\n\n this._hasInsertedFirstLeafSection = true;\n section = section.clone();\n\n if (this.cursorSection.isBlank) {\n (0, _utilsAssert['default'])('Cannot insert leaf non-markerable section when cursor is nested', !(section.isMarkerable && this._isNested));\n this._replaceSection(this.cursorSection, [section]);\n } else if (this.cursorSection.next && this.cursorSection.next.isBlank) {\n this._replaceSection(this.cursorSection.next, [section]);\n } else {\n var reference = this.cursorSection.next;\n this._insertSectionBefore(section, reference);\n }\n }\n }, {\n key: 'cursorPosition',\n get: function get() {\n return this._cursorPosition;\n },\n set: function set(position) {\n this._cursorPosition = position;\n this.postEditor.setRange(position);\n }\n }, {\n key: '_isMarkerable',\n get: function get() {\n return this.cursorSection.isMarkerable;\n }\n }, {\n key: 'cursorSection',\n get: function get() {\n return this.cursorPosition.section;\n }\n }, {\n key: 'cursorOffset',\n get: function get() {\n return this.cursorPosition.offset;\n }\n }, {\n key: '_isNested',\n get: function get() {\n return this.cursorSection.isNested;\n }\n }]);\n\n return Visitor;\n})();\n\nvar Inserter = (function () {\n function Inserter(postEditor, post) {\n _classCallCheck(this, Inserter);\n\n this.postEditor = postEditor;\n this.post = post;\n }\n\n _createClass(Inserter, [{\n key: 'insert',\n value: function insert(cursorPosition, newPost) {\n var visitor = new Visitor(this, cursorPosition);\n visitor.visit(newPost);\n return visitor.cursorPosition;\n }\n }]);\n\n return Inserter;\n})();\n\nexports['default'] = Inserter;","\"use strict\";\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar instance = undefined;\n\nvar SelectionChangeObserver = (function () {\n function SelectionChangeObserver() {\n _classCallCheck(this, SelectionChangeObserver);\n\n this.started = false;\n this.listeners = [];\n this.selection = {};\n }\n\n _createClass(SelectionChangeObserver, [{\n key: \"addListener\",\n value: function addListener(listener) {\n if (this.listeners.indexOf(listener) === -1) {\n this.listeners.push(listener);\n this.start();\n }\n }\n }, {\n key: \"removeListener\",\n value: function removeListener(listener) {\n var index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n if (this.listeners.length === 0) {\n this.stop();\n }\n }\n }\n }, {\n key: \"start\",\n value: function start() {\n if (this.started) {\n return;\n }\n this.started = true;\n\n this.poll();\n }\n }, {\n key: \"stop\",\n value: function stop() {\n this.started = false;\n this.selection = {};\n }\n }, {\n key: \"notifyListeners\",\n value: function notifyListeners() /* newSelection, prevSelection */{\n var _arguments = arguments;\n\n this.listeners.forEach(function (listener) {\n listener.selectionDidChange.apply(listener, _arguments);\n });\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.stop();\n this.listeners = [];\n }\n }, {\n key: \"getSelection\",\n value: function getSelection() {\n var selection = window.getSelection();\n var anchorNode = selection.anchorNode;\n var focusNode = selection.focusNode;\n var anchorOffset = selection.anchorOffset;\n var focusOffset = selection.focusOffset;\n\n return { anchorNode: anchorNode, focusNode: focusNode, anchorOffset: anchorOffset, focusOffset: focusOffset };\n }\n }, {\n key: \"poll\",\n value: function poll() {\n var _this = this;\n\n if (this.started) {\n this.update();\n this.runNext(function () {\n return _this.poll();\n });\n }\n }\n }, {\n key: \"runNext\",\n value: function runNext(fn) {\n window.requestAnimationFrame(fn);\n }\n }, {\n key: \"update\",\n value: function update() {\n var prevSelection = this.selection;\n var curSelection = this.getSelection();\n if (!this.selectionIsEqual(prevSelection, curSelection)) {\n this.selection = curSelection;\n this.notifyListeners(curSelection, prevSelection);\n }\n }\n }, {\n key: \"selectionIsEqual\",\n value: function selectionIsEqual(s1, s2) {\n return s1.anchorNode === s2.anchorNode && s1.anchorOffset === s2.anchorOffset && s1.focusNode === s2.focusNode && s1.focusOffset === s2.focusOffset;\n }\n }], [{\n key: \"getInstance\",\n value: function getInstance() {\n if (!instance) {\n instance = new SelectionChangeObserver();\n }\n return instance;\n }\n }, {\n key: \"addListener\",\n value: function addListener(listener) {\n SelectionChangeObserver.getInstance().addListener(listener);\n }\n }, {\n key: \"removeListener\",\n value: function removeListener(listener) {\n SelectionChangeObserver.getInstance().removeListener(listener);\n }\n }]);\n\n return SelectionChangeObserver;\n})();\n\nexports[\"default\"] = SelectionChangeObserver;","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _editorSelectionChangeObserver = require('../editor/selection-change-observer');\n\nvar SelectionManager = (function () {\n function SelectionManager(editor, callback) {\n _classCallCheck(this, SelectionManager);\n\n this.editor = editor;\n this.callback = callback;\n this.started = false;\n }\n\n _createClass(SelectionManager, [{\n key: 'start',\n value: function start() {\n if (this.started) {\n return;\n }\n\n _editorSelectionChangeObserver['default'].addListener(this);\n this.started = true;\n }\n }, {\n key: 'stop',\n value: function stop() {\n this.started = false;\n _editorSelectionChangeObserver['default'].removeListener(this);\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.stop();\n }\n }, {\n key: 'selectionDidChange',\n value: function selectionDidChange() {\n if (this.started) {\n this.callback.apply(this, arguments);\n }\n }\n }]);\n\n return SelectionManager;\n})();\n\nexports['default'] = SelectionManager;","'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsStringUtils = require('../utils/string-utils');\n\nvar _utilsAssert = require('../utils/assert');\n\nvar TextInputHandler = (function () {\n function TextInputHandler(editor) {\n _classCallCheck(this, TextInputHandler);\n\n this.editor = editor;\n this._handlers = [];\n }\n\n _createClass(TextInputHandler, [{\n key: 'register',\n value: function register(handler) {\n (0, _utilsAssert['default'])('Input Handler is not valid', this._validateHandler(handler));\n this._handlers.push(handler);\n }\n }, {\n key: 'handle',\n value: function handle(string) {\n var editor = this.editor;\n\n editor.insertText(string);\n\n var matchedHandler = this._findHandler();\n if (matchedHandler) {\n var _matchedHandler = _slicedToArray(matchedHandler, 2);\n\n var handler = _matchedHandler[0];\n var matches = _matchedHandler[1];\n\n handler.run(editor, matches);\n }\n }\n }, {\n key: '_findHandler',\n value: function _findHandler() {\n var _editor$range = this.editor.range;\n var head = _editor$range.head;\n var section = _editor$range.head.section;\n\n var preText = section.textUntil(head);\n\n for (var i = 0; i < this._handlers.length; i++) {\n var handler = this._handlers[i];\n var text = handler.text;\n var match = handler.match;\n\n if (text && (0, _utilsStringUtils.endsWith)(preText, text)) {\n return [handler, [text]];\n } else if (match && match.test(preText)) {\n return [handler, match.exec(preText)];\n }\n }\n }\n }, {\n key: '_validateHandler',\n value: function _validateHandler(handler) {\n return !!handler.run && ( // has `run`\n !!handler.text || !!handler.match) && // and `text` or `match`\n !(!!handler.text && !!handler.match); // not both `text` and `match`\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this._handlers = [];\n }\n }]);\n\n return TextInputHandler;\n})();\n\nexports['default'] = TextInputHandler;","/**\n * Convert section at the editor's cursor position into a list.\n * Does nothing if the cursor position is not at the start of the section,\n * or if the section is already a list item.\n *\n * @param {Editor} editor\n * @param {String} listTagName (\"ul\" or \"ol\")\n * @public\n */\n'use strict';\n\nexports.replaceWithListSection = replaceWithListSection;\nexports.replaceWithHeaderSection = replaceWithHeaderSection;\n\nfunction replaceWithListSection(editor, listTagName) {\n var _editor$range = editor.range;\n var head = _editor$range.head;\n var section = _editor$range.head.section;\n\n // Skip if cursor is not at end of section\n if (!head.isTail()) {\n return;\n }\n\n if (section.isListItem) {\n return;\n }\n\n editor.run(function (postEditor) {\n var builder = postEditor.builder;\n\n var item = builder.createListItem();\n var listSection = builder.createListSection(listTagName, [item]);\n\n postEditor.replaceSection(section, listSection);\n postEditor.setRange(listSection.headPosition());\n });\n}\n\n/**\n * Convert section at the editor's cursor position into a header section.\n * Does nothing if the cursor position is not at the start of the section.\n *\n * @param {Editor} editor\n * @param {String} headingTagName (\"h1\",\"h2\",\"h3\")\n * @public\n */\n\nfunction replaceWithHeaderSection(editor, headingTagName) {\n var _editor$range2 = editor.range;\n var head = _editor$range2.head;\n var section = _editor$range2.head.section;\n\n // Skip if cursor is not at end of section\n if (!head.isTail()) {\n return;\n }\n\n editor.run(function (postEditor) {\n var builder = postEditor.builder;\n\n var newSection = builder.createMarkupSection(headingTagName);\n postEditor.replaceSection(section, newSection);\n postEditor.setRange(newSection.headPosition());\n });\n}\n\nvar DEFAULT_TEXT_INPUT_HANDLERS = [{\n // \"* \" -> ul\n match: /^\\* $/,\n run: function run(editor) {\n replaceWithListSection(editor, 'ul');\n }\n}, {\n // \"1\" -> ol, \"1.\" -> ol\n match: /^1\\.? $/,\n run: function run(editor) {\n replaceWithListSection(editor, 'ol');\n }\n}, {\n // \"# \" -> h1, \"## \" -> h2, \"### \" -> h3\n match: /^(#{1,3}) $/,\n run: function run(editor, matches) {\n var capture = matches[1];\n var headingTag = 'h' + capture.length;\n replaceWithHeaderSection(editor, headingTag);\n }\n}];\nexports.DEFAULT_TEXT_INPUT_HANDLERS = DEFAULT_TEXT_INPUT_HANDLERS;"],"names":["NBSP","EMSP","prepareText","text","replace","createTextNode","dom","normalizeTagName","tagName","toLowerCase","name","type","render","payload","env","img","createElement","src","MARKUP_SECTION_TYPE","IMAGE_SECTION_TYPE","LIST_SECTION_TYPE","CARD_SECTION_TYPE","MARKUP_SECTION_TAG_NAMES","map","MARKUP_SECTION_ELEMENT_NAMES","LIST_SECTION_TAG_NAMES","MARKUP_TYPES","contains","array","item","indexOf","isValidSectionTagName","sectionType","Error","isMarkupSectionElementName","isValidMarkerType","includes","detectValue","i","length","value","PROTOCOL_REGEXP","badProtocols","getProtocol","url","matches","match","protocol","split","sanitizeHref","reduceAttributes","attributes","obj","key","val","VALID_ATTRIBUTES","_isValidAttribute","attr","handleMarkupSectionAttribute","element","attributeKey","attributeValue","setAttribute","defaultSectionElementRenderer","attrsObj","Object","keys","forEach","k","sanitizeAttribute","attrName","attrValue","defaultMarkupElementRenderer","MOBILEDOC_VERSION","IMAGE_SECTION_TAG_NAME","validateVersion","version","Renderer","constructor","mobiledoc","options","cards","cardOptions","unknownCardHandler","markupElementRenderer","sectionElementRenderer","sections","sectionData","markerTypes","this","root","createDocumentFragment","_defaultUnknownCardHandler","_renderCallbacks","_teardownCallbacks","_renderedChildNodes","section","rendered","renderSection","appendChild","node","firstChild","push","nextSibling","result","teardown","parentNode","removeChild","renderMarkupSection","renderImageSection","renderListSection","renderCardSection","renderMarkersOnElement","markers","elements","currentElement","pushElement","openedElement","l","marker","openTypes","closeCount","j","m","markerType","attrs","renderMarkupElement","pop","renderer","markupElementRendererFor","__default__","renderListItem","listItems","li","findCard","_createUnknownCard","_createCardArgument","card","isInEditor","didRender","callback","_registerRenderCallback","onTeardown","_registerTeardownCallback","cardArg","_validateCardRender","cardName","sectionElementRendererFor","MARKUP_MARKER_TYPE","ATOM_MARKER_TYPE","MOBILEDOC_VERSION_0_3_0","MOBILEDOC_VERSION_0_3_1","MOBILEDOC_VERSION_0_3_2","state","atoms","unknownAtomHandler","atomTypes","cardTypes","markups","_defaultUnknownAtomHandler","Array","prototype","slice","call","childNodes","_renderAtom","_findCardByIndex","index","cardType","findAtom","_createUnknownAtom","_createAtomArgument","atom","_validateAtomRender","atomName","_findAtomByIndex","atomType","atomArg","validateCards","isArray","validateAtoms","markupSanitizer","window","document","undefined","_utilsRenderType","exports","_ref","registerGlobal","_rendererFactory","MobiledocHTMLRenderer","RENDER_TYPE","_createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","_classCallCheck","instance","TypeError","_renderers02","_renderers03","RendererFactory","arguments","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","_s","_i","Symbol","iterator","next","done","err","_utilsDom","_cardsImage","_utilsSectionTypes","_utilsTagNames","createElementFromMarkerType","_ref2","propName","propValue","_sectionData","hasOwnProperty","_this","toString","_section","_ref3","_this2","_ref32","items","_renderMarkersOnElement","_ref4","_ref42","_ref5","_ref52","cardWrapper","_createCardElement","_this3","_ref6","_ref62","lowerCaseTagName","_marker","_markerType","get","_ref7","_utilsMarkerTypes","_cardType","_findCardByIndex2","_this4","_atomType","_findAtomByIndex2","_ref8","VOID_TAGS","Element","isVoid","html","addHTMLSpaces","TextNode","child","_sectionTypes","_dom","_utilsPlaceholderImageSrc","_parsersMobiledoc","_utilsFixedQueue","findLeafSectionAtIndex","post","walkAllLeafSections","_index","Snapshot","editor","serialize","snapshotRange","_editor","range","cursor","hasCursor","isBlank","head","tail","leafSectionIndex","offset","_range","_head","_head2","headLeafSectionIndex","headOffset","_tail","_tail2","tailLeafSectionIndex","tailOffset","headSection","tailSection","toPosition","toRange","EditHistory","queueLength","_undoStack","_redoStack","_pendingSnapshot","clear","postEditor","snapshot","_restoreFromSnapshot","cancelSnapshot","builder","restoredPost","parse","removeAllSections","migrateSectionsFromPost","newRange","getRange","setRange","_utilsArrayUtils","_utilsCursorRange","EditState","defaultState","blankRange","activeMarkups","activeSections","activeSectionTagNames","prevState","_readState","prevRange","isEqual","isArrayEqual","markup","_removeActiveMarkup","_addActiveMarkup","_readActiveMarkups","_readActiveSections","s","isNested","parent","readRange","markupsInRange","splice","_viewsTooltip","_post","_utilsKey","_parsersHtml","_parsersDom","_renderersEditorDom","_modelsRenderTree","_renderersMobiledoc","_utilsMerge","_utilsDomUtils","_utilsElementUtils","_utilsCursor","_utilsCursorPosition","_modelsPostNodeBuilder","_textInputHandlers","_keyCommands","_modelsCard","_utilsAssert","_editorMutationHandler","_editorEditHistory","_editorEventManager","_editorEditState","_mobiledocHtmlRenderer","_mobiledocTextRenderer","_modelsLifecycleCallbacks","_utilsLogManager","_utilsToRange","_utilsMobiledocError","EDITOR_ELEMENT_CLASS_NAME","defaults","placeholder","spellcheck","autofocus","undoDepth","CALLBACK_QUEUES","DID_UPDATE","WILL_RENDER","DID_RENDER","WILL_DELETE","DID_DELETE","CURSOR_DID_CHANGE","DID_REPARSE","POST_DID_CHANGE","INPUT_MODE_DID_CHANGE","Editor","nodeType","_views","isEditable","_parserPlugins","parserPlugins","mergeWithOptions","DEFAULT_KEY_COMMANDS","kc","registerKeyCommand","_logManager","_parser","_renderer","loadPost","_renderTree","_editHistory","_eventManager","_mutationHandler","_editState","_callbacks","values","DEFAULT_TEXT_INPUT_HANDLERS","handler","onTextInput","hasRendered","logTypes","enableAll","enableTypes","disable","plugins","createPost","postRenderNode","renderNode","markDirty","runCallbacks","suspendObservation","clearChildNodes","enableEditing","_addTooltip","run","rerender","init","selectRange","headPosition","addView","rootElement","showForTag","rawKeyCommand","keyCommand","buildKeyCommand","validateKeyCommand","keyCommands","unshift","position","direction","unit","nextPosition","deleteAtPosition","deleteRange","DIRECTION","BACKWARD","isCollapsed","event","preventDefault","cursorSection","splitSection","message","defaultValue","prompt","offsets","setData","_postDidChange","currentRange","reparseSection","_removeDetachedSections","isDirty","filter","isAttached","scheduleForRemoval","markupTagName","detect","hasTag","matchesFn","serializePost","format","validFormats","rendererOptions","view","v","destroy","isDestroyed","_hasSelection","clearSelection","_hasFocus","blur","removeAllViews","setPlaceholder","cardSection","_setCardMode","CARD_MODES","EDIT","DISPLAY","begin","complete","_readRangeFromDOM","_shouldCancelSnapshot","storeSnapshot","addCallback","inputHandler","registerInputHandler","createMarkupSection","insertSectionBefore","createMarkup","toggleMarkupState","_inputModeDidChange","_ensureFocus","toggleMarkup","focus","_hasCollapsedSelection","activeElement","_this5","toggleSection","findKeyCommands","_insertEmptyMarkupSectionAtCursor","insertTextWithMarkup","atomText","atomPayload","createAtom","insertMarkers","_this6","cardPayload","inEditMode","createCardSection","editCard","replaceSection","collection","tailPosition","x","y","atPoint","mode","isRendered","cardNode","setInitialMode","context","eventName","_trigger","apply","_callbacks2","addCallbackOnce","_callbacks3","_builder","set","updateRange","rangeDidChange","_rangeDidChange","inputModeDidChange","_utilsParseUtils","_utilsCharacters","_editorTextInputHandler","_editorSelectionManager","_utilsBrowser","ELEMENT_EVENT_TYPES","EventManager","logger","loggerFor","_textInputHandler","_listeners","modifierKeys","shift","alt","ctrl","_selectionManager","selectionDidChange","bind","_addListener","start","register","listener","_handleEvent","addEventListener","removeEventListener","_context","_type","_removeListeners","isElementAddressable","isAddressable","selection","shouldNotify","anchorNode","fromEvent","isPrintable","handle","_updateModifiersFromKey","isDown","handleKeyCommand","isHorizontalArrowWithoutModifiersOtherThanShift","isShift","extend","move","isDelete","isMac","isWin","performDelete","isEnter","handleNewline","isTab","insertText","TAB","copy","trimTo","data","setClipboardData","targetFormat","pastedPost","parsePostFromPaste","insertPost","clientX","clientY","positionAtPoint","parsePostFromDrop","log","isShiftKey","isAltKey","isCtrlKey","_toArray","from","selectAll","gotoStartOfLine","gotoEndOfLine","deleteToEndOfSection","toggleLink","selectedText","defaultUrl","hasLink","detectMarkupInRange","showPrompt","href","str","undoLastChange","redoLastChange","modifierNamesToMask","modiferNames","defaultVal","reduce","sum","modifier","MODIFIERS","toUpperCase","characterToCode","character","upperCharacter","special","SPECIAL_KEYS","charCodeAt","_str$split$reverse","reverse","_str$split$reverse2","modifierNames","modifierMask","code","keyEvent","keyCode","_utilsSet","MUTATION","NODES_CHANGED","CHARACTER_DATA","MutationHandler","renderTree","_isObserving","_observer","MutationObserver","mutations","_handleMutations","startObserving","stopObserving","disconnect","observe","characterData","childList","subtree","_reparsePost","_reparseSections","reparsePost","nodes","_findTargetNodes","_findRenderNodeFromNode","reparsesMutationOfChildNode","_findSectionFromRenderNode","add","reparseSections","toArray","mutation","addedNodes","n","removedNodes","attachedNodes","containsNode","findRenderNodeFromElement","rn","postNode","isSection","sectionRenderNode","_findSectionRenderNodeFromNode","_postPostInserter","_utilsDeprecate","FORWARD","isListSectionTagName","BEFORE_COMPLETE","COMPLETE","AFTER_COMPLETE","PostEditor","_didComplete","_renderRange","_rerender","scheduleAfterRender","cutSection","nextSection","nextLeafSection","nextPos","tmp","removeSection","tailPos","isMarkerable","join","_markDirty","append","isCardSection","isHead","isTail","newSection","splitMarkers","removeMarker","_removeBlankMarkers","_joinSimilarMarkers","nextMarker","canJoin","_scheduleForRemoval","remove","scheduleRerender","scheduleDidUpdate","removedAdjacentToList","prev","isListSection","_joinContiguousListSections","groups","currentGroup","updatedHead","group","list","listSection","currentHead","prevPosition","isListItem","_joinListSections","baseList","nextList","_coalesceMarkers","_deleteAtPositionBackward","_deleteAtPositionForward","moveWord","splitSectionMarkerAtOffset","markersContainedByRange","_this7","edit","splitMarkerAtOffset","removed","_this8","_splitCardSection","isLastAndBlank","_parent","blank","_splitListItem2","_splitListItem","_splitListItem22","pre","splitSections","splitAtPosition","_replaceSection","surroundingSections","renderedSection","beforeSection","clone","isFirst","moveSectionBefore","isLast","_this9","prevMarker","markerBeforeOffset","insertAfter","createMarker","newSections","_this10","nextNewSection","isMarkupSection","_this11","markupsOpenAcrossRange","soFar","commonItems","indexToInsert","addMarkupAtIndex","markupOrMarkupCallback","_this12","removeMarkup","markupOrMarkupString","hasMarkup","removeMarkupFromRange","addMarkupToRange","sectionTagName","_this13","nextRange","everySectionHasTagName","walkMarkerableSections","_isSameSectionType","firstChanged","changedSection","changeSectionTagName","newTagName","_changeSectionToListItem","_changeSectionFromListItem","preItem","createListItem","postItem","currentItem","positionIsMiddle","_splitListItem3","_splitListItem32","preList","createListSection","postList","currentList","_this14","mid","addToPrev","listToAppend","found","_list","markupSection","_splitListAtItem2","_splitListAtItem","_splitListAtItem22","isAlreadyCorrectListItem","sectionToReplace","_splitListAtItem3","_splitListAtItem32","insertBefore","activeSection","newPost","inserter","insert","_scheduleListRemovalIfEmpty","_this15","_this16","_this17","once","schedule","scheduleOnce","stepBackward","stepForward","_modelsTypes","MARKERABLE","NESTED_MARKERABLE","NON_MARKERABLE","Visitor","cursorPosition","_hasInsertedFirstLeafSection","method","_isMarkerable","POST_TYPE","_isNested","visit","hasNext","_breakNestedAtCursor","LIST_ITEM_TYPE","CARD_TYPE","_breakAtCursor","_insertLeafSection","_canMergeSection","_mergeSection","_wrapNestedSection","cursorAtEndOfList","_insertSectionAfter","_breakListAtCursor2","_breakListAtCursor","_breakListAtCursor22","_postEditor$_splitListAtPosition","_splitListAtPosition","_postEditor$_splitListAtPosition2","reference","_breakMarkerableAtCursor","_breakNonMarkerableAtCursor","_postEditor$splitSection","_postEditor$splitSection2","lastSection","_insertSectionBefore","_cursorPosition","Inserter","visitor","SelectionChangeObserver","started","listeners","stop","poll","_arguments","getSelection","focusNode","anchorOffset","focusOffset","update","runNext","fn","requestAnimationFrame","prevSelection","curSelection","selectionIsEqual","notifyListeners","s1","s2","getInstance","addListener","removeListener","_editorSelectionChangeObserver","SelectionManager","_utilsStringUtils","TextInputHandler","_handlers","_validateHandler","string","matchedHandler","_findHandler","_matchedHandler","_editor$range","preText","textUntil","endsWith","test","exec","replaceWithListSection","listTagName","replaceWithHeaderSection","headingTagName","_editor$range2","capture","headingTag"],"sourceRoot":""}