2 c42a1d3d 2006-02-21 devnull * Emit html. Keep track of tags so that user doesn't have to.
5 c42a1d3d 2006-02-21 devnull #include "a.h"
7 c42a1d3d 2006-02-21 devnull typedef struct Tag Tag;
8 c42a1d3d 2006-02-21 devnull struct Tag
10 c42a1d3d 2006-02-21 devnull Tag *next;
11 c42a1d3d 2006-02-21 devnull Rune *id;
12 c42a1d3d 2006-02-21 devnull Rune *open;
13 c42a1d3d 2006-02-21 devnull Rune *close;
16 c42a1d3d 2006-02-21 devnull Tag *tagstack;
17 c42a1d3d 2006-02-21 devnull Tag *tagset;
18 c42a1d3d 2006-02-21 devnull int hidingset;
20 c42a1d3d 2006-02-21 devnull static Rune*
21 c42a1d3d 2006-02-21 devnull closingtag(Rune *s)
24 c42a1d3d 2006-02-21 devnull Rune *p0, *p;
26 c42a1d3d 2006-02-21 devnull t = runemalloc(sizeof(Rune));
27 c42a1d3d 2006-02-21 devnull if(s == nil)
28 c42a1d3d 2006-02-21 devnull return t;
29 c42a1d3d 2006-02-21 devnull for(p=s; *p; p++){
30 c42a1d3d 2006-02-21 devnull if(*p == Ult){
32 c42a1d3d 2006-02-21 devnull if(*p == '/'){
33 c42a1d3d 2006-02-21 devnull while(*p && *p != Ugt)
35 c42a1d3d 2006-02-21 devnull goto close;
38 c42a1d3d 2006-02-21 devnull while(*p && !isspacerune(*p) && *p != Uspace && *p != Ugt)
40 c42a1d3d 2006-02-21 devnull t = runerealloc(t, 1+(p-p0)+2+runestrlen(t)+1);
41 c42a1d3d 2006-02-21 devnull runemove(t+(p-p0)+3, t, runestrlen(t)+1);
42 c42a1d3d 2006-02-21 devnull t[0] = Ult;
43 c42a1d3d 2006-02-21 devnull t[1] = '/';
44 c42a1d3d 2006-02-21 devnull runemove(t+2, p0, p-p0);
45 c42a1d3d 2006-02-21 devnull t[2+(p-p0)] = Ugt;
48 c42a1d3d 2006-02-21 devnull if(*p == Ugt && p>s && *(p-1) == '/'){
50 c42a1d3d 2006-02-21 devnull for(p0=t+1; *p0 && *p0 != Ult; p0++)
52 c42a1d3d 2006-02-21 devnull runemove(t, p0, runestrlen(p0)+1);
59 c42a1d3d 2006-02-21 devnull html(Rune *id, Rune *s)
61 c42a1d3d 2006-02-21 devnull Rune *es;
62 c42a1d3d 2006-02-21 devnull Tag *t, *tt, *next;
65 c42a1d3d 2006-02-21 devnull hideihtml(); /* br already did, but be paranoid */
66 c42a1d3d 2006-02-21 devnull for(t=tagstack; t; t=t->next){
67 c42a1d3d 2006-02-21 devnull if(runestrcmp(t->id, id) == 0){
68 c42a1d3d 2006-02-21 devnull for(tt=tagstack;; tt=next){
69 c42a1d3d 2006-02-21 devnull next = tt->next;
70 c42a1d3d 2006-02-21 devnull free(tt->id);
71 c42a1d3d 2006-02-21 devnull free(tt->open);
72 c42a1d3d 2006-02-21 devnull out(tt->close);
73 c42a1d3d 2006-02-21 devnull outrune('\n');
74 c42a1d3d 2006-02-21 devnull free(tt->close);
75 c42a1d3d 2006-02-21 devnull free(tt);
76 c42a1d3d 2006-02-21 devnull if(tt == t){
77 c42a1d3d 2006-02-21 devnull tagstack = next;
78 c42a1d3d 2006-02-21 devnull goto cleared;
85 c42a1d3d 2006-02-21 devnull if(s == nil || s[0] == 0)
88 c42a1d3d 2006-02-21 devnull outrune('\n');
89 c42a1d3d 2006-02-21 devnull es = closingtag(s);
90 c42a1d3d 2006-02-21 devnull if(es[0] == 0){
91 c42a1d3d 2006-02-21 devnull free(es);
94 c42a1d3d 2006-02-21 devnull if(runestrcmp(id, L("-")) == 0){
96 c42a1d3d 2006-02-21 devnull outrune('\n');
97 c42a1d3d 2006-02-21 devnull free(es);
100 c42a1d3d 2006-02-21 devnull t = emalloc(sizeof *t);
101 c42a1d3d 2006-02-21 devnull t->id = erunestrdup(id);
102 c42a1d3d 2006-02-21 devnull t->close = es;
103 c42a1d3d 2006-02-21 devnull t->next = tagstack;
104 c42a1d3d 2006-02-21 devnull tagstack = t;
108 c42a1d3d 2006-02-21 devnull closehtml(void)
110 c42a1d3d 2006-02-21 devnull Tag *t, *next;
113 c42a1d3d 2006-02-21 devnull hideihtml();
114 c42a1d3d 2006-02-21 devnull for(t=tagstack; t; t=next){
115 c42a1d3d 2006-02-21 devnull next = t->next;
116 c42a1d3d 2006-02-21 devnull out(t->close);
117 c42a1d3d 2006-02-21 devnull outrune('\n');
118 c42a1d3d 2006-02-21 devnull free(t->id);
119 c42a1d3d 2006-02-21 devnull free(t->close);
120 c42a1d3d 2006-02-21 devnull free(t);
124 c42a1d3d 2006-02-21 devnull static void
125 c42a1d3d 2006-02-21 devnull rshow(Tag *t, Tag *end)
127 c42a1d3d 2006-02-21 devnull if(t == nil || t == end)
129 c42a1d3d 2006-02-21 devnull rshow(t->next, end);
130 c42a1d3d 2006-02-21 devnull out(t->open);
134 c42a1d3d 2006-02-21 devnull ihtml(Rune *id, Rune *s)
136 c42a1d3d 2006-02-21 devnull Tag *t, *tt, **l;
138 c42a1d3d 2006-02-21 devnull for(t=tagset; t; t=t->next){
139 c42a1d3d 2006-02-21 devnull if(runestrcmp(t->id, id) == 0){
140 c42a1d3d 2006-02-21 devnull if(s && t->open && runestrcmp(t->open, s) == 0)
142 c42a1d3d 2006-02-21 devnull for(l=&tagset; (tt=*l); l=&tt->next){
143 c42a1d3d 2006-02-21 devnull if(!hidingset)
144 c42a1d3d 2006-02-21 devnull out(tt->close);
145 c42a1d3d 2006-02-21 devnull if(tt == t)
148 c42a1d3d 2006-02-21 devnull *l = t->next;
149 c42a1d3d 2006-02-21 devnull free(t->id);
150 c42a1d3d 2006-02-21 devnull free(t->close);
151 c42a1d3d 2006-02-21 devnull free(t->open);
152 c42a1d3d 2006-02-21 devnull free(t);
153 c42a1d3d 2006-02-21 devnull if(!hidingset)
154 c42a1d3d 2006-02-21 devnull rshow(tagset, *l);
155 c42a1d3d 2006-02-21 devnull goto cleared;
159 c42a1d3d 2006-02-21 devnull cleared:
160 c42a1d3d 2006-02-21 devnull if(s == nil || s[0] == 0)
162 c42a1d3d 2006-02-21 devnull t = emalloc(sizeof *t);
163 c42a1d3d 2006-02-21 devnull t->id = erunestrdup(id);
164 c42a1d3d 2006-02-21 devnull t->open = erunestrdup(s);
165 c42a1d3d 2006-02-21 devnull t->close = closingtag(s);
166 c42a1d3d 2006-02-21 devnull if(!hidingset)
168 c42a1d3d 2006-02-21 devnull t->next = tagset;
169 c42a1d3d 2006-02-21 devnull tagset = t;
173 c42a1d3d 2006-02-21 devnull hideihtml(void)
177 c42a1d3d 2006-02-21 devnull if(hidingset)
179 c42a1d3d 2006-02-21 devnull hidingset = 1;
180 c42a1d3d 2006-02-21 devnull for(t=tagset; t; t=t->next)
181 c42a1d3d 2006-02-21 devnull out(t->close);
185 c42a1d3d 2006-02-21 devnull showihtml(void)
187 c42a1d3d 2006-02-21 devnull if(!hidingset)
189 c42a1d3d 2006-02-21 devnull hidingset = 0;
190 c42a1d3d 2006-02-21 devnull rshow(tagset, nil);
194 c42a1d3d 2006-02-21 devnull e_lt(void)
196 c42a1d3d 2006-02-21 devnull return Ult;
200 c42a1d3d 2006-02-21 devnull e_gt(void)
202 c42a1d3d 2006-02-21 devnull return Ugt;
206 c42a1d3d 2006-02-21 devnull e_at(void)
208 c42a1d3d 2006-02-21 devnull return Uamp;
212 c42a1d3d 2006-02-21 devnull e_tick(void)
214 c42a1d3d 2006-02-21 devnull return Utick;
218 c42a1d3d 2006-02-21 devnull e_btick(void)
220 c42a1d3d 2006-02-21 devnull return Ubtick;
224 c42a1d3d 2006-02-21 devnull e_minus(void)
226 c42a1d3d 2006-02-21 devnull return Uminus;
230 c42a1d3d 2006-02-21 devnull r_html(Rune *name)
232 c42a1d3d 2006-02-21 devnull Rune *id, *line, *p;
234 c42a1d3d 2006-02-21 devnull id = copyarg();
235 c42a1d3d 2006-02-21 devnull line = readline(HtmlMode);
236 c42a1d3d 2006-02-21 devnull for(p=line; *p; p++){
237 c42a1d3d 2006-02-21 devnull switch(*p){
238 c42a1d3d 2006-02-21 devnull case '<':
239 c42a1d3d 2006-02-21 devnull *p = Ult;
241 c42a1d3d 2006-02-21 devnull case '>':
242 c42a1d3d 2006-02-21 devnull *p = Ugt;
244 c42a1d3d 2006-02-21 devnull case '&':
245 c42a1d3d 2006-02-21 devnull *p = Uamp;
247 c42a1d3d 2006-02-21 devnull case ' ':
248 c42a1d3d 2006-02-21 devnull *p = Uspace;
252 c42a1d3d 2006-02-21 devnull if(name[0] == 'i')
253 c42a1d3d 2006-02-21 devnull ihtml(id, line);
255 c42a1d3d 2006-02-21 devnull html(id, line);
256 c42a1d3d 2006-02-21 devnull free(id);
257 c42a1d3d 2006-02-21 devnull free(line);
260 c42a1d3d 2006-02-21 devnull char defaultfont[] =
261 c42a1d3d 2006-02-21 devnull ".ihtml f1\n"
262 c42a1d3d 2006-02-21 devnull ".ihtml f\n"
263 495eda0b 2006-05-09 devnull ".ihtml f <span style=\"font-size: \\n(.spt\">\n"
264 c42a1d3d 2006-02-21 devnull ".if \\n(.f==2 .ihtml f1 <i>\n"
265 c42a1d3d 2006-02-21 devnull ".if \\n(.f==3 .ihtml f1 <b>\n"
266 c42a1d3d 2006-02-21 devnull ".if \\n(.f==4 .ihtml f1 <b><i>\n"
267 c42a1d3d 2006-02-21 devnull ".if \\n(.f==5 .ihtml f1 <tt>\n"
268 c42a1d3d 2006-02-21 devnull ".if \\n(.f==6 .ihtml f1 <tt><i>\n"
273 c42a1d3d 2006-02-21 devnull htmlinit(void)
275 c42a1d3d 2006-02-21 devnull addraw(L("html"), r_html);
276 c42a1d3d 2006-02-21 devnull addraw(L("ihtml"), r_html);
278 c42a1d3d 2006-02-21 devnull addesc('<', e_lt, CopyMode);
279 c42a1d3d 2006-02-21 devnull addesc('>', e_gt, CopyMode);
280 c42a1d3d 2006-02-21 devnull addesc('\'', e_tick, CopyMode);
281 c42a1d3d 2006-02-21 devnull addesc('`', e_btick, CopyMode);
282 c42a1d3d 2006-02-21 devnull addesc('-', e_minus, CopyMode);
283 c42a1d3d 2006-02-21 devnull addesc('@', e_at, CopyMode);
285 c42a1d3d 2006-02-21 devnull ds(L("font"), L(defaultfont));