Annotation of mandoc/man_html.c, Revision 1.15
1.15 ! kristaps 1: /* $Id: man_html.c,v 1.14 2009/10/26 08:18:16 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008, 2009 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 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:
1.5 kristaps 19: #include <assert.h>
20: #include <ctype.h>
1.4 kristaps 21: #include <err.h>
1.2 kristaps 22: #include <stdio.h>
1.1 kristaps 23: #include <stdlib.h>
1.4 kristaps 24: #include <string.h>
1.1 kristaps 25:
1.7 kristaps 26: #include "out.h"
1.1 kristaps 27: #include "html.h"
28: #include "man.h"
1.10 kristaps 29: #include "main.h"
1.1 kristaps 30:
1.6 kristaps 31: /* TODO: preserve ident widths. */
1.13 kristaps 32: /* FIXME: have PD set the default vspace width. */
1.6 kristaps 33:
34: #define INDENT 5
1.4 kristaps 35: #define HALFINDENT 3
36:
1.3 kristaps 37: #define MAN_ARGS const struct man_meta *m, \
38: const struct man_node *n, \
39: struct html *h
40:
41: struct htmlman {
42: int (*pre)(MAN_ARGS);
43: int (*post)(MAN_ARGS);
44: };
45:
46: static void print_man(MAN_ARGS);
47: static void print_man_head(MAN_ARGS);
1.4 kristaps 48: static void print_man_nodelist(MAN_ARGS);
49: static void print_man_node(MAN_ARGS);
1.3 kristaps 50:
1.7 kristaps 51: static int a2width(const struct man_node *,
52: struct roffsu *);
1.5 kristaps 53:
1.8 kristaps 54: static int man_alt_pre(MAN_ARGS);
1.4 kristaps 55: static int man_br_pre(MAN_ARGS);
1.8 kristaps 56: static int man_ign_pre(MAN_ARGS);
57: static void man_root_post(MAN_ARGS);
58: static int man_root_pre(MAN_ARGS);
59: static int man_B_pre(MAN_ARGS);
1.6 kristaps 60: static int man_HP_pre(MAN_ARGS);
1.8 kristaps 61: static int man_I_pre(MAN_ARGS);
1.5 kristaps 62: static int man_IP_pre(MAN_ARGS);
1.4 kristaps 63: static int man_PP_pre(MAN_ARGS);
1.9 kristaps 64: static int man_RS_pre(MAN_ARGS);
1.8 kristaps 65: static int man_SB_pre(MAN_ARGS);
1.4 kristaps 66: static int man_SH_pre(MAN_ARGS);
1.8 kristaps 67: static int man_SM_pre(MAN_ARGS);
1.4 kristaps 68: static int man_SS_pre(MAN_ARGS);
69:
70: #ifdef __linux__
71: extern size_t strlcpy(char *, const char *, size_t);
72: extern size_t strlcat(char *, const char *, size_t);
73: #endif
1.3 kristaps 74:
75: static const struct htmlman mans[MAN_MAX] = {
1.4 kristaps 76: { man_br_pre, NULL }, /* br */
1.3 kristaps 77: { NULL, NULL }, /* TH */
1.4 kristaps 78: { man_SH_pre, NULL }, /* SH */
79: { man_SS_pre, NULL }, /* SS */
1.6 kristaps 80: { man_IP_pre, NULL }, /* TP */
1.4 kristaps 81: { man_PP_pre, NULL }, /* LP */
82: { man_PP_pre, NULL }, /* PP */
83: { man_PP_pre, NULL }, /* P */
1.5 kristaps 84: { man_IP_pre, NULL }, /* IP */
1.6 kristaps 85: { man_HP_pre, NULL }, /* HP */
1.8 kristaps 86: { man_SM_pre, NULL }, /* SM */
87: { man_SB_pre, NULL }, /* SB */
88: { man_alt_pre, NULL }, /* BI */
89: { man_alt_pre, NULL }, /* IB */
90: { man_alt_pre, NULL }, /* BR */
91: { man_alt_pre, NULL }, /* RB */
1.3 kristaps 92: { NULL, NULL }, /* R */
1.8 kristaps 93: { man_B_pre, NULL }, /* B */
94: { man_I_pre, NULL }, /* I */
95: { man_alt_pre, NULL }, /* IR */
96: { man_alt_pre, NULL }, /* RI */
1.3 kristaps 97: { NULL, NULL }, /* na */
98: { NULL, NULL }, /* i */
1.4 kristaps 99: { man_br_pre, NULL }, /* sp */
1.3 kristaps 100: { NULL, NULL }, /* nf */
101: { NULL, NULL }, /* fi */
102: { NULL, NULL }, /* r */
103: { NULL, NULL }, /* RE */
1.9 kristaps 104: { man_RS_pre, NULL }, /* RS */
1.8 kristaps 105: { man_ign_pre, NULL }, /* DT */
106: { man_ign_pre, NULL }, /* UC */
1.13 kristaps 107: { man_ign_pre, NULL }, /* PD */
1.3 kristaps 108: };
109:
1.1 kristaps 110:
111: void
112: html_man(void *arg, const struct man *m)
113: {
1.3 kristaps 114: struct html *h;
115: struct tag *t;
116:
117: h = (struct html *)arg;
118:
119: print_gen_doctype(h);
120:
121: t = print_otag(h, TAG_HTML, 0, NULL);
122: print_man(man_meta(m), man_node(m), h);
123: print_tagq(h, t);
124:
125: printf("\n");
126: }
127:
128:
129: static void
130: print_man(MAN_ARGS)
131: {
132: struct tag *t;
133: struct htmlpair tag;
134:
135: t = print_otag(h, TAG_HEAD, 0, NULL);
136:
137: print_man_head(m, n, h);
138: print_tagq(h, t);
139: t = print_otag(h, TAG_BODY, 0, NULL);
140:
141: tag.key = ATTR_CLASS;
142: tag.val = "body";
143: print_otag(h, TAG_DIV, 1, &tag);
144:
1.4 kristaps 145: print_man_nodelist(m, n, h);
1.3 kristaps 146:
147: print_tagq(h, t);
148: }
149:
150:
151: /* ARGSUSED */
152: static void
153: print_man_head(MAN_ARGS)
154: {
155:
156: print_gen_head(h);
157: bufinit(h);
158: buffmt(h, "%s(%d)", m->title, m->msec);
159:
160: print_otag(h, TAG_TITLE, 0, NULL);
161: print_text(h, h->buf);
1.1 kristaps 162: }
1.4 kristaps 163:
164:
165: static void
166: print_man_nodelist(MAN_ARGS)
167: {
168:
169: print_man_node(m, n, h);
170: if (n->next)
171: print_man_nodelist(m, n->next, h);
172: }
173:
174:
175: static void
176: print_man_node(MAN_ARGS)
177: {
178: int child;
179: struct tag *t;
180:
181: child = 1;
1.14 kristaps 182: t = h->tags.head;
1.4 kristaps 183:
184: bufinit(h);
185:
186: switch (n->type) {
187: case (MAN_ROOT):
188: child = man_root_pre(m, n, h);
189: break;
190: case (MAN_TEXT):
191: print_text(h, n->string);
192: break;
193: default:
194: if (mans[n->tok].pre)
195: child = (*mans[n->tok].pre)(m, n, h);
196: break;
197: }
198:
199: if (child && n->child)
200: print_man_nodelist(m, n->child, h);
201:
202: print_stagq(h, t);
203:
204: bufinit(h);
205:
206: switch (n->type) {
207: case (MAN_ROOT):
208: man_root_post(m, n, h);
209: break;
210: case (MAN_TEXT):
211: break;
212: default:
213: if (mans[n->tok].post)
214: (*mans[n->tok].post)(m, n, h);
215: break;
216: }
217: }
218:
219:
1.5 kristaps 220: static int
1.7 kristaps 221: a2width(const struct man_node *n, struct roffsu *su)
1.5 kristaps 222: {
223:
1.6 kristaps 224: if (MAN_TEXT != n->type)
1.7 kristaps 225: return(0);
1.11 kristaps 226: if (a2roffsu(n->string, su, SCALE_BU))
1.7 kristaps 227: return(1);
1.5 kristaps 228:
1.7 kristaps 229: return(0);
1.5 kristaps 230: }
231:
232:
1.4 kristaps 233: /* ARGSUSED */
234: static int
235: man_root_pre(MAN_ARGS)
236: {
1.15 ! kristaps 237: struct htmlpair tag[3];
1.4 kristaps 238: struct tag *t, *tt;
239: char b[BUFSIZ], title[BUFSIZ];
240:
241: b[0] = 0;
242: if (m->vol)
243: (void)strlcat(b, m->vol, BUFSIZ);
244:
245: (void)snprintf(title, BUFSIZ - 1,
246: "%s(%d)", m->title, m->msec);
247:
1.7 kristaps 248: PAIR_CLASS_INIT(&tag[0], "header");
249: bufcat_style(h, "width", "100%");
250: PAIR_STYLE_INIT(&tag[1], h);
1.15 ! kristaps 251: PAIR_SUMMARY_INIT(&tag[2], "header");
! 252:
! 253: t = print_otag(h, TAG_TABLE, 3, tag);
1.4 kristaps 254: tt = print_otag(h, TAG_TR, 0, NULL);
255:
1.7 kristaps 256: bufinit(h);
257: bufcat_style(h, "width", "10%");
258: PAIR_STYLE_INIT(&tag[0], h);
1.4 kristaps 259: print_otag(h, TAG_TD, 1, tag);
260: print_text(h, title);
261: print_stagq(h, tt);
262:
1.7 kristaps 263: bufinit(h);
264: bufcat_style(h, "width", "80%");
265: bufcat_style(h, "white-space", "nowrap");
266: bufcat_style(h, "text-align", "center");
267: PAIR_STYLE_INIT(&tag[0], h);
1.4 kristaps 268: print_otag(h, TAG_TD, 1, tag);
269: print_text(h, b);
270: print_stagq(h, tt);
271:
1.7 kristaps 272: bufinit(h);
273: bufcat_style(h, "width", "10%");
274: bufcat_style(h, "text-align", "right");
275: PAIR_STYLE_INIT(&tag[0], h);
1.4 kristaps 276: print_otag(h, TAG_TD, 1, tag);
277: print_text(h, title);
278: print_tagq(h, t);
279: return(1);
280: }
281:
282:
283: /* ARGSUSED */
284: static void
285: man_root_post(MAN_ARGS)
286: {
1.15 ! kristaps 287: struct htmlpair tag[3];
1.4 kristaps 288: struct tag *t, *tt;
1.12 kristaps 289: char b[DATESIZ];
1.4 kristaps 290:
1.12 kristaps 291: time2a(m->date, b, DATESIZ);
1.4 kristaps 292:
1.7 kristaps 293: PAIR_CLASS_INIT(&tag[0], "footer");
294: bufcat_style(h, "width", "100%");
295: PAIR_STYLE_INIT(&tag[1], h);
1.15 ! kristaps 296: PAIR_SUMMARY_INIT(&tag[2], "footer");
! 297:
! 298: t = print_otag(h, TAG_TABLE, 3, tag);
1.4 kristaps 299: tt = print_otag(h, TAG_TR, 0, NULL);
300:
1.7 kristaps 301: bufinit(h);
302: bufcat_style(h, "width", "50%");
303: PAIR_STYLE_INIT(&tag[0], h);
1.4 kristaps 304: print_otag(h, TAG_TD, 1, tag);
305: print_text(h, b);
306: print_stagq(h, tt);
307:
1.7 kristaps 308: bufinit(h);
309: bufcat_style(h, "width", "50%");
310: bufcat_style(h, "text-align", "right");
311: PAIR_STYLE_INIT(&tag[0], h);
1.4 kristaps 312: print_otag(h, TAG_TD, 1, tag);
313: if (m->source)
314: print_text(h, m->source);
315: print_tagq(h, t);
316: }
317:
318:
319:
320: /* ARGSUSED */
321: static int
322: man_br_pre(MAN_ARGS)
323: {
1.7 kristaps 324: struct roffsu su;
325: struct htmlpair tag;
1.4 kristaps 326:
1.7 kristaps 327: SCALE_VS_INIT(&su, 1);
328:
1.11 kristaps 329: if (MAN_sp == n->tok && n->child)
330: a2roffsu(n->child->string, &su, SCALE_VS);
331: else if (MAN_br == n->tok)
1.7 kristaps 332: su.scale = 0;
1.4 kristaps 333:
1.7 kristaps 334: bufcat_su(h, "height", &su);
335: PAIR_STYLE_INIT(&tag, h);
1.4 kristaps 336: print_otag(h, TAG_DIV, 1, &tag);
1.7 kristaps 337: return(0);
1.4 kristaps 338: }
339:
340:
341: /* ARGSUSED */
342: static int
343: man_SH_pre(MAN_ARGS)
344: {
1.7 kristaps 345: struct htmlpair tag[2];
346: struct roffsu su;
1.4 kristaps 347:
348: if (MAN_BODY == n->type) {
1.7 kristaps 349: SCALE_HS_INIT(&su, INDENT);
350: bufcat_su(h, "margin-left", &su);
351: PAIR_CLASS_INIT(&tag[0], "sec-body");
352: PAIR_STYLE_INIT(&tag[1], h);
1.4 kristaps 353: print_otag(h, TAG_DIV, 2, tag);
354: return(1);
355: } else if (MAN_BLOCK == n->type) {
1.7 kristaps 356: PAIR_CLASS_INIT(&tag[0], "sec-block");
1.4 kristaps 357: if (n->prev && MAN_SH == n->prev->tok)
358: if (NULL == n->prev->body->child) {
359: print_otag(h, TAG_DIV, 1, tag);
360: return(1);
361: }
362:
1.7 kristaps 363: SCALE_VS_INIT(&su, 1);
364: bufcat_su(h, "margin-top", &su);
1.4 kristaps 365: if (NULL == n->next)
1.7 kristaps 366: bufcat_su(h, "margin-bottom", &su);
367: PAIR_STYLE_INIT(&tag[1], h);
1.4 kristaps 368: print_otag(h, TAG_DIV, 2, tag);
369: return(1);
370: }
371:
1.7 kristaps 372: PAIR_CLASS_INIT(&tag[0], "sec-head");
1.4 kristaps 373: print_otag(h, TAG_DIV, 1, tag);
374: return(1);
375: }
376:
377:
378: /* ARGSUSED */
379: static int
1.8 kristaps 380: man_alt_pre(MAN_ARGS)
381: {
382: const struct man_node *nn;
383: struct tag *t;
384: int i;
385: struct htmlpair tagi, tagb, *tagp;
386:
387: PAIR_CLASS_INIT(&tagi, "italic");
388: PAIR_CLASS_INIT(&tagb, "bold");
389:
390: for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
391: switch (n->tok) {
392: case (MAN_BI):
393: tagp = i % 2 ? &tagi : &tagb;
394: break;
395: case (MAN_IB):
396: tagp = i % 2 ? &tagb : &tagi;
397: break;
398: case (MAN_RI):
399: tagp = i % 2 ? &tagi : NULL;
400: break;
401: case (MAN_IR):
402: tagp = i % 2 ? NULL : &tagi;
403: break;
404: case (MAN_BR):
405: tagp = i % 2 ? NULL : &tagb;
406: break;
407: case (MAN_RB):
408: tagp = i % 2 ? &tagb : NULL;
409: break;
410: default:
411: abort();
412: /* NOTREACHED */
413: }
414:
415: if (i)
416: h->flags |= HTML_NOSPACE;
417:
418: if (tagp) {
419: t = print_otag(h, TAG_SPAN, 1, tagp);
420: print_man_node(m, nn, h);
421: print_tagq(h, t);
422: } else
423: print_man_node(m, nn, h);
424: }
425:
426: return(0);
427: }
428:
429:
430: /* ARGSUSED */
431: static int
432: man_SB_pre(MAN_ARGS)
433: {
434: struct htmlpair tag;
435:
436: PAIR_CLASS_INIT(&tag, "small bold");
437: print_otag(h, TAG_SPAN, 1, &tag);
438: return(1);
439: }
440:
441:
442: /* ARGSUSED */
443: static int
444: man_SM_pre(MAN_ARGS)
445: {
446: struct htmlpair tag;
447:
448: PAIR_CLASS_INIT(&tag, "small");
449: print_otag(h, TAG_SPAN, 1, &tag);
450: return(1);
451: }
452:
453:
454: /* ARGSUSED */
455: static int
1.4 kristaps 456: man_SS_pre(MAN_ARGS)
457: {
458: struct htmlpair tag[3];
1.7 kristaps 459: struct roffsu su;
1.4 kristaps 460:
1.7 kristaps 461: SCALE_VS_INIT(&su, 1);
1.4 kristaps 462:
463: if (MAN_BODY == n->type) {
1.7 kristaps 464: PAIR_CLASS_INIT(&tag[0], "ssec-body");
1.4 kristaps 465: if (n->parent->next && n->child) {
1.7 kristaps 466: bufcat_su(h, "margin-bottom", &su);
467: PAIR_STYLE_INIT(&tag[1], h);
468: print_otag(h, TAG_DIV, 2, tag);
469: return(1);
1.4 kristaps 470: }
471:
1.7 kristaps 472: print_otag(h, TAG_DIV, 1, tag);
1.4 kristaps 473: return(1);
474: } else if (MAN_BLOCK == n->type) {
1.7 kristaps 475: PAIR_CLASS_INIT(&tag[0], "ssec-block");
1.4 kristaps 476: if (n->prev && MAN_SS == n->prev->tok)
477: if (n->prev->body->child) {
1.7 kristaps 478: bufcat_su(h, "margin-top", &su);
479: PAIR_STYLE_INIT(&tag[1], h);
480: print_otag(h, TAG_DIV, 2, tag);
481: return(1);
1.4 kristaps 482: }
483:
1.7 kristaps 484: print_otag(h, TAG_DIV, 1, tag);
1.4 kristaps 485: return(1);
486: }
487:
1.7 kristaps 488: SCALE_HS_INIT(&su, INDENT - HALFINDENT);
489: bufcat_su(h, "margin-left", &su);
490: PAIR_CLASS_INIT(&tag[0], "ssec-head");
491: PAIR_STYLE_INIT(&tag[1], h);
1.4 kristaps 492: print_otag(h, TAG_DIV, 2, tag);
493: return(1);
494: }
495:
496:
497: /* ARGSUSED */
498: static int
499: man_PP_pre(MAN_ARGS)
500: {
1.5 kristaps 501: struct htmlpair tag;
1.7 kristaps 502: struct roffsu su;
1.5 kristaps 503: int i;
1.4 kristaps 504:
505: if (MAN_BLOCK != n->type)
506: return(1);
507:
1.5 kristaps 508: i = 0;
509:
510: if (MAN_ROOT == n->parent->tok) {
1.7 kristaps 511: SCALE_HS_INIT(&su, INDENT);
512: bufcat_su(h, "margin-left", &su);
513: i++;
1.5 kristaps 514: }
515: if (n->next && n->next->child) {
1.7 kristaps 516: SCALE_VS_INIT(&su, 1);
517: bufcat_su(h, "margin-bottom", &su);
518: i++;
1.5 kristaps 519: }
1.4 kristaps 520:
1.7 kristaps 521: PAIR_STYLE_INIT(&tag, h);
522: print_otag(h, TAG_DIV, i ? 1 : 0, &tag);
1.5 kristaps 523: return(1);
524: }
525:
526:
527: /* ARGSUSED */
528: static int
529: man_IP_pre(MAN_ARGS)
530: {
1.7 kristaps 531: struct roffsu su;
1.5 kristaps 532: struct htmlpair tag;
533: const struct man_node *nn;
1.7 kristaps 534: int width;
1.5 kristaps 535:
1.7 kristaps 536: /*
537: * This scattering of 1-BU margins and pads is to make sure that
538: * when text overruns its box, the subsequent text isn't flush
539: * up against it. However, the rest of the right-hand box must
540: * also be adjusted in consideration of this 1-BU space.
541: */
542:
543: if (MAN_BODY == n->type) {
544: SCALE_HS_INIT(&su, INDENT);
545: bufcat_su(h, "margin-left", &su);
546: PAIR_STYLE_INIT(&tag, h);
547: print_otag(h, TAG_DIV, 1, &tag);
1.6 kristaps 548: return(1);
549: }
550:
551: nn = MAN_BLOCK == n->type ?
552: n->head->child : n->parent->head->child;
553:
1.7 kristaps 554: SCALE_HS_INIT(&su, INDENT);
555: width = 0;
1.6 kristaps 556:
1.7 kristaps 557: if (MAN_IP == n->tok && NULL != nn)
1.5 kristaps 558: if (NULL != (nn = nn->next)) {
559: for ( ; nn->next; nn = nn->next)
560: /* Do nothing. */ ;
1.7 kristaps 561: width = a2width(nn, &su);
1.5 kristaps 562: }
563:
1.7 kristaps 564: if (MAN_TP == n->tok && NULL != nn)
565: width = a2width(nn, &su);
566:
1.5 kristaps 567: if (MAN_BLOCK == n->type) {
1.7 kristaps 568: bufcat_su(h, "margin-left", &su);
1.9 kristaps 569: SCALE_VS_INIT(&su, 1);
570: bufcat_su(h, "margin-top", &su);
1.7 kristaps 571: bufcat_style(h, "clear", "both");
572: PAIR_STYLE_INIT(&tag, h);
1.5 kristaps 573: print_otag(h, TAG_DIV, 1, &tag);
574: return(1);
1.6 kristaps 575: }
576:
1.7 kristaps 577: bufcat_su(h, "min-width", &su);
578: SCALE_INVERT(&su);
579: bufcat_su(h, "margin-left", &su);
580: SCALE_HS_INIT(&su, 1);
581: bufcat_su(h, "margin-right", &su);
582: bufcat_style(h, "clear", "left");
1.6 kristaps 583:
584: if (n->next && n->next->child)
1.7 kristaps 585: bufcat_style(h, "float", "left");
1.6 kristaps 586:
1.7 kristaps 587: PAIR_STYLE_INIT(&tag, h);
1.6 kristaps 588: print_otag(h, TAG_DIV, 1, &tag);
589:
1.7 kristaps 590: /* With a length string, manually omit the last child. */
591:
592: if ( ! width)
1.6 kristaps 593: return(1);
594:
1.7 kristaps 595: if (MAN_IP == n->tok)
596: for (nn = n->child; nn->next; nn = nn->next)
597: print_man_node(m, nn, h);
598: if (MAN_TP == n->tok)
599: for (nn = n->child->next; nn; nn = nn->next)
600: print_man_node(m, nn, h);
1.6 kristaps 601:
602: return(0);
603: }
604:
605:
606: /* ARGSUSED */
607: static int
608: man_HP_pre(MAN_ARGS)
609: {
610: const struct man_node *nn;
611: struct htmlpair tag;
1.7 kristaps 612: struct roffsu su;
1.6 kristaps 613:
614: if (MAN_HEAD == n->type)
615: return(0);
616:
617: nn = MAN_BLOCK == n->type ?
618: n->head->child : n->parent->head->child;
619:
1.7 kristaps 620: SCALE_HS_INIT(&su, INDENT);
1.6 kristaps 621:
622: if (NULL != nn)
1.7 kristaps 623: (void)a2width(nn, &su);
1.6 kristaps 624:
625: if (MAN_BLOCK == n->type) {
1.7 kristaps 626: bufcat_su(h, "margin-left", &su);
1.9 kristaps 627: SCALE_VS_INIT(&su, 1);
628: bufcat_su(h, "margin-top", &su);
1.7 kristaps 629: bufcat_style(h, "clear", "both");
630: PAIR_STYLE_INIT(&tag, h);
1.5 kristaps 631: print_otag(h, TAG_DIV, 1, &tag);
1.6 kristaps 632: return(1);
633: }
1.5 kristaps 634:
1.7 kristaps 635: bufcat_su(h, "margin-left", &su);
636: SCALE_INVERT(&su);
637: bufcat_su(h, "text-indent", &su);
1.5 kristaps 638:
1.7 kristaps 639: PAIR_STYLE_INIT(&tag, h);
1.6 kristaps 640: print_otag(h, TAG_DIV, 1, &tag);
1.4 kristaps 641: return(1);
642: }
1.6 kristaps 643:
1.8 kristaps 644:
645: /* ARGSUSED */
646: static int
647: man_B_pre(MAN_ARGS)
648: {
649: struct htmlpair tag;
650:
651: PAIR_CLASS_INIT(&tag, "bold");
652: print_otag(h, TAG_SPAN, 1, &tag);
653: return(1);
654: }
655:
656:
657: /* ARGSUSED */
658: static int
659: man_I_pre(MAN_ARGS)
660: {
661: struct htmlpair tag;
662:
663: PAIR_CLASS_INIT(&tag, "italic");
664: print_otag(h, TAG_SPAN, 1, &tag);
665: return(1);
666: }
667:
668:
669: /* ARGSUSED */
670: static int
671: man_ign_pre(MAN_ARGS)
672: {
673:
674: return(0);
675: }
1.9 kristaps 676:
677:
678: /* ARGSUSED */
679: static int
680: man_RS_pre(MAN_ARGS)
681: {
682: struct htmlpair tag;
683: struct roffsu su;
684:
685: if (MAN_HEAD == n->type)
686: return(0);
687: else if (MAN_BODY == n->type)
688: return(1);
689:
690: SCALE_HS_INIT(&su, INDENT);
691: bufcat_su(h, "margin-left", &su);
692:
693: if (n->head->child) {
694: SCALE_VS_INIT(&su, 1);
695: a2width(n->head->child, &su);
696: bufcat_su(h, "margin-top", &su);
697: }
698:
699: PAIR_STYLE_INIT(&tag, h);
700: print_otag(h, TAG_DIV, 1, &tag);
701: return(1);
702: }
CVSweb