Skip to content

Commit c2ca390

Browse files
committed
template parser should trim empty textNodes from <template> nodes
1 parent 4cc58b4 commit c2ca390

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

src/parsers/template.js

+3
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ function nodeToFragment (node) {
124124
_.isTemplate(node) &&
125125
node.content instanceof DocumentFragment
126126
) {
127+
_.trimNode(node.content)
127128
return node.content
128129
}
129130
// script template
@@ -139,6 +140,7 @@ function nodeToFragment (node) {
139140
/* eslint-enable no-cond-assign */
140141
frag.appendChild(child)
141142
}
143+
_.trimNode(frag)
142144
return frag
143145
}
144146

@@ -231,6 +233,7 @@ exports.parse = function (template, clone, noSelector) {
231233
// if the template is already a document fragment,
232234
// do nothing
233235
if (template instanceof DocumentFragment) {
236+
_.trimNode(template)
234237
return clone
235238
? exports.clone(template)
236239
: template

src/util/dom.js

+14-4
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,7 @@ exports.extractContent = function (el, asFragment) {
204204
el = el.content
205205
}
206206
if (el.hasChildNodes()) {
207-
trim(el, el.firstChild)
208-
trim(el, el.lastChild)
207+
exports.trimNode(el)
209208
rawContent = asFragment
210209
? document.createDocumentFragment()
211210
: document.createElement('div')
@@ -218,9 +217,20 @@ exports.extractContent = function (el, asFragment) {
218217
return rawContent
219218
}
220219

221-
function trim (content, node) {
220+
/**
221+
* Trim possible empty head/tail textNodes inside a parent.
222+
*
223+
* @param {Node} node
224+
*/
225+
226+
exports.trimNode = function (node) {
227+
trim(node, node.firstChild)
228+
trim(node, node.lastChild)
229+
}
230+
231+
function trim (parent, node) {
222232
if (node && node.nodeType === 3 && !node.data.trim()) {
223-
content.removeChild(node)
233+
parent.removeChild(node)
224234
}
225235
}
226236

test/unit/specs/parsers/template_spec.js

+13
Original file line numberDiff line numberDiff line change
@@ -143,5 +143,18 @@ if (_.inBrowser) {
143143
var c = templateParser.clone(t)
144144
expect(c.value).toBe('')
145145
})
146+
147+
it('should trim empty text nodes', function () {
148+
// string
149+
var res = templateParser.parse(' <p>test</p> ')
150+
expect(res.childNodes.length).toBe(1)
151+
expect(res.firstChild.tagName).toBe('P')
152+
// nodes
153+
var el = document.createElement('div')
154+
el.innerHTML = '<template> <p>test</p> </template>'
155+
res = templateParser.parse(el.children[0])
156+
expect(res.childNodes.length).toBe(1)
157+
expect(res.firstChild.tagName).toBe('P')
158+
})
146159
})
147160
}

0 commit comments

Comments
 (0)