Skip to content
This repository has been archived by the owner on Aug 30, 2023. It is now read-only.

Commit

Permalink
use black magic
Browse files Browse the repository at this point in the history
  • Loading branch information
safx committed Mar 23, 2015
1 parent e6de772 commit 9f71de7
Showing 1 changed file with 71 additions and 191 deletions.
262 changes: 71 additions & 191 deletions Source/hoedown_wrapper.m
Expand Up @@ -22,312 +22,192 @@ @interface HDWRenderer () {

// MARK: block level callbacks

static void render_blockcode(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_buffer *lang, const hoedown_renderer_data *data) {
assert(data);

#define GET_RENDERER \
assert(data && data->opaque); \
HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.blockcode)
r.blockcode(HDWString(text), HDWString(lang));

#define HOEDOWN_CALLBACK_0(func) \
GET_RENDERER \
if (r.func) r.func();

#define HOEDOWN_CALLBACK_1(func, arg1) \
GET_RENDERER \
if (r.func) r.func(arg1);

#define HOEDOWN_CALLBACK_2(func, arg1, arg2) \
GET_RENDERER \
if (r.func) r.func(arg1, arg2);

#define HOEDOWN_CALLBACK_0_RET(func) \
GET_RENDERER \
return r.func ? r.func() : 0;

#define HOEDOWN_CALLBACK_1_RET(func, arg1) \
GET_RENDERER \
return r.func ? r.func(arg1) : 0;

#define HOEDOWN_CALLBACK_2_RET(func, arg1, arg2) \
GET_RENDERER \
return r.func ? r.func(arg1, arg2) : 0;

#define HOEDOWN_CALLBACK_3_RET(func, arg1, arg2, arg3) \
GET_RENDERER \
return r.func ? r.func(arg1, arg2, arg3) : 0;



static void render_blockcode(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_buffer *lang, const hoedown_renderer_data *data) {
HOEDOWN_CALLBACK_2(blockcode, HDWString(text), HDWString(lang));
}

static void render_blockquote(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.blockquote)
r.blockquote(HDWString(content));
HOEDOWN_CALLBACK_1(blockquote, HDWString(content));
}

static void render_header(hoedown_buffer *ob, const hoedown_buffer *content, int level, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.header)
r.header(HDWString(content), level);
HOEDOWN_CALLBACK_2(header, HDWString(content), level);
}

static void render_hrule(hoedown_buffer *ob, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.hrule)
r.hrule();
HOEDOWN_CALLBACK_0(hrule);
}

static void render_list(hoedown_buffer *ob, const hoedown_buffer *content, hoedown_list_flags flags, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.list)
r.list(HDWString(content), flags);
HOEDOWN_CALLBACK_2(list, HDWString(content), flags);
}

static void render_listitem(hoedown_buffer *ob, const hoedown_buffer *content, hoedown_list_flags flags, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.listitem)
r.listitem(HDWString(content), flags);
HOEDOWN_CALLBACK_2(listitem, HDWString(content), flags);
}

static void render_paragraph(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.paragraph)
r.paragraph(HDWString(content));
HOEDOWN_CALLBACK_1(paragraph, HDWString(content));
}

static void render_table(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.table)
r.table(HDWString(content));
HOEDOWN_CALLBACK_1(table, HDWString(content));
}

static void render_table_header(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.table_header)
r.table_header(HDWString(content));
HOEDOWN_CALLBACK_1(table_header, HDWString(content));
}

static void render_table_body(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.table_body)
r.table_body(HDWString(content));
HOEDOWN_CALLBACK_1(table_body, HDWString(content));
}

static void render_table_row(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.table_row)
r.table_row(HDWString(content));
HOEDOWN_CALLBACK_1(table_row, HDWString(content));
}

static void render_table_cell(hoedown_buffer *ob, const hoedown_buffer *content, hoedown_table_flags flags, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.table_cell)
r.table_cell(HDWString(content), flags);
HOEDOWN_CALLBACK_2(table_cell, HDWString(content), flags);
}

static void render_footnotes(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.footnotes)
r.footnotes(HDWString(content));
HOEDOWN_CALLBACK_1(footnotes, HDWString(content));
}

static void render_footnote_def(hoedown_buffer *ob, const hoedown_buffer *content, unsigned int num, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.footnote_def)
r.footnote_def(HDWString(content), num);
HOEDOWN_CALLBACK_2(footnote_def, HDWString(content), num);
}

static void render_blockhtml(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.blockhtml)
r.blockhtml(HDWString(text));
HOEDOWN_CALLBACK_1(blockhtml, HDWString(text));
}

// MARK: span level callbacks

