예제 #1
0
        static string ParseBody(ISymbol member, XmlTextReader xml, string endTagName, DocumentationFormatOptions options)
        {
            StringBuilder result        = StringBuilderCache.Allocate();
            bool          wasWhiteSpace = true;
            bool          appendSpace   = false;
            string        listType      = "bullet";
            int           listItem      = 1;

            //ITypeResolveContext ctx = member.Compilation.TypeResolveContext;
            while (xml.Read())
            {
                switch (xml.NodeType)
                {
                case XmlNodeType.EndElement:
                    if (xml.Name == endTagName)
                    {
                        goto end;
                    }
                    break;

                case XmlNodeType.Element:
                    switch (xml.Name.ToLower())
                    {
                    case "para":
                        result.AppendLine(ParseBody(member, xml, xml.Name, options));
                        wasWhiteSpace = true;
                        break;

                    case "list":
                        listType = xml ["type"] ?? listType;
                        listItem = 1;
                        result.AppendLine();
                        result.AppendLine();
                        break;

                    case "term": {
                        string inner = "<root>" + xml.ReadInnerXml() + "</root>";
                        result.Append("<i>").Append(ParseBody(member, new XmlTextReader(new StringReader(inner)), "root", options)).Append(" </i>");
                        break;
                    }

                    case "description": {
                        string inner = "<root>" + xml.ReadInnerXml() + "</root>";
                        result.Append(ParseBody(member, new XmlTextReader(new StringReader(inner)), "root", options));
                        break;
                    }

                    case "listheader":  {
                        string inner = "<root>" + xml.ReadInnerXml() + "</root>";
                        string prefix;
                        switch (listType)
                        {
                        case "number":
                            prefix = "     ";
                            break;

                        case "table":
                            prefix = "    ";
                            break;

                        default:                         // bullet;
                            prefix = "    ";
                            break;
                        }
                        result.Append(prefix);
                        result.AppendLine(ParseBody(member, new XmlTextReader(new StringReader(inner)), "root", options));
                        break;
                    }

                    case "item": {
                        string inner = "<root>" + xml.ReadInnerXml() + "</root>";
                        string prefix;
                        switch (listType)
                        {
                        case "number":
                            prefix = string.Format("  {0:##}. ", listItem++);
                            break;

                        case "table":
                            prefix = "    ";
                            break;

                        default:                                 // bullet;
                            prefix = "  \u2022 ";
                            break;
                        }
                        result.Append(prefix);
                        result.AppendLine(ParseBody(member, new XmlTextReader(new StringReader(inner)), "root", options));
                        break;
                    }

                    case "see":
                        if (!wasWhiteSpace)
                        {
                            result.Append(' ');
                            wasWhiteSpace = true;
                        }
                        result.Append("<i>");
                        string name = (xml ["cref"] + xml ["langword"]).Trim();
                        result.Append(EscapeText(FormatCref(name)));
                        result.Append("</i>");
                        wasWhiteSpace = false;
                        appendSpace   = true;
                        break;

                    case "paramref":
                        if (!wasWhiteSpace)
                        {
                            result.Append(' ');
                            wasWhiteSpace = true;
                        }
                        result.Append("<i>");
                        result.Append(EscapeText(xml ["name"].Trim()));
                        result.Append("</i>");
                        appendSpace   = true;
                        wasWhiteSpace = false;
                        break;
                    }
                    break;

                case XmlNodeType.Text:
                    if (IsEmptyDocumentation(xml.Value))
                    {
                        break;
                    }
                    foreach (char ch in xml.Value)
                    {
                        if (!Char.IsWhiteSpace(ch) && appendSpace)
                        {
                            result.Append(' ');
                            appendSpace = false;
                        }
                        if (Char.IsWhiteSpace(ch) || ch == '\n' || ch == '\r')
                        {
                            if (!wasWhiteSpace)
                            {
                                result.Append(' ');
                                wasWhiteSpace = true;
                            }
                            continue;
                        }
                        wasWhiteSpace = false;
                        result.Append(EscapeText(ch.ToString()));
                    }
                    break;
                }
            }
end:
            return(StringBuilderCache.ReturnAndFree(result).Trim());
        }
