|
Packit |
1f51f5 |
#include "tagfilter.h"
|
|
Packit |
1f51f5 |
#include <parser.h>
|
|
Packit |
1f51f5 |
#include <ctype.h>
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
static const char *blacklist[] = {
|
|
Packit |
1f51f5 |
"title", "textarea", "style", "xmp", "iframe",
|
|
Packit |
1f51f5 |
"noembed", "noframes", "script", "plaintext", NULL,
|
|
Packit |
1f51f5 |
};
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
static int is_tag(const unsigned char *tag_data, size_t tag_size,
|
|
Packit |
1f51f5 |
const char *tagname) {
|
|
Packit |
1f51f5 |
size_t i;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
if (tag_size < 3 || tag_data[0] != '<')
|
|
Packit |
1f51f5 |
return 0;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
i = 1;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
if (tag_data[i] == '/') {
|
|
Packit |
1f51f5 |
i++;
|
|
Packit |
1f51f5 |
}
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
for (; i < tag_size; ++i, ++tagname) {
|
|
Packit |
1f51f5 |
if (*tagname == 0)
|
|
Packit |
1f51f5 |
break;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
if (tolower(tag_data[i]) != *tagname)
|
|
Packit |
1f51f5 |
return 0;
|
|
Packit |
1f51f5 |
}
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
if (i == tag_size)
|
|
Packit |
1f51f5 |
return 0;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
if (cmark_isspace(tag_data[i]) || tag_data[i] == '>')
|
|
Packit |
1f51f5 |
return 1;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
if (tag_data[i] == '/' && tag_size >= i + 2 && tag_data[i + 1] == '>')
|
|
Packit |
1f51f5 |
return 1;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
return 0;
|
|
Packit |
1f51f5 |
}
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
static int filter(cmark_syntax_extension *ext, const unsigned char *tag,
|
|
Packit |
1f51f5 |
size_t tag_len) {
|
|
Packit |
1f51f5 |
const char **it;
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
for (it = blacklist; *it; ++it) {
|
|
Packit |
1f51f5 |
if (is_tag(tag, tag_len, *it)) {
|
|
Packit |
1f51f5 |
return 0;
|
|
Packit |
1f51f5 |
}
|
|
Packit |
1f51f5 |
}
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
return 1;
|
|
Packit |
1f51f5 |
}
|
|
Packit |
1f51f5 |
|
|
Packit |
1f51f5 |
cmark_syntax_extension *create_tagfilter_extension(void) {
|
|
Packit |
1f51f5 |
cmark_syntax_extension *ext = cmark_syntax_extension_new("tagfilter");
|
|
Packit |
1f51f5 |
cmark_syntax_extension_set_html_filter_func(ext, filter);
|
|
Packit |
1f51f5 |
return ext;
|
|
Packit |
1f51f5 |
}
|