=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- docbook2mdoc/parse.c 2019/03/26 18:32:07 1.1 +++ docbook2mdoc/parse.c 2019/03/26 20:54:43 1.2 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.1 2019/03/26 18:32:07 schwarze Exp $ */ +/* $Id: parse.c,v 1.2 2019/03/26 20:54:43 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -176,6 +176,7 @@ static const struct element elements[] = { { "varname", NODE_VARNAME }, { "warning", NODE_WARNING }, { "wordasword", NODE_WORDASWORD }, + { "xi:include", NODE_WARN }, { "year", NODE_YEAR }, { NULL, NODE__MAX } }; @@ -262,10 +263,6 @@ xml_elem_start(void *arg, const XML_Char *name, const if (ps->tree->flags && TREE_FAIL) return; - /* FIXME: find a better way to ditch other namespaces. */ - if (strcmp(name, "xi:include") == 0) - return; - /* Close out the text node, if there is one. */ if (ps->cur != NULL && ps->cur->node == NODE_TEXT) { pnode_trim(ps->cur); @@ -284,8 +281,22 @@ xml_elem_start(void *arg, const XML_Char *name, const return; } - if (elem->node == NODE_INLINEEQUATION) + switch (elem->node) { + case NODE_WARN: + if (ps->warn) + fprintf(stderr, "%s:%zu:%zu: warning: " + "ignoring element <%s>\n", ps->fname, + XML_GetCurrentLineNumber(ps->xml), + XML_GetCurrentColumnNumber(ps->xml), name); + /* FALLTHROUGH */ + case NODE_IGNORE: + return; + case NODE_INLINEEQUATION: ps->tree->flags |= TREE_EQN; + break; + default: + break; + } if ((dat = calloc(1, sizeof(*dat))) == NULL) { perror(NULL); @@ -333,21 +344,30 @@ static void xml_elem_end(void *arg, const XML_Char *name) { struct parse *ps; + const struct element *elem; ps = arg; if (ps->tree->flags && TREE_FAIL) return; - /* FIXME: find a better way to ditch other namespaces. */ - if (strcmp(name, "xi:include") == 0) - return; - /* Close out the text node, if there is one. */ if (ps->cur->node == NODE_TEXT) { pnode_trim(ps->cur); ps->cur = ps->cur->parent; } - ps->cur = ps->cur->parent; + + for (elem = elements; elem->name != NULL; elem++) + if (strcmp(elem->name, name) == 0) + break; + + switch (elem->node) { + case NODE_IGNORE: + case NODE_WARN: + break; + default: + assert(elem->node == ps->cur->node); + ps->cur = ps->cur->parent; + } } struct parse *