[BACK]Return to man_html.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mandoc

Annotation of src/usr.bin/mandoc/man_html.c, Revision 1.118

1.118   ! schwarze    1: /*     $OpenBSD: man_html.c,v 1.117 2019/01/05 09:46:26 schwarze Exp $ */
1.1       schwarze    2: /*
1.56      schwarze    3:  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
1.116     schwarze    4:  * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
1.1       schwarze    5:  *
                      6:  * Permission to use, copy, modify, and distribute this software for any
                      7:  * purpose with or without fee is hereby granted, provided that the above
                      8:  * copyright notice and this permission notice appear in all copies.
                      9:  *
1.66      schwarze   10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
1.1       schwarze   11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1.66      schwarze   12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
1.1       schwarze   13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     17:  */
                     18: #include <sys/types.h>
                     19:
                     20: #include <assert.h>
                     21: #include <ctype.h>
                     22: #include <stdio.h>
                     23: #include <stdlib.h>
                     24: #include <string.h>
                     25:
1.53      schwarze   26: #include "mandoc_aux.h"
1.113     schwarze   27: #include "mandoc.h"
1.66      schwarze   28: #include "roff.h"
1.58      schwarze   29: #include "man.h"
1.1       schwarze   30: #include "out.h"
                     31: #include "html.h"
                     32: #include "main.h"
                     33:
1.68      schwarze   34: #define        MAN_ARGS          const struct roff_meta *man, \
1.67      schwarze   35:                          const struct roff_node *n, \
1.1       schwarze   36:                          struct html *h
                     37:
1.108     schwarze   38: struct man_html_act {
1.1       schwarze   39:        int             (*pre)(MAN_ARGS);
                     40:        int             (*post)(MAN_ARGS);
                     41: };
                     42:
1.52      schwarze   43: static void              print_bvspace(struct html *,
1.67      schwarze   44:                                const struct roff_node *);
1.100     schwarze   45: static void              print_man_head(const struct roff_meta *,
                     46:                                struct html *);
1.1       schwarze   47: static void              print_man_nodelist(MAN_ARGS);
                     48: static void              print_man_node(MAN_ARGS);
                     49: static int               man_B_pre(MAN_ARGS);
                     50: static int               man_HP_pre(MAN_ARGS);
1.46      schwarze   51: static int               man_IP_pre(MAN_ARGS);
1.1       schwarze   52: static int               man_I_pre(MAN_ARGS);
1.46      schwarze   53: static int               man_OP_pre(MAN_ARGS);
1.1       schwarze   54: static int               man_PP_pre(MAN_ARGS);
                     55: static int               man_RS_pre(MAN_ARGS);
                     56: static int               man_SH_pre(MAN_ARGS);
                     57: static int               man_SM_pre(MAN_ARGS);
                     58: static int               man_SS_pre(MAN_ARGS);
1.109     schwarze   59: static int               man_SY_pre(MAN_ARGS);
1.49      schwarze   60: static int               man_UR_pre(MAN_ARGS);
1.111     schwarze   61: static int               man_abort_pre(MAN_ARGS);
1.46      schwarze   62: static int               man_alt_pre(MAN_ARGS);
                     63: static int               man_ign_pre(MAN_ARGS);
                     64: static int               man_in_pre(MAN_ARGS);
1.100     schwarze   65: static void              man_root_post(const struct roff_meta *,
                     66:                                struct html *);
                     67: static void              man_root_pre(const struct roff_meta *,
                     68:                                struct html *);
