diff options
| author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-08-14 11:53:49 +0000 | 
|---|---|---|
| committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-08-14 11:53:49 +0000 | 
| commit | f3156461964256d1c034e49b880a19bc94c1c281 (patch) | |
| tree | 14cb627993b9ee1af94fa83fbf8c41cf227c3189 /usr/src/cmd/mandoc/eqn_html.c | |
| parent | aea86460f0918659f2a8637f97b2055272a86c98 (diff) | |
| parent | 5e9f42abf61392dc608a661563fb49e7707f0478 (diff) | |
| download | illumos-joyent-f3156461964256d1c034e49b880a19bc94c1c281.tar.gz | |
	[illumos-gate merge]
commit 5e9f42abf61392dc608a661563fb49e7707f0478
    8559 Add EFI utility functions to libefi
commit c66b8046543352459a11a51501b628d1c98a8c44
    8547 update mandoc to 1.14.3
commit 12014b724f98604d61f9756b7e199416475d7396
    8573 cmd/krb5: dmake should build 'all' as default target
Diffstat (limited to 'usr/src/cmd/mandoc/eqn_html.c')
| -rw-r--r-- | usr/src/cmd/mandoc/eqn_html.c | 92 | 
1 files changed, 75 insertions, 17 deletions
| diff --git a/usr/src/cmd/mandoc/eqn_html.c b/usr/src/cmd/mandoc/eqn_html.c index b6e7d914b8..51f1442342 100644 --- a/usr/src/cmd/mandoc/eqn_html.c +++ b/usr/src/cmd/mandoc/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); | 
