Browse Source

dom: started parsing column-gap, row-gap, gap

mattias 11 months ago
parent
commit
b9c09ae307
1 changed files with 110 additions and 5 deletions
  1. 110 5
      src/base/fresnel.dom.pas

+ 110 - 5
src/base/fresnel.dom.pas

@@ -148,11 +148,14 @@ type
     fcaFlexGrow,
     fcaFlexShrink,
     fcaFlexWrap,
-    fcaFlexFlow,
-    fcaFlex,
+    fcaFlexFlow, // shorthand for flex-[direction,flex-wrap]
+    fcaFlex, // shorthand for flex-[grow,shrink,basis]
     fcaJustifyContent,
     fcaJustifyItems,
-    fcaJustifySelf
+    fcaJustifySelf,
+    fcaColumnGap,
+    fcaRowGap,
+    fcaGap // shorthand for [column,row]-gap
     );
   TFresnelCSSAttributes = set of TFresnelCSSAttribute;
   TFresnelCSSAttributeArray = array of TFresnelCSSAttribute;
@@ -257,7 +260,10 @@ const
     'flex',
     'justify-content',
     'justify-items',
-    'justify-self'
+    'justify-self',
+    'column-gap',
+    'row-gap',
+    'gap'
     );
 
 type
@@ -416,6 +422,8 @@ type
     function CheckJustifyContent(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckJustifyItems(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckJustifySelf(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckColumnRowGap(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckGap(Resolver: TCSSBaseResolver): boolean; virtual;
 
     // utility check/parse functions
     function CheckLinearGradient(Resolver: TCSSBaseResolver; Check: boolean): boolean; virtual;
@@ -432,6 +440,7 @@ type
     function ReadFlexFlow(Resolver: TCSSBaseResolver; Check: boolean; out Direction, Wrap: TCSSString): boolean; virtual;
     function ReadJustifySelf(Resolver: TCSSBaseResolver; Check: boolean; out MainKW, SubKW: TCSSNumericalID): boolean; virtual;
     function ReadJustifyItems(Resolver: TCSSBaseResolver; Check: boolean; out MainKW, SubKW: TCSSNumericalID): boolean; virtual;
+    function ReadGap(Resolver: TCSSBaseResolver; Check: boolean; out Column, Row: TCSSString): boolean; virtual;
     function IsColor(const ResValue: TCSSResCompValue): boolean; virtual;
     procedure SplitLonghandSides(var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray;
       Top, Right, Bottom, Left: TFresnelCSSAttribute; const Found: TCSSStringArray);
@@ -450,6 +459,7 @@ type
     procedure SplitFlexFlow(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual;
     procedure SplitFont(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual; // todo systemfont
     procedure SplitFontStretch(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual; // todo systemfont
+    procedure SplitGap(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual; // todo systemfont
     procedure SplitMargin(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual;
     procedure SplitMarginBlock(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual;
     procedure SplitMarginInline(Resolver: TCSSBaseResolver; var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray); virtual;
@@ -480,6 +490,7 @@ type
     function GetFontVariant(El: TFresnelElement): string; virtual;
     function GetFontWidth(El: TFresnelElement): string; virtual;
     function GetFontWeight(El: TFresnelElement): string; virtual;
+    function GetGap(El: TFresnelElement): string; virtual;
     function GetMargin(El: TFresnelElement): string; virtual;
     function GetMarginBlock(El: TFresnelElement): string; virtual;
     function GetMarginInline(El: TFresnelElement): string; virtual;
@@ -760,6 +771,7 @@ type
     Chk_JustifyContent_KeywordIDs: TCSSNumericalIDArray;
     Chk_JustifyItems_KeywordIDs: TCSSNumericalIDArray;
     Chk_JustifySelf_KeywordIDs: TCSSNumericalIDArray;
+    Chk_ColumnRowGap_Dim: TCSSCheckAttrParams_Dimension;
 
     constructor Create;
     procedure Init; override;
@@ -2033,6 +2045,18 @@ begin
   Result:=ReadJustifySelf(Resolver,true,MainKW,SubKW);
 end;
 
+function TFresnelCSSRegistry.CheckColumnRowGap(Resolver: TCSSBaseResolver): boolean;
+begin
+  Result:=Resolver.CheckAttribute_Dimension(Chk_ColumnRowGap_Dim);
+end;
+
+function TFresnelCSSRegistry.CheckGap(Resolver: TCSSBaseResolver): boolean;
+var
+  Column, Row: TCSSString;
+begin
+  Result:=ReadGap(Resolver,true,Column,Row);
+end;
+
 function TFresnelCSSRegistry.ReadBackgroundRepeat(Resolver: TCSSBaseResolver; Check: boolean; out
   X, Y: TCSSNumericalID): boolean;
 // For example:
@@ -2414,6 +2438,8 @@ begin
     end;
   until not Resolver.ReadNext;
 
+  if (Grow='') and (Basis='') then exit;
+
   if Grow='' then Grow:='1';
   if Shrink='' then Shrink:='0';
   if Basis='' then Basis:='auto';
@@ -2456,6 +2482,8 @@ begin
     end;
   until not Resolver.ReadNext;
 
+  if (Direction='') and (Wrap='') then exit;
+
   if Direction='' then Direction:='row';
   if Wrap='' then Wrap:='nowrap';
   Result:=true;
@@ -2532,7 +2560,8 @@ begin
         exit;
     end;
   until not Resolver.ReadNext;
-  Result:=true;
+
+  Result:=MainKW>0;
 end;
 
 function TFresnelCSSRegistry.ReadJustifyItems(Resolver: TCSSBaseResolver; Check: boolean; out
@@ -2631,6 +2660,53 @@ begin
       exit;
     end;
   until not Resolver.ReadNext;
+
+  Result:=MainKW>0;
+end;
+
+function TFresnelCSSRegistry.ReadGap(Resolver: TCSSBaseResolver; Check: boolean; out Column,
+  Row: TCSSString): boolean;
+begin
+  Result:=false;
+  Column:='';
+  Row:='';
+  repeat
+    case Resolver.CurComp.Kind of
+    rvkKeyword:
+      if Resolver.CurComp.KeywordID=kwNormal then
+      begin
+        if Column='' then
+          Column:=Keywords[kwNormal]
+        else if Row='' then
+          Row:=Keywords[kwNormal]
+        else
+          exit;
+      end else
+        exit;
+    rvkFloat:
+      begin
+        if not Resolver.IsLengthOrPercentage(false) then
+          exit;
+        if Column='' then
+          Column:=Resolver.GetCompString
+        else if Row='' then
+          Row:=Resolver.GetCompString
+        else
+          exit;
+      end;
+    rvkFunction:
+      if Resolver.CurComp.FunctionID=afVar then
+        exit(Check)
+      else
+        exit; // todo calc()
+    else
+      exit;
+    end;
+  until not Resolver.ReadNext;
+
+  if Column='' then exit;
+  if Row='' then Row:=Column;
+
   Result:=true;
 end;
 
@@ -2974,6 +3050,20 @@ begin
   Values[0]:=Resolver.CurValue;
 end;
 
+procedure TFresnelCSSRegistry.SplitGap(Resolver: TCSSBaseResolver;
+  var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray);
+var
+  Column, Row: TCSSString;
+begin
+  if not ReadGap(Resolver,false,Column,Row) then exit;
+  SetLength(AttrIDs,2);
+  AttrIDs[0]:=FresnelAttrs[fcaColumnGap].Index;
+  AttrIDs[1]:=FresnelAttrs[fcaRowGap].Index;
+  SetLength(Values,2);
+  Values[0]:=Column;
+  Values[1]:=Row;
+end;
+
 procedure TFresnelCSSRegistry.SplitMargin(Resolver: TCSSBaseResolver;
   var AttrIDs: TCSSNumericalIDArray; var Values: TCSSStringArray);
 var
@@ -3266,6 +3356,15 @@ begin
   Result:=FloatToCSSStr(El.Font.GetWeight);
 end;
 
+function TFresnelCSSRegistry.GetGap(El: TFresnelElement): string;
+var
+  Column, Row: String;
+begin
+  Column:=El.GetComputedString(fcaColumnGap);
+  Row:=El.GetComputedString(fcaRowGap);
+  Result:=Column+' '+Row;
+end;
+
 function TFresnelCSSRegistry.GetMargin(El: TFresnelElement): string;
 var
   Margins: array[TFresnelCSSSide] of TFresnelLength;
@@ -3938,6 +4037,12 @@ begin
   Chk_JustifySelf_KeywordIDs:=[kwAuto,kwNormal,kwStart,kwEnd,kwFlexStart,kwFlexEnd,
     kwSelfStart,kwSelfEnd,kwCenter,kwLeft,kwRight,kwBaseline,kwFirst,kwLast,kwStretch,
     kwAnchorCenter,kwSafe,kwUnsafe];
+  AddFresnelLonghand(fcaColumnGap,false,@CheckColumnRowGap,'normal');
+  AddFresnelLonghand(fcaRowGap,false,@CheckColumnRowGap,'normal');
+  Chk_ColumnRowGap_Dim.AllowedKeywordIDs:=[kwNormal];
+  Chk_ColumnRowGap_Dim.AllowedUnits:=cuAllLengthsAndPercent;
+  Chk_ColumnRowGap_Dim.AllowFrac:=true;
+  AddFresnelShorthand(fcaGap,@CheckGap,@SplitGap,@GetGap,[fcaColumnGap,fcaRowGap]);
 
   // pseudo classes - - - - - - - - - - - - - - - - - - - - - -
   for PseudoCl in TFresnelCSSPseudoClass do