1.1       schwarze   69:
1.108     schwarze   70: static const struct man_html_act man_html_acts[MAN_MAX - MAN_TH] = {
1.1       schwarze   71:        { NULL, NULL }, /* TH */
                     72:        { man_SH_pre, NULL }, /* SH */
                     73:        { man_SS_pre, NULL }, /* SS */
                     74:        { man_IP_pre, NULL }, /* TP */
1.107     schwarze   75:        { man_IP_pre, NULL }, /* TQ */
1.111     schwarze   76:        { man_abort_pre, NULL }, /* LP */
1.1       schwarze   77:        { man_PP_pre, NULL }, /* PP */
1.111     schwarze   78:        { man_abort_pre, NULL }, /* P */
1.1       schwarze   79:        { man_IP_pre, NULL }, /* IP */
1.52      schwarze   80:        { man_HP_pre, NULL }, /* HP */
1.1       schwarze   81:        { man_SM_pre, NULL }, /* SM */
1.26      schwarze   82:        { man_SM_pre, NULL }, /* SB */
1.1       schwarze   83:        { man_alt_pre, NULL }, /* BI */
                     84:        { man_alt_pre, NULL }, /* IB */
                     85:        { man_alt_pre, NULL }, /* BR */
                     86:        { man_alt_pre, NULL }, /* RB */
                     87:        { NULL, NULL }, /* R */
                     88:        { man_B_pre, NULL }, /* B */
                     89:        { man_I_pre, NULL }, /* I */
                     90:        { man_alt_pre, NULL }, /* IR */
                     91:        { man_alt_pre, NULL }, /* RI */
                     92:        { NULL, NULL }, /* RE */
                     93:        { man_RS_pre, NULL }, /* RS */
                     94:        { man_ign_pre, NULL }, /* DT */
                     95:        { man_ign_pre, NULL }, /* UC */
1.2       schwarze   96:        { man_ign_pre, NULL }, /* PD */
1.13      schwarze   97:        { man_ign_pre, NULL }, /* AT */
1.18      schwarze   98:        { man_in_pre, NULL }, /* in */
1.109     schwarze   99:        { man_SY_pre, NULL }, /* SY */
                    100:        { NULL, NULL }, /* YS */
1.46      schwarze  101:        { man_OP_pre, NULL }, /* OP */
1.85      schwarze  102:        { NULL, NULL }, /* EX */
                    103:        { NULL, NULL }, /* EE */
1.49      schwarze  104:        { man_UR_pre, NULL }, /* UR */
                    105:        { NULL, NULL }, /* UE */
1.98      bentley   106:        { man_UR_pre, NULL }, /* MT */
                    107:        { NULL, NULL }, /* ME */
1.1       schwarze  108: };
                    109:
1.52      schwarze  110:
1.39      schwarze  111: /*
                    112:  * Printing leading vertical space before a block.
                    113:  * This is used for the paragraph macros.
                    114:  * The rules are pretty simple, since there's very little nesting going
                    115:  * on here.  Basically, if we're the first within another block (SS/SH),
                    116:  * then don't emit vertical space.  If we are (RS), then do.  If not the
                    117:  * first, print it.
                    118:  */
                    119: static void
1.67      schwarze  120: print_bvspace(struct html *h, const struct roff_node *n)
1.39      schwarze  121: {
1.117     schwarze  122:        if (n->body != NULL && n->body->child != NULL &&
                    123:            n->body->child->type == ROFFT_TBL)
                    124:                return;
1.39      schwarze  125:
1.117     schwarze  126:        if (n->prev == NULL && n->parent->tok != MAN_RS)
                    127:                return;
1.39      schwarze  128:
1.56      schwarze  129:        print_paragraph(h);
1.39      schwarze  130: }
1.1       schwarze  131:
                    132: void