예제 #2
0
        public static string GetDocumentationMarkup(ISymbol member, string doc, DocumentationFormatOptions options)
        {
            if (string.IsNullOrEmpty(doc))
            {
                return(null);
            }
            System.IO.StringReader reader           = new System.IO.StringReader("<docroot>" + doc + "</docroot>");
            XmlTextReader          xml              = new XmlTextReader(reader);
            StringBuilder          ret              = StringBuilderCache.Allocate();
            StringBuilder          parameterBuilder = StringBuilderCache.Allocate();
            StringBuilder          exceptions       = StringBuilderCache.Allocate();

            exceptions.AppendLine(options.FormatHeading(GettextCatalog.GetString("Exceptions:")));
            //		ret.Append ("<small>");
            int paramCount = 0, exceptionCount = 0, summaryEnd = -1;

            try {
                xml.Read();
                do
                {
                    if (xml.NodeType == XmlNodeType.Element)
                    {
                        switch (xml.Name.ToLower())
                        {
                        case "para":
                            ret.Append(options.FormatBody(ParseBody(member, xml, xml.Name, options)));
                            if (summaryEnd < 0)
                            {
                                summaryEnd = ret.Length;
                            }
                            break;

                        case "member":
                        case "summary":
                            var summary = options.FormatBody(ParseBody(member, xml, xml.Name, options));
                            if (!IsEmptyDocumentation(summary))
                            {
                                //							ret.AppendLine (GetHeading ("Summary:", options));
                                ret.Append(summary);
                                if (summaryEnd < 0)
                                {
                                    summaryEnd = ret.Length;
                                }
                            }
                            break;

                        case "remarks":
                            if (string.IsNullOrEmpty(options.HighlightParameter))
                            {
                                ret.AppendLine(options.FormatHeading(GettextCatalog.GetString("Remarks:")));
                                ret.Append(options.FormatBody(ParseBody(member, xml, xml.Name, options)));
                                if (summaryEnd < 0)
                                {
                                    summaryEnd = ret.Length;
                                }
                            }
                            else
                            {
                                options.FormatBody(ParseBody(member, xml, xml.Name, options));
                            }
                            break;

                        // skip <example>-nodes
                        case "example":
                            xml.Skip();
                            xml.Skip();
                            break;

                        case "exception":
                            exceptionCount++;
                            if (options.SmallText)
                            {
                                exceptions.Append("<small>");
                            }
                            exceptions.Append("<b>");
                            exceptions.Append(EscapeText(xml ["cref"]));
                            exceptions.Append(": ");
                            exceptions.Append("</b>");
                            if (options.SmallText)
                            {
                                exceptions.Append("</small>");
                            }

                            exceptions.AppendLine(options.FormatBody(ParseBody(member, xml, xml.Name, options)));
                            break;

                        case "returns":
                            if (string.IsNullOrEmpty(options.HighlightParameter))
                            {
                                ret.AppendLine(options.FormatHeading(GettextCatalog.GetString("Returns:")));
                                ret.Append(options.FormatBody(ParseBody(member, xml, xml.Name, options)));
                            }
                            else
                            {
                                options.FormatBody(ParseBody(member, xml, xml.Name, options));
                            }
                            break;

                        case "param":
                            string paramName = xml.GetAttribute("name") != null ? xml ["name"].Trim() : "";

                            var body = options.FormatBody(ParseBody(member, xml, xml.Name, options));
                            if (!IsEmptyDocumentation(body))
                            {
                                paramCount++;
                                parameterBuilder.Append("<i>");
                                if (options.HighlightParameter == paramName)
                                {
                                    parameterBuilder.Append("<b>");
                                }
                                if (options.SmallText)
                                {
                                    parameterBuilder.Append("<small>");
                                }
                                parameterBuilder.Append(EscapeText(paramName));
                                if (options.SmallText)
                                {
                                    parameterBuilder.Append("</small>");
                                }
                                if (options.HighlightParameter == paramName)
                                {
                                    parameterBuilder.Append("</b>");
                                }
                                parameterBuilder.Append(":</i> ");
                                parameterBuilder.Append(body);
                            }
                            else
                            {
                                return(null);
                            }
                            break;

                        case "value":
                            ret.AppendLine(options.FormatHeading(GettextCatalog.GetString("Value:")));
                            ret.AppendLine(options.FormatBody(ParseBody(member, xml, xml.Name, options)));
                            break;

                        case "seealso":
                            if (string.IsNullOrEmpty(options.HighlightParameter))
                            {
                                ret.Append(options.FormatHeading(GettextCatalog.GetString("See also:")));
                                ret.Append(" ");
                                ret.Append(EscapeText(xml ["cref"]));
                                ret.Append(EscapeText(xml ["langword"]));
                            }
                            break;
                        }
                    }
                } while (xml.Read());

                if (IsEmptyDocumentation(ret.ToString()) && IsEmptyDocumentation(parameterBuilder.ToString()))
                {
                    return(EscapeText(doc));
                }
                if (string.IsNullOrEmpty(options.HighlightParameter) && exceptionCount > 0)
                {
                    ret.Append(exceptions.ToString());
                }

                string result = ret.ToString();
                if (summaryEnd < 0)
                {
                    summaryEnd = result.Length;
                }
                if (paramCount > 0)
                {
                    var paramSb = StringBuilderCache.Allocate();
                    if (result.Length > 0)
                    {
                        paramSb.AppendLine();                         /*
                                                                       * paramSb.Append ("<small>");
                                                                       * paramSb.AppendLine (options.FormatHeading (GettextCatalog.GetPluralString ("Parameter:", "Parameters:", paramCount)));
                                                                       * paramSb.Append ("</small>");*/
                    }
                    paramSb.Append(parameterBuilder.ToString());
                    result = result.Insert(summaryEnd, StringBuilderCache.ReturnAndFree(paramSb));
                }
                result = result.Trim();
                if (result.EndsWith(Environment.NewLine + "</small>"))
                {
                    result = result.Substring(0, result.Length - (Environment.NewLine + "</small>").Length) + "</small>";
                }
                return(result);
            } catch (Exception ex) {
                MonoDevelop.Core.LoggingService.LogError(ex.ToString());
                return(EscapeText(doc));
            } finally {
                StringBuilderCache.Free(ret);
                StringBuilderCache.Free(parameterBuilder);
                StringBuilderCache.Free(exceptions);
            }
        }
