aboutsummaryrefslogtreecommitdiff
path: root/eqn_html.c
diff options
context:
space:
mode:
Diffstat (limited to 'eqn_html.c')
-rw-r--r--eqn_html.c92
1 files changed, 75 insertions, 17 deletions
diff --git a/eqn_html.c b/eqn_html.c
index b6e7d914b86e..51f144234275 100644
--- a/eqn_html.c
+++ b/eqn_html.c
@@ -1,4 +1,4 @@
-/* $Id: eqn_html.c,v 1.11 2017/01/17 01:47:51 schwarze Exp $ */
+/* $Id: eqn_html.c,v 1.17 2017/07/14 13:32:35 schwarze Exp $ */
/*
* Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -20,6 +20,7 @@
#include <sys/types.h>
#include <assert.h>
+#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -33,7 +34,10 @@ eqn_box(struct html *p, const struct eqn_box *bp)
{
struct tag *post, *row, *cell, *t;
const struct eqn_box *child, *parent;
+ const char *cp;
size_t i, j, rows;
+ enum htmltag tag;
+ enum eqn_fontt font;
if (NULL == bp)
return;
@@ -47,7 +51,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;
}
@@ -87,28 +92,28 @@ eqn_box(struct html *p, const struct eqn_box *bp)
}
switch (bp->pos) {
- case (EQNPOS_TO):
+ case EQNPOS_TO:
post = print_otag(p, TAG_MOVER, "");
break;
- case (EQNPOS_SUP):
+ case EQNPOS_SUP:
post = print_otag(p, TAG_MSUP, "");
break;
- case (EQNPOS_FROM):
+ case EQNPOS_FROM:
post = print_otag(p, TAG_MUNDER, "");
break;
- case (EQNPOS_SUB):
+ case EQNPOS_SUB:
post = print_otag(p, TAG_MSUB, "");
break;
- case (EQNPOS_OVER):
+ case EQNPOS_OVER:
post = print_otag(p, TAG_MFRAC, "");
break;
- case (EQNPOS_FROMTO):
+ case EQNPOS_FROMTO:
post = print_otag(p, TAG_MUNDEROVER, "");
break;
- case (EQNPOS_SUBSUP):
+ case EQNPOS_SUBSUP:
post = print_otag(p, TAG_MSUBSUP, "");
break;
- case (EQNPOS_SQRT):
+ case EQNPOS_SQRT:
post = print_otag(p, TAG_MSQRT, "");
break;
default:
@@ -127,18 +132,68 @@ 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, "");
print_otag(p, TAG_MTD, "");
}
- if (NULL != bp->text) {
- assert(NULL == post);
- post = print_otag(p, TAG_MI, "");
+ if (bp->text != NULL) {
+ assert(post == NULL);
+ tag = TAG_MI;
+ 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((unsigned char)*cp) == 0) {
+ tag = TAG_MI;
+ break;
+ }
+ }
+ } else if (*cp != '\0' && isalpha((unsigned char)*cp) == 0) {
+ tag = TAG_MO;
+ 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;
+ if (bp->text[0] != '\0' &&
+ (((tag == TAG_MN || tag == TAG_MO) &&
+ font == EQNFONT_ROMAN) ||
+ (tag == TAG_MI && font == (bp->text[1] == '\0' ?
+ EQNFONT_ITALIC : EQNFONT_ROMAN))))
+ font = EQNFONT_NONE;
+ switch (font) {
+ case EQNFONT_NONE:
+ post = print_otag(p, tag, "");
+ break;
+ case EQNFONT_ROMAN:
+ post = print_otag(p, tag, "?", "fontstyle", "normal");
+ break;
+ case EQNFONT_BOLD:
+ case EQNFONT_FAT:
+ post = print_otag(p, tag, "?", "fontweight", "bold");
+ break;
+ case EQNFONT_ITALIC:
+ post = print_otag(p, tag, "?", "fontstyle", "italic");
+ break;
+ default:
+ abort();
+ }
print_text(p, bp->text);
} else if (NULL == post) {
if (NULL != bp->left || NULL != bp->right)
@@ -172,14 +227,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);