Annotation of src/usr.bin/mandoc/man_html.c, Revision 1.32
1.32 ! schwarze 1: /* $Id: man_html.c,v 1.31 2011/01/16 02:56:47 schwarze Exp $ */
1.1 schwarze 2: /*
1.29 schwarze 3: * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
1.1 schwarze 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 above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17: #include <sys/types.h>
18:
19: #include <assert.h>
20: #include <ctype.h>
21: #include <stdio.h>
22: #include <stdlib.h>
23: #include <string.h>
24:
1.14 schwarze 25: #include "mandoc.h"
1.1 schwarze 26: #include "out.h"
27: #include "html.h"
28: #include "man.h"
29: #include "main.h"
30:
31: /* TODO: preserve ident widths. */
1.2 schwarze 32: /* FIXME: have PD set the default vspace width. */
1.1 schwarze 33:
34: #define INDENT 5
35: #define HALFINDENT 3
36:
37: #define MAN_ARGS const struct man_meta *m, \
38: const struct man_node *n, \
1.18 schwarze 39: struct mhtml *mh, \
1.1 schwarze 40: struct html *h
41:
1.18 schwarze 42: struct mhtml {
43: int fl;
44: #define MANH_LITERAL (1 << 0) /* literal context */
45: };
46:
1.1 schwarze 47: struct htmlman {
48: int (*pre)(MAN_ARGS);
49: int (*post)(MAN_ARGS);
50: };
51:
52: static void print_man(MAN_ARGS);
53: static void print_man_head(MAN_ARGS);
54: static void print_man_nodelist(MAN_ARGS);
55: static void print_man_node(MAN_ARGS);
56:
57: static int a2width(const struct man_node *,
58: struct roffsu *);
59:
60: static int man_alt_pre(MAN_ARGS);
61: static int man_br_pre(MAN_ARGS);
62: static int man_ign_pre(MAN_ARGS);
1.18 schwarze 63: static int man_in_pre(MAN_ARGS);
64: static int man_literal_pre(MAN_ARGS);
1.1 schwarze 65: static void man_root_post(MAN_ARGS);
66: static int man_root_pre(MAN_ARGS);
67: static int man_B_pre(MAN_ARGS);
68: static int man_HP_pre(MAN_ARGS);
69: static int man_I_pre(MAN_ARGS);
70: static int man_IP_pre(MAN_ARGS);
71: static int man_PP_pre(MAN_ARGS);
72: static int man_RS_pre(MAN_ARGS);
73: static int man_SH_pre(MAN_ARGS);
74: static int man_SM_pre(MAN_ARGS);
75: static int man_SS_pre(MAN_ARGS);
76:
77: static const struct htmlman mans[MAN_MAX] = {
78: { man_br_pre, NULL }, /* br */
79: { NULL, NULL }, /* TH */
80: { man_SH_pre, NULL }, /* SH */
81: { man_SS_pre, NULL }, /* SS */
82: { man_IP_pre, NULL }, /* TP */
83: { man_PP_pre, NULL }, /* LP */
84: { man_PP_pre, NULL }, /* PP */
85: { man_PP_pre, NULL }, /* P */
86: { man_IP_pre, NULL }, /* IP */
87: { man_HP_pre, NULL }, /* HP */
88: { man_SM_pre, NULL }, /* SM */
1.26 schwarze 89: { man_SM_pre, NULL }, /* SB */
1.1 schwarze 90: { man_alt_pre, NULL }, /* BI */
91: { man_alt_pre, NULL }, /* IB */
92: { man_alt_pre, NULL }, /* BR */
93: { man_alt_pre, NULL }, /* RB */
94: { NULL, NULL }, /* R */
95: { man_B_pre, NULL }, /* B */
96: { man_I_pre, NULL }, /* I */
97: { man_alt_pre, NULL }, /* IR */
98: { man_alt_pre, NULL }, /* RI */
99: { NULL, NULL }, /* na */
100: { man_br_pre, NULL }, /* sp */
1.18 schwarze 101: { man_literal_pre, NULL }, /* nf */
102: { man_literal_pre, NULL }, /* fi */
1.1 schwarze 103: { NULL, NULL }, /* RE */
104: { man_RS_pre, NULL }, /* RS */
105: { man_ign_pre, NULL }, /* DT */
106: { man_ign_pre, NULL }, /* UC */
1.2 schwarze 107: { man_ign_pre, NULL }, /* PD */
1.13 schwarze 108: { man_ign_pre, NULL }, /* AT */
1.18 schwarze 109: { man_in_pre, NULL }, /* in */
1.23 schwarze 110: { man_ign_pre, NULL }, /* ft */
1.1 schwarze 111: };
112:
113:
114: void
115: html_man(void *arg, const struct man *m)
116: {
117: struct html *h;
118: struct tag *t;
1.18 schwarze 119: struct mhtml mh;
1.1 schwarze 120:
121: h = (struct html *)arg;
122:
1.5 schwarze 123: print_gen_decls(h);
1.1 schwarze 124:
1.18 schwarze 125: memset(&mh, 0, sizeof(struct mhtml));
126:
1.1 schwarze 127: t = print_otag(h, TAG_HTML, 0, NULL);
1.18 schwarze 128: print_man(man_meta(m), man_node(m), &mh, h);
1.1 schwarze 129: print_tagq(h, t);
130:
131: printf("\n");
132: }
133:
134:
135: static void
136: print_man(MAN_ARGS)
137: {
138: struct tag *t;
139:
140: t = print_otag(h, TAG_HEAD, 0, NULL);
1.18 schwarze 141: print_man_head(m, n, mh, h);
1.1 schwarze 142: print_tagq(h, t);
1.25 schwarze 143:
1.1 schwarze 144: t = print_otag(h, TAG_BODY, 0, NULL);
1.18 schwarze 145: print_man_nodelist(m, n, mh, h);
1.1 schwarze 146: print_tagq(h, t);
147: }
148:
149:
150: /* ARGSUSED */
151: static void
152: print_man_head(MAN_ARGS)
153: {
154:
155: print_gen_head(h);
156: bufinit(h);
1.10 schwarze 157: buffmt(h, "%s(%s)", m->title, m->msec);
1.1 schwarze 158:
159: print_otag(h, TAG_TITLE, 0, NULL);
160: print_text(h, h->buf);
161: }
162:
163:
164: static void
165: print_man_nodelist(MAN_ARGS)
166: {
167:
1.18 schwarze 168: print_man_node(m, n, mh, h);
1.1 schwarze 169: if (n->next)
1.18 schwarze 170: print_man_nodelist(m, n->next, mh, h);
1.1 schwarze 171: }
172:
173:
174: static void
175: print_man_node(MAN_ARGS)
176: {
177: int child;
178: struct tag *t;
179:
180: child = 1;
1.2 schwarze 181: t = h->tags.head;
1.1 schwarze 182:
183: bufinit(h);
184:
185: switch (n->type) {
186: case (MAN_ROOT):
1.18 schwarze 187: child = man_root_pre(m, n, mh, h);
1.1 schwarze 188: break;
189: case (MAN_TEXT):
1.31 schwarze 190: if ('\0' == *n->string) {
191: print_otag(h, TAG_P, 0, NULL);
192: return;
1.32 ! schwarze 193: } else if (' ' == *n->string && MAN_LINE & n->flags)
1.31 schwarze 194: print_otag(h, TAG_BR, 0, NULL);
195:
1.1 schwarze 196: print_text(h, n->string);
1.31 schwarze 197:
1.32 ! schwarze 198: if (MANH_LITERAL & mh->fl &&
! 199: (NULL == n->next ||
! 200: n->next->line > n->line))
1.18 schwarze 201: print_otag(h, TAG_BR, 0, NULL);
1.4 schwarze 202: return;
1.29 schwarze 203: case (MAN_TBL):
204: print_tbl(h, n->span);
1.32 ! schwarze 205: return;
1.1 schwarze 206: default:
1.4 schwarze 207: /*
208: * Close out scope of font prior to opening a macro
209: * scope. Assert that the metafont is on the top of the
210: * stack (it's never nested).
211: */
1.27 schwarze 212: if (HTMLFONT_NONE != h->metac) {
213: h->metal = h->metac;
214: h->metac = HTMLFONT_NONE;
1.4 schwarze 215: }
1.1 schwarze 216: if (mans[n->tok].pre)
1.18 schwarze 217: child = (*mans[n->tok].pre)(m, n, mh, h);
1.1 schwarze 218: break;
219: }
220:
221: if (child && n->child)
1.18 schwarze 222: print_man_nodelist(m, n->child, mh, h);
1.1 schwarze 223:
1.4 schwarze 224: /* This will automatically close out any font scope. */
1.1 schwarze 225: print_stagq(h, t);
226:
227: bufinit(h);
228:
229: switch (n->type) {
230: case (MAN_ROOT):
1.18 schwarze 231: man_root_post(m, n, mh, h);
1.1 schwarze 232: break;
233: default:
234: if (mans[n->tok].post)
1.18 schwarze 235: (*mans[n->tok].post)(m, n, mh, h);
1.1 schwarze 236: break;
237: }
238: }
239:
240:
241: static int
242: a2width(const struct man_node *n, struct roffsu *su)
243: {
244:
245: if (MAN_TEXT != n->type)
246: return(0);
247: if (a2roffsu(n->string, su, SCALE_BU))
248: return(1);
249:
250: return(0);
251: }
252:
253:
254: /* ARGSUSED */
255: static int
256: man_root_pre(MAN_ARGS)
257: {
1.26 schwarze 258: struct htmlpair tag[3];
1.1 schwarze 259: struct tag *t, *tt;
260: char b[BUFSIZ], title[BUFSIZ];
261:
262: b[0] = 0;
263: if (m->vol)
264: (void)strlcat(b, m->vol, BUFSIZ);
265:
1.10 schwarze 266: snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec);
1.1 schwarze 267:
1.26 schwarze 268: PAIR_SUMMARY_INIT(&tag[0], "Document Header");
269: PAIR_CLASS_INIT(&tag[1], "head");
270: if (NULL == h->style) {
271: PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
272: t = print_otag(h, TAG_TABLE, 3, tag);
273: PAIR_INIT(&tag[0], ATTR_WIDTH, "30%");
274: print_otag(h, TAG_COL, 1, tag);
275: print_otag(h, TAG_COL, 1, tag);
276: print_otag(h, TAG_COL, 1, tag);
277: } else
278: t = print_otag(h, TAG_TABLE, 2, tag);
279:
280: print_otag(h, TAG_TBODY, 0, NULL);
1.3 schwarze 281:
1.1 schwarze 282: tt = print_otag(h, TAG_TR, 0, NULL);
283:
1.25 schwarze 284: PAIR_CLASS_INIT(&tag[0], "head-ltitle");
1.1 schwarze 285: print_otag(h, TAG_TD, 1, tag);
1.25 schwarze 286:
1.1 schwarze 287: print_text(h, title);
288: print_stagq(h, tt);
289:
1.25 schwarze 290: PAIR_CLASS_INIT(&tag[0], "head-vol");
1.26 schwarze 291: if (NULL == h->style) {
292: PAIR_INIT(&tag[1], ATTR_ALIGN, "center");
293: print_otag(h, TAG_TD, 2, tag);
294: } else
295: print_otag(h, TAG_TD, 1, tag);
1.25 schwarze 296:
1.1 schwarze 297: print_text(h, b);
298: print_stagq(h, tt);
299:
1.25 schwarze 300: PAIR_CLASS_INIT(&tag[0], "head-rtitle");
1.26 schwarze 301: if (NULL == h->style) {
302: PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
303: print_otag(h, TAG_TD, 2, tag);
304: } else
305: print_otag(h, TAG_TD, 1, tag);
1.25 schwarze 306:
1.1 schwarze 307: print_text(h, title);
308: print_tagq(h, t);
309: return(1);
310: }
311:
312:
313: /* ARGSUSED */
314: static void
315: man_root_post(MAN_ARGS)
316: {
1.26 schwarze 317: struct htmlpair tag[3];
1.1 schwarze 318: struct tag *t, *tt;
1.2 schwarze 319: char b[DATESIZ];
1.1 schwarze 320:
1.15 schwarze 321: if (m->rawdate)
322: strlcpy(b, m->rawdate, DATESIZ);
323: else
324: time2a(m->date, b, DATESIZ);
1.1 schwarze 325:
1.26 schwarze 326: PAIR_SUMMARY_INIT(&tag[0], "Document Footer");
327: PAIR_CLASS_INIT(&tag[1], "foot");
328: if (NULL == h->style) {
329: PAIR_INIT(&tag[2], ATTR_WIDTH, "100%");
330: t = print_otag(h, TAG_TABLE, 3, tag);
331: PAIR_INIT(&tag[0], ATTR_WIDTH, "50%");
332: print_otag(h, TAG_COL, 1, tag);
333: print_otag(h, TAG_COL, 1, tag);
334: } else
335: t = print_otag(h, TAG_TABLE, 2, tag);
1.3 schwarze 336:
1.1 schwarze 337: tt = print_otag(h, TAG_TR, 0, NULL);
338:
1.25 schwarze 339: PAIR_CLASS_INIT(&tag[0], "foot-date");
1.1 schwarze 340: print_otag(h, TAG_TD, 1, tag);
1.25 schwarze 341:
1.1 schwarze 342: print_text(h, b);
343: print_stagq(h, tt);
344:
1.25 schwarze 345: PAIR_CLASS_INIT(&tag[0], "foot-os");
1.26 schwarze 346: if (NULL == h->style) {
347: PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
348: print_otag(h, TAG_TD, 2, tag);
349: } else
350: print_otag(h, TAG_TD, 1, tag);
1.25 schwarze 351:
1.1 schwarze 352: if (m->source)
353: print_text(h, m->source);
354: print_tagq(h, t);
355: }
356:
357:
358:
359: /* ARGSUSED */
360: static int
361: man_br_pre(MAN_ARGS)
362: {
363: struct roffsu su;
364: struct htmlpair tag;
365:
366: SCALE_VS_INIT(&su, 1);
367:
1.21 schwarze 368: if (MAN_sp == n->tok) {
1.8 schwarze 369: if (n->child)
370: a2roffsu(n->child->string, &su, SCALE_VS);
1.21 schwarze 371: } else
1.1 schwarze 372: su.scale = 0;
373:
374: bufcat_su(h, "height", &su);
375: PAIR_STYLE_INIT(&tag, h);
376: print_otag(h, TAG_DIV, 1, &tag);
1.4 schwarze 377:
1.3 schwarze 378: /* So the div isn't empty: */
379: print_text(h, "\\~");
380:
1.1 schwarze 381: return(0);
382: }
383:
384:
385: /* ARGSUSED */
386: static int
387: man_SH_pre(MAN_ARGS)
388: {
1.25 schwarze 389: struct htmlpair tag;
1.1 schwarze 390:
1.25 schwarze 391: if (MAN_BLOCK == n->type) {
392: PAIR_CLASS_INIT(&tag, "section");
393: print_otag(h, TAG_DIV, 1, &tag);
1.1 schwarze 394: return(1);
1.25 schwarze 395: } else if (MAN_BODY == n->type)
1.1 schwarze 396: return(1);
397:
1.25 schwarze 398: print_otag(h, TAG_H1, 0, NULL);
1.1 schwarze 399: return(1);
400: }
401:
402:
403: /* ARGSUSED */
404: static int
405: man_alt_pre(MAN_ARGS)
406: {
407: const struct man_node *nn;
1.27 schwarze 408: int i;
409: enum htmltag fp;
410: struct tag *t;
1.1 schwarze 411:
412: for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
1.27 schwarze 413: t = NULL;
1.1 schwarze 414: switch (n->tok) {
415: case (MAN_BI):
1.27 schwarze 416: fp = i % 2 ? TAG_I : TAG_B;
1.1 schwarze 417: break;
418: case (MAN_IB):
1.27 schwarze 419: fp = i % 2 ? TAG_B : TAG_I;
1.1 schwarze 420: break;
421: case (MAN_RI):
1.27 schwarze 422: fp = i % 2 ? TAG_I : TAG_MAX;
1.1 schwarze 423: break;
424: case (MAN_IR):
1.27 schwarze 425: fp = i % 2 ? TAG_MAX : TAG_I;
1.1 schwarze 426: break;
427: case (MAN_BR):
1.27 schwarze 428: fp = i % 2 ? TAG_MAX : TAG_B;
1.1 schwarze 429: break;
430: case (MAN_RB):
1.27 schwarze 431: fp = i % 2 ? TAG_B : TAG_MAX;
1.1 schwarze 432: break;
433: default:
434: abort();
435: /* NOTREACHED */
436: }
437:
438: if (i)
439: h->flags |= HTML_NOSPACE;
440:
1.27 schwarze 441: if (TAG_MAX != fp)
442: t = print_otag(h, fp, 0, NULL);
443:
1.18 schwarze 444: print_man_node(m, nn, mh, h);
1.27 schwarze 445:
446: if (t)
447: print_tagq(h, t);
1.1 schwarze 448: }
449:
450: return(0);
451: }
452:
453:
454: /* ARGSUSED */
455: static int
1.26 schwarze 456: man_SM_pre(MAN_ARGS)
1.1 schwarze 457: {
458:
1.27 schwarze 459: print_otag(h, TAG_SMALL, 0, NULL);
1.26 schwarze 460: if (MAN_SB == n->tok)
1.27 schwarze 461: print_otag(h, TAG_B, 0, NULL);
1.1 schwarze 462: return(1);
463: }
464:
465:
466: /* ARGSUSED */
467: static int
468: man_SS_pre(MAN_ARGS)
469: {
1.25 schwarze 470: struct htmlpair tag;
1.1 schwarze 471:
1.25 schwarze 472: if (MAN_BLOCK == n->type) {
473: PAIR_CLASS_INIT(&tag, "subsection");
474: print_otag(h, TAG_DIV, 1, &tag);
1.1 schwarze 475: return(1);
1.25 schwarze 476: } else if (MAN_BODY == n->type)
1.1 schwarze 477: return(1);
478:
1.25 schwarze 479: print_otag(h, TAG_H2, 0, NULL);
1.1 schwarze 480: return(1);
481: }
482:
483:
484: /* ARGSUSED */
485: static int
486: man_PP_pre(MAN_ARGS)
487: {
488:
1.22 schwarze 489: if (MAN_HEAD == n->type)
490: return(0);
1.26 schwarze 491: else if (MAN_BODY == n->type && n->prev)
492: print_otag(h, TAG_P, 0, NULL);
1.22 schwarze 493:
1.1 schwarze 494: return(1);
495: }
496:
497:
498: /* ARGSUSED */
499: static int
500: man_IP_pre(MAN_ARGS)
501: {
502: struct roffsu su;
503: struct htmlpair tag;
504: const struct man_node *nn;
505:
506: /*
507: * This scattering of 1-BU margins and pads is to make sure that
508: * when text overruns its box, the subsequent text isn't flush
509: * up against it. However, the rest of the right-hand box must
510: * also be adjusted in consideration of this 1-BU space.
511: */
512:
513: if (MAN_BODY == n->type) {
1.26 schwarze 514: print_otag(h, TAG_TD, 0, NULL);
1.1 schwarze 515: return(1);
516: }
517:
518: nn = MAN_BLOCK == n->type ?
519: n->head->child : n->parent->head->child;
520:
521: SCALE_HS_INIT(&su, INDENT);
522:
1.28 schwarze 523: /* Width is the second token. */
1.7 schwarze 524:
1.1 schwarze 525: if (MAN_IP == n->tok && NULL != nn)
1.28 schwarze 526: if (NULL != (nn = nn->next))
1.30 schwarze 527: a2width(nn, &su);
1.1 schwarze 528:
1.7 schwarze 529: /* Width is the first token. */
530:
531: if (MAN_TP == n->tok && NULL != nn) {
532: /* Skip past non-text children. */
533: while (nn && MAN_TEXT != nn->type)
534: nn = nn->next;
535: if (nn)
1.30 schwarze 536: a2width(nn, &su);
1.7 schwarze 537: }
1.1 schwarze 538:
539: if (MAN_BLOCK == n->type) {
1.26 schwarze 540: print_otag(h, TAG_P, 0, NULL);
541: print_otag(h, TAG_TABLE, 0, NULL);
542: bufcat_su(h, "width", &su);
1.1 schwarze 543: PAIR_STYLE_INIT(&tag, h);
1.26 schwarze 544: print_otag(h, TAG_COL, 1, &tag);
545: print_otag(h, TAG_COL, 0, NULL);
546: print_otag(h, TAG_TBODY, 0, NULL);
547: print_otag(h, TAG_TR, 0, NULL);
1.1 schwarze 548: return(1);
549: }
550:
1.26 schwarze 551: print_otag(h, TAG_TD, 0, NULL);
1.1 schwarze 552:
1.28 schwarze 553: /* For IP, only print the first header element. */
1.1 schwarze 554:
1.28 schwarze 555: if (MAN_IP == n->tok && n->child)
556: print_man_node(m, n->child, mh, h);
1.7 schwarze 557:
1.28 schwarze 558: /* For TP, only print next-line header elements. */
1.1 schwarze 559:
560: if (MAN_TP == n->tok)
1.28 schwarze 561: for (nn = n->child; nn; nn = nn->next)
562: if (nn->line > n->line)
563: print_man_node(m, nn, mh, h);
1.1 schwarze 564:
565: return(0);
566: }
567:
568:
569: /* ARGSUSED */
570: static int
571: man_HP_pre(MAN_ARGS)
572: {
1.26 schwarze 573: struct htmlpair tag;
574: struct roffsu su;
575: const struct man_node *np;
1.1 schwarze 576:
1.26 schwarze 577: np = MAN_BLOCK == n->type ?
578: n->head->child :
579: n->parent->head->child;
1.1 schwarze 580:
1.26 schwarze 581: if (NULL == np || ! a2width(np, &su))
582: SCALE_HS_INIT(&su, INDENT);
1.1 schwarze 583:
1.26 schwarze 584: if (MAN_HEAD == n->type) {
585: print_otag(h, TAG_TD, 0, NULL);
586: return(0);
587: } else if (MAN_BLOCK == n->type) {
588: print_otag(h, TAG_P, 0, NULL);
589: print_otag(h, TAG_TABLE, 0, NULL);
590: bufcat_su(h, "width", &su);
1.1 schwarze 591: PAIR_STYLE_INIT(&tag, h);
1.26 schwarze 592: print_otag(h, TAG_COL, 1, &tag);
593: print_otag(h, TAG_COL, 0, NULL);
594: print_otag(h, TAG_TBODY, 0, NULL);
595: print_otag(h, TAG_TR, 0, NULL);
1.1 schwarze 596: return(1);
597: }
598:
1.26 schwarze 599: su.scale = -su.scale;
1.1 schwarze 600: bufcat_su(h, "text-indent", &su);
601: PAIR_STYLE_INIT(&tag, h);
1.26 schwarze 602: print_otag(h, TAG_TD, 1, &tag);
1.1 schwarze 603: return(1);
604: }
605:
606:
607: /* ARGSUSED */
608: static int
609: man_B_pre(MAN_ARGS)
610: {
611:
1.27 schwarze 612: print_otag(h, TAG_B, 0, NULL);
1.1 schwarze 613: return(1);
614: }
615:
616:
617: /* ARGSUSED */
618: static int
619: man_I_pre(MAN_ARGS)
620: {
1.4 schwarze 621:
1.27 schwarze 622: print_otag(h, TAG_I, 0, NULL);
1.1 schwarze 623: return(1);
1.18 schwarze 624: }
625:
626:
627: /* ARGSUSED */
628: static int
629: man_literal_pre(MAN_ARGS)
630: {
631:
1.21 schwarze 632: if (MAN_nf == n->tok) {
1.18 schwarze 633: print_otag(h, TAG_BR, 0, NULL);
634: mh->fl |= MANH_LITERAL;
1.21 schwarze 635: } else
1.18 schwarze 636: mh->fl &= ~MANH_LITERAL;
637:
638: return(1);
639: }
640:
641:
642: /* ARGSUSED */
643: static int
644: man_in_pre(MAN_ARGS)
645: {
646:
647: print_otag(h, TAG_BR, 0, NULL);
648: return(0);
1.1 schwarze 649: }
650:
651:
652: /* ARGSUSED */
653: static int
654: man_ign_pre(MAN_ARGS)
655: {
656:
657: return(0);
658: }
659:
660:
661: /* ARGSUSED */
662: static int
663: man_RS_pre(MAN_ARGS)
664: {
665: struct htmlpair tag;
666: struct roffsu su;
667:
668: if (MAN_HEAD == n->type)
669: return(0);
670: else if (MAN_BODY == n->type)
671: return(1);
672:
673: SCALE_HS_INIT(&su, INDENT);
1.26 schwarze 674: if (n->head->child)
1.1 schwarze 675: a2width(n->head->child, &su);
676:
1.26 schwarze 677: bufcat_su(h, "margin-left", &su);
1.1 schwarze 678: PAIR_STYLE_INIT(&tag, h);
679: print_otag(h, TAG_DIV, 1, &tag);
680: return(1);
681: }