0.7.2 • Published 2 years ago

mobiledoc-dom-renderer v0.7.2

Weekly downloads
13,584
License
MIT
Repository
github
Last release
2 years ago

Mobiledoc DOM Renderer

This is a DOM renderer for the Mobiledoc format used by Mobiledoc-Kit.

To learn more about Mobiledoc cards and renderers, see the Mobiledoc Cards docs.

The renderer is a small library intended for use in browser clients.

Usage

var mobiledoc = {
  version: "0.3.0",
  markups: ["B"],
  atoms: [],
  cards: [],
  sections: [
    [1, 'P', [ // array of markers
      // marker
      [ 0,            // marker type 0 (standard text)
        [0],          // open markups (by index)
        0,            // close count
        'hello world'
      ]
    ]
  ]
};
var renderer = new MobiledocDOMRenderer({cards: []});
var rendered = renderer.render(mobiledoc);
var result = rendered.result;
document.getElementById('output').appendChild(result);
// renders <div><p><b>hello world</b></b></div>
// into 'output' element

The Renderer constructor accepts a single object with the following optional properties:

  • cards array - The list of card objects that the renderer may encounter in the mobiledoc
  • atoms array - The list of atom objects that the renderer may encounter in the mobiledoc
  • cardOptions object - Options to pass to cards and atoms when they are rendered
  • unknownCardHandler function - Will be called when any unknown card is enountered
  • unknownAtomHandler function - Will be called when any unknown atom is enountered
  • sectionElementRenderer object - A map of hooks for section element rendering.
    • Valid keys are P, H1, H2, H3, H4, H5, H6, BLOCKQUOTE, ASIDE
    • Arguments are tagName, dom
    • A valid value is a function that returns an element
  • markupElementRenderer object - A map of hooks for inline element rendering.
    • Valid keys are B, I, STRONG, EM, A, U, SUB, SUP, S, CODE
    • Arguments are tagName, dom, attributes={}
    • A valid value is a function that returns an element
  • dom object - A native or SimpleDOM implementation of the DOM.

The return value from renderer.render(mobiledoc) is an object with two properties:

  • result DOM Node - The rendered result
  • teardown function - When called, this function will tear down the rendered mobiledoc and call any teardown handlers that were registered by cards when they were rendered

Rendering HTML

In a browser, rendering to HTML is simple:

var renderer = new MobiledocDOMRenderer();
var rendered = renderer.render(mobiledoc);
var html = rendered.result.outerHTML;

However on the server in Node.js, native DOM APIs are not available. To make server-rendering easy, this DOM renderer is SimpleDOM compatible. You may pass an instance of a SimpleDOM document and serialize its output. For example:

var renderer = new MobiledocDOMRenderer({
  dom: new SimpleDOM.Document()
});
var rendered = renderer.render(mobiledoc);
var serializer = new SimpleDOM.HTMLSerializer([]);
var html = serializer.serializeChildren(rendered.result);

This usage of the DOM renderer for rendering HTML has the advantage of allowing developers to easily implement cards that work in a server and client context.

sectionElementRenderer

Use this renderer option to customize what element is used when rendering a section.

var renderer = new MobiledocDOMRenderer({
  sectionElementRenderer: {
    P: function(_, dom) { return dom.createElement('span'); },
    H1: function(_, dom) { return dom.createElement('h2'); },
    H2: function(tagName, dom) {
      var element = dom.createElement(tagName);
      element.setAttribute('class', 'subheadline');
      return element;
    }
    /* Valid keys are P, H1, H2, H3, H4, H5, H6, BLOCKQUOTE, ASIDE */
  }
});
var rendered = renderer.render(mobiledoc);

markupElementRenderer

Use this renderer option to customize what inline tags are used when rendering a section's content.

var renderer = new MobiledocDOMRenderer({
  markupElementRenderer: {
    B: function(_, dom) { return dom.createElement('strong'); },
    A: function(tagName, dom, attrs={}) {
      let element = dom.createElement(tagName);

      for (let attr in attrs) {
        element.setAttribute(attr, attrs[attr]);
      }

      element.setAttribute('rel', 'nofollow');
      return element;
    }
  }
});
var rendered = renderer.render(mobiledoc);

Attribute Sanitization (XSS Protection)

Mobiledoc DOM Renderer sanitizes the href attribute of 'A' markups, prefixing the string unsafe: on potentially unsafe urls. It determines an environment- appropriate URL protocol parser. In rare cases it may be unable to determine one (this can happen when running the renderer in a Node VM Sandbox, like ember-cli- fastboot does), and will throw in that case. To fix this, you can provide a custom markupElementRenderer for the 'A' tag that will be used instead of the default.

Tests

Releasing

  • Use np (install with npm install -g np)
  • np <version> (e.g. np 0.5.2)
  • git push --tags
0.7.2

2 years ago

0.7.1

2 years ago

0.7.0

5 years ago

0.6.6

5 years ago

0.7.0-beta.1

5 years ago

0.7.0-beta

5 years ago

0.6.5

7 years ago

0.6.4

7 years ago

0.6.4-1

7 years ago

0.6.4-0

7 years ago

0.6.3

7 years ago

0.6.2

7 years ago

0.6.1

7 years ago

0.6.1-3

7 years ago

0.6.1-2

7 years ago

0.6.1-1

7 years ago

0.6.1-0

7 years ago

0.6.0

7 years ago

0.6.0-0

7 years ago

0.5.4

7 years ago

0.5.3

8 years ago

0.5.2

8 years ago

0.5.1

8 years ago

0.5.0

8 years ago

0.4.1

8 years ago

0.4.0

8 years ago

0.4.0-beta4

8 years ago

0.4.0-beta3

8 years ago

0.4.0-beta2

8 years ago

0.4.0-beta1

8 years ago

0.3.0

8 years ago

0.3.0-beta3

8 years ago

0.3.0-beta2

8 years ago

0.3.0-beta1

8 years ago

0.2.1

8 years ago

0.2.0

8 years ago

0.1.18

8 years ago

0.1.17

8 years ago

0.1.16

9 years ago

0.1.15

9 years ago

0.1.14

9 years ago

0.1.13

9 years ago

0.1.12

9 years ago

0.1.11

9 years ago

0.1.10

9 years ago

0.1.9

9 years ago

0.1.8

9 years ago

0.1.6

9 years ago

0.1.5

9 years ago

0.1.4

9 years ago

0.1.3

9 years ago

0.1.2

9 years ago

0.1.0

9 years ago