/******************** * GENERIC RENDERER * ********************/ static int rndr_autolink(struct buf *ob, struct buf *link, enum mkd_autolink type, void *opaque) { struct html_renderopt *options = opaque; if (!link || !link->size) return 0; if ((options->flags & HTML_SAFELINK) != 0 && !is_safe_link(link->data, link->size) && type != MKDA_EMAIL) return 0; BUFPUTSL(ob, "<a href=\""); if (type == MKDA_EMAIL) BUFPUTSL(ob, "mailto:"); bufput(ob, link->data, link->size); BUFPUTSL(ob, "\">"); /* * Pretty printing: if we get an email address as * an actual URI, e.g. `mailto:[email protected]`, we don't * want to print the `mailto:` prefix */ if (bufprefix(link, "mailto:") == 0) { attr_escape(ob, link->data + 7, link->size - 7); } else { attr_escape(ob, link->data, link->size); } BUFPUTSL(ob, "</a>"); return 1; }
/******************** * GENERIC RENDERER * ********************/ static int rndr_autolink(struct buf *ob, const struct buf *link, enum mkd_autolink type, void *opaque) { struct html_renderopt *options = opaque; if (!link || !link->size) return 0; if ((options->flags & HTML_SAFELINK) != 0 && !sd_autolink_issafe(link->data, link->size) && type != MKDA_EMAIL) return 0; BUFPUTSL(ob, "<a href=\""); if (type == MKDA_EMAIL) BUFPUTSL(ob, "mailto:"); escape_href(ob, link->data, link->size); if (options->link_attributes) { bufputc(ob, '\"'); options->link_attributes(ob, link, opaque); bufputc(ob, '>'); } else if (options->flags & HTML_NEW_TAB_LINKS) { BUFPUTSL(ob, "\" target=\"_blank\">"); } else { BUFPUTSL(ob, "\">"); } /* * Pretty printing: if we get an email address as * an actual URI, e.g. `mailto:[email protected]`, we don't * want to print the `mailto:` prefix */ if (bufprefix(link, "mailto:") == 0) { escape_html(ob, link->data + 7, link->size - 7); } else { escape_html(ob, link->data, link->size); } BUFPUTSL(ob, "</a>"); return 1; }
static int markdown_link(struct buf *ob, const struct buf *link, const struct buf *title, const struct buf *content, void *opaque) { struct markdown_state *const state = opaque; if(0 != bufprefix(link, "hash://")) { return state->link(ob, link, title, content, opaque); } // TODO: Query string escaping struct buf *rel = bufnew(strlen("?q=")+link->size); bufputs(rel, "?q="); bufput(rel, link->data, link->size); int const r = state->link(ob, rel, title, content, opaque); bufrelease(rel); bufputs(ob, "<sup>["); struct buf icon = BUF_STATIC("#"); struct buf info = BUF_STATIC("Hash address"); state->link(ob, link, &info, &icon, opaque); bufputs(ob, "]</sup>"); return r; }