예제 #3
0
        public static string GetDocumentationMarkup(string doc, DocumentationFormatOptions options)
        {
            if (string.IsNullOrEmpty(doc))
            {
                return(null);
            }
            System.IO.StringReader reader     = new System.IO.StringReader("<docroot>" + doc + "</docroot>");
            XmlTextReader          xml        = new XmlTextReader(reader);
            StringBuilder          ret        = new StringBuilder(70);
            StringBuilder          parameters = new StringBuilder();
            StringBuilder          exceptions = new StringBuilder();

            parameters.AppendLine(options.FormatHeading("Parameters:"));

            exceptions.AppendLine(options.FormatHeading("Exceptions:"));
            //		ret.Append ("<small>");
            int paramCount = 0, exceptionCount = 0, summaryEnd = -1;

            try {
                xml.Read();
                do
                {
                    if (xml.NodeType == XmlNodeType.Element)
                    {
                        switch (xml.Name.ToLower())
                        {
                        case "para":
                            ret.Append(options.FormatBody(ParseBody(xml, xml.Name, options)));
                            if (summaryEnd < 0)
                            {
                                summaryEnd = ret.Length;
                            }
                            break;

                        case "summary":
//							ret.AppendLine (GetHeading ("Summary:", options));
                            ret.Append(options.FormatBody(ParseBody(xml, xml.Name, options)));
                            if (summaryEnd < 0)
                            {
                                summaryEnd = ret.Length;
                            }
                            break;

                        case "remarks":
                            if (string.IsNullOrEmpty(options.HighlightParameter))
                            {
                                ret.AppendLine(options.FormatHeading("Remarks:"));
                                ret.Append(options.FormatBody(ParseBody(xml, xml.Name, options)));
                                if (summaryEnd < 0)
                                {
                                    summaryEnd = ret.Length;
                                }
                            }
                            else
                            {
                                options.FormatBody(ParseBody(xml, xml.Name, options));
                            }
                            break;

                        // skip <example>-nodes
                        case "example":
                            xml.Skip();
                            xml.Skip();
                            break;

                        case "exception":
                            exceptionCount++;
                            if (options.SmallText)
                            {
                                exceptions.Append("<small>");
                            }
                            exceptions.Append("<b>");
                            exceptions.Append(EscapeText(GetCref(xml["cref"])));
                            exceptions.Append(": ");
                            exceptions.Append("</b>");
                            if (options.SmallText)
                            {
                                exceptions.Append("</small>");
                            }

                            exceptions.AppendLine(options.FormatBody(ParseBody(xml, xml.Name, options)));
                            break;

                        case "returns":
                            if (string.IsNullOrEmpty(options.HighlightParameter))
                            {
                                ret.AppendLine(options.FormatHeading("Returns:"));
                                ret.Append(options.FormatBody(ParseBody(xml, xml.Name, options)));
                            }
                            else
                            {
                                options.FormatBody(ParseBody(xml, xml.Name, options));
                            }
                            break;

                        case "param":
                            paramCount++;
                            string paramName = xml["name"].Trim();
                            parameters.Append("<i>");
                            if (options.HighlightParameter == paramName)
                            {
                                parameters.Append("<b>");
                            }
                            if (options.SmallText)
                            {
                                parameters.Append("<small>");
                            }
                            parameters.Append(EscapeText(paramName));
                            if (options.SmallText)
                            {
                                parameters.Append("</small>");
                            }
                            if (options.HighlightParameter == paramName)
                            {
                                parameters.Append("</b>");
                            }
                            parameters.Append(":</i> ");
                            parameters.Append(options.FormatBody(ParseBody(xml, xml.Name, options)));
                            break;

                        case "value":
                            ret.AppendLine(options.FormatHeading("Value:"));
                            ret.AppendLine(options.FormatBody(ParseBody(xml, xml.Name, options)));
                            break;

                        case "seealso":
                            if (string.IsNullOrEmpty(options.HighlightParameter))
                            {
                                ret.Append(options.FormatHeading("See also:"));
                                ret.Append(" " + EscapeText(GetCref(xml["cref"]) + xml["langword"]));
                            }
                            break;
                        }
                    }
                } while (xml.Read());
            } catch (Exception ex) {
                MonoDevelop.Core.LoggingService.LogError(ex.ToString());
                return(EscapeText(doc));
            }
            if (IsEmptyDocumentation(ret.ToString()))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(options.HighlightParameter) && exceptionCount > 0)
            {
                ret.Append(exceptions.ToString());
            }

            string result = ret.ToString();

            if (summaryEnd < 0)
            {
                summaryEnd = result.Length;
            }
            if (paramCount > 0)
            {
                result = result.Insert(summaryEnd, parameters.ToString());
            }

            result = result.Trim();
            if (result.EndsWith(Environment.NewLine + "</small>"))
            {
                result = result.Substring(0, result.Length - (Environment.NewLine + "</small>").Length) + "</small>";
            }
            return(result);
        }
