Esempio n. 1
0
        //XmlTextReader "crawling style" reader fits better the purpose than a "read it all at once" XDocument
        public static string XmlToPlainText(this string xmlDoc, bool isReflectionDocument = false, bool ignoreExceptionsInfo = false, bool vsCodeEncoding = false)
        {
            //var root.XElement.Parse("<root>" + entity.Documentation.Xml.Text + "</root>");
            if (!xmlDoc.HasText())
            {
                return("");
            }

            var sections = new List <string>();

            var b = new StringBuilder();

            try
            {
                using (var reader = new XmlTextReader(new StringReader("<root>" + xmlDoc + "</root>")))
                {
                    string lastElementName   = null;
                    var    exceptionsStarted = false;
                    var    done = false;
                    reader.XmlResolver = null;
                    while (reader.Read() && !done)
                    {
                        var nodeType = reader.NodeType;
                        switch (nodeType)
                        {
                        case XmlNodeType.Text:
                            if (lastElementName == "summary")
                            {
                                if (vsCodeEncoding)
                                {
                                    b.Insert(0, "doc:" + reader.Value.Shrink());
                                }
                                else
                                {
                                    b.Insert(0, reader.Value.Shrink());
                                }
                            }
                            else
                            {
                                if (exceptionsStarted)
                                {
                                    b.Append("  ");
                                }

                                if (lastElementName == "code")
                                {
                                    b.Append(reader.Value);     //need to preserve all formatting (line breaks and indents)
                                }
                                else
                                {
                                    //if (reflectionDocument)
                                    //    b.Append(reader.Value.NormalizeLines()); //need to preserve line breaks but not indents
                                    //else
                                    if (!(exceptionsStarted && ignoreExceptionsInfo))
                                    {
                                        b.Append(reader.Value.Shrink());
                                    }
                                }
                            }
                            break;

                        case XmlNodeType.Element:
                        {
                            bool silentElement = false;

                            switch (reader.Name)
                            {
                            case "filterpriority":
                                reader.Skip();
                                break;

                            case "root":
                            case "summary":
                            case "c":
                                silentElement = true;
                                break;

                            case "paramref":
                                silentElement = true;
                                b.Append(reader.GetAttribute("name"));
                                break;

                            case "param":
                                silentElement = true;
                                if (vsCodeEncoding)
                                {
                                    if (b.Length > 0 && b[b.Length - 1] != '\n')
                                    {
                                        b.AppendLine();
                                    }
                                    b.AppendLine("param_label:" + reader.GetAttribute("name"));
                                    b.Append("param_doc:");
                                }
                                else
                                {
                                    b.AppendLine();
                                    b.Append(reader.GetAttribute("name") + ": ");
                                }
                                break;

                            case "para":
                                silentElement = true;
                                b.AppendLine();
                                break;

                            case "remarks":
                                b.AppendLine();
                                b.Append("Remarks: ");
                                break;

                            case "returns":
                                silentElement = true;
                                b.AppendLine();
                                b.Append("Returns: ");
                                break;

                            case "exception":
                            {
                                if (!exceptionsStarted)
                                {
                                    b.AppendLine();
                                    sections.Add(b.ToString().Trim());
                                    b.Length = 0;
                                    if (!ignoreExceptionsInfo)
                                    {
                                        b.AppendLine("Exceptions: ");
                                    }
                                    else if (vsCodeEncoding)
                                    {
                                        done = true;
                                    }
                                }
                                exceptionsStarted = true;

                                if (!ignoreExceptionsInfo && !reader.IsEmptyElement)
                                {
                                    bool printExInfo = false;
                                    if (printExInfo)
                                    {
                                        b.Append("  " + reader.GetCrefAttribute() + ": ");
                                    }
                                    else
                                    {
                                        b.Append("  " + reader.GetCrefAttribute());
                                        reader.Skip();
                                    }
                                }
                                break;
                            }

                            case "see":
                                silentElement = true;
                                if (reader.IsEmptyElement)
                                {
                                    b.Append(reader.GetCrefAttribute());
                                }
                                else
                                {
                                    reader.MoveToContent();
                                    if (reader.HasValue)
                                    {
                                        b.Append(reader.Value);
                                    }
                                    else
                                    {
                                        b.Append(reader.GetCrefAttribute());
                                    }
                                }
                                break;
                            }

                            if (!silentElement)
                            {
                                b.AppendLine();
                            }

                            lastElementName = reader.Name;
                            break;
                        }

                        case XmlNodeType.EndElement:
                        {
                            if (reader.Name == "summary")
                            {
                                b.AppendLine();
                                sections.Add(b.ToString().Trim());
                                b.Length = 0;
                            }
                            else if (reader.Name == "returns")
                            {
                                b.AppendLine();
                                sections.Add(b.ToString().Trim());
                                b.Length = 0;
                            }
                            break;
                        }
                        }
                    }
                }

                sections.Add(b.ToString().Trim());

                string sectionSeparator = (isReflectionDocument ? "\r\n--------------------------\r\n" : "\r\n\r\n");
                if (vsCodeEncoding)
                {
                    sectionSeparator = "\r\n";
                }
                return(string.Join(sectionSeparator, sections.Where(x => !string.IsNullOrEmpty(x)).ToArray()));
            }
            catch (XmlException)
            {
                return(xmlDoc);
            }
        }
