aboutsummaryrefslogtreecommitdiff
path: root/gumbo_parser/gumbo.nim
blob: 0e0ce4ec86b71065a52193deb3e5b69c79e9b310 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254


const libgumbo_parser = "libgumbo_parser.a"

template gumboLibPath(): string =
  var path = currentSourcePath()
  var idx = len(path) - 1
  while idx > 0:
    if (path[idx] == '/') or (path[idx] == '\\'):
      break
    dec(idx)
  path = path[0..idx] & libgumbo_parser
  path

{.passL:gumboLibPath().}

type
  GumboSourcePosition* {.bycopy.} = object
    line*: cuint
    column*: cuint
    offset*: cuint



var kGumboEmptySourcePosition* {.importc: "kGumboEmptySourcePosition".}: GumboSourcePosition


type
  GumboStringPiece* {.bycopy.} = object
    data*: cstring
    length*: csize



var kGumboEmptyString* {.importc: "kGumboEmptyString".}: GumboStringPiece


proc gumbo_string_equals*(str1: ptr GumboStringPiece; str2: ptr GumboStringPiece): bool {.
    importc: "gumbo_string_equals".}

proc gumbo_string_equals_ignore_case*(str1: ptr GumboStringPiece;
                                     str2: ptr GumboStringPiece): bool {.
    importc: "gumbo_string_equals_ignore_case".}

type
  GumboVector* {.bycopy.} = object
    data*: ptr pointer
    length*: cuint
    capacity*: cuint



var kGumboEmptyVector* {.importc: "kGumboEmptyVector".}: GumboVector


proc gumbo_vector_index_of*(vector: ptr GumboVector; element: pointer): cint {.
    importc: "gumbo_vector_index_of".}

