Annotation of docbook2mdoc/node.h, Revision 1.25
1.25 ! schwarze 1: /* $Id: node.h,v 1.24 2019/04/14 14:00:16 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: /*
1.20 schwarze 25: * How the output from each node behaves
26: * with respect to mdoc(7) structure.
27: */
28: enum nodeclass {
29: CLASS_VOID = 0, /* No output at all, children are skipped. */
30: CLASS_TEXT, /* Node prints only text, no macros. */
31: CLASS_TRANS, /* Transparent: only the children are shown. */
32: CLASS_LINE, /* Generates only simple in-line macros. */
33: CLASS_ENCL, /* Explicit or implicit partial blocks. */
34: CLASS_BLOCK /* Output linebreak before and after. */
35: };
36:
37: /*
1.1 schwarze 38: * All node types used for formatting purposes.
39: * More DocBook XML elements are recognized, but remapped or discarded.
40: */
41: enum nodeid {
1.12 schwarze 42: NODE_APPENDIX,
1.1 schwarze 43: NODE_ARG,
44: NODE_AUTHOR,
45: NODE_AUTHORGROUP,
46: NODE_BLOCKQUOTE,
47: NODE_BOOKINFO,
48: NODE_CAUTION,
49: NODE_CITEREFENTRY,
50: NODE_CITETITLE,
51: NODE_CMDSYNOPSIS,
52: NODE_COLSPEC,
53: NODE_COMMAND,
54: NODE_CONSTANT,
1.6 schwarze 55: NODE_CONTRIB,
1.1 schwarze 56: NODE_COPYRIGHT,
57: NODE_DATE,
1.13 schwarze 58: NODE_DOCTYPE,
1.1 schwarze 59: NODE_EDITOR,
60: NODE_EMAIL,
61: NODE_EMPHASIS,
1.13 schwarze 62: NODE_ENTITY,
1.1 schwarze 63: NODE_ENTRY,
64: NODE_ENVAR,
1.9 schwarze 65: NODE_ERRORNAME,
1.1 schwarze 66: NODE_FIELDSYNOPSIS,
67: NODE_FILENAME,
68: NODE_FIRSTTERM,
69: NODE_FOOTNOTE,
70: NODE_FUNCDEF,
71: NODE_FUNCPROTOTYPE,
72: NODE_FUNCSYNOPSIS,
73: NODE_FUNCSYNOPSISINFO,
74: NODE_FUNCTION,
75: NODE_GLOSSTERM,
76: NODE_GROUP,
1.14 schwarze 77: NODE_INCLUDE,
1.1 schwarze 78: NODE_INDEX,
79: NODE_INFO,
80: NODE_INFORMALEQUATION,
81: NODE_INLINEEQUATION,
82: NODE_ITEMIZEDLIST,
83: NODE_KEYSYM,
84: NODE_LEGALNOTICE,
85: NODE_LINK,
86: NODE_LISTITEM,
87: NODE_LITERAL,
88: NODE_LITERALLAYOUT,
89: NODE_MANVOLNUM,
1.18 schwarze 90: NODE_MARKUP,
1.1 schwarze 91: NODE_MEMBER,
92: NODE_MML_MATH,
93: NODE_MML_MFENCED,
94: NODE_MML_MFRAC,
95: NODE_MML_MI,
96: NODE_MML_MN,
97: NODE_MML_MO,
98: NODE_MML_MROW,
99: NODE_MML_MSUB,
100: NODE_MML_MSUP,
101: NODE_MODIFIER,
102: NODE_NOTE,
103: NODE_OPTION,
104: NODE_ORDEREDLIST,
105: NODE_PARA,
106: NODE_PARAMDEF,
107: NODE_PARAMETER,
108: NODE_PERSONNAME,
109: NODE_PREFACE,
110: NODE_PROGRAMLISTING,
111: NODE_PROMPT,
1.22 schwarze 112: NODE_PUBDATE,
1.1 schwarze 113: NODE_QUOTE,
114: NODE_REFCLASS,
115: NODE_REFDESCRIPTOR,
116: NODE_REFENTRY,
117: NODE_REFENTRYINFO,
118: NODE_REFENTRYTITLE,
119: NODE_REFMETA,
120: NODE_REFMETAINFO,
121: NODE_REFMISCINFO,
122: NODE_REFNAME,
123: NODE_REFNAMEDIV,
124: NODE_REFPURPOSE,
125: NODE_REFSYNOPSISDIV,
126: NODE_REPLACEABLE,
127: NODE_ROW,
128: NODE_SBR,
129: NODE_SCREEN,
130: NODE_SECTION,
131: NODE_SIMPLELIST,
1.25 ! schwarze 132: NODE_SIMPLESECT,
1.1 schwarze 133: NODE_SPANSPEC,
134: NODE_SUBTITLE,
135: NODE_SYNOPSIS,
1.23 schwarze 136: NODE_SYSTEMITEM,
1.1 schwarze 137: NODE_TABLE,
138: NODE_TBODY,
139: NODE_TERM,
140: NODE_TFOOT,
141: NODE_TGROUP,
142: NODE_THEAD,
143: NODE_TIP,
144: NODE_TITLE,
145: NODE_TYPE,
146: NODE_VARIABLELIST,
147: NODE_VARLISTENTRY,
148: NODE_VARNAME,
149: NODE_WARNING,
150: NODE_WORDASWORD,
1.20 schwarze 151: NODE_UNKNOWN,
152: NODE_TEXT,
153: NODE_ESCAPE,
154: NODE_IGNORE,
155: NODE_DELETE,
156: NODE_DELETE_WARN
1.1 schwarze 157: };
158:
159: /*
160: * All recognised attribute keys.
161: * Other attributes are discarded.
162: */
163: enum attrkey {
164: /* Alpha-order... */
165: ATTRKEY_CHOICE = 0,
166: ATTRKEY_CLASS,
167: ATTRKEY_CLOSE,
1.8 schwarze 168: ATTRKEY_COLS,
1.13 schwarze 169: ATTRKEY_DEFINITION,
1.11 schwarze 170: ATTRKEY_ENDTERM,
1.14 schwarze 171: ATTRKEY_HREF,
1.1 schwarze 172: ATTRKEY_ID,
173: ATTRKEY_LINKEND,
1.13 schwarze 174: ATTRKEY_NAME,
1.1 schwarze 175: ATTRKEY_OPEN,
1.13 schwarze 176: ATTRKEY_PUBLIC,
1.1 schwarze 177: ATTRKEY_REP,
1.13 schwarze 178: ATTRKEY_SYSTEM,
1.11 schwarze 179: ATTRKEY_URL,
180: ATTRKEY_XLINK_HREF,
1.1 schwarze 181: ATTRKEY__MAX
182: };
183:
184: /*
185: * All explicitly recognised attribute values.
186: * If an attribute has ATTRVAL__MAX, it is treated as free-form.
187: */
188: enum attrval {
189: /* Alpha-order... */
1.23 schwarze 190: ATTRVAL_EVENT,
191: ATTRVAL_IPADDRESS,
1.1 schwarze 192: ATTRVAL_MONOSPACED,
193: ATTRVAL_NOREPEAT,
194: ATTRVAL_OPT,
195: ATTRVAL_PLAIN,
196: ATTRVAL_REPEAT,
197: ATTRVAL_REQ,
1.23 schwarze 198: ATTRVAL_SYSTEMNAME,
1.1 schwarze 199: ATTRVAL__MAX
200: };
201:
202: TAILQ_HEAD(pnodeq, pnode);
203: TAILQ_HEAD(pattrq, pattr);
204:
205: /*
206: * One DocBook XML element attribute.
207: */
208: struct pattr {
209: enum attrkey key;
210: enum attrval val;
211: char *rawval;
212: TAILQ_ENTRY(pattr) child;
213: };
214:
215: /*
216: * One DocBook XML element.
217: */
218: struct pnode {
219: enum nodeid node; /* Node type. */
220: char *b; /* String value. */
1.10 schwarze 221: int spc; /* Whitespace before this node. */
1.1 schwarze 222: struct pnode *parent; /* Parent node or NULL. */
223: struct pnodeq childq; /* Queue of children. */
224: struct pattrq attrq; /* Attributes of the node. */
225: TAILQ_ENTRY(pnode) child;
226: };
227:
228: /*
229: * The parse result for one complete DocBook XML document.
230: */
231: struct ptree {
232: struct pnode *root; /* The document element. */
233: int flags;
1.15 schwarze 234: #define TREE_ERROR (1 << 0) /* A parse error occurred. */
235: #define TREE_WARN (1 << 1) /* A parser warning occurred. */
236: #define TREE_CLOSED (1 << 3) /* The document element was closed. */
1.1 schwarze 237: };
238:
239:
240: enum attrkey attrkey_parse(const char *);
1.21 schwarze 241: const char *attrkey_name(enum attrkey);
1.1 schwarze 242: enum attrval attrval_parse(const char *);
1.21 schwarze 243: const char *attr_getval(const struct pattr *a);
1.20 schwarze 244: enum nodeid pnode_parse(const char *name);
245: const char *pnode_name(enum nodeid);
246: enum nodeclass pnode_class(enum nodeid);
247:
1.17 schwarze 248: struct pnode *pnode_alloc(struct pnode *);
1.1 schwarze 249: void pnode_unlink(struct pnode *);
250: void pnode_unlinksub(struct pnode *);
251: enum attrval pnode_getattr(struct pnode *, enum attrkey);
252: const char *pnode_getattr_raw(struct pnode *, enum attrkey, const char *);
253: struct pnode *pnode_findfirst(struct pnode *, enum nodeid);
1.22 schwarze 254: struct pnode *pnode_takefirst(struct pnode *, enum nodeid);
CVSweb