[BACK]Return to html.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

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