/** * Parses Markdown from the children of a Doxygen code node * * @param Node Xml node we want to parse into Markdown * @param Output StringBuilder to receive the output * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. */ static void ParseXmlCodeLineChildren(XmlNode Node, StringBuilder Output, ResolveLinkDelegate ResolveLink) { foreach (XmlNode ChildNode in Node.ChildNodes) { ParseXmlCodeLine(ChildNode, Output, ResolveLink); } }
/** * Parses Markdown from a Doxygen code node * * @param Node Xml node we want to parse into Markdown * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. * @return Converted text */ public static string ParseXmlCodeLine(XmlNode Node, ResolveLinkDelegate ResolveLink) { StringBuilder Builder = new StringBuilder(); ParseXmlCodeLine(Node, Builder, ResolveLink); return(Builder.ToString()); }
/** * Parses Markdown from a Doxygen code node * * @param Node Xml node we want to parse into Markdown * @param Output StringBuilder to receive the output * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. */ static void ParseXmlCodeLine(XmlNode Node, StringBuilder Output, ResolveLinkDelegate ResolveLink) { switch (Node.Name) { case "sp": Output.Append(' '); return; case "ref": XmlAttribute RefAttribute = Node.Attributes["refid"]; string LinkPath = (RefAttribute != null && ResolveLink != null)? ResolveLink(RefAttribute.Value) : null; if (LinkPath != null) { Output.Append("["); } ParseXmlCodeLineChildren(Node, Output, ResolveLink); if (LinkPath != null) { Output.AppendFormat("]({0})", LinkPath); } break; case "#text": Output.Append(EscapeText(Node.InnerText)); break; default: ParseXmlCodeLineChildren(Node, Output, ResolveLink); break; } }
/** * Parses markdown text out of an XML node * * @param child xml node we want to parse into Markdown * @param Indent indenting prefix for each newline of text in the converted markdown * @param ResolveLink delegate to call to resolve doxygen id's into link paths. may be null. * @return a string containing the text from the child node */ public static string ParseXml(XmlNode Node, string Indent, ResolveLinkDelegate ResolveLink) { MarkdownWriter Writer = new MarkdownWriter(Indent); ConvertNodeContents(Node, Writer, ResolveLink); return(Writer.ToString()); }
/** * Converts all children of the given XML node * * @param Node Xml node we want to parse all children into Markdown * @param Writer Output for markdown text * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. */ static void ConvertNodeContents(XmlNode Node, MarkdownWriter Writer, ResolveLinkDelegate ResolveLink) { if (Node.HasChildNodes) { foreach (XmlNode ChildNode in Node.ChildNodes) { ConvertNode(ChildNode, Writer, ResolveLink); } } else { Writer.Write(EscapeXmlText(Node.InnerText)); } }
/** * Parses markdown text out of an XML node * * @param child xml node we want to parse into Markdown * @param Indent indenting prefix for each newline of text in the converted markdown * @param Output storage for the output string * @param ResolveLink delegate to call to resolve doxygen id's into link paths. may be null. */ static void ConvertNode(XmlNode Node, MarkdownWriter Writer, ResolveLinkDelegate ResolveLink) { switch (Node.Name) { case "ulink": string LinkText = Node.InnerText; string LinkUrl = Node.Attributes.GetNamedItem("url").InnerText; const string WebPrefix = "docs.unrealengine.com/latest/INT/"; int WebPrefixIdx = LinkUrl.IndexOf(WebPrefix); if (WebPrefixIdx != -1 && LinkText.Contains("docs.unrealengine.com")) { LinkText = ""; LinkUrl = LinkUrl.Substring(WebPrefixIdx + WebPrefix.Length); int AnchorIdx = LinkUrl.LastIndexOf('#'); if (AnchorIdx == -1) { LinkUrl = RemoveDefaultPageName(LinkUrl); } else { LinkUrl = RemoveDefaultPageName(LinkUrl.Substring(0, AnchorIdx)) + LinkUrl.Substring(AnchorIdx); } } Writer.WriteLink(LinkText, LinkUrl); break; case "ref": XmlAttribute RefAttribute = Node.Attributes["refid"]; if (RefAttribute != null && ResolveLink != null) { string LinkPath = ResolveLink(RefAttribute.Value); if (LinkPath != null) { Writer.WriteLink(Node.InnerText, LinkPath); break; } } Writer.Write(Node.InnerText); break; case "bold": Writer.Write("**"); ConvertNodeContents(Node, Writer, ResolveLink); Writer.Write("**"); break; case "emphasis": Writer.Write("_"); ConvertNodeContents(Node, Writer, ResolveLink); Writer.Write("_"); break; case "computeroutput": Writer.Write("`"); ConvertNodeContents(Node, Writer, ResolveLink); Writer.Write("_"); break; case "parameterlist": break; case "parameteritem": break; case "parameternamelist": break; case "parameterdescription": ConvertNodeContents(Node, Writer, ResolveLink); break; case "xrefsect": break; case "simplesect": XmlAttribute KindAttribute = Node.Attributes["kind"]; if (KindAttribute == null || KindAttribute.Value != "see") { ConvertNodeContents(Node, Writer, ResolveLink); } break; case "para": Writer.WriteParagraph(); ConvertNodeContents(Node, Writer, ResolveLink); break; case "itemizedlist": Writer.WriteLine(); foreach (XmlNode ListItemNode in Node.SelectNodes("listitem")) { XmlNodeList ParaNodes = ListItemNode.SelectNodes("para"); if (ParaNodes.Count > 0) { // Write the first node Writer.Write("* "); Writer.AddIndent(" "); ConvertNodeContents(ParaNodes[0], Writer, ResolveLink); // Write anything else as an actual paragraph for (int Idx = 1; Idx < ParaNodes.Count; Idx++) { Writer.WriteLine(); ConvertNodeContents(ParaNodes[Idx], Writer, ResolveLink); } // Finish the line Writer.RemoveIndent(); Writer.WriteLine(); } } break; default: ConvertNodeContents(Node, Writer, ResolveLink); break; } }
/** * Parses Markdown from the children of a Doxygen code node * * @param Node Xml node we want to parse into Markdown * @param Output StringBuilder to receive the output * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. */ static void ParseXmlCodeLineChildren(XmlNode Node, StringBuilder Output, ResolveLinkDelegate ResolveLink) { foreach(XmlNode ChildNode in Node.ChildNodes) { ParseXmlCodeLine(ChildNode, Output, ResolveLink); } }
/** * Parses Markdown from a Doxygen code node * * @param Node Xml node we want to parse into Markdown * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. * @return Converted text */ public static string ParseXmlCodeLine(XmlNode Node, ResolveLinkDelegate ResolveLink) { StringBuilder Builder = new StringBuilder(); ParseXmlCodeLine(Node, Builder, ResolveLink); return Builder.ToString(); }
/** * Parses Markdown from a Doxygen code node * * @param Node Xml node we want to parse into Markdown * @param Output StringBuilder to receive the output * @param ResolveLink Delegate to call to resolve doxygen id's into link paths. may be null. */ static void ParseXmlCodeLine(XmlNode Node, StringBuilder Output, ResolveLinkDelegate ResolveLink) { switch(Node.Name) { case "sp": Output.Append(' '); return; case "ref": XmlAttribute RefAttribute = Node.Attributes["refid"]; string LinkPath = (RefAttribute != null && ResolveLink != null)? ResolveLink(RefAttribute.Value) : null; if(LinkPath != null) { Output.Append("["); } ParseXmlCodeLineChildren(Node, Output, ResolveLink); if(LinkPath != null) { Output.AppendFormat("]({0})", LinkPath); } break; case "#text": Output.Append(EscapeText(Node.InnerText)); break; default: ParseXmlCodeLineChildren(Node, Output, ResolveLink); break; } }
/** * Parses markdown text out of an XML node * * @param child xml node we want to parse into Markdown * @param Indent indenting prefix for each newline of text in the converted markdown * @param Output storage for the output string * @param ResolveLink delegate to call to resolve doxygen id's into link paths. may be null. */ static void ConvertNode(XmlNode Node, MarkdownWriter Writer, ResolveLinkDelegate ResolveLink) { switch (Node.Name) { case "ulink": string LinkText = Node.InnerText; string LinkUrl = Node.Attributes.GetNamedItem("url").InnerText; const string WebPrefix = "docs.unrealengine.com/latest/INT/"; int WebPrefixIdx = LinkUrl.IndexOf(WebPrefix); if (WebPrefixIdx != -1 && LinkText.Contains("docs.unrealengine.com")) { LinkText = ""; LinkUrl = LinkUrl.Substring(WebPrefixIdx + WebPrefix.Length); int AnchorIdx = LinkUrl.LastIndexOf('#'); if(AnchorIdx == -1) { LinkUrl = RemoveDefaultPageName(LinkUrl); } else { LinkUrl = RemoveDefaultPageName(LinkUrl.Substring(0, AnchorIdx)) + LinkUrl.Substring(AnchorIdx); } } Writer.WriteLink(LinkText, LinkUrl); break; case "ref": XmlAttribute RefAttribute = Node.Attributes["refid"]; if (RefAttribute != null && ResolveLink != null) { string LinkPath = ResolveLink(RefAttribute.Value); if (LinkPath != null) { Writer.WriteLink(Node.InnerText, LinkPath); break; } } Writer.Write(Node.InnerText); break; case "bold": Writer.Write("**"); ConvertNodeContents(Node, Writer, ResolveLink); Writer.Write("**"); break; case "emphasis": Writer.Write("_"); ConvertNodeContents(Node, Writer, ResolveLink); Writer.Write("_"); break; case "computeroutput": Writer.Write("`"); ConvertNodeContents(Node, Writer, ResolveLink); Writer.Write("_"); break; case "parameterlist": break; case "parameteritem": break; case "parameternamelist": break; case "parameterdescription": ConvertNodeContents(Node, Writer, ResolveLink); break; case "xrefsect": break; case "simplesect": XmlAttribute KindAttribute = Node.Attributes["kind"]; if (KindAttribute == null || KindAttribute.Value != "see") { ConvertNodeContents(Node, Writer, ResolveLink); } break; case "para": Writer.WriteParagraph(); ConvertNodeContents(Node, Writer, ResolveLink); break; case "itemizedlist": Writer.WriteLine(); foreach (XmlNode ListItemNode in Node.SelectNodes("listitem")) { XmlNodeList ParaNodes = ListItemNode.SelectNodes("para"); if (ParaNodes.Count > 0) { // Write the first node Writer.Write("* "); Writer.AddIndent(" "); ConvertNodeContents(ParaNodes[0], Writer, ResolveLink); // Write anything else as an actual paragraph for (int Idx = 1; Idx < ParaNodes.Count; Idx++) { Writer.WriteLine(); ConvertNodeContents(ParaNodes[Idx], Writer, ResolveLink); } // Finish the line Writer.RemoveIndent(); Writer.WriteLine(); } } break; default: ConvertNodeContents(Node, Writer, ResolveLink); break; } }
/** * Parses markdown text out of an XML node * * @param child xml node we want to parse into Markdown * @param Indent indenting prefix for each newline of text in the converted markdown * @param ResolveLink delegate to call to resolve doxygen id's into link paths. may be null. * @return a string containing the text from the child node */ public static string ParseXml(XmlNode Node, string Indent, ResolveLinkDelegate ResolveLink) { MarkdownWriter Writer = new MarkdownWriter(Indent); ConvertNodeContents(Node, Writer, ResolveLink); return Writer.ToString(); }
/** Parses markdown text out of an XML node * * @param child xml node we want to parse into Markdown * @param Indent indenting prefix for each newline of text in the converted markdown * @param ResolveLink delegate to call to resolve doxygen id's into link paths. may be null. * @return a string containing the text from the child node */ public static string ParseXml(XmlNode child, string Indent, ResolveLinkDelegate ResolveLink) { string output = ""; XmlNode parent = child.ParentNode; if (child.HasChildNodes) { switch (child.Name) { case "para": if (parent.Name != "listitem" && parent.Name != "parameterdescription" && parent.Name != "simplesect") { output += Environment.NewLine; output += ParseChildren(child, Indent, ResolveLink); } else if (parent.Name == "listitem") { output += Environment.NewLine; if (child == parent.FirstChild) { output += Indent + "* " + ParseChildren(child, Indent, ResolveLink); } else { output += Environment.NewLine + Indent + "\t" + ParseChildren(child, Indent, ResolveLink); } } else if (parent.Name == "parameterdescription" || parent.Name == "simplesect") { output += ParseChildren(child, Indent, ResolveLink); } break; case "ulink": if (bDocToolCanParseExternalLinks) { output += Indent + String.Format("[{0}]({1})", ParseChildren(child, Indent, ResolveLink), child.Attributes.GetNamedItem("url").InnerText); } else { output += Indent + EscapeText(child.Attributes.GetNamedItem("url").InnerText); } break; case "ref": XmlAttribute RefAttribute = child.Attributes["refid"]; if (RefAttribute != null && ResolveLink != null) { string LinkPath = ResolveLink(RefAttribute.Value); if(LinkPath != null) { output += String.Format("[{0}]({1})", ParseChildren(child, Indent, ResolveLink), LinkPath); break; } } output += ParseChildren(child, Indent, ResolveLink); break; case "bold": output += Indent + String.Format("**{0}**", ParseChildren(child, Indent, ResolveLink)); break; case "emphasis": output += Indent + String.Format("_{0}_", ParseChildren(child, Indent, ResolveLink)); break; case "computeroutput": output += Indent + String.Format("`{0}`", ParseChildren(child, Indent, ResolveLink)); break; case "itemizedlist": if (parent.ParentNode.Name == "listitem") { output += ParseChildren(child, Indent + "\t", ResolveLink); } else { output += Environment.NewLine + ParseChildren(child, Indent, ResolveLink) + Environment.NewLine + Environment.NewLine; } break; case "parameterlist": break; case "parameteritem": break; case "parameternamelist": break; case "simplesect": break; case "xrefsect": break; default: output += ParseChildren(child, Indent, ResolveLink); break; } } else { output += Indent + EscapeText(child.InnerText); } return output; }
/** Class ParseXML for all child nodes of the given child * * @param child xml node we want to parse all children into Markdown * @return a string containing the text from the child node */ static String ParseChildren(XmlNode child, string Indent, ResolveLinkDelegate ResolveLink) { String output = ""; foreach (XmlNode childNode in child.ChildNodes) { if (output.Length > 0 && output[output.Length - 1] != ' ') output += " "; output += ParseXml(childNode, Indent, ResolveLink); } return output; }