1
0
mirror of https://github.com/svg/svgo.git synced 2025-07-29 20:21:14 +03:00

Upgrade css-tree from alpha25 to alpha.28

API changed walkFoo(ast, fun) to walk(ast,{visit: 'Rule',enter: fun)
csstree.translate renamed to csstree.generate
csstree.generate throws an error on invalid style where translate silently ignored it - update style processing to catch and ignore instead
Updated tests - csstree now omits more whitespace
This commit is contained in:
Stephanie Miller
2018-03-18 22:19:17 -04:00
committed by Lev Solntsev
parent e928c1f050
commit e7b8a6ce7d
10 changed files with 26 additions and 20 deletions

View File

@ -15,7 +15,7 @@ var csstree = require('css-tree'),
function flattenToSelectors(cssAst) { function flattenToSelectors(cssAst) {
var selectors = []; var selectors = [];
csstree.walkRules(cssAst, function(node) { csstree.walk(cssAst, {visit: 'Rule', enter: function(node) {
if (node.type !== 'Rule') { if (node.type !== 'Rule') {
return; return;
} }
@ -43,7 +43,7 @@ function flattenToSelectors(cssAst) {
selectors.push(selector); selectors.push(selector);
}); });
}); }});
return selectors; return selectors;
} }
@ -65,7 +65,7 @@ function filterByMqs(selectors, useMqs) {
var mqStr = mqName; var mqStr = mqName;
if (selector.atrule.expression && if (selector.atrule.expression &&
selector.atrule.expression.children.first().type === 'MediaQueryList') { selector.atrule.expression.children.first().type === 'MediaQueryList') {
var mqExpr = csstree.translate(selector.atrule.expression); var mqExpr = csstree.generate(selector.atrule.expression);
mqStr = [mqName, mqExpr].join(' '); mqStr = [mqName, mqExpr].join(' ');
} }
@ -82,7 +82,7 @@ function filterByMqs(selectors, useMqs) {
*/ */
function filterByPseudos(selectors, usePseudos) { function filterByPseudos(selectors, usePseudos) {
return selectors.filter(function(selector) { return selectors.filter(function(selector) {
var pseudoSelectorsStr = csstree.translate({ var pseudoSelectorsStr = csstree.generate({
type: 'Selector', type: 'Selector',
children: new List().fromArray(selector.pseudos.map(function(pseudo) { children: new List().fromArray(selector.pseudos.map(function(pseudo) {
return pseudo.item.data; return pseudo.item.data;
@ -165,7 +165,7 @@ function sortSelectors(selectors) {
*/ */
function csstreeToStyleDeclaration(declaration) { function csstreeToStyleDeclaration(declaration) {
var propertyName = declaration.property, var propertyName = declaration.property,
propertyValue = csstree.translate(declaration.value), propertyValue = csstree.generate(declaration.value),
propertyPriority = (declaration.important ? 'important' : ''); propertyPriority = (declaration.important ? 'important' : '');
return { return {
name: propertyName, name: propertyName,

View File

@ -127,8 +127,14 @@ CSSStyleDeclaration.prototype._loadCssText = function() {
var self = this; var self = this;
declarations.children.each(function(declaration) { declarations.children.each(function(declaration) {
var styleDeclaration = csstools.csstreeToStyleDeclaration(declaration); try {
self.setProperty(styleDeclaration.name, styleDeclaration.value, styleDeclaration.priority); var styleDeclaration = csstools.csstreeToStyleDeclaration(declaration);
self.setProperty(styleDeclaration.name, styleDeclaration.value, styleDeclaration.priority);
} catch(styleError) {
if(styleError.message !== 'Unknown node type: undefined') {
self.parseError = styleError;
}
}
}); });
}; };

View File

@ -53,7 +53,7 @@
"colors": "~1.1.2", "colors": "~1.1.2",
"css-select": "~1.3.0-rc0", "css-select": "~1.3.0-rc0",
"css-select-base-adapter": "~0.1.0", "css-select-base-adapter": "~0.1.0",
"css-tree": "1.0.0-alpha25", "css-tree": "1.0.0-alpha.28",
"css-url-regex": "^1.1.0", "css-url-regex": "^1.1.0",
"csso": "^3.5.0", "csso": "^3.5.0",
"js-yaml": "~3.10.0", "js-yaml": "~3.10.0",

View File

@ -103,7 +103,7 @@ exports.fn = function(document, opts) {
// match selectors // match selectors
for (selector of sortedSelectors) { for (selector of sortedSelectors) {
var selectorStr = csstree.translate(selector.item.data), var selectorStr = csstree.generate(selector.item.data),
selectedEls = null; selectedEls = null;
try { try {
@ -143,7 +143,7 @@ exports.fn = function(document, opts) {
} }
// merge declarations // merge declarations
csstree.walkDeclarations(selector.rule, function(styleCsstreeDeclaration) { csstree.walk(selector.rule, {visit: 'Declaration', enter: function(styleCsstreeDeclaration) {
// existing inline styles have higher priority // existing inline styles have higher priority
// no inline styles, external styles, external styles used // no inline styles, external styles, external styles used
@ -155,7 +155,7 @@ exports.fn = function(document, opts) {
return; return;
} }
selectedEl.style.setProperty(styleDeclaration.name, styleDeclaration.value, styleDeclaration.priority); selectedEl.style.setProperty(styleDeclaration.name, styleDeclaration.value, styleDeclaration.priority);
}); }});
} }
if (opts.removeMatchedSelectors && selector.selectedEls !== null && selector.selectedEls.length > 0) { if (opts.removeMatchedSelectors && selector.selectedEls !== null && selector.selectedEls.length > 0) {
@ -202,7 +202,7 @@ exports.fn = function(document, opts) {
// clean up now empty elements // clean up now empty elements
for (var style of styles) { for (var style of styles) {
csstree.walkRules(style.cssAst, function(node, item, list) { csstree.walk(style.cssAst, {visit: 'Rule', enter: function(node, item, list) {
// clean up <style/> atrules without any rulesets left // clean up <style/> atrules without any rulesets left
if (node.type === 'Atrule' && if (node.type === 'Atrule' &&
// only Atrules containing rulesets // only Atrules containing rulesets
@ -217,7 +217,7 @@ exports.fn = function(document, opts) {
node.prelude.children.isEmpty()) { node.prelude.children.isEmpty()) {
list.remove(item); list.remove(item);
} }
}); }});
if (style.cssAst.children.isEmpty()) { if (style.cssAst.children.isEmpty()) {
@ -237,7 +237,7 @@ exports.fn = function(document, opts) {
// update existing, left over <style>s // update existing, left over <style>s
cssTools.setCssStr(style.styleEl, csstree.translate(style.cssAst)); cssTools.setCssStr(style.styleEl, csstree.generate(style.cssAst));
} }

View File

@ -194,7 +194,7 @@ exports.fn = function(node, opts, extra) {
}); });
// update <style>s // update <style>s
node.content[0].text = csstree.translate(cssAst); node.content[0].text = csstree.generate(cssAst);
return node; return node;
} }

View File

@ -18,7 +18,7 @@
<svg xmlns="http://www.w3.org/2000/svg" id="dark" viewBox="0 0 258.12 225.88"> <svg xmlns="http://www.w3.org/2000/svg" id="dark" viewBox="0 0 258.12 225.88">
<!--for https://github.com/svg/svgo/pull/592#issuecomment-266327016--> <!--for https://github.com/svg/svgo/pull/592#issuecomment-266327016-->
<style> <style>
.cls-8{cls-7-and-8: 1} .cls-8{cls-7-and-8:1}
</style> </style>
<path style="cls-7-and-8:1;only-cls-7:1"/> <path style="cls-7-and-8:1;only-cls-7:1"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 601 B

View File

@ -61,7 +61,7 @@
<svg id="test" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.285 81.285"> <svg id="test" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.285 81.285">
<defs> <defs>
<style> <style>
@charset &apos;UTF-8&apos;;@namespace svg url(http://www.w3.org/2000/svg);@import url(&apos;https://fonts.googleapis.com/css?family=Roboto&apos;);@font-face{font-family: SomeFont;src: local(&quot;Some Font&quot;), local(&quot;SomeFont&quot;), url(SomeFont.ttf);font-weight: bold}@viewport{zoom: 0.8;min-zoom: 0.4;max-zoom: 0.9}@keyframes identifier{0%{top: 0}50%{top: 30px;left: 20px}50%{top: 10px}100%{top: 0}}@page :first{margin: 1in}@supports (display: flex){.module{display: flex}}@document url(&apos;http://example.com/test.html&apos;){rect{stroke: red}} @charset &apos;UTF-8&apos;;@namespace svg url(http://www.w3.org/2000/svg);@import url(&apos;https://fonts.googleapis.com/css?family=Roboto&apos;);@font-face{font-family:SomeFont;src:local(&quot;Some Font&quot;), local(&quot;SomeFont&quot;), url(SomeFont.ttf);font-weight:bold}@viewport{zoom:0.8;min-zoom:0.4;max-zoom:0.9}@keyframes identifier{0%{top:0}50%{top:30px;left:20px}50%{top:10px}100%{top:0}}@page :first{margin:1in}@supports (display:flex){.module{display:flex}}@document url(&apos;http://example.com/test.html&apos;){rect{stroke:red}}
</style> </style>
</defs> </defs>
<rect width="100" height="100" style="fill:blue"/> <rect width="100" height="100" style="fill:blue"/>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -19,7 +19,7 @@
<svg id="test" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.285 81.285"> <svg id="test" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.285 81.285">
<defs> <defs>
<style> <style>
@media only screen and (min-device-width:320px) and (max-device-width:480px) and (-webkit-min-device-pixel-ratio:2){.blue{fill: blue}} @media only screen and (min-device-width:320px) and (max-device-width:480px) and (-webkit-min-device-pixel-ratio:2){.blue{fill:blue}}
</style> </style>
</defs> </defs>
<rect width="100" height="100" class="blue"/> <rect width="100" height="100" class="blue"/>

Before

Width:  |  Height:  |  Size: 897 B

After

Width:  |  Height:  |  Size: 896 B

View File

@ -58,7 +58,7 @@
<svg viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <svg viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs xmlns="http://www.w3.org/1999/xhtml"> <defs xmlns="http://www.w3.org/1999/xhtml">
<style type="text/css"> <style type="text/css">
html /deep/ [layout][horizontal],html /deep/ [layout][vertical]{display: flex}html /deep/ [layout][horizontal][inline],html /deep/ [layout][vertical][inline]{display: inline-flex}html /deep/ [layout][horizontal]{flex-direction: row}html /deep/ [layout][horizontal][reverse]{flex-direction: row-reverse}html /deep/ [layout][vertical]{flex-direction: column}html /deep/ [layout][vertical][reverse]{flex-direction: column-reverse}html /deep/ [layout][wrap]{flex-wrap: wrap}html /deep/ [layout][wrap-reverse]{flex-wrap: wrap-reverse}html /deep/ [flex]{flex: 1 1 0px}html /deep/ [flex][auto]{flex: 1 1 auto}html /deep/ [flex][none]{flex: 0 0 auto}html /deep/ [flex][one]{flex: 1 1 0px}html /deep/ [flex][two]{flex: 2 1 0px}html /deep/ [flex][three]{flex: 3 1 0px}html /deep/ [flex][four]{flex: 4 1 0px}html /deep/ [flex][five]{flex: 5 1 0px}html /deep/ [flex][six]{flex: 6 1 0px}html /deep/ [flex][seven]{flex: 7 1 0px}html /deep/ [flex][eight]{flex: 8 1 0px}html /deep/ [flex][nine]{flex: 9 1 0px}html /deep/ [flex][ten]{flex: 10 1 0px}html /deep/ [flex][eleven]{flex: 11 1 0px}html /deep/ [flex][twelve]{flex: 12 1 0px}html /deep/ [layout][start]{align-items: flex-start}html /deep/ [layout][center]{align-items: center}html /deep/ [layout][end]{align-items: flex-end}html /deep/ [layout][start-justified]{justify-content: flex-start}html /deep/ [layout][center-justified]{justify-content: center}html /deep/ [layout][end-justified]{justify-content: flex-end}html /deep/ [layout][around-justified]{justify-content: space-around}html /deep/ [layout][justified]{justify-content: space-between}html /deep/ [self-start]{align-self: flex-start}html /deep/ [self-center]{align-self: center}html /deep/ [self-end]{align-self: flex-end}html /deep/ [self-stretch]{align-self: stretch}html /deep/ [block]{display: block}html /deep/ [hidden]{display: none !important}html /deep/ [relative]{position: relative}html /deep/ [fit]{position: absolute;top: 0px;right: 0px;bottom: 0px;left: 0px}body[fullbleed]{margin: 0px;height: 100vh}html /deep/ [segment],html /deep/ segment{display: block;position: relative;box-sizing: border-box;margin: 1em 0.5em;padding: 1em;-webkit-box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 0px 1px;box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 0px 1px;border-top-left-radius: 5px;border-top-right-radius: 5px;border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;background-color: white}html /deep/ core-icon{display: inline-block;vertical-align: middle;background-repeat: no-repeat}html /deep/ core-icon[size=&quot;&quot;]{position: relative} html /deep/ [layout][horizontal],html /deep/ [layout][vertical]{display:flex}html /deep/ [layout][horizontal][inline],html /deep/ [layout][vertical][inline]{display:inline-flex}html /deep/ [layout][horizontal]{flex-direction:row}html /deep/ [layout][horizontal][reverse]{flex-direction:row-reverse}html /deep/ [layout][vertical]{flex-direction:column}html /deep/ [layout][vertical][reverse]{flex-direction:column-reverse}html /deep/ [layout][wrap]{flex-wrap:wrap}html /deep/ [layout][wrap-reverse]{flex-wrap:wrap-reverse}html /deep/ [flex]{flex:1 1 0px}html /deep/ [flex][auto]{flex:1 1 auto}html /deep/ [flex][none]{flex:0 0 auto}html /deep/ [flex][one]{flex:1 1 0px}html /deep/ [flex][two]{flex:2 1 0px}html /deep/ [flex][three]{flex:3 1 0px}html /deep/ [flex][four]{flex:4 1 0px}html /deep/ [flex][five]{flex:5 1 0px}html /deep/ [flex][six]{flex:6 1 0px}html /deep/ [flex][seven]{flex:7 1 0px}html /deep/ [flex][eight]{flex:8 1 0px}html /deep/ [flex][nine]{flex:9 1 0px}html /deep/ [flex][ten]{flex:10 1 0px}html /deep/ [flex][eleven]{flex:11 1 0px}html /deep/ [flex][twelve]{flex:12 1 0px}html /deep/ [layout][start]{align-items:flex-start}html /deep/ [layout][center]{align-items:center}html /deep/ [layout][end]{align-items:flex-end}html /deep/ [layout][start-justified]{justify-content:flex-start}html /deep/ [layout][center-justified]{justify-content:center}html /deep/ [layout][end-justified]{justify-content:flex-end}html /deep/ [layout][around-justified]{justify-content:space-around}html /deep/ [layout][justified]{justify-content:space-between}html /deep/ [self-start]{align-self:flex-start}html /deep/ [self-center]{align-self:center}html /deep/ [self-end]{align-self:flex-end}html /deep/ [self-stretch]{align-self:stretch}html /deep/ [block]{display:block}html /deep/ [hidden]{display:none!important}html /deep/ [relative]{position:relative}html /deep/ [fit]{position:absolute;top:0px;right:0px;bottom:0px;left:0px}body[fullbleed]{margin:0px;height:100vh}html /deep/ [segment],html /deep/ segment{display:block;position:relative;box-sizing:border-box;margin:1em 0.5em;padding:1em;-webkit-box-shadow:rgba(0, 0, 0, 0.0980392) 0px 0px 0px 1px;box-shadow:rgba(0, 0, 0, 0.0980392) 0px 0px 0px 1px;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:5px;background-color:white}html /deep/ core-icon{display:inline-block;vertical-align:middle;background-repeat:no-repeat}html /deep/ core-icon[size=&quot;&quot;]{position:relative}
</style> </style>
</defs> </defs>
<g id="airplanemode-on"> <g id="airplanemode-on">

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -36,7 +36,7 @@
<svg id="icon_time" data-name="icon time" xmlns="http://www.w3.org/2000/svg" width="51" height="51" viewBox="0 0 51 51"> <svg id="icon_time" data-name="icon time" xmlns="http://www.w3.org/2000/svg" width="51" height="51" viewBox="0 0 51 51">
<defs> <defs>
<style> <style>
.cls-2,.cls-3{fill: #f5f5f5;stroke: gray}.cls-2{stroke-width: 1px}.cls-2{fill-rule: evenodd}.cls-3{stroke-width: 2px} .cls-2,.cls-3{fill:#f5f5f5;stroke:gray}.cls-2{stroke-width:1px}.cls-2{fill-rule:evenodd}.cls-3{stroke-width:2px}
</style> </style>
</defs> </defs>
<circle cx="25.5" cy="25.5" r="25" style="stroke-width:1px;fill:#f5f5f5;stroke:gray"/> <circle cx="25.5" cy="25.5" r="25" style="stroke-width:1px;fill:#f5f5f5;stroke:gray"/>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB