Mercurial > projects > ddmd
comparison dmd/ddoc/DocComment.d @ 106:786ea1839396
ddoc branch
author | Trass3r |
---|---|
date | Tue, 31 Aug 2010 18:02:48 +0200 |
parents | |
children | 4092a614a9f3 |
comparison
equal
deleted
inserted
replaced
105:e414dd80ebfa | 106:786ea1839396 |
---|---|
1 module dmd.ddoc.DocComment; | |
2 | |
3 import dmd.ddoc.Sections; | |
4 import dmd.Array; | |
5 import dmd.Macro; | |
6 import dmd.Escape; | |
7 import dmd.Scope; | |
8 import dmd.Dsymbol; | |
9 import dmd.OutBuffer; | |
10 | |
11 //! | |
12 class DocComment | |
13 { | |
14 Sections sections; // Section*[] | |
15 | |
16 Section summary; | |
17 Section copyright; | |
18 Section macros; | |
19 Macro** pmacrotable; | |
20 Escape** pescapetable; | |
21 | |
22 this() | |
23 { | |
24 // TODO: memset(this, 0, sizeof(DocComment)); | |
25 } | |
26 | |
27 static DocComment parse(Scope sc, Dsymbol s, string comment) | |
28 { | |
29 unsigned idlen; | |
30 | |
31 //printf("parse(%s): '%s'\n", s.toChars(), comment); | |
32 if (sc.lastdc && isDitto(comment)) | |
33 return null; | |
34 | |
35 DocComment dc = new DocComment(); | |
36 if (!comment) | |
37 return dc; | |
38 | |
39 dc.parseSections(comment); | |
40 | |
41 foreach (Section s; dc.sections) | |
42 { | |
43 if (icmp("copyright", s.name, s.namelen) == 0) | |
44 { | |
45 dc.copyright = s; | |
46 } | |
47 if (icmp("macros", s.name, s.namelen) == 0) | |
48 { | |
49 dc.macros = s; | |
50 } | |
51 } | |
52 | |
53 sc.lastdc = dc; | |
54 return dc; | |
55 } | |
56 | |
57 static void parseMacros(Escape** pescapetable, Macro** pmacrotable, ubyte* m, uint mlen) | |
58 { | |
59 assert(false); | |
60 } | |
61 | |
62 static void parseEscapes(Escape** pescapetable, ubyte* textstart, uint textlen) | |
63 { | |
64 assert(false); | |
65 } | |
66 /***************************************** | |
67 * Parse next paragraph out of *pcomment. | |
68 * Update *pcomment to point past paragraph. | |
69 * Returns null if no more paragraphs. | |
70 * If paragraph ends in 'identifier:', | |
71 * then (*pcomment)[0 .. idlen] is the identifier. | |
72 */ | |
73 void parseSections(ubyte* comment) | |
74 { | |
75 ubyte*p; | |
76 ubyte*pstart; | |
77 ubyte*pend; | |
78 ubyte*idstart; | |
79 unsigned idlen; | |
80 | |
81 ubyte*name = null; | |
82 unsigned namelen = 0; | |
83 | |
84 //printf("parseSections('%s')\n", comment); | |
85 p = comment; | |
86 while (*p) | |
87 { | |
88 p = skipwhitespace(p); | |
89 pstart = p; | |
90 | |
91 /* Find end of section, which is ended by one of: | |
92 * 'identifier:' (but not inside a code section) | |
93 * '\0' | |
94 */ | |
95 idlen = 0; | |
96 int inCode = 0; | |
97 while (1) | |
98 { | |
99 // Check for start/end of a code section | |
100 if (*p == '-') | |
101 { | |
102 int numdash = 0; | |
103 while (*p == '-') | |
104 { | |
105 ++numdash; | |
106 p++; | |
107 } | |
108 // BUG: handle UTF PS and LS too | |
109 if (!*p || *p == '\r' || *p == '\n' && numdash >= 3) | |
110 inCode ^= 1; | |
111 } | |
112 | |
113 if (!inCode && isIdStart(p)) | |
114 { | |
115 ubyte*q = p + utfStride(p); | |
116 while (isIdTail(q)) | |
117 q += utfStride(q); | |
118 if (*q == ':') // identifier: ends it | |
119 { | |
120 idlen = q - p; | |
121 idstart = p; | |
122 for (pend = p; pend > pstart; pend--) | |
123 { | |
124 if (pend[-1] == '\n') | |
125 break; | |
126 } | |
127 p = q + 1; | |
128 break; | |
129 } | |
130 } | |
131 while (1) | |
132 { | |
133 if (!*p) | |
134 { pend = p; | |
135 goto L1; | |
136 } | |
137 if (*p == '\n') | |
138 { p++; | |
139 if (*p == '\n' && !summary && !namelen) | |
140 { | |
141 pend = p; | |
142 p++; | |
143 goto L1; | |
144 } | |
145 break; | |
146 } | |
147 p++; | |
148 } | |
149 p = skipwhitespace(p); | |
150 } | |
151 L1: | |
152 | |
153 if (namelen || pstart < pend) | |
154 { | |
155 Section *s; | |
156 if (icmp("Params", name, namelen) == 0) | |
157 s = new ParamSection(); | |
158 else if (icmp("Macros", name, namelen) == 0) | |
159 s = new MacroSection(); | |
160 else | |
161 s = new Section(); | |
162 s.name = name; | |
163 s.namelen = namelen; | |
164 s.body_ = pstart; | |
165 s.bodylen = pend - pstart; | |
166 s.nooutput = 0; | |
167 | |
168 //printf("Section: '%.*s' = '%.*s'\n", s.namelen, s.name, s.body_len, s.body); | |
169 | |
170 sections.push(s); | |
171 | |
172 if (!summary && !namelen) | |
173 summary = s; | |
174 } | |
175 | |
176 if (idlen) | |
177 { name = idstart; | |
178 namelen = idlen; | |
179 } | |
180 else | |
181 { name = null; | |
182 namelen = 0; | |
183 if (!*p) | |
184 break; | |
185 } | |
186 } | |
187 } | |
188 | |
189 void writeSections(Scope sc, Dsymbol s, OutBuffer buf) | |
190 { | |
191 //printf("DocComment.writeSections()\n"); | |
192 if (sections.dim) | |
193 { | |
194 buf.writestring("$(DDOC_SECTIONS \n"); | |
195 for (int i = 0; i < sections.dim; i++) | |
196 { | |
197 Section sec = cast(Section)sections.data[i]; | |
198 | |
199 if (sec.nooutput) | |
200 continue; | |
201 //printf("Section: '%.*s' = '%.*s'\n", sec.namelen, sec.name, sec.bodylen, sec.body); | |
202 if (sec.namelen || i) | |
203 sec.write(this, sc, s, buf); | |
204 else | |
205 { | |
206 buf.writestring("$(DDOC_SUMMARY "); | |
207 unsigned o = buf.offset; | |
208 buf.write(sec.body_, sec.bodylen); | |
209 highlightText(sc, s, buf, o); | |
210 buf.writestring(")\n"); | |
211 } | |
212 } | |
213 buf.writestring(")\n"); | |
214 } | |
215 else | |
216 { | |
217 buf.writestring("$(DDOC_BLANKLINE)\n"); | |
218 } | |
219 } | |
220 } |