From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from scc-mailout-kit-01.scc.kit.edu (scc-mailout-kit-01.scc.kit.edu [129.13.231.81]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id ce90116b for ; Mon, 26 Nov 2018 16:27:32 -0500 (EST) Received: from asta-nat.asta.uni-karlsruhe.de ([172.22.63.82] helo=hekate.usta.de) by scc-mailout-kit-01.scc.kit.edu with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (envelope-from ) id 1gROPi-0007LZ-5m; Mon, 26 Nov 2018 22:27:31 +0100 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1gROPh-0007Ud-6M; Mon, 26 Nov 2018 22:27:29 +0100 Received: from athene.usta.de ([172.24.96.10]) by donnerwolke.usta.de with esmtp (Exim 4.84_2) (envelope-from ) id 1gROPg-0005u1-W5; Mon, 26 Nov 2018 22:27:29 +0100 Received: from localhost (athene.usta.de [local]) by athene.usta.de (OpenSMTPD) with ESMTPA id a3f6eec4; Mon, 26 Nov 2018 22:27:28 +0100 (CET) Date: Mon, 26 Nov 2018 22:27:28 +0100 From: Ingo Schwarze To: Pali Rohar Cc: discuss@mandoc.bsd.lv Subject: Re: Broken tables in HTML output Message-ID: <20181126212728.GG82448@athene.usta.de> References: <20180716110335.uusqzhscwdgp5qaa@pali> <20180716152919.GB85992@athene.usta.de> X-Mailinglist: mandoc-discuss Reply-To: discuss@mandoc.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180716152919.GB85992@athene.usta.de> User-Agent: Mutt/1.8.0 (2017-02-23) Hi Pali, Ingo Schwarze wrote on Mon, Jul 16, 2018 at 05:29:19PM +0200: > Pali Rohar wrote on Mon, Jul 16, 2018 at 01:03:35PM +0200: >> First thing is that in HTML output is fully missing specified border >> even when in table section is box or | specified. This makes hard to >> understand meaning of some table when borders are important. >> >> Note that in ASCII output borders are rendered by '-', '+', '|' and '=' >> characters, so seems that mandoc already support borders, just HTML >> generator is buggy or does not support them at all. > Indeed, the tbl(7) parser fully supports borders and the terminal > formatter supports them in most respects. But you are right that > they are not yet implemented in the HTML formatter. So i have added > an entry to the TODO file: > > - implement table borders in HTML output > pali dot rohar at gmail dot com 16 Jul 2018 13:03:35 +0200 > loc * exist * algo ** size ** imp ** > > I'm not completely sure that fully implementing all aspects of table > borders in conjunction with cell spanning is possible in HTML output, > but i think it is likely that it can be done in some way. It turned out combination with cell spanning wasn't a problem; support for most border features went in with the commit below. What i didn't implement yet is drawing horizontal borders through the *middle* of table cells, in particular in table rows that contain text in other columns of the same row. I'm not quite sure how to tell HTML (or CSS?) "draw a horizontal line through the *middle* of this table cell". But maybe that feature isn't all that important. [...] >> cell spanning is broken, Fixed earlier. [...] >> text is not aligned at all. Fixed earlier. [...] >> Second problem is with text alignment in table. When cell spanning is >> used (e.g. via s or via \^) then text is not correctly aligned and it >> looks "ugly". This problem is in both HTML and ASCII output. > [...] >> Alignment is wrong. "Name" should be centered and not on top. >> Same for "value2". Vertical alignment in ASCII output is a tough problem and not likely to get fixed soon; the rest should be fixed now, i think. [...] >> Third thing which I observed is that mandoc is in UTF-8 output does >> not use Unicode Box Drawing characters, but rather ugly ASCII. That is still open. >> Column for val1 is enormously wide > > That's an important known issue listed in the TODO file: > > - the "s" layout column specifier is used for placement of data > into columns, but ignored during column width calculations > synaptics(4) found by tedu@ Mon, 17 Aug 2015 21:17:42 -0400 > loc * exist ** algo *** size * imp ** > > Priority is only moderate because solving it will require > quite some work. That is still open, too. So about half of this is fixed now, the most important remaining items being column width calculations in the presence of spans, and box drawing characters. Yours, Ingo Log Message: ----------- Implement tbl(7) lines in -T html output, as far as they are on the edges of table cells rather than going through the middle of cells: * the box, doublebox, and allbox options; * the | and || layout modifiers; * and the _ and = data lines; - but not yet _ and = in individual layout and data cells. Missing feature reported by Pali dot Rohar at gmail dot com. Modified Files: -------------- mandoc: mandoc.css tbl_html.c Revision Data ------------- Index: tbl_html.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/tbl_html.c,v retrieving revision 1.28 retrieving revision 1.29 diff -Ltbl_html.c -Ltbl_html.c -u -p -r1.28 -r1.29 --- tbl_html.c +++ tbl_html.c @@ -86,7 +86,15 @@ html_tblopen(struct html *h, const struc tblcalc(&h->tbl, sp, 0, 0); } assert(NULL == h->tblt); - h->tblt = print_otag(h, TAG_TABLE, "c", "tbl"); + h->tblt = print_otag(h, TAG_TABLE, "c?ss", "tbl", + "border", + sp->opts->opts & TBL_OPT_ALLBOX ? "1" : NULL, + "border-style", + sp->opts->opts & TBL_OPT_DBOX ? "double" : + sp->opts->opts & TBL_OPT_BOX ? "solid" : NULL, + "border-top-style", + sp->pos == TBL_SPAN_DHORIZ ? "double" : + sp->pos == TBL_SPAN_HORIZ ? "solid" : NULL); } void @@ -102,87 +110,135 @@ void print_tbl(struct html *h, const struct tbl_span *sp) { const struct tbl_dat *dp; + const struct tbl_cell *cp; + const struct tbl_span *psp; struct tag *tt; const char *hspans, *vspans, *halign, *valign; + const char *bborder, *lborder, *rborder; char hbuf[4], vbuf[4]; - - /* Inhibit printing of spaces: we do padding ourselves. */ + int i; if (h->tblt == NULL) html_tblopen(h, sp); - assert(h->tblt); + /* + * Horizontal lines spanning the whole table + * are handled by previous or following table rows. + */ + + if (sp->pos != TBL_SPAN_DATA) + return; + + /* Inhibit printing of spaces: we do padding ourselves. */ h->flags |= HTML_NONOSPACE; h->flags |= HTML_NOSPACE; - tt = print_otag(h, TAG_TR, ""); + /* Draw a vertical line left of this row? */ - switch (sp->pos) { - case TBL_SPAN_HORIZ: - case TBL_SPAN_DHORIZ: - print_otag(h, TAG_TD, "?", "colspan", "0"); + switch (sp->layout->vert) { + case 2: + lborder = "double"; + break; + case 1: + lborder = "solid"; break; default: - for (dp = sp->first; dp != NULL; dp = dp->next) { - print_stagq(h, tt); + lborder = NULL; + break; + } - /* - * Do not generate elements for continuations - * of spanned cells. Larger elements covering - * this space were already generated earlier. - */ - - if (dp->layout->pos == TBL_CELL_SPAN || - dp->layout->pos == TBL_CELL_DOWN || - (dp->string != NULL && - strcmp(dp->string, "\\^") == 0)) - continue; - - /* Determine the attribute values. */ - - if (dp->hspans > 0) { - (void)snprintf(hbuf, sizeof(hbuf), - "%d", dp->hspans + 1); - hspans = hbuf; - } else - hspans = NULL; - if (dp->vspans > 0) { - (void)snprintf(vbuf, sizeof(vbuf), - "%d", dp->vspans + 1); - vspans = vbuf; - } else - vspans = NULL; - - switch (dp->layout->pos) { - case TBL_CELL_CENTRE: - halign = "center"; - break; - case TBL_CELL_RIGHT: - case TBL_CELL_NUMBER: - halign = "right"; - break; - default: - halign = NULL; - break; - } - if (dp->layout->flags & TBL_CELL_TALIGN) - valign = "top"; - else if (dp->layout->flags & TBL_CELL_BALIGN) - valign = "bottom"; - else - valign = NULL; - - /* Print the element and the attributes. */ - - print_otag(h, TAG_TD, "??ss", - "colspan", hspans, "rowspan", vspans, - "vertical-align", valign, - "text-align", halign); - if (dp->string != NULL) - print_text(h, dp->string); + /* Draw a horizontal line below this row? */ + + bborder = NULL; + if ((psp = sp->next) != NULL) { + switch (psp->pos) { + case TBL_SPAN_DHORIZ: + bborder = "double"; + break; + case TBL_SPAN_HORIZ: + bborder = "solid"; + break; + default: + break; } - break; + } + + tt = print_otag(h, TAG_TR, "ss", + "border-left-style", lborder, + "border-bottom-style", bborder); + + for (dp = sp->first; dp != NULL; dp = dp->next) { + print_stagq(h, tt); + + /* + * Do not generate elements for continuations + * of spanned cells. Larger elements covering + * this space were already generated earlier. + */ + + cp = dp->layout; + if (cp->pos == TBL_CELL_SPAN || cp->pos == TBL_CELL_DOWN || + (dp->string != NULL && strcmp(dp->string, "\\^") == 0)) + continue; + + /* Determine the attribute values. */ + + if (dp->hspans > 0) { + (void)snprintf(hbuf, sizeof(hbuf), + "%d", dp->hspans + 1); + hspans = hbuf; + } else + hspans = NULL; + if (dp->vspans > 0) { + (void)snprintf(vbuf, sizeof(vbuf), + "%d", dp->vspans + 1); + vspans = vbuf; + } else + vspans = NULL; + + switch (cp->pos) { + case TBL_CELL_CENTRE: + halign = "center"; + break; + case TBL_CELL_RIGHT: + case TBL_CELL_NUMBER: + halign = "right"; + break; + default: + halign = NULL; + break; + } + if (cp->flags & TBL_CELL_TALIGN) + valign = "top"; + else if (cp->flags & TBL_CELL_BALIGN) + valign = "bottom"; + else + valign = NULL; + + for (i = dp->hspans; i > 0; i--) + cp = cp->next; + switch (cp->vert) { + case 2: + rborder = "double"; + break; + case 1: + rborder = "solid"; + break; + default: + rborder = NULL; + break; + } + + /* Print the element and the attributes. */ + + print_otag(h, TAG_TD, "??sss", + "colspan", hspans, "rowspan", vspans, + "vertical-align", valign, + "text-align", halign, + "border-right-style", rborder); + if (dp->string != NULL) + print_text(h, dp->string); } print_tagq(h, tt); Index: mandoc.css =================================================================== RCS file: /home/cvs/mandoc/mandoc/mandoc.css,v retrieving revision 1.39 retrieving revision 1.40 diff -Lmandoc.css -Lmandoc.css -u -p -r1.39 -r1.40 --- mandoc.css +++ mandoc.css @@ -13,8 +13,11 @@ html { max-width: 65em; } body { font-family: Helvetica,Arial,sans-serif; } table { margin-top: 0em; - margin-bottom: 0em; } -td { vertical-align: middle; } + margin-bottom: 0em; + border-collapse: collapse; } +td { vertical-align: middle; + padding-left: 0.2em; + padding-right: 0.2em; } ul, ol, dl { margin-top: 0em; margin-bottom: 0em; } li, dt { margin-top: 1em; } -- To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv