static void pendElement(void *ctxt, const xmlChar * uname) { saxctxt *ctx = (saxctxt *) ctxt; const char *name = (const char *) uname; const htmlElemDesc *desc = htmlTagLookup(uname); #if 0 /* for now, err on the side of leaving stuff alone */ if ((ctx->cfg->doctype == fpi_html) || (ctx->cfg->doctype == fpi_xhtml)) { /* enforce html */ if (!desc || desc->depr) return; } else if ((ctx->cfg->doctype == fpi_html) || (ctx->cfg->doctype == fpi_xhtml)) { /* enforce html legacy */ if (!desc) return; } #endif if (ctx->offset > 0) { dump_content(ctx); ctx->offset = 0; /* having dumped it, we can re-use the memory */ } if (!desc || !desc->empty) { ap_fprintf(ctx->f->next, ctx->bb, "</%s>", name); } }
/* * call-seq: * [](tag_name) * * Get ElemementDescription for +tag_name+ */ static VALUE get_description(VALUE klass, VALUE tag_name) { const htmlElemDesc * description = htmlTagLookup( (const xmlChar *)StringValueCStr(tag_name) ); if(NULL == description) return Qnil; return Data_Wrap_Struct(klass, 0, 0, (void *)description); }
static void pstartElement(void *ctxt, const xmlChar * uname, const xmlChar ** uattrs) { int num_match; char *subs; int is_uri; const char **a; size_t s_to, s_from; saxctxt *ctx = (saxctxt *) ctxt; apr_array_header_t *linkattrs; int i; const char *name = (const char *) uname; const char **attrs = (const char **) uattrs; const htmlElemDesc *desc = htmlTagLookup(uname); /* VoxCDN FIXME: rewrite this, it's ridiculously bad */ #if 0 /* for now, err on the side of leaving stuff alone */ int enforce = 0; if ((ctx->cfg->doctype == fpi_html) || (ctx->cfg->doctype == fpi_xhtml)) { /* enforce html */ enforce = 2; if (!desc || desc->depr) return; } else if ((ctx->cfg->doctype == fpi_html) || (ctx->cfg->doctype == fpi_xhtml)) { enforce = 1; /* enforce html legacy */ if (!desc) { return; } } if (!desc && enforce) { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, ctx->f->r, "Bogus HTML element %s dropped", name) ; return; } if (desc && desc->depr && (enforce == 2) ) { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, ctx->f->r, "Deprecated HTML element %s dropped", name) ; return; } #endif ap_fputc(ctx->f->next, ctx->bb, '<'); ap_fputs(ctx->f->next, ctx->bb, name); if (attrs) { linkattrs = apr_hash_get(ctx->cfg->links, name, APR_HASH_KEY_STRING); for (a = attrs; *a; a += 2) { ctx->offset = 0; if (a[1]) { pappend(ctx, a[1], strlen(a[1]) + 1); is_uri = 0; if (linkattrs) { tattr *attrs = (tattr *) linkattrs->elts; for (i = 0; i < linkattrs->nelts; ++i) { if (!strcmp(*a, attrs[i].val)) { is_uri = 1; break; } } } if(is_uri) { /* first do the server replacements */ if(ctx->cfg->map) { server_remap_t *remaps = (server_remap_t *)ctx->cfg->map->elts; for(i = 0; i < ctx->cfg->map->nelts; ++i) { if(!ap_regexec(&(remaps[i].regex), ctx->buf, 0, 0, 0)) { int add_auth = ctx->cfg->global_auth | (remaps[i].flags & REMAP_FLAG_AUTH); int add_qstring_ignore = ctx->cfg->global_qstring_ignore | (remaps[i].flags & REMAP_FLAG_QSTRING_IGNORE); subs = remap_url(ctx, ctx->buf, add_auth, add_qstring_ignore); if(subs) { ++num_match; s_to = strlen(subs); s_from = strlen(ctx->buf); if(s_to > s_from) preserve(ctx, s_to - s_from); memcpy(ctx->buf, subs, s_to+1); break; /* only do one substitution per link */ } } } } } } if (!a[1]) ap_fputstrs(ctx->f->next, ctx->bb, " ", a[0], NULL); else { /* write the attribute */ ap_fputstrs(ctx->f->next, ctx->bb, " ", a[0], "=\"", NULL); pcharacters(ctx, (const xmlChar *) ctx->buf, strlen(ctx->buf)); ap_fputc(ctx->f->next, ctx->bb, '"'); } } } ctx->offset = 0; if(desc && desc->empty) ap_fputs(ctx->f->next, ctx->bb, "/>"); else ap_fputc(ctx->f->next, ctx->bb, '>'); }