From c260725e6506adf64923cc343c407f1e4018c302 Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Wed, 17 May 2017 09:14:33 -0700 Subject: [PATCH] add support for skipping elements in html serializer, closes #821 --- History.md | 11 ++++++++++ src/serializers/html.js | 15 ++++++++------ .../html/deserialize/skip-element/index.js | 20 +++++++++++++++++++ .../html/deserialize/skip-element/input.html | 2 ++ .../html/deserialize/skip-element/output.yaml | 8 ++++++++ 5 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 test/serializers/fixtures/html/deserialize/skip-element/index.js create mode 100644 test/serializers/fixtures/html/deserialize/skip-element/input.html create mode 100644 test/serializers/fixtures/html/deserialize/skip-element/output.yaml diff --git a/History.md b/History.md index faee9aeec..1b36b3cbd 100644 --- a/History.md +++ b/History.md @@ -4,6 +4,17 @@ This document maintains a list of changes to Slate with each new version. Until --- + +### `0.20.0` — May 17, 2017 + +###### BREAKING CHANGES + +- **Returning `null` from the `Html` serializer skips the element.** Previously, `null` and `undefined` had the same behavior of skipping the rule and trying the rest of the rules. Now if you explicitly return `null` it will skip the element itself. + + +--- + + ### `0.19.0` — March 3, 2017 ###### BREAKING CHANGES diff --git a/src/serializers/html.js b/src/serializers/html.js index 134c6f21d..2bb912ed4 100644 --- a/src/serializers/html.js +++ b/src/serializers/html.js @@ -159,11 +159,6 @@ class Html { case 'object': nodes.push(node) break - case 'null': - case 'undefined': - return - default: - throw new Error(`A rule returned an invalid deserialized representation: "${node}".`) } }) @@ -196,8 +191,16 @@ class Html { for (const rule of this.rules) { if (!rule.deserialize) continue + const ret = rule.deserialize(element, next) - if (!ret) continue + if (ret === undefined) continue + if (ret === null) break + + const type = typeOf(ret) + if (type != 'array' && type != 'object') { + throw new Error(`A rule returned an invalid deserialized representation: "${node}".`) + } + node = ret.kind == 'mark' ? this.deserializeMark(ret) : ret break } diff --git a/test/serializers/fixtures/html/deserialize/skip-element/index.js b/test/serializers/fixtures/html/deserialize/skip-element/index.js new file mode 100644 index 000000000..6beb73d9d --- /dev/null +++ b/test/serializers/fixtures/html/deserialize/skip-element/index.js @@ -0,0 +1,20 @@ + +export default { + rules: [ + { + deserialize(el, next) { + if (el.tagName == 'div') { + return null + } + } + }, + { + deserialize(el, next) { + return { + kind: 'block', + type: 'paragraph', + } + } + }, + ] +} diff --git a/test/serializers/fixtures/html/deserialize/skip-element/input.html b/test/serializers/fixtures/html/deserialize/skip-element/input.html new file mode 100644 index 000000000..196f72ae8 --- /dev/null +++ b/test/serializers/fixtures/html/deserialize/skip-element/input.html @@ -0,0 +1,2 @@ +

+
diff --git a/test/serializers/fixtures/html/deserialize/skip-element/output.yaml b/test/serializers/fixtures/html/deserialize/skip-element/output.yaml new file mode 100644 index 000000000..a3397f7b2 --- /dev/null +++ b/test/serializers/fixtures/html/deserialize/skip-element/output.yaml @@ -0,0 +1,8 @@ + +data: {} +nodes: + - type: paragraph + isVoid: false + data: {} + nodes: + - characters: []