Skip to content

Commit c8321b8

Browse files
committed
Working on new media list parser
1 parent 6ab7166 commit c8321b8

File tree

8 files changed

+297
-44
lines changed

8 files changed

+297
-44
lines changed

src/AngleSharp.Css.Tests/AngleSharp.Css.Tests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
</ItemGroup>
1717

1818
<ItemGroup>
19-
<PackageReference Include="AngleSharp.Xml" Version="0.17.0" />
19+
<PackageReference Include="AngleSharp.Xml" Version="1.0.0" />
2020
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
2121
<PackageReference Include="NUnit" Version="3.13.2" />
2222
<PackageReference Include="NUnit3TestAdapter" Version="4.2.0" />

src/AngleSharp.Css.Tests/Styling/CssCases.cs

+28-28
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,9 @@ public void StyleSheetEscapes()
319319
/*#\{\}{background:lime;}*/");
320320
Assert.AreEqual(42, sheet.Rules.Length);
321321

322-
Assert.AreEqual(@".:`(", ((ICssStyleRule)sheet.Rules[0]).SelectorText);
323-
Assert.AreEqual(@".1a2b3c", ((ICssStyleRule)sheet.Rules[1]).SelectorText);
324-
Assert.AreEqual(@"##fake-id", ((ICssStyleRule)sheet.Rules[2]).SelectorText);
322+
Assert.AreEqual(@".\:\`\(", ((ICssStyleRule)sheet.Rules[0]).SelectorText);
323+
Assert.AreEqual(@".\31 a2b3c", ((ICssStyleRule)sheet.Rules[1]).SelectorText);
324+
Assert.AreEqual(@"#\#fake-id", ((ICssStyleRule)sheet.Rules[2]).SelectorText);
325325
Assert.AreEqual(@"#---", ((ICssStyleRule)sheet.Rules[3]).SelectorText);
326326
Assert.AreEqual(@"#-a-b-c-", ((ICssStyleRule)sheet.Rules[4]).SelectorText);
327327
Assert.AreEqual(@"#©", ((ICssStyleRule)sheet.Rules[5]).SelectorText);
@@ -346,57 +346,57 @@ public void StyleSheetEscapes()
346346
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[14]).Style["background"]);
347347
Assert.AreEqual(@"#𝄞♪♩♫♬", ((ICssStyleRule)sheet.Rules[15]).SelectorText);
348348
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[15]).Style["background"]);
349-
Assert.AreEqual(@"#?", ((ICssStyleRule)sheet.Rules[16]).SelectorText);
349+
Assert.AreEqual(@"#\?", ((ICssStyleRule)sheet.Rules[16]).SelectorText);
350350
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[16]).Style["background"]);
351-
Assert.AreEqual(@"#@", ((ICssStyleRule)sheet.Rules[17]).SelectorText);
351+
Assert.AreEqual(@"#\@", ((ICssStyleRule)sheet.Rules[17]).SelectorText);
352352
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[17]).Style["background"]);
353-
Assert.AreEqual(@"#.", ((ICssStyleRule)sheet.Rules[18]).SelectorText);
353+
Assert.AreEqual(@"#\.", ((ICssStyleRule)sheet.Rules[18]).SelectorText);
354354
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[18]).Style["background"]);
355-
Assert.AreEqual(@"#:)", ((ICssStyleRule)sheet.Rules[19]).SelectorText);
355+
Assert.AreEqual(@"#\:\)", ((ICssStyleRule)sheet.Rules[19]).SelectorText);
356356
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[19]).Style["background"]);
357-
Assert.AreEqual(@"#:`(", ((ICssStyleRule)sheet.Rules[20]).SelectorText);
357+
Assert.AreEqual(@"#\:\`\(", ((ICssStyleRule)sheet.Rules[20]).SelectorText);
358358
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[20]).Style["background"]);
359-
Assert.AreEqual(@"#123", ((ICssStyleRule)sheet.Rules[21]).SelectorText);
359+
Assert.AreEqual(@"#\31 23", ((ICssStyleRule)sheet.Rules[21]).SelectorText);
360360
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[21]).Style["background"]);
361-
Assert.AreEqual(@"#1a2b3c", ((ICssStyleRule)sheet.Rules[22]).SelectorText);
361+
Assert.AreEqual(@"#\31 a2b3c", ((ICssStyleRule)sheet.Rules[22]).SelectorText);
362362
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[22]).Style["background"]);
363-
Assert.AreEqual(@"#<p>", ((ICssStyleRule)sheet.Rules[23]).SelectorText);
363+
Assert.AreEqual(@"#\<p\>", ((ICssStyleRule)sheet.Rules[23]).SelectorText);
364364
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[23]).Style["background"]);
365-
Assert.AreEqual(@"#<><<<>><>", ((ICssStyleRule)sheet.Rules[24]).SelectorText);
365+
Assert.AreEqual(@"#\<\>\<\<\<\>\>\<\>", ((ICssStyleRule)sheet.Rules[24]).SelectorText);
366366
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[24]).Style["background"]);
367-
Assert.AreEqual(@"#++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", ((ICssStyleRule)sheet.Rules[25]).SelectorText);
367+
Assert.AreEqual("#\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\[\\>\\+\\+\\+\\+\\+\\+\\+\\>\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\>\\+\\+\\+\\>\\+\\<\\<\\<\\<-\\]\\>\\+\\+\\.\\>\\+\\.\\+\\+\\+\\+\\+\\+\\+\\.\\.\\+\\+\\+\\.\\>\\+\\+\\.\\<\\<\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\+\\.\\>\\.\\+\\+\\+\\.------\\.--------\\.\\>\\+\\.\\>\\.", ((ICssStyleRule)sheet.Rules[25]).SelectorText);
368368
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[25]).Style["background"]);
369-
Assert.AreEqual(@"##", ((ICssStyleRule)sheet.Rules[26]).SelectorText);
369+
Assert.AreEqual(@"#\#", ((ICssStyleRule)sheet.Rules[26]).SelectorText);
370370
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[26]).Style["background"]);
371-
Assert.AreEqual(@"###", ((ICssStyleRule)sheet.Rules[27]).SelectorText);
371+
Assert.AreEqual(@"#\#\#", ((ICssStyleRule)sheet.Rules[27]).SelectorText);
372372
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[27]).Style["background"]);
373-
Assert.AreEqual(@"##.#.#", ((ICssStyleRule)sheet.Rules[28]).SelectorText);
373+
Assert.AreEqual(@"#\#\.\#\.\#", ((ICssStyleRule)sheet.Rules[28]).SelectorText);
374374
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[28]).Style["background"]);
375375
Assert.AreEqual(@"#_", ((ICssStyleRule)sheet.Rules[29]).SelectorText);
376376
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[29]).Style["background"]);
377-
Assert.AreEqual(@"#.fake-class", ((ICssStyleRule)sheet.Rules[30]).SelectorText);
377+
Assert.AreEqual(@"#\.fake-class", ((ICssStyleRule)sheet.Rules[30]).SelectorText);
378378
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[30]).Style["background"]);
379-
Assert.AreEqual(@"#foo.bar", ((ICssStyleRule)sheet.Rules[31]).SelectorText);
379+
Assert.AreEqual(@"#foo\.bar", ((ICssStyleRule)sheet.Rules[31]).SelectorText);
380380
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[31]).Style["background"]);
381-
Assert.AreEqual(@"#:hover", ((ICssStyleRule)sheet.Rules[32]).SelectorText);
381+
Assert.AreEqual(@"#\:hover", ((ICssStyleRule)sheet.Rules[32]).SelectorText);
382382
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[32]).Style["background"]);
383-
Assert.AreEqual(@"#:hover:focus:active", ((ICssStyleRule)sheet.Rules[33]).SelectorText);
383+
Assert.AreEqual(@"#\:hover\:focus\:active", ((ICssStyleRule)sheet.Rules[33]).SelectorText);
384384
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[33]).Style["background"]);
385-
Assert.AreEqual(@"#[attr=value]", ((ICssStyleRule)sheet.Rules[34]).SelectorText);
385+
Assert.AreEqual(@"#\[attr\=value\]", ((ICssStyleRule)sheet.Rules[34]).SelectorText);
386386
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[34]).Style["background"]);
387-
Assert.AreEqual(@"#f/o/o", ((ICssStyleRule)sheet.Rules[35]).SelectorText);
387+
Assert.AreEqual(@"#f\/o\/o", ((ICssStyleRule)sheet.Rules[35]).SelectorText);
388388
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[35]).Style["background"]);
389-
Assert.AreEqual(@"#f\o\o", ((ICssStyleRule)sheet.Rules[36]).SelectorText);
389+
Assert.AreEqual(@"#f\\o\\o", ((ICssStyleRule)sheet.Rules[36]).SelectorText);
390390
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[36]).Style["background"]);
391-
Assert.AreEqual(@"#f*o*o", ((ICssStyleRule)sheet.Rules[37]).SelectorText);
391+
Assert.AreEqual(@"#f\*o\*o", ((ICssStyleRule)sheet.Rules[37]).SelectorText);
392392
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[37]).Style["background"]);
393-
Assert.AreEqual(@"#f!o!o", ((ICssStyleRule)sheet.Rules[38]).SelectorText);
393+
Assert.AreEqual(@"#f\!o\!o", ((ICssStyleRule)sheet.Rules[38]).SelectorText);
394394
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[38]).Style["background"]);
395-
Assert.AreEqual(@"#f'o'o", ((ICssStyleRule)sheet.Rules[39]).SelectorText);
395+
Assert.AreEqual(@"#f\'o\'o", ((ICssStyleRule)sheet.Rules[39]).SelectorText);
396396
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[39]).Style["background"]);
397-
Assert.AreEqual(@"#f~o~o", ((ICssStyleRule)sheet.Rules[40]).SelectorText);
397+
Assert.AreEqual(@"#f\~o\~o", ((ICssStyleRule)sheet.Rules[40]).SelectorText);
398398
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[40]).Style["background"]);
399-
Assert.AreEqual(@"#f+o+o", ((ICssStyleRule)sheet.Rules[41]).SelectorText);
399+
Assert.AreEqual(@"#f\+o\+o", ((ICssStyleRule)sheet.Rules[41]).SelectorText);
400400
Assert.AreEqual(@"rgba(0, 255, 0, 1)", ((ICssStyleRule)sheet.Rules[41]).Style["background"]);
401401
}
402402