1.114     schwarze  133: html_man(void *arg, const struct roff_meta *man)
1.1       schwarze  134: {
1.100     schwarze  135:        struct html             *h;
                    136:        struct roff_node        *n;
                    137:        struct tag              *t;
1.43      schwarze  138:
1.70      schwarze  139:        h = (struct html *)arg;
1.100     schwarze  140:        n = man->first->child;
1.1       schwarze  141:
1.79      schwarze  142:        if ((h->oflags & HTML_FRAGMENT) == 0) {
1.43      schwarze  143:                print_gen_decls(h);
1.79      schwarze  144:                print_otag(h, TAG_HTML, "");
1.100     schwarze  145:                if (n->type == ROFFT_COMMENT)
                    146:                        print_gen_comment(h, n);
1.79      schwarze  147:                t = print_otag(h, TAG_HEAD, "");
1.114     schwarze  148:                print_man_head(man, h);
1.79      schwarze  149:                print_tagq(h, t);
1.75      schwarze  150:                print_otag(h, TAG_BODY, "");
1.79      schwarze  151:        }
1.25      schwarze  152:
1.114     schwarze  153:        man_root_pre(man, h);
1.80      schwarze  154:        t = print_otag(h, TAG_DIV, "c", "manual-text");
1.114     schwarze  155:        print_man_nodelist(man, n, h);
1.80      schwarze  156:        print_tagq(h, t);
1.114     schwarze  157:        man_root_post(man, h);
1.79      schwarze  158:        print_tagq(h, NULL);
1.1       schwarze  159: }
                    160:
                    161: static void
1.100     schwarze  162: print_man_head(const struct roff_meta *man, struct html *h)
1.1       schwarze  163: {
1.76      schwarze  164:        char    *cp;
1.1       schwarze  165:
                    166:        print_gen_head(h);
1.76      schwarze  167:        mandoc_asprintf(&cp, "%s(%s)", man->title, man->msec);
1.75      schwarze  168:        print_otag(h, TAG_TITLE, "");
1.76      schwarze  169:        print_text(h, cp);
                    170:        free(cp);
1.1       schwarze  171: }
                    172:
                    173: static void
                    174: print_man_nodelist(MAN_ARGS)
                    175: {
1.63      schwarze  176:        while (n != NULL) {
1.85      schwarze  177:                print_man_node(man, n, h);
1.63      schwarze  178:                n = n->next;
                    179:        }
1.1       schwarze  180: }
                    181:
                    182: static void
                    183: print_man_node(MAN_ARGS)
                    184: {
1.85      schwarze  185:        struct tag      *t;
1.1       schwarze  186:        int              child;
                    187:
1.116     schwarze  188:        html_fillmode(h, n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi);
1.85      schwarze  189:
                    190:        child = 1;
                    191:        switch (n->type) {
                    192:        case ROFFT_TEXT:
1.116     schwarze  193:                if (*n->string == '\0') {
                    194:                        print_endline(h);
                    195:                        return;
                    196:                }
1.85      schwarze  197:                t = h->tag;
1.116     schwarze  198:                if (*n->string == ' ' && n->flags & NODE_LINE &&
                    199:                    (h->flags & HTML_NONEWLINE) == 0)
                    200:                        print_endline(h);
                    201:                else if (n->flags & NODE_DELIMC)
                    202:                        h->flags |= HTML_NOSPACE;
1.1       schwarze  203:                print_text(h, n->string);
1.83      schwarze  204:                break;
1.116     schwarze  205:        case ROFFT_COMMENT:
                    206:                return;
1.66      schwarze  207:        case ROFFT_EQN:
1.85      schwarze  208:                t = h->tag;
1.41      schwarze  209:                print_eqn(h, n->eqn);
1.37      schwarze  210:                break;
1.66      schwarze  211:        case ROFFT_TBL:
1.33      schwarze  212:                /*
                    213:                 * This will take care of initialising all of the table
                    214:                 * state data for the first table, then tearing it down
                    215:                 * for the last one.
                    216:                 */
1.29      schwarze  217:                print_tbl(h, n->span);
1.32      schwarze  218:                return;
1.1       schwarze  219:        default:
1.52      schwarze  220:                /*
1.4       schwarze  221:                 * Close out scope of font prior to opening a macro
1.33      schwarze  222:                 * scope.
1.4       schwarze  223:                 */
1.27      schwarze  224:                if (HTMLFONT_NONE != h->metac) {
                    225:                        h->metal = h->metac;
                    226:                        h->metac = HTMLFONT_NONE;
1.33      schwarze  227:                }
                    228:
                    229:                /*
                    230:                 * Close out the current table, if it's open, and unset
                    231:                 * the "meta" table state.  This will be reopened on the
                    232:                 * next table element.
                    233:                 */
1.117     schwarze  234:                if (h->tblt != NULL)
1.33      schwarze  235:                        print_tblclose(h);
1.85      schwarze  236:
                    237:                t = h->tag;
1.90      schwarze  238:                if (n->tok < ROFF_MAX) {
1.91      schwarze  239:                        roff_html_pre(h, n);
1.116     schwarze  240:                        print_stagq(h, t);
                    241:                        return;
1.90      schwarze  242:                }
                    243:
                    244:                assert(n->tok >= MAN_TH && n->tok < MAN_MAX);
1.108     schwarze  245:                if (man_html_acts[n->tok - MAN_TH].pre != NULL)
                    246:                        child = (*man_html_acts[n->tok - MAN_TH].pre)(man,
                    247:                            n, h);
1.1       schwarze  248:                break;
                    249:        }
                    250:
1.117     schwarze  251:        if (child && n->child != NULL)
1.85      schwarze  252:                print_man_nodelist(man, n->child, h);
1.1       schwarze  253:
1.4       schwarze  254:        /* This will automatically close out any font scope. */
1.85      schwarze  255:        print_stagq(h, t);
                    256:
1.118   ! schwarze  257:        if (n->flags & NODE_NOFILL && n->tok != MAN_YS &&
        !           258:            (n->next != NULL && n->next->flags & NODE_LINE)) {
1.110     schwarze  259:                /* In .nf = <pre>, print even empty lines. */
                    260:                h->col++;
1.85      schwarze  261:                print_endline(h);
1.110     schwarze  262:        }
1.1       schwarze  263: }
                    264:
