fix(compiler-core): consistently remove comment nodes for pre tags in production
close #2217
This commit is contained in:
parent
4d20ac8173
commit
f4119249f2
@ -384,6 +384,25 @@ describe('compiler: parse', () => {
|
|||||||
expect(astNoComment.children).toHaveLength(0)
|
expect(astNoComment.children).toHaveLength(0)
|
||||||
expect(astWithComments.children).toHaveLength(1)
|
expect(astWithComments.children).toHaveLength(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #2217
|
||||||
|
test('comments in the <pre> tag should be removed in production mode', () => {
|
||||||
|
__DEV__ = false
|
||||||
|
const rawText = `<p/><!-- foo --><p/>`
|
||||||
|
const ast = baseParse(`<pre>${rawText}</pre>`)
|
||||||
|
__DEV__ = true
|
||||||
|
|
||||||
|
expect((ast.children[0] as ElementNode).children).toMatchObject([
|
||||||
|
{
|
||||||
|
type: NodeTypes.ELEMENT,
|
||||||
|
tag: 'p'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: NodeTypes.ELEMENT,
|
||||||
|
tag: 'p'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Element', () => {
|
describe('Element', () => {
|
||||||
|
@ -198,48 +198,48 @@ function parseChildren(
|
|||||||
// (same as v2 whitespace: 'condense')
|
// (same as v2 whitespace: 'condense')
|
||||||
let removedWhitespace = false
|
let removedWhitespace = false
|
||||||
if (mode !== TextModes.RAWTEXT) {
|
if (mode !== TextModes.RAWTEXT) {
|
||||||
if (!context.inPre) {
|
for (let i = 0; i < nodes.length; i++) {
|
||||||
for (let i = 0; i < nodes.length; i++) {
|
const node = nodes[i]
|
||||||
const node = nodes[i]
|
if (!context.inPre && node.type === NodeTypes.TEXT) {
|
||||||
if (node.type === NodeTypes.TEXT) {
|
if (!/[^\t\r\n\f ]/.test(node.content)) {
|
||||||
if (!/[^\t\r\n\f ]/.test(node.content)) {
|
const prev = nodes[i - 1]
|
||||||
const prev = nodes[i - 1]
|
const next = nodes[i + 1]
|
||||||
const next = nodes[i + 1]
|
// If:
|
||||||
// If:
|
// - the whitespace is the first or last node, or:
|
||||||
// - the whitespace is the first or last node, or:
|
// - the whitespace is adjacent to a comment, or:
|
||||||
// - the whitespace is adjacent to a comment, or:
|
// - the whitespace is between two elements AND contains newline
|
||||||
// - the whitespace is between two elements AND contains newline
|
// Then the whitespace is ignored.
|
||||||
// Then the whitespace is ignored.
|
if (
|
||||||
if (
|
!prev ||
|
||||||
!prev ||
|
!next ||
|
||||||
!next ||
|
prev.type === NodeTypes.COMMENT ||
|
||||||
prev.type === NodeTypes.COMMENT ||
|
next.type === NodeTypes.COMMENT ||
|
||||||
next.type === NodeTypes.COMMENT ||
|
(prev.type === NodeTypes.ELEMENT &&
|
||||||
(prev.type === NodeTypes.ELEMENT &&
|
next.type === NodeTypes.ELEMENT &&
|
||||||
next.type === NodeTypes.ELEMENT &&
|
/[\r\n]/.test(node.content))
|
||||||
/[\r\n]/.test(node.content))
|
) {
|
||||||
) {
|
removedWhitespace = true
|
||||||
removedWhitespace = true
|
nodes[i] = null as any
|
||||||
nodes[i] = null as any
|
|
||||||
} else {
|
|
||||||
// Otherwise, condensed consecutive whitespace inside the text
|
|
||||||
// down to a single space
|
|
||||||
node.content = ' '
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ')
|
// Otherwise, condensed consecutive whitespace inside the text
|
||||||
|
// down to a single space
|
||||||
|
node.content = ' '
|
||||||
}
|
}
|
||||||
} else if (
|
} else {
|
||||||
!__DEV__ &&
|
node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ')
|
||||||
node.type === NodeTypes.COMMENT &&
|
|
||||||
!context.options.comments
|
|
||||||
) {
|
|
||||||
// remove comment nodes in prod by default
|
|
||||||
removedWhitespace = true
|
|
||||||
nodes[i] = null as any
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (parent && context.options.isPreTag(parent.tag)) {
|
// also remove comment nodes in prod by default
|
||||||
|
if (
|
||||||
|
!__DEV__ &&
|
||||||
|
node.type === NodeTypes.COMMENT &&
|
||||||
|
!context.options.comments
|
||||||
|
) {
|
||||||
|
removedWhitespace = true
|
||||||
|
nodes[i] = null as any
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (context.inPre && parent && context.options.isPreTag(parent.tag)) {
|
||||||
// remove leading newline per html spec
|
// remove leading newline per html spec
|
||||||
// https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element
|
// https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element
|
||||||
const first = nodes[0]
|
const first = nodes[0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user