Skip to content

Commit 794ba52

Browse files
committed
Implemented grid shorthand
1 parent a394959 commit 794ba52

File tree

5 files changed

+213
-25
lines changed

5 files changed

+213
-25
lines changed

src/AngleSharp.Css/Declarations/GridDeclaration.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public ICssValue Convert(StringSource source)
6666
sizes.Add(size);
6767
}
6868

69-
//rows, sizes, isDense
69+
return new Grid(rows, null, sizes, isDense);
7070
}
7171
}
7272
}
@@ -97,9 +97,11 @@ public ICssValue Convert(StringSource source)
9797

9898
if (columns != null)
9999
{
100-
//columns, sizes, isDense
100+
return new Grid(null, columns, sizes, isDense);
101101
}
102102
}
103+
104+
return new Grid(null, null, sizes, isDense);
103105
}
104106
}
105107

@@ -121,13 +123,25 @@ public ICssValue Merge(ICssValue[] values)
121123
var templateRows = values[0];
122124
var templateColumns = values[1];
123125
var templateAreas = values[2];
126+
var autoRows = values[3];
127+
var autoColumns = values[4];
128+
var autoFlow = values[5];
129+
var rowGap = values[6];
130+
var columnGap = values[7];
124131

125132
if (templateRows == templateColumns && templateRows == templateAreas)
126133
{
127134
return templateRows;
128135
}
129-
else if (templateRows != null && templateColumns != null)
136+
else if (templateRows != null || templateColumns != null)
130137
{
138+
var tuple = (autoRows ?? autoColumns) as CssTupleValue;
139+
140+
if (tuple != null)
141+
{
142+
return new Grid(templateRows, templateColumns, tuple.Items, autoFlow != null);
143+
}
144+
131145
return new GridTemplate(templateRows, templateColumns, templateAreas);
132146
}
133147

@@ -154,6 +168,24 @@ public ICssValue[] Split(ICssValue value)
154168
null,
155169
};
156170
}
171+
else if (value is Grid)
172+
{
173+
var grid = (Grid)value;
174+
var dense = grid.Rows != null ? CssKeywords.Row : CssKeywords.Column;
175+
return new[]
176+
{
177+
grid.Rows,
178+
grid.Columns,
179+
null,
180+
grid.Columns != null ? new CssTupleValue(grid.Sizes) : null,
181+
grid.Rows != null ? new CssTupleValue(grid.Sizes) : null,
182+
grid.IsDense ? new Identifier(dense) as ICssValue : null,
183+
null,
184+
null,
185+
null,
186+
null,
187+
};
188+
}
157189
else if (value is Identifier)
158190
{
159191
return new[]

src/AngleSharp.Css/Declarations/GridTemplateDeclaration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public ICssValue Merge(ICssValue[] values)
5151
}
5252
else if (cols != null || rows != null || areas != null)
5353
{
54-
return new GridTemplate(cols, rows, areas);
54+
return new GridTemplate(rows, cols, areas);
5555
}
5656

5757
return null;

