diff --git a/CHANGELOG.md b/CHANGELOG.md index cde40623..243a245b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 0.16.2 + +Released on Thursday, November 4 2021. + +- Fixed issue with unbalanced grid areas and rows (#82) +- Fixed small numbers to be transformed into negative exponentials (#80) + # 0.16.1 Released on Wednesday, August 11 2021. diff --git a/src/AngleSharp.Css.Tests/Declarations/CssMarginProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssMarginProperty.cs index 349662fb..170ea6ba 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssMarginProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssMarginProperty.cs @@ -18,6 +18,18 @@ public void CssMarginLeftLengthLegal() Assert.AreEqual("15px", property.Value); } + [Test] + public void CssMarginLeftTinyValue_Issue80() + { + var snippet = "margin-left: 0.00001px"; + var property = ParseDeclaration(snippet); + Assert.AreEqual("margin-left", property.Name); + Assert.IsFalse(property.IsImportant); + Assert.IsFalse(property.IsInherited); + Assert.IsTrue(property.HasValue); + Assert.AreEqual("0.00001px", property.Value); + } + [Test] public void CssMarginLeftInitialLegal() { diff --git a/src/AngleSharp.Css.Tests/Parsing/StyleSheet.cs b/src/AngleSharp.Css.Tests/Parsing/StyleSheet.cs index ef12e3ad..6463c14f 100644 --- a/src/AngleSharp.Css.Tests/Parsing/StyleSheet.cs +++ b/src/AngleSharp.Css.Tests/Parsing/StyleSheet.cs @@ -15,5 +15,110 @@ public async Task ParseEmptySheet_Issue42() var sheet = await parser.ParseStyleSheetAsync(sheetCode); Assert.IsNotNull(sheet); } + + [Test] + public async Task ParseStyleSheetAndBack_Issue82() + { + var css = @" + .root { + position: absolute; + top: 0; + left: 0; + width: calc(100% - 10px); + height: calc(100% - 10px); + padding: 5px; + } + + .container { + width: 100%; + height: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 240px calc(100% - 360px) 100px; + grid-template-areas: 'header info' 'quantity info' 'footerOk footerCancel'; + row-gap: 10px; + font-size: 26px; + } + + .destination { + grid-area: header; + width: calc(100% - 20px); + height: calc(100% - 20px); + margin: 10px; + display: grid; + grid-template-columns: auto auto auto; + grid-template-rows: 150px 50px; + grid-template-areas: + ""sourcerp image destrp"" + ""sourcele image destle""; + } + + .quantitygrid { + width: 100%; + height: 100%; + display: grid; + grid-template-columns: auto auto auto; + grid-template-rows: 150px 100px; + grid-template-areas: 'minus number plus'; + } + + .headergrid { + width: 100%; + height: 100%; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr; + grid-template-areas: 'sourceplace space destinationplace' 'sourcelc space destinationlc'; + } + + #info td + td { + font-size: 24px; + } + + input { + animation-duration: 2s; + font-family: inherit; + background-color: white; + } + + td { + padding: 5px; + } + + paper-button { + padding: 0; + background-color: var(--kx-dark); + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + color: white; + /*font-weight: bolder;*/ + } + + @keyframes errorAnimation { + 0% { + background-color: white; + } + + 1% { + background-color: red; + } + + 100% { + background-color: white; + } + } + + input:invalid { + color: red; + } +"; + var parser = new CssParser(); + var formatter = new MinifyStyleFormatter(); + var ss = await parser.ParseStyleSheetAsync(css); + var newCss = ss.ToCss(formatter); + Assert.IsNotNull(newCss); + } } } diff --git a/src/AngleSharp.Css/FormatValue.cs b/src/AngleSharp.Css/FormatValue.cs new file mode 100644 index 00000000..eeb6427c --- /dev/null +++ b/src/AngleSharp.Css/FormatValue.cs @@ -0,0 +1,12 @@ +namespace AngleSharp.Css +{ + using System; + using System.Globalization; + + static class FormatValue + { + public const String DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################"; + + public static String CssStringify(this Double value) => value.ToString(DoubleFixedPoint, CultureInfo.InvariantCulture); + } +} \ No newline at end of file diff --git a/src/AngleSharp.Css/Values/Composites/CssGridTemplateValue.cs b/src/AngleSharp.Css/Values/Composites/CssGridTemplateValue.cs index 7260fe83..422a3545 100644 --- a/src/AngleSharp.Css/Values/Composites/CssGridTemplateValue.cs +++ b/src/AngleSharp.Css/Values/Composites/CssGridTemplateValue.cs @@ -73,7 +73,7 @@ public String CssText for (var i = 0; i < rowItems.Length; i++) { - var area = areas[i]; + var area = areas.Length > i ? areas[i] : null; var item = rowItems[i] as CssTupleValue; if (item != null && area != null) diff --git a/src/AngleSharp.Css/Values/Primitives/Angle.cs b/src/AngleSharp.Css/Values/Primitives/Angle.cs index ed55ff46..dbeb6c8e 100644 --- a/src/AngleSharp.Css/Values/Primitives/Angle.cs +++ b/src/AngleSharp.Css/Values/Primitives/Angle.cs @@ -1,8 +1,6 @@ namespace AngleSharp.Css.Values { - using AngleSharp.Css.Dom; using System; - using System.Globalization; /// /// Represents an angle object. @@ -66,7 +64,7 @@ public Angle(Double value, Unit unit) /// /// Gets the CSS text representation. /// - public String CssText => String.Concat(_value.ToString(CultureInfo.InvariantCulture), UnitString); + public String CssText => String.Concat(_value.CssStringify(), UnitString); /// /// Gets the value of the angle. diff --git a/src/AngleSharp.Css/Values/Primitives/Fraction.cs b/src/AngleSharp.Css/Values/Primitives/Fraction.cs index eff5158d..ed8606e3 100644 --- a/src/AngleSharp.Css/Values/Primitives/Fraction.cs +++ b/src/AngleSharp.Css/Values/Primitives/Fraction.cs @@ -35,7 +35,7 @@ public Fraction(Double value, Unit unit) /// /// Gets the CSS text representation. /// - public String CssText => String.Concat(_value.ToString(CultureInfo.InvariantCulture), UnitString); + public String CssText => String.Concat(_value.CssStringify(), UnitString); /// /// Gets the value of fraction. diff --git a/src/AngleSharp.Css/Values/Primitives/Frequency.cs b/src/AngleSharp.Css/Values/Primitives/Frequency.cs index 924657d5..dc8ba3ac 100644 --- a/src/AngleSharp.Css/Values/Primitives/Frequency.cs +++ b/src/AngleSharp.Css/Values/Primitives/Frequency.cs @@ -1,7 +1,6 @@ namespace AngleSharp.Css.Values { using System; - using System.Globalization; /// /// Represents a time value. @@ -35,7 +34,7 @@ public Frequency(Double value, Unit unit) /// /// Gets the CSS text representation. /// - public String CssText => String.Concat(_value.ToString(CultureInfo.InvariantCulture), UnitString); + public String CssText => String.Concat(_value.CssStringify(), UnitString); /// /// Gets the value of frequency. diff --git a/src/AngleSharp.Css/Values/Primitives/Length.cs b/src/AngleSharp.Css/Values/Primitives/Length.cs index e996766a..317002ec 100644 --- a/src/AngleSharp.Css/Values/Primitives/Length.cs +++ b/src/AngleSharp.Css/Values/Primitives/Length.cs @@ -1,7 +1,6 @@ namespace AngleSharp.Css.Values { using System; - using System.Globalization; /// /// Represents an absolute length value. @@ -99,7 +98,7 @@ public String CssText else { var unit = _value == 0.0 ? String.Empty : UnitString; - var val = _value.ToString(CultureInfo.InvariantCulture); + var val = _value.CssStringify(); return String.Concat(val, unit); } } diff --git a/src/AngleSharp.Css/Values/Primitives/Resolution.cs b/src/AngleSharp.Css/Values/Primitives/Resolution.cs index c0de9bd0..0f55bb21 100644 --- a/src/AngleSharp.Css/Values/Primitives/Resolution.cs +++ b/src/AngleSharp.Css/Values/Primitives/Resolution.cs @@ -1,7 +1,6 @@ namespace AngleSharp.Css.Values { using System; - using System.Globalization; /// /// Represents a resolution value. @@ -35,7 +34,7 @@ public Resolution(Double value, Unit unit) /// /// Gets the CSS text representation. /// - public String CssText => String.Concat(_value.ToString(CultureInfo.InvariantCulture), UnitString); + public String CssText => String.Concat(_value.CssStringify(), UnitString); /// /// Gets the value of resolution. diff --git a/src/AngleSharp.Css/Values/Primitives/Time.cs b/src/AngleSharp.Css/Values/Primitives/Time.cs index b56a46da..078c1992 100644 --- a/src/AngleSharp.Css/Values/Primitives/Time.cs +++ b/src/AngleSharp.Css/Values/Primitives/Time.cs @@ -1,8 +1,6 @@ namespace AngleSharp.Css.Values { - using AngleSharp.Css.Dom; using System; - using System.Globalization; /// /// Represents a time value. @@ -45,7 +43,7 @@ public Time(Double value, Unit unit) /// /// Gets the CSS text representation. /// - public String CssText => String.Concat(_value.ToString(CultureInfo.InvariantCulture), UnitString); + public String CssText => String.Concat(_value.CssStringify(), UnitString); /// /// Gets the value of time. diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a4925081..b9a2774b 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,6 +2,6 @@ Extends the CSSOM from the core AngleSharp library. AngleSharp.Css - 0.16.1 + 0.16.2