From c7a0819944d4a925de58d88a25ec9fb3a4d76ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20K=C3=BChner?= Date: Sat, 6 Nov 2021 07:39:31 +0100 Subject: [PATCH 1/3] fix grid area, fixes #85 --- .../Declarations/CssGridProperty.cs | 11 +++++++++++ .../Declarations/GridAreaDeclaration.cs | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs index 87b5e323..5fc54e35 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs @@ -527,6 +527,17 @@ public void CssGridAreaSingleValueLegal() Assert.AreEqual("2 / auto / auto / auto", property.Value); } + [Test] + public void CssGridAreaSingleTextValueLegal() + { + var source = "#nav-header {grid-area: navheader; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: navheader / navheader / navheader / navheader }"; + Assert.AreEqual(expected, text); + } + [Test] public void CssGridAutoFlowAndRepeatLegal() { diff --git a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs index eca5c752..8ddb9975 100644 --- a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs +++ b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs @@ -74,6 +74,11 @@ private static ICssValue GetItemSimple(CssTupleValue tuple, Int32 index) } } + if (tuple.Items.Length > 0 && !int.TryParse(tuple.Items[0].CssText, out int _)) + { + return tuple.Items[0]; + } + return new Constant(CssKeywords.Auto, null); } } From c63fff8e35f76b9f262b077a207441aea30eb39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20K=C3=BChner?= Date: Sun, 7 Nov 2021 12:56:32 +0100 Subject: [PATCH 2/3] completly bugfix grid area parsing --- .../Declarations/CssGridProperty.cs | 84 ++++++++++++++++++- .../Declarations/GridAreaDeclaration.cs | 29 ++++--- 2 files changed, 100 insertions(+), 13 deletions(-) diff --git a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs index 5fc54e35..0bfaa15e 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs @@ -528,13 +528,91 @@ public void CssGridAreaSingleValueLegal() } [Test] - public void CssGridAreaSingleTextValueLegal() + public void CssGridAreaSingleTextValueLegal1() { - var source = "#nav-header {grid-area: navheader; }"; + var source = "#nav-header {grid-area: aaa; }"; var css = ParseStyleSheet(source); var text = css.Rules[0].CssText; - var expected = "#nav-header { grid-area: navheader / navheader / navheader / navheader }"; + var expected = "#nav-header { grid-area: aaa / aaa / aaa / aaa }"; + Assert.AreEqual(expected, text); + } + + + [Test] + public void CssGridAreaSingleTextValueLegal2() + { + var source = "#nav-header {grid-area: aaa / bbb; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / bbb / aaa / bbb }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaSingleTextValueLegal3() + { + var source = "#nav-header {grid-area: 1 / 2; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 1 / 2 / auto / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaSingleTextValueLegal4() + { + var source = "#nav-header {grid-area: aaa / 2; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / 2 / aaa / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaSingleTextValueLegal5() + { + var source = "#nav-header {grid-area: aaa / bbb / ccc; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / bbb / ccc / bbb }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaSingleTextValueLegal6() + { + var source = "#nav-header {grid-area: aaa / bbb / ccc; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / bbb / ccc / bbb }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaSingleTextValueLegal7() + { + var source = "#nav-header {grid-area: 1; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 1 / auto / auto / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaSingleTextValueLegal8() + { + var source = "#nav-header {grid-area: 2 / aaa; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 2 / aaa / auto / aaa }"; Assert.AreEqual(expected, text); } diff --git a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs index 8ddb9975..46edd435 100644 --- a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs +++ b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs @@ -59,24 +59,33 @@ private static ICssValue GetItem(CssTupleValue tuple, Int32 index) return tuple.Items[index]; } - return GetItemSimple(tuple, index / 2); + return GetItemSimple(tuple, index); } private static ICssValue GetItemSimple(CssTupleValue tuple, Int32 index) { - if (tuple.Items.Length > index) + if (index <= 2) { - var nested = tuple.Items[index] as CssTupleValue; - - if (nested != null && nested.Items.Length == 3 && nested.Items[0] == null && nested.Items[1] == null) - { - return nested.Items[2]; + if (tuple.Items.Length <= index) + {if (!int.TryParse(tuple.Items[0].CssText, out int _)) + { + return tuple.Items[0]; + } } } - - if (tuple.Items.Length > 0 && !int.TryParse(tuple.Items[0].CssText, out int _)) + else if (index == 3) { - return tuple.Items[0]; + if (tuple.Items.Length > 1) + { + if (!int.TryParse(tuple.Items[1].CssText, out int _)) + { + return tuple.Items[1]; + } + } + else if (!int.TryParse(tuple.Items[0].CssText, out int _)) + { + return tuple.Items[0]; + } } return new Constant(CssKeywords.Auto, null); From 97a650fb2aaa55137e199534b3fa4331b0313438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20K=C3=BChner?= Date: Sun, 7 Nov 2021 17:25:24 +0100 Subject: [PATCH 3/3] grid area trim value --- .../Declarations/CssGridProperty.cs | 60 ++++++++++++++++--- .../Declarations/GridAreaDeclaration.cs | 17 +++++- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs index 0bfaa15e..7d366d01 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs @@ -528,7 +528,7 @@ public void CssGridAreaSingleValueLegal() } [Test] - public void CssGridAreaSingleTextValueLegal1() + public void CssGridAreaTextValueLegal1() { var source = "#nav-header {grid-area: aaa; }"; var css = ParseStyleSheet(source); @@ -540,7 +540,7 @@ public void CssGridAreaSingleTextValueLegal1() [Test] - public void CssGridAreaSingleTextValueLegal2() + public void CssGridAreaTextValueLegal2() { var source = "#nav-header {grid-area: aaa / bbb; }"; var css = ParseStyleSheet(source); @@ -551,7 +551,7 @@ public void CssGridAreaSingleTextValueLegal2() } [Test] - public void CssGridAreaSingleTextValueLegal3() + public void CssGridAreaTextValueLegal3() { var source = "#nav-header {grid-area: 1 / 2; }"; var css = ParseStyleSheet(source); @@ -562,7 +562,7 @@ public void CssGridAreaSingleTextValueLegal3() } [Test] - public void CssGridAreaSingleTextValueLegal4() + public void CssGridAreaTextValueLegal4() { var source = "#nav-header {grid-area: aaa / 2; }"; var css = ParseStyleSheet(source); @@ -573,7 +573,7 @@ public void CssGridAreaSingleTextValueLegal4() } [Test] - public void CssGridAreaSingleTextValueLegal5() + public void CssGridAreaTextValueLegal5() { var source = "#nav-header {grid-area: aaa / bbb / ccc; }"; var css = ParseStyleSheet(source); @@ -584,7 +584,7 @@ public void CssGridAreaSingleTextValueLegal5() } [Test] - public void CssGridAreaSingleTextValueLegal6() + public void CssGridAreaTextValueLegal6() { var source = "#nav-header {grid-area: aaa / bbb / ccc; }"; var css = ParseStyleSheet(source); @@ -595,7 +595,7 @@ public void CssGridAreaSingleTextValueLegal6() } [Test] - public void CssGridAreaSingleTextValueLegal7() + public void CssGridAreaTextValueLegal7() { var source = "#nav-header {grid-area: 1; }"; var css = ParseStyleSheet(source); @@ -606,7 +606,7 @@ public void CssGridAreaSingleTextValueLegal7() } [Test] - public void CssGridAreaSingleTextValueLegal8() + public void CssGridAreaTextValueLegal8() { var source = "#nav-header {grid-area: 2 / aaa; }"; var css = ParseStyleSheet(source); @@ -616,6 +616,50 @@ public void CssGridAreaSingleTextValueLegal8() Assert.AreEqual(expected, text); } + [Test] + public void CssGridAreaTextValueIllegal1() + { + var source = "#nav-header {grid-area: 2a / 3%; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueIllegal2() + { + var source = "#nav-header {grid-area: 2a; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueTrim1() + { + var source = "#nav-header {grid-area: 9999999; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 10000 / auto / auto / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueTrim2() + { + var source = "#nav-header {grid-area: 9999999 / 8888888 }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 10000 / 10000 / auto / auto }"; + Assert.AreEqual(expected, text); + } + [Test] public void CssGridAutoFlowAndRepeatLegal() { diff --git a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs index 46edd435..59b875b7 100644 --- a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs +++ b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs @@ -2,6 +2,7 @@ namespace AngleSharp.Css.Declarations { using AngleSharp.Css.Converters; using AngleSharp.Css.Dom; + using AngleSharp.Css.Parser; using AngleSharp.Css.Values; using AngleSharp.Text; using System; @@ -9,6 +10,8 @@ namespace AngleSharp.Css.Declarations static class GridAreaDeclaration { + private const int MaximumGridSize = 10000; + public static readonly String Name = PropertyNames.GridArea; public static readonly String[] Longhands = new[] @@ -42,7 +45,7 @@ public ICssValue[] Split(ICssValue value) { return new[] { - tuple.Items[0], + GetItem(tuple, 0), GetItem(tuple, 1), GetItem(tuple, 2), GetItem(tuple, 3), @@ -56,6 +59,13 @@ private static ICssValue GetItem(CssTupleValue tuple, Int32 index) { if (tuple.Items.Length > index) { + if (int.TryParse(tuple.Items[index].CssText, out int value)) + { + if (value > MaximumGridSize) + { + return new Constant(MaximumGridSize.ToString(), null); + } + } return tuple.Items[index]; } @@ -64,10 +74,13 @@ private static ICssValue GetItem(CssTupleValue tuple, Int32 index) private static ICssValue GetItemSimple(CssTupleValue tuple, Int32 index) { + var val = UnitParser.ParseUnit(new StringSource(tuple.Items[0].CssText)); if (index <= 2) { if (tuple.Items.Length <= index) - {if (!int.TryParse(tuple.Items[0].CssText, out int _)) + { + + if (!int.TryParse(tuple.Items[0].CssText, out int _)) { return tuple.Items[0]; }