예제 #4
0
        static string ParseBody(IEntity member, XmlTextReader xml, string endTagName, DocumentationFormatOptions options)
        {
            StringBuilder       result        = new StringBuilder();
            bool                wasWhiteSpace = true;
            bool                appendSpace   = false;
            ITypeResolveContext ctx           = member.Compilation.TypeResolveContext;

            while (xml.Read())
            {
                switch (xml.NodeType)
                {
                case XmlNodeType.EndElement:
                    if (xml.Name == endTagName)
                    {
                        goto end;
                    }
                    break;

                case XmlNodeType.Element:
                    switch (xml.Name.ToLower())
                    {
                    case "para":
                        result.AppendLine(ParseBody(member, xml, xml.Name, options));
                        wasWhiteSpace = true;
                        break;

                    case "see":
                        if (!wasWhiteSpace)
                        {
                            result.Append(' ');
                            wasWhiteSpace = true;
                        }
                        result.Append("<i>");
                        string name = (GetCref(ctx, xml ["cref"]) + xml ["langword"]).Trim();
                        if (options.Ambience != null)
                        {
                            name = options.Ambience.GetIntrinsicTypeName(name);
                        }
                        result.Append(EscapeText(name));
                        result.Append("</i>");
                        wasWhiteSpace = false;
                        appendSpace   = true;
                        break;

                    case "paramref":
                        if (!wasWhiteSpace)
                        {
                            result.Append(' ');
                            wasWhiteSpace = true;
                        }
                        result.Append("<i>");
                        result.Append(EscapeText(xml ["name"].Trim()));
                        result.Append("</i>");
                        appendSpace   = true;
                        wasWhiteSpace = false;
                        break;
                    }
                    break;

                case XmlNodeType.Text:
                    if (IsEmptyDocumentation(xml.Value))
                    {
                        break;
                    }
                    foreach (char ch in xml.Value)
                    {
                        if (!Char.IsWhiteSpace(ch) && appendSpace)
                        {
                            result.Append(' ');
                            appendSpace = false;
                        }
                        if (Char.IsWhiteSpace(ch) || ch == '\n' || ch == '\r')
                        {
                            if (!wasWhiteSpace)
                            {
                                result.Append(' ');
                                wasWhiteSpace = true;
                            }
                            continue;
                        }
                        wasWhiteSpace = false;
                        result.Append(EscapeText(ch.ToString()));
                    }
                    break;
                }
            }
end:
            return(result.ToString().Trim());
        }
