Skip to content

Commit 706ed93

Browse files
authored
Merge pull request #88 from jogibear9988/fix85
fix grid area, fixes #85
2 parents f5f39c0 + 97a650f commit 706ed93

File tree

2 files changed

+167
-7
lines changed

2 files changed

+167
-7
lines changed

src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs

+133
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,139 @@ public void CssGridAreaSingleValueLegal()
527527
Assert.AreEqual("2 / auto / auto / auto", property.Value);
528528
}
529529

530+
[Test]
531+
public void CssGridAreaTextValueLegal1()
532+
{
533+
var source = "#nav-header {grid-area: aaa; }";
534+
var css = ParseStyleSheet(source);
535+
var text = css.Rules[0].CssText;
536+
537+
var expected = "#nav-header { grid-area: aaa / aaa / aaa / aaa }";
538+
Assert.AreEqual(expected, text);
539+
}
540+
541+
542+
[Test]
543+
public void CssGridAreaTextValueLegal2()
544+
{
545+
var source = "#nav-header {grid-area: aaa / bbb; }";
546+
var css = ParseStyleSheet(source);
547+
var text = css.Rules[0].CssText;
548+
549+
var expected = "#nav-header { grid-area: aaa / bbb / aaa / bbb }";
550+
Assert.AreEqual(expected, text);
551+
}
552+
553+
[Test]
554+
public void CssGridAreaTextValueLegal3()
555+
{
556+
var source = "#nav-header {grid-area: 1 / 2; }";
557+
var css = ParseStyleSheet(source);
558+
var text = css.Rules[0].CssText;
559+
560+
var expected = "#nav-header { grid-area: 1 / 2 / auto / auto }";
561+
Assert.AreEqual(expected, text);
562+
}
563+
564+
[Test]
565+
public void CssGridAreaTextValueLegal4()
566+
{
567+
var source = "#nav-header {grid-area: aaa / 2; }";
568+
var css = ParseStyleSheet(source);
569+
var text = css.Rules[0].CssText;
570+
571+
var expected = "#nav-header { grid-area: aaa / 2 / aaa / auto }";
572+
Assert.AreEqual(expected, text);
573+
}
574+
575+
[Test]
576+
public void CssGridAreaTextValueLegal5()
577+
{
578+
var source = "#nav-header {grid-area: aaa / bbb / ccc; }";
579+
var css = ParseStyleSheet(source);
580+
var text = css.Rules[0].CssText;
581+
582+
var expected = "#nav-header { grid-area: aaa / bbb / ccc / bbb }";
583+
Assert.AreEqual(expected, text);
584+
}
585+
586+
[Test]
587+
public void CssGridAreaTextValueLegal6()
588+
{
589+
var source = "#nav-header {grid-area: aaa / bbb / ccc; }";
590+
var css = ParseStyleSheet(source);
591+
var text = css.Rules[0].CssText;
592+
593+
var expected = "#nav-header { grid-area: aaa / bbb / ccc / bbb }";
594+
Assert.AreEqual(expected, text);
595+
}
596+
597+
[Test]
598+
public void CssGridAreaTextValueLegal7()
599+
{
600+
var source = "#nav-header {grid-area: 1; }";
601+
var css = ParseStyleSheet(source);
602+
var text = css.Rules[0].CssText;
603+
604+
var expected = "#nav-header { grid-area: 1 / auto / auto / auto }";
605+
Assert.AreEqual(expected, text);
606+
}
607+
608+
[Test]
609+
public void CssGridAreaTextValueLegal8()
610+
{
611+
var source = "#nav-header {grid-area: 2 / aaa; }";
612+
var css = ParseStyleSheet(source);
613+
var text = css.Rules[0].CssText;
614+
615+
var expected = "#nav-header { grid-area: 2 / aaa / auto / aaa }";
616+
Assert.AreEqual(expected, text);
617+
}
618+
619+
[Test]
620+
public void CssGridAreaTextValueIllegal1()
621+
{
622+
var source = "#nav-header {grid-area: 2a / 3%; }";
623+
var css = ParseStyleSheet(source);
624+
var text = css.Rules[0].CssText;
625+
626+
var expected = "#nav-header { }";
627+
Assert.AreEqual(expected, text);
628+
}
629+
630+
[Test]
631+
public void CssGridAreaTextValueIllegal2()
632+
{
633+
var source = "#nav-header {grid-area: 2a; }";
634+
var css = ParseStyleSheet(source);
635+
var text = css.Rules[0].CssText;
636+
637+
var expected = "#nav-header { }";
638+
Assert.AreEqual(expected, text);
639+
}
640+
641+
[Test]
642+
public void CssGridAreaTextValueTrim1()
643+
{
644+
var source = "#nav-header {grid-area: 9999999; }";
645+
var css = ParseStyleSheet(source);
646+
var text = css.Rules[0].CssText;
647+
648+
var expected = "#nav-header { grid-area: 10000 / auto / auto / auto }";
649+
Assert.AreEqual(expected, text);
650+
}
651+
652+
[Test]
653+
public void CssGridAreaTextValueTrim2()
654+
{
655+
var source = "#nav-header {grid-area: 9999999 / 8888888 }";
656+
var css = ParseStyleSheet(source);
657+
var text = css.Rules[0].CssText;
658+
659+
var expected = "#nav-header { grid-area: 10000 / 10000 / auto / auto }";
660+
Assert.AreEqual(expected, text);
661+
}
662+
530663
[Test]
531664
public void CssGridAutoFlowAndRepeatLegal()
532665
{

src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs

+34-7
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ namespace AngleSharp.Css.Declarations
22
{
33
using AngleSharp.Css.Converters;
44
using AngleSharp.Css.Dom;
5+
using AngleSharp.Css.Parser;
56
using AngleSharp.Css.Values;
67
using AngleSharp.Text;
78
using System;
89
using static ValueConverters;
910

1011
static class GridAreaDeclaration
1112
{
13+
private const int MaximumGridSize = 10000;
14+
1215
public static readonly String Name = PropertyNames.GridArea;
1316

1417
public static readonly String[] Longhands = new[]
@@ -42,7 +45,7 @@ public ICssValue[] Split(ICssValue value)
4245
{
4346
return new[]
4447
{
45-
tuple.Items[0],
48+
GetItem(tuple, 0),
4649
GetItem(tuple, 1),
4750
GetItem(tuple, 2),
4851
GetItem(tuple, 3),
@@ -56,21 +59,45 @@ private static ICssValue GetItem(CssTupleValue tuple, Int32 index)
5659
{
5760
if (tuple.Items.Length > index)
5861
{
62+
if (int.TryParse(tuple.Items[index].CssText, out int value))
63+
{
64+
if (value > MaximumGridSize)
65+
{
66+
return new Constant<Object>(MaximumGridSize.ToString(), null);
67+
}
68+
}
5969
return tuple.Items[index];
6070
}
6171

62-
return GetItemSimple(tuple, index / 2);
72+
return GetItemSimple(tuple, index);
6373
}
6474

6575
private static ICssValue GetItemSimple(CssTupleValue tuple, Int32 index)
6676
{
67-
if (tuple.Items.Length > index)
77+
var val = UnitParser.ParseUnit(new StringSource(tuple.Items[0].CssText));
78+
if (index <= 2)
6879
{
69-
var nested = tuple.Items[index] as CssTupleValue;
70-
71-
if (nested != null && nested.Items.Length == 3 && nested.Items[0] == null && nested.Items[1] == null)
80+
if (tuple.Items.Length <= index)
81+
{
82+
83+
if (!int.TryParse(tuple.Items[0].CssText, out int _))
84+
{
85+
return tuple.Items[0];
86+
}
87+
}
88+
}
89+
else if (index == 3)
90+
{
91+
if (tuple.Items.Length > 1)
92+
{
93+
if (!int.TryParse(tuple.Items[1].CssText, out int _))
94+
{
95+
return tuple.Items[1];
96+
}
97+
}
98+
else if (!int.TryParse(tuple.Items[0].CssText, out int _))
7299
{
73-
return nested.Items[2];
100+
return tuple.Items[0];
74101
}
75102
}
76103

0 commit comments

Comments
 (0)