Annotation of mandoc/html.c, Revision 1.3
1.3 ! kristaps 1: /* $Id: html.c,v 1.2 2008/12/03 19:21:58 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the
7: * above copyright notice and this permission notice appear in all
8: * copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11: * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12: * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13: * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16: * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17: * PERFORMANCE OF THIS SOFTWARE.
18: */
19: #include <assert.h>
20: #include <stdlib.h>
1.2 kristaps 21: #include <string.h>
1.1 kristaps 22:
23: #include "libmdocml.h"
24: #include "private.h"
1.2 kristaps 25: #include "ml.h"
26:
27:
28: static ssize_t html_endtag(struct md_mbuf *,
29: const struct md_args *,
30: enum md_ns, int);
31: static ssize_t html_begintag(struct md_mbuf *,
32: const struct md_args *,
33: enum md_ns, int,
34: const int *, const char **);
35: static int html_begin(struct md_mbuf *,
36: const struct md_args *);
37: static int html_end(struct md_mbuf *,
38: const struct md_args *);
39: static ssize_t html_blocktagname(struct md_mbuf *,
40: const struct md_args *, int);
41: static ssize_t html_blocktagargs(struct md_mbuf *,
42: const struct md_args *, int,
43: const int *, const char **);
1.3 ! kristaps 44: static ssize_t html_blockheadtagname(struct md_mbuf *,
! 45: const struct md_args *, int);
! 46: static ssize_t html_blockheadtagargs(struct md_mbuf *,
! 47: const struct md_args *, int,
! 48: const int *, const char **);
! 49: static ssize_t html_blockbodytagname(struct md_mbuf *,
! 50: const struct md_args *, int);
! 51: static ssize_t html_blockbodytagargs(struct md_mbuf *,
! 52: const struct md_args *, int,
! 53: const int *, const char **);
1.2 kristaps 54: static ssize_t html_inlinetagname(struct md_mbuf *,
55: const struct md_args *, int);
56: static ssize_t html_inlinetagargs(struct md_mbuf *,
57: const struct md_args *, int,
58: const int *, const char **);
59:
60:
1.3 ! kristaps 61: /* ARGSUSED */
1.2 kristaps 62: static int
63: html_begin(struct md_mbuf *mbuf, const struct md_args *args)
64: {
65: size_t res;
66:
67: res = 0;
68: if ( ! ml_puts(mbuf, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD "
69: "HTML 4.01//EN\" \"http://www.w3.org"
70: "/TR/html4/strict.dtd\">\n", &res))
71: return(0);
72: if ( ! ml_puts(mbuf, "<html>\n", &res))
73: return(0);
74: if ( ! ml_puts(mbuf, "<head>\n", &res))
75: return(0);
76: if ( ! ml_puts(mbuf, " <title>Manual page</title>\n", &res))
77: return(0);
78: if ( ! ml_puts(mbuf, " <meta http-equiv=\"Content-Type\" "
79: "content=\"text/html; "
80: "charset=utf-8\">\n", &res))
81: return(0);
82: if ( ! ml_puts(mbuf, " <meta name=\"resource-type\" "
83: "content=\"document\">\n", &res))
84: return(0);
85: if ( ! ml_puts(mbuf, "</head>\n", &res))
86: return(0);
87: if ( ! ml_puts(mbuf, "<body>", &res))
88: return(0);
89:
90: return(1);
91: }
92:
93:
1.3 ! kristaps 94: /* ARGSUSED */
1.2 kristaps 95: static int
96: html_end(struct md_mbuf *mbuf, const struct md_args *args)
97: {
98: size_t res;
99:
100: res = 0;
101: if ( ! ml_puts(mbuf, "</body>\n</html>", &res))
102: return(0);
103:
104: return(1);
105: }
106:
107:
1.3 ! kristaps 108: /* ARGSUSED */
1.2 kristaps 109: static ssize_t
1.3 ! kristaps 110: html_blockbodytagname(struct md_mbuf *mbuf,
1.2 kristaps 111: const struct md_args *args, int tok)
112: {
113: size_t res;
114:
115: res = 0;
116:
117: switch (tok) {
118: case (ROFF_Sh):
119: if ( ! ml_puts(mbuf, "blockquote", &res))
120: return(-1);
121: break;
1.3 ! kristaps 122: default:
! 123: if ( ! ml_puts(mbuf, "div", &res))
! 124: return(-1);
! 125: break;
! 126: }
! 127:
! 128: return((ssize_t)res);
! 129: }
! 130:
! 131:
! 132:
! 133:
! 134: /* ARGSUSED */
! 135: static ssize_t
! 136: html_blockheadtagname(struct md_mbuf *mbuf,
! 137: const struct md_args *args, int tok)
! 138: {
! 139: size_t res;
! 140:
! 141: res = 0;
! 142:
! 143: switch (tok) {
! 144: case (ROFF_Sh):
! 145: if ( ! ml_puts(mbuf, "h1", &res))
! 146: return(-1);
! 147: break;
! 148: case (ROFF_Ss):
! 149: if ( ! ml_puts(mbuf, "h2", &res))
! 150: return(-1);
! 151: break;
! 152: default:
! 153: if ( ! ml_puts(mbuf, "div", &res))
! 154: return(-1);
! 155: break;
! 156: }
! 157:
! 158: return((ssize_t)res);
! 159: }
! 160:
! 161:
! 162: /* ARGSUSED */
! 163: static ssize_t
! 164: html_blocktagname(struct md_mbuf *mbuf,
! 165: const struct md_args *args, int tok)
! 166: {
! 167: size_t res;
! 168:
! 169: res = 0;
! 170:
! 171: switch (tok) {
1.2 kristaps 172: case (ROFF_Bd):
173: if ( ! ml_puts(mbuf, "pre", &res))
174: return(-1);
175: break;
176: case (ROFF_Bl):
177: if ( ! ml_puts(mbuf, "ul", &res))
178: return(-1);
179: break;
180: case (ROFF_It):
181: if ( ! ml_puts(mbuf, "li", &res))
182: return(-1);
183: break;
184: default:
185: if ( ! ml_puts(mbuf, "div", &res))
186: return(-1);
187: break;
188: }
189:
1.3 ! kristaps 190: return((ssize_t)res);
! 191: }
! 192:
! 193:
! 194: /* ARGSUSED */
! 195: static ssize_t
! 196: html_blockheadtagargs(struct md_mbuf *mbuf, const struct md_args *args,
! 197: int tok, const int *argc, const char **argv)
! 198: {
! 199: size_t res;
! 200:
! 201: res = 0;
! 202:
! 203: if ( ! ml_puts(mbuf, " class=\"head:", &res))
! 204: return(0);
! 205: if ( ! ml_puts(mbuf, toknames[tok], &res))
! 206: return(0);
! 207: if ( ! ml_puts(mbuf, "\"", &res))
! 208: return(0);
! 209:
! 210: switch (tok) {
! 211: default:
! 212: break;
! 213: }
! 214:
! 215: return(0);
! 216: }
! 217:
! 218:
! 219: /* ARGSUSED */
! 220: static ssize_t
! 221: html_blockbodytagargs(struct md_mbuf *mbuf, const struct md_args *args,
! 222: int tok, const int *argc, const char **argv)
! 223: {
! 224: size_t res;
! 225:
! 226: res = 0;
! 227:
! 228: if ( ! ml_puts(mbuf, " class=\"body:", &res))
! 229: return(0);
! 230: if ( ! ml_puts(mbuf, toknames[tok], &res))
! 231: return(0);
! 232: if ( ! ml_puts(mbuf, "\"", &res))
! 233: return(0);
! 234:
! 235: switch (tok) {
! 236: default:
! 237: break;
! 238: }
! 239:
! 240: return(res);
1.2 kristaps 241: }
242:
243:
244: /* ARGSUSED */
245: static ssize_t
246: html_blocktagargs(struct md_mbuf *mbuf, const struct md_args *args,
247: int tok, const int *argc, const char **argv)
248: {
1.3 ! kristaps 249: size_t res;
! 250:
! 251: res = 0;
! 252:
! 253: if ( ! ml_puts(mbuf, " class=\"block:", &res))
! 254: return(0);
! 255: if ( ! ml_puts(mbuf, toknames[tok], &res))
! 256: return(0);
! 257: if ( ! ml_puts(mbuf, "\"", &res))
! 258: return(0);
1.2 kristaps 259:
260: switch (tok) {
261: default:
1.3 ! kristaps 262: break;
1.2 kristaps 263: }
264:
1.3 ! kristaps 265: return(0);
1.2 kristaps 266: }
1.1 kristaps 267:
268:
269: /* ARGSUSED */
1.2 kristaps 270: static ssize_t
271: html_inlinetagargs(struct md_mbuf *mbuf, const struct md_args *args,
272: int tok, const int *argc, const char **argv)
273: {
1.3 ! kristaps 274: size_t res;
! 275:
! 276: res = 0;
! 277:
! 278: if ( ! ml_puts(mbuf, " class=\"inline:", &res))
! 279: return(0);
! 280: if ( ! ml_puts(mbuf, toknames[tok], &res))
! 281: return(0);
! 282: if ( ! ml_puts(mbuf, "\"", &res))
! 283: return(0);
! 284:
1.2 kristaps 285:
286: switch (tok) {
287: default:
1.3 ! kristaps 288: break;
1.2 kristaps 289: }
290:
1.3 ! kristaps 291: return(0);
1.2 kristaps 292: }
293:
294:
1.3 ! kristaps 295: /* ARGSUSED */
1.2 kristaps 296: static ssize_t
297: html_inlinetagname(struct md_mbuf *mbuf,
298: const struct md_args *args, int tok)
299: {
300: size_t res;
301:
302: res = 0;
303:
304: switch (tok) {
305: default:
306: if ( ! ml_puts(mbuf, "span", &res))
307: return(-1);
308: break;
309: }
310:
311: return((ssize_t)res);
312: }
313:
314:
315: static ssize_t
316: html_begintag(struct md_mbuf *mbuf, const struct md_args *args,
317: enum md_ns ns, int tok,
318: const int *argc, const char **argv)
319: {
320:
321: assert(ns != MD_NS_DEFAULT);
1.3 ! kristaps 322: switch (ns) {
! 323: case (MD_NS_BLOCK):
1.2 kristaps 324: if ( ! html_blocktagname(mbuf, args, tok))
325: return(0);
326: return(html_blocktagargs(mbuf, args,
327: tok, argc, argv));
1.3 ! kristaps 328: case (MD_NS_BODY):
! 329: if ( ! html_blockbodytagname(mbuf, args, tok))
! 330: return(0);
! 331: return(html_blockbodytagargs(mbuf, args,
! 332: tok, argc, argv));
! 333: case (MD_NS_HEAD):
! 334: if ( ! html_blockheadtagname(mbuf, args, tok))
! 335: return(0);
! 336: return(html_blockheadtagargs(mbuf, args,
! 337: tok, argc, argv));
! 338: default:
! 339: break;
1.2 kristaps 340: }
341:
342: if ( ! html_inlinetagname(mbuf, args, tok))
343: return(0);
344: return(html_inlinetagargs(mbuf, args, tok, argc, argv));
345: }
346:
347:
348: static ssize_t
349: html_endtag(struct md_mbuf *mbuf, const struct md_args *args,
350: enum md_ns ns, int tok)
351: {
352:
353: assert(ns != MD_NS_DEFAULT);
1.3 ! kristaps 354: switch (ns) {
! 355: case (MD_NS_BLOCK):
1.2 kristaps 356: return(html_blocktagname(mbuf, args, tok));
1.3 ! kristaps 357: case (MD_NS_BODY):
! 358: return(html_blockbodytagname(mbuf, args, tok));
! 359: case (MD_NS_HEAD):
! 360: return(html_blockheadtagname(mbuf, args, tok));
! 361: default:
! 362: break;
! 363: }
1.2 kristaps 364:
365: return(html_inlinetagname(mbuf, args, tok));
366: }
367:
368:
1.1 kristaps 369: int
370: md_line_html(void *data, char *buf)
371: {
372:
1.2 kristaps 373: return(mlg_line((struct md_mlg *)data, buf));
1.1 kristaps 374: }
375:
376:
377: int
378: md_exit_html(void *data, int flush)
379: {
380:
1.2 kristaps 381: return(mlg_exit((struct md_mlg *)data, flush));
1.1 kristaps 382: }
383:
384:
385: void *
386: md_init_html(const struct md_args *args,
387: struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
388: {
389:
1.2 kristaps 390: return(mlg_alloc(args, rbuf, mbuf, html_begintag,
391: html_endtag, html_begin, html_end));
1.1 kristaps 392: }
1.2 kristaps 393:
CVSweb