예제 #5
0
        static string ParseBody(XmlTextReader xml, string endTagName, DocumentationFormatOptions options)
        {
            StringBuilder result = new StringBuilder();

            while (xml.Read())
            {
                switch (xml.NodeType)
                {
                case XmlNodeType.EndElement:
                    if (xml.Name == endTagName)
                    {
                        return(result.ToString());
                    }
                    break;

                case XmlNodeType.Element:
                    switch (xml.Name.ToLower())
                    {
                    case "para":
                        result.AppendLine(ParseBody(xml, xml.Name, options));
                        break;

                    case "see":
                        result.Append(' ');
                        result.Append("<i>");
                        string name = (GetCref(xml["cref"]) + xml["langword"]).Trim();
                        if (options.Ambience != null)
                        {
                            name = options.Ambience.ConvertTypeName(name);
                        }
                        result.Append(EscapeText(name));
                        result.Append("</i>");
                        break;

                    case "paramref":
                        result.Append(' ');
                        result.Append("<i>");
                        result.Append(EscapeText(xml["name"].Trim()));
                        result.Append("</i>");
                        break;
                    }
                    break;

                case XmlNodeType.Text:
                    StringBuilder textBuilder   = new StringBuilder();
                    bool          wasWhiteSpace = true;
                    if (IsEmptyDocumentation(xml.Value))
                    {
                        break;
                    }
                    foreach (char ch in xml.Value)
                    {
                        if (Char.IsWhiteSpace(ch))
                        {
                            if (!wasWhiteSpace)
                            {
                                textBuilder.Append(' ');
                            }
                            wasWhiteSpace = true;
                            continue;
                        }
                        wasWhiteSpace = false;
                        textBuilder.Append(ch);
                    }
                    string text = BreakLines(EscapeText(textBuilder.ToString()), options.MaxLineLength);
                    text = text.Trim();
                    if (text.Length > 0 && char.IsLetter(text[0]))
                    {
                        result.Append(" ");
                    }
                    result.Append(text.Trim());
                    break;
                }
            }
            return(result.ToString());
        }
