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