discuss@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: Ingo Schwarze <schwarze@usta.de>
To: Pali Rohar <pali.rohar@gmail.com>
Cc: discuss@mandoc.bsd.lv
Subject: Re: Broken tables in HTML output
Date: Mon, 26 Nov 2018 22:27:28 +0100	[thread overview]
Message-ID: <20181126212728.GG82448@athene.usta.de> (raw)
In-Reply-To: <20180716152919.GB85992@athene.usta.de>

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 <td> elements for continuations
-			 * of spanned cells.  Larger <td> 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 <td> elements for continuations
+		 * of spanned cells.  Larger <td> 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

  parent reply	other threads:[~2018-11-26 21:27 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-16 11:03 Pali Rohár
2018-07-16 15:29 ` Ingo Schwarze
2018-07-16 16:36   ` Pali Rohár
2018-07-16 17:44     ` Ingo Schwarze
2018-11-24 23:15   ` Ingo Schwarze
2018-11-25 19:34   ` Ingo Schwarze
2018-11-25 21:25     ` Ingo Schwarze
2018-11-26  8:53       ` Pali Rohár
2018-11-26 21:27   ` Ingo Schwarze [this message]
2018-11-26 21:58     ` Pali Rohár
2018-11-26 22:01       ` Pali Rohár
2018-11-26 22:05         ` Pali Rohár
2018-12-01 17:20           ` Ingo Schwarze
2018-12-01 19:35             ` Pali Rohár
2018-12-03 20:46             ` Pali Rohár
2018-12-04  5:33               ` Ingo Schwarze
2018-12-03 22:01             ` Pali Rohár
2018-12-03 22:14               ` Ingo Schwarze
2018-12-03 22:20                 ` Pali Rohár
2018-12-03 22:37                   ` Ingo Schwarze
2018-12-04 16:44                     ` Pali Rohár
2018-12-04 18:04                       ` Ingo Schwarze
2019-01-21  9:39                         ` Pali Rohár
2019-01-21 13:16                           ` Ingo Schwarze
2018-11-29  2:15     ` Ingo Schwarze

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181126212728.GG82448@athene.usta.de \
    --to=schwarze@usta.de \
    --cc=discuss@mandoc.bsd.lv \
    --cc=pali.rohar@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).