예제 #6
0
		public static string GetDocumentationMarkup (ISymbol member, string doc, DocumentationFormatOptions options)
		{
			if (string.IsNullOrEmpty (doc))
				return null;
			System.IO.StringReader reader = new System.IO.StringReader ("<docroot>" + doc + "</docroot>");
			XmlTextReader xml = new XmlTextReader (reader);
			StringBuilder ret = new StringBuilder (70);
			StringBuilder parameterBuilder = new StringBuilder ();
			StringBuilder exceptions = new StringBuilder ();
			exceptions.AppendLine (options.FormatHeading (GettextCatalog.GetString ("Exceptions:")));
			//		ret.Append ("<small>");
			int paramCount = 0, exceptionCount = 0, summaryEnd = -1;
			try {
				xml.Read ();
				do {
					if (xml.NodeType == XmlNodeType.Element) {
						switch (xml.Name.ToLower ()) {
						case "para":
							ret.Append (options.FormatBody (ParseBody (member, xml, xml.Name, options)));
							if (summaryEnd < 0)
								summaryEnd = ret.Length;
							break;
						case "summary":
							var summary = options.FormatBody (ParseBody (member, xml, xml.Name, options));
							if (!IsEmptyDocumentation (summary)) {
								//							ret.AppendLine (GetHeading ("Summary:", options));
								ret.Append (summary);
								if (summaryEnd < 0)
									summaryEnd = ret.Length;
							}
							break;
						case "remarks":
							if (string.IsNullOrEmpty (options.HighlightParameter)) {
								ret.AppendLine (options.FormatHeading (GettextCatalog.GetString ("Remarks:")));
								ret.Append (options.FormatBody (ParseBody (member, xml, xml.Name, options)));
								if (summaryEnd < 0)
									summaryEnd = ret.Length;
							} else {
								options.FormatBody (ParseBody (member, xml, xml.Name, options));
							}
							break;
						// skip <example>-nodes
						case "example":
							xml.Skip ();
							xml.Skip ();
							break;
						case "exception":
							exceptionCount++;
							if (options.SmallText)
								exceptions.Append ("<small>");
							exceptions.Append ("<b>");
							exceptions.Append (EscapeText (xml ["cref"]));
							exceptions.Append (": ");
							exceptions.Append ("</b>");
							if (options.SmallText)
								exceptions.Append ("</small>");
							
							exceptions.AppendLine (options.FormatBody (ParseBody (member, xml, xml.Name, options)));
							break;
						case "returns":
							if (string.IsNullOrEmpty (options.HighlightParameter)) {
								ret.AppendLine (options.FormatHeading (GettextCatalog.GetString ("Returns:")));
								ret.Append (options.FormatBody (ParseBody (member, xml, xml.Name, options)));
							} else {
								options.FormatBody (ParseBody (member, xml, xml.Name, options));
							}
							break;
						case "param":
							string paramName = xml.GetAttribute ("name") != null ? xml ["name"].Trim () : "";
								
							var body = options.FormatBody (ParseBody (member, xml, xml.Name, options));
							if (!IsEmptyDocumentation (body)) {
								paramCount++;
								parameterBuilder.Append ("<i>");
								if (options.HighlightParameter == paramName)
									parameterBuilder.Append ("<b>");
								if (options.SmallText)
									parameterBuilder.Append ("<small>");
								parameterBuilder.Append (EscapeText (paramName));
								if (options.SmallText)
									parameterBuilder.Append ("</small>");
								if (options.HighlightParameter == paramName)
									parameterBuilder.Append ("</b>");
								parameterBuilder.Append (":</i> ");
								parameterBuilder.Append (body);
							} else {
								return null;
							}
							break;
						case "value":
							ret.AppendLine (options.FormatHeading (GettextCatalog.GetString ("Value:")));
							ret.AppendLine (options.FormatBody (ParseBody (member, xml, xml.Name, options)));
							break;
						case "seealso":
							if (string.IsNullOrEmpty (options.HighlightParameter)) {
								ret.Append (options.FormatHeading (GettextCatalog.GetString ("See also:")));
								ret.Append (" " + EscapeText (xml ["cref"] + xml ["langword"]));
							}
							break;
						}
					}
				} while (xml.Read ());
			
			} catch (Exception ex) {
				MonoDevelop.Core.LoggingService.LogError (ex.ToString ());
				return EscapeText (doc);
			}

			if (IsEmptyDocumentation (ret.ToString ()) && IsEmptyDocumentation (parameterBuilder.ToString ()))
				return EscapeText (doc);
			if (string.IsNullOrEmpty (options.HighlightParameter) && exceptionCount > 0)
				ret.Append (exceptions.ToString ());
			
			string result = ret.ToString ();
			if (summaryEnd < 0)
				summaryEnd = result.Length;
			if (paramCount > 0) {
				var paramSb = new StringBuilder ();
				if (result.Length > 0)
					paramSb.AppendLine ();/*
				paramSb.Append ("<small>");
				paramSb.AppendLine (options.FormatHeading (GettextCatalog.GetPluralString ("Parameter:", "Parameters:", paramCount)));
				paramSb.Append ("</small>");*/
				paramSb.Append (parameterBuilder.ToString ());
				result = result.Insert (summaryEnd, paramSb.ToString ());
			}
			result = result.Trim ();
			if (result.EndsWith (Environment.NewLine + "</small>"))
				result = result.Substring (0, result.Length - (Environment.NewLine + "</small>").Length) + "</small>";
			return result;
		}