Esempio n. 2
0
        public static string GetDocumentationComment(this ISymbol symbol, bool ignoreExceptionsInfo = false)
        {
            string xmlDoc   = symbol.GetDocumentationCommentXml();
            var    sections = new List <string>();

            var builder = new StringBuilder();

            try
            {
                using (XmlTextReader reader = new XmlTextReader(new StringReader("<root>" + xmlDoc + "</root>")))
                {
                    string lastElementName   = null;
                    bool   exceptionsStarted = false;
                    reader.XmlResolver = null;
                    while (reader.Read())
                    {
                        var nodeType = reader.NodeType;
                        switch (nodeType)
                        {
                        case XmlNodeType.Text:
                            if (lastElementName == "summary")
                            {
                                builder.Insert(0, reader.Value.Shrink());
                            }
                            else
                            {
                                if (exceptionsStarted)
                                {
                                    builder.Append("  ");
                                }

                                if (lastElementName == "code")
                                {
                                    builder.Append(reader.Value);     //need to preserve all formatting (line breaks and indents)
                                }
                                else
                                {
                                    //if (reflectionDocument)
                                    //    b.Append(reader.Value.NormalizeLines()); //need to preserve line breaks but not indents
                                    //else
                                    builder.Append(reader.Value.Shrink());
                                }
                            }
                            break;

                        case XmlNodeType.Element:
                        {
                            bool silentElement = false;

                            switch (reader.Name)
                            {
                            case "filterpriority":
                                reader.Skip();
                                break;

                            case "root":
                            case "summary":
                            case "c":
                                silentElement = true;
                                break;

                            case "paramref":
                                silentElement = true;
                                builder.Append(reader.GetAttribute("name"));
                                break;

                            case "param":
                                silentElement = true;
                                builder.AppendLine();
                                builder.Append(reader.GetAttribute("name") + ": ");
                                break;

                            case "para":
                                silentElement = true;
                                builder.AppendLine();
                                break;

                            case "remarks":
                                builder.AppendLine();
                                builder.Append("Remarks: ");
                                break;

                            case "returns":
                                silentElement = true;
                                builder.AppendLine();
                                builder.Append("Returns: ");
                                break;

                            case "exception":
                            {
                                if (!exceptionsStarted)
                                {
                                    builder.AppendLine();
                                    sections.Add(builder.ToString().Trim());
                                    builder.Length = 0;
                                    if (!ignoreExceptionsInfo)
                                    {
                                        builder.AppendLine("Exceptions: ");
                                    }
                                }
                                exceptionsStarted = true;

                                if (!ignoreExceptionsInfo && !reader.IsEmptyElement)
                                {
                                    bool printExInfo = false;
                                    if (printExInfo)
                                    {
                                        builder.Append("  " + reader.GetCrefAttribute() + ": ");
                                    }
                                    else
                                    {
                                        builder.Append("  " + reader.GetCrefAttribute());
                                        reader.Skip();
                                    }
                                }
                                break;
                            }

                            case "see":
                                silentElement = true;
                                if (reader.IsEmptyElement)
                                {
                                    builder.Append(reader.GetCrefAttribute());
                                }
                                else
                                {
                                    reader.MoveToContent();
                                    if (reader.HasValue)
                                    {
                                        builder.Append(reader.Value);
                                    }
                                    else
                                    {
                                        builder.Append(reader.GetCrefAttribute());
                                    }
                                }
                                break;
                            }

                            if (!silentElement)
                            {
                                builder.AppendLine();
                            }

                            lastElementName = reader.Name;
                            break;
                        }

                        case XmlNodeType.EndElement:
                        {
                            if (reader.Name == "summary")
                            {
                                builder.AppendLine();
                                sections.Add(builder.ToString().Trim());
                                builder.Length = 0;
                            }
                            else if (reader.Name == "returns")
                            {
                                builder.AppendLine();
                                sections.Add(builder.ToString().Trim());
                                builder.Length = 0;
                            }
                            break;
                        }
                        }
                    }
                }

                sections.Add(builder.ToString().Trim());

                string sectionSeparator = "\r\n--------------------------\r\n";
                return(string.Join(sectionSeparator, sections.Where(x => !string.IsNullOrEmpty(x)).ToArray()));
            }
            catch (XmlException)
            {
                return(xmlDoc);
            }
        }
Esempio n. 3
0
        public static string XmlToPlainTextOld(this string xmlDoc)
        {
            var b = new StringBuilder();

            try
            {
                using (XmlTextReader reader = new XmlTextReader(new StringReader("<root>" + xmlDoc + "</root>")))
                {
                    string lastElementName = null;
                    reader.XmlResolver = null;
                    while (reader.Read())
                    {
                        switch (reader.NodeType)
                        {
                        case XmlNodeType.Text:
                            if (lastElementName == "summary")
                            {
                                b.Insert(0, reader.Value);
                                b.AppendLine();
                            }
                            else
                            {
                                b.Append(reader.Value);
                            }
                            break;

                        case XmlNodeType.Element:
                        {
                            switch (reader.Name)
                            {
                            case "filterpriority":
                                reader.Skip();
                                break;

                            case "returns":
                                b.AppendLine();
                                b.Append("Returns: ");
                                break;

                            case "param":
                                b.AppendLine();
                                b.Append(reader.GetAttribute("name") + ": ");
                                break;

                            case "remarks":
                                b.AppendLine();
                                b.Append("Remarks: ");
                                break;

                            case "exception":
                                b.AppendLine();
                                b.Append("Exceptions: ");
                                break;

                            case "see":
                                if (reader.IsEmptyElement)
                                {
                                    b.Append(reader.GetCrefAttribute());
                                }
                                else
                                {
                                    reader.MoveToContent();
                                    if (reader.HasValue)
                                    {
                                        b.Append(reader.Value);
                                    }
                                    else
                                    {
                                        b.Append(reader.GetCrefAttribute());
                                    }
                                }
                                break;
                            }
                            lastElementName = reader.Name;
                            break;
                        }
                        }
                    }
                }
                return(b.ToString());
            }
            catch (XmlException)
            {
                return(xmlDoc);
            }
        }