import Renderer_0_2, { MOBILEDOC_VERSION as MOBILEDOC_VERSION_0_2 } from './renderers/0-2'; import Renderer_0_3, { MOBILEDOC_VERSION_0_3_0, MOBILEDOC_VERSION_0_3_1, MOBILEDOC_VERSION_0_3_2 } from './renderers/0-3'; import RENDER_TYPE from './utils/render-type'; /** * 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 (let i=0; i < cards.length; i++) { let card = cards[i]; if (card.type !== RENDER_TYPE) { throw new Error(`Card "${card.name}" must be of type "${RENDER_TYPE}", 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 (let i=0; i < atoms.length; i++) { let atom = atoms[i]; if (atom.type !== RENDER_TYPE) { throw new Error(`Atom "${atom.name}" must be type "${RENDER_TYPE}", was "${atom.type}"`); } if (!atom.render) { throw new Error(`Atom "${atom.name}" must define \`render\``); } } } export default class RendererFactory { constructor({ cards=[], atoms=[], cardOptions={}, unknownCardHandler, unknownAtomHandler, markupElementRenderer={}, sectionElementRenderer={}, dom, markupSanitizer=null }={}) { 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, atoms, cardOptions, unknownCardHandler, unknownAtomHandler, markupElementRenderer, sectionElementRenderer, dom, markupSanitizer }; } render(mobiledoc) { let { version } = mobiledoc; switch (version) { case MOBILEDOC_VERSION_0_2: case undefined: case null: return new Renderer_0_2(mobiledoc, this.options).render(); case MOBILEDOC_VERSION_0_3_0: case MOBILEDOC_VERSION_0_3_1: case MOBILEDOC_VERSION_0_3_2: return new Renderer_0_3(mobiledoc, this.options).render(); default: throw new Error(`Unexpected Mobiledoc version "${version}"`); } } }