1.38      schwarze  265: static void
1.100     schwarze  266: man_root_pre(const struct roff_meta *man, struct html *h)
1.1       schwarze  267: {
                    268:        struct tag      *t, *tt;
1.53      schwarze  269:        char            *title;
1.1       schwarze  270:
1.48      schwarze  271:        assert(man->title);
                    272:        assert(man->msec);
1.53      schwarze  273:        mandoc_asprintf(&title, "%s(%s)", man->title, man->msec);
1.1       schwarze  274:
1.75      schwarze  275:        t = print_otag(h, TAG_TABLE, "c", "head");
                    276:        tt = print_otag(h, TAG_TR, "");
1.1       schwarze  277:
1.75      schwarze  278:        print_otag(h, TAG_TD, "c", "head-ltitle");
1.1       schwarze  279:        print_text(h, title);
                    280:        print_stagq(h, tt);
                    281:
1.75      schwarze  282:        print_otag(h, TAG_TD, "c", "head-vol");
1.117     schwarze  283:        if (man->vol != NULL)
1.54      schwarze  284:                print_text(h, man->vol);
1.1       schwarze  285:        print_stagq(h, tt);
                    286:
1.75      schwarze  287:        print_otag(h, TAG_TD, "c", "head-rtitle");
1.1       schwarze  288:        print_text(h, title);
                    289:        print_tagq(h, t);
1.53      schwarze  290:        free(title);
1.1       schwarze  291: }
                    292:
                    293: static void
