rittenhop-ghost/versions/5.94.2/node_modules/mobiledoc-dom-renderer/dist/amd/mobiledoc-dom-renderer.js

1226 lines
44 KiB
JavaScript
Raw Normal View History

define('mobiledoc-dom-renderer/cards/image', ['exports', 'mobiledoc-dom-renderer/utils/render-type'], function (exports, _mobiledocDomRendererUtilsRenderType) {
'use strict';
exports['default'] = {
name: 'image',
type: _mobiledocDomRendererUtilsRenderType['default'],
render: function render(_ref) {
var payload = _ref.payload;
var dom = _ref.env.dom;
var img = dom.createElement('img');
img.src = payload.src;
return img;
}
};
});
define('mobiledoc-dom-renderer', ['exports', 'mobiledoc-dom-renderer/renderer-factory', 'mobiledoc-dom-renderer/utils/render-type'], function (exports, _mobiledocDomRendererRendererFactory, _mobiledocDomRendererUtilsRenderType) {
'use strict';
exports.registerGlobal = registerGlobal;
exports.RENDER_TYPE = _mobiledocDomRendererUtilsRenderType['default'];
function registerGlobal(window) {
window.MobiledocDOMRenderer = _mobiledocDomRendererRendererFactory['default'];
}
exports['default'] = _mobiledocDomRendererRendererFactory['default'];
});
define('mobiledoc-dom-renderer/renderer-factory', ['exports', 'mobiledoc-dom-renderer/renderers/0-2', 'mobiledoc-dom-renderer/renderers/0-3', 'mobiledoc-dom-renderer/utils/render-type'], function (exports, _mobiledocDomRendererRenderers02, _mobiledocDomRendererRenderers03, _mobiledocDomRendererUtilsRenderType) {
'use strict';
var _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; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
/**
* runtime DOM renderer
* renders a mobiledoc to DOM
*
* input: mobiledoc
* output: DOM
*/
function validateCards(cards) {
if (!Array.isArray(cards)) {
throw new Error('`cards` must be passed as an array');
}
for (var i = 0; i < cards.length; i++) {
var card = cards[i];
if (card.type !== _mobiledocDomRendererUtilsRenderType['default']) {
throw new Error('Card "' + card.name + '" must be of type "' + _mobiledocDomRendererUtilsRenderType['default'] + '", was "' + card.type + '"');
}
if (!card.render) {
throw new Error('Card "' + card.name + '" must define `render`');
}
}
}
function validateAtoms(atoms) {
if (!Array.isArray(atoms)) {
throw new Error('`atoms` must be passed as an array');
}
for (var i = 0; i < atoms.length; i++) {
var atom = atoms[i];
if (atom.type !== _mobiledocDomRendererUtilsRenderType['default']) {
throw new Error('Atom "' + atom.name + '" must be type "' + _mobiledocDomRendererUtilsRenderType['default'] + '", was "' + atom.type + '"');
}
if (!atom.render) {
throw new Error('Atom "' + atom.name + '" must define `render`');
}
}
}
var RendererFactory = (function () {
function RendererFactory() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _ref$cards = _ref.cards;
var cards = _ref$cards === undefined ? [] : _ref$cards;
var _ref$atoms = _ref.atoms;
var atoms = _ref$atoms === undefined ? [] : _ref$atoms;
var _ref$cardOptions = _ref.cardOptions;
var cardOptions = _ref$cardOptions === undefined ? {} : _ref$cardOptions;
var unknownCardHandler = _ref.unknownCardHandler;
var unknownAtomHandler = _ref.unknownAtomHandler;
var _ref$markupElementRenderer = _ref.markupElementRenderer;
var markupElementRenderer = _ref$markupElementRenderer === undefined ? {} : _ref$markupElementRenderer;
var _ref$sectionElementRenderer = _ref.sectionElementRenderer;
var sectionElementRenderer = _ref$sectionElementRenderer === undefined ? {} : _ref$sectionElementRenderer;
var dom = _ref.dom;
var _ref$markupSanitizer = _ref.markupSanitizer;
var markupSanitizer = _ref$markupSanitizer === undefined ? null : _ref$markupSanitizer;
_classCallCheck(this, RendererFactory);
validateCards(cards);
validateAtoms(atoms);
if (!dom) {
if (typeof window === 'undefined') {
throw new Error('A `dom` option must be provided to the renderer when running without window.document');
}
dom = window.document;
}
this.options = {
cards: cards,
atoms: atoms,
cardOptions: cardOptions,
unknownCardHandler: unknownCardHandler,
unknownAtomHandler: unknownAtomHandler,
markupElementRenderer: markupElementRenderer,
sectionElementRenderer: sectionElementRenderer,
dom: dom,
markupSanitizer: markupSanitizer
};
}
_createClass(RendererFactory, [{
key: 'render',
value: function render(mobiledoc) {
var version = mobiledoc.version;
switch (version) {
case _mobiledocDomRendererRenderers02.MOBILEDOC_VERSION:
case undefined:
case null:
return new _mobiledocDomRendererRenderers02['default'](mobiledoc, this.options).render();
case _mobiledocDomRendererRenderers03.MOBILEDOC_VERSION_0_3_0:
case _mobiledocDomRendererRenderers03.MOBILEDOC_VERSION_0_3_1:
case _mobiledocDomRendererRenderers03.MOBILEDOC_VERSION_0_3_2:
return new _mobiledocDomRendererRenderers03['default'](mobiledoc, this.options).render();
default:
throw new Error('Unexpected Mobiledoc version "' + version + '"');
}
}
}]);
return RendererFactory;
})();
exports['default'] = RendererFactory;
});
define('mobiledoc-dom-renderer/renderers/0-2', ['exports', 'mobiledoc-dom-renderer/utils/dom', 'mobiledoc-dom-renderer/cards/image', 'mobiledoc-dom-renderer/utils/render-type', 'mobiledoc-dom-renderer/utils/section-types', 'mobiledoc-dom-renderer/utils/tag-names', 'mobiledoc-dom-renderer/utils/sanitization-utils', 'mobiledoc-dom-renderer/utils/render-utils'], function (exports, _mobiledocDomRendererUtilsDom, _mobiledocDomRendererCardsImage, _mobiledocDomRendererUtilsRenderType, _mobiledocDomRendererUtilsSectionTypes, _mobiledocDomRendererUtilsTagNames, _mobiledocDomRendererUtilsSanitizationUtils, _mobiledocDomRendererUtilsRenderUtils) {
'use strict';
var _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'); } }; })();
var _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; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var MOBILEDOC_VERSION = '0.2.0';
exports.MOBILEDOC_VERSION = MOBILEDOC_VERSION;
var IMAGE_SECTION_TAG_NAME = 'img';
function validateVersion(version) {
if (version !== MOBILEDOC_VERSION) {
throw new Error('Unexpected Mobiledoc version "' + version + '"');
}
}
var Renderer = (function () {
function Renderer(mobiledoc, options) {
var _this = this;
_classCallCheck(this, Renderer);
var cards = options.cards;
var cardOptions = options.cardOptions;
var unknownCardHandler = options.unknownCardHandler;
var markupElementRenderer = options.markupElementRenderer;
var sectionElementRenderer = options.sectionElementRenderer;
var dom = options.dom;
var version = mobiledoc.version;
var sectionData = mobiledoc.sections;
validateVersion(version);
var _sectionData = _slicedToArray(sectionData, 2);
var markerTypes = _sectionData[0];
var sections = _sectionData[1];
this.dom = dom;
this.root = dom.createDocumentFragment();
this.markerTypes = markerTypes;
this.sections = sections;
this.cards = cards;
this.cardOptions = cardOptions;
this.unknownCardHandler = unknownCardHandler || this._defaultUnknownCardHandler;
this.sectionElementRenderer = {
'__default__': _mobiledocDomRendererUtilsRenderUtils.defaultSectionElementRenderer
};
Object.keys(sectionElementRenderer).forEach(function (key) {
_this.sectionElementRenderer[key.toLowerCase()] = sectionElementRenderer[key];
});
this.markupElementRenderer = {
'__default__': _mobiledocDomRendererUtilsRenderUtils.defaultMarkupElementRenderer
};
Object.keys(markupElementRenderer).forEach(function (key) {
_this.markupElementRenderer[key.toLowerCase()] = markupElementRenderer[key];
});
this._renderCallbacks = [];
this._teardownCallbacks = [];
this._renderedChildNodes = [];
}
_createClass(Renderer, [{
key: 'render',
value: function render() {
var _this2 = this;
this.sections.forEach(function (section) {
var rendered = _this2.renderSection(section);
if (rendered) {
_this2.root.appendChild(rendered);
}
});
for (var i = 0; i < this._renderCallbacks.length; i++) {
this._renderCallbacks[i]();
}
// maintain a reference to child nodes so they can be cleaned up later by teardown
this._renderedChildNodes = [];
var node = this.root.firstChild;
while (node) {
this._renderedChildNodes.push(node);
node = node.nextSibling;
}
return { result: this.root, teardown: function teardown() {
return _this2.teardown();
} };
}
}, {
key: 'teardown',
value: function teardown() {
for (var i = 0; i < this._teardownCallbacks.length; i++) {
this._teardownCallbacks[i]();
}
for (var i = 0; i < this._renderedChildNodes.length; i++) {
var node = this._renderedChildNodes[i];
if (node.parentNode) {
node.parentNode.removeChild(node);
}
}
}
}, {
key: 'renderSection',
value: function renderSection(section) {
var _section = _slicedToArray(section, 1);
var type = _section[0];
switch (type) {
case _mobiledocDomRendererUtilsSectionTypes.MARKUP_SECTION_TYPE:
return this.renderMarkupSection(section);
case _mobiledocDomRendererUtilsSectionTypes.IMAGE_SECTION_TYPE:
return this.renderImageSection(section);
case _mobiledocDomRendererUtilsSectionTypes.LIST_SECTION_TYPE:
return this.renderListSection(section);
case _mobiledocDomRendererUtilsSectionTypes.CARD_SECTION_TYPE:
return this.renderCardSection(section);
default:
throw new Error('Cannot render mobiledoc section of type "' + type + '"');
}
}
}, {
key: 'renderMarkersOnElement',
value: function renderMarkersOnElement(element, markers) {
var elements = [element];
var currentElement = element;
var pushElement = function pushElement(openedElement) {
currentElement.appendChild(openedElement);
elements.push(openedElement);
currentElement = openedElement;
};
for (var i = 0, l = markers.length; i < l; i++) {
var marker = markers[i];
var _marker = _slicedToArray(marker, 3);
var openTypes = _marker[0];
var closeCount = _marker[1];
var text = _marker[2];
for (var j = 0, m = openTypes.length; j < m; j++) {
var markerType = this.markerTypes[openTypes[j]];
var _markerType = _slicedToArray(markerType, 2);
var tagName = _markerType[0];
var _markerType$1 = _markerType[1];
var attrs = _markerType$1 === undefined ? [] : _markerType$1;
if ((0, _mobiledocDomRendererUtilsTagNames.isValidMarkerType)(tagName)) {
pushElement(this.renderMarkupElement(tagName, attrs));
} else {
closeCount--;
}
}
currentElement.appendChild((0, _mobiledocDomRendererUtilsDom.createTextNode)(this.dom, text));
for (var j = 0, m = closeCount; j < m; j++) {
elements.pop();
currentElement = elements[elements.length - 1];
}
}
}
/**
* @param attrs Array
*/
}, {
key: 'renderMarkupElement',
value: function renderMarkupElement(tagName, attrs) {
tagName = tagName.toLowerCase();
attrs = (0, _mobiledocDomRendererUtilsSanitizationUtils.reduceAttributes)(attrs);
var renderer = this.markupElementRendererFor(tagName);
return renderer(tagName, this.dom, attrs);
}
}, {
key: 'markupElementRendererFor',
value: function markupElementRendererFor(tagName) {
return this.markupElementRenderer[tagName] || this.markupElementRenderer.__default__;
}
}, {
key: 'renderListItem',
value: function renderListItem(markers) {
var element = this.dom.createElement('li');
this.renderMarkersOnElement(element, markers);
return element;
}
}, {
key: 'renderListSection',
value: function renderListSection(_ref) {
var _this3 = this;
var _ref2 = _slicedToArray(_ref, 3);
var type = _ref2[0];
var tagName = _ref2[1];
var listItems = _ref2[2];
if (!(0, _mobiledocDomRendererUtilsTagNames.isValidSectionTagName)(tagName, _mobiledocDomRendererUtilsSectionTypes.LIST_SECTION_TYPE)) {
return;
}
var element = this.dom.createElement(tagName);
listItems.forEach(function (li) {
element.appendChild(_this3.renderListItem(li));
});
return element;
}
}, {
key: 'renderImageSection',
value: function renderImageSection(_ref3) {
var _ref32 = _slicedToArray(_ref3, 2);
var type = _ref32[0];
var src = _ref32[1];
var element = this.dom.createElement(IMAGE_SECTION_TAG_NAME);
element.src = src;
return element;
}
}, {
key: 'findCard',
value: function findCard(name) {
for (var i = 0; i < this.cards.length; i++) {
if (this.cards[i].name === name) {
return this.cards[i];
}
}
if (name === _mobiledocDomRendererCardsImage['default'].name) {
return _mobiledocDomRendererCardsImage['default'];
}
return this._createUnknownCard(name);
}
}, {
key: '_createUnknownCard',
value: function _createUnknownCard(name) {
return {
name: name,
type: _mobiledocDomRendererUtilsRenderType['default'],
render: this.unknownCardHandler
};
}
}, {
key: '_createCardArgument',
value: function _createCardArgument(card) {
var _this4 = this;
var payload = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var env = {
name: card.name,
isInEditor: false,
dom: this.dom,
didRender: function didRender(callback) {
return _this4._registerRenderCallback(callback);
},
onTeardown: function onTeardown(callback) {
return _this4._registerTeardownCallback(callback);
}
};
var options = this.cardOptions;
return { env: env, options: options, payload: payload };
}
}, {
key: '_registerRenderCallback',
value: function _registerRenderCallback(callback) {
this._renderCallbacks.push(callback);
}
}, {
key: '_registerTeardownCallback',
value: function _registerTeardownCallback(callback) {
this._teardownCallbacks.push(callback);
}
}, {
key: 'renderCardSection',
value: function renderCardSection(_ref4) {
var _ref42 = _slicedToArray(_ref4, 3);
var type = _ref42[0];
var name = _ref42[1];
var payload = _ref42[2];
var card = this.findCard(name);
var cardArg = this._createCardArgument(card, payload);
var rendered = card.render(cardArg);
this._validateCardRender(rendered, card.name);
return rendered;
}
}, {
key: '_validateCardRender',
value: function _validateCardRender(rendered, cardName) {
if (!rendered) {
return;
}
if (typeof rendered !== 'object') {
throw new Error('Card "' + cardName + '" must render ' + _mobiledocDomRendererUtilsRenderType['default'] + ', but result was "' + rendered + '"');
}
}
}, {
key: 'renderMarkupSection',
value: function renderMarkupSection(_ref5) {
var _ref52 = _slicedToArray(_ref5, 3);
var type = _ref52[0];
var tagName = _ref52[1];
var markers = _ref52[2];
tagName = tagName.toLowerCase();
if (!(0, _mobiledocDomRendererUtilsTagNames.isValidSectionTagName)(tagName, _mobiledocDomRendererUtilsSectionTypes.MARKUP_SECTION_TYPE)) {
return;
}
var renderer = this.sectionElementRendererFor(tagName);
var element = renderer(tagName, this.dom);
this.renderMarkersOnElement(element, markers);
return element;
}
}, {
key: 'sectionElementRendererFor',
value: function sectionElementRendererFor(tagName) {
return this.sectionElementRenderer[tagName] || this.sectionElementRenderer.__default__;
}
}, {
key: '_defaultUnknownCardHandler',
get: function get() {
return function (_ref6) {
var name = _ref6.env.name;
throw new Error('Card "' + name + '" not found but no unknownCardHandler was registered');
};
}
}]);
return Renderer;
})();
exports['default'] = Renderer;
});
define('mobiledoc-dom-renderer/renderers/0-3', ['exports', 'mobiledoc-dom-renderer/utils/dom', 'mobiledoc-dom-renderer/cards/image', 'mobiledoc-dom-renderer/utils/render-type', 'mobiledoc-dom-renderer/utils/section-types', 'mobiledoc-dom-renderer/utils/tag-names', 'mobiledoc-dom-renderer/utils/sanitization-utils', 'mobiledoc-dom-renderer/utils/render-utils', 'mobiledoc-dom-renderer/utils/marker-types'], function (exports, _mobiledocDomRendererUtilsDom, _mobiledocDomRendererCardsImage, _mobiledocDomRendererUtilsRenderType, _mobiledocDomRendererUtilsSectionTypes, _mobiledocDomRendererUtilsTagNames, _mobiledocDomRendererUtilsSanitizationUtils, _mobiledocDomRendererUtilsRenderUtils, _mobiledocDomRendererUtilsMarkerTypes) {
'use strict';
var _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'); } }; })();
var _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; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var MOBILEDOC_VERSION_0_3_0 = '0.3.0';
exports.MOBILEDOC_VERSION_0_3_0 = MOBILEDOC_VERSION_0_3_0;
var MOBILEDOC_VERSION_0_3_1 = '0.3.1';
exports.MOBILEDOC_VERSION_0_3_1 = MOBILEDOC_VERSION_0_3_1;
var MOBILEDOC_VERSION_0_3_2 = '0.3.2';
exports.MOBILEDOC_VERSION_0_3_2 = MOBILEDOC_VERSION_0_3_2;
var IMAGE_SECTION_TAG_NAME = 'img';
function validateVersion(version) {
switch (version) {
case MOBILEDOC_VERSION_0_3_0:
case MOBILEDOC_VERSION_0_3_1:
case MOBILEDOC_VERSION_0_3_2:
return;
default:
throw new Error('Unexpected Mobiledoc version "' + version + '"');
}
}
var Renderer = (function () {
function Renderer(mobiledoc, state) {
var _this = this;
_classCallCheck(this, Renderer);
var cards = state.cards;
var cardOptions = state.cardOptions;
var atoms = state.atoms;
var unknownCardHandler = state.unknownCardHandler;
var unknownAtomHandler = state.unknownAtomHandler;
var markupElementRenderer = state.markupElementRenderer;
var sectionElementRenderer = state.sectionElementRenderer;
var dom = state.dom;
var version = mobiledoc.version;
var sections = mobiledoc.sections;
var atomTypes = mobiledoc.atoms;
var cardTypes = mobiledoc.cards;
var markerTypes = mobiledoc.markups;
validateVersion(version);
this.dom = dom;
this.root = this.dom.createDocumentFragment();
this.sections = sections;
this.atomTypes = atomTypes;
this.cardTypes = cardTypes;
this.markerTypes = markerTypes;
this.cards = cards;
this.atoms = atoms;
this.cardOptions = cardOptions;
this.unknownCardHandler = unknownCardHandler || this._defaultUnknownCardHandler;
this.unknownAtomHandler = unknownAtomHandler || this._defaultUnknownAtomHandler;
this.sectionElementRenderer = {
'__default__': _mobiledocDomRendererUtilsRenderUtils.defaultSectionElementRenderer
};
Object.keys(sectionElementRenderer).forEach(function (key) {
_this.sectionElementRenderer[key.toLowerCase()] = sectionElementRenderer[key];
});
this.markupElementRenderer = {
'__default__': _mobiledocDomRendererUtilsRenderUtils.defaultMarkupElementRenderer
};
Object.keys(markupElementRenderer).forEach(function (key) {
_this.markupElementRenderer[key.toLowerCase()] = markupElementRenderer[key];
});
this._renderCallbacks = [];
this._teardownCallbacks = [];
}
_createClass(Renderer, [{
key: 'render',
value: function render() {
var _this2 = this;
this.sections.forEach(function (section) {
var rendered = _this2.renderSection(section);
if (rendered) {
_this2.root.appendChild(rendered);
}
});
for (var i = 0; i < this._renderCallbacks.length; i++) {
this._renderCallbacks[i]();
}
// maintain a reference to child nodes so they can be cleaned up later by teardown
this._renderedChildNodes = Array.prototype.slice.call(this.root.childNodes);
return { result: this.root, teardown: function teardown() {
return _this2.teardown();
} };
}
}, {
key: 'teardown',
value: function teardown() {
for (var i = 0; i < this._teardownCallbacks.length; i++) {
this._teardownCallbacks[i]();
}
for (var i = 0; i < this._renderedChildNodes.length; i++) {
var node = this._renderedChildNodes[i];
if (node.parentNode) {
node.parentNode.removeChild(node);
}
}
}
}, {
key: 'renderSection',
value: function renderSection(section) {
var _section = _slicedToArray(section, 1);
var type = _section[0];
switch (type) {
case _mobiledocDomRendererUtilsSectionTypes.MARKUP_SECTION_TYPE:
return this.renderMarkupSection(section);
case _mobiledocDomRendererUtilsSectionTypes.IMAGE_SECTION_TYPE:
return this.renderImageSection(section);
case _mobiledocDomRendererUtilsSectionTypes.LIST_SECTION_TYPE:
return this.renderListSection(section);
case _mobiledocDomRendererUtilsSectionTypes.CARD_SECTION_TYPE:
return this.renderCardSection(section);
default:
throw new Error('Cannot render mobiledoc section of type "' + type + '"');
}
}
}, {
key: 'renderMarkersOnElement',
value: function renderMarkersOnElement(element, markers) {
var elements = [element];
var currentElement = element;
var pushElement = function pushElement(openedElement) {
currentElement.appendChild(openedElement);
elements.push(openedElement);
currentElement = openedElement;
};
for (var i = 0, l = markers.length; i < l; i++) {
var marker = markers[i];
var _marker = _slicedToArray(marker, 4);
var type = _marker[0];
var openTypes = _marker[1];
var closeCount = _marker[2];
var value = _marker[3];
for (var j = 0, m = openTypes.length; j < m; j++) {
var markerType = this.markerTypes[openTypes[j]];
var _markerType = _slicedToArray(markerType, 2);
var tagName = _markerType[0];
var _markerType$1 = _markerType[1];
var attrs = _markerType$1 === undefined ? [] : _markerType$1;
if ((0, _mobiledocDomRendererUtilsTagNames.isValidMarkerType)(tagName)) {
pushElement(this.renderMarkupElement(tagName, attrs));
} else {
closeCount--;
}
}
switch (type) {
case _mobiledocDomRendererUtilsMarkerTypes.MARKUP_MARKER_TYPE:
currentElement.appendChild((0, _mobiledocDomRendererUtilsDom.createTextNode)(this.dom, value));
break;
case _mobiledocDomRendererUtilsMarkerTypes.ATOM_MARKER_TYPE:
currentElement.appendChild(this._renderAtom(value));
break;
default:
throw new Error('Unknown markup type (' + type + ')');
}
for (var j = 0, m = closeCount; j < m; j++) {
elements.pop();
currentElement = elements[elements.length - 1];
}
}
}
/**
* @param attrs Array
*/
}, {
key: 'renderMarkupElement',
value: function renderMarkupElement(tagName, attrs) {
tagName = tagName.toLowerCase();
attrs = (0, _mobiledocDomRendererUtilsSanitizationUtils.reduceAttributes)(attrs);
var renderer = this.markupElementRendererFor(tagName);
return renderer(tagName, this.dom, attrs);
}
}, {
key: 'markupElementRendererFor',
value: function markupElementRendererFor(tagName) {
return this.markupElementRenderer[tagName] || this.markupElementRenderer.__default__;
}
}, {
key: 'renderListItem',
value: function renderListItem(markers) {
var element = this.dom.createElement('li');
this.renderMarkersOnElement(element, markers);
return element;
}
}, {
key: 'renderListSection',
value: function renderListSection(_ref) {
var _this3 = this;
var _ref2 = _slicedToArray(_ref, 3);
var type = _ref2[0];
var tagName = _ref2[1];
var listItems = _ref2[2];
if (!(0, _mobiledocDomRendererUtilsTagNames.isValidSectionTagName)(tagName, _mobiledocDomRendererUtilsSectionTypes.LIST_SECTION_TYPE)) {
return;
}
var element = this.dom.createElement(tagName);
listItems.forEach(function (li) {
element.appendChild(_this3.renderListItem(li));
});
return element;
}
}, {
key: 'renderImageSection',
value: function renderImageSection(_ref3) {
var _ref32 = _slicedToArray(_ref3, 2);
var type = _ref32[0];
var src = _ref32[1];
var element = this.dom.createElement(IMAGE_SECTION_TAG_NAME);
element.src = src;
return element;
}
}, {
key: 'findCard',
value: function findCard(name) {
for (var i = 0; i < this.cards.length; i++) {
if (this.cards[i].name === name) {
return this.cards[i];
}
}
if (name === _mobiledocDomRendererCardsImage['default'].name) {
return _mobiledocDomRendererCardsImage['default'];
}
return this._createUnknownCard(name);
}
}, {
key: '_findCardByIndex',
value: function _findCardByIndex(index) {
var cardType = this.cardTypes[index];
if (!cardType) {
throw new Error('No card definition found at index ' + index);
}
var _cardType = _slicedToArray(cardType, 2);
var name = _cardType[0];
var payload = _cardType[1];
var card = this.findCard(name);
return {
card: card,
payload: payload
};
}
}, {
key: '_createUnknownCard',
value: function _createUnknownCard(name) {
return {
name: name,
type: _mobiledocDomRendererUtilsRenderType['default'],
render: this.unknownCardHandler
};
}
}, {
key: '_createCardArgument',
value: function _createCardArgument(card) {
var _this4 = this;
var payload = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var env = {
name: card.name,
isInEditor: false,
dom: this.dom,
didRender: function didRender(callback) {
return _this4._registerRenderCallback(callback);
},
onTeardown: function onTeardown(callback) {
return _this4._registerTeardownCallback(callback);
}
};
var options = this.cardOptions;
return { env: env, options: options, payload: payload };
}
}, {
key: '_registerTeardownCallback',
value: function _registerTeardownCallback(callback) {
this._teardownCallbacks.push(callback);
}
}, {
key: '_registerRenderCallback',
value: function _registerRenderCallback(callback) {
this._renderCallbacks.push(callback);
}
}, {
key: 'renderCardSection',
value: function renderCardSection(_ref4) {
var _ref42 = _slicedToArray(_ref4, 2);
var type = _ref42[0];
var index = _ref42[1];
var _findCardByIndex2 = this._findCardByIndex(index);
var card = _findCardByIndex2.card;
var payload = _findCardByIndex2.payload;
var cardArg = this._createCardArgument(card, payload);
var rendered = card.render(cardArg);
this._validateCardRender(rendered, card.name);
return rendered;
}
}, {
key: '_validateCardRender',
value: function _validateCardRender(rendered, cardName) {
if (!rendered) {
return;
}
if (typeof rendered !== 'object') {
throw new Error('Card "' + cardName + '" must render ' + _mobiledocDomRendererUtilsRenderType['default'] + ', but result was "' + rendered + '"');
}
}
}, {
key: 'findAtom',
value: function findAtom(name) {
for (var i = 0; i < this.atoms.length; i++) {
if (this.atoms[i].name === name) {
return this.atoms[i];
}
}
return this._createUnknownAtom(name);
}
}, {
key: '_createUnknownAtom',
value: function _createUnknownAtom(name) {
return {
name: name,
type: _mobiledocDomRendererUtilsRenderType['default'],
render: this.unknownAtomHandler
};
}
}, {
key: '_createAtomArgument',
value: function _createAtomArgument(atom, value, payload) {
var _this5 = this;
var env = {
name: atom.name,
isInEditor: false,
dom: this.dom,
onTeardown: function onTeardown(callback) {
return _this5._registerTeardownCallback(callback);
}
};
var options = this.cardOptions;
return { env: env, options: options, value: value, payload: payload };
}
}, {
key: '_validateAtomRender',
value: function _validateAtomRender(rendered, atomName) {
if (!rendered) {
return;
}
if (typeof rendered !== 'object') {
throw new Error('Atom "' + atomName + '" must render ' + _mobiledocDomRendererUtilsRenderType['default'] + ', but result was "' + rendered + '"');
}
}
}, {
key: '_findAtomByIndex',
value: function _findAtomByIndex(index) {
var atomType = this.atomTypes[index];
if (!atomType) {
throw new Error('No atom definition found at index ' + index);
}
var _atomType = _slicedToArray(atomType, 3);
var name = _atomType[0];
var value = _atomType[1];
var payload = _atomType[2];
var atom = this.findAtom(name);
return {
atom: atom,
value: value,
payload: payload
};
}
}, {
key: '_renderAtom',
value: function _renderAtom(index) {
var _findAtomByIndex2 = this._findAtomByIndex(index);
var atom = _findAtomByIndex2.atom;
var value = _findAtomByIndex2.value;
var payload = _findAtomByIndex2.payload;
var atomArg = this._createAtomArgument(atom, value, payload);
var rendered = atom.render(atomArg);
this._validateAtomRender(rendered, atom.name);
return rendered || (0, _mobiledocDomRendererUtilsDom.createTextNode)(this.dom, '');
}
}, {
key: 'renderMarkupSection',
value: function renderMarkupSection(_ref5) {
var _ref52 = _slicedToArray(_ref5, 4);
var type = _ref52[0];
var tagName = _ref52[1];
var markers = _ref52[2];
var _ref52$3 = _ref52[3];
var attributes = _ref52$3 === undefined ? [] : _ref52$3;
tagName = tagName.toLowerCase();
if (!(0, _mobiledocDomRendererUtilsTagNames.isValidSectionTagName)(tagName, _mobiledocDomRendererUtilsSectionTypes.MARKUP_SECTION_TYPE)) {
return;
}
var attrsObj = (0, _mobiledocDomRendererUtilsSanitizationUtils.reduceAttributes)(attributes);
var renderer = this.sectionElementRendererFor(tagName);
var element = renderer(tagName, this.dom, attrsObj);
this.renderMarkersOnElement(element, markers);
return element;
}
}, {
key: 'sectionElementRendererFor',
value: function sectionElementRendererFor(tagName) {
return this.sectionElementRenderer[tagName] || this.sectionElementRenderer.__default__;
}
}, {
key: '_defaultUnknownCardHandler',
get: function get() {
return function (_ref6) {
var name = _ref6.env.name;
throw new Error('Card "' + name + '" not found but no unknownCardHandler was registered');
};
}
}, {
key: '_defaultUnknownAtomHandler',
get: function get() {
return function (_ref7) {
var name = _ref7.env.name;
throw new Error('Atom "' + name + '" not found but no unknownAtomHandler was registered');
};
}
}]);
return Renderer;
})();
exports['default'] = Renderer;
});
define("mobiledoc-dom-renderer/utils/array-utils", ["exports"], function (exports) {
"use strict";
exports.includes = includes;
exports.kvArrayToObject = kvArrayToObject;
exports.objectToSortedKVArray = objectToSortedKVArray;
function includes(array, detectValue) {
for (var i = 0; i < array.length; i++) {
var value = array[i];
if (value === detectValue) {
return true;
}
}
return false;
}
/**
* @param {Array} array of key1,value1,key2,value2,...
* @return {Object} {key1:value1, key2:value2, ...}
* @private
*/
function kvArrayToObject(array) {
if (!Array.isArray(array)) {
return {};
}
var obj = {};
for (var i = 0; i < array.length; i += 2) {
var key = array[i];
var value = array[i + 1];
obj[key] = value;
}
return obj;
}
/**
* @param {Object} {key1:value1, key2:value2, ...}
* @return {Array} array of key1,value1,key2,value2,...
* @private
*/
function objectToSortedKVArray(obj) {
var keys = Object.keys(obj).sort();
var result = [];
keys.forEach(function (k) {
result.push(k);
result.push(obj[k]);
});
return result;
}
});
define('mobiledoc-dom-renderer/utils/dom', ['exports'], function (exports) {
'use strict';
exports.createTextNode = createTextNode;
exports.normalizeTagName = normalizeTagName;
var NBSP = ' ';
var EMSP = '';
function prepareText(text) {
return text.replace(/ /g, ' ' + NBSP).replace(/\t/g, EMSP);
}
function createTextNode(dom, text) {
return dom.createTextNode(prepareText(text));
}
function normalizeTagName(tagName) {
return tagName.toLowerCase();
}
});
define("mobiledoc-dom-renderer/utils/marker-types", ["exports"], function (exports) {
"use strict";
var MARKUP_MARKER_TYPE = 0;
exports.MARKUP_MARKER_TYPE = MARKUP_MARKER_TYPE;
var ATOM_MARKER_TYPE = 1;
exports.ATOM_MARKER_TYPE = ATOM_MARKER_TYPE;
});
define('mobiledoc-dom-renderer/utils/render-type', ['exports'], function (exports) {
'use strict';
exports['default'] = 'dom';
});
define('mobiledoc-dom-renderer/utils/render-utils', ['exports', 'mobiledoc-dom-renderer/utils/tag-names', 'mobiledoc-dom-renderer/utils/sanitization-utils'], function (exports, _mobiledocDomRendererUtilsTagNames, _mobiledocDomRendererUtilsSanitizationUtils) {
'use strict';
exports.defaultSectionElementRenderer = defaultSectionElementRenderer;
exports.defaultMarkupElementRenderer = defaultMarkupElementRenderer;
var VALID_ATTRIBUTES = ['data-md-text-align'];
exports.VALID_ATTRIBUTES = VALID_ATTRIBUTES;
function _isValidAttribute(attr) {
return VALID_ATTRIBUTES.indexOf(attr) !== -1;
}
function handleMarkupSectionAttribute(element, attributeKey, attributeValue) {
if (!_isValidAttribute(attributeKey)) {
throw new Error('Cannot use attribute: ' + attributeKey);
}
element.setAttribute(attributeKey, attributeValue);
}
function defaultSectionElementRenderer(tagName, dom) {
var attrsObj = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var element = undefined;
if ((0, _mobiledocDomRendererUtilsTagNames.isMarkupSectionElementName)(tagName)) {
element = dom.createElement(tagName);
Object.keys(attrsObj).forEach(function (k) {
handleMarkupSectionAttribute(element, k, attrsObj[k]);
});
} else {
element = dom.createElement('div');
element.setAttribute('class', tagName);
}
return element;
}
function sanitizeAttribute(tagName, attrName, attrValue) {
if (tagName === 'a' && attrName === 'href') {
return (0, _mobiledocDomRendererUtilsSanitizationUtils.sanitizeHref)(attrValue);
} else {
return attrValue;
}
}
function defaultMarkupElementRenderer(tagName, dom, attrsObj) {
var element = dom.createElement(tagName);
Object.keys(attrsObj).forEach(function (attrName) {
var attrValue = attrsObj[attrName];
attrValue = sanitizeAttribute(tagName, attrName, attrValue);
element.setAttribute(attrName, attrValue);
});
return element;
}
});
define('mobiledoc-dom-renderer/utils/sanitization-utils', ['exports', 'mobiledoc-dom-renderer/utils/array-utils'], function (exports, _mobiledocDomRendererUtilsArrayUtils) {
'use strict';
exports.sanitizeHref = sanitizeHref;
exports.reduceAttributes = reduceAttributes;
var PROTOCOL_REGEXP = /.+:/i;
var badProtocols = ['javascript', // jshint ignore:line
'vbscript' // jshint ignore:line
];
function getProtocol(url) {
var matches = url && url.match(PROTOCOL_REGEXP);
var protocol = matches && matches[0] && matches[0].split(':')[0] || '';
return protocol;
}
function sanitizeHref(url) {
var protocol = getProtocol(url).toLowerCase().replace(/ /g, '');
if ((0, _mobiledocDomRendererUtilsArrayUtils.includes)(badProtocols, protocol)) {
return 'unsafe:' + url;
}
return url;
}
/**
* @param attributes array
* @return obj with normalized attribute names (lowercased)
*/
function reduceAttributes(attributes) {
var obj = {};
for (var i = 0; i < attributes.length; i += 2) {
var key = attributes[i];
var val = attributes[i + 1];
obj[key.toLowerCase()] = val;
}
return obj;
}
});
define("mobiledoc-dom-renderer/utils/section-types", ["exports"], function (exports) {
"use strict";
var MARKUP_SECTION_TYPE = 1;
exports.MARKUP_SECTION_TYPE = MARKUP_SECTION_TYPE;
var IMAGE_SECTION_TYPE = 2;
exports.IMAGE_SECTION_TYPE = IMAGE_SECTION_TYPE;
var LIST_SECTION_TYPE = 3;
exports.LIST_SECTION_TYPE = LIST_SECTION_TYPE;
var CARD_SECTION_TYPE = 10;
exports.CARD_SECTION_TYPE = CARD_SECTION_TYPE;
});
define('mobiledoc-dom-renderer/utils/tag-names', ['exports', 'mobiledoc-dom-renderer/utils/section-types', 'mobiledoc-dom-renderer/utils/dom'], function (exports, _mobiledocDomRendererUtilsSectionTypes, _mobiledocDomRendererUtilsDom) {
'use strict';
exports.isValidSectionTagName = isValidSectionTagName;
exports.isMarkupSectionElementName = isMarkupSectionElementName;
exports.isValidMarkerType = isValidMarkerType;
var MARKUP_SECTION_TAG_NAMES = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pull-quote', 'aside'].map(_mobiledocDomRendererUtilsDom.normalizeTagName);
var MARKUP_SECTION_ELEMENT_NAMES = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'aside'].map(_mobiledocDomRendererUtilsDom.normalizeTagName);
var LIST_SECTION_TAG_NAMES = ['ul', 'ol'].map(_mobiledocDomRendererUtilsDom.normalizeTagName);
var MARKUP_TYPES = ['b', 'i', 'strong', 'em', 'a', 'u', 'sub', 'sup', 's', 'code'].map(_mobiledocDomRendererUtilsDom.normalizeTagName);
function contains(array, item) {
return array.indexOf(item) !== -1;
}
function isValidSectionTagName(tagName, sectionType) {
tagName = (0, _mobiledocDomRendererUtilsDom.normalizeTagName)(tagName);
switch (sectionType) {
case _mobiledocDomRendererUtilsSectionTypes.MARKUP_SECTION_TYPE:
return contains(MARKUP_SECTION_TAG_NAMES, tagName);
case _mobiledocDomRendererUtilsSectionTypes.LIST_SECTION_TYPE:
return contains(LIST_SECTION_TAG_NAMES, tagName);
default:
throw new Error('Cannot validate tagName for unknown section type "' + sectionType + '"');
}
}
function isMarkupSectionElementName(tagName) {
tagName = (0, _mobiledocDomRendererUtilsDom.normalizeTagName)(tagName);
return contains(MARKUP_SECTION_ELEMENT_NAMES, tagName);
}
function isValidMarkerType(type) {
type = (0, _mobiledocDomRendererUtilsDom.normalizeTagName)(type);
return contains(MARKUP_TYPES, type);
}
});//# sourceMappingURL=mobiledoc-dom-renderer.map