Skip to content

Commit

Permalink
refactor to handle new cards
Browse files Browse the repository at this point in the history
fixes #17
  • Loading branch information
bantic committed Nov 23, 2015
1 parent 7f942c6 commit e6fd6fd
Show file tree
Hide file tree
Showing 8 changed files with 471 additions and 209 deletions.
21 changes: 15 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## Mobiledoc DOM Renderer [![Build Status](https://travis-ci.org/bustlelabs/mobiledoc-dom-renderer.svg?branch=master)](https://travis-ci.org/bustlelabs/mobiledoc-dom-renderer)

This is a DOM renderer for the [Mobiledoc](https://github.com/bustlelabs/content-kit-editor/blob/master/MOBILEDOC.md) format used
This is a DOM renderer for the [Mobiledoc](https://github.com/bustlelabs/mobiledoc-kit/blob/master/MOBILEDOC.md) format used
by [Mobiledoc-Kit](https://github.com/bustlelabs/mobiledoc-kit).

The renderer is a small library intended for use in browser clients.
Expand All @@ -9,7 +9,7 @@ The renderer is a small library intended for use in browser clients.

```
var mobiledoc = {
version: "0.1",
version: "0.2.0",
sections: [
[ // markers
['B']
Expand All @@ -26,14 +26,23 @@ var mobiledoc = {
]
]
};
var renderer = new MobiledocDOMRenderer();
var cards = {};
var rendered = renderer.render(mobiledoc, document.createElement('div'), cards);
document.getElementById('output').appendChild(rendered);
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`: An array of card objects
* `cardOptions`: Options to pass to cards when they are rendered
* `unknownCardHandler`: A method that will be called when any unknown card is enountered

The return value from `renderer.render(mobiledoc)` is an object with two properties:
* `result` The rendered result. A DOMNode
* `teardown` A teardown method that, when called, will tear down the rendered mobiledoc and call any teardown handlers that were registered by cards in the mobiledoc.

### Tests

* `npm test`
Expand Down
23 changes: 8 additions & 15 deletions lib/cards/image.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
import {
createElement,
appendChild
} from '../utils/dom';
import { createElement } from '../utils/dom';
import RENDER_TYPE from '../utils/render-type';

const ImageCard = {
export default {
name: 'image',
display: {
setup(element, options, env, payload) {
if (payload.src) {
let img = createElement('img');
img.src = payload.src;
appendChild(element, img);
}
}
type: RENDER_TYPE,
render({payload}) {
let img = createElement('img');
img.src = payload.src;
return img;
}
};

export default ImageCard;
9 changes: 6 additions & 3 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import Renderer from './renderer';
import RendererFactory from './renderer-factory';
import RENDER_TYPE from './utils/render-type';

export { RENDER_TYPE };

export function registerGlobal(window) {
window.MobiledocDOMRenderer = Renderer;
window.MobiledocDOMRenderer = RendererFactory;
}

export default Renderer;
export default RendererFactory;
41 changes: 41 additions & 0 deletions lib/renderer-factory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import Renderer from './renderer';
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, not an object.');
}

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}", is type "${card.type}"`);
}
if (!card.render) {
throw new Error(`Card "${card.name}" must define \`render\``);
}
}
}

export default class RendererFactory {
constructor({cards, atoms, cardOptions, unknownCardHandler}={}) {
cards = cards || [];
validateCards(cards);
atoms = atoms || [];
cardOptions = cardOptions || {};

this.state = { cards, atoms, cardOptions, unknownCardHandler };
}

render(mobiledoc) {
return new Renderer(mobiledoc, this.state).render();
}
}
Loading

0 comments on commit e6fd6fd

Please sign in to comment.