src/AngleSharp.Css/AngleSharp.Css.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
</ItemGroup>
2222

2323
<ItemGroup>
24-
<PackageReference Include="AngleSharp" Version="1.0.0" />
24+
<PackageReference Include="AngleSharp" Version="1.0.3" />
2525
</ItemGroup>
2626

2727
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">

src/AngleSharp.Css/Dom/Internal/CssMedium.cs

+19-8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public sealed class CssMedium : ICssMedium
1818
private readonly String _type;
1919
private readonly Boolean _exclusive;
2020
private readonly Boolean _inverse;
21+
private readonly String _connector;
2122

2223
#endregion
2324

@@ -30,7 +31,7 @@ public sealed class CssMedium : ICssMedium
3031
/// <param name="inverse">Specifies if it should be inverted.</param>
3132
/// <param name="exclusive">Specifies if the rule is exclusive.</param>
3233
public CssMedium(String type, Boolean inverse, Boolean exclusive)
33-
: this(type, inverse, exclusive, Enumerable.Empty<IMediaFeature>())
34+
: this(type, inverse, exclusive, Enumerable.Empty<IMediaFeature>(), "and")
3435
{
3536
}
3637

@@ -41,12 +42,14 @@ public CssMedium(String type, Boolean inverse, Boolean exclusive)
4142
/// <param name="inverse">Specifies if it should be inverted.</param>
4243
/// <param name="exclusive">Specifies if the rule is exclusive.</param>
4344
/// <param name="features">The features of the medium.</param>
44-
public CssMedium(String type, Boolean inverse, Boolean exclusive, IEnumerable<IMediaFeature> features)
45+
/// <param name="connector">The connector of the features ("and" or "or").</param>
46+
public CssMedium(String type, Boolean inverse, Boolean exclusive, IEnumerable<IMediaFeature> features, String connector)
4547
{
4648
_features = new List<IMediaFeature>(features);
4749
_type = type;
4850
_inverse = inverse;
4951
_exclusive = exclusive;
52+
_connector = connector;
5053
}
5154

