1 | using System;
|
---|
2 | using System.Xml;
|
---|
3 | using System.Collections;
|
---|
4 |
|
---|
5 | namespace SharpVectors.Dom.Css
|
---|
6 | {
|
---|
7 | /// <summary>
|
---|
8 | /// Used internally to store collected properties.
|
---|
9 | /// </summary>
|
---|
10 | public class CssCollectedProperty
|
---|
11 | {
|
---|
12 | #region Constructors
|
---|
13 | internal CssCollectedProperty(string name, int specificity, CssValue cssValue, CssStyleSheetType origin, string priority)
|
---|
14 | {
|
---|
15 | Name = name;
|
---|
16 | Specificity = specificity;
|
---|
17 | Origin = origin;
|
---|
18 | CssValue = cssValue;
|
---|
19 | Priority = priority;
|
---|
20 | }
|
---|
21 | #endregion
|
---|
22 |
|
---|
23 | #region Public properties
|
---|
24 | /// <summary>
|
---|
25 | /// The name of the property
|
---|
26 | /// </summary>
|
---|
27 | public string Name;
|
---|
28 | /// <summary>
|
---|
29 | /// The calculated specificity
|
---|
30 | /// </summary>
|
---|
31 | public int Specificity;
|
---|
32 | /// <summary>
|
---|
33 | /// The origin of the collected property.
|
---|
34 | /// </summary>
|
---|
35 | public CssStyleSheetType Origin;
|
---|
36 | /// <summary>
|
---|
37 | /// The value of the property
|
---|
38 | /// </summary>
|
---|
39 | public CssValue CssValue;
|
---|
40 | /// <summary>
|
---|
41 | /// The priority of the property, e.g. "important"
|
---|
42 | /// </summary>
|
---|
43 | public string Priority;
|
---|
44 | #endregion
|
---|
45 |
|
---|
46 | #region Internal methods
|
---|
47 | internal bool IsBetterThen(CssCollectedProperty existing)
|
---|
48 | {
|
---|
49 | bool yes = false;
|
---|
50 | #region sorting according to the rules at http://www.w3.org/TR/CSS21/cascade.html#cascading-order
|
---|
51 | bool gotHigherSpecificity = (Specificity>=existing.Specificity);
|
---|
52 |
|
---|
53 | switch(existing.Origin)
|
---|
54 | {
|
---|
55 | case CssStyleSheetType.UserAgent:
|
---|
56 | yes = (Origin == CssStyleSheetType.UserAgent) ? gotHigherSpecificity : true;
|
---|
57 | break;
|
---|
58 | case CssStyleSheetType.NonCssPresentationalHints:
|
---|
59 | yes = (Origin != CssStyleSheetType.UserAgent);
|
---|
60 | break;
|
---|
61 | case CssStyleSheetType.Inline:
|
---|
62 | yes = (Origin != CssStyleSheetType.UserAgent &&
|
---|
63 | Origin != CssStyleSheetType.NonCssPresentationalHints);
|
---|
64 | break;
|
---|
65 | case CssStyleSheetType.Author:
|
---|
66 | if(Origin == CssStyleSheetType.Author &&
|
---|
67 | Priority == existing.Priority &&
|
---|
68 | gotHigherSpecificity)
|
---|
69 | {
|
---|
70 | // author rules of the same priority
|
---|
71 | yes = true;
|
---|
72 | }
|
---|
73 | else if(Origin == CssStyleSheetType.Inline)
|
---|
74 | {
|
---|
75 | // inline rules override author rules
|
---|
76 | yes = true;
|
---|
77 | }
|
---|
78 | else if(Origin == CssStyleSheetType.User && Priority == "important")
|
---|
79 | {
|
---|
80 | // !important user rules overrides author rules
|
---|
81 | yes = true;
|
---|
82 | }
|
---|
83 | else if(Origin == CssStyleSheetType.Author &&
|
---|
84 | existing.Priority != "important" &&
|
---|
85 | Priority == "important"
|
---|
86 | )
|
---|
87 | {
|
---|
88 | // !important author rules override non-!important author rules
|
---|
89 | yes = true;
|
---|
90 | }
|
---|
91 | break;
|
---|
92 | case CssStyleSheetType.User:
|
---|
93 | if(Origin == CssStyleSheetType.User &&
|
---|
94 | existing.Priority == Priority &&
|
---|
95 | gotHigherSpecificity)
|
---|
96 | {
|
---|
97 | yes = true;
|
---|
98 | }
|
---|
99 | else if((Origin == CssStyleSheetType.Author || Origin == CssStyleSheetType.Inline) &&
|
---|
100 | existing.Priority != "important")
|
---|
101 | {
|
---|
102 | // author rules overrides not !important user rules
|
---|
103 | yes = true;
|
---|
104 | }
|
---|
105 | else if(Origin == CssStyleSheetType.User &&
|
---|
106 | Priority == "important")
|
---|
107 | {
|
---|
108 | // !important user rules override non-!important user rules
|
---|
109 | yes = true;
|
---|
110 | }
|
---|
111 | break;
|
---|
112 | }
|
---|
113 | #endregion
|
---|
114 |
|
---|
115 | return yes;
|
---|
116 | }
|
---|
117 | #endregion
|
---|
118 | }
|
---|
119 |
|
---|
120 | }
|
---|