예제 #7
0
		static string ParseBody (ISymbol member, XmlTextReader xml, string endTagName, DocumentationFormatOptions options)
		{
			StringBuilder result = new StringBuilder (); 
			bool wasWhiteSpace = true;
			bool appendSpace = false;
			string listType = "bullet";
			int listItem = 1;
			//ITypeResolveContext ctx = member.Compilation.TypeResolveContext;
			while (xml.Read ()) {
				switch (xml.NodeType) {
				case XmlNodeType.EndElement:
					if (xml.Name == endTagName) 
						goto end;
					break;
				case XmlNodeType.Element:
					switch (xml.Name.ToLower ()) {
					case "para":
						result.AppendLine (ParseBody (member, xml, xml.Name, options));
						wasWhiteSpace = true;
						break;
					case "list":
						listType = xml ["type"] ?? listType;
						listItem = 1;
						result.AppendLine ();
						result.AppendLine ();
						break;
					case "term": {
						string inner = "<root>" + xml.ReadInnerXml () + "</root>";
						result.Append ("<i>" + ParseBody (member, new XmlTextReader (new StringReader (inner)), "root", options) + " </i>");
						break;
					}
					case "description": {
						string inner = "<root>" + xml.ReadInnerXml () + "</root>";
						result.Append (ParseBody (member, new XmlTextReader (new StringReader (inner)), "root", options));
						break;
					}
					case "listheader":  {
					string inner = "<root>" + xml.ReadInnerXml () + "</root>";
						string prefix;
						switch (listType) {
						case "number":
							prefix = "     ";
							break;
						case "table":
							prefix = "    ";
							break;
						default: // bullet;
							prefix = "    ";
							break;
						}
						result.AppendLine (prefix + ParseBody (member, new XmlTextReader (new StringReader (inner)), "root", options));
						break;
					}
					case "item": {
						string inner = "<root>" + xml.ReadInnerXml () + "</root>";
							string prefix;
							switch (listType) {
							case "number":
								prefix = string.Format ("  {0:##}. ", listItem++);
								break;
							case "table":
								prefix = "    ";
								break;
							default: // bullet;
								prefix = "  \u2022 ";
								break;
							}
							result.AppendLine (prefix + ParseBody (member, new XmlTextReader (new StringReader (inner)), "root", options));
						break;
					}
					case "see":
						if (!wasWhiteSpace) {
							result.Append (' ');
							wasWhiteSpace = true;
						}
						result.Append ("<i>");
						string name = (xml ["cref"] + xml ["langword"]).Trim ();
						// if (options.Ambience != null)
						// 	name = options.Ambience.GetIntrinsicTypeName (name);
						result.Append (EscapeText (name));
						result.Append ("</i>");
						wasWhiteSpace = false;
						appendSpace = true;
						break;
					case "paramref":
						if (!wasWhiteSpace) {
							result.Append (' ');
							wasWhiteSpace = true;
						}
						result.Append ("<i>");
						result.Append (EscapeText (xml ["name"].Trim ()));
						result.Append ("</i>");
						appendSpace = true;
						wasWhiteSpace = false;
						break;
					}
					break;
				case XmlNodeType.Text:
					if (IsEmptyDocumentation (xml.Value))
						break;
					foreach (char ch in xml.Value) {
						if (!Char.IsWhiteSpace (ch) && appendSpace) {
							result.Append (' ');
							appendSpace = false;
						}
						if (Char.IsWhiteSpace (ch) || ch == '\n' || ch == '\r') {
							if (!wasWhiteSpace) {
								result.Append (' ');
								wasWhiteSpace = true;
							}
							continue;
						}
						wasWhiteSpace = false;
						result.Append (EscapeText (ch.ToString ()));
					}
					break;
				}
			}
		end:
			return result.ToString ().Trim ();
		}
