From fdb7467de7e8f0791e25f580e75aee09273bf136 Mon Sep 17 00:00:00 2001 From: Lucas Azzola Date: Sun, 11 Jun 2017 13:10:34 +1000 Subject: [PATCH] feat(html): add support for HTML fragments (#2093) --- src/parser-parse5.js | 3 +- src/printer-htmlparser2.js | 12 +++++- .../__snapshots__/jsfmt.spec.js.snap | 28 +++++++++---- tests/html_basics/html-fragment.html | 3 ++ .../__snapshots__/jsfmt.spec.js.snap | 21 ++++++---- .../__snapshots__/jsfmt.spec.js.snap | 19 +++++---- .../__snapshots__/jsfmt.spec.js.snap | 25 ++++++----- .../__snapshots__/jsfmt.spec.js.snap | 41 +++++++++++++++++++ tests/multiparser_vue/jsfmt.spec.js | 1 + tests/multiparser_vue/vue-component.vue | 16 ++++++++ tests_config/run_spec.js | 6 +-- 11 files changed, 138 insertions(+), 37 deletions(-) create mode 100644 tests/html_basics/html-fragment.html create mode 100644 tests/multiparser_vue/__snapshots__/jsfmt.spec.js.snap create mode 100644 tests/multiparser_vue/jsfmt.spec.js create mode 100644 tests/multiparser_vue/vue-component.vue diff --git a/src/parser-parse5.js b/src/parser-parse5.js index 6f15988b2..18abfaf54 100644 --- a/src/parser-parse5.js +++ b/src/parser-parse5.js @@ -6,7 +6,8 @@ function parse(text) { // Inline the require to avoid loading all the JS if we don't use it const parse5 = require("parse5"); try { - const ast = parse5.parse(text, { + const isFragment = !/^\s*<(!doctype|html|head|body)/i.test(text); + const ast = (isFragment ? parse5.parseFragment : parse5.parse)(text, { treeAdapter: parse5.treeAdapters.htmlparser2, locationInfo: true }); diff --git a/src/printer-htmlparser2.js b/src/printer-htmlparser2.js index 5044a8c27..fe6237018 100644 --- a/src/printer-htmlparser2.js +++ b/src/printer-htmlparser2.js @@ -1,5 +1,6 @@ "use strict"; +const util = require("./util"); const docBuilders = require("./doc-builders"); const concat = docBuilders.concat; const join = docBuilders.join; @@ -62,15 +63,24 @@ function genericPrint(path, options, print) { children.push(childPath.call(print)); }, "children"); + const hasNewline = util.hasNewlineInRange( + options.originalText, + util.locStart(n), + util.locEnd(n) + ); + return group( concat([ + hasNewline ? hardline : "", "<", n.name, printAttributes(n.attribs), n.children.length ? ">" : selfClose, - indent(concat(children)), + n.name.toLowerCase() === "html" + ? concat(children) + : indent(concat(children)), n.children.length ? concat([softline, ""]) : "" ]) ); diff --git a/tests/html_basics/__snapshots__/jsfmt.spec.js.snap b/tests/html_basics/__snapshots__/jsfmt.spec.js.snap index 2bcd2edbd..c9d9b2683 100644 --- a/tests/html_basics/__snapshots__/jsfmt.spec.js.snap +++ b/tests/html_basics/__snapshots__/jsfmt.spec.js.snap @@ -17,13 +17,27 @@ exports[`hello-world.html 1`] = ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - - - - - Document - -

Hello World

+ + + + + + Document + + + + +

Hello World

+ `; + +exports[`html-fragment.html 1`] = ` +Link + +