Просмотр исходного кода

feat(compiler): support deindent: false in vue-template-compiler (#7215)

close #7054
Zhenfei You 7 лет назад
Родитель
Сommit
bf0efb02b1
2 измененных файлов с 31 добавлено и 1 удалено
  1. 4 1
      src/sfc/parser.js
  2. 27 0
      test/unit/modules/sfc/sfc-parser.spec.js

+ 4 - 1
src/sfc/parser.js

@@ -83,7 +83,10 @@ export function parseComponent (
   function end (tag: string, start: number) {
     if (depth === 1 && currentBlock) {
       currentBlock.end = start
-      let text = deindent(content.slice(currentBlock.start, currentBlock.end))
+      let text = content.slice(currentBlock.start, currentBlock.end)
+      if (options.deindent !== false) {
+        text = deindent(text)
+      }
       // pad content so that linters and pre-processors can output correct
       // line numbers in errors and warnings
       if (currentBlock.type !== 'template' && options.pad) {

+ 27 - 0
test/unit/modules/sfc/sfc-parser.spec.js

@@ -55,6 +55,33 @@ describe('Single File Component parser', () => {
     expect(res.template.content.trim()).toBe('<div><template v-if="ok">hi</template></div>')
   })
 
+  it('deindent content', () => {
+    const content = `
+      <template>
+        <div></div>
+      </template>
+      <script>
+        export default {}
+      </script>
+      <style>
+        h1 { color: red }
+      </style>
+    `
+    const deindentDefault = parseComponent(content.trim(), { pad: false })
+    const deindentEnabled = parseComponent(content.trim(), { pad: false, deindent: true })
+    const deindentDisabled = parseComponent(content.trim(), { pad: false, deindent: false })
+
+    expect(deindentDefault.template.content).toBe('\n<div></div>\n')
+    expect(deindentDefault.script.content).toBe('\nexport default {}\n')
+    expect(deindentDefault.styles[0].content).toBe('\nh1 { color: red }\n')
+    expect(deindentEnabled.template.content).toBe('\n<div></div>\n')
+    expect(deindentEnabled.script.content).toBe('\nexport default {}\n')
+    expect(deindentEnabled.styles[0].content).toBe('\nh1 { color: red }\n')
+    expect(deindentDisabled.template.content).toBe('\n        <div></div>\n      ')
+    expect(deindentDisabled.script.content).toBe('\n        export default {}\n      ')
+    expect(deindentDisabled.styles[0].content).toBe('\n        h1 { color: red }\n      ')
+  })
+
   it('pad content', () => {
     const content = `
       <template>