File: [cvsweb.bsd.lv] / docbook2mdoc / node.h (download)
Revision 1.21, Fri Apr 12 19:14:50 2019 UTC (5 years, 5 months ago) by schwarze
Branch: MAIN
Changes since 1.20: +3 -1 lines
Implement lint and tree dump output modes.
Thanks to the previously committed node property infrastructure
in node.c, this needs only 110 lines of code (including the license
and the documentation).
|
/* $Id: node.h,v 1.21 2019/04/12 19:14:50 schwarze Exp $ */
/*
* Copyright (c) 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2019 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/queue.h>
/*
* The interface of the DocBook syntax tree.
*/
/*
* How the output from each node behaves
* with respect to mdoc(7) structure.
*/
enum nodeclass {
CLASS_VOID = 0, /* No output at all, children are skipped. */
CLASS_TEXT, /* Node prints only text, no macros. */
CLASS_TRANS, /* Transparent: only the children are shown. */
CLASS_LINE, /* Generates only simple in-line macros. */
CLASS_ENCL, /* Explicit or implicit partial blocks. */
CLASS_BLOCK /* Output linebreak before and after. */
};
/*
* All node types used for formatting purposes.
* More DocBook XML elements are recognized, but remapped or discarded.
*/
enum nodeid {
NODE_AFFILIATION,
NODE_APPENDIX,
NODE_APPLICATION,
NODE_ARG,
NODE_AUTHOR,
NODE_AUTHORGROUP,
NODE_BLOCKQUOTE,
NODE_BOOKINFO,
NODE_CAUTION,
NODE_CITEREFENTRY,
NODE_CITETITLE,
NODE_CMDSYNOPSIS,
NODE_COLSPEC,
NODE_COMMAND,
NODE_CONSTANT,
NODE_CONTRIB,
NODE_COPYRIGHT,
NODE_DATE,
NODE_DOCTYPE,
NODE_EDITOR,
NODE_EMAIL,
NODE_EMPHASIS,
NODE_ENTITY,
NODE_ENTRY,
NODE_ENVAR,
NODE_ERRORNAME,
NODE_FIELDSYNOPSIS,
NODE_FILENAME,
NODE_FIRSTTERM,
NODE_FOOTNOTE,
NODE_FUNCDEF,
NODE_FUNCPROTOTYPE,
NODE_FUNCSYNOPSIS,
NODE_FUNCSYNOPSISINFO,
NODE_FUNCTION,
NODE_GLOSSTERM,
NODE_GROUP,
NODE_HOLDER,
NODE_INCLUDE,
NODE_INDEX,
NODE_INFO,
NODE_INFORMALEQUATION,
NODE_INLINEEQUATION,
NODE_ITEMIZEDLIST,
NODE_KEYSYM,
NODE_LEGALNOTICE,
NODE_LINK,
NODE_LISTITEM,
NODE_LITERAL,
NODE_LITERALLAYOUT,
NODE_MANVOLNUM,
NODE_MARKUP,
NODE_MEMBER,
NODE_MML_MATH,
NODE_MML_MFENCED,
NODE_MML_MFRAC,
NODE_MML_MI,
NODE_MML_MN,
NODE_MML_MO,
NODE_MML_MROW,
NODE_MML_MSUB,
NODE_MML_MSUP,
NODE_MODIFIER,
NODE_NOTE,
NODE_OPTION,
NODE_ORDEREDLIST,
NODE_ORGNAME,
NODE_PARA,
NODE_PARAMDEF,
NODE_PARAMETER,
NODE_PERSONNAME,
NODE_PREFACE,
NODE_PROGRAMLISTING,
NODE_PROMPT,
NODE_QUOTE,
NODE_REFCLASS,
NODE_REFDESCRIPTOR,
NODE_REFENTRY,
NODE_REFENTRYINFO,
NODE_REFENTRYTITLE,
NODE_REFMETA,
NODE_REFMETAINFO,
NODE_REFMISCINFO,
NODE_REFNAME,
NODE_REFNAMEDIV,
NODE_REFPURPOSE,
NODE_REFSYNOPSISDIV,
NODE_RELEASEINFO,
NODE_REPLACEABLE,
NODE_ROW,
NODE_SBR,
NODE_SCREEN,
NODE_SECTION,
NODE_SIMPLELIST,
NODE_SPANSPEC,
NODE_SUBTITLE,
NODE_SYNOPSIS,
NODE_TABLE,
NODE_TBODY,
NODE_TERM,
NODE_TFOOT,
NODE_TGROUP,
NODE_THEAD,
NODE_TIP,
NODE_TITLE,
NODE_TYPE,
NODE_VARIABLELIST,
NODE_VARLISTENTRY,
NODE_VARNAME,
NODE_WARNING,
NODE_WORDASWORD,
NODE_YEAR,
NODE_UNKNOWN,
NODE_TEXT,
NODE_ESCAPE,
NODE_IGNORE,
NODE_DELETE,
NODE_DELETE_WARN
};
/*
* All recognised attribute keys.
* Other attributes are discarded.
*/
enum attrkey {
/* Alpha-order... */
ATTRKEY_CHOICE = 0,
ATTRKEY_CLASS,
ATTRKEY_CLOSE,
ATTRKEY_COLS,
ATTRKEY_DEFINITION,
ATTRKEY_ENDTERM,
ATTRKEY_HREF,
ATTRKEY_ID,
ATTRKEY_LINKEND,
ATTRKEY_NAME,
ATTRKEY_OPEN,
ATTRKEY_PUBLIC,
ATTRKEY_REP,
ATTRKEY_SYSTEM,
ATTRKEY_URL,
ATTRKEY_XLINK_HREF,
ATTRKEY__MAX
};
/*
* All explicitly recognised attribute values.
* If an attribute has ATTRVAL__MAX, it is treated as free-form.
*/
enum attrval {
/* Alpha-order... */
ATTRVAL_MONOSPACED,
ATTRVAL_NOREPEAT,
ATTRVAL_OPT,
ATTRVAL_PLAIN,
ATTRVAL_REPEAT,
ATTRVAL_REQ,
ATTRVAL__MAX
};
TAILQ_HEAD(pnodeq, pnode);
TAILQ_HEAD(pattrq, pattr);
/*
* One DocBook XML element attribute.
*/
struct pattr {
enum attrkey key;
enum attrval val;
char *rawval;
TAILQ_ENTRY(pattr) child;
};
/*
* One DocBook XML element.
*/
struct pnode {
enum nodeid node; /* Node type. */
char *b; /* String value. */
int spc; /* Whitespace before this node. */
struct pnode *parent; /* Parent node or NULL. */
struct pnodeq childq; /* Queue of children. */
struct pattrq attrq; /* Attributes of the node. */
TAILQ_ENTRY(pnode) child;
};
/*
* The parse result for one complete DocBook XML document.
*/
struct ptree {
struct pnode *root; /* The document element. */
int flags;
#define TREE_ERROR (1 << 0) /* A parse error occurred. */
#define TREE_WARN (1 << 1) /* A parser warning occurred. */
#define TREE_CLOSED (1 << 3) /* The document element was closed. */
};
enum attrkey attrkey_parse(const char *);
const char *attrkey_name(enum attrkey);
enum attrval attrval_parse(const char *);
const char *attr_getval(const struct pattr *a);
enum nodeid pnode_parse(const char *name);
const char *pnode_name(enum nodeid);
enum nodeclass pnode_class(enum nodeid);
struct pnode *pnode_alloc(struct pnode *);
void pnode_unlink(struct pnode *);
void pnode_unlinksub(struct pnode *);
enum attrval pnode_getattr(struct pnode *, enum attrkey);
const char *pnode_getattr_raw(struct pnode *, enum attrkey, const char *);
struct pnode *pnode_findfirst(struct pnode *, enum nodeid);