Mercurial > projects > ddmd
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