=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.16 retrieving revision 1.19 diff -u -p -r1.16 -r1.19 --- docbook2mdoc/parse.c 2019/04/06 22:37:57 1.16 +++ docbook2mdoc/parse.c 2019/04/07 17:39:26 1.19 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.16 2019/04/06 22:37:57 schwarze Exp $ */ +/* $Id: parse.c,v 1.19 2019/04/07 17:39:26 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -190,7 +190,7 @@ static const struct element elements[] = { { "title", NODE_TITLE }, { "trademark", NODE_IGNORE }, { "type", NODE_TYPE }, - { "ulink", NODE_ULINK }, + { "ulink", NODE_LINK }, { "userinput", NODE_LITERAL }, { "variablelist", NODE_VARIABLELIST }, { "varlistentry", NODE_VARLISTENTRY }, @@ -456,8 +456,50 @@ xml_elem_start(struct parse *ps, const char *name) perror(NULL); exit(1); } - dat->node = elem->node; - dat->spc = ps->spc; + + /* + * Nodes that begin a new macro or request line or start by + * printing text always want whitespace before themselves. + */ + + switch (dat->node = elem->node) { + case NODE_AUTHORGROUP: + case NODE_BOOKINFO: + case NODE_CAUTION: + case NODE_EDITOR: + case NODE_ENTRY: + case NODE_FUNCDEF: + case NODE_FUNCPROTOTYPE: + case NODE_INFORMALEQUATION: + case NODE_INLINEEQUATION: + case NODE_ITEMIZEDLIST: + case NODE_LEGALNOTICE: + case NODE_LITERALLAYOUT: + case NODE_NOTE: + case NODE_ORDEREDLIST: + case NODE_PARA: + case NODE_PREFACE: + case NODE_PROGRAMLISTING: + case NODE_REFMETA: + case NODE_REFNAMEDIV: + case NODE_REFSYNOPSISDIV: + case NODE_ROW: + case NODE_SBR: + case NODE_SCREEN: + case NODE_SECTION: + case NODE_SYNOPSIS: + case NODE_TGROUP: + case NODE_TIP: + case NODE_TITLE: + case NODE_VARIABLELIST: + case NODE_VARLISTENTRY: + case NODE_WARNING: + dat->spc = 1; + break; + default: + dat->spc = ps->spc; + break; + } dat->parent = ps->cur; TAILQ_INIT(&dat->childq); TAILQ_INIT(&dat->attrq); @@ -476,7 +518,7 @@ xml_attrkey(struct parse *ps, const char *name) struct pattr *attr; enum attrkey key; - if (ps->del > 0 || *name == '\0') + if (ps->del > 0 || ps->ncur == NODE_IGNORE || *name == '\0') return; if ((key = attrkey_parse(name)) == ATTRKEY__MAX) { ps->attr = 0; @@ -498,7 +540,7 @@ xml_attrval(struct parse *ps, const char *name) { struct pattr *attr; - if (ps->del > 0 || ps->attr == 0) + if (ps->del > 0 || ps->ncur == NODE_IGNORE || ps->attr == 0) return; if ((attr = TAILQ_LAST(&ps->cur->attrq, pattrq)) == NULL) return;