Annotation of docbook2mdoc/node.h, Revision 1.16
1.16 ! schwarze 1: /* $Id: node.h,v 1.15 2019/04/09 15:23:51 schwarze Exp $ */
1.1 schwarze 2: /*
3: * Copyright (c) 2014 Kristaps Dzonsons <kristaps@bsd.lv>
4: * Copyright (c) 2019 Ingo Schwarze <schwarze@openbsd.org>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18: #include <sys/queue.h>
19:
20: /*
21: * The interface of the DocBook syntax tree.
22: */
23:
24: /*
25: * All node types used for formatting purposes.
26: * More DocBook XML elements are recognized, but remapped or discarded.
27: */
28: enum nodeid {
1.4 schwarze 29: NODE_DELETE_WARN,
30: NODE_DELETE,
31: NODE_IGNORE,
1.1 schwarze 32: /* Alpha-ordered hereafter. */
33: NODE_AFFILIATION,
1.12 schwarze 34: NODE_APPENDIX,
1.1 schwarze 35: NODE_APPLICATION,
36: NODE_ARG,
37: NODE_AUTHOR,
38: NODE_AUTHORGROUP,
39: NODE_BLOCKQUOTE,
40: NODE_BOOKINFO,
41: NODE_CAUTION,
42: NODE_CITEREFENTRY,
43: NODE_CITETITLE,
44: NODE_CMDSYNOPSIS,
45: NODE_COLSPEC,
46: NODE_COMMAND,
47: NODE_CONSTANT,
1.6 schwarze 48: NODE_CONTRIB,
1.1 schwarze 49: NODE_COPYRIGHT,
50: NODE_DATE,
1.13 schwarze 51: NODE_DOCTYPE,
1.1 schwarze 52: NODE_EDITOR,
53: NODE_EMAIL,
54: NODE_EMPHASIS,
1.13 schwarze 55: NODE_ENTITY,
1.1 schwarze 56: NODE_ENTRY,
57: NODE_ENVAR,
1.9 schwarze 58: NODE_ERRORNAME,
1.7 schwarze 59: NODE_ESCAPE,
1.1 schwarze 60: NODE_FIELDSYNOPSIS,
61: NODE_FILENAME,
62: NODE_FIRSTTERM,
63: NODE_FOOTNOTE,
64: NODE_FUNCDEF,
65: NODE_FUNCPROTOTYPE,
66: NODE_FUNCSYNOPSIS,
67: NODE_FUNCSYNOPSISINFO,
68: NODE_FUNCTION,
69: NODE_GLOSSTERM,
70: NODE_GROUP,
71: NODE_HOLDER,
1.14 schwarze 72: NODE_INCLUDE,
1.1 schwarze 73: NODE_INDEX,
74: NODE_INFO,
75: NODE_INFORMALEQUATION,
76: NODE_INLINEEQUATION,
77: NODE_ITEMIZEDLIST,
78: NODE_KEYSYM,
79: NODE_LEGALNOTICE,
80: NODE_LINK,
81: NODE_LISTITEM,
82: NODE_LITERAL,
83: NODE_LITERALLAYOUT,
84: NODE_MANVOLNUM,
85: NODE_MEMBER,
86: NODE_MML_MATH,
87: NODE_MML_MFENCED,
88: NODE_MML_MFRAC,
89: NODE_MML_MI,
90: NODE_MML_MN,
91: NODE_MML_MO,
92: NODE_MML_MROW,
93: NODE_MML_MSUB,
94: NODE_MML_MSUP,
95: NODE_MODIFIER,
96: NODE_NOTE,
97: NODE_OPTION,
98: NODE_ORDEREDLIST,
99: NODE_ORGNAME,
100: NODE_PARA,
101: NODE_PARAMDEF,
102: NODE_PARAMETER,
103: NODE_PERSONNAME,
104: NODE_PREFACE,
105: NODE_PROGRAMLISTING,
106: NODE_PROMPT,
107: NODE_QUOTE,
108: NODE_REFCLASS,
109: NODE_REFDESCRIPTOR,
110: NODE_REFENTRY,
111: NODE_REFENTRYINFO,
112: NODE_REFENTRYTITLE,
113: NODE_REFMETA,
114: NODE_REFMETAINFO,
115: NODE_REFMISCINFO,
116: NODE_REFNAME,
117: NODE_REFNAMEDIV,
118: NODE_REFPURPOSE,
119: NODE_REFSYNOPSISDIV,
120: NODE_RELEASEINFO,
121: NODE_REPLACEABLE,
122: NODE_ROW,
123: NODE_SBR,
124: NODE_SCREEN,
125: NODE_SECTION,
126: NODE_SGMLTAG,
127: NODE_SIMPLELIST,
128: NODE_SPANSPEC,
129: NODE_SUBTITLE,
130: NODE_SYNOPSIS,
131: NODE_TABLE,
132: NODE_TBODY,
133: NODE_TERM,
134: NODE_TEXT,
135: NODE_TFOOT,
136: NODE_TGROUP,
137: NODE_THEAD,
138: NODE_TIP,
139: NODE_TITLE,
140: NODE_TYPE,
141: NODE_ULINK,
142: NODE_VARIABLELIST,
143: NODE_VARLISTENTRY,
144: NODE_VARNAME,
145: NODE_WARNING,
146: NODE_WORDASWORD,
147: NODE_YEAR,
148: NODE__MAX
149: };
150:
151: /*
152: * All recognised attribute keys.
153: * Other attributes are discarded.
154: */
155: enum attrkey {
156: /* Alpha-order... */
157: ATTRKEY_CHOICE = 0,
158: ATTRKEY_CLASS,
159: ATTRKEY_CLOSE,
1.8 schwarze 160: ATTRKEY_COLS,
1.13 schwarze 161: ATTRKEY_DEFINITION,
1.11 schwarze 162: ATTRKEY_ENDTERM,
1.14 schwarze 163: ATTRKEY_HREF,
1.1 schwarze 164: ATTRKEY_ID,
165: ATTRKEY_LINKEND,
1.13 schwarze 166: ATTRKEY_NAME,
1.1 schwarze 167: ATTRKEY_OPEN,
1.13 schwarze 168: ATTRKEY_PUBLIC,
1.1 schwarze 169: ATTRKEY_REP,
1.13 schwarze 170: ATTRKEY_SYSTEM,
1.11 schwarze 171: ATTRKEY_URL,
172: ATTRKEY_XLINK_HREF,
1.1 schwarze 173: ATTRKEY__MAX
174: };
175:
176: /*
177: * All explicitly recognised attribute values.
178: * If an attribute has ATTRVAL__MAX, it is treated as free-form.
179: */
180: enum attrval {
181: /* Alpha-order... */
182: ATTRVAL_MONOSPACED,
183: ATTRVAL_NOREPEAT,
184: ATTRVAL_OPT,
185: ATTRVAL_PLAIN,
186: ATTRVAL_REPEAT,
187: ATTRVAL_REQ,
188: ATTRVAL__MAX
189: };
190:
191: TAILQ_HEAD(pnodeq, pnode);
192: TAILQ_HEAD(pattrq, pattr);
193:
194: /*
195: * One DocBook XML element attribute.
196: */
197: struct pattr {
198: enum attrkey key;
199: enum attrval val;
200: char *rawval;
201: TAILQ_ENTRY(pattr) child;
202: };
203:
204: /*
205: * One DocBook XML element.
206: */
207: struct pnode {
208: enum nodeid node; /* Node type. */
209: char *b; /* String value. */
1.10 schwarze 210: int spc; /* Whitespace before this node. */
1.1 schwarze 211: struct pnode *parent; /* Parent node or NULL. */
212: struct pnodeq childq; /* Queue of children. */
213: struct pattrq attrq; /* Attributes of the node. */
214: TAILQ_ENTRY(pnode) child;
215: };
216:
217: /*
218: * The parse result for one complete DocBook XML document.
219: */
220: struct ptree {
221: struct pnode *root; /* The document element. */
222: int flags;
1.15 schwarze 223: #define TREE_ERROR (1 << 0) /* A parse error occurred. */
224: #define TREE_WARN (1 << 1) /* A parser warning occurred. */
225: #define TREE_EQN (1 << 2) /* The document needs inline eqn(7). */
226: #define TREE_CLOSED (1 << 3) /* The document element was closed. */
1.1 schwarze 227: };
228:
229:
230: enum attrkey attrkey_parse(const char *);
231: enum attrval attrval_parse(const char *);
232: void pnode_unlink(struct pnode *);
233: void pnode_unlinksub(struct pnode *);
234: enum attrval pnode_getattr(struct pnode *, enum attrkey);
235: const char *pnode_getattr_raw(struct pnode *, enum attrkey, const char *);
236: struct pnode *pnode_findfirst(struct pnode *, enum nodeid);
CVSweb