type
  GumboTag* {.size: sizeof(cint).} = enum
    GUMBO_TAG_HTML, GUMBO_TAG_HEAD, GUMBO_TAG_TITLE, GUMBO_TAG_BASE, GUMBO_TAG_LINK,
    GUMBO_TAG_META, GUMBO_TAG_STYLE, GUMBO_TAG_SCRIPT, GUMBO_TAG_NOSCRIPT,
    GUMBO_TAG_TEMPLATE, GUMBO_TAG_BODY, GUMBO_TAG_ARTICLE, GUMBO_TAG_SECTION,
    GUMBO_TAG_NAV, GUMBO_TAG_ASIDE, GUMBO_TAG_H1, GUMBO_TAG_H2, GUMBO_TAG_H3,
    GUMBO_TAG_H4, GUMBO_TAG_H5, GUMBO_TAG_H6, GUMBO_TAG_HGROUP, GUMBO_TAG_HEADER,
    GUMBO_TAG_FOOTER, GUMBO_TAG_ADDRESS, GUMBO_TAG_P, GUMBO_TAG_HR, GUMBO_TAG_PRE,
    GUMBO_TAG_BLOCKQUOTE, GUMBO_TAG_OL, GUMBO_TAG_UL, GUMBO_TAG_LI, GUMBO_TAG_DL,
    GUMBO_TAG_DT, GUMBO_TAG_DD, GUMBO_TAG_FIGURE, GUMBO_TAG_FIGCAPTION,
    GUMBO_TAG_MAIN, GUMBO_TAG_DIV, GUMBO_TAG_A, GUMBO_TAG_EM, GUMBO_TAG_STRONG,
    GUMBO_TAG_SMALL, GUMBO_TAG_S, GUMBO_TAG_CITE, GUMBO_TAG_Q, GUMBO_TAG_DFN,
    GUMBO_TAG_ABBR, GUMBO_TAG_DATA, GUMBO_TAG_TIME, GUMBO_TAG_CODE, GUMBO_TAG_VAR,
    GUMBO_TAG_SAMP, GUMBO_TAG_KBD, GUMBO_TAG_SUB, GUMBO_TAG_SUP, GUMBO_TAG_I,
    GUMBO_TAG_B, GUMBO_TAG_U, GUMBO_TAG_MARK, GUMBO_TAG_RUBY, GUMBO_TAG_RT,
    GUMBO_TAG_RP, GUMBO_TAG_BDI, GUMBO_TAG_BDO, GUMBO_TAG_SPAN, GUMBO_TAG_BR,
    GUMBO_TAG_WBR, GUMBO_TAG_INS, GUMBO_TAG_DEL, GUMBO_TAG_IMAGE, GUMBO_TAG_IMG,
    GUMBO_TAG_IFRAME, GUMBO_TAG_EMBED, GUMBO_TAG_OBJECT, GUMBO_TAG_PARAM,
    GUMBO_TAG_VIDEO, GUMBO_TAG_AUDIO, GUMBO_TAG_SOURCE, GUMBO_TAG_TRACK,
    GUMBO_TAG_CANVAS, GUMBO_TAG_MAP, GUMBO_TAG_AREA, GUMBO_TAG_MATH, GUMBO_TAG_MI,
    GUMBO_TAG_MO, GUMBO_TAG_MN, GUMBO_TAG_MS, GUMBO_TAG_MTEXT, GUMBO_TAG_MGLYPH,
    GUMBO_TAG_MALIGNMARK, GUMBO_TAG_ANNOTATION_XML, GUMBO_TAG_SVG,
    GUMBO_TAG_FOREIGNOBJECT, GUMBO_TAG_DESC, GUMBO_TAG_TABLE, GUMBO_TAG_CAPTION,
    GUMBO_TAG_COLGROUP, GUMBO_TAG_COL, GUMBO_TAG_TBODY, GUMBO_TAG_THEAD,
    GUMBO_TAG_TFOOT, GUMBO_TAG_TR, GUMBO_TAG_TD, GUMBO_TAG_TH, GUMBO_TAG_FORM,
    GUMBO_TAG_FIELDSET, GUMBO_TAG_LEGEND, GUMBO_TAG_LABEL, GUMBO_TAG_INPUT,
    GUMBO_TAG_BUTTON, GUMBO_TAG_SELECT, GUMBO_TAG_DATALIST, GUMBO_TAG_OPTGROUP,
    GUMBO_TAG_OPTION, GUMBO_TAG_TEXTAREA, GUMBO_TAG_KEYGEN, GUMBO_TAG_OUTPUT,
    GUMBO_TAG_PROGRESS, GUMBO_TAG_METER, GUMBO_TAG_DETAILS, GUMBO_TAG_SUMMARY,
    GUMBO_TAG_MENU, GUMBO_TAG_MENUITEM, GUMBO_TAG_APPLET, GUMBO_TAG_ACRONYM,
    GUMBO_TAG_BGSOUND, GUMBO_TAG_DIR, GUMBO_TAG_FRAME, GUMBO_TAG_FRAMESET,
    GUMBO_TAG_NOFRAMES, GUMBO_TAG_ISINDEX, GUMBO_TAG_LISTING, GUMBO_TAG_XMP,
    GUMBO_TAG_NEXTID, GUMBO_TAG_NOEMBED, GUMBO_TAG_PLAINTEXT, GUMBO_TAG_RB,
    GUMBO_TAG_STRIKE, GUMBO_TAG_BASEFONT, GUMBO_TAG_BIG, GUMBO_TAG_BLINK,
    GUMBO_TAG_CENTER, GUMBO_TAG_FONT, GUMBO_TAG_MARQUEE, GUMBO_TAG_MULTICOL,
    GUMBO_TAG_NOBR, GUMBO_TAG_SPACER, GUMBO_TAG_TT, GUMBO_TAG_RTC,
    GUMBO_TAG_UNKNOWN, GUMBO_TAG_LAST



proc gumbo_normalized_tagname*(tag: GumboTag): cstring {.
    importc: "gumbo_normalized_tagname".}

proc gumbo_tag_from_original_text*(text: ptr GumboStringPiece) {.
    importc: "gumbo_tag_from_original_text".}

proc gumbo_normalize_svg_tagname*(tagname: ptr GumboStringPiece): cstring {.
    importc: "gumbo_normalize_svg_tagname".}

proc gumbo_tag_enum*(tagname: cstring): GumboTag {.importc: "gumbo_tag_enum".}
proc gumbo_tagn_enum*(tagname: cstring; length: cuint): GumboTag {.
    importc: "gumbo_tagn_enum".}

type
  GumboAttributeNamespaceEnum* {.size: sizeof(cint).} = enum
    GUMBO_ATTR_NAMESPACE_NONE, GUMBO_ATTR_NAMESPACE_XLINK,
    GUMBO_ATTR_NAMESPACE_XML, GUMBO_ATTR_NAMESPACE_XMLNS



type
  GumboAttribute* {.bycopy.} = object
    attr_namespace*: GumboAttributeNamespaceEnum
    name*: cstring
    original_name*: GumboStringPiece
    value*: cstring
    original_value*: GumboStringPiece
    name_start*: GumboSourcePosition
    name_end*: GumboSourcePosition
    value_start*: GumboSourcePosition
    value_end*: GumboSourcePosition



