diff dmd/ddoc/Sections.d @ 106:786ea1839396

ddoc branch
author Trass3r
date Tue, 31 Aug 2010 18:02:48 +0200
parents e414dd80ebfa
children 78bf0fe43974
line wrap: on
line diff
--- a/dmd/ddoc/Sections.d	Tue Aug 31 17:35:30 2010 +0200
+++ b/dmd/ddoc/Sections.d	Tue Aug 31 18:02:48 2010 +0200
@@ -1,20 +1,191 @@
-module dmd.Section;
+module dmd.ddoc.Sections;
 
-import dmd.DocComment;
+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 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;
+				}
+			}
 
-    string body_;
+			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;
 
-    int nooutput;
+					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");
 
-    void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
+					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)
 	{
-		assert(false);
+		// writef("MacroSection.write()\n");
+		DocComment.parseMacros(dc.pescapetable, dc.pmacrotable, body_, bodylen);
 	}
 }
\ No newline at end of file