|
@@ -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
|