diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/postcss-minify-params/dist | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/postcss-minify-params/dist')
| -rw-r--r-- | node_modules/postcss-minify-params/dist/index.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/node_modules/postcss-minify-params/dist/index.js b/node_modules/postcss-minify-params/dist/index.js new file mode 100644 index 00000000..ce373e9f --- /dev/null +++ b/node_modules/postcss-minify-params/dist/index.js @@ -0,0 +1,106 @@ +var postcss = require('postcss'); +var valueParser = require('postcss-value-parser'); +var stringify = valueParser.stringify; +var sort = require('alphanum-sort'); +var uniqs = require('uniqs'); + +/** + * Return the greatest common divisor + * of two numbers. + */ + +function gcd(a, b) { + return b ? gcd(b, a % b) : a; +} + +function aspectRatio(a, b) { + var divisor = gcd(a, b); + + return [a / divisor, b / divisor]; +} + +function split(nodes, div) { + var result = []; + var i, max, node; + var last = ''; + + for (i = 0, max = nodes.length; i < max; i += 1) { + node = nodes[i]; + if (node.type === 'div' && node.value === div) { + result.push(last); + last = ''; + } else { + last += stringify(node); + } + } + + result.push(last); + + return result; +} + +function removeNode(node) { + node.value = ''; + node.type = 'word'; +} + +module.exports = postcss.plugin('postcss-minify-params', function () { + return function (css) { + css.walkAtRules(function (rule) { + if (!rule.params) { + return; + } + + var params = valueParser(rule.params); + + params.walk(function (node, index) { + if (node.type === 'div' || node.type === 'function') { + node.before = node.after = ''; + if ( + node.type === 'function' && + node.nodes[4] && + node.nodes[0].value.indexOf('-aspect-ratio') === 3 + ) { + var ref = aspectRatio( + node.nodes[2].value, + node.nodes[4].value + ); + var a = ref[0]; + var b = ref[1]; + node.nodes[2].value = a; + node.nodes[4].value = b; + } + } else if (node.type === 'space') { + node.value = ' '; + } else if (node.type === 'word') { + var prevWord = params.nodes[index - 2]; + if ( + node.value === 'all' && + rule.name === 'media' && + !prevWord + ) { + var nextSpace = params.nodes[index + 1]; + var nextWord = params.nodes[index + 2]; + var secondSpace = params.nodes[index + 3]; + if (nextWord && nextWord.value === 'and') { + removeNode(nextWord); + removeNode(nextSpace); + if (secondSpace) { + removeNode(secondSpace); + } + } + removeNode(node); + } + } + }, true); + + rule.params = sort(uniqs(split(params.nodes, ',')), { + insensitive: true + }).join(); + + if (!rule.params.length) { + rule.raws.afterName = ''; + } + }); + }; +}); |
