version 1.22, 2017/06/12 20:14:18 |
version 1.31, 2018/12/16 00:17:02 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
#include <string.h> |
#include <string.h> |
|
|
#include "mandoc.h" |
#include "mandoc.h" |
|
#include "tbl.h" |
#include "out.h" |
#include "out.h" |
#include "html.h" |
#include "html.h" |
|
|
Line 49 html_tbl_strlen(const char *p, void *arg) |
|
Line 50 html_tbl_strlen(const char *p, void *arg) |
|
static size_t |
static size_t |
html_tbl_sulen(const struct roffsu *su, void *arg) |
html_tbl_sulen(const struct roffsu *su, void *arg) |
{ |
{ |
|
if (su->scale < 0.0) |
|
return 0; |
|
|
switch (su->unit) { |
switch (su->unit) { |
case SCALE_FS: /* 2^16 basic units */ |
case SCALE_FS: /* 2^16 basic units */ |
return su->scale * 65536.0 / 24.0; |
return su->scale * 65536.0 / 24.0; |
Line 76 html_tbl_sulen(const struct roffsu *su, void *arg) |
|
Line 80 html_tbl_sulen(const struct roffsu *su, void *arg) |
|
static void |
static void |
html_tblopen(struct html *h, const struct tbl_span *sp) |
html_tblopen(struct html *h, const struct tbl_span *sp) |
{ |
{ |
struct tag *t; |
|
int ic; |
|
|
|
if (h->tbl.cols == NULL) { |
if (h->tbl.cols == NULL) { |
h->tbl.len = html_tbl_len; |
h->tbl.len = html_tbl_len; |
h->tbl.slen = html_tbl_strlen; |
h->tbl.slen = html_tbl_strlen; |
h->tbl.sulen = html_tbl_sulen; |
h->tbl.sulen = html_tbl_sulen; |
tblcalc(&h->tbl, sp, 0, 0); |
tblcalc(&h->tbl, sp, 0, 0); |
} |
} |
|
|
assert(NULL == h->tblt); |
assert(NULL == h->tblt); |
h->tblt = print_otag(h, TAG_TABLE, "c", "tbl"); |
h->tblt = print_otag(h, TAG_TABLE, "c?ss", "tbl", |
|
"border", |
t = print_otag(h, TAG_COLGROUP, ""); |
sp->opts->opts & TBL_OPT_ALLBOX ? "1" : NULL, |
for (ic = 0; ic < sp->opts->cols; ic++) |
"border-style", |
print_otag(h, TAG_COL, "shw", h->tbl.cols[ic].width); |
sp->opts->opts & TBL_OPT_DBOX ? "double" : |
print_tagq(h, t); |
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 |
void |
Line 107 print_tblclose(struct html *h) |
|
Line 110 print_tblclose(struct html *h) |
|
void |
void |
print_tbl(struct html *h, const struct tbl_span *sp) |
print_tbl(struct html *h, const struct tbl_span *sp) |
{ |
{ |
const struct tbl_dat *dp; |
const struct tbl_dat *dp; |
struct tag *tt; |
const struct tbl_cell *cp; |
int ic; |
const struct tbl_span *psp; |
|
struct tag *tt; |
|
const char *hspans, *vspans, *halign, *valign; |
|
const char *bborder, *lborder, *rborder; |
|
char hbuf[4], vbuf[4]; |
|
int i; |
|
|
/* Inhibit printing of spaces: we do padding ourselves. */ |
|
|
|
if (h->tblt == NULL) |
if (h->tblt == NULL) |
html_tblopen(h, sp); |
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_NONOSPACE; |
h->flags |= HTML_NOSPACE; |
h->flags |= HTML_NOSPACE; |
|
|
tt = print_otag(h, TAG_TR, ""); |
/* Draw a vertical line left of this row? */ |
|
|
switch (sp->pos) { |
switch (sp->layout->vert) { |
case TBL_SPAN_HORIZ: |
case 2: |
case TBL_SPAN_DHORIZ: |
lborder = "double"; |
print_otag(h, TAG_TD, "?", "colspan", "0"); |
|
break; |
break; |
|
case 1: |
|
lborder = "solid"; |
|
break; |
default: |
default: |
dp = sp->first; |
lborder = NULL; |
for (ic = 0; ic < sp->opts->cols; ic++) { |
break; |
print_stagq(h, tt); |
} |
print_otag(h, TAG_TD, ""); |
|
|
|
if (dp == NULL || dp->layout->col > ic) |
/* Draw a horizontal line below this row? */ |
continue; |
|
if (dp->layout->pos != TBL_CELL_DOWN) |
bborder = NULL; |
if (dp->string != NULL) |
if ((psp = sp->next) != NULL) { |
print_text(h, dp->string); |
switch (psp->pos) { |
dp = dp->next; |
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); |
print_tagq(h, tt); |
|
|
h->flags &= ~HTML_NONOSPACE; |
h->flags &= ~HTML_NONOSPACE; |
Line 154 print_tbl(struct html *h, const struct tbl_span *sp) |
|
Line 252 print_tbl(struct html *h, const struct tbl_span *sp) |
|
h->tbl.cols = NULL; |
h->tbl.cols = NULL; |
print_tblclose(h); |
print_tblclose(h); |
} |
} |
|
|
} |
} |