summaryrefslogtreecommitdiff
path: root/node_modules/css-tree/lib/syntax/node/Ratio.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/css-tree/lib/syntax/node/Ratio.js
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/css-tree/lib/syntax/node/Ratio.js')
-rw-r--r--node_modules/css-tree/lib/syntax/node/Ratio.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/node_modules/css-tree/lib/syntax/node/Ratio.js b/node_modules/css-tree/lib/syntax/node/Ratio.js
new file mode 100644
index 00000000..c2e08a51
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Ratio.js
@@ -0,0 +1,59 @@
+import { isDigit, Delim, Number as NumberToken } from '../../tokenizer/index.js';
+
+const SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+const FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+// Terms of <ratio> should be a positive numbers (not zero or negative)
+// (see https://drafts.csswg.org/mediaqueries-3/#values)
+// However, -o-min-device-pixel-ratio takes fractional values as a ratio's term
+// and this is using by various sites. Therefore we relax checking on parse
+// to test a term is unsigned number without an exponent part.
+// Additional checking may be applied on lexer validation.
+function consumeNumber() {
+ this.skipSC();
+
+ const value = this.consume(NumberToken);
+
+ for (let i = 0; i < value.length; i++) {
+ const code = value.charCodeAt(i);
+ if (!isDigit(code) && code !== FULLSTOP) {
+ this.error('Unsigned number is expected', this.tokenStart - value.length + i);
+ }
+ }
+
+ if (Number(value) === 0) {
+ this.error('Zero number is not allowed', this.tokenStart - value.length);
+ }
+
+ return value;
+}
+
+export const name = 'Ratio';
+export const structure = {
+ left: String,
+ right: String
+};
+
+// <positive-integer> S* '/' S* <positive-integer>
+export function parse() {
+ const start = this.tokenStart;
+ const left = consumeNumber.call(this);
+ let right;
+
+ this.skipSC();
+ this.eatDelim(SOLIDUS);
+ right = consumeNumber.call(this);
+
+ return {
+ type: 'Ratio',
+ loc: this.getLocation(start, this.tokenStart),
+ left,
+ right
+ };
+}
+
+export function generate(node) {
+ this.token(NumberToken, node.left);
+ this.token(Delim, '/');
+ this.token(NumberToken, node.right);
+}