-/* $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 <kristaps@bsd.lv>
* Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
#include <string.h>
#include "mandoc.h"
+#include "roff.h"
+#include "eqn.h"
#include "out.h"
#include "html.h"
{
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;
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;
}
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, "");
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;
}
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);