static int render_autolink(hoedown_buffer *ob, const hoedown_buffer *link, hoedown_autolink_type type, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.autolink) return 0;
return r.autolink(HDWString(link), type);
HOEDOWN_CALLBACK_2_RET(autolink, HDWString(link), type);
}

static int render_codespan(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.codespan) return 0;
return r.codespan(HDWString(text));
HOEDOWN_CALLBACK_1_RET(codespan, HDWString(text));
}

static int render_double_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.double_emphasis) return 0;
return r.double_emphasis(HDWString(content));
HOEDOWN_CALLBACK_1_RET(double_emphasis, HDWString(content));
}

static int render_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.emphasis) return 0;
return r.emphasis(HDWString(content));
HOEDOWN_CALLBACK_1_RET(emphasis, HDWString(content));
}

static int render_underline(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.underline) return 0;
return r.underline(HDWString(content));
HOEDOWN_CALLBACK_1_RET(underline, HDWString(content));
}

static int render_highlight(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.highlight) return 0;
return r.highlight(HDWString(content));
HOEDOWN_CALLBACK_1_RET(highlight, HDWString(content));
}

static int render_quote(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.quote) return 0;
return r.quote(HDWString(content));
HOEDOWN_CALLBACK_1_RET(quote, HDWString(content));
}

static int render_image(hoedown_buffer *ob, const hoedown_buffer *link, const hoedown_buffer *title, const hoedown_buffer *alt, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.image) return 0;
return r.image(HDWString(link), HDWString(title), HDWString(alt));
HOEDOWN_CALLBACK_3_RET(image, HDWString(link), HDWString(title), HDWString(alt));
}

static int render_linebreak(hoedown_buffer *ob, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.linebreak) return 0;
return r.linebreak();
HOEDOWN_CALLBACK_0_RET(linebreak);
}

static int render_link(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_buffer *link, const hoedown_buffer *title, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.link) return 0;
return r.link(HDWString(content), HDWString(link), HDWString(title));
HOEDOWN_CALLBACK_3_RET(link, HDWString(content), HDWString(link), HDWString(title));
}


static int render_triple_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.triple_emphasis) return 0;
return r.triple_emphasis(HDWString(content));
HOEDOWN_CALLBACK_1_RET(triple_emphasis, HDWString(content));
}


static int render_strikethrough(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.strikethrough) return 0;
return r.strikethrough(HDWString(content));
HOEDOWN_CALLBACK_1_RET(strikethrough, HDWString(content));
}


static int render_superscript(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.superscript) return 0;
return r.superscript(HDWString(content));
HOEDOWN_CALLBACK_1_RET(superscript, HDWString(content));
}


static int render_footnote_ref(hoedown_buffer *ob, unsigned int num, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.footnote_ref) return 0;
return r.footnote_ref(num);
HOEDOWN_CALLBACK_1_RET(footnote_ref, num);
}


static int render_math(hoedown_buffer *ob, const hoedown_buffer *text, int displaymode, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.math) return 0;
return r.math(HDWString(text), displaymode);
HOEDOWN_CALLBACK_2_RET(math, HDWString(text), displaymode);
}


static int render_raw_html(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_renderer_data *data) {
if (!data) return 0;

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (!r.raw_html) return 0;
return r.raw_html(HDWString(text));
HOEDOWN_CALLBACK_1_RET(raw_html, HDWString(text));
}

// MARK: miscellaneous callbacks

static void render_doc_header(hoedown_buffer *ob, int inline_render, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.doc_header)
return r.doc_header(inline_render);
HOEDOWN_CALLBACK_1(doc_header, inline_render);
}

static void render_doc_footer(hoedown_buffer *ob, int inline_render, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.doc_footer)
return r.doc_footer(inline_render);
HOEDOWN_CALLBACK_1(doc_footer, inline_render);
}

// MARK: AST construction helpers

static void render_blockquote_begin(const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.blockquote_begin)
r.blockquote_begin();
HOEDOWN_CALLBACK_0(blockquote_begin);
}

static void render_list_begin(hoedown_list_flags flags, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.list_begin)
r.list_begin(flags);
HOEDOWN_CALLBACK_1(list_begin, flags);
}

static void render_listitem_begin(hoedown_list_flags flags, const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.listitem_begin)
r.listitem_begin(flags);
HOEDOWN_CALLBACK_1(listitem_begin, flags);
}

static void render_paragraph_begin(const hoedown_renderer_data *data) {
assert(data);

HDWRenderer* r = (__bridge HDWRenderer*) data->opaque;
if (r.paragraph_begin)
r.paragraph_begin();
HOEDOWN_CALLBACK_0(paragraph_begin);
}


Expand Down

0 comments on commit 9f71de7

Please sign in to comment.