[monodoc] Add workaround to process CDATA backed summaries/remarks in namespaces
authorJérémie Laval <jeremie.laval@gmail.com>
Thu, 9 May 2013 16:11:13 +0000 (12:11 -0400)
committerJérémie Laval <jeremie.laval@gmail.com>
Thu, 9 May 2013 16:13:11 +0000 (12:13 -0400)
mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs
mcs/class/monodoc/monodoc_test.dll.sources

index 1dcc72af1d4e8affb6415774f232c9415cce59dd..c73ed1907e25691a2dad7604e5fa4b77d891a25d 100644 (file)
@@ -81,12 +81,20 @@ namespace Monodoc.Generators.Html
 
                public string Export (Stream stream, Dictionary<string, string> extraArgs)
                {
-                       return Htmlize (XmlReader.Create (stream), extraArgs);
+                       return Htmlize (XmlReader.Create (WrapStream (new StreamReader (stream), extraArgs)), extraArgs);
                }
 
                public string Export (string input, Dictionary<string, string> extraArgs)
                {
-                       return Htmlize (XmlReader.Create (new StringReader (input)), extraArgs);
+                       return Htmlize (XmlReader.Create (WrapStream (new StringReader (input), extraArgs)), extraArgs);
+               }
+
+               TextReader WrapStream (TextReader initialReader, Dictionary<string, string> renderArgs)
+               {
+                       string show;
+                       if (renderArgs.TryGetValue ("show", out show) && show == "namespace")
+                               return new AvoidCDataTextReader (initialReader);
+                       return initialReader;
                }
                
                static void EnsureTransform ()
@@ -310,4 +318,81 @@ namespace Monodoc.Generators.Html
                        }
                }
        }
+
+       public class AvoidCDataTextReader : TextReader
+       {
+               static readonly char[] CDataPattern = new[] {
+                       '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '['
+               };
+               static readonly char[] CDataClosingPattern = new[] {
+                       ']', ']', '>'
+               };
+               TextReader wrappedReader;
+               char[] backingArray = new char[9]; // "<![CDATA[".Length
+               int currentIndex = -1;
+               int eofIndex = -1;
+               bool inCData;
+
+               public AvoidCDataTextReader (TextReader wrappedReader)
+               {
+                       this.wrappedReader = wrappedReader;
+               }
+
+               public override int Peek ()
+               {
+                       if (!EnsureBuffer ())
+                               return -1;
+                       return (int)backingArray[currentIndex];
+               }
+
+               public override int Read ()
+               {
+                       if (!EnsureBuffer ())
+                               return -1;
+                       var result = (int)backingArray[currentIndex];
+                       var next = wrappedReader.Read ();
+                       if (next == -1 && eofIndex == -1)
+                               eofIndex = currentIndex;
+                       else
+                               backingArray[currentIndex] = (char)next;
+                       currentIndex = (currentIndex + 1) % backingArray.Length;
+                       return result;
+               }
+
+               void ReadLength (int length)
+               {
+                       for (int i = 0; i < length; i++)
+                               Read ();
+               }
+
+               bool EnsureBuffer ()
+               {
+                       if (currentIndex == -1) {
+                               currentIndex = 0;
+                               var read = wrappedReader.ReadBlock (backingArray, 0, backingArray.Length);
+                               if (read < backingArray.Length)
+                                       eofIndex = read;
+                               return read > 0;
+                       } else if (currentIndex == eofIndex) {
+                               return false;
+                       }
+                       if (!inCData && PatternDetect (CDataPattern)) {
+                               inCData = true;
+                               ReadLength (CDataPattern.Length);
+                               return EnsureBuffer ();
+                       }
+                       if (inCData && PatternDetect (CDataClosingPattern)) {
+                               inCData = false;
+                               ReadLength (CDataClosingPattern.Length);
+                               return EnsureBuffer ();
+                       }
+
+                       return true;
+               }
+
+               bool PatternDetect (char[] pattern)
+               {
+                       return backingArray[currentIndex] == pattern[0] && Enumerable.Range (1, pattern.Length - 1).All (i => backingArray[(currentIndex + i) % backingArray.Length] == pattern[i]);
+               }
+       }
 }
index b806b8fb6e970302dd755c331a070e831781639a..b5af3b71a048f0191190b9b0a7704a9be14dc852 100644 (file)
@@ -6,3 +6,4 @@ Monodoc/SettingsTest.cs
 Monodoc.Generators/RawGeneratorTests.cs
 Monodoc/NodeTest.cs
 Monodoc/RootTreeTest.cs
+Monodoc.Generators/AvoidCDataTextReaderTests.cs