Skip to content

Commit

Permalink
fix(compiler-core): consistently remove comment nodes for pre tags in…
Browse files Browse the repository at this point in the history
… production

close #2217
  • Loading branch information
yyx990803 committed Oct 5, 2020
1 parent 4d20ac8 commit f411924
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 38 deletions.
19 changes: 19 additions & 0 deletions packages/compiler-core/__tests__/parse.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,25 @@ describe('compiler: parse', () => {
expect(astNoComment.children).toHaveLength(0)
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', () => {
Expand Down
76 changes: 38 additions & 38 deletions packages/compiler-core/src/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -198,48 +198,48 @@ function parseChildren(
// (same as v2 whitespace: 'condense')
let removedWhitespace = false
if (mode !== TextModes.RAWTEXT) {
if (!context.inPre) {
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i]
if (node.type === NodeTypes.TEXT) {
if (!/[^\t\r\n\f ]/.test(node.content)) {
const prev = nodes[i - 1]
const next = nodes[i + 1]
// If:
// - the whitespace is the first or last node, or:
// - the whitespace is adjacent to a comment, or:
// - the whitespace is between two elements AND contains newline
// Then the whitespace is ignored.
if (
!prev ||
!next ||
prev.type === NodeTypes.COMMENT ||
next.type === NodeTypes.COMMENT ||
(prev.type === NodeTypes.ELEMENT &&
next.type === NodeTypes.ELEMENT &&
/[\r\n]/.test(node.content))
) {
removedWhitespace = true
nodes[i] = null as any
} else {
// Otherwise, condensed consecutive whitespace inside the text
// down to a single space
node.content = ' '
}
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i]
if (!context.inPre && node.type === NodeTypes.TEXT) {
if (!/[^\t\r\n\f ]/.test(node.content)) {
const prev = nodes[i - 1]
const next = nodes[i + 1]
// If:
// - the whitespace is the first or last node, or:
// - the whitespace is adjacent to a comment, or:
// - the whitespace is between two elements AND contains newline
// Then the whitespace is ignored.
if (
!prev ||
!next ||
prev.type === NodeTypes.COMMENT ||
next.type === NodeTypes.COMMENT ||
(prev.type === NodeTypes.ELEMENT &&
next.type === NodeTypes.ELEMENT &&
/[\r\n]/.test(node.content))
) {
removedWhitespace = true
nodes[i] = null as any
} 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 (
!__DEV__ &&
node.type === NodeTypes.COMMENT &&
!context.options.comments
) {
// remove comment nodes in prod by default
removedWhitespace = true
nodes[i] = null as any
} else {
node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ')
}
}
} 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
// https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element
const first = nodes[0]
Expand Down

0 comments on commit f411924

Please sign in to comment.