Opentk/Source/Bind/DocProcessor.cs
the_fiddler a7849e8dd9 Fixed the path separators so that they work on Unix.
Improved the output for the doc processor: MathML equations are replaced by their textual representation and whitespace better matches function declarations.
Added new configuration settings for the doc processor and the license.
Removed stale debugging code.
License.txt is now a file, not a resource.
2009-03-08 18:08:35 +00:00

73 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
namespace Bind
{
class DocProcessor
{
static readonly Regex remove_mathml = new Regex(@"<(mml:math)[^>]*?>(?:.|\n)*?</\s*\1\s*>",
RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
static readonly StreamWriter output_stream = new StreamWriter(new MemoryStream());
static readonly XslCompiledTransform xslt = new System.Xml.Xsl.XslCompiledTransform();
static readonly XmlReaderSettings settings = new XmlReaderSettings();
public DocProcessor(string transform_file)
{
xslt.Load(transform_file);
settings.ProhibitDtd = false;
settings.XmlResolver = null;
}
// Strips MathML tags from the source and replaces the equations with the content
// found in the <!-- eqn: :--> comments in the docs.
// Todo: Some simple MathML tags do not include comments, find a solution.
// Todo: Some files include more than 1 function - find a way to map these extra functions.
public string ProcessFile(string file)
{
string text = File.ReadAllText(file);
Match m = remove_mathml.Match(text);
while (m.Length > 0)
{
string removed = text.Substring(m.Index, m.Length);
text = text.Remove(m.Index, m.Length);
int equation = removed.IndexOf("eqn");
if (equation > 0)
{
text = text.Insert(m.Index,
"<![CDATA[" +
removed.Substring(equation + 4, removed.IndexOf(":-->") - equation - 4) +
"]]>");
}
m = remove_mathml.Match(text);
}
XmlReader doc = null;
try
{
// The pure XmlReader is ~20x faster than the XmlTextReader.
doc = XmlReader.Create(new StringReader(text), settings);
//doc = new XmlTextReader(new StringReader(text));
using (StringWriter sw = new StringWriter())
{
xslt.Transform(doc, null, sw);
return sw.ToString();
}
}
catch (XmlException e)
{
Console.WriteLine(e.ToString());
Console.WriteLine(doc.ToString());
return String.Empty;
}
}
}
}