[12762] | 1 | using System;
|
---|
| 2 | using System.Xml;
|
---|
| 3 | using System.Collections.Generic;
|
---|
| 4 | using System.Text.RegularExpressions;
|
---|
| 5 |
|
---|
| 6 | using SharpVectors.Dom.Stylesheets;
|
---|
| 7 |
|
---|
| 8 | namespace SharpVectors.Dom.Css
|
---|
| 9 | {
|
---|
| 10 | public abstract class CssRule : ICssRule
|
---|
| 11 | {
|
---|
| 12 | #region Constructors
|
---|
| 13 |
|
---|
| 14 | protected CssRule(object parent, bool readOnly,
|
---|
| 15 | IList<string> replacedStrings, CssStyleSheetType origin)
|
---|
| 16 | {
|
---|
| 17 | if(parent is CssRule)
|
---|
| 18 | {
|
---|
| 19 | _ParentRule = (CssRule)parent;
|
---|
| 20 | }
|
---|
| 21 | else if(parent is CssStyleSheet)
|
---|
| 22 | {
|
---|
| 23 | _ParentStyleSheet = (CssStyleSheet)parent;
|
---|
| 24 | }
|
---|
| 25 | else
|
---|
| 26 | {
|
---|
| 27 | throw new Exception("The CssRule constructor can only take a CssRule or CssStyleSheet as it's second argument " + parent.GetType());
|
---|
| 28 | }
|
---|
| 29 | this.origin = origin;
|
---|
| 30 | this.replacedStrings = replacedStrings;
|
---|
| 31 | this.readOnly = readOnly;
|
---|
| 32 | }
|
---|
| 33 |
|
---|
| 34 | #endregion
|
---|
| 35 |
|
---|
| 36 | #region Private and protected fields
|
---|
| 37 | /// <summary>
|
---|
| 38 | /// The origin stylesheet type of this rule
|
---|
| 39 | /// </summary>
|
---|
| 40 | protected CssStyleSheetType origin;
|
---|
| 41 | private IList<string> replacedStrings;
|
---|
| 42 | /// <summary>
|
---|
| 43 | /// Specifies the read/write state of the instance
|
---|
| 44 | /// </summary>
|
---|
| 45 | protected bool readOnly;
|
---|
| 46 |
|
---|
| 47 | #endregion
|
---|
| 48 |
|
---|
| 49 | #region Private and internal methods
|
---|
| 50 | private string StringReplaceEvaluator(Match match)
|
---|
| 51 | {
|
---|
| 52 | int i = Convert.ToInt32(match.Groups["number"].Value);
|
---|
| 53 | string r = replacedStrings[i];
|
---|
| 54 | if(!match.Groups["quote"].Success) r = r.Trim(new char[2]{'\'', '"'});
|
---|
| 55 | return r;
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | internal string DeReplaceStrings(string s)
|
---|
| 59 | {
|
---|
| 60 | Regex re = new Regex(@"(?<quote>"")?<<<(?<number>[0-9]+)>>>""?");
|
---|
| 61 | return re.Replace(s, new MatchEvaluator(StringReplaceEvaluator));
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | /// <summary>
|
---|
| 65 | /// Used to find matching style rules in the cascading order
|
---|
| 66 | /// </summary>
|
---|
| 67 | /// <param name="elt">The element to find styles for</param>
|
---|
| 68 | /// <param name="pseudoElt">The pseudo-element to find styles for</param>
|
---|
| 69 | /// <param name="ml">The medialist that the document is using</param>
|
---|
| 70 | /// <param name="csd">A CssStyleDeclaration that holds the collected styles</param>
|
---|
| 71 | protected internal virtual void GetStylesForElement(XmlElement elt,
|
---|
| 72 | string pseudoElt, MediaList ml, CssCollectedStyleDeclaration csd)
|
---|
| 73 | {
|
---|
| 74 | }
|
---|
| 75 |
|
---|
| 76 | #endregion
|
---|
| 77 |
|
---|
| 78 | #region Public methods
|
---|
| 79 | /// <summary>
|
---|
| 80 | /// Finds the owner node of this rule
|
---|
| 81 | /// </summary>
|
---|
| 82 | /// <returns>The owner XmlNode</returns>
|
---|
| 83 | public XmlNode ResolveOwnerNode()
|
---|
| 84 | {
|
---|
| 85 | if(ParentRule != null)
|
---|
| 86 | {
|
---|
| 87 | return ((CssRule)ParentRule).ResolveOwnerNode();
|
---|
| 88 | }
|
---|
| 89 | else
|
---|
| 90 | {
|
---|
| 91 | return ((StyleSheet)ParentStyleSheet).ResolveOwnerNode();
|
---|
| 92 | }
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | #endregion
|
---|
| 96 |
|
---|
| 97 | #region Implementation of ICssRule
|
---|
| 98 | private CssStyleSheet _ParentStyleSheet = null;
|
---|
| 99 | /// <summary>
|
---|
| 100 | /// The style sheet that contains this rule
|
---|
| 101 | /// </summary>
|
---|
| 102 | public ICssStyleSheet ParentStyleSheet
|
---|
| 103 | {
|
---|
| 104 | get
|
---|
| 105 | {
|
---|
| 106 | return _ParentStyleSheet;
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | private CssRule _ParentRule = null;
|
---|
| 111 | /// <summary>
|
---|
| 112 | /// If this rule is contained inside another rule (e.g. a style rule inside an @media block), this is the containing rule. If this rule is not nested inside any other rules, this returns null
|
---|
| 113 | /// </summary>
|
---|
| 114 | public ICssRule ParentRule
|
---|
| 115 | {
|
---|
| 116 | get
|
---|
| 117 | {
|
---|
| 118 | return _ParentRule;
|
---|
| 119 | }
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | /// <summary>
|
---|
| 123 | /// The type of the rule, as defined above. The expectation is that binding-specific casting methods can be used to cast down from an instance of the CSSRule interface to the specific derived interface implied by the type.
|
---|
| 124 | /// </summary>
|
---|
| 125 | public abstract CssRuleType Type
|
---|
| 126 | {
|
---|
| 127 | get;
|
---|
| 128 | }
|
---|
| 129 |
|
---|
| 130 | /// <summary>
|
---|
| 131 | /// The parsable textual representation of the rule. This reflects the current state of the rule and not its initial value.
|
---|
| 132 | /// </summary>
|
---|
| 133 | public virtual string CssText
|
---|
| 134 | {
|
---|
| 135 | get
|
---|
| 136 | {
|
---|
| 137 | throw new NotImplementedException("CssText");
|
---|
| 138 | //return _CssText;
|
---|
| 139 | }
|
---|
| 140 | set
|
---|
| 141 | {
|
---|
| 142 | throw new NotImplementedException("CssText");
|
---|
| 143 | }
|
---|
| 144 | }
|
---|
| 145 | #endregion
|
---|
| 146 | }
|
---|
| 147 | }
|
---|