diff --git a/lib/serializers/plain.js b/lib/serializers/plain.js index 6e73be23a..d6553d0f9 100644 --- a/lib/serializers/plain.js +++ b/lib/serializers/plain.js @@ -12,19 +12,40 @@ import Text from '../models/text' */ function deserialize(string) { - const characters = string.split('').map(char => { - return { text: char } + return State.create({ + document: Document.create({ + nodes: string.split('\n').map(deserializeLine) + }) }) +} - const text = Text.create({ characters }) - const block = Block.create({ - type: 'paragraph', - nodes: [text] +/** + * Deserialize a `line` of text. + * + * @param {String} line + * @return {Block} + */ + +function deserializeLine(line) { + return Block.create({ + type: 'line', + nodes: [ + Text.create({ + characters: line.split('').map(deserializeCharacter) + }) + ] }) +} - const document = Document.create({ nodes: [block] }) - const state = State.create({ document }) - return state +/** + * Deserialize a `character`. + * + * @param {String} char + * @return {Character} + */ + +function deserializeCharacter(char) { + return { text: char } } /** @@ -35,7 +56,7 @@ function deserialize(string) { */ function serialize(state) { - return state.blocks + return state.document.nodes .map(block => block.text) .join('\n') } diff --git a/test/serializers/fixtures/plain/deserialize/line-multiple/input.txt b/test/serializers/fixtures/plain/deserialize/line-multiple/input.txt new file mode 100644 index 000000000..814f4a422 --- /dev/null +++ b/test/serializers/fixtures/plain/deserialize/line-multiple/input.txt @@ -0,0 +1,2 @@ +one +two diff --git a/test/serializers/fixtures/plain/deserialize/line-multiple/output.yaml b/test/serializers/fixtures/plain/deserialize/line-multiple/output.yaml new file mode 100644 index 000000000..92feeb780 --- /dev/null +++ b/test/serializers/fixtures/plain/deserialize/line-multiple/output.yaml @@ -0,0 +1,24 @@ + +nodes: + - type: line + isVoid: false + data: {} + nodes: + - characters: + - text: o + marks: [] + - text: n + marks: [] + - text: e + marks: [] + - type: line + isVoid: false + data: {} + nodes: + - characters: + - text: t + marks: [] + - text: w + marks: [] + - text: o + marks: [] diff --git a/test/serializers/fixtures/plain/deserialize/line/input.txt b/test/serializers/fixtures/plain/deserialize/line/input.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/deserialize/line/input.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/deserialize/line/output.yaml b/test/serializers/fixtures/plain/deserialize/line/output.yaml new file mode 100644 index 000000000..bb67aa58f --- /dev/null +++ b/test/serializers/fixtures/plain/deserialize/line/output.yaml @@ -0,0 +1,13 @@ + +nodes: + - type: line + isVoid: false + data: {} + nodes: + - characters: + - text: o + marks: [] + - text: n + marks: [] + - text: e + marks: [] diff --git a/test/serializers/fixtures/plain/serialize/block-nested/input.js b/test/serializers/fixtures/plain/serialize/block-nested/input.js new file mode 100644 index 000000000..3e88fa872 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested/input.js @@ -0,0 +1,26 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'quote', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-nested/output.txt b/test/serializers/fixtures/plain/serialize/block-nested/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/serialize/block-with-data/input.js b/test/serializers/fixtures/plain/serialize/block-with-data/input.js new file mode 100644 index 000000000..837db3ff5 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-with-data/input.js @@ -0,0 +1,22 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + data: { key: 'value' }, + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-with-data/output.txt b/test/serializers/fixtures/plain/serialize/block-with-data/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-with-data/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/serialize/block-with-is-void/input.js b/test/serializers/fixtures/plain/serialize/block-with-is-void/input.js new file mode 100644 index 000000000..c2ca20cba --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-with-is-void/input.js @@ -0,0 +1,22 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + isVoid: true, + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-with-is-void/output.txt b/test/serializers/fixtures/plain/serialize/block-with-is-void/output.txt new file mode 100644 index 000000000..e69de29bb diff --git a/test/serializers/fixtures/plain/serialize/block/input.js b/test/serializers/fixtures/plain/serialize/block/input.js new file mode 100644 index 000000000..f4264b3b0 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block/input.js @@ -0,0 +1,21 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block/output.txt b/test/serializers/fixtures/plain/serialize/block/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/serialize/character-with-mark/input.js b/test/serializers/fixtures/plain/serialize/character-with-mark/input.js new file mode 100644 index 000000000..36cfdff18 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/character-with-mark/input.js @@ -0,0 +1,28 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { + text: 'e', + marks: Mark.createSet([ + { + type: 'bold' + } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt b/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/serialize/inline-nested/input.js b/test/serializers/fixtures/plain/serialize/inline-nested/input.js new file mode 100644 index 000000000..b0b7477bb --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline-nested/input.js @@ -0,0 +1,31 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Inline.createList([ + { + type: 'link', + nodes: Inline.createList([ + { + type: 'hashtag', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/inline-nested/output.txt b/test/serializers/fixtures/plain/serialize/inline-nested/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline-nested/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/serialize/inline-with-data/input.js b/test/serializers/fixtures/plain/serialize/inline-with-data/input.js new file mode 100644 index 000000000..f820cc7eb --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline-with-data/input.js @@ -0,0 +1,27 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Inline.createList([ + { + type: 'link', + data: { key: 'value' }, + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt b/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/fixtures/plain/serialize/inline-with-is-void/input.js b/test/serializers/fixtures/plain/serialize/inline-with-is-void/input.js new file mode 100644 index 000000000..883cbd4e1 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline-with-is-void/input.js @@ -0,0 +1,27 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Inline.createList([ + { + type: 'link', + isVoid: true, + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/inline-with-is-void/output.txt b/test/serializers/fixtures/plain/serialize/inline-with-is-void/output.txt new file mode 100644 index 000000000..e69de29bb diff --git a/test/serializers/fixtures/plain/serialize/inline/input.js b/test/serializers/fixtures/plain/serialize/inline/input.js new file mode 100644 index 000000000..ed3cf91e2 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline/input.js @@ -0,0 +1,26 @@ + +import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Inline.createList([ + { + type: 'link', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/inline/output.txt b/test/serializers/fixtures/plain/serialize/inline/output.txt new file mode 100644 index 000000000..5626abf0f --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/inline/output.txt @@ -0,0 +1 @@ +one diff --git a/test/serializers/index.js b/test/serializers/index.js index e358873ad..574f0b616 100644 --- a/test/serializers/index.js +++ b/test/serializers/index.js @@ -11,9 +11,32 @@ import { resolve } from 'path' */ const SERIALIZERS = { - html: Html, - plain: Plain, - raw: Raw + + html: (dir) => { + const module = require(dir) + const html = new Html(module) + return { + extension: 'html', + deserialize: html.deserialize, + serialize: html.serialize, + read: file => fs.readFileSync(file, 'utf8').trim() + } + }, + + plain: (dir) => ({ + extension: 'txt', + deserialize: Plain.deserialize, + serialize: Plain.serialize, + read: file => fs.readFileSync(file, 'utf8').trim() + }), + + raw: (dir) => ({ + extension: 'yaml', + deserialize: Raw.deserialize, + serialize: Raw.serialize, + read: file => readMetadata.sync(file) + }) + } /** @@ -32,9 +55,10 @@ describe('serializers', () => { for (const test of tests) { it(test, () => { const innerDir = resolve(dir, test) - const input = readMetadata.sync(resolve(innerDir, 'input.yaml')) + const Serializer = SERIALIZERS[serializer](innerDir) + const expected = readMetadata.sync(resolve(innerDir, 'output.yaml')) - const Serializer = SERIALIZERS[serializer] + const input = Serializer.read(resolve(innerDir, `input.${Serializer.extension}`)) const state = Serializer.deserialize(input) const json = state.document.toJS() strictEqual(clean(json), expected) @@ -49,10 +73,12 @@ describe('serializers', () => { for (const test of tests) { it(test, () => { const innerDir = resolve(dir, test) + const Serializer = SERIALIZERS[serializer](innerDir) + const input = require(resolve(innerDir, 'input.js')).default - const expected = readMetadata.sync(resolve(innerDir, 'output.yaml')) - const Serializer = SERIALIZERS[serializer] + const expected = Serializer.read(resolve(innerDir, `output.${Serializer.extension}`)) const serialized = Serializer.serialize(input) + debugger strictEqual(serialized, expected) }) }