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