diff --git a/src/fromTransformAttribute.autogenerated.js b/src/fromTransformAttribute.autogenerated.js index 2d574c6..f7f3130 100644 --- a/src/fromTransformAttribute.autogenerated.js +++ b/src/fromTransformAttribute.autogenerated.js @@ -198,8 +198,11 @@ function peg$parse(input, options) { var peg$f10 = function(n) { return n; }; var peg$f11 = function(n1, n2) { return [n1, n2]; }; var peg$f12 = function(ds) { return ds.join(""); }; - var peg$f13 = function(d1, d2) { return [d1 ? d1.join("") : null, ".", d2.join("")].join(""); }; - var peg$f14 = function(d) { return d.join(""); }; + var peg$f13 = function(f, e) { return [f, e || null].join("")}; + var peg$f14 = function(d, e) { return [d, e].join("")}; + var peg$f15 = function(d1, d2) { return [d1 ? d1.join("") : null, ".", d2.join("")].join(""); }; + var peg$f16 = function(d) { return d.join(""); }; + var peg$f17 = function(s, d) { return ['e', s, d.join("")].join("") }; var peg$currPos = 0; var peg$savedPos = 0; @@ -1228,8 +1231,8 @@ function peg$parse(input, options) { if (s2 === peg$FAILED) { s2 = null; } - s1 = [s1, s2]; - s0 = s1; + peg$savedPos = s0; + s0 = peg$f13(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1240,8 +1243,8 @@ function peg$parse(input, options) { if (s1 !== peg$FAILED) { s2 = peg$parseexponent(); if (s2 !== peg$FAILED) { - s1 = [s1, s2]; - s0 = s1; + peg$savedPos = s0; + s0 = peg$f14(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1279,7 +1282,7 @@ function peg$parse(input, options) { s3 = peg$parsedigitSequence(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f13(s1, s3); + s0 = peg$f15(s1, s3); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1300,7 +1303,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f14(s1); + s0 = peg$f16(s1); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1337,8 +1340,8 @@ function peg$parse(input, options) { } s3 = peg$parsedigitSequence(); if (s3 !== peg$FAILED) { - s1 = [s1, s2, s3]; - s0 = s1; + peg$savedPos = s0; + s0 = peg$f17(s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; diff --git a/src/fromTransformAttribute.pegjs b/src/fromTransformAttribute.pegjs index ac5ea64..4135c12 100644 --- a/src/fromTransformAttribute.pegjs +++ b/src/fromTransformAttribute.pegjs @@ -83,15 +83,15 @@ integerConstant = ds:digitSequence { return ds.join(""); } floatingPointConstant - = fractionalConstant exponent? - / digitSequence exponent + = f:fractionalConstant e:exponent? { return [f, e || null].join("")} + / d:digitSequence e:exponent { return [d, e].join("")} fractionalConstant "fractionalConstant" = d1:digitSequence? "." d2:digitSequence { return [d1 ? d1.join("") : null, ".", d2.join("")].join(""); } / d:digitSequence "." { return d.join(""); } exponent - = [eE] sign? digitSequence + = [eE] s:sign? d:digitSequence { return ['e', s, d.join("")].join("") } sign = [+-] diff --git a/test/fromTransformAttribute.pegjs.spec.js b/test/fromTransformAttribute.pegjs.spec.js index 171276d..cffed72 100644 --- a/test/fromTransformAttribute.pegjs.spec.js +++ b/test/fromTransformAttribute.pegjs.spec.js @@ -31,6 +31,21 @@ describe('fromTransformAttribute.pegjs', () => { }) }) + describe('exponential values', () => { + it('should parse without errors', () => { + // it is tested with rotate function, but it doesn't matter because any parser make use of the same number parser + expect(parse('rotate(1e1)')).toEqual([{ type: 'rotate', angle: 1e1 }]) + expect(parse('rotate(-1e1)')).toEqual([{ type: 'rotate', angle: -1e1 }]) + expect(parse('rotate(1e-1)')).toEqual([{ type: 'rotate', angle: 1e-1 }]) + expect(parse('rotate(-1e-1)')).toEqual([{ type: 'rotate', angle: -1e-1 }]) + + expect(parse('rotate(1.1e1)')).toEqual([{ type: 'rotate', angle: 1.1e1 }]) + expect(parse('rotate(-1.1e1)')).toEqual([{ type: 'rotate', angle: -1.1e1 }]) + expect(parse('rotate(1.1e-1)')).toEqual([{ type: 'rotate', angle: 1.1e-1 }]) + expect(parse('rotate(-1.1e-1)')).toEqual([{ type: 'rotate', angle: -1.1e-1 }]) + }) + }) + describe('complex transformations', () => { it('should parse in the right order', () => { expect(parse('translate(1,2) translate(3,4) translate(5,6)')).toEqual([