1.100     schwarze  294: man_root_post(const struct roff_meta *man, struct html *h)
1.1       schwarze  295: {
                    296:        struct tag      *t, *tt;
                    297:
1.75      schwarze  298:        t = print_otag(h, TAG_TABLE, "c", "foot");
                    299:        tt = print_otag(h, TAG_TR, "");
1.25      schwarze  300:
1.75      schwarze  301:        print_otag(h, TAG_TD, "c", "foot-date");
1.48      schwarze  302:        print_text(h, man->date);
1.1       schwarze  303:        print_stagq(h, tt);
                    304:
1.75      schwarze  305:        print_otag(h, TAG_TD, "c", "foot-os");
1.117     schwarze  306:        if (man->os != NULL)
1.68      schwarze  307:                print_text(h, man->os);
1.1       schwarze  308:        print_tagq(h, t);
                    309: }
                    310:
                    311: static int
                    312: man_SH_pre(MAN_ARGS)
                    313: {
1.87      schwarze  314:        char    *id;
                    315:
                    316:        if (n->type == ROFFT_HEAD) {
1.103     schwarze  317:                id = html_make_id(n, 1);
1.87      schwarze  318:                print_otag(h, TAG_H1, "cTi", "Sh", id);
1.88      schwarze  319:                if (id != NULL)
1.101     schwarze  320:                        print_otag(h, TAG_A, "chR", "permalink", id);
1.87      schwarze  321:        }
1.72      schwarze  322:        return 1;
1.1       schwarze  323: }
                    324:
                    325: static int
                    326: man_alt_pre(MAN_ARGS)
                    327: {
1.67      schwarze  328:        const struct roff_node  *nn;
1.117     schwarze  329:        struct tag      *t;
1.83      schwarze  330:        int              i;
1.27      schwarze  331:        enum htmltag     fp;
1.1       schwarze  332:
1.117     schwarze  333:        for (i = 0, nn = n->child; nn != NULL; nn = nn->next, i++) {
1.1       schwarze  334:                switch (n->tok) {
1.52      schwarze  335:                case MAN_BI:
1.27      schwarze  336:                        fp = i % 2 ? TAG_I : TAG_B;
1.1       schwarze  337:                        break;
1.52      schwarze  338:                case MAN_IB:
1.27      schwarze  339:                        fp = i % 2 ? TAG_B : TAG_I;
1.1       schwarze  340:                        break;
1.52      schwarze  341:                case MAN_RI:
1.27      schwarze  342:                        fp = i % 2 ? TAG_I : TAG_MAX;
1.1       schwarze  343:                        break;
1.52      schwarze  344:                case MAN_IR:
1.27      schwarze  345:                        fp = i % 2 ? TAG_MAX : TAG_I;
1.1       schwarze  346:                        break;
1.52      schwarze  347:                case MAN_BR:
1.27      schwarze  348:                        fp = i % 2 ? TAG_MAX : TAG_B;
1.1       schwarze  349:                        break;
1.52      schwarze  350:                case MAN_RB:
1.27      schwarze  351:                        fp = i % 2 ? TAG_B : TAG_MAX;
1.1       schwarze  352:                        break;
                    353:                default:
                    354:                        abort();
                    355:                }
                    356:
                    357:                if (i)
                    358:                        h->flags |= HTML_NOSPACE;
                    359:
1.83      schwarze  360:                if (fp != TAG_MAX)
1.75      schwarze  361:                        t = print_otag(h, fp, "");
1.27      schwarze  362:
1.83      schwarze  363:                print_text(h, nn->string);
1.27      schwarze  364:
1.83      schwarze  365:                if (fp != TAG_MAX)
1.27      schwarze  366:                        print_tagq(h, t);
1.1       schwarze  367:        }
1.72      schwarze  368:        return 0;
1.1       schwarze  369: }
                    370:
                    371: static int