예제 #8
0
 static string ParseBody(IEntity member, XmlTextReader xml, string endTagName, DocumentationFormatOptions options)
 {
     StringBuilder result = new StringBuilder ();
     bool wasWhiteSpace = true;
     bool appendSpace = false;
     ITypeResolveContext ctx = member.Compilation.TypeResolveContext;
     while (xml.Read ()) {
         switch (xml.NodeType) {
         case XmlNodeType.EndElement:
             if (xml.Name == endTagName)
                 goto end;
             break;
         case XmlNodeType.Element:
             switch (xml.Name.ToLower ()) {
             case "para":
                 result.AppendLine (ParseBody (member, xml, xml.Name, options));
                 wasWhiteSpace = true;
                 break;
             case "see":
                 if (!wasWhiteSpace) {
                     result.Append (' ');
                     wasWhiteSpace = true;
                 }
                 result.Append ("<i>");
                 string name = (GetCref (ctx, xml ["cref"]) + xml ["langword"]).Trim ();
                 if (options.Ambience != null)
                     name = options.Ambience.GetIntrinsicTypeName (name);
                 result.Append (EscapeText (name));
                 result.Append ("</i>");
                 wasWhiteSpace = false;
                 appendSpace = true;
                 break;
             case "paramref":
                 if (!wasWhiteSpace) {
                     result.Append (' ');
                     wasWhiteSpace = true;
                 }
                 result.Append ("<i>");
                 result.Append (EscapeText (xml ["name"].Trim ()));
                 result.Append ("</i>");
                 appendSpace = true;
                 wasWhiteSpace = false;
                 break;
             }
             break;
         case XmlNodeType.Text:
             if (IsEmptyDocumentation (xml.Value))
                 break;
             foreach (char ch in xml.Value) {
                 if (!Char.IsWhiteSpace (ch) && appendSpace) {
                     result.Append (' ');
                     appendSpace = false;
                 }
                 if (Char.IsWhiteSpace (ch) || ch == '\n' || ch == '\r') {
                     if (!wasWhiteSpace) {
                         result.Append (' ');
                         wasWhiteSpace = true;
                     }
                     continue;
                 }
                 wasWhiteSpace = false;
                 result.Append (EscapeText (ch.ToString ()));
             }
             break;
         }
     }
     end:
     return result.ToString ().Trim ();
 }
예제 #9
0
		static string ParseBody (XmlTextReader xml, string endTagName, DocumentationFormatOptions options)
		{
			StringBuilder result = new StringBuilder (); 
			while (xml.Read ()) {
				switch (xml.NodeType) {
				case XmlNodeType.EndElement:
					if (xml.Name == endTagName) 
						return result.ToString ();
					break;
				case XmlNodeType.Element:
					switch (xml.Name.ToLower ()) {
						case "para":
							result.AppendLine (ParseBody (xml, xml.Name, options));
							break;
						case "see":
							result.Append (' ');
							result.Append ("<i>");
							string name = (GetCref (xml["cref"]) + xml["langword"]).Trim ();
							if (options.Ambience != null)
								name = options.Ambience.ConvertTypeName (name);
							result.Append (EscapeText (name));
							result.Append ("</i>");
							break;
						case "paramref":
							result.Append (' ');
							result.Append ("<i>");
							result.Append (EscapeText (xml["name"].Trim ()));
							result.Append ("</i>");
							break;
					}
					break;
				case XmlNodeType.Text:
					StringBuilder textBuilder = new StringBuilder ();
					bool wasWhiteSpace = true;
					if (IsEmptyDocumentation (xml.Value))
						break;
					foreach (char ch in xml.Value) {
						if (Char.IsWhiteSpace (ch)) {
							if (!wasWhiteSpace)
								textBuilder.Append (' ');
							wasWhiteSpace = true;
							continue;
						}
						wasWhiteSpace = false;
						textBuilder.Append (ch);
					}
					string text = BreakLines (EscapeText (textBuilder.ToString ()), options.MaxLineLength);
					text = text.Trim ();
					if (text.Length > 0 && char.IsLetter (text[0]))
						result.Append (" ");
					result.Append (text.Trim ());
					break;
				}
			}
			return result.ToString ();
		}