diff dmd/ddoc/Sections.d @ 149:78bf0fe43974

merge
author Trass3r
date Tue, 14 Sep 2010 15:46:50 +0200
parents dmd/Section.d@e28b18c23469 dmd/Section.d@786ea1839396
children 560eaedcb7a2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmd/ddoc/Sections.d	Tue Sep 14 15:46:50 2010 +0200
@@ -0,0 +1,192 @@
+module dmd.ddoc.Sections;
+
+import dmd.common;
+import dmd.ddoc.DocComment;
+import dmd.Array;
+import dmd.Scope;
+import dmd.Dsymbol;
+import dmd.OutBuffer;
+
+//!
+alias Vector!Section Sections;
+
+//!
+class Section
+{
+    string name;
+    string body_;
+
+    int nooutput;
+
+	void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
+	{
+		if (namelen)
+		{
+			static string[] table =
+			{	   "AUTHORS", "BUGS", "COPYRIGHT", "DATE",
+					"DEPRECATED", "EXAMPLES", "HISTORY", "LICENSE",
+					"RETURNS", "SEE_ALSO", "STANDARDS", "THROWS",
+					"VERSION" };
+     
+			for (int i = 0; i < table.length; i++)
+			{
+				if (icmp(table[i], name, namelen) == 0)
+				{
+					buf.printf("$(DDOC_%s ", table[i]);
+					goto L1;
+				}
+			}
+
+			buf.writestring("$(DDOC_SECTION ");
+				// Replace _ characters with spaces
+				buf.writestring("$(DDOC_SECTION_H ");
+				size_t o = buf.offset;
+				for (size_t u = 0; u < namelen; u++)
+				{
+					char c = name[u];
+					buf.writeByte((c == '_') ? ' ' : c);
+				}
+				escapeStrayParenthesis(buf, o, s.loc);
+				buf.writestring(":)\n");
+		}
+		else
+		{
+			buf.writestring("$(DDOC_DESCRIPTION ");
+		}
+	  L1:
+		unsigned o = buf.offset;
+		buf.write(body_, bodylen);
+		escapeStrayParenthesis(buf, o, s.loc);
+		highlightText(sc, s, buf, o);
+		buf.writestring(")\n");
+	}
+}
+
+//!
+class ParamSection : Section
+{
+	override void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
+	{
+		ubyte*p = body_;
+		unsigned len = bodylen;
+		ubyte*pend = p + len;
+
+		ubyte*tempstart;
+		unsigned templen;
+
+		ubyte*namestart;
+		unsigned namelen = 0;	   // !=0 if line continuation
+
+		ubyte*textstart;
+		unsigned textlen;
+
+		unsigned o;
+		Parameter *arg;
+
+		buf.writestring("$(DDOC_PARAMS \n");
+		while (p < pend)
+		{
+			// Skip to start of macro
+			while (1)
+			{
+				switch (*p)
+				{
+					case ' ':
+					case '\t':
+						p++;
+						continue;
+
+					case '\n':
+						p++;
+						goto Lcont;
+
+					default:
+						if (isIdStart(p))
+							break;
+						if (namelen)
+							goto Ltext;			 // continuation of prev macro
+						goto Lskipline;
+				}
+				break;
+			}
+			tempstart = p;
+
+			while (isIdTail(p))
+				p += utfStride(p);
+			templen = p - tempstart;
+
+			while (*p == ' ' || *p == '\t')
+				p++;
+
+			if (*p != '=')
+			{   if (namelen)
+					goto Ltext;			 // continuation of prev macro
+				goto Lskipline;
+			}
+			p++;
+
+			if (namelen)
+			{   // Output existing param
+
+			L1:
+				//printf("param '%.*s' = '%.*s'\n", namelen, namestart, textlen, textstart);
+				HdrGenState hgs;
+				buf.writestring("$(DDOC_PARAM_ROW ");
+					buf.writestring("$(DDOC_PARAM_ID ");
+						o = buf.offset;
+						arg = isFunctionParameter(s, namestart, namelen);
+						if (arg && arg.type && arg.ident)
+							arg.type.toCBuffer(buf, arg.ident, &hgs);
+						else
+							buf.write(namestart, namelen);
+						escapeStrayParenthesis(buf, o, s.loc);
+						highlightCode(sc, s, buf, o);
+					buf.writestring(")\n");
+
+					buf.writestring("$(DDOC_PARAM_DESC ");
+						o = buf.offset;
+						buf.write(textstart, textlen);
+						escapeStrayParenthesis(buf, o, s.loc);
+						highlightText(sc, s, buf, o);
+					buf.writestring(")");
+				buf.writestring(")\n");
+				namelen = 0;
+				if (p >= pend)
+					break;
+			}
+
+			namestart = tempstart;
+			namelen = templen;
+
+			while (*p == ' ' || *p == '\t')
+				p++;
+			textstart = p;
+
+		  Ltext:
+			while (*p != '\n')
+				p++;
+			textlen = p - textstart;
+			p++;
+
+		 Lcont:
+			continue;
+
+		 Lskipline:
+			// Ignore this line
+			while (*p++ != '\n') {}
+		}
+		if (namelen)
+			goto L1;				// write out last one
+		buf.writestring(")\n");
+	}
+}
+
+//!
+class MacroSection : Section
+{
+	override void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
+	{
+		// writef("MacroSection.write()\n");
+		DocComment.parseMacros(dc.pescapetable, dc.pmacrotable, body_, bodylen);
+	}
+}
\ No newline at end of file