Преглед изворни кода

dom: started parsing align-[content,items,self]

mattias пре 11 месеци
родитељ
комит
dec9a039d0
1 измењених фајлова са 342 додато и 13 уклоњено
  1. 342 13
      src/base/fresnel.dom.pas

+ 342 - 13
src/base/fresnel.dom.pas

@@ -151,6 +151,9 @@ type
     fcaFlexWrap,
     fcaFlexFlow, // shorthand for flex-[direction,flex-wrap]
     fcaFlex, // shorthand for flex-[grow,shrink,basis]
+    fcaAlignContent,
+    fcaAlignItems,
+    fcaAlignSelf,
     fcaJustifyContent,
     fcaJustifyItems,
     fcaJustifySelf,
@@ -260,6 +263,9 @@ const
     'flex-wrap',
     'flex-flow',
     'flex',
+    'align-content',
+    'align-items',
+    'align-self',
     'justify-content',
     'justify-items',
     'justify-self',
@@ -422,6 +428,9 @@ type
     function CheckFlexWrap(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexFlow(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlex(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckAlignContent(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckAlignItems(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckAlignSelf(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckJustifyContent(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckJustifyItems(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckJustifySelf(Resolver: TCSSBaseResolver): boolean; virtual;
@@ -441,6 +450,9 @@ type
       out aSystemFont: TCSSNumericalID; out aFamily, aStyle, aVariant, aWeight, aWidth, aSize, aLineHeight: TCSSString): boolean; virtual;
     function ReadFlex(Resolver: TCSSBaseResolver; Check: boolean; out Grow, Shrink, Basis: TCSSString): boolean; virtual;
     function ReadFlexFlow(Resolver: TCSSBaseResolver; Check: boolean; out Direction, Wrap: TCSSString): boolean; virtual;
+    function ReadAlignContent(Resolver: TCSSBaseResolver; Check: boolean; out MainKW, SubKW: TCSSNumericalID): boolean; virtual;
+    function ReadAlignItems(Resolver: TCSSBaseResolver; Check: boolean; out MainKW, SubKW: TCSSNumericalID): boolean; virtual;
+    function ReadAlignSelf(Resolver: TCSSBaseResolver; Check: boolean; out MainKW, SubKW: TCSSNumericalID): 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;
@@ -571,7 +583,8 @@ type
       kwGroove = kwGrid+1;
       kwHelp = kwGroove+1;
       kwHidden = kwHelp+1;
-      kwIcon = kwHidden+1;
+      kwHorizontalTB = kwHidden+1;
+      kwIcon = kwHorizontalTB+1;
       kwIn = kwIcon+1;
       kwInline = kwIn+1;
       kwInlineBlock = kwInline+1; // inline-block
@@ -628,7 +641,9 @@ type
       kwSemiCondensed = kwSelfStart+1; // semi-condensed
       kwSemiExpanded = kwSemiCondensed+1; // semi-expanded
       kwSEResize = kwSemiExpanded+1; // se-resize
-      kwSmall = kwSEResize+1;
+      kwSidewaysLR = kwSEResize+1; // sideways-lr
+      kwSidewaysRL = kwSidewaysLR+1; // sideways-rl
+      kwSmall = kwSidewaysRL+1;
       kwSmallCaps = kwSmall+1; // small-caps
       kwSmallCaption = kwSmallCaps+1; // small-caption
       kwSmaller = kwSmallCaption+1;
@@ -652,7 +667,9 @@ type
       kwUltraCondensed = kwTop+1; // ultra-condensed
       kwUltraExpanded = kwUltraCondensed+1; // ultra-expanded
       kwUnsafe = kwUltraExpanded+1;
-      kwVerticalText = kwUnsafe+1; // vertical-text
+      kwVerticalLR = kwUnsafe+1; // vertical-lr
+      kwVerticalRL = kwVerticalLR+1; // vertical-rl
+      kwVerticalText = kwVerticalRL+1; // vertical-text
       kwVisible = kwVerticalText+1;
       kwWait = kwVisible+1;
       kwWrap = kwWait+1; // w-resize
@@ -772,6 +789,9 @@ type
     Chk_FlexGrow_Dim: TCSSCheckAttrParams_Dimension;
     Chk_FlexShrink_Dim: TCSSCheckAttrParams_Dimension;
     Chk_FlexWrap_KeywordIDs: TCSSNumericalIDArray;
+    Chk_AlignContent_KeywordIDs: TCSSNumericalIDArray;
+    Chk_AlignItems_KeywordIDs: TCSSNumericalIDArray;
+    Chk_AlignSelf_KeywordIDs: TCSSNumericalIDArray;
     Chk_JustifyContent_KeywordIDs: TCSSNumericalIDArray;
     Chk_JustifyItems_KeywordIDs: TCSSNumericalIDArray;
     Chk_JustifySelf_KeywordIDs: TCSSNumericalIDArray;
@@ -1833,6 +1853,8 @@ begin
       break;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
   FirstIsX:=true;
   if (Keyword1=kwLeft) or (Keyword1=kwRight) then
   begin
@@ -1885,16 +1907,16 @@ begin
       ; // todo warn
     exit(false);
   end;
-  Result:=true;
   W:=Resolver.GetCompString;
   H:='auto';
   if not Resolver.ReadNext then
-    exit;
+    exit(Resolver.CurComp.Kind<>rvkInvalid);
   if Chk_BackgroundSize_Dim.Fits(Resolver.CurComp) then
   begin
     H:=Resolver.GetCompString;
     Resolver.ReadNext;
   end;
+  Result:=Resolver.CurComp.Kind=rvkNone;
 end;
 
 function TFresnelCSSRegistry.CheckBackgroundAttachment(Resolver: TCSSBaseResolver): boolean;
@@ -2035,6 +2057,27 @@ begin
   Result:=ReadFlex(Resolver,true,Grow,Shrink,Basis);
 end;
 
+function TFresnelCSSRegistry.CheckAlignContent(Resolver: TCSSBaseResolver): boolean;
+var
+  MainKW, SubKW: TCSSNumericalID;
+begin
+  Result:=ReadAlignContent(Resolver,true,MainKW,SubKW);
+end;
+
+function TFresnelCSSRegistry.CheckAlignItems(Resolver: TCSSBaseResolver): boolean;
+var
+  MainKW, SubKW: TCSSNumericalID;
+begin
+  Result:=ReadAlignItems(Resolver,true,MainKW,SubKW);
+end;
+
+function TFresnelCSSRegistry.CheckAlignSelf(Resolver: TCSSBaseResolver): boolean;
+var
+  MainKW, SubKW: TCSSNumericalID;
+begin
+  Result:=ReadAlignSelf(Resolver,true,MainKW,SubKW);
+end;
+
 function TFresnelCSSRegistry.CheckJustifyContent(Resolver: TCSSBaseResolver): boolean;
 begin
   Result:=Resolver.CheckAttribute_Keyword(Chk_JustifyContent_KeywordIDs);
@@ -2117,6 +2160,8 @@ begin
       exit;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
   if X=0 then
   begin
     if Y=0 then
@@ -2272,6 +2317,8 @@ begin
       AddLayer;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
   if HasLayer then
   begin
     AddLayer;
@@ -2391,6 +2438,8 @@ begin
     else
       aFamily:=Resolver.GetCompString;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
   Result:=(aSize>'') and (aFamily>'');
 end;
 
@@ -2446,6 +2495,7 @@ begin
       end;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
 
   if (Grow='') and (Basis='') then exit;
 
@@ -2490,6 +2540,7 @@ begin
       exit; // invalid
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
 
   if (Direction='') and (Wrap='') then exit;
 
@@ -2498,6 +2549,255 @@ begin
   Result:=true;
 end;
 
+function TFresnelCSSRegistry.ReadAlignContent(Resolver: TCSSBaseResolver; Check: boolean; out
+  MainKW, SubKW: TCSSNumericalID): boolean;
+var
+  KW: TCSSNumericalID;
+begin
+  Result:=false;
+  MainKW:=0;
+  SubKW:=0;
+  repeat
+    case Resolver.CurComp.Kind of
+    rvkKeyword:
+      begin
+        KW:=Resolver.CurComp.KeywordID;
+        case KW of
+        kwNormal, kwStretch:
+          begin
+            if MainKW>0 then
+              exit;
+            if SubKW>0 then
+              exit;
+            MainKW:=KW;
+          end;
+        kwStart,kwEnd,
+        kwFlexStart,kwFlexEnd,
+        kwCenter,
+        kwSpaceAround,kwSpaceBetween,kwSpaceEvenly:
+          begin
+            if MainKW>0 then
+              exit;
+            if (SubKW>0) and not (SubKW in [kwSafe,kwUnsafe]) then
+              exit;
+            MainKW:=KW;
+          end;
+        kwSafe,kwUnsafe:
+          begin
+            if (MainKW>0) and not (MainKW in [kwStart, kwEnd, kwFlexStart, kwFlexEnd,
+                kwCenter,
+                kwSpaceAround,kwSpaceBetween,kwSpaceEvenly]) then
+              exit;
+            if SubKW>0 then
+              exit;
+            SubKW:=KW;
+          end;
+        kwFirst,kwLast:
+          begin
+            if (MainKW>0) and (MainKW<>kwBaseline) then
+              exit;
+            if SubKW>0 then
+              exit;
+            SubKW:=KW;
+          end;
+        kwBaseline:
+          begin
+            if MainKW>0 then
+              exit;
+            if (SubKW>0) and not (SubKW in [kwFirst,kwLast]) then
+              exit;
+            MainKW:=KW;
+          end;
+        else
+          exit;
+        end;
+      end;
+    rvkFunction:
+      if Resolver.CurComp.FunctionID=afVar then
+        exit(Check)
+      else
+        exit;
+    end;
+  until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
+  Result:=MainKW>0;
+end;
+
+function TFresnelCSSRegistry.ReadAlignItems(Resolver: TCSSBaseResolver; Check: boolean; out MainKW,
+  SubKW: TCSSNumericalID): boolean;
+var
+  KW: TCSSNumericalID;
+begin
+  Result:=false;
+  MainKW:=0;
+  SubKW:=0;
+  repeat
+    case Resolver.CurComp.Kind of
+    rvkKeyword:
+      begin
+        KW:=Resolver.CurComp.KeywordID;
+        case KW of
+        kwNormal,kwStretch,kwAnchorCenter:
+          begin
+            if MainKW>0 then
+              exit;
+            if SubKW>0 then
+              exit;
+            MainKW:=KW;
+          end;
+        kwStart,kwEnd,
+        kwFlexStart,kwFlexEnd,
+        kwSelfStart,kwSelfEnd,
+        kwCenter:
+          begin
+            if MainKW>0 then
+              exit;
+            if (SubKW>0) and not (SubKW in [kwSafe,kwUnsafe]) then
+              exit;
+            MainKW:=KW;
+          end;
+        kwSafe,kwUnsafe:
+          begin
+            if (MainKW>0) and not (MainKW in [kwStart, kwEnd, kwFlexStart, kwFlexEnd,
+                kwSelfStart, kwSelfEnd, kwCenter]) then
+              exit;
+            if SubKW>0 then
+              exit;
+            SubKW:=KW;
+          end;
+        kwFirst,kwLast:
+          begin
+            // baseline with optional first or last
+            if (MainKW>0) and (MainKW<>kwBaseline) then
+              exit;
+            if SubKW>0 then
+              exit;
+            SubKW:=KW;
+          end;
+        kwBaseline:
+          begin
+            if MainKW>0 then
+              exit;
+            // baseline with optional first or last
+            if (SubKW>0) and not (SubKW in [kwFirst,kwLast]) then
+              exit;
+            MainKW:=KW;
+          end;
+        kwLegacy:
+          begin
+            // legacy followed by left or right
+            MainKW:=KW;
+            if not Resolver.ReadNext then exit;
+            case Resolver.CurComp.Kind of
+            rvkKeyword:
+              begin
+                KW:=Resolver.CurComp.KeywordID;
+                if not (KW in [kwCenter,kwLeft,kwRight]) then
+                  exit;
+                SubKW:=KW;
+              end;
+            rvkFunction:
+              if Resolver.CurComp.FunctionID=afVar then
+                exit(Check)
+              else
+                exit;
+            else
+              exit;
+            end;
+          end
+        else
+          exit;
+        end;
+      end;
+    rvkFunction:
+      if Resolver.CurComp.FunctionID=afVar then
+        exit(Check)
+      else
+        exit;
+    else
+      exit;
+    end;
+  until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
+  Result:=MainKW>0;
+end;
+
+function TFresnelCSSRegistry.ReadAlignSelf(Resolver: TCSSBaseResolver; Check: boolean; out MainKW,
+  SubKW: TCSSNumericalID): boolean;
+var
+  KW: TCSSNumericalID;
+begin
+  Result:=false;
+  MainKW:=0;
+  SubKW:=0;
+  repeat
+    case Resolver.CurComp.Kind of
+    rvkKeyword:
+      begin
+        KW:=Resolver.CurComp.KeywordID;
+        case KW of
+        kwAuto, kwNormal, kwStretch, kwAnchorCenter:
+          begin
+            if MainKW>0 then
+              exit;
+            if SubKW>0 then
+              exit;
+            MainKW:=KW;
+          end;
+        kwStart,kwEnd,
+        kwFlexStart,kwFlexEnd,
+        kwSelfStart,kwSelfEnd,
+        kwCenter:
+          begin
+            if MainKW>0 then
+              exit;
+            if (SubKW>0) and not (SubKW in [kwSafe,kwUnsafe]) then
+              exit;
+            MainKW:=KW;
+          end;
+        kwSafe,kwUnsafe:
+          begin
+            if (MainKW>0) and not (MainKW in [kwStart, kwEnd, kwFlexStart, kwFlexEnd,
+                kwSelfStart, kwSelfEnd, kwCenter]) then
+              exit;
+            if SubKW>0 then
+              exit;
+            SubKW:=KW;
+          end;
+        kwFirst,kwLast:
+          begin
+            if (MainKW>0) and (MainKW<>kwBaseline) then
+              exit;
+            if SubKW>0 then
+              exit;
+            SubKW:=KW;
+          end;
+        kwBaseline:
+          begin
+            if MainKW>0 then
+              exit;
+            if (SubKW>0) and not (SubKW in [kwFirst,kwLast]) then
+              exit;
+            MainKW:=KW;
+          end;
+        else
+          exit;
+        end;
+      end;
+    rvkFunction:
+      if Resolver.CurComp.FunctionID=afVar then
+        exit(Check)
+      else
+        exit;
+    end;
+  until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
+
+  Result:=MainKW>0;
+end;
+
 function TFresnelCSSRegistry.ReadJustifySelf(Resolver: TCSSBaseResolver; Check: boolean; out
   MainKW, SubKW: TCSSNumericalID): boolean;
 var
@@ -2569,6 +2869,7 @@ begin
         exit;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
 
   Result:=MainKW>0;
 end;
@@ -2587,7 +2888,7 @@ begin
       begin
         KW:=Resolver.CurComp.KeywordID;
         case KW of
-        kwNormal,kwStretch:
+        kwNormal,kwStretch,kwAnchorCenter:
           begin
             if MainKW>0 then
               exit;
@@ -2598,8 +2899,7 @@ begin
         kwStart,kwEnd,
         kwFlexStart,kwFlexEnd,
         kwSelfStart,kwSelfEnd,
-        kwCenter,kwLeft,kwRight,
-        kwAnchorCenter:
+        kwCenter,kwLeft,kwRight:
           begin
             if MainKW>0 then
               exit;
@@ -2636,14 +2936,15 @@ begin
           end;
         kwLegacy:
           begin
-            // legacy followed by left or right
+            // legacy can be followed by center, left or right
             MainKW:=KW;
-            if not Resolver.ReadNext then exit;
+            if not Resolver.ReadNext then
+              exit(Resolver.CurComp.Kind<>rvkInvalid);
             case Resolver.CurComp.Kind of
             rvkKeyword:
               begin
                 KW:=Resolver.CurComp.KeywordID;
-                if not (KW in [kwLeft,kwRight]) then
+                if not (KW in [kwCenter,kwLeft,kwRight]) then
                   exit;
                 SubKW:=KW;
               end;
@@ -2669,6 +2970,7 @@ begin
       exit;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
 
   Result:=MainKW>0;
 end;
@@ -2712,6 +3014,7 @@ begin
       exit;
     end;
   until not Resolver.ReadNext;
+  if Resolver.CurComp.Kind=rvkInvalid then exit;
 
   if Column='' then exit;
   if Row='' then Row:=Column;
@@ -3618,6 +3921,7 @@ begin
   AddKW(kwGroove,'groove'); // e.g. border-style
   AddKW(kwHelp,'help'); // e.g. cursor
   AddKW(kwHidden,'hidden'); // e.g. overflow-x, border-style, visible
+  AddKW(kwHorizontalTB,'horizontal-tb'); // e.g. writing-mode
   AddKW(kwIcon,'icon'); // e.g. font
   AddKW(kwIn,'in'); // e.g. background-image
   AddKW(kwInline,'inline'); // e.g. display-outside
@@ -3675,6 +3979,8 @@ begin
   AddKW(kwSemiCondensed,'semi-condensed'); // e.g. font-width
   AddKW(kwSemiExpanded,'semi-expanded'); // e.g. font-width
   AddKW(kwSEResize,'se-resize'); // e.g. cursor
+  AddKW(kwSidewaysLR,'sideways-lr'); // e.g. writing-mode
+  AddKW(kwSidewaysRL,'sideways-rl'); // e.g. writing-mode
   AddKW(kwSmall,'small'); // e.g. font-size
   AddKW(kwSmallCaps,'small-caps'); // e.g. font-variant
   AddKW(kwSmallCaption,'small-caption'); // e.g. font
@@ -3699,6 +4005,8 @@ begin
   AddKW(kwUltraCondensed,'ultra-condensed'); // e.g. font-width
   AddKW(kwUltraExpanded,'ultra-expanded'); // e.g. font-width
   AddKW(kwUnsafe,'unsafe'); // e.g. justify-content
+  AddKW(kwVerticalLR,'vertical-lr'); // e.g. writing-mode
+  AddKW(kwVerticalRL,'vertical-rl'); // e.g. writing-mode
   AddKW(kwVerticalText,'vertical-text'); // e.g. cursor
   AddKW(kwVisible,'visible'); // e.g. overflow-x, visible
   AddKW(kwWait,'wait'); // e.g. cursor
@@ -4045,13 +4353,33 @@ begin
     [fcaFlexGrow,fcaFlexShrink,fcaFlexBasis]);
 
   // shared attributes of flex+grid
+
+  // align-content
+  AddFresnelLonghand(fcaAlignContent,false,@CheckAlignContent,'normal');
+  Chk_AlignContent_KeywordIDs:=[kwNormal, kwCenter,kwStart,kwEnd,kwFlexEnd,kwCenter,
+    kwBaseline,kwFirst,kwLast,
+    kwSpaceBetween,kwSpaceAround,kwSpaceEvenly,kwStretch,
+    kwSafe,kwUnsafe];
+  // justify-items
+  AddFresnelLonghand(fcaAlignItems,false,@CheckAlignItems,'normal');
+  Chk_AlignItems_KeywordIDs:=[kwNormal,kwStretch,kwAnchorCenter,
+    kwCenter,kwStart,kwEnd,kwFlexStart,kwFlexEnd,kwSelfStart,kwSelfEnd,
+    kwSafe,kwUnsafe,
+    kwBaseline,kwFirst,kwLast];
+  // align-self
+  AddFresnelLonghand(fcaAlignSelf,false,@CheckAlignSelf,'auto');
+  Chk_AlignSelf_KeywordIDs:=[kwAuto,kwNormal,kwStretch,kwAnchorCenter,
+    kwCenter,kwStart,kwEnd,kwFlexStart,kwFlexEnd,kwSelfStart,kwSelfEnd,
+    kwSafe,kwUnsafe,
+    kwBaseline,kwFirst,kwLast];
+
   // justify-content
   AddFresnelLonghand(fcaJustifyContent,false,@CheckJustifyContent,'normal');
-  Chk_JustifyContent_KeywordIDs:=[kwStart,kwEnd,kwFlexEnd,kwCenter,kwLeft,kwRight,kwNormal,
+  Chk_JustifyContent_KeywordIDs:=[kwNormal,kwStart,kwEnd,kwFlexStart,kwFlexEnd,kwCenter,kwLeft,kwRight,
     kwSpaceBetween,kwSpaceAround,kwSpaceEvenly,kwStretch,kwSafe,kwUnsafe];
   // justify-items
   AddFresnelLonghand(fcaJustifyItems,false,@CheckJustifyItems,'legacy');
-  Chk_JustifyItems_KeywordIDs:=[kwNormal,kwStart,kwEnd,kwFlexStart,kwFlexEnd,
+  Chk_JustifyItems_KeywordIDs:=[kwLegacy,kwNormal,kwStart,kwEnd,kwFlexStart,kwFlexEnd,
     kwSelfStart,kwSelfEnd,kwCenter,kwLeft,kwRight,kwBaseline,kwFirst,kwLast,kwStretch,
     kwAnchorCenter,kwSafe,kwUnsafe];
   // justify-self
@@ -4059,6 +4387,7 @@ begin
   Chk_JustifySelf_KeywordIDs:=[kwAuto,kwNormal,kwStart,kwEnd,kwFlexStart,kwFlexEnd,
     kwSelfStart,kwSelfEnd,kwCenter,kwLeft,kwRight,kwBaseline,kwFirst,kwLast,kwStretch,
     kwAnchorCenter,kwSafe,kwUnsafe];
+
   // column-gap
   AddFresnelLonghand(fcaColumnGap,false,@CheckColumnRowGap,'normal');
   Chk_ColumnRowGap_Dim.AllowedKeywordIDs:=[kwNormal];