From: Oleg T. <he...@us...> - 2004-11-02 14:32:07
|
Update of /cvsroot/mvp-xml/XInclude/v1/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12895/v1/src Modified Files: TextIncludingReader.cs XIncludingReader.cs XIncludingReaderState.cs Log Message: Fixed support for xml:lang fixup Index: XIncludingReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/XIncludingReader.cs,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- XIncludingReader.cs 1 Nov 2004 12:35:11 -0000 1.23 +++ XIncludingReader.cs 2 Nov 2004 14:31:56 -0000 1.24 @@ -17,17 +17,7 @@ #endregion namespace Mvp.Xml.XInclude -{ - internal struct FallbackState - { - //Fallback is being processed - public bool Fallbacking; - //xi:fallback element depth - public int FallbackDepth; - //Fallback processed flag - public bool FallbackProcessed; - } - +{ /// <summary> /// XInclude 1.0 aware XmlReader. /// </summary> @@ -73,6 +63,8 @@ XmlResolver _xmlResolver; //Expose text inclusions as CDATA private bool _exposeTextAsCDATA; + //Top-level included item has different xml:lang + private bool _differentLang = false; #endregion #region Constructors @@ -205,10 +197,15 @@ { get { - if (_topLevel) - return _reader.AttributeCount + - _reader.GetAttribute(_keywords.XmlBase)==null?1:0 + - _reader.GetAttribute(_keywords.XmlLang)==null?1:0; + if (_topLevel) + { + int ac = _reader.AttributeCount; + if (_reader.GetAttribute(_keywords.XmlBase)==null) + ac++; + if (_differentLang && _reader.GetAttribute(_keywords.XmlLang)==null) + ac++; + return ac; + } else return _reader.AttributeCount; } @@ -249,7 +246,7 @@ case XIncludingReaderState.ExposingXmlBaseAttrValue: case XIncludingReaderState.ExposingXmlLangAttr: case XIncludingReaderState.ExposingXmlLangAttrValue: - //TODO: May be wrong if xml:base or xml:lang exist and it does default + //TODO: May be wrong if xml:base or xml:lang exists and it does default return false; default: return _reader.IsDefault; @@ -506,53 +503,85 @@ /// <summary>See <see cref="XmlReader.MoveToFirstAttribute"/></summary> public override bool MoveToFirstAttribute() { - bool res = _reader.MoveToFirstAttribute(); - if (_topLevel && !res) + if (_topLevel) { - _state = XIncludingReaderState.ExposingXmlBaseAttr; - return true; - } - else - return res; + bool res = _reader.MoveToFirstAttribute(); + if (res) + { + //it might be xml:base or xml:lang + if (_reader.Name == _keywords.XmlBase || + _reader.Name == _keywords.XmlLang) + //omit them - we expose virtual ones at the end + return MoveToNextAttribute(); + else + return res; + } + else + { + //No attrs? Expose xml:base + _state = XIncludingReaderState.ExposingXmlBaseAttr; + return true; + } + + } + else + { + return _reader.MoveToFirstAttribute(); + } } /// <summary>See <see cref="XmlReader.MoveToNextAttribute"/></summary> public override bool MoveToNextAttribute() { - bool res = _reader.MoveToNextAttribute(); - if (_topLevel && !res && - _reader.GetAttribute(_keywords.Base, _keywords.XmlNamespace)==null) - { - //End of attributes and there is no xml:base - expose virtual one + if (_topLevel) + { switch (_state) - { + { case XIncludingReaderState.ExposingXmlBaseAttr: case XIncludingReaderState.ExposingXmlBaseAttrValue: + //Exposing xml:base already - switch to xml:lang + if (_differentLang) + { + _state = XIncludingReaderState.ExposingXmlLangAttr; + return true; + } + else + { + //No need for xml:lang, stop + _state = XIncludingReaderState.Default; + return false; + } + case XIncludingReaderState.ExposingXmlLangAttr: + case XIncludingReaderState.ExposingXmlLangAttrValue: + //Exposing xml:lang already - that's a last one _state = XIncludingReaderState.Default; - return false; + return false; default: - _state = XIncludingReaderState.ExposingXmlBaseAttr; - return true; - } - } - else if (_topLevel && XIncludeKeywords.Equals(_reader.LocalName, _keywords.Base) && - XIncludeKeywords.Equals(_reader.NamespaceURI, _keywords.XmlNamespace)) - { - //There is xml:base already - substitute its value - if (res) - { - _state = XIncludingReaderState.ExposingXmlBaseAttr; - return true; - } - else - { - //No more attributes - clean up - _state = XIncludingReaderState.Default; - return false; + //1+ attrs, default mode + bool res = _reader.MoveToNextAttribute(); + if (res) + { + //Still real attributes - it might be xml:base or xml:lang + if (_reader.Name == _keywords.XmlBase || + _reader.Name == _keywords.XmlLang) + //omit them - we expose virtual ones at the end + return MoveToNextAttribute(); + else + return res; + } + else + { + //No more attrs - expose virtual xml:base + _state = XIncludingReaderState.ExposingXmlBaseAttr; + return true; + } } - } - else - return res; + + } + else + { + return _reader.MoveToNextAttribute(); + } } /// <summary>See <see cref="XmlReader.ReadAttributeValue"/></summary> @@ -743,6 +772,8 @@ //If we are including and including reader is at 0 depth - //we are in top level included item _topLevel = (_readers.Count>0 && _reader.Depth == 0)? true : false; + if (_topLevel) + _differentLang = AreDifferentLangs(_reader.XmlLang, ((XmlReader)_readers.Peek()).XmlLang); if (_topLevel && _reader.NodeType == XmlNodeType.Attribute) //Attempt to include an attribute or namespace node throw new AttributeOrNamespaceInIncludeLocationError(SR.AttributeOrNamespaceInIncludeLocationError); @@ -1263,9 +1294,9 @@ /// <summary> /// Compares two languages as per IETF RFC 3066. /// </summary> - private bool AreTheSameLangs(string lang1, string lang2) + private bool AreDifferentLangs(string lang1, string lang2) { - return lang1.ToLower() == lang2.ToLower(); + return lang1.ToLower() != lang2.ToLower(); } /// <summary> Index: XIncludingReaderState.cs =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/XIncludingReaderState.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- XIncludingReaderState.cs 14 Oct 2004 14:17:55 -0000 1.3 +++ XIncludingReaderState.cs 2 Nov 2004 14:31:56 -0000 1.4 @@ -1,5 +1,16 @@ namespace Mvp.Xml.XInclude { - + + //TODO: why not class? + internal struct FallbackState + { + //Fallback is being processed + public bool Fallbacking; + //xi:fallback element depth + public int FallbackDepth; + //Fallback processed flag + public bool FallbackProcessed; + } + /// <summary> /// XIncludingReader state machine. /// </summary> Index: TextIncludingReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/TextIncludingReader.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- TextIncludingReader.cs 28 Oct 2004 18:27:05 -0000 1.6 +++ TextIncludingReader.cs 2 Nov 2004 14:31:56 -0000 1.7 @@ -292,30 +292,20 @@ /// of the resource to inlclude.</param> /// <returns>The document encoding as per XML declaration.</returns> /// <exception cref="ResourceException">Resource error.</exception> - private Encoding GetEncodingFromXMLDecl(string href) + private Encoding GetEncodingFromXMLDecl(string href) { - XmlTextReader tmpReader = new XmlTextReader(href); - tmpReader.WhitespaceHandling = WhitespaceHandling.None; - while (tmpReader.Read()) { - switch (tmpReader.NodeType) { - case XmlNodeType.XmlDeclaration: - if (tmpReader.MoveToAttribute("encoding")) { - string encValue = tmpReader.Value; - try { - return Encoding.GetEncoding(encValue); - } catch (Exception e) { - throw new ResourceException(SR.GetString("NotSupportedEncoding", encValue), e); - } - } else - //No encoding in XML declaration - UTF-8 by default - return Encoding.UTF8; - default: - //No XML declaration - UTF-8 by default - return Encoding.UTF8; - } - } - //Hmmm, empty file? Anyway - return Encoding.UTF8; + XmlTextReader tmpReader = new XmlTextReader(href); + tmpReader.WhitespaceHandling = WhitespaceHandling.None; + try + { + while (tmpReader.Read() && tmpReader.Encoding == null) {} + Encoding enc = tmpReader.Encoding; + return enc==null? Encoding.UTF8 : enc; + } + finally + { + tmpReader.Close(); + } } #endregion |