blob: 72de123b12d65a3cc92e87f974f3b9da6bb1268f (
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
|
#ifndef HTML_PARSER_H
#define HTML_PARSER_H
/*
A small html parser with no dependencies and doesn't dynamically allocate any memory
and can parse and repair broken html (just like web browsers)
*/
#include <stddef.h>
typedef struct {
const char *data;
size_t size;
} StringView;
typedef struct HtmlParser HtmlParser;
typedef enum{
HTML_PARSE_TAG_START,
HTML_PARSE_TAG_END,
HTML_PARSE_ATTRIBUTE,
HTML_PARSE_TEXT,
HTML_PARSE_JAVASCRIPT_CODE
} HtmlParseType;
typedef void (*HtmlParseCallback)(HtmlParser *html_parser, HtmlParseType parse_type, void *userdata);
#define UNCLOSED_TAGS_SIZE 2048
struct HtmlParser {
const char *source;
size_t source_len;
size_t offset;
HtmlParseCallback parse_callback;
void *callback_userdata;
StringView tag_name;
StringView attribute_key;
StringView attribute_value;
StringView text;
int is_tag_void;
int inside_script_tag;
size_t unclosed_tags_offset;
StringView unclosed_tags[UNCLOSED_TAGS_SIZE];
};
void html_parser_init(HtmlParser *self, const char *html_source, size_t len, HtmlParseCallback parse_callback, void *userdata);
void html_parser_deinit(HtmlParser *self);
void html_parser_parse(HtmlParser *self);
#endif /* HTML_PARSER_H */
|