src/AngleSharp.Css/Parser/Micro/GridParser.cs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ static class GridParser
1010
{
1111
public static ICssValue ParseGridTemplate(this StringSource source)
1212
{
13+
var pos = source.Index;
14+
1315
if (source.IsIdentifier(CssKeywords.None))
1416
{
1517
return new Identifier(CssKeywords.None);
@@ -35,13 +37,70 @@ public static ICssValue ParseGridTemplate(this StringSource source)
3537
}
3638
else
3739
{
40+
var rowValues = new List<ICssValue>();
41+
var col = default(ICssValue);
42+
var areaValues = new List<ICssValue>();
43+
var hasValue = false;
44+
45+
while (!source.IsDone)
46+
{
47+
var value = source.ParseGridTemplateAlternative();
48+
49+
if (value == null)
50+
{
51+
break;
52+
}
53+
54+
hasValue = true;
55+
source.SkipSpacesAndComments();
56+
rowValues.Add(new CssTupleValue(new[] { value.Item1, value.Item3, value.Item4 }));
57+
areaValues.Add(new StringValue(value.Item2));
58+
}
59+
60+
if (hasValue)
61+
{
62+
if (source.Current == Symbols.Solidus)
63+
{
64+
source.SkipCurrentAndSpaces();
65+
col = source.ParseExplicitTrackList();
66+
67+
if (col == null)
68+
{
69+
source.BackTo(pos);
70+
return null;
71+
}
72+
}
3873

74+
var row = new CssTupleValue(rowValues.ToArray());
75+
var area = new CssTupleValue(areaValues.ToArray());
76+
return new GridTemplate(row, col, area);
77+
}
78+
}
79+
80+
source.BackTo(pos);
81+
return null;
82+
}
83+
84+
private static Tuple<LineNames, String, ICssValue, LineNames> ParseGridTemplateAlternative(this StringSource source)
85+
{
86+
var namesHead = source.ParseLineNames();
87+
source.SkipSpacesAndComments();
88+
var str = source.ParseString();
89+
source.SkipSpacesAndComments();
90+
91+
if (str != null)
92+
{
93+
var trackSize = source.ParseTrackSize();
94+
source.SkipSpacesAndComments();
95+
var namesTail = source.ParseLineNames();
96+
source.SkipSpacesAndComments();
97+
return Tuple.Create(namesHead, str, trackSize, namesTail);
3998
}
4099

41100
return null;
42101
}
43102

44-
public static ICssValue ParseLineNames(this StringSource source)
103+
public static LineNames ParseLineNames(this StringSource source)
45104
{
46105
var pos = source.Index;
47106

@@ -256,6 +315,7 @@ public static ICssValue ParseExplicitTrackList(this StringSource source)
256315
public static ICssValue ParseAutoTrackList(this StringSource source)
257316
{
258317
var values = new List<ICssValue>();
318+
var pos = source.Index;
259319
var head = source.ParseRepeatValue(s => s.ParseFixedSize() ?? s.ParseFixedRepeat(), true);
260320

261321
if (head != null)
@@ -268,6 +328,7 @@ public static ICssValue ParseAutoTrackList(this StringSource source)
268328

269329
if (repeat == null)
270330
{
331+
source.BackTo(pos);
271332
return null;
272333
}
273334

@@ -287,6 +348,7 @@ public static ICssValue ParseAutoTrackList(this StringSource source)
287348
private static ICssValue ParseRepeatValue(this StringSource source, Func<StringSource, ICssValue> parseTrack, Boolean hasSize = false)
288349
{
289350
var values = new List<ICssValue>();
351+
var pos = source.Index;
290352

291353
while (!source.IsDone)
292354
{
@@ -315,6 +377,7 @@ private static ICssValue ParseRepeatValue(this StringSource source, Func<StringS
315377
return new CssTupleValue(values.ToArray());
316378
}
317379

380+
source.BackTo(pos);
318381
return null;
319382
}
320383
}

src/AngleSharp.Css/Values/Grid.cs

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,93 @@
11
namespace AngleSharp.Css.Values
22
{
3+
using AngleSharp.Css.Converters;
34
using AngleSharp.Css.Dom;
45
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
58

69
/// <summary>
710
/// Represents a CSS grid definition.
811
/// </summary>
912
public sealed class Grid : ICssValue
1013
{
14+
#region Fields
15+
16+
private readonly ICssValue _rows;
17+
private readonly ICssValue _columns;
18+
private readonly ICssValue[] _sizes;
19+
private readonly Boolean _dense;
20+
21+
#endregion
22+
23+
#region ctor
24+
1125
/// <summary>
1226
/// Creates a new CSS grid.
1327
/// </summary>
14-
public Grid()
28+
public Grid(ICssValue rows, ICssValue columns, IEnumerable<ICssValue> sizes, Boolean dense)
1529
{
16-
30+
_rows = rows;
31+
_columns = columns;
32+
_sizes = sizes.ToArray();
33+
_dense = dense;
1734
}
1835

36+
#endregion
37+
38+
#region Properties
39+
40+
/// <summary>
41+
/// Gets the assigned grid rows.
42+
/// </summary>
43+
public ICssValue Rows => _rows;
44+
45+
/// <summary>
46+
/// Gets the assigned grid columns.
47+
/// </summary>
48+
public ICssValue Columns => _columns;
49+
50+
/// <summary>
51+
/// Gets the assigned grid sizes.
52+
/// </summary>
53+
public ICssValue[] Sizes => _sizes;
54+
55+
/// <summary>
56+
/// Gets if the grid is dense, otherwise loose.
57+
/// </summary>
58+
public Boolean IsDense => _dense;
59+
1960
/// <summary>
2061
/// Gets the CSS text representation.
2162
/// </summary>
2263
public String CssText
2364
{
2465
get
2566
{
26-
return String.Empty;
67+
var rows = _rows?.CssText;
68+
var cols = _columns?.CssText;
69+
var flow = CssKeywords.AutoFlow;
70+
var auto = _sizes.Join(" ");
71+
var head = _dense ? String.Concat(flow, " ", CssKeywords.Dense) : flow;
72+
73+
if (!String.IsNullOrEmpty(auto))
74+
{
75+
head = String.Concat(head, " ", auto);
76+
}
77+
78+
if (String.IsNullOrEmpty(rows))
79+
{
80+
rows = head;
81+
}
82+
else
83+
{
84+
cols = head;
85+
}
86+
87+
return String.Concat(rows, " / ", cols);
2788
}
2889
}
90+
91+
#endregion
2992
}
3093
}

0 commit comments

Comments
 (0)