From 1fd3df0fde87efdcfca79060c8d588ba09735cab Mon Sep 17 00:00:00 2001 From: alessandro ludovici Date: Wed, 1 Oct 2014 15:30:28 +0100 Subject: [PATCH 1/3] Do not insert BR in empty inline elements when parent node contains text --- .../html/ensure-selectable-containers.js | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/plugins/core/formatters/html/ensure-selectable-containers.js b/src/plugins/core/formatters/html/ensure-selectable-containers.js index aa5672fb..59c8f0b1 100644 --- a/src/plugins/core/formatters/html/ensure-selectable-containers.js +++ b/src/plugins/core/formatters/html/ensure-selectable-containers.js @@ -16,6 +16,12 @@ define([ // http://www.w3.org/TR/html-markup/syntax.html#syntax-elements var html5VoidElements = ['AREA', 'BASE', 'BR', 'COL', 'COMMAND', 'EMBED', 'HR', 'IMG', 'INPUT', 'KEYGEN', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR']; + var inlineElements = ['B', 'I']; + + function parentHasNoTextContent(node) { + return node.parentNode.textContent.trim() === ''; + } + function traverse(parentNode) { // Instead of TreeWalker, which gets confused when the BR is added to the dom, @@ -24,9 +30,17 @@ define([ var node = parentNode.firstElementChild; function isEmpty(node) { - return node.children.length === 0 - || (node.children.length === 1 - && element.isSelectionMarkerNode(node.children[0])); + if ((node.children.length === 0 && !contains(inlineElements, node.nodeName)) + || (node.children.length === 1 && element.isSelectionMarkerNode(node.children[0]))) { + return true; + } + + // Do not insert BR in empty inline elements with parent containing text + if (contains(inlineElements, node.nodeName) && node.children.length === 0) { + return parentHasNoTextContent(node); + } + + return false; } while (node) { From bb932c81c9fedb284b592c25f80efcbe37a68a92 Mon Sep 17 00:00:00 2001 From: alessandro ludovici Date: Wed, 1 Oct 2014 16:30:22 +0100 Subject: [PATCH 2/3] Use scribe-common to check for allowed empty elements --- bower.json | 2 +- package.json | 2 +- .../core/formatters/html/ensure-selectable-containers.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bower.json b/bower.json index 6e2c872b..4bdf6add 100644 --- a/bower.json +++ b/bower.json @@ -2,7 +2,7 @@ "name": "scribe", "dependencies": { "lodash-amd": "2.4.1", - "scribe-common": "0.0.4" + "scribe-common": "0.0.7" }, "devDependencies": { "requirejs": "~2.1.9", diff --git a/package.json b/package.json index 0754d620..125c5b82 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "src/scribe.js", "dependencies": { "lodash-amd": "~2.4.1", - "scribe-common": "~0.0.4" + "scribe-common": "~0.0.7" }, "devDependencies": { "chai": "~1.9.1", diff --git a/src/plugins/core/formatters/html/ensure-selectable-containers.js b/src/plugins/core/formatters/html/ensure-selectable-containers.js index 59c8f0b1..82f552ce 100644 --- a/src/plugins/core/formatters/html/ensure-selectable-containers.js +++ b/src/plugins/core/formatters/html/ensure-selectable-containers.js @@ -16,7 +16,6 @@ define([ // http://www.w3.org/TR/html-markup/syntax.html#syntax-elements var html5VoidElements = ['AREA', 'BASE', 'BR', 'COL', 'COMMAND', 'EMBED', 'HR', 'IMG', 'INPUT', 'KEYGEN', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR']; - var inlineElements = ['B', 'I']; function parentHasNoTextContent(node) { return node.parentNode.textContent.trim() === ''; @@ -30,13 +29,14 @@ define([ var node = parentNode.firstElementChild; function isEmpty(node) { - if ((node.children.length === 0 && !contains(inlineElements, node.nodeName)) + + if ((node.children.length === 0 && !element.isAllowedEmptyElement(node)) || (node.children.length === 1 && element.isSelectionMarkerNode(node.children[0]))) { return true; } // Do not insert BR in empty inline elements with parent containing text - if (contains(inlineElements, node.nodeName) && node.children.length === 0) { + if (element.isAllowedEmptyElement(node) && node.children.length === 0) { return parentHasNoTextContent(node); } From bd3ca47384535f9e5490d45fb7f7f5b7ca2c59e8 Mon Sep 17 00:00:00 2001 From: alessandro ludovici Date: Thu, 2 Oct 2014 10:04:28 +0100 Subject: [PATCH 3/3] Scribe-common version updated --- bower.json | 2 +- package.json | 2 +- .../formatters/html/ensure-selectable-containers.js | 12 ++++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/bower.json b/bower.json index 4bdf6add..9206c74b 100644 --- a/bower.json +++ b/bower.json @@ -2,7 +2,7 @@ "name": "scribe", "dependencies": { "lodash-amd": "2.4.1", - "scribe-common": "0.0.7" + "scribe-common": "0.0.11" }, "devDependencies": { "requirejs": "~2.1.9", diff --git a/package.json b/package.json index 125c5b82..3c037538 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "src/scribe.js", "dependencies": { "lodash-amd": "~2.4.1", - "scribe-common": "~0.0.7" + "scribe-common": "~0.0.11" }, "devDependencies": { "chai": "~1.9.1", diff --git a/src/plugins/core/formatters/html/ensure-selectable-containers.js b/src/plugins/core/formatters/html/ensure-selectable-containers.js index 82f552ce..6a64cef2 100644 --- a/src/plugins/core/formatters/html/ensure-selectable-containers.js +++ b/src/plugins/core/formatters/html/ensure-selectable-containers.js @@ -18,7 +18,11 @@ define([ var html5VoidElements = ['AREA', 'BASE', 'BR', 'COL', 'COMMAND', 'EMBED', 'HR', 'IMG', 'INPUT', 'KEYGEN', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR']; function parentHasNoTextContent(node) { - return node.parentNode.textContent.trim() === ''; + if (element.isCaretPositionNode(node)) { + return true; + } else { + return node.parentNode.textContent.trim() === ''; + } } @@ -30,13 +34,13 @@ define([ function isEmpty(node) { - if ((node.children.length === 0 && !element.isAllowedEmptyElement(node)) + if ((node.children.length === 0 && element.isBlockElement(node)) || (node.children.length === 1 && element.isSelectionMarkerNode(node.children[0]))) { return true; } - // Do not insert BR in empty inline elements with parent containing text - if (element.isAllowedEmptyElement(node) && node.children.length === 0) { + // Do not insert BR in empty non block elements with parent containing text + if (!element.isBlockElement(node) && node.children.length === 0) { return parentHasNoTextContent(node); }