1241675Suqs/*	$Id: tbl_html.c,v 1.9 2011/09/18 14:14:15 schwarze Exp $ */
2241675Suqs/*
3241675Suqs * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4241675Suqs *
5241675Suqs * Permission to use, copy, modify, and distribute this software for any
6241675Suqs * purpose with or without fee is hereby granted, provided that the above
7241675Suqs * copyright notice and this permission notice appear in all copies.
8241675Suqs *
9241675Suqs * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10241675Suqs * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11241675Suqs * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12241675Suqs * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13241675Suqs * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14241675Suqs * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15241675Suqs * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16241675Suqs */
17241675Suqs#ifdef HAVE_CONFIG_H
18241675Suqs#include "config.h"
19241675Suqs#endif
20241675Suqs
21241675Suqs#include <assert.h>
22241675Suqs#include <stdio.h>
23241675Suqs#include <stdlib.h>
24241675Suqs#include <string.h>
25241675Suqs
26241675Suqs#include "mandoc.h"
27241675Suqs#include "out.h"
28241675Suqs#include "html.h"
29241675Suqs
30241675Suqsstatic	void	 html_tblopen(struct html *, const struct tbl_span *);
31241675Suqsstatic	size_t	 html_tbl_len(size_t, void *);
32241675Suqsstatic	size_t	 html_tbl_strlen(const char *, void *);
33241675Suqs
34241675Suqs/* ARGSUSED */
35241675Suqsstatic size_t
36241675Suqshtml_tbl_len(size_t sz, void *arg)
37241675Suqs{
38241675Suqs
39241675Suqs	return(sz);
40241675Suqs}
41241675Suqs
42241675Suqs/* ARGSUSED */
43241675Suqsstatic size_t
44241675Suqshtml_tbl_strlen(const char *p, void *arg)
45241675Suqs{
46241675Suqs
47241675Suqs	return(strlen(p));
48241675Suqs}
49241675Suqs
50241675Suqsstatic void
51241675Suqshtml_tblopen(struct html *h, const struct tbl_span *sp)
52241675Suqs{
53241675Suqs	const struct tbl_head *hp;
54241675Suqs	struct htmlpair	 tag;
55241675Suqs	struct roffsu	 su;
56241675Suqs	struct roffcol	*col;
57241675Suqs
58241675Suqs	if (TBL_SPAN_FIRST & sp->flags) {
59241675Suqs		h->tbl.len = html_tbl_len;
60241675Suqs		h->tbl.slen = html_tbl_strlen;
61241675Suqs		tblcalc(&h->tbl, sp);
62241675Suqs	}
63241675Suqs
64241675Suqs	assert(NULL == h->tblt);
65241675Suqs	PAIR_CLASS_INIT(&tag, "tbl");
66241675Suqs	h->tblt = print_otag(h, TAG_TABLE, 1, &tag);
67241675Suqs
68241675Suqs	for (hp = sp->head; hp; hp = hp->next) {
69241675Suqs		bufinit(h);
70241675Suqs		col = &h->tbl.cols[hp->ident];
71241675Suqs		SCALE_HS_INIT(&su, col->width);
72241675Suqs		bufcat_su(h, "width", &su);
73241675Suqs		PAIR_STYLE_INIT(&tag, h);
74241675Suqs		print_otag(h, TAG_COL, 1, &tag);
75241675Suqs	}
76241675Suqs
77241675Suqs	print_otag(h, TAG_TBODY, 0, NULL);
78241675Suqs}
79241675Suqs
80241675Suqsvoid
81241675Suqsprint_tblclose(struct html *h)
82241675Suqs{
83241675Suqs
84241675Suqs	assert(h->tblt);
85241675Suqs	print_tagq(h, h->tblt);
86241675Suqs	h->tblt = NULL;
87241675Suqs}
88241675Suqs
89241675Suqsvoid
90241675Suqsprint_tbl(struct html *h, const struct tbl_span *sp)
91241675Suqs{
92241675Suqs	const struct tbl_head *hp;
93241675Suqs	const struct tbl_dat *dp;
94241675Suqs	struct htmlpair	 tag;
95241675Suqs	struct tag	*tt;
96241675Suqs
97241675Suqs	/* Inhibit printing of spaces: we do padding ourselves. */
98241675Suqs
99241675Suqs	if (NULL == h->tblt)
100241675Suqs		html_tblopen(h, sp);
101241675Suqs
102241675Suqs	assert(h->tblt);
103241675Suqs
104241675Suqs	h->flags |= HTML_NONOSPACE;
105241675Suqs	h->flags |= HTML_NOSPACE;
106241675Suqs
107241675Suqs	tt = print_otag(h, TAG_TR, 0, NULL);
108241675Suqs
109241675Suqs	switch (sp->pos) {
110241675Suqs	case (TBL_SPAN_HORIZ):
111241675Suqs		/* FALLTHROUGH */
112241675Suqs	case (TBL_SPAN_DHORIZ):
113241675Suqs		PAIR_INIT(&tag, ATTR_COLSPAN, "0");
114241675Suqs		print_otag(h, TAG_TD, 1, &tag);
115241675Suqs		break;
116241675Suqs	default:
117241675Suqs		dp = sp->first;
118241675Suqs		for (hp = sp->head; hp; hp = hp->next) {
119241675Suqs			print_stagq(h, tt);
120241675Suqs			print_otag(h, TAG_TD, 0, NULL);
121241675Suqs
122241675Suqs			switch (hp->pos) {
123241675Suqs			case (TBL_HEAD_VERT):
124241675Suqs				/* FALLTHROUGH */
125241675Suqs			case (TBL_HEAD_DVERT):
126241675Suqs				continue;
127241675Suqs			case (TBL_HEAD_DATA):
128241675Suqs				if (NULL == dp)
129241675Suqs					break;
130241675Suqs				if (TBL_CELL_DOWN != dp->layout->pos)
131241675Suqs					if (dp->string)
132241675Suqs						print_text(h, dp->string);
133241675Suqs				dp = dp->next;
134241675Suqs				break;
135241675Suqs			}
136241675Suqs		}
137241675Suqs		break;
138241675Suqs	}
139241675Suqs
140241675Suqs	print_tagq(h, tt);
141241675Suqs
142241675Suqs	h->flags &= ~HTML_NONOSPACE;
143241675Suqs
144241675Suqs	if (TBL_SPAN_LAST & sp->flags) {
145241675Suqs		assert(h->tbl.cols);
146241675Suqs		free(h->tbl.cols);
147241675Suqs		h->tbl.cols = NULL;
148241675Suqs		print_tblclose(h);
149241675Suqs	}
150241675Suqs
151241675Suqs}
152