5255
#endregion
@@ -63,6 +66,11 @@ public CssMedium(String type, Boolean inverse, Boolean exclusive, IEnumerable<IM
6366
/// </summary>
6467
public String Type => _type;
6568

69+
/// <summary>
70+
/// Gets the connector of the contained features.
71+
/// </summary>
72+
public String Connector => _connector;
73+
6674
/// <summary>
6775
/// Gets if the medium is exclusive to other media.
6876
/// </summary>
@@ -76,7 +84,7 @@ public CssMedium(String type, Boolean inverse, Boolean exclusive, IEnumerable<IM
7684
/// <summary>
7785
/// Gets the constraints - i.e., the stringified features.
7886
/// </summary>
79-
public String Constraints => String.Join(" and ", Features.Select(m => m.ToCss()));
87+
public String Constraints => String.Join($" {_connector} ", Features.Select(m => m.ToCss()));
8088

8189
#endregion
8290

@@ -87,10 +95,11 @@ public override Boolean Equals(Object obj)
8795
{
8896
var other = obj as CssMedium;
8997

90-
if (other != null &&
91-
other.IsExclusive == IsExclusive &&
92-
other.IsInverse == IsInverse &&
93-
other.Type.Is(Type) &&
98+
if (other != null &&
99+
other.IsExclusive == IsExclusive &&
100+
other.IsInverse == IsInverse &&
101+
other.Type.Is(Type) &&
102+
other.Connector.Is(Connector) &&
94103
other.Features.Count() == Features.Count())
95104
{
96105
foreach (var feature in other.Features)
@@ -143,7 +152,9 @@ public void ToCss(TextWriter writer, IStyleFormatter formatter)
143152

144153
for (var i = offset; i < _features.Count; i++)
145154
{
146-
writer.Write(" and ");
155+
writer.Write(' ');
156+
writer.Write(_connector);
157+
writer.Write(' ');
147158
_features[i].ToCss(writer, formatter);
148159
}
149160
}

src/AngleSharp.Css/Dom/Internal/MediaFeature.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ sealed class MediaFeature : IMediaFeature
1414
private readonly Boolean _min;
1515
private readonly Boolean _max;
1616
private readonly String _name;
17-
private readonly String _value;
17+
private readonly ICssValue _value;
1818

1919
#endregion
2020

2121
#region ctor
2222

23-
internal MediaFeature(String name, String value)
23+
internal MediaFeature(String name)
24+
: this(name, null)
25+
{}
26+
27+
internal MediaFeature(String name, ICssValue value)
2428
{
2529
_name = name;
2630
_value = value;
@@ -38,7 +42,7 @@ internal MediaFeature(String name, String value)
3842

3943
public Boolean IsMaximum => _max;
4044

41-
public String Value => _value;
45+
public String Value => _value?.CssText ?? String.Empty;
4246

4347
public Boolean HasValue => _value != null;
4448

@@ -54,7 +58,7 @@ public void ToCss(TextWriter writer, IStyleFormatter formatter)
5458
if (_value != null)
5559
{
5660
writer.Write(": ");
57-
writer.Write(_value);
61+
writer.Write(Value);
5862
}
5963

6064
writer.Write(Symbols.RoundBracketClose);

src/AngleSharp.Css/Dom/Internal/MediaList.cs

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ namespace AngleSharp.Css.Dom
77
using System.Collections.Generic;
88
using System.IO;
99
using System.Linq;
10-
using System.Text;
1110

1211
/// <summary>
1312
/// Represents a list of media elements.

0 commit comments

Comments
 (0)