[BACK]Return to node.h CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / docbook2mdoc

File: [cvsweb.bsd.lv] / docbook2mdoc / node.h (download)

Revision 1.11, Sun Apr 7 17:00:56 2019 UTC (4 years, 11 months ago) by schwarze
Branch: MAIN
Changes since 1.10: +4 -1 lines

better handling of <link> and <ulink> elements
including endterm=, linkend=, url=, and xlink:href= attributes

/* $Id: node.h,v 1.11 2019/04/07 17:00:56 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.
 */

/*
 * All node types used for formatting purposes.
 * More DocBook XML elements are recognized, but remapped or discarded.
 */
enum	nodeid {
	NODE_DELETE_WARN,
	NODE_DELETE,
	NODE_IGNORE,
	/* Alpha-ordered hereafter. */
	NODE_AFFILIATION,
	NODE_APPLICATION,
	NODE_ARG,
	NODE_AUTHOR,
	NODE_AUTHORGROUP,
	NODE_BLOCKQUOTE,
	NODE_BOOK,
	NODE_BOOKINFO,
	NODE_CAUTION,
	NODE_CITEREFENTRY,
	NODE_CITETITLE,
	NODE_CMDSYNOPSIS,
	NODE_COLSPEC,
	NODE_COMMAND,
	NODE_CONSTANT,
	NODE_CONTRIB,
	NODE_COPYRIGHT,
	NODE_DATE,
	NODE_EDITOR,
	NODE_EMAIL,
	NODE_EMPHASIS,
	NODE_ENTRY,
	NODE_ENVAR,
	NODE_ERRORNAME,
	NODE_ESCAPE,
	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_INDEX,
	NODE_INFO,
	NODE_INFORMALEQUATION,
	NODE_INLINEEQUATION,
	NODE_ITEMIZEDLIST,
	NODE_KEYSYM,
	NODE_LEGALNOTICE,
	NODE_LINK,
	NODE_LISTITEM,
	NODE_LITERAL,
	NODE_LITERALLAYOUT,
	NODE_MANVOLNUM,
	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_SGMLTAG,
	NODE_SIMPLELIST,
	NODE_SPANSPEC,
	NODE_SUBTITLE,
	NODE_SYNOPSIS,
	NODE_TABLE,
	NODE_TBODY,
	NODE_TERM,
	NODE_TEXT,
	NODE_TFOOT,
	NODE_TGROUP,
	NODE_THEAD,
	NODE_TIP,
	NODE_TITLE,
	NODE_TYPE,
	NODE_ULINK,
	NODE_VARIABLELIST,
	NODE_VARLISTENTRY,
	NODE_VARNAME,
	NODE_WARNING,
	NODE_WORDASWORD,
	NODE_YEAR,
	NODE__MAX
};

/*
 * All recognised attribute keys.
 * Other attributes are discarded.
 */
enum	attrkey {
	/* Alpha-order... */
	ATTRKEY_CHOICE = 0,
	ATTRKEY_CLASS,
	ATTRKEY_CLOSE,
	ATTRKEY_COLS,
	ATTRKEY_ENDTERM,
	ATTRKEY_ID,
	ATTRKEY_LINKEND,
	ATTRKEY_OPEN,
	ATTRKEY_REP,
	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. */
	char		*real;     /* Storage for "b". */
	size_t		 bsz;      /* strlen(b) */
	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_FAIL	 (1 << 0)  /* A fatal parse error occurred. */
#define	TREE_EQN	 (1 << 1)  /* The document needs inline eqn(7). */
#define	TREE_CLOSED	 (1 << 2)  /* The document element was closed. */
};


enum attrkey	 attrkey_parse(const char *);
enum attrval	 attrval_parse(const char *);
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);