Skip to content

Commit

Permalink
Add versioning for Mobiledoc renderer, parser
Browse files Browse the repository at this point in the history
  • Loading branch information
mixonic committed Nov 19, 2015
1 parent 0aa068c commit 69a93e4
Show file tree
Hide file tree
Showing 13 changed files with 472 additions and 365 deletions.
8 changes: 4 additions & 4 deletions src/js/editor/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import ImageCard from '../cards/image';
import Key from '../utils/key';
import EventEmitter from '../utils/event-emitter';

import MobiledocParser from '../parsers/mobiledoc';
import mobiledocParsers from '../parsers/mobiledoc';
import HTMLParser from '../parsers/html';
import DOMParser from '../parsers/dom';
import Renderer from 'mobiledoc-kit/renderers/editor-dom';
import RenderTree from 'mobiledoc-kit/models/render-tree';
import MobiledocRenderer from '../renderers/mobiledoc';
import mobiledocRenderers from '../renderers/mobiledoc';

import { mergeWithOptions } from 'content-kit-utils';
import { clearChildNodes, addClassName } from '../utils/dom-utils';
Expand Down Expand Up @@ -104,7 +104,7 @@ class Editor {

loadPost() {
if (this.mobiledoc) {
return new MobiledocParser(this.builder).parse(this.mobiledoc);
return mobiledocParsers.parse(this.builder, this.mobiledoc);
} else if (this.html) {
if (typeof this.html === 'string') {
return new HTMLParser(this.builder).parse(this.html);
Expand Down Expand Up @@ -366,7 +366,7 @@ class Editor {
}

serialize() {
return MobiledocRenderer.render(this.post);
return mobiledocRenderers.render(this.post);
}

removeAllViews() {
Expand Down
4 changes: 2 additions & 2 deletions src/js/models/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { POST_TYPE } from './types';
import LinkedList from 'mobiledoc-kit/utils/linked-list';
import { forEach, compact } from 'mobiledoc-kit/utils/array-utils';
import Set from 'mobiledoc-kit/utils/set';
import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc';
import mobiledocRenderers from 'mobiledoc-kit/renderers/mobiledoc';

export default class Post {
constructor() {
Expand Down Expand Up @@ -227,6 +227,6 @@ export default class Post {
}
post.sections.append(newSection);
});
return MobiledocRenderer.render(post);
return mobiledocRenderers.render(post);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import {
MOBILEDOC_IMAGE_SECTION_TYPE,
MOBILEDOC_LIST_SECTION_TYPE,
MOBILEDOC_CARD_SECTION_TYPE
} from '../renderers/mobiledoc';
import { kvArrayToObject, filter } from "../utils/array-utils";
} from 'mobiledoc-kit/renderers/mobiledoc/0-2';
import { kvArrayToObject, filter } from "../../utils/array-utils";

/*
* Parses from mobiledoc -> post
Expand Down
17 changes: 17 additions & 0 deletions src/js/parsers/mobiledoc/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import MobiledocParser_0_2 from './0-2';

function parseVersion(mobiledoc) {
return mobiledoc.version;
}

export default {
parse(builder, mobiledoc) {
let version = parseVersion(mobiledoc);
switch (version) {
case '0.2.0':
return new MobiledocParser_0_2(builder).parse(mobiledoc);
default:
throw new Error(`Unknown version of mobiledoc parser requested: ${version}`);
}
}
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {visit, visitArray, compile} from '../utils/compiler';
import { objectToSortedKVArray } from '../utils/array-utils';
import {visit, visitArray, compile} from '../../utils/compiler';
import { objectToSortedKVArray } from '../../utils/array-utils';
import {
POST_TYPE,
MARKUP_SECTION_TYPE,
Expand All @@ -9,7 +9,7 @@ import {
MARKUP_TYPE,
IMAGE_SECTION_TYPE,
CARD_TYPE
} from '../models/types';
} from '../../models/types';

export const MOBILEDOC_VERSION = '0.2.0';
export const MOBILEDOC_MARKUP_SECTION_TYPE = 1;
Expand Down
16 changes: 16 additions & 0 deletions src/js/renderers/mobiledoc/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import MobiledocRenderer_0_2, { MOBILEDOC_VERSION } from './0-2';

export { MOBILEDOC_VERSION };

export default {
render(post, version) {
switch (version) {
case '0.2.0':
case undefined:
case null:
return MobiledocRenderer_0_2.render(post);
default:
throw new Error(`Unknown version of mobiledoc renderer requested: ${version}`);
}
}
};
4 changes: 2 additions & 2 deletions src/js/utils/paste-utils.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* global JSON */
import MobiledocParser from '../parsers/mobiledoc';
import mobiledocParsers from '../parsers/mobiledoc';
import HTMLParser from '../parsers/html';
import HTMLRenderer from 'mobiledoc-html-renderer';
import TextRenderer from 'mobiledoc-text-renderer';
Expand Down Expand Up @@ -31,7 +31,7 @@ export function parsePostFromPaste(pasteEvent, builder, cardParsers=[]) {
if (mobiledocRegex.test(html)) {
let mobiledocString = html.match(mobiledocRegex)[1];
mobiledoc = JSON.parse(mobiledocString);
post = new MobiledocParser(builder).parse(mobiledoc);
post = mobiledocParsers.parse(builder, mobiledoc);
} else {
post = new HTMLParser(builder, {cardParsers}).parse(html);
}
Expand Down
15 changes: 12 additions & 3 deletions tests/helpers/mobiledoc.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import PostAbstractHelpers from './post-abstract';
import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc';
import mobiledocRenderers from 'mobiledoc-kit/renderers/mobiledoc';
import MobiledocRenderer_0_2 from 'mobiledoc-kit/renderers/mobiledoc/0-2';

/*
* usage:
Expand All @@ -11,8 +12,16 @@ import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc';
* })
* )
*/
function build(treeFn) {
return MobiledocRenderer.render(PostAbstractHelpers.build(treeFn));
function build(treeFn, version) {
switch (version) {
case '0.2.0':
return MobiledocRenderer_0_2.render(PostAbstractHelpers.build(treeFn));
case undefined:
case null:
return mobiledocRenderers.render(PostAbstractHelpers.build(treeFn));
default:
throw new Error(`Unknown version of mobiledoc renderer requested: ${version}`);
}
}

export default {
Expand Down
4 changes: 3 additions & 1 deletion tests/unit/editor/editor-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,13 @@ test('useful error message when given invalid mobiledoc', (assert) => {
assert.throws(() => {
new Editor({mobiledoc: badMobiledoc}); // jshint ignore:line
}, /unable to parse.*mobiledoc/i);
});

test('useful error message when given bad version of mobiledoc', (assert) => {
let verybadMobiledoc = "not mobiledoc";
assert.throws(() => {
new Editor({mobiledoc: verybadMobiledoc}); // jshint ignore:line
}, /unable to parse.*mobiledoc/i);
}, /Unknown version of mobiledoc parser requested/i);
});

test('activeSections of a rendered blank mobiledoc is an empty array', (assert) => {
Expand Down
184 changes: 17 additions & 167 deletions tests/unit/parsers/mobiledoc-test.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import MobiledocParser from 'mobiledoc-kit/parsers/mobiledoc';
import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder';
import mobiledocParsers from 'mobiledoc-kit/parsers/mobiledoc';
import { MOBILEDOC_VERSION } from 'mobiledoc-kit/renderers/mobiledoc';
import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder';
import Helpers from '../../test-helpers';

const DATA_URL = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=";
const { module, test } = window.QUnit;

let parser, builder, post;
let builder, post;

function parse(mobiledoc) {
return mobiledocParsers.parse(builder, mobiledoc);
}

module('Unit: Parsers: Mobiledoc', {
beforeEach() {
builder = new PostNodeBuilder();
parser = new MobiledocParser(builder);
post = builder.createPost();
},
afterEach() {
parser = null;
builder = null;
post = null;
}
Expand All @@ -26,170 +28,18 @@ test('#parse empty doc returns an empty post', (assert) => {
sections: [[], []]
};

const parsed = parser.parse(mobiledoc);
const parsed = parse(mobiledoc);
assert.equal(parsed.sections.length, 0, '0 sections');
});

test('#parse empty markup section returns an empty post', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [[], [
[1, 'p', []]
]]
};

const section = builder.createMarkupSection('p');
post.sections.append(section);
assert.deepEqual(parser.parse(mobiledoc), post);
});

test('#parse doc without marker types', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [
[],
[[
1,'P', [[[], 0, 'hello world']]
]]
]
};
const parsed = parser.parse(mobiledoc);

let section = builder.createMarkupSection('P', [], false);
let marker = builder.createMarker('hello world');
section.markers.append(marker);
post.sections.append(section);

assert.deepEqual(
parsed,
post
);
});

test('#parse doc with blank marker', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [
[],
[[
1,'P', [[[], 0, '']]
]]
]
};
const parsed = parser.parse(mobiledoc);

let section = builder.createMarkupSection('P', [], false);
post.sections.append(section);

assert.deepEqual(
parsed,
post
);
});

test('#parse doc with marker type', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [
[
['B'],
['A', ['href', 'google.com']]
],
[[
1,'P', [
[[1], 0, 'hello'], // a tag open
[[0], 1, 'brave new'], // b tag open/close
[[], 1, 'world'] // a tag close
]
]]
]
};
const parsed = parser.parse(mobiledoc);

let section = builder.createMarkupSection('P', [], false);
let aMarkerType = builder.createMarkup('A', {href:'google.com'});
let bMarkerType = builder.createMarkup('B');

let markers = [
builder.createMarker('hello', [aMarkerType]),
builder.createMarker('brave new', [aMarkerType, bMarkerType]),
builder.createMarker('world', [aMarkerType])
];
markers.forEach(marker => section.markers.append(marker));
post.sections.append(section);

assert.deepEqual(
parsed,
post
);
});

