fix(compiler-sfc): template with alt lang should be parsed as raw text

fix #1120
This commit is contained in:
Evan You 2020-05-07 11:08:17 -04:00
parent e58beecc97
commit d10835aee7
2 changed files with 22 additions and 2 deletions

View File

@ -106,6 +106,16 @@ h1 { color: red }
expect(descriptor.template!.content).toBe(content) expect(descriptor.template!.content).toBe(content)
}) })
// #1120
test('alternative template lang should be treated as plain text', () => {
const content = `p(v-if="1 < 2") test`
const { descriptor, errors } = parse(
`<template lang="pug">` + content + `</template>`
)
expect(errors.length).toBe(0)
expect(descriptor.template!.content).toBe(content)
})
test('error tolerance', () => { test('error tolerance', () => {
const { errors } = parse(`<template>`) const { errors } = parse(`<template>`)
expect(errors.length).toBe(1) expect(errors.length).toBe(1)

View File

@ -96,10 +96,20 @@ export function parse(
isNativeTag: () => true, isNativeTag: () => true,
// preserve all whitespaces // preserve all whitespaces
isPreTag: () => true, isPreTag: () => true,
getTextMode: ({ tag }, parent) => { getTextMode: ({ tag, props }, parent) => {
// all top level elements except <template> are parsed as raw text // all top level elements except <template> are parsed as raw text
// containers // containers
if (!parent && tag !== 'template') { if (
(!parent && tag !== 'template') ||
// <template lang="xxx"> should also be treated as raw text
props.some(
p =>
p.type === NodeTypes.ATTRIBUTE &&
p.name === 'lang' &&
p.value &&
p.value.content !== 'html'
)
) {
return TextModes.RAWTEXT return TextModes.RAWTEXT
} else { } else {
return TextModes.DATA return TextModes.DATA