X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/e0c54b397a18e56191dbd67e5e069e933edeedf6..297de1c8ac72f2de64a49c98141c097cad06e90f:/eqn_html.c?ds=sidebyside diff --git a/eqn_html.c b/eqn_html.c index e7393a96..64d06649 100644 --- a/eqn_html.c +++ b/eqn_html.c @@ -1,4 +1,4 @@ -/* $Id: eqn_html.c,v 1.13 2017/06/23 02:32:12 schwarze Exp $ */ +/* $Id: eqn_html.c,v 1.19 2019/03/17 18:21:45 schwarze Exp $ */ /* * Copyright (c) 2011, 2014 Kristaps Dzonsons * Copyright (c) 2017 Ingo Schwarze @@ -26,6 +26,8 @@ #include #include "mandoc.h" +#include "roff.h" +#include "eqn.h" #include "out.h" #include "html.h" @@ -34,7 +36,7 @@ eqn_box(struct html *p, const struct eqn_box *bp) { struct tag *post, *row, *cell, *t; const struct eqn_box *child, *parent; - const unsigned char *cp; + const char *cp; size_t i, j, rows; enum htmltag tag; enum eqn_fontt font; @@ -51,7 +53,8 @@ eqn_box(struct html *p, const struct eqn_box *bp) if (EQN_MATRIX == bp->type) { if (NULL == bp->first) goto out; - if (EQN_LIST != bp->first->type) { + if (bp->first->type != EQN_LIST || + bp->first->expectargs == 1) { eqn_box(p, bp->first); goto out; } @@ -131,9 +134,11 @@ eqn_box(struct html *p, const struct eqn_box *bp) if (EQN_PILE == bp->type) { assert(NULL == post); - if (bp->first != NULL && bp->first->type == EQN_LIST) + if (bp->first != NULL && + bp->first->type == EQN_LIST && + bp->first->expectargs > 1) post = print_otag(p, TAG_MTABLE, ""); - } else if (bp->type == EQN_LIST && + } else if (bp->type == EQN_LIST && bp->expectargs > 1 && bp->parent && bp->parent->type == EQN_PILE) { assert(NULL == post); post = print_otag(p, TAG_MTR, ""); @@ -143,22 +148,28 @@ eqn_box(struct html *p, const struct eqn_box *bp) if (bp->text != NULL) { assert(post == NULL); tag = TAG_MI; - cp = (unsigned char *)bp->text; - if (isdigit(cp[0]) || (cp[0] == '.' && isdigit(cp[1]))) { + cp = bp->text; + if (isdigit((unsigned char)cp[0]) || + (cp[0] == '.' && isdigit((unsigned char)cp[1]))) { tag = TAG_MN; while (*++cp != '\0') { - if (*cp != '.' && !isdigit(*cp)) { + if (*cp != '.' && + isdigit((unsigned char)*cp) == 0) { tag = TAG_MI; break; } } - } else if (*cp != '\0' && isalpha(*cp) == 0) { + } else if (*cp != '\0' && isalpha((unsigned char)*cp) == 0) { tag = TAG_MO; - while (*++cp != '\0') { - if (isalnum(*cp)) { + while (*cp != '\0') { + if (cp[0] == '\\' && cp[1] != '\0') { + cp++; + mandoc_escape(&cp, NULL, NULL); + } else if (isalnum((unsigned char)*cp)) { tag = TAG_MI; break; - } + } else + cp++; } } font = bp->font; @@ -218,14 +229,17 @@ out: } void -print_eqn(struct html *p, const struct eqn *ep) +print_eqn(struct html *p, const struct eqn_box *bp) { struct tag *t; + if (bp->first == NULL) + return; + t = print_otag(p, TAG_MATH, "c", "eqn"); p->flags |= HTML_NONOSPACE; - eqn_box(p, ep->root); + eqn_box(p, bp); p->flags &= ~HTML_NONOSPACE; print_tagq(p, t);