From 9900174d5090908c1e0a438a9f6165af88ed0829 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 20 Jan 2020 22:39:19 +0800 Subject: [PATCH] HTML: don't treat colons as namespace prefix delimiters in tag names (#7273) --- changelog_unreleased/html/pr-7273.md | 59 +++ src/language-html/parser-html.js | 12 +- src/language-html/utils.js | 15 +- .../__snapshots__/jsfmt.spec.js.snap | 335 ++++++++++++++++++ tests/html_basics/with-colon.html | 112 ++++++ .../__snapshots__/jsfmt.spec.js.snap | 37 +- tests/html_tags/tags.html | 2 +- 7 files changed, 551 insertions(+), 21 deletions(-) create mode 100644 changelog_unreleased/html/pr-7273.md create mode 100644 tests/html_basics/with-colon.html diff --git a/changelog_unreleased/html/pr-7273.md b/changelog_unreleased/html/pr-7273.md new file mode 100644 index 000000000..29af027e7 --- /dev/null +++ b/changelog_unreleased/html/pr-7273.md @@ -0,0 +1,59 @@ +#### Don't treat colons as namespace prefix delimiters in tag names ([#7273](https://github.com/prettier/prettier/pull/7273) by [@fisker](https://github.com/fisker)) + +In HTML5, colons don't have any special meaning in tag names. Previously, Prettier treated them the XML way, as namespace prefix delimiters, but no more. In practice, this means that tags whose ancestors have colons in their names are now treated as usual HTML tags: if they're known standard tags, their names can be lowercased and assumptions can be made about their whitespace sensitivity; custom elements whose names are unknown to Prettier retain the casing of their names and are treated as inline with `--html-whitespace-sensitivity css`. + + +```html + + +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
block
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline +
+ + + +
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
block
block
block
block
+
 pre pr e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline +
+ + + +
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
+
block
+
block
+
block
+
block
+
+ pre pr
+e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline +
+``` diff --git a/src/language-html/parser-html.js b/src/language-html/parser-html.js index c486fa0da..84eea0748 100644 --- a/src/language-html/parser-html.js +++ b/src/language-html/parser-html.js @@ -1,7 +1,11 @@ "use strict"; const parseFrontMatter = require("../utils/front-matter"); -const { HTML_ELEMENT_ATTRIBUTES, HTML_TAGS } = require("./utils"); +const { + HTML_ELEMENT_ATTRIBUTES, + HTML_TAGS, + isUnknownNamespace +} = require("./utils"); const { hasPragma } = require("./pragma"); const createError = require("../common/parser-create-error"); const { Node } = require("./ast"); @@ -112,7 +116,8 @@ function ngHtmlParser( if ( normalizeTagName && (!node.namespace || - node.namespace === node.tagDefinition.implicitNamespacePrefix) + node.namespace === node.tagDefinition.implicitNamespacePrefix || + isUnknownNamespace(node)) ) { node.name = lowerCaseIfFn( node.name, @@ -154,7 +159,8 @@ function ngHtmlParser( ); if ( !node.namespace || - node.namespace === tagDefinition.implicitNamespacePrefix + node.namespace === tagDefinition.implicitNamespacePrefix || + isUnknownNamespace(node) ) { node.tagDefinition = tagDefinition; } else { diff --git a/src/language-html/utils.js b/src/language-html/utils.js index b930a9453..8059d9ece 100644 --- a/src/language-html/utils.js +++ b/src/language-html/utils.js @@ -501,17 +501,27 @@ function getNodeCssStyleDisplay(node, options) { default: return ( (node.type === "element" && - (!node.namespace || isInSvgForeignObject) && + (!node.namespace || + isInSvgForeignObject || + isUnknownNamespace(node)) && CSS_DISPLAY_TAGS[node.name]) || CSS_DISPLAY_DEFAULT ); } } +function isUnknownNamespace(node) { + return ( + node.type === "element" && + !node.hasExplicitNamespace && + !["html", "svg"].includes(node.namespace) + ); +} + function getNodeCssStyleWhiteSpace(node) { return ( (node.type === "element" && - !node.namespace && + (!node.namespace || isUnknownNamespace(node)) && CSS_WHITE_SPACE_TAGS[node.name]) || CSS_WHITE_SPACE_DEFAULT ); @@ -635,6 +645,7 @@ module.exports = { isTextLikeNode, isTrailingSpaceSensitiveNode, isWhitespaceSensitiveNode, + isUnknownNamespace, normalizeParts, preferHardlineAsLeadingSpaces, preferHardlineAsTrailingSpaces, diff --git a/tests/html_basics/__snapshots__/jsfmt.spec.js.snap b/tests/html_basics/__snapshots__/jsfmt.spec.js.snap index 2079732d9..7c44e1a65 100644 --- a/tests/html_basics/__snapshots__/jsfmt.spec.js.snap +++ b/tests/html_basics/__snapshots__/jsfmt.spec.js.snap @@ -503,3 +503,338 @@ printWidth: 80 ================================================================================ `; + +exports[`with-colon.html 1`] = ` +====================================options===================================== +parsers: ["html"] +printWidth: 80 + | printWidth +=====================================input====================================== + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+
+
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + + +

text text text text text text text text text text text text text text

+ +
+ +=====================================output===================================== + +
+ +
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
+
BLOCK
+
block
+
block
+
block
+
+ pre pr
+e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + + block BLOCK + block block block + pre pr e + pre-wrap pr e-wrap + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline + inline inline
+
+ + +
+ +
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
+
BLOCK
+
block
+
block
+
block
+
+ pre pr
+e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + + block BLOCK + block block block + pre pr e + pre-wrap pr e-wrap + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline + inline inline
+
+ + +
+ +
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
+
BLOCK
+
block
+
block
+
block
+
+ pre pr
+e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + + block BLOCK + block block block + pre pr e + pre-wrap pr e-wrap + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline + inline inline
+
+ + +
+ +
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
+
BLOCK
+
block
+
block
+
block
+
+ pre pr
+e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + + block BLOCK + block block block + pre pr e + pre-wrap pr e-wrap + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline + inline inline
+
+ + +
+
+
+ looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block +
+
block
+
BLOCK
+
block
+
block
+
block
+
+ pre pr
+e
+ + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline inline inline + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + + block BLOCK + block block block + pre pr e + pre-wrap pr e-wrap + + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + + inline inline + inline inline +
+
+ + + +
+

+ text text text text text text text text text text text text text text +

+
+ +
+ +================================================================================ +`; diff --git a/tests/html_basics/with-colon.html b/tests/html_basics/with-colon.html new file mode 100644 index 000000000..aad6b4158 --- /dev/null +++ b/tests/html_basics/with-colon.html @@ -0,0 +1,112 @@ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+ +
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + +
+
+
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block
+
block
BLOCK
block
block
block
+
 pre pr
+e
+ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog block + block BLOCK block block block + pre pr +e + pre-wrap pr +e-wrap + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog inline + inline inline inline inline
+
+ + + +

text text text text text text text text text text text text text text

+ +
diff --git a/tests/html_tags/__snapshots__/jsfmt.spec.js.snap b/tests/html_tags/__snapshots__/jsfmt.spec.js.snap index 3be078897..8d364772a 100644 --- a/tests/html_tags/__snapshots__/jsfmt.spec.js.snap +++ b/tests/html_tags/__snapshots__/jsfmt.spec.js.snap @@ -1887,7 +1887,7 @@ printWidth: 80 -foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -2071,7 +2071,9 @@ printWidth: 80
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -2196,7 +2198,7 @@ printWidth: 1
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -2549,15 +2551,16 @@ printWidth: 1 >
foreign - tag + >tag name + in + other + namespace should - not - be + also lower - cased
@@ -2705,7 +2708,7 @@ printWidth: Infinity
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -2826,7 +2829,7 @@ printWidth: Infinity
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod".
@@ -2951,7 +2954,7 @@ printWidth: 80 -foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -3121,7 +3124,9 @@ printWidth: 80
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -3247,7 +3252,7 @@ printWidth: 80
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod". @@ -3458,7 +3463,9 @@ printWidth: 80
-foreign tag name should not be lower cased + + tag name in other namespace should also lower cased +
Lorem ipsum dolor sit amet, consectetur adipiscing elit, " seddoeiusmod diff --git a/tests/html_tags/tags.html b/tests/html_tags/tags.html index 96b7a27f3..a5aeddf1f 100644 --- a/tests/html_tags/tags.html +++ b/tests/html_tags/tags.html @@ -99,7 +99,7 @@
-foreign tag name should not be lower cased +tag name in other namespace should also lower cased
Lorem ipsum dolor sit amet, consectetur adipiscing elit, "seddoeiusmod".