Blame cbits/tagfilter.c

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
}