106
|
1 module dmd.ddoc.Sections;
|
0
|
2
|
114
|
3 import dmd.common;
|
106
|
4 import dmd.ddoc.DocComment;
|
|
5 import dmd.Array;
|
0
|
6 import dmd.Scope;
|
|
7 import dmd.Dsymbol;
|
|
8 import dmd.OutBuffer;
|
|
9
|
106
|
10 //!
|
|
11 alias Vector!Section Sections;
|
|
12
|
|
13 //!
|
0
|
14 class Section
|
|
15 {
|
149
|
16 string name;
|
|
17 string body_;
|
106
|
18
|
0
|
19 int nooutput;
|
106
|
20
|
|
21 void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
|
|
22 {
|
|
23 if (namelen)
|
|
24 {
|
|
25 static string[] table =
|
|
26 { "AUTHORS", "BUGS", "COPYRIGHT", "DATE",
|
|
27 "DEPRECATED", "EXAMPLES", "HISTORY", "LICENSE",
|
|
28 "RETURNS", "SEE_ALSO", "STANDARDS", "THROWS",
|
|
29 "VERSION" };
|
149
|
30
|
106
|
31 for (int i = 0; i < table.length; i++)
|
|
32 {
|
|
33 if (icmp(table[i], name, namelen) == 0)
|
|
34 {
|
|
35 buf.printf("$(DDOC_%s ", table[i]);
|
|
36 goto L1;
|
|
37 }
|
|
38 }
|
0
|
39
|
106
|
40 buf.writestring("$(DDOC_SECTION ");
|
|
41 // Replace _ characters with spaces
|
|
42 buf.writestring("$(DDOC_SECTION_H ");
|
|
43 size_t o = buf.offset;
|
|
44 for (size_t u = 0; u < namelen; u++)
|
|
45 {
|
|
46 char c = name[u];
|
|
47 buf.writeByte((c == '_') ? ' ' : c);
|
|
48 }
|
|
49 escapeStrayParenthesis(buf, o, s.loc);
|
|
50 buf.writestring(":)\n");
|
|
51 }
|
|
52 else
|
|
53 {
|
|
54 buf.writestring("$(DDOC_DESCRIPTION ");
|
|
55 }
|
|
56 L1:
|
|
57 unsigned o = buf.offset;
|
|
58 buf.write(body_, bodylen);
|
|
59 escapeStrayParenthesis(buf, o, s.loc);
|
|
60 highlightText(sc, s, buf, o);
|
|
61 buf.writestring(")\n");
|
|
62 }
|
|
63 }
|
|
64
|
|
65 //!
|
|
66 class ParamSection : Section
|
|
67 {
|
|
68 override void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
|
|
69 {
|
|
70 ubyte*p = body_;
|
|
71 unsigned len = bodylen;
|
|
72 ubyte*pend = p + len;
|
|
73
|
|
74 ubyte*tempstart;
|
|
75 unsigned templen;
|
|
76
|
|
77 ubyte*namestart;
|
|
78 unsigned namelen = 0; // !=0 if line continuation
|
|
79
|
|
80 ubyte*textstart;
|
|
81 unsigned textlen;
|
|
82
|
|
83 unsigned o;
|
|
84 Parameter *arg;
|
|
85
|
|
86 buf.writestring("$(DDOC_PARAMS \n");
|
|
87 while (p < pend)
|
|
88 {
|
|
89 // Skip to start of macro
|
|
90 while (1)
|
|
91 {
|
|
92 switch (*p)
|
|
93 {
|
|
94 case ' ':
|
|
95 case '\t':
|
|
96 p++;
|
|
97 continue;
|
|
98
|
|
99 case '\n':
|
|
100 p++;
|
|
101 goto Lcont;
|
0
|
102
|
106
|
103 default:
|
|
104 if (isIdStart(p))
|
|
105 break;
|
|
106 if (namelen)
|
|
107 goto Ltext; // continuation of prev macro
|
|
108 goto Lskipline;
|
|
109 }
|
|
110 break;
|
|
111 }
|
|
112 tempstart = p;
|
|
113
|
|
114 while (isIdTail(p))
|
|
115 p += utfStride(p);
|
|
116 templen = p - tempstart;
|
|
117
|
|
118 while (*p == ' ' || *p == '\t')
|
|
119 p++;
|
|
120
|
|
121 if (*p != '=')
|
|
122 { if (namelen)
|
|
123 goto Ltext; // continuation of prev macro
|
|
124 goto Lskipline;
|
|
125 }
|
|
126 p++;
|
|
127
|
|
128 if (namelen)
|
|
129 { // Output existing param
|
|
130
|
|
131 L1:
|
|
132 //printf("param '%.*s' = '%.*s'\n", namelen, namestart, textlen, textstart);
|
|
133 HdrGenState hgs;
|
|
134 buf.writestring("$(DDOC_PARAM_ROW ");
|
|
135 buf.writestring("$(DDOC_PARAM_ID ");
|
|
136 o = buf.offset;
|
|
137 arg = isFunctionParameter(s, namestart, namelen);
|
|
138 if (arg && arg.type && arg.ident)
|
|
139 arg.type.toCBuffer(buf, arg.ident, &hgs);
|
|
140 else
|
|
141 buf.write(namestart, namelen);
|
|
142 escapeStrayParenthesis(buf, o, s.loc);
|
|
143 highlightCode(sc, s, buf, o);
|
|
144 buf.writestring(")\n");
|
0
|
145
|
106
|
146 buf.writestring("$(DDOC_PARAM_DESC ");
|
|
147 o = buf.offset;
|
|
148 buf.write(textstart, textlen);
|
|
149 escapeStrayParenthesis(buf, o, s.loc);
|
|
150 highlightText(sc, s, buf, o);
|
|
151 buf.writestring(")");
|
|
152 buf.writestring(")\n");
|
|
153 namelen = 0;
|
|
154 if (p >= pend)
|
|
155 break;
|
|
156 }
|
|
157
|
|
158 namestart = tempstart;
|
|
159 namelen = templen;
|
|
160
|
|
161 while (*p == ' ' || *p == '\t')
|
|
162 p++;
|
|
163 textstart = p;
|
|
164
|
|
165 Ltext:
|
|
166 while (*p != '\n')
|
|
167 p++;
|
|
168 textlen = p - textstart;
|
|
169 p++;
|
|
170
|
|
171 Lcont:
|
|
172 continue;
|
|
173
|
|
174 Lskipline:
|
|
175 // Ignore this line
|
|
176 while (*p++ != '\n') {}
|
|
177 }
|
|
178 if (namelen)
|
|
179 goto L1; // write out last one
|
|
180 buf.writestring(")\n");
|
|
181 }
|
|
182 }
|
|
183
|
|
184 //!
|
|
185 class MacroSection : Section
|
|
186 {
|
|
187 override void write(DocComment dc, Scope sc, Dsymbol s, OutBuffer buf)
|
0
|
188 {
|
106
|
189 // writef("MacroSection.write()\n");
|
|
190 DocComment.parseMacros(dc.pescapetable, dc.pmacrotable, body_, bodylen);
|
0
|
191 }
|
|
192 } |