1.26      schwarze  372: man_SM_pre(MAN_ARGS)
1.1       schwarze  373: {
1.75      schwarze  374:        print_otag(h, TAG_SMALL, "");
1.117     schwarze  375:        if (n->tok == MAN_SB)
1.75      schwarze  376:                print_otag(h, TAG_B, "");
1.72      schwarze  377:        return 1;
1.1       schwarze  378: }
                    379:
                    380: static int
                    381: man_SS_pre(MAN_ARGS)
                    382: {
1.87      schwarze  383:        char    *id;
                    384:
                    385:        if (n->type == ROFFT_HEAD) {
1.103     schwarze  386:                id = html_make_id(n, 1);
1.87      schwarze  387:                print_otag(h, TAG_H2, "cTi", "Ss", id);
1.88      schwarze  388:                if (id != NULL)
1.101     schwarze  389:                        print_otag(h, TAG_A, "chR", "permalink", id);
1.87      schwarze  390:        }
1.72      schwarze  391:        return 1;
1.1       schwarze  392: }
                    393:
                    394: static int
                    395: man_PP_pre(MAN_ARGS)
                    396: {
1.66      schwarze  397:        if (n->type == ROFFT_HEAD)
1.72      schwarze  398:                return 0;
1.66      schwarze  399:        else if (n->type == ROFFT_BLOCK)
1.39      schwarze  400:                print_bvspace(h, n);
1.22      schwarze  401:
1.72      schwarze  402:        return 1;
1.1       schwarze  403: }
                    404:
                    405: static int
                    406: man_IP_pre(MAN_ARGS)
                    407: {
1.67      schwarze  408:        const struct roff_node  *nn;
1.1       schwarze  409:
1.66      schwarze  410:        if (n->type == ROFFT_BODY) {
1.102     schwarze  411:                print_otag(h, TAG_DD, "");
1.72      schwarze  412:                return 1;
1.66      schwarze  413:        } else if (n->type != ROFFT_HEAD) {
1.82      schwarze  414:                print_otag(h, TAG_DL, "c", "Bl-tag");
1.72      schwarze  415:                return 1;
1.1       schwarze  416:        }
                    417:
1.102     schwarze  418:        print_otag(h, TAG_DT, "");
1.1       schwarze  419:
1.107     schwarze  420:        switch(n->tok) {
                    421:        case MAN_IP:  /* Only print the first header element. */
                    422:                if (n->child != NULL)
                    423:                        print_man_node(man, n->child, h);
                    424:                break;
                    425:        case MAN_TP:  /* Only print next-line header elements. */
                    426:        case MAN_TQ:
1.50      schwarze  427:                nn = n->child;
1.107     schwarze  428:                while (nn != NULL && (NODE_LINE & nn->flags) == 0)
1.50      schwarze  429:                        nn = nn->next;
1.107     schwarze  430:                while (nn != NULL) {
1.85      schwarze  431:                        print_man_node(man, nn, h);
1.50      schwarze  432:                        nn = nn->next;
                    433:                }
1.107     schwarze  434:                break;
                    435:        default:
                    436:                abort();
1.50      schwarze  437:        }
1.72      schwarze  438:        return 0;
1.1       schwarze  439: }
                    440:
                    441: static int
                    442: man_HP_pre(MAN_ARGS)
                    443: {
1.66      schwarze  444:        if (n->type == ROFFT_HEAD)
1.72      schwarze  445:                return 0;
1.38      schwarze  446:
1.104     schwarze  447:        if (n->type == ROFFT_BLOCK) {
                    448:                print_bvspace(h, n);
                    449:                print_otag(h, TAG_DIV, "c", "HP");
                    450:        }
1.72      schwarze  451:        return 1;
1.1       schwarze  452: }
1.46      schwarze  453:
                    454: static int
                    455: man_OP_pre(MAN_ARGS)
                    456: {
                    457:        struct tag      *tt;
                    458:
                    459:        print_text(h, "[");
                    460:        h->flags |= HTML_NOSPACE;
1.81      schwarze  461:        tt = print_otag(h, TAG_SPAN, "c", "Op");
1.46      schwarze  462:
1.117     schwarze  463:        if ((n = n->child) != NULL) {
1.75      schwarze  464:                print_otag(h, TAG_B, "");
1.46      schwarze  465:                print_text(h, n->string);
                    466:        }
                    467:
                    468:        print_stagq(h, tt);
                    469:
1.117     schwarze  470:        if (n != NULL && n->next != NULL) {
1.75      schwarze  471:                print_otag(h, TAG_I, "");
1.46      schwarze  472:                print_text(h, n->next->string);
                    473:        }
                    474:
                    475:        print_stagq(h, tt);
                    476:        h->flags |= HTML_NOSPACE;
                    477:        print_text(h, "]");
1.72      schwarze  478:        return 0;
1.46      schwarze  479: }
                    480:
1.1       schwarze  481: static int
                    482: man_B_pre(MAN_ARGS)
                    483: {
1.75      schwarze  484:        print_otag(h, TAG_B, "");
1.72      schwarze  485:        return 1;
1.1       schwarze  486: }
                    487:
                    488: static int
                    489: man_I_pre(MAN_ARGS)
                    490: {
1.75      schwarze  491:        print_otag(h, TAG_I, "");
1.72      schwarze  492:        return 1;
1.18      schwarze  493: }
                    494:
                    495: static int
                    496: man_in_pre(MAN_ARGS)
                    497: {
1.75      schwarze  498:        print_otag(h, TAG_BR, "");
1.72      schwarze  499:        return 0;
1.1       schwarze  500: }
                    501:
                    502: static int
                    503: man_ign_pre(MAN_ARGS)
                    504: {
1.72      schwarze  505:        return 0;
1.1       schwarze  506: }
                    507:
                    508: static int
                    509: man_RS_pre(MAN_ARGS)
                    510: {
1.66      schwarze  511:        if (n->type == ROFFT_HEAD)
1.72      schwarze  512:                return 0;
1.105     schwarze  513:        if (n->type == ROFFT_BLOCK)
                    514:                print_otag(h, TAG_DIV, "c", "Bd-indent");
1.109     schwarze  515:        return 1;
                    516: }
                    517:
                    518: static int
                    519: man_SY_pre(MAN_ARGS)
                    520: {
                    521:        switch (n->type) {
                    522:        case ROFFT_BLOCK:
                    523:                print_otag(h, TAG_TABLE, "c", "Nm");
                    524:                print_otag(h, TAG_TR, "");
                    525:                break;
                    526:        case ROFFT_HEAD:
                    527:                print_otag(h, TAG_TD, "");
                    528:                print_otag(h, TAG_CODE, "cT", "Nm");
                    529:                break;
                    530:        case ROFFT_BODY:
                    531:                print_otag(h, TAG_TD, "");
                    532:                break;
                    533:        default:
                    534:                abort();
                    535:        }
1.72      schwarze  536:        return 1;
1.49      schwarze  537: }
                    538:
                    539: static int
                    540: man_UR_pre(MAN_ARGS)
                    541: {
1.98      bentley   542:        char *cp;
1.117     schwarze  543:
1.49      schwarze  544:        n = n->child;
1.66      schwarze  545:        assert(n->type == ROFFT_HEAD);
1.73      schwarze  546:        if (n->child != NULL) {
1.66      schwarze  547:                assert(n->child->type == ROFFT_TEXT);
1.98      bentley   548:                if (n->tok == MAN_MT) {
                    549:                        mandoc_asprintf(&cp, "mailto:%s", n->child->string);
                    550:                        print_otag(h, TAG_A, "cTh", "Mt", cp);
                    551:                        free(cp);
                    552:                } else
                    553:                        print_otag(h, TAG_A, "cTh", "Lk", n->child->string);
1.49      schwarze  554:        }
                    555:
1.66      schwarze  556:        assert(n->next->type == ROFFT_BODY);
1.73      schwarze  557:        if (n->next->child != NULL)
1.49      schwarze  558:                n = n->next;
                    559:
1.85      schwarze  560:        print_man_nodelist(man, n->child, h);
1.72      schwarze  561:        return 0;
1.111     schwarze  562: }
                    563:
                    564: static int
                    565: man_abort_pre(MAN_ARGS)
                    566: {
                    567:        abort();
1.1       schwarze  568: }