proc gumbo_get_attribute*(attrs: ptr GumboVector; name: cstring): ptr GumboAttribute {.
    importc: "gumbo_get_attribute".}

type
  GumboNodeType* {.size: sizeof(cint).} = enum
    GUMBO_NODE_DOCUMENT, GUMBO_NODE_ELEMENT, GUMBO_NODE_TEXT, GUMBO_NODE_CDATA,
    GUMBO_NODE_COMMENT, GUMBO_NODE_WHITESPACE, GUMBO_NODE_TEMPLATE



type
  GumboQuirksModeEnum* {.size: sizeof(cint).} = enum
    GUMBO_DOCTYPE_NO_QUIRKS, GUMBO_DOCTYPE_QUIRKS, GUMBO_DOCTYPE_LIMITED_QUIRKS



type
  GumboNamespaceEnum* {.size: sizeof(cint).} = enum
    GUMBO_NAMESPACE_HTML, GUMBO_NAMESPACE_SVG, GUMBO_NAMESPACE_MATHML



type
  GumboParseFlags* {.size: sizeof(cint).} = enum
    GUMBO_INSERTION_NORMAL = 0, GUMBO_INSERTION_BY_PARSER = 1 shl 0,
    GUMBO_INSERTION_IMPLICIT_END_TAG = 1 shl 1, GUMBO_INSERTION_IMPLIED = 1 shl 3,
    GUMBO_INSERTION_CONVERTED_FROM_END_TAG = 1 shl 4,
    GUMBO_INSERTION_FROM_ISINDEX = 1 shl 5, GUMBO_INSERTION_FROM_IMAGE = 1 shl 6,
    GUMBO_INSERTION_RECONSTRUCTED_FORMATTING_ELEMENT = 1 shl 7,
    GUMBO_INSERTION_ADOPTION_AGENCY_CLONED = 1 shl 8,
    GUMBO_INSERTION_ADOPTION_AGENCY_MOVED = 1 shl 9,
    GUMBO_INSERTION_FOSTER_PARENTED = 1 shl 10



type
  GumboDocument* {.bycopy.} = object
    children*: GumboVector
    has_doctype*: bool
    name*: cstring
    public_identifier*: cstring
    system_identifier*: cstring
    doc_type_quirks_mode*: GumboQuirksModeEnum



type
  GumboText* {.bycopy.} = object
    text*: cstring
    original_text*: GumboStringPiece
    start_pos*: GumboSourcePosition



type
  GumboElement* {.bycopy.} = object
    children*: GumboVector
    tag*: GumboTag
    tag_namespace*: GumboNamespaceEnum
    original_tag*: GumboStringPiece
    original_end_tag*: GumboStringPiece
    start_pos*: GumboSourcePosition
    end_pos*: GumboSourcePosition
    attributes*: GumboVector



type
  INNER_C_UNION_1056773149* {.bycopy.} = object {.union.}
    document*: GumboDocument
    element*: GumboElement
    text*: GumboText

  GumboNode* {.bycopy.} = object
    `type`*: GumboNodeType
    parent*: ptr GumboNode
    index_within_parent*: csize
    parse_flags*: GumboParseFlags
    v*: INNER_C_UNION_1056773149



type
  GumboAllocatorFunction* = proc (userdata: pointer; size: csize): pointer


type
  GumboDeallocatorFunction* = proc (userdata: pointer; `ptr`: pointer)


type
  GumboOptions* {.bycopy.} = object
    allocator*: GumboAllocatorFunction
    deallocator*: GumboDeallocatorFunction
    userdata*: pointer
    tab_stop*: cint
    stop_on_first_error*: bool
    max_errors*: cint
    fragment_context*: GumboTag
    fragment_namespace*: GumboNamespaceEnum



var kGumboDefaultOptions* {.importc: "kGumboDefaultOptions".}: GumboOptions


type
  GumboOutput* {.bycopy.} = object
    document*: ptr GumboNode
    root*: ptr GumboNode
    errors*: GumboVector



proc gumbo_parse*(buffer: cstring): ptr GumboOutput {.importc: "gumbo_parse".}

proc gumbo_parse_with_options*(options: ptr GumboOptions; buffer: cstring;
                              buffer_length: csize): ptr GumboOutput {.
    importc: "gumbo_parse_with_options".}

proc gumbo_destroy_output*(options: ptr GumboOptions; output: ptr GumboOutput) {.
    importc: "gumbo_destroy_output".}