From e07028b856022aa530177b7d5a478de2eaaa2ceb Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Thu, 4 Aug 2011 13:14:59 +0200 Subject: [PATCH] Experimental: Custom allocation of the HTML renderer --- examples/sundown.c | 6 +++-- html/html.c | 61 +++++++++++++++++++++++----------------------- html/html.h | 19 +++++++++++---- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/examples/sundown.c b/examples/sundown.c index 0e9f75f0..da8486a7 100644 --- a/examples/sundown.c +++ b/examples/sundown.c @@ -33,7 +33,10 @@ main(int argc, char **argv) struct buf *ib, *ob; int ret; FILE *in = stdin; + struct mkd_renderer renderer; + struct html_renderopt options; + size_t i, iterations = 1; /* opening the file if given from the command line */ @@ -62,9 +65,8 @@ main(int argc, char **argv) for (i = 0; i < iterations; ++i) { ob->size = 0; - sdhtml_renderer(&renderer, 0, NULL); + sdhtml_renderer(&renderer, &options, 0); sd_markdown(ob, ib, &renderer, ~0); - sdhtml_free_renderer(&renderer); } /* writing the result to stdout */ diff --git a/html/html.c b/html/html.c index 966a4790..a4fdaf9c 100755 --- a/html/html.c +++ b/html/html.c @@ -25,17 +25,6 @@ #define USE_XHTML(opt) (opt->flags & HTML_USE_XHTML) -struct html_renderopt { - void *extra; - - struct { - int header_count; - int current_level; - } toc_data; - - unsigned int flags; -}; - static inline void put_scaped_char(struct buf *ob, char c) { @@ -122,7 +111,14 @@ rndr_autolink(struct buf *ob, struct buf *link, enum mkd_autolink type, void *op if (type == MKDA_EMAIL) BUFPUTSL(ob, "mailto:"); bufput(ob, link->data, link->size); - BUFPUTSL(ob, "\">"); + + if (options->link_attributes) { + bufputc(ob, '\"'); + options->link_attributes(ob, link, opaque); + bufputc(ob, '>'); + } else { + BUFPUTSL(ob, "\">"); + } /* * Pretty printing: if we get an email address as @@ -308,11 +304,23 @@ rndr_link(struct buf *ob, struct buf *link, struct buf *title, struct buf *conte return 0; BUFPUTSL(ob, "size) bufput(ob, link->data, link->size); + + if (link && link->size) + bufput(ob, link->data, link->size); + if (title && title->size) { BUFPUTSL(ob, "\" title=\""); - sdhtml_escape(ob, title->data, title->size); } - BUFPUTSL(ob, "\">"); + sdhtml_escape(ob, title->data, title->size); + } + + if (options->link_attributes) { + bufputc(ob, '\"'); + options->link_attributes(ob, link, opaque); + bufputc(ob, '>'); + } else { + BUFPUTSL(ob, "\">"); + } + if (content && content->size) bufput(ob, content->data, content->size); BUFPUTSL(ob, ""); return 1; @@ -558,7 +566,7 @@ toc_finalize(struct buf *ob, void *opaque) } void -sdhtml_toc_renderer(struct mkd_renderer *renderer, void *extra) +sdhtml_toc_renderer(struct mkd_renderer *renderer, struct html_renderopt *options) { static const struct mkd_renderer toc_render = { NULL, @@ -594,17 +602,17 @@ sdhtml_toc_renderer(struct mkd_renderer *renderer, void *extra) NULL }; - struct html_renderopt *options; - options = calloc(1, sizeof(struct html_renderopt)); + if (options == NULL) + options = calloc(1, sizeof(struct html_renderopt)); + options->flags = HTML_TOC; - options->extra = extra; memcpy(renderer, &toc_render, sizeof(struct mkd_renderer)); renderer->opaque = options; } void -sdhtml_renderer(struct mkd_renderer *renderer, unsigned int render_flags, void *extra) +sdhtml_renderer(struct mkd_renderer *renderer, struct html_renderopt *options, unsigned int render_flags) { static const struct mkd_renderer renderer_default = { rndr_blockcode, @@ -640,10 +648,10 @@ sdhtml_renderer(struct mkd_renderer *renderer, unsigned int render_flags, void * NULL }; - struct html_renderopt *options; - options = calloc(1, sizeof(struct html_renderopt)); + if (options == NULL) + options = calloc(1, sizeof(struct html_renderopt)); + options->flags = render_flags; - options->extra = extra; memcpy(renderer, &renderer_default, sizeof(struct mkd_renderer)); renderer->opaque = options; @@ -662,10 +670,3 @@ sdhtml_renderer(struct mkd_renderer *renderer, unsigned int render_flags, void * if (render_flags & HTML_GITHUB_BLOCKCODE) renderer->blockcode = rndr_blockcode_github; } - -void -sdhtml_free_renderer(struct mkd_renderer *renderer) -{ - free(renderer->opaque); -} - diff --git a/html/html.h b/html/html.h index 80753945..bbfe8f17 100644 --- a/html/html.h +++ b/html/html.h @@ -21,6 +21,18 @@ #include "buffer.h" #include +struct html_renderopt { + struct { + int header_count; + int current_level; + } toc_data; + + unsigned int flags; + + /* extra callbacks */ + void (*link_attributes)(struct buf *ob, struct buf *url, void *self); +}; + typedef enum { HTML_SKIP_HTML = (1 << 0), HTML_SKIP_STYLE = (1 << 1), @@ -47,13 +59,10 @@ int sdhtml_tag(const char *tag_data, size_t tag_size, const char *tagname); extern void -sdhtml_renderer(struct mkd_renderer *renderer, unsigned int render_flags, void *extra); - -extern void -sdhtml_toc_renderer(struct mkd_renderer *renderer, void *extra); +sdhtml_renderer(struct mkd_renderer *renderer, struct html_renderopt *options_ptr, unsigned int render_flags); extern void -sdhtml_free_renderer(struct mkd_renderer *renderer); +sdhtml_toc_renderer(struct mkd_renderer *renderer, struct html_renderopt *options_ptr); extern void sdhtml_smartypants(struct buf *ob, struct buf *text);