diff --git a/packages/compiler-core/src/parse.ts b/packages/compiler-core/src/parse.ts index 1fbd7d5c24d..bb4e3e4a6a4 100644 --- a/packages/compiler-core/src/parse.ts +++ b/packages/compiler-core/src/parse.ts @@ -194,7 +194,7 @@ function parseChildren( for (let i = 0; i < nodes.length; i++) { const node = nodes[i] if (node.type === NodeTypes.TEXT) { - if (!node.content.trim()) { + if (!/[^\t\r\n\f ]/.test(node.content)) { const prev = nodes[i - 1] const next = nodes[i + 1] // If: @@ -219,7 +219,7 @@ function parseChildren( node.content = ' ' } } else { - node.content = node.content.replace(/\s+/g, ' ') + node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ') } } } diff --git a/packages/compiler-dom/__tests__/parse.spec.ts b/packages/compiler-dom/__tests__/parse.spec.ts index 8e88d14954c..73a27e205d5 100644 --- a/packages/compiler-dom/__tests__/parse.spec.ts +++ b/packages/compiler-dom/__tests__/parse.spec.ts @@ -8,9 +8,9 @@ import { InterpolationNode } from '@vue/compiler-core' import { - parserOptionsMinimal as parserOptions, + parserOptionsStandard as parserOptions, DOMNamespaces -} from '../src/parserOptionsMinimal' +} from '../src/parserOptionsStandard' describe('DOM parser', () => { describe('Text', () => { @@ -160,6 +160,16 @@ describe('DOM parser', () => { } ]) }) + + // #945 + test('  should not be condensed', () => { + const nbsp = String.fromCharCode(160) + const ast = parse(`foo  bar`, parserOptions) + expect(ast.children[0]).toMatchObject({ + type: NodeTypes.TEXT, + content: `foo${nbsp}${nbsp}bar` + }) + }) }) describe('Interpolation', () => { diff --git a/packages/compiler-dom/src/parserOptionsStandard.ts b/packages/compiler-dom/src/parserOptionsStandard.ts index 0fe9bfded0a..b0bb70e4e99 100644 --- a/packages/compiler-dom/src/parserOptionsStandard.ts +++ b/packages/compiler-dom/src/parserOptionsStandard.ts @@ -2,6 +2,8 @@ import { ParserOptions } from '@vue/compiler-core' import { parserOptionsMinimal } from './parserOptionsMinimal' import namedCharacterReferences from './namedChars.json' +export { DOMNamespaces } from './parserOptionsMinimal' + export const parserOptionsStandard: ParserOptions = { // extends the minimal options with more spec-compliant overrides ...parserOptionsMinimal,