=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.53 retrieving revision 1.60 diff -u -p -r1.53 -r1.60 --- docbook2mdoc/parse.c 2019/04/28 15:03:29 1.53 +++ docbook2mdoc/parse.c 2019/05/07 23:41:48 1.60 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.53 2019/04/28 15:03:29 schwarze Exp $ */ +/* $Id: parse.c,v 1.60 2019/05/07 23:41:48 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -97,9 +97,12 @@ static const struct alias aliases[] = { { "imageobject", NODE_IGNORE }, { "indexterm", NODE_DELETE }, { "informaltable", NODE_TABLE }, + { "jobtitle", NODE_IGNORE }, { "keycap", NODE_KEYSYM }, { "keycode", NODE_IGNORE }, + { "keycombo", NODE_IGNORE }, { "mediaobject", NODE_BLOCKQUOTE }, + { "orgdiv", NODE_IGNORE }, { "orgname", NODE_IGNORE }, { "othercredit", NODE_AUTHOR }, { "othername", NODE_PERSONNAME }, @@ -129,7 +132,6 @@ static const struct alias aliases[] = { { "trademark", NODE_IGNORE }, { "ulink", NODE_LINK }, { "userinput", NODE_LITERAL }, - { "year", NODE_IGNORE }, { NULL, NODE_IGNORE } }; @@ -268,8 +270,10 @@ xml_text(struct parse *p, const char *word, int sz) n = pnode_alloc(p->cur); n->node = NODE_TEXT; - n->flags = ((p->flags & PFLAG_LINE) ? NFLAG_LINE : 0) | - ((p->flags & PFLAG_SPC) ? NFLAG_SPC : 0); + if (p->flags & PFLAG_LINE && TAILQ_PREV(n, pnodeq, child) != NULL) + n->flags |= NFLAG_LINE; + if (p->flags & PFLAG_SPC) + n->flags |= NFLAG_SPC; p->flags &= ~(PFLAG_LINE | PFLAG_SPC); /* @@ -352,19 +356,17 @@ pnode_closetext(struct parse *p, int check_last_word) while (cp > n->b && !isspace((unsigned char)cp[-1])) cp--; + last_word = cp; + while (cp > n->b && isspace((unsigned char)cp[-1])) + cp--; if (cp == n->b) return; + *cp = '\0'; - last_word = cp; - while (cp > n->b && isspace((unsigned char)cp[-1])) - *--cp = '\0'; - /* Move the last word into its own node, for use with .Pf. */ - n = pnode_alloc(p->cur); - n->node = NODE_TEXT; + n = pnode_alloc_text(p->cur, last_word); n->flags |= NFLAG_SPC; - n->b = xstrdup(last_word); } static void @@ -374,7 +376,7 @@ xml_entity(struct parse *p, const char *name) struct pnode *n; const char *ccp; char *cp; - unsigned int codepoint; + long codepoint; enum pstate pstate; if (p->del > 0) @@ -419,8 +421,16 @@ xml_entity(struct parse *p, const char *name) } } if (*name == '#') { - codepoint = strtonum(name + 1, 0, 0x10ffff, &ccp); - if (ccp == NULL) { + errno = 0; + if (name[1] == 'x') { + ccp = name + 2; + codepoint = strtol(ccp, &cp, 16); + } else { + ccp = name + 1; + codepoint = strtol(ccp, &cp, 10); + } + if (*ccp != '\0' && *cp == '\0' && errno != ERANGE && + codepoint >= 0 && codepoint <= 0x10ffff) { n = pnode_alloc(p->cur); xasprintf(&n->b, "\\[u%4.4X]", codepoint); goto done; @@ -435,8 +445,10 @@ xml_entity(struct parse *p, const char *name) n->b = xstrdup(entity->roff); done: n->node = NODE_ESCAPE; - n->flags = ((p->flags & PFLAG_LINE) ? NFLAG_LINE : 0) | - ((p->flags & PFLAG_SPC) ? NFLAG_SPC : 0); + if (p->flags & PFLAG_LINE && TAILQ_PREV(n, pnodeq, child) != NULL) + n->flags |= NFLAG_LINE; + if (p->flags & PFLAG_SPC) + n->flags |= NFLAG_SPC; p->flags &= ~(PFLAG_LINE | PFLAG_SPC); } @@ -508,6 +520,10 @@ xml_elem_start(struct parse *p, const char *name) } n = pnode_alloc(p->cur); + if (p->flags & PFLAG_LINE && p->cur != NULL && + TAILQ_PREV(n, pnodeq, child) != NULL) + n->flags |= NFLAG_LINE; + p->flags &= ~PFLAG_LINE; /* * Some elements are self-closing. @@ -528,8 +544,8 @@ xml_elem_start(struct parse *p, const char *name) switch (pnode_class(p->ncur)) { case CLASS_LINE: case CLASS_ENCL: - n->flags = ((p->flags & PFLAG_LINE) ? NFLAG_LINE : 0) | - ((p->flags & PFLAG_SPC) ? NFLAG_SPC : 0); + if (p->flags & PFLAG_SPC) + n->flags |= NFLAG_SPC; break; case CLASS_NOFILL: p->nofill++;