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-font-values | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/postcss-minify-font-values')
9 files changed, 386 insertions, 0 deletions
diff --git a/node_modules/postcss-minify-font-values/LICENSE b/node_modules/postcss-minify-font-values/LICENSE new file mode 100644 index 00000000..6dcaefcb --- /dev/null +++ b/node_modules/postcss-minify-font-values/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) Bogdan Chadkin <trysound@yandex.ru> + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/postcss-minify-font-values/README.md b/node_modules/postcss-minify-font-values/README.md new file mode 100644 index 00000000..35514455 --- /dev/null +++ b/node_modules/postcss-minify-font-values/README.md @@ -0,0 +1,75 @@ +# postcss-minify-font-values [![Build Status][ci-img]][ci] + +> Minify font declarations with PostCSS. + +This module will try to minimise the `font-family`, `font-weight` and `font` shorthand +properties; it can unquote font families where necessary, detect & remove +duplicates, and cut short a declaration after it finds a keyword. For more +examples, see the [tests](test). + +```css +h1 { + font:bold 2.2rem/.9 "Open Sans Condensed", sans-serif; +} + +p { + font-family: "Helvetica Neue", Arial, sans-serif, Helvetica; + font-weight: normal; +} +``` + +```css +h1 { + font:700 2.2rem/.9 Open Sans Condensed,sans-serif +} + +p { + font-family: Helvetica Neue,Arial,sans-serif; + font-weight: 400; +} +``` + +## API + +### minifyFontValues([options]) + +#### options + +##### removeAfterKeyword + +Type: `boolean` +Default: `true` + +Pass `false` to disable the module from removing font families after it +encounters a font keyword, for example `sans-serif`. + +##### removeDuplicates + +Type: `boolean` +Default: `true` + +Pass `false` to disable the module from removing duplicated font families. + +##### removeQuotes + +Type: `boolean` +Default: `true` + +Pass `false` to disable the module from removing quotes from font families. +Note that oftentimes, this is a *safe optimisation* & is done safely. For more +details, see [Mathias Bynens' article][mathias]. + +## Usage + +```js +postcss([ require('postcss-minify-font-values') ]) +``` + +See [PostCSS] docs for examples for your environment. + +MIT © [Bogdan Chadkin](mailto:trysound@yandex.ru) + +[mathias]: https://mathiasbynens.be/notes/unquoted-font-family +[PostCSS]: https://github.com/postcss/postcss +[ci-img]: https://travis-ci.org/TrySound/postcss-minify-font-values.svg +[ci]: https://travis-ci.org/TrySound/postcss-minify-font-values diff --git a/node_modules/postcss-minify-font-values/index.js b/node_modules/postcss-minify-font-values/index.js new file mode 100644 index 00000000..2a6831b3 --- /dev/null +++ b/node_modules/postcss-minify-font-values/index.js @@ -0,0 +1,38 @@ +var assign = require('object-assign'); +var postcss = require('postcss'); +var valueParser = require('postcss-value-parser'); +var minifyWeight = require('./lib/minify-weight'); +var minifyFamily = require('./lib/minify-family'); +var minifyFont = require('./lib/minify-font'); + +function transform(opts) { + opts = assign({ + removeAfterKeyword: true, + removeDuplicates: true, + removeQuotes: true + }, opts); + + return function (decl) { + var tree; + + if (decl.type === 'decl') { + if (decl.prop === 'font-weight') { + decl.value = minifyWeight(decl.value, opts); + } else if (decl.prop === 'font-family') { + tree = valueParser(decl.value); + tree.nodes = minifyFamily(tree.nodes, opts); + decl.value = tree.toString(); + } else if (decl.prop === 'font') { + tree = valueParser(decl.value); + tree.nodes = minifyFont(tree.nodes, opts); + decl.value = tree.toString(); + } + } + }; +} + +module.exports = postcss.plugin('postcss-minify-font-values', function (opts) { + return function (css) { + css.walk(transform(opts)); + }; +}); diff --git a/node_modules/postcss-minify-font-values/lib/keywords.js b/node_modules/postcss-minify-font-values/lib/keywords.js new file mode 100644 index 00000000..db321726 --- /dev/null +++ b/node_modules/postcss-minify-font-values/lib/keywords.js @@ -0,0 +1,44 @@ +var keywords = module.exports = { + style: [ + 'italic', + 'oblique' + ], + variant: [ + 'small-caps' + ], + weight: [ + '100', + '200', + '300', + '400', + '500', + '600', + '700', + '800', + '900', + 'bold', + 'lighter', + 'bolder' + ], + stretch: [ + 'ultra-condensed', + 'extra-condensed', + 'condensed', + 'semi-condensed', + 'semi-expanded', + 'expanded', + 'extra-expanded', + 'ultra-expanded' + ], + size: [ + 'xx-small', + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + 'larger', + 'smaller' + ] +}; diff --git a/node_modules/postcss-minify-font-values/lib/minify-family.js b/node_modules/postcss-minify-font-values/lib/minify-family.js new file mode 100644 index 00000000..3ad601f5 --- /dev/null +++ b/node_modules/postcss-minify-font-values/lib/minify-family.js @@ -0,0 +1,101 @@ +var stringify = require('postcss-value-parser').stringify; +var uniqs = require('./uniqs')('monospace'); + +// Note that monospace is missing intentionally from this list; we should not +// remove instances of duplicated monospace keywords, it causes the font to be +// rendered smaller in Chrome. + +var keywords = [ + 'sans-serif', + 'serif', + 'fantasy', + 'cursive' +]; + +function intersection(haystack, array) { + return array.some(function (v) { + return ~haystack.indexOf(v); + }); +}; + +module.exports = function (nodes, opts) { + var family = []; + var last = null; + var i, max; + + nodes.forEach(function (node, index, nodes) { + var value = node.value; + + if (node.type === 'string' || node.type === 'function') { + family.push(node); + } else if (node.type === 'word') { + if (!last) { + last = { type: 'word', value: '' }; + family.push(last); + } + + last.value += node.value; + } else if (node.type === 'space') { + if (last && index !== nodes.length - 1) { + last.value += ' '; + } + } else { + last = null; + } + }); + + family = family.map(function (node) { + if (node.type === 'string') { + if ( + !opts.removeQuotes || + intersection(node.value, keywords) || + /[0-9]/.test(node.value.slice(0, 1)) + ) { + return stringify(node); + } + + var escaped = node.value.split(/\s/).map(function (word, index, words) { + var next = words[index + 1]; + if (next && /^[^a-z]/i.test(next)) { + return word + '\\'; + } + + if (!/^[^a-z\d\xa0-\uffff_-]/i.test(word)) { + return word.replace(/([^a-z\d\xa0-\uffff_-])/gi, '\\$1'); + } + + if (/^[^a-z]/i.test(word) && index < 1) { + return '\\' + word; + } + + return word; + }).join(' '); + + if (escaped.length < node.value.length + 2) { + return escaped; + } + } + + return stringify(node); + }); + + if (opts.removeAfterKeyword) { + for (i = 0, max = family.length; i < max; i += 1) { + if (~keywords.indexOf(family[i])) { + family = family.slice(0, i + 1); + break; + } + } + } + + if (opts.removeDuplicates) { + family = uniqs(family); + } + + return [ + { + type: 'word', + value: family.join() + } + ]; +}; diff --git a/node_modules/postcss-minify-font-values/lib/minify-font.js b/node_modules/postcss-minify-font-values/lib/minify-font.js new file mode 100644 index 00000000..3287fd64 --- /dev/null +++ b/node_modules/postcss-minify-font-values/lib/minify-font.js @@ -0,0 +1,50 @@ +var unit = require('postcss-value-parser').unit; +var keywords = require('./keywords'); +var minifyFamily = require('./minify-family'); +var minifyWeight = require('./minify-weight'); + +module.exports = function (nodes, opts) { + var i, max, node, familyStart, family; + var hasSize = false; + + for (i = 0, max = nodes.length; i < max; i += 1) { + node = nodes[i]; + if (node.type === 'word') { + if (node.value === 'normal' || + ~keywords.style.indexOf(node.value) || + ~keywords.variant.indexOf(node.value) || + ~keywords.stretch.indexOf(node.value)) { + if (!hasSize) { + familyStart = i; + } + } else if (~keywords.weight.indexOf(node.value)) { + if (!hasSize) { + node.value = minifyWeight(node.value, opts); + familyStart = i; + } + } else if (~keywords.size.indexOf(node.value) || unit(node.value)) { + if (!hasSize) { + familyStart = i; + hasSize = true; + } + } + } else if (node.type === 'div') { + node.before = ''; + node.after = ''; + if (node.value === '/') { + familyStart = i + 1; + } + break; + } else if (node.type === 'space') { + node.value = ' '; + } + } + + if (!isNaN(familyStart)) { + familyStart += 2; + family = minifyFamily(nodes.slice(familyStart), opts); + nodes = nodes.slice(0, familyStart).concat(family); + } + + return nodes; +}; diff --git a/node_modules/postcss-minify-font-values/lib/minify-weight.js b/node_modules/postcss-minify-font-values/lib/minify-weight.js new file mode 100644 index 00000000..6b4cbfb5 --- /dev/null +++ b/node_modules/postcss-minify-font-values/lib/minify-weight.js @@ -0,0 +1,3 @@ +module.exports = function (value) { + return value === 'normal' ? '400' : value === 'bold' ? '700' : value; +}; diff --git a/node_modules/postcss-minify-font-values/lib/uniqs.js b/node_modules/postcss-minify-font-values/lib/uniqs.js new file mode 100644 index 00000000..a555b8e2 --- /dev/null +++ b/node_modules/postcss-minify-font-values/lib/uniqs.js @@ -0,0 +1,11 @@ +module.exports = function uniqueExcept (exclude) { + return function unique () { + var list = Array.prototype.concat.apply([], arguments); + return list.filter(function (item, i) { + if (item === exclude) { + return true; + } + return i === list.indexOf(item); + }); + }; +}; diff --git a/node_modules/postcss-minify-font-values/package.json b/node_modules/postcss-minify-font-values/package.json new file mode 100644 index 00000000..88c782b3 --- /dev/null +++ b/node_modules/postcss-minify-font-values/package.json @@ -0,0 +1,42 @@ +{ + "name": "postcss-minify-font-values", + "version": "1.0.5", + "description": "Minify font declarations with PostCSS", + "main": "index.js", + "files": [ + "index.js", + "lib" + ], + "scripts": { + "test": "tape test/*.js | tap-spec", + "posttest": "eslint index.js lib test" + }, + "author": "Bogdan Chadkin <trysound@yandex.ru>", + "license": "MIT", + "keywords": [ + "css", + "font", + "font-family", + "font-weight", + "optimise", + "postcss-plugin" + ], + "devDependencies": { + "eslint": "^1.3.1", + "tap-spec": "^4.1.0", + "tape": "^4.2.0" + }, + "dependencies": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/TrySound/postcss-minify-font-values.git" + }, + "bugs": { + "url": "https://github.com/TrySound/postcss-minify-font-values/issues" + }, + "homepage": "https://github.com/TrySound/postcss-minify-font-values" +} |
