diff --git a/src/language-css/clean.js b/src/language-css/clean.js index 1224e9f9d..7b3d51dc4 100644 --- a/src/language-css/clean.js +++ b/src/language-css/clean.js @@ -61,9 +61,13 @@ function clean(ast, newObj) { newObj.importPath = cleanCSSStrings(newObj.importPath); } - if (ast.type === "selector-attribute" && newObj.value) { - newObj.value = newObj.value.replace(/^['"]|['"]$/g, ""); - delete newObj.quoted; + if (ast.type === "selector-attribute") { + newObj.attribute = newObj.attribute.replace(/ /g, ""); + + if (newObj.value) { + newObj.value = newObj.value.trim().replace(/^['"]|['"]$/g, ""); + delete newObj.quoted; + } } if ( diff --git a/src/language-css/printer-postcss.js b/src/language-css/printer-postcss.js index baa543301..967e419d2 100644 --- a/src/language-css/printer-postcss.js +++ b/src/language-css/printer-postcss.js @@ -249,10 +249,10 @@ function genericPrint(path, options, print) { case "selector-attribute": { return concat([ "[", - n.attribute, + n.attribute.trim(), n.operator ? n.operator : "", n.value - ? quoteAttributeValue(adjustStrings(n.value, options), options) + ? quoteAttributeValue(adjustStrings(n.value.trim(), options), options) : "", n.insensitive ? " i" : "", "]" diff --git a/tests/css_attribute/__snapshots__/jsfmt.spec.js.snap b/tests/css_attribute/__snapshots__/jsfmt.spec.js.snap index c01564af8..435ae5a6d 100644 --- a/tests/css_attribute/__snapshots__/jsfmt.spec.js.snap +++ b/tests/css_attribute/__snapshots__/jsfmt.spec.js.snap @@ -3,18 +3,26 @@ exports[`insensitive.css 1`] = ` input[type="radio" i] { } +img[alt~="person" i][src*="lorem" i] { +} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ input[type="radio" i] { } +img[alt~="person" i][src*="lorem" i] { +} `; exports[`insensitive.css 2`] = ` input[type="radio" i] { } +img[alt~="person" i][src*="lorem" i] { +} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ input[type='radio' i] { } +img[alt~='person' i][src*='lorem' i] { +} `; @@ -23,6 +31,7 @@ a[id=test] {} a[id="test"] {} a[id='test'] {} a[id=func("foo")] {} +a[class="(╯°□°)╯︵ ┻━┻"]{} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ a[id="test"] { } @@ -32,6 +41,8 @@ a[id="test"] { } a[id=func("foo")] { } +a[class="(╯°□°)╯︵ ┻━┻"] { +} `; @@ -40,6 +51,7 @@ a[id=test] {} a[id="test"] {} a[id='test'] {} a[id=func("foo")] {} +a[class="(╯°□°)╯︵ ┻━┻"]{} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ a[id='test'] { } @@ -49,5 +61,203 @@ a[id='test'] { } a[id=func('foo')] { } +a[class='(╯°□°)╯︵ ┻━┻'] { +} + +`; + +exports[`spaces.css 1`] = ` +[lang] {} +[ lang] {} +[lang ] {} +[ lang ] {} +[ lang ] {} +span[lang] {} +span[ lang] {} +span[lang ] {} +span[ lang ] {} +span[ lang ] {} +span[lang='pt'] {} +span[lang ='pt'] {} +span[lang= 'pt'] {} +span[lang = 'pt'] {} +span[lang = 'pt'] {} +span[lang='pt' ] {} +span[lang='pt' ] {} +span[ lang ~= 'en-us' ] {} +span[ lang ~= 'en-us' ] {} +span[ lang |='zh' ] {} +a[ href ^= '#' ] {} +a[ href $= '.cn' ] {} +a[ href *= 'example' ] {} +input[ type = 'radio' i ] {} +input[ type = 'radio' i ] {} +input[ type ~= 'radio' i ] {} +input[ type ~= 'radio' i ] {} +img[ alt = 'person' ][ src = 'lorem' ] {} +img[ alt = 'person' ][ src = 'lorem' ] {} +img[ alt ~= 'person' ][ src *= 'lorem' ] {} +img[ alt ~= 'person' ][ src *= 'lorem' ] {} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[lang] { +} +[lang] { +} +[lang] { +} +[lang] { +} +[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang="pt"] { +} +span[lang="pt"] { +} +span[lang="pt"] { +} +span[lang="pt"] { +} +span[lang="pt"] { +} +span[lang="pt"] { +} +span[lang="pt"] { +} +span[lang~="en-us"] { +} +span[lang~="en-us"] { +} +span[lang|="zh"] { +} +a[href^="#"] { +} +a[href$=".cn"] { +} +a[href*="example"] { +} +input[type="radio" i] { +} +input[type="radio" i] { +} +input[type~="radio" i] { +} +input[type~="radio" i] { +} +img[alt="person"][src="lorem"] { +} +img[alt="person"][src="lorem"] { +} +img[alt~="person"][src*="lorem"] { +} +img[alt~="person"][src*="lorem"] { +} + +`; + +exports[`spaces.css 2`] = ` +[lang] {} +[ lang] {} +[lang ] {} +[ lang ] {} +[ lang ] {} +span[lang] {} +span[ lang] {} +span[lang ] {} +span[ lang ] {} +span[ lang ] {} +span[lang='pt'] {} +span[lang ='pt'] {} +span[lang= 'pt'] {} +span[lang = 'pt'] {} +span[lang = 'pt'] {} +span[lang='pt' ] {} +span[lang='pt' ] {} +span[ lang ~= 'en-us' ] {} +span[ lang ~= 'en-us' ] {} +span[ lang |='zh' ] {} +a[ href ^= '#' ] {} +a[ href $= '.cn' ] {} +a[ href *= 'example' ] {} +input[ type = 'radio' i ] {} +input[ type = 'radio' i ] {} +input[ type ~= 'radio' i ] {} +input[ type ~= 'radio' i ] {} +img[ alt = 'person' ][ src = 'lorem' ] {} +img[ alt = 'person' ][ src = 'lorem' ] {} +img[ alt ~= 'person' ][ src *= 'lorem' ] {} +img[ alt ~= 'person' ][ src *= 'lorem' ] {} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[lang] { +} +[lang] { +} +[lang] { +} +[lang] { +} +[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang] { +} +span[lang='pt'] { +} +span[lang='pt'] { +} +span[lang='pt'] { +} +span[lang='pt'] { +} +span[lang='pt'] { +} +span[lang='pt'] { +} +span[lang='pt'] { +} +span[lang~='en-us'] { +} +span[lang~='en-us'] { +} +span[lang|='zh'] { +} +a[href^='#'] { +} +a[href$='.cn'] { +} +a[href*='example'] { +} +input[type='radio' i] { +} +input[type='radio' i] { +} +input[type~='radio' i] { +} +input[type~='radio' i] { +} +img[alt='person'][src='lorem'] { +} +img[alt='person'][src='lorem'] { +} +img[alt~='person'][src*='lorem'] { +} +img[alt~='person'][src*='lorem'] { +} `; diff --git a/tests/css_attribute/insensitive.css b/tests/css_attribute/insensitive.css index c3fce7652..8471c6271 100644 --- a/tests/css_attribute/insensitive.css +++ b/tests/css_attribute/insensitive.css @@ -1,2 +1,4 @@ input[type="radio" i] { } +img[alt~="person" i][src*="lorem" i] { +} diff --git a/tests/css_attribute/quotes.css b/tests/css_attribute/quotes.css index 6afdac21b..07e5c907c 100644 --- a/tests/css_attribute/quotes.css +++ b/tests/css_attribute/quotes.css @@ -2,3 +2,4 @@ a[id=test] {} a[id="test"] {} a[id='test'] {} a[id=func("foo")] {} +a[class="(╯°□°)╯︵ ┻━┻"]{} diff --git a/tests/css_attribute/spaces.css b/tests/css_attribute/spaces.css new file mode 100644 index 000000000..840d2d72c --- /dev/null +++ b/tests/css_attribute/spaces.css @@ -0,0 +1,31 @@ +[lang] {} +[ lang] {} +[lang ] {} +[ lang ] {} +[ lang ] {} +span[lang] {} +span[ lang] {} +span[lang ] {} +span[ lang ] {} +span[ lang ] {} +span[lang='pt'] {} +span[lang ='pt'] {} +span[lang= 'pt'] {} +span[lang = 'pt'] {} +span[lang = 'pt'] {} +span[lang='pt' ] {} +span[lang='pt' ] {} +span[ lang ~= 'en-us' ] {} +span[ lang ~= 'en-us' ] {} +span[ lang |='zh' ] {} +a[ href ^= '#' ] {} +a[ href $= '.cn' ] {} +a[ href *= 'example' ] {} +input[ type = 'radio' i ] {} +input[ type = 'radio' i ] {} +input[ type ~= 'radio' i ] {} +input[ type ~= 'radio' i ] {} +img[ alt = 'person' ][ src = 'lorem' ] {} +img[ alt = 'person' ][ src = 'lorem' ] {} +img[ alt ~= 'person' ][ src *= 'lorem' ] {} +img[ alt ~= 'person' ][ src *= 'lorem' ] {} diff --git a/tests/stylefmt/attr-selector/__snapshots__/jsfmt.spec.js.snap b/tests/stylefmt/attr-selector/__snapshots__/jsfmt.spec.js.snap index 65ee1da14..c417a66ab 100644 --- a/tests/stylefmt/attr-selector/__snapshots__/jsfmt.spec.js.snap +++ b/tests/stylefmt/attr-selector/__snapshots__/jsfmt.spec.js.snap @@ -8,11 +8,11 @@ exports[`attr-selector.css 1`] = ` [ class*="test" ]{ color: silver} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[ data-sizes~="m:0" ] { +[data-sizes~="m:0"] { color: pink; } -[ class*="test" ] { +[class*="test"] { color: silver; }