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