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

1226 lines
44 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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