Browse Source

fcl-css: fixed parsing -0.5

mattias 1 year ago
parent
commit
d02db5da41

+ 11 - 7
packages/fcl-css/src/fpcssscanner.pp

@@ -202,7 +202,6 @@ Const
   AlNum = Alpha+Num;
   AlNumIden = Alpha+Num+['-'];
   WhiteSpace = [' ',#9];
-  WhiteSpaceEx = WhiteSpace+[#0];
 
 type
   TMessageArgs = array of string;
@@ -942,13 +941,18 @@ begin
     ']': CharToken(ctkRBRACKET);
     '=': CharToken(ctkEQUALS);
     '-':
-      begin
-      if (TokenStr[1] in ['0'..'9']) then
-        Result:=DoNumericLiteral
-      else if Not (TokenStr[1] in WhiteSpaceEx) then
-        Result:=DoIdentifierLike
-      else
+      case TokenStr[1] of
+      '0'..'9':
+        Result:=DoNumericLiteral;
+      '.':
+        if TokenStr[2] in ['0'..'9'] then
+          Result:=DoNumericLiteral
+        else
+          CharToken(ctkMINUS);
+      #9,' ',#0:
         CharToken(ctkMINUS);
+      else
+        Result:=DoIdentifierLike;
       end;
     '+': CharToken(ctkPLUS);
     '%': CharToken(ctkPERCENTAGE);

+ 1 - 0
packages/fcl-css/src/fpcsstree.pp

@@ -1077,6 +1077,7 @@ function TCSSFloatElement.GetAsString(aFormat: Boolean;
 begin
   Str(Value:5:2,Result);
   Result:=TrimLeft(Result); // Space for positive numbers
+  Result:=Result+CSSUnitNames[Units];
   if aFormat then
     Result:=aIndent+Result;
 end;

+ 18 - 0
packages/fcl-css/tests/tccssparser.pp

@@ -92,6 +92,7 @@ type
     Procedure TestOneDeclarationStringValue;
     Procedure TestOneDeclarationHashValue;
     Procedure TestOneDeclarationURLValue;
+    Procedure TestOneDeclarationFloatValue;
     Procedure TestOneDeclarationMultiValue;
     Procedure TestOneDeclarationMultiListValue;
     Procedure TestOneDeclarationExprValue;
@@ -691,6 +692,23 @@ begin
   AssertEquals('Value ','b.c',U.Value);
 end;
 
+procedure TTestCSSParser.TestOneDeclarationFloatValue;
+var
+  R : TCSSRuleElement;
+  D : TCSSDeclarationElement;
+  F : TCSSFloatElement;
+
+begin
+  R:=ParseRule('{ a : -.5em; }');
+  AssertEquals('selector count',0,R.SelectorCount);
+  D:=CheckDeclaration(R,0,'a');
+  AssertEquals('Value count', 1, D.ChildCount);
+  F:=TCSSFloatElement(CheckClass('Value', TCSSFloatElement,D.Children[0]));
+  AssertEquals('Value ',-0.5,F.Value);
+  if F.Units<>cuEM then
+    Fail('Units expected unit em, but found '+IntToStr(ord(F.Units)));
+end;
+
 procedure TTestCSSParser.TestOneDeclarationMultiValue;
 var
   R : TCSSRuleElement;

+ 6 - 0
packages/fcl-css/tests/tccssscanner.pp

@@ -108,6 +108,7 @@ type
     Procedure TestDOT;
     Procedure TestINT;
     Procedure TestFLOAT;
+    Procedure TestFLOATNegDot;
     Procedure TestDOUBLE;
     Procedure TestHASH1;
     Procedure TestHASH2;
@@ -426,6 +427,11 @@ begin
   DoTestFloat(123.3,'123.3');
 end;
 
+procedure TTestCSSScanner.TestFLOATNegDot;
+begin
+  DoTestFloat(-0.123,'-.123');
+end;
+
 procedure TTestCSSScanner.TestDOUBLE;
 begin
   DoTestFloat(123.3,'123.3');

+ 7 - 0
packages/fcl-css/tests/tccsstree.pp

@@ -56,6 +56,7 @@ type
     Procedure TestINTEGER;
     Procedure TestSTRING;
     Procedure TestFLOAT;
+    Procedure TestFLOATNeg;
     Procedure TestIDENTIFIER;
     Procedure TestHashIDENTIFIER;
     Procedure TestCLASSNAME;
@@ -411,6 +412,12 @@ begin
   AssertEquals('Value','1.23',Element.AsString);
 end;
 
+procedure TCSSTreeAsStringTest.TestFLOATNeg;
+begin
+  TCSSFloatElement(CreateElement(TCSSFloatElement)).Value:=-1.23;
+  AssertEquals('Value','-1.23',Element.AsString);
+end;
+
 procedure TCSSTreeAsStringTest.TestIDENTIFIER;
 begin
   TCSSIdentifierElement(CreateElement(TCSSIdentifierElement)).Value:='abc';