The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XsltOld \ BuilderInfo

  1. //------------------------------------------------------------------------------
  2. // <copyright file="BuilderInfo.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml.Xsl.XsltOld
  16. {
  17.     using Res = System.Xml.Utils.Res;
  18.     using System;
  19.     using System.Diagnostics;
  20.     using System.Text;
  21.     using System.Collections.Generic;
  22.     using System.Xml;
  23.     using System.Xml.XPath;
  24.    
  25.     internal class BuilderInfo
  26.     {
  27.         private string name;
  28.         private string localName;
  29.         private string namespaceURI;
  30.         private string prefix;
  31.        
  32.         private XmlNodeType nodeType;
  33.         private int depth;
  34.         private bool isEmptyTag;
  35.        
  36.         internal string[] TextInfo = new string[4];
  37.         internal int TextInfoCount = 0;
  38.        
  39.         internal bool search;
  40.         internal HtmlElementProps htmlProps;
  41.         internal HtmlAttributeProps htmlAttrProps;
  42.        
  43.         internal BuilderInfo()
  44.         {
  45.             Initialize(string.Empty, string.Empty, string.Empty);
  46.         }
  47.        
  48.         internal void Initialize(string prefix, string name, string nspace)
  49.         {
  50.             this.prefix = prefix;
  51.             this.localName = name;
  52.             this.namespaceURI = nspace;
  53.             this.name = null;
  54.             this.htmlProps = null;
  55.             this.htmlAttrProps = null;
  56.             this.TextInfoCount = 0;
  57.         }
  58.        
  59.         internal void Initialize(BuilderInfo src)
  60.         {
  61.             this.prefix = src.Prefix;
  62.             this.localName = src.LocalName;
  63.             this.namespaceURI = src.NamespaceURI;
  64.             this.name = null;
  65.             this.depth = src.Depth;
  66.             this.nodeType = src.NodeType;
  67.             this.htmlProps = src.htmlProps;
  68.             this.htmlAttrProps = src.htmlAttrProps;
  69.            
  70.             this.TextInfoCount = 0;
  71.             EnsureTextInfoSize(src.TextInfoCount);
  72.             src.TextInfo.CopyTo(this.TextInfo, 0);
  73.             this.TextInfoCount = src.TextInfoCount;
  74.         }
  75.        
  76.         void EnsureTextInfoSize(int newSize)
  77.         {
  78.             if (this.TextInfo.Length < newSize) {
  79.                 string[] newArr = new string[newSize * 2];
  80.                 Array.Copy(this.TextInfo, newArr, this.TextInfoCount);
  81.                 this.TextInfo = newArr;
  82.             }
  83.         }
  84.        
  85.         internal BuilderInfo Clone()
  86.         {
  87.             BuilderInfo info = new BuilderInfo();
  88.             info.Initialize(this);
  89.             Debug.Assert(info.NodeType != XmlNodeType.Text || XmlCharType.Instance.IsOnlyWhitespace(info.Value));
  90.             return info;
  91.         }
  92.        
  93.         internal string Name {
  94.             get {
  95.                 if (this.name == null) {
  96.                     string prefix = Prefix;
  97.                     string localName = LocalName;
  98.                    
  99.                     if (prefix != null && 0 < prefix.Length) {
  100.                         if (localName.Length > 0) {
  101.                             this.name = prefix + ":" + localName;
  102.                         }
  103.                         else {
  104.                             this.name = prefix;
  105.                         }
  106.                     }
  107.                     else {
  108.                         this.name = localName;
  109.                     }
  110.                 }
  111.                 return this.name;
  112.             }
  113.         }
  114.        
  115.         internal string LocalName {
  116.             get { return this.localName; }
  117.             set { this.localName = value; }
  118.         }
  119.         internal string NamespaceURI {
  120.             get { return this.namespaceURI; }
  121.             set { this.namespaceURI = value; }
  122.         }
  123.         internal string Prefix {
  124.             get { return this.prefix; }
  125.             set { this.prefix = value; }
  126.         }
  127.        
  128.         // The true value of this object is a list of TextInfo
  129.         // Value.get merges them together but discards each node's escape info
  130.         // Value.set clears this object, and appends the new, single string
  131.         internal string Value {
  132.             get {
  133.                 switch (this.TextInfoCount) {
  134.                     case 0:
  135.                         return string.Empty;
  136.                     case 1:
  137.                         return this.TextInfo[0];
  138.                     default:
  139.                         int size = 0;
  140.                         for (int i = 0; i < this.TextInfoCount; i++) {
  141.                             string ti = this.TextInfo[i];
  142.                             if (ti == null)
  143.                                 continue;
  144.                             // ignore disableEscaping
  145.                             size += ti.Length;
  146.                         }
  147.                         StringBuilder sb = new StringBuilder(size);
  148.                         for (int i = 0; i < this.TextInfoCount; i++) {
  149.                             string ti = this.TextInfo[i];
  150.                             if (ti == null)
  151.                                 continue;
  152.                             // ignore disableEscaping
  153.                             sb.Append(ti);
  154.                         }
  155.                         return sb.ToString();
  156.                 }
  157.             }
  158.             set {
  159.                 this.TextInfoCount = 0;
  160.                     /*disableEscaping:*/                ValueAppend(value, false);
  161.             }
  162.         }
  163.        
  164.         internal void ValueAppend(string s, bool disableEscaping)
  165.         {
  166.             if (s == null || s.Length == 0) {
  167.                 return;
  168.             }
  169.             EnsureTextInfoSize(this.TextInfoCount + (disableEscaping ? 2 : 1));
  170.             if (disableEscaping) {
  171.                 this.TextInfo[this.TextInfoCount++] = null;
  172.             }
  173.             this.TextInfo[this.TextInfoCount++] = s;
  174.         }
  175.        
  176.         internal XmlNodeType NodeType {
  177.             get { return this.nodeType; }
  178.             set { this.nodeType = value; }
  179.         }
  180.         internal int Depth {
  181.             get { return this.depth; }
  182.             set { this.depth = value; }
  183.         }
  184.         internal bool IsEmptyTag {
  185.             get { return this.isEmptyTag; }
  186.             set { this.isEmptyTag = value; }
  187.         }
  188.     }
  189. }

Developer Fusion