test('#parse doc with image section', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [
[],
[
[2, DATA_URL]
]
]
};

const parsed = parser.parse(mobiledoc);

let section = builder.createImageSection(DATA_URL);
post.sections.append(section);
assert.deepEqual(
parsed,
post
);
});

test('#parse doc with custom card type', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [
[],
[
[10, 'custom-card', {}]
]
]
};

const parsed = parser.parse(mobiledoc);

let section = builder.createCardSection('custom-card');
post.sections.append(section);
assert.deepEqual(
parsed,
post
);
});

test('#parse a mobile doc with list-section and list-item', (assert) => {
const mobiledoc = {
version: MOBILEDOC_VERSION,
sections: [
[],
[
[3, 'ul', [
[[[], 0, "first item"]],
[[[], 0, "second item"]]
]]
]
]
};

const parsed = parser.parse(mobiledoc);
test('#parse basic mobiledoc from renderer works', (assert) => {
const mobiledoc = Helpers.mobiledoc.build(({post, markupSection, marker}) => {
return post([markupSection('p', [
marker('Howdy')
])]);
});

const items = [
builder.createListItem([builder.createMarker('first item')]),
builder.createListItem([builder.createMarker('second item')])
];
const section = builder.createListSection('ul', items);
post.sections.append(section);
assert.deepEqual(
parsed,
post
);
const parsed = parse(mobiledoc);
assert.equal(parsed.sections.length, 1, '1 section');
});
Loading

0 comments on commit 69a93e4

Please sign in to comment.