-
Notifications
You must be signed in to change notification settings - Fork 0
/
formatter-ada_like-html.bdy
317 lines (256 loc) · 9.63 KB
/
formatter-ada_like-html.bdy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
--------------------------------------------------------------------------
-- ASnip Source Code Decorator
-- Copyright (C) 2006, Georg Bauhaus
--
-- 1. Permission is hereby granted to use, copy, modify and/or distribute
-- this package, provided that:
-- * copyright notices are retained unchanged,
-- * any distribution of this package, whether modified or not,
-- includes this license text.
-- 2. Permission is hereby also granted to distribute binary programs which
-- depend on this package. If the binary program depends on a modified
-- version of this package, you are encouraged to publicly release the
-- modified version of this package.
--
-- THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT WARRANTY. ANY EXPRESS OR
-- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-- DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR
-- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-- DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THIS PACKAGE.
--------------------------------------------------------------------------
-- eMail: bauhaus@arcor.de
with Ada.Strings.Wide_Fixed, Ada.Strings.Wide_Maps;
package body Formatter.Ada_Like.HTML is
subtype L is ADA_LIKE_OBJ;
-- abbreviation
function default_image(t: L'class) return ASnip.STR;
-- replace every occurence of "<" with "<" and every occurence
-- of "&" with "&"
function default_prefix(t: L'class; ident: ASnip.STR) return ASnip.STR;
-- start a <span> of class `"ada-" & ident`
pragma inline(default_prefix);
function unknown_prefix(t: L'class; ident: ASnip.STR) return ASnip.STR;
-- start a <span> of class `"unk-" & ident`. (The token is not
-- enough Ada like, hence "unk-" in place of "ada-".)
pragma inline(unknown_prefix);
function default_suffix(t: L'class) return ASnip.STR;
-- end a <span>
pragma inline(default_suffix);
function default_image(t: L'class) return ASnip.STR is
-- &/ map (\s -> if s = "<" then "<" else s) token_text(t)
-- &/ map (\s -> if s = "&" then "&" else s) token_text(t)
use Ada.Strings.Wide_Fixed;
txt: constant ASnip.STR := token_text(t);
result: ASnip.STR(txt'first .. txt'last -- expensive, for testing
+ 3 * count(txt, "<")
+ 4 * count(txt, "&"));
k: POSITIVE := txt'first;
begin
for j in txt'range loop
if txt(j) = '<' then
workaround_27225:
-- Bug #27225 in GCC 4.1.0, slice not assigned properly
begin
--result(k .. k + 3) := "<";
result(k .. k + 3) := (1 => '&',
2 => 'l',
3 => 't',
4 => ';');
--result(k) := '&';
--result(k + 1) := 'l';
--result(k + 2) := 't';
--result(k + 3) := ';';
end workaround_27225;
k := k + 4;
elsif txt(j) = '&' then
result(k .. k + 4) := (1 => '&',
2 => 'a',
3 => 'm',
4 => 'p',
5 => ';');
k := k + 5;
else
result(k) := txt(j);
k := k + 1;
end if;
end loop;
pragma assert(txt'last < txt'first or else k = result'last + 1);
return result;
end default_image;
function default_prefix(t: L'class; ident: ASnip.STR) return ASnip.STR is
begin
return "<span class='ada-" & ident & "'>";
end;
function default_suffix(t: L'class) return ASnip.STR is
begin
return "</span>";
end;
function unknown_prefix(t: L'class; ident: ASnip.STR) return ASnip.STR is
begin
return "<span class='unk-" & ident & "'>";
end;
---
function prefix_of_attr(t: ATTR_TOKEN) return ASnip.STR is
begin
return default_prefix(t, "attr");
end;
function image_of_attr(t: ATTR_TOKEN) return ASnip.STR is
begin
return token_text(t);
end;
function suffix_of_attr(t: ATTR_TOKEN) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_chr(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_prefix(t, "chr");
end;
function image_of_chr(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_image(t);
end;
function suffix_of_chr(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_cmt(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
-- Hyphens placed before the `default_prefix`, so that they
-- will not be included in the CSS formatted <span> for the
-- comment text proper.
return "--" & default_prefix(t, "cmt");
end;
function image_of_cmt(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
-- this is where comment parsing could be done
return default_image(t);
end;
function suffix_of_cmt(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_del(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_prefix(t, "del");
end;
function image_of_del(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_image(t);
end;
function suffix_of_del(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_id(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
if is_known(t) then
return default_prefix(t, "id");
else
return unknown_prefix(t, "id");
end if;
end;
function image_of_id(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return token_text(t);
end;
function suffix_of_id(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_op(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_prefix(t, "op");
end;
function image_of_op(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_image(t);
end;
function suffix_of_op(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_num(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_prefix(t, "num");
end;
function image_of_num(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return token_text(t);
end;
function suffix_of_num(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
function prefix_of_res(t: RES_TOKEN) return ASnip.STR is
begin
return default_prefix(t, "res");
end;
function image_of_res(t: RES_TOKEN) return ASnip.STR is
begin
return token_text(t);
end;
function suffix_of_res(t: RES_TOKEN) return ASnip.STR is
begin
return default_suffix(t);
end;
package Blanks is
use Ada.Strings.Wide_Maps;
-- ----------------------------------------------------------------
-- Says what `ASnip.CHAR` is a blank so that prefix- and
-- suffix-functions need not wrap white separators in a <span>.
-- (This is important when line ends are signalled by more
-- than one (ASnip) separator, as is the case with CR+LF. HTML
-- software might render wrapped \r and then wrapped \n as two
-- line breaks.) Must be used constistently by prefix and suffix
-- functions, otherwise output will not be well-formed.
-- ----------------------------------------------------------------
function Is_In (Element: ASnip.CHAR; Set: WIDE_CHARACTER_SET)
return BOOLEAN
renames Ada.Strings.Wide_Maps.is_in;
White: constant WIDE_CHARACTER_SET :=
to_set(' ' & ASnip.CHAR'val(9)
& ASnip.CHAR'val(10)
& ASnip.CHAR'val(11)
& ASnip.CHAR'val(12)
& ASnip.CHAR'val(13));
end Blanks;
function prefix_of_sep(t: ADA_LIKE_OBJ) return ASnip.STR is
use Blanks;
begin
if is_in(source_text(t)(1), White) then
-- assume special blanks formatting is not necessary
return "";
elsif is_known(t) then
return default_prefix(t, "sep");
else
return unknown_prefix(t, "sep");
end if;
end prefix_of_sep;
function image_of_sep(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_image(t);
end;
function suffix_of_sep(t: ADA_LIKE_OBJ) return ASnip.STR is
use Blanks;
begin
if is_in(source_text(t)(1), White) then
return "";
else
return default_suffix(t);
end if;
end suffix_of_sep;
function prefix_of_strng(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_prefix(t, "strng");
end;
function image_of_strng(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_image(t);
end;
function suffix_of_strng(t: ADA_LIKE_OBJ) return ASnip.STR is
begin
return default_suffix(t);
end;
end Formatter.Ada_Like.HTML;