diff --git a/src/js/models/marker.js b/src/js/models/marker.js index a3fc15d3f..e418651d5 100644 --- a/src/js/models/marker.js +++ b/src/js/models/marker.js @@ -1,9 +1,14 @@ export const MARKUP_TYPES = ['b', 'a', 'i', 'em', 'strong']; +const MARKER_TYPE = 'marker'; -export default class Marker { +import { detect } from 'content-kit-editor/utils/array-utils'; + +const Marker = class Marker { constructor(value='', markups=[]) { this.value = value; this.markups = []; + this.type = MARKER_TYPE; + markups.forEach(m => this.addMarkup(m)); } @@ -39,11 +44,7 @@ export default class Marker { } hasMarkup(type) { - for (let i=0; i markup.type === type); } getMarkup(type) { @@ -67,4 +68,6 @@ export default class Marker { return [m1, m2]; } -} +}; + +export default Marker; diff --git a/src/js/parsers/post.js b/src/js/parsers/post.js new file mode 100644 index 000000000..850fde289 --- /dev/null +++ b/src/js/parsers/post.js @@ -0,0 +1,15 @@ +import Post from 'content-kit-editor/models/post'; +import SectionParser from 'content-kit-editor/parsers/section'; +import { forEach } from 'content-kit-editor/utils/array-utils'; + +export default { + parse(element) { + const post = new Post(); + + forEach(element.childNodes, child => { + post.appendSection(SectionParser.parse(child)); + }); + + return post; + } +}; diff --git a/src/js/parsers/section.js b/src/js/parsers/section.js index 300a5c6ec..e674ce836 100644 --- a/src/js/parsers/section.js +++ b/src/js/parsers/section.js @@ -12,6 +12,11 @@ import { MARKUP_TYPES } from 'content-kit-editor/models/marker'; import { getAttributes } from 'content-kit-editor/utils/dom-utils'; import { forEach } from 'content-kit-editor/utils/array-utils'; +/** + * parses an element into a section, ignoring any non-markup + * elements contained within + * @return {Section} + */ export default { parse(element) { if (!this.isSectionElement(element)) { diff --git a/tests/unit/parsers/post-test.js b/tests/unit/parsers/post-test.js new file mode 100644 index 000000000..0bb8f69c4 --- /dev/null +++ b/tests/unit/parsers/post-test.js @@ -0,0 +1,61 @@ +const {module, test} = QUnit; + +import PostParser from 'content-kit-editor/parsers/post'; +import Helpers from '../../test-helpers'; + +module('Unit: Parser: PostParser'); + +test('#parse can parse a single text node', (assert) => { + let element = Helpers.dom.makeDOM(t => + t('div', {}, [t.text('some text')]) + ); + + const post = PostParser.parse(element); + assert.ok(post, 'gets post'); + assert.equal(post.sections.length, 1, 'has 1 section'); + + const s1 = post.sections[0]; + assert.equal(s1.markers.length, 1, 's1 has 1 marker'); + assert.equal(s1.markers[0].value, 'some text', 'has text'); +}); + +test('#parse can parse a section element', (assert) => { + let element = Helpers.dom.makeDOM(t => + t('div', {}, [ + t('p', {}, [ + t.text('some text') + ]) + ]) + ); + + const post = PostParser.parse(element); + assert.ok(post, 'gets post'); + assert.equal(post.sections.length, 1, 'has 1 section'); + + const s1 = post.sections[0]; + assert.equal(s1.markers.length, 1, 's1 has 1 marker'); + assert.equal(s1.markers[0].value, 'some text', 'has text'); +}); + +test('#parse can parse multiple elements', (assert) => { + let element = Helpers.dom.makeDOM(t => + t('div', {}, [ + t('p', {}, [ + t.text('some text') + ]), + t.text('some other text') + ]) + ); + + const post = PostParser.parse(element); + assert.ok(post, 'gets post'); + assert.equal(post.sections.length, 2, 'has 2 sections'); + + const [s1, s2] = post.sections; + assert.equal(s1.markers.length, 1, 's1 has 1 marker'); + assert.equal(s1.markers[0].value, 'some text'); + + assert.equal(s2.markers.length, 1, 's2 has 1 marker'); + assert.equal(s2.markers[0].value, 'some other text'); +}); +