diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-11-05 17:16:09 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-11-05 17:16:09 +0800 |
| commit | d1d9f00b1bd660842addf5e6b1d1b64c852a9eea (patch) | |
| tree | 60fb37ae73a1109d95301de5ec9b61b5726a4b61 /node_modules/postcss-calc/src/lib/stringifier.js | |
| parent | 7c85166c4cbdd862fc4252007d2df5befcbc2a58 (diff) | |
added hover prefixer
Diffstat (limited to 'node_modules/postcss-calc/src/lib/stringifier.js')
| -rw-r--r-- | node_modules/postcss-calc/src/lib/stringifier.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/node_modules/postcss-calc/src/lib/stringifier.js b/node_modules/postcss-calc/src/lib/stringifier.js new file mode 100644 index 00000000..50195bb5 --- /dev/null +++ b/node_modules/postcss-calc/src/lib/stringifier.js @@ -0,0 +1,98 @@ +'use strict'; +const order = { + '*': 0, + '/': 0, + '+': 1, + '-': 1, +}; + +/** + * @param {number} value + * @param {number | false} prec + */ +function round(value, prec) { + if (prec !== false) { + const precision = Math.pow(10, prec); + return Math.round(value * precision) / precision; + } + return value; +} + +/** + * @param {number | false} prec + * @param {import('../parser').CalcNode} node + * + * @return {string} + */ +function stringify(node, prec) { + switch (node.type) { + case 'MathExpression': { + const { left, right, operator: op } = node; + let str = ''; + if (left.type === 'MathExpression' && order[op] < order[left.operator]) { + str += `(${stringify(left, prec)})`; + } else { + str += stringify(left, prec); + } + + str += order[op] ? ` ${node.operator} ` : node.operator; + + if ( + right.type === 'MathExpression' && + order[op] < order[right.operator] + ) { + str += `(${stringify(right, prec)})`; + } else { + str += stringify(right, prec); + } + + return str; + } + case 'Number': + return round(node.value, prec).toString(); + case 'Function': + return node.value.toString(); + case 'ParenthesizedExpression': + return `(${stringify(node.content, prec)})`; + default: + return round(node.value, prec) + node.unit; + } +} + +/** + * @param {string} calc + * @param {import('../parser').CalcNode} node + * @param {string} originalValue + * @param {{precision: number | false, warnWhenCannotResolve: boolean}} options + * @param {import("postcss").Result} result + * @param {import("postcss").ChildNode} item + * + * @returns {string} + */ +module.exports = function (calc, node, originalValue, options, result, item) { + let str = stringify(node, options.precision); + + const shouldPrintCalc = + node.type === 'MathExpression' || node.type === 'Function' || + node.type === 'ParenthesizedExpression'; + + if (shouldPrintCalc) { + // if calc expression couldn't be resolved to a single value, re-wrap it as + // a calc() + if (node.type === 'ParenthesizedExpression') { + str = `${calc}${str}`; + } else { + str = `${calc}(${str})`; + } + + // if the warnWhenCannotResolve option is on, inform the user that the calc + // expression could not be resolved to a single value + if (options.warnWhenCannotResolve) { + result.warn('Could not reduce expression: ' + originalValue, { + plugin: 'postcss-calc', + node: item, + }); + } + } + return str; +}; |
