diff --git a/.editorconfig b/.editorconfig index f7619b918..4e9bc9d67 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,3 +11,7 @@ trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false + +[*.txt] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/src/serializers/plain.js b/src/serializers/plain.js index 3425ab2d2..20407d962 100644 --- a/src/serializers/plain.js +++ b/src/serializers/plain.js @@ -1,4 +1,5 @@ +import Block from '../models/block' import Raw from '../serializers/raw' /** @@ -58,9 +59,6 @@ function serialize(state) { /** * Serialize a `node` to plain text. - * For blocks, or document, it recursively calls itself - * to aggregate the text. - * For other types of nodes, it uses the .text property * * @param {Node} node * @return {String} @@ -69,12 +67,9 @@ function serialize(state) { function serializeNode(node) { if ( (node.kind == 'document') || - (node.kind == 'block' && node.nodes.size > 0 && node.nodes.first().kind == 'block') + (node.kind == 'block' && Block.isBlockList(node.nodes)) ) { - return node.nodes - .map(n => serializeNode(n)) - .filter(text => text != '') - .join('\n') + return node.nodes.map(serializeNode).join('\n') } else { return node.text } diff --git a/test/serializers/fixtures/plain/serialize/block-multiple-empty/input.js b/test/serializers/fixtures/plain/serialize/block-multiple-empty/input.js new file mode 100644 index 000000000..a0f9dfbc7 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-multiple-empty/input.js @@ -0,0 +1,43 @@ + +import { Block, Character, Document, 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' }, + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList() + } + ]) + }, + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'h' }, + { text: 'r' }, + { text: 'e' }, + { text: 'e' }, + ]) + } + ]) + }, + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-multiple-empty/output.txt b/test/serializers/fixtures/plain/serialize/block-multiple-empty/output.txt new file mode 100644 index 000000000..426da033e --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-multiple-empty/output.txt @@ -0,0 +1,3 @@ +one + +three \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-multiple/input.js b/test/serializers/fixtures/plain/serialize/block-multiple/input.js new file mode 100644 index 000000000..d49dfc5cc --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-multiple/input.js @@ -0,0 +1,47 @@ + +import { Block, Character, Document, 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' }, + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'w' }, + { text: 'o' }, + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'h' }, + { text: 'r' }, + { text: 'e' }, + { text: 'e' }, + ]) + } + ]) + }, + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-nested/output.txt b/test/serializers/fixtures/plain/serialize/block-multiple/output.txt similarity index 61% rename from test/serializers/fixtures/plain/serialize/block-nested/output.txt rename to test/serializers/fixtures/plain/serialize/block-multiple/output.txt index 814f4a422..54d55bf0b 100644 --- a/test/serializers/fixtures/plain/serialize/block-nested/output.txt +++ b/test/serializers/fixtures/plain/serialize/block-multiple/output.txt @@ -1,2 +1,3 @@ one two +three \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-nested/input.js b/test/serializers/fixtures/plain/serialize/block-nested-multiple-empty/input.js similarity index 53% rename from test/serializers/fixtures/plain/serialize/block-nested/input.js rename to test/serializers/fixtures/plain/serialize/block-nested-multiple-empty/input.js index b39a58392..c412525fa 100644 --- a/test/serializers/fixtures/plain/serialize/block-nested/input.js +++ b/test/serializers/fixtures/plain/serialize/block-nested-multiple-empty/input.js @@ -1,5 +1,5 @@ -import { Block, Character, Document, Inline, Mark, State, Text } from '../../../../../..' +import { Block, Character, Document, State, Text } from '../../../../../..' export default State.create({ document: Document.create({ @@ -37,6 +37,37 @@ export default State.create({ ]) } ]) + }, + { + type: 'quote', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList() + } + ]) + }, + { + type: 'paragraph', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'f' }, + { text: 'o' }, + { text: 'u' }, + { text: 'r' }, + ]) + } + ]) + } + ]) + } + ]) } ]) }) diff --git a/test/serializers/fixtures/plain/serialize/block-nested-multiple-empty/output.txt b/test/serializers/fixtures/plain/serialize/block-nested-multiple-empty/output.txt new file mode 100644 index 000000000..4e01e2a30 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested-multiple-empty/output.txt @@ -0,0 +1,4 @@ +one +two + +four \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-nested-multiple/input.js b/test/serializers/fixtures/plain/serialize/block-nested-multiple/input.js new file mode 100644 index 000000000..7d1fe7b79 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested-multiple/input.js @@ -0,0 +1,80 @@ + +import { Block, Character, Document, 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' } + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'w' }, + { text: 'o' } + ]) + } + ]) + } + ]) + } + ]) + }, + { + type: 'quote', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'h' }, + { text: 'r' }, + { text: 'e' }, + { text: 'e' }, + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'f' }, + { text: 'o' }, + { text: 'u' }, + { text: 'r' }, + ]) + } + ]) + } + ]) + } + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-nested-multiple/output.txt b/test/serializers/fixtures/plain/serialize/block-nested-multiple/output.txt new file mode 100644 index 000000000..c40a3bdda --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested-multiple/output.txt @@ -0,0 +1,4 @@ +one +two +three +four \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-nested-nested-multiple/input.js b/test/serializers/fixtures/plain/serialize/block-nested-nested-multiple/input.js new file mode 100644 index 000000000..eea973618 --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested-nested-multiple/input.js @@ -0,0 +1,90 @@ + +import { Block, Character, Document, State, Text } from '../../../../../..' + +export default State.create({ + document: Document.create({ + nodes: Block.createList([ + { + type: 'quote', + nodes: Block.createList([ + { + type: 'quote', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'o' }, + { text: 'n' }, + { text: 'e' }, + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'w' }, + { text: 'o' }, + ]) + } + ]) + } + ]) + }, + ]) + }, + { + type: 'quote', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 't' }, + { text: 'h' }, + { text: 'r' }, + { text: 'e' }, + { text: 'e' }, + ]) + } + ]) + } + ]) + }, + { + type: 'paragraph', + nodes: Block.createList([ + { + type: 'paragraph', + nodes: Text.createList([ + { + characters: Character.createList([ + { text: 'f' }, + { text: 'o' }, + { text: 'u' }, + { text: 'r' }, + ]) + } + ]) + } + ]) + }, + ]) + }, + ]) + } + ]) + }) +}) diff --git a/test/serializers/fixtures/plain/serialize/block-nested-nested-multiple/output.txt b/test/serializers/fixtures/plain/serialize/block-nested-nested-multiple/output.txt new file mode 100644 index 000000000..c40a3bdda --- /dev/null +++ b/test/serializers/fixtures/plain/serialize/block-nested-nested-multiple/output.txt @@ -0,0 +1,4 @@ +one +two +three +four \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-nested-with-inline-nested/output.txt b/test/serializers/fixtures/plain/serialize/block-nested-with-inline-nested/output.txt index 814f4a422..9ed40b442 100644 --- a/test/serializers/fixtures/plain/serialize/block-nested-with-inline-nested/output.txt +++ b/test/serializers/fixtures/plain/serialize/block-nested-with-inline-nested/output.txt @@ -1,2 +1,2 @@ one -two +two \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-nested-with-inlines/output.txt b/test/serializers/fixtures/plain/serialize/block-nested-with-inlines/output.txt index 1d202cae0..3386842c9 100644 --- a/test/serializers/fixtures/plain/serialize/block-nested-with-inlines/output.txt +++ b/test/serializers/fixtures/plain/serialize/block-nested-with-inlines/output.txt @@ -1 +1 @@ -onetwo +onetwo \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block-with-data/output.txt b/test/serializers/fixtures/plain/serialize/block-with-data/output.txt index 5626abf0f..43dd47ea6 100644 --- a/test/serializers/fixtures/plain/serialize/block-with-data/output.txt +++ b/test/serializers/fixtures/plain/serialize/block-with-data/output.txt @@ -1 +1 @@ -one +one \ No newline at end of file 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 index 8d1c8b69c..0519ecba6 100644 --- a/test/serializers/fixtures/plain/serialize/block-with-is-void/output.txt +++ b/test/serializers/fixtures/plain/serialize/block-with-is-void/output.txt @@ -1 +1 @@ - + \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/block/output.txt b/test/serializers/fixtures/plain/serialize/block/output.txt index 5626abf0f..43dd47ea6 100644 --- a/test/serializers/fixtures/plain/serialize/block/output.txt +++ b/test/serializers/fixtures/plain/serialize/block/output.txt @@ -1 +1 @@ -one +one \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt b/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt index 5626abf0f..43dd47ea6 100644 --- a/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt +++ b/test/serializers/fixtures/plain/serialize/character-with-mark/output.txt @@ -1 +1 @@ -one +one \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/inline-nested/output.txt b/test/serializers/fixtures/plain/serialize/inline-nested/output.txt index 5626abf0f..43dd47ea6 100644 --- a/test/serializers/fixtures/plain/serialize/inline-nested/output.txt +++ b/test/serializers/fixtures/plain/serialize/inline-nested/output.txt @@ -1 +1 @@ -one +one \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt b/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt index 5626abf0f..43dd47ea6 100644 --- a/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt +++ b/test/serializers/fixtures/plain/serialize/inline-with-data/output.txt @@ -1 +1 @@ -one +one \ No newline at end of file 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 index 8d1c8b69c..0519ecba6 100644 --- a/test/serializers/fixtures/plain/serialize/inline-with-is-void/output.txt +++ b/test/serializers/fixtures/plain/serialize/inline-with-is-void/output.txt @@ -1 +1 @@ - + \ No newline at end of file diff --git a/test/serializers/fixtures/plain/serialize/inline/output.txt b/test/serializers/fixtures/plain/serialize/inline/output.txt index 5626abf0f..43dd47ea6 100644 --- a/test/serializers/fixtures/plain/serialize/inline/output.txt +++ b/test/serializers/fixtures/plain/serialize/inline/output.txt @@ -1 +1 @@ -one +one \ No newline at end of file diff --git a/test/serializers/index.js b/test/serializers/index.js index 93a1d3d28..c17bd35d4 100644 --- a/test/serializers/index.js +++ b/test/serializers/index.js @@ -173,7 +173,7 @@ describe('serializers', () => { const input = require(resolve(innerDir, 'input.js')).default const expected = fs.readFileSync(resolve(innerDir, 'output.txt'), 'utf8') const serialized = Plain.serialize(input) - assert.deepEqual(serialized, expected.replace(/\n$/m, '')) + assert.deepEqual(serialized, expected) }) } })