1*260e9a87SYuri Pankov /* $Id: tbl_html.c,v 1.16 2015/01/30 17:32:16 schwarze Exp $ */
295c635efSGarrett D'Amore /*
395c635efSGarrett D'Amore * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
495c635efSGarrett D'Amore *
595c635efSGarrett D'Amore * Permission to use, copy, modify, and distribute this software for any
695c635efSGarrett D'Amore * purpose with or without fee is hereby granted, provided that the above
795c635efSGarrett D'Amore * copyright notice and this permission notice appear in all copies.
895c635efSGarrett D'Amore *
995c635efSGarrett D'Amore * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1095c635efSGarrett D'Amore * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1195c635efSGarrett D'Amore * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1295c635efSGarrett D'Amore * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1395c635efSGarrett D'Amore * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1495c635efSGarrett D'Amore * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1595c635efSGarrett D'Amore * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1695c635efSGarrett D'Amore */
1795c635efSGarrett D'Amore #include "config.h"
18*260e9a87SYuri Pankov
19*260e9a87SYuri Pankov #include <sys/types.h>
2095c635efSGarrett D'Amore
2195c635efSGarrett D'Amore #include <assert.h>
2295c635efSGarrett D'Amore #include <stdio.h>
2395c635efSGarrett D'Amore #include <stdlib.h>
2495c635efSGarrett D'Amore #include <string.h>
2595c635efSGarrett D'Amore
2695c635efSGarrett D'Amore #include "mandoc.h"
2795c635efSGarrett D'Amore #include "out.h"
2895c635efSGarrett D'Amore #include "html.h"
2995c635efSGarrett D'Amore
3095c635efSGarrett D'Amore static void html_tblopen(struct html *, const struct tbl_span *);
3195c635efSGarrett D'Amore static size_t html_tbl_len(size_t, void *);
3295c635efSGarrett D'Amore static size_t html_tbl_strlen(const char *, void *);
3395c635efSGarrett D'Amore
34*260e9a87SYuri Pankov
3595c635efSGarrett D'Amore static size_t
html_tbl_len(size_t sz,void * arg)3695c635efSGarrett D'Amore html_tbl_len(size_t sz, void *arg)
3795c635efSGarrett D'Amore {
3895c635efSGarrett D'Amore
3995c635efSGarrett D'Amore return(sz);
4095c635efSGarrett D'Amore }
4195c635efSGarrett D'Amore
4295c635efSGarrett D'Amore static size_t
html_tbl_strlen(const char * p,void * arg)4395c635efSGarrett D'Amore html_tbl_strlen(const char *p, void *arg)
4495c635efSGarrett D'Amore {
4595c635efSGarrett D'Amore
4695c635efSGarrett D'Amore return(strlen(p));
4795c635efSGarrett D'Amore }
4895c635efSGarrett D'Amore
4995c635efSGarrett D'Amore static void
html_tblopen(struct html * h,const struct tbl_span * sp)5095c635efSGarrett D'Amore html_tblopen(struct html *h, const struct tbl_span *sp)
5195c635efSGarrett D'Amore {
5295c635efSGarrett D'Amore struct htmlpair tag;
5395c635efSGarrett D'Amore struct roffsu su;
5495c635efSGarrett D'Amore struct roffcol *col;
55*260e9a87SYuri Pankov int ic;
5695c635efSGarrett D'Amore
57*260e9a87SYuri Pankov if (h->tbl.cols == NULL) {
5895c635efSGarrett D'Amore h->tbl.len = html_tbl_len;
5995c635efSGarrett D'Amore h->tbl.slen = html_tbl_strlen;
60*260e9a87SYuri Pankov tblcalc(&h->tbl, sp, 0);
6195c635efSGarrett D'Amore }
6295c635efSGarrett D'Amore
6395c635efSGarrett D'Amore assert(NULL == h->tblt);
6495c635efSGarrett D'Amore PAIR_CLASS_INIT(&tag, "tbl");
6595c635efSGarrett D'Amore h->tblt = print_otag(h, TAG_TABLE, 1, &tag);
6695c635efSGarrett D'Amore
67*260e9a87SYuri Pankov for (ic = 0; ic < sp->opts->cols; ic++) {
6895c635efSGarrett D'Amore bufinit(h);
69*260e9a87SYuri Pankov col = h->tbl.cols + ic;
7095c635efSGarrett D'Amore SCALE_HS_INIT(&su, col->width);
7195c635efSGarrett D'Amore bufcat_su(h, "width", &su);
7295c635efSGarrett D'Amore PAIR_STYLE_INIT(&tag, h);
7395c635efSGarrett D'Amore print_otag(h, TAG_COL, 1, &tag);
7495c635efSGarrett D'Amore }
7595c635efSGarrett D'Amore
7695c635efSGarrett D'Amore print_otag(h, TAG_TBODY, 0, NULL);
7795c635efSGarrett D'Amore }
7895c635efSGarrett D'Amore
7995c635efSGarrett D'Amore void
print_tblclose(struct html * h)8095c635efSGarrett D'Amore print_tblclose(struct html *h)
8195c635efSGarrett D'Amore {
8295c635efSGarrett D'Amore
8395c635efSGarrett D'Amore assert(h->tblt);
8495c635efSGarrett D'Amore print_tagq(h, h->tblt);
8595c635efSGarrett D'Amore h->tblt = NULL;
8695c635efSGarrett D'Amore }
8795c635efSGarrett D'Amore
8895c635efSGarrett D'Amore void
print_tbl(struct html * h,const struct tbl_span * sp)8995c635efSGarrett D'Amore print_tbl(struct html *h, const struct tbl_span *sp)
9095c635efSGarrett D'Amore {
9195c635efSGarrett D'Amore const struct tbl_dat *dp;
9295c635efSGarrett D'Amore struct htmlpair tag;
9395c635efSGarrett D'Amore struct tag *tt;
94*260e9a87SYuri Pankov int ic;
9595c635efSGarrett D'Amore
9695c635efSGarrett D'Amore /* Inhibit printing of spaces: we do padding ourselves. */
9795c635efSGarrett D'Amore
98*260e9a87SYuri Pankov if (h->tblt == NULL)
9995c635efSGarrett D'Amore html_tblopen(h, sp);
10095c635efSGarrett D'Amore
10195c635efSGarrett D'Amore assert(h->tblt);
10295c635efSGarrett D'Amore
10395c635efSGarrett D'Amore h->flags |= HTML_NONOSPACE;
10495c635efSGarrett D'Amore h->flags |= HTML_NOSPACE;
10595c635efSGarrett D'Amore
10695c635efSGarrett D'Amore tt = print_otag(h, TAG_TR, 0, NULL);
10795c635efSGarrett D'Amore
10895c635efSGarrett D'Amore switch (sp->pos) {
109*260e9a87SYuri Pankov case TBL_SPAN_HORIZ:
11095c635efSGarrett D'Amore /* FALLTHROUGH */
111*260e9a87SYuri Pankov case TBL_SPAN_DHORIZ:
11295c635efSGarrett D'Amore PAIR_INIT(&tag, ATTR_COLSPAN, "0");
11395c635efSGarrett D'Amore print_otag(h, TAG_TD, 1, &tag);
11495c635efSGarrett D'Amore break;
11595c635efSGarrett D'Amore default:
11695c635efSGarrett D'Amore dp = sp->first;
117*260e9a87SYuri Pankov for (ic = 0; ic < sp->opts->cols; ic++) {
11895c635efSGarrett D'Amore print_stagq(h, tt);
11995c635efSGarrett D'Amore print_otag(h, TAG_TD, 0, NULL);
12095c635efSGarrett D'Amore
121*260e9a87SYuri Pankov if (dp == NULL || dp->layout->col > ic)
122*260e9a87SYuri Pankov continue;
123*260e9a87SYuri Pankov if (dp->layout->pos != TBL_CELL_DOWN)
124*260e9a87SYuri Pankov if (dp->string != NULL)
12595c635efSGarrett D'Amore print_text(h, dp->string);
12695c635efSGarrett D'Amore dp = dp->next;
12795c635efSGarrett D'Amore }
12895c635efSGarrett D'Amore break;
12995c635efSGarrett D'Amore }
13095c635efSGarrett D'Amore
13195c635efSGarrett D'Amore print_tagq(h, tt);
13295c635efSGarrett D'Amore
13395c635efSGarrett D'Amore h->flags &= ~HTML_NONOSPACE;
13495c635efSGarrett D'Amore
135*260e9a87SYuri Pankov if (sp->next == NULL) {
13695c635efSGarrett D'Amore assert(h->tbl.cols);
13795c635efSGarrett D'Amore free(h->tbl.cols);
13895c635efSGarrett D'Amore h->tbl.cols = NULL;
13995c635efSGarrett D'Amore print_tblclose(h);
14095c635efSGarrett D'Amore }
14195c635efSGarrett D'Amore
14295c635efSGarrett D'Amore }
143