[12762] | 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 | }
|
---|