=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.47 retrieving revision 1.49 diff -u -p -r1.47 -r1.49 --- docbook2mdoc/parse.c 2019/04/20 04:15:06 1.47 +++ docbook2mdoc/parse.c 2019/04/23 14:01:55 1.49 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.47 2019/04/20 04:15:06 schwarze Exp $ */ +/* $Id: parse.c,v 1.49 2019/04/23 14:01:55 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -120,6 +120,7 @@ static const struct alias aliases[] = { { "structname", NODE_TYPE }, { "surname", NODE_PERSONNAME }, { "symbol", NODE_CONSTANT }, + { "tag", NODE_MARKUP }, { "trademark", NODE_IGNORE }, { "ulink", NODE_LINK }, { "userinput", NODE_LITERAL }, @@ -382,6 +383,7 @@ xml_entity(struct parse *p, const char *name) struct pnode *n; const char *ccp; char *cp; + unsigned int codepoint; enum pstate pstate; if (p->del > 0) @@ -426,6 +428,16 @@ xml_entity(struct parse *p, const char *name) return; } } + if (*name == '#') { + codepoint = strtonum(name + 1, 0, 0x10ffff, &ccp); + if (ccp == NULL) { + if ((n = pnode_alloc(p->cur)) == NULL || + asprintf(&n->b, "\\[u%4.4X]", + codepoint) < 0) + fatal(p); + goto done; + } + } error_msg(p, "unknown entity &%s;", name); return; } @@ -434,6 +446,7 @@ xml_entity(struct parse *p, const char *name) if ((n = pnode_alloc(p->cur)) == NULL || (n->b = strdup(entity->roff)) == NULL) fatal(p); +done: n->node = NODE_ESCAPE; n->spc = (p->flags & PFLAG_SPC) != 0; p->flags &= ~PFLAG_SPC; @@ -519,6 +532,7 @@ xml_elem_start(struct parse *p, const char *name) case NODE_DOCTYPE: case NODE_ENTITY: case NODE_SBR: + case NODE_VOID: p->flags |= PFLAG_EEND; break; default: @@ -649,6 +663,7 @@ xml_elem_end(struct parse *p, const char *name) break; case NODE_DOCTYPE: case NODE_SBR: + case NODE_VOID: p->flags &= ~PFLAG_EEND; /* FALLTHROUGH */ default: