summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/hoedown.c8
-rw-r--r--hoedown.def8
-rw-r--r--src/document.c626
-rw-r--r--src/document.h12
4 files changed, 327 insertions, 327 deletions
diff --git a/examples/hoedown.c b/examples/hoedown.c
index b188e96..c3ae6e5 100644
--- a/examples/hoedown.c
+++ b/examples/hoedown.c
@@ -16,7 +16,7 @@ main(int argc, char **argv)
FILE *in = stdin;
hoedown_renderer *renderer;
- hoedown_markdown *markdown;
+ hoedown_document *document;
/* opening the file if given from the command line */
if (argc > 1) {
@@ -57,11 +57,11 @@ main(int argc, char **argv)
}
renderer = hoedown_html_renderer_new(0, 0);
- markdown = hoedown_markdown_new(0, 16, renderer);
+ document = hoedown_document_new(0, 16, renderer);
- hoedown_markdown_render(ob, ib->data, ib->size, markdown);
+ hoedown_document_render(ob, ib->data, ib->size, document);
- hoedown_markdown_free(markdown);
+ hoedown_document_free(document);
hoedown_html_renderer_free(renderer);
/* writing the result to stdout */
diff --git a/hoedown.def b/hoedown.def
index 2f75f8a..09b54a7 100644
--- a/hoedown.def
+++ b/hoedown.def
@@ -15,6 +15,9 @@ EXPORTS
hoedown_buffer_reset
hoedown_buffer_slurp
hoedown_buffer_printf
+ hoedown_document_new
+ hoedown_document_render
+ hoedown_document_free
hoedown_escape_html
hoedown_escape_href
hoedown_html_is_tag
@@ -22,13 +25,10 @@ EXPORTS
hoedown_html_toc_renderer_new
hoedown_html_renderer_free
hoedown_html_smartypants
- hoedown_markdown_new
- hoedown_markdown_render
- hoedown_markdown_free
- hoedown_version
hoedown_stack_free
hoedown_stack_grow
hoedown_stack_new
hoedown_stack_push
hoedown_stack_pop
hoedown_stack_top
+ hoedown_version
diff --git a/src/document.c b/src/document.c
index fcd6bf5..8653fa4 100644
--- a/src/document.c
+++ b/src/document.c
@@ -64,20 +64,20 @@ struct footnote_list {
/* data is the pointer of the beginning of the span */
/* offset is the number of valid chars before data */
typedef size_t
-(*char_trigger)(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-
-static size_t char_emphasis(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_quote(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_linebreak(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_codespan(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_escape(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_entity(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_langle_tag(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_autolink_url(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_autolink_email(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_autolink_www(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
-static size_t char_superscript(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size);
+(*char_trigger)(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+
+static size_t char_emphasis(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_quote(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_linebreak(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_codespan(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_escape(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_entity(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_langle_tag(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_autolink_url(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_autolink_email(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_autolink_www(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
+static size_t char_superscript(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
enum markdown_char_t {
MD_CHAR_NONE = 0,
@@ -112,7 +112,7 @@ static char_trigger markdown_char_ptrs[] = {
};
/* render • structure containing state for a parser instance */
-struct hoedown_markdown {
+struct hoedown_document {
hoedown_renderer md;
struct link_ref *refs[REF_TABLE_SIZE];
@@ -130,11 +130,11 @@ struct hoedown_markdown {
***************************/
static inline hoedown_buffer *
-newbuf(hoedown_markdown *md, int type)
+newbuf(hoedown_document *doc, int type)
{
static const size_t buf_size[2] = {256, 64};
hoedown_buffer *work = NULL;
- hoedown_stack *pool = &md->work_bufs[type];
+ hoedown_stack *pool = &doc->work_bufs[type];
if (pool->size < pool->asize &&
pool->item[pool->size] != NULL) {
@@ -149,9 +149,9 @@ newbuf(hoedown_markdown *md, int type)
}
static inline void
-popbuf(hoedown_markdown *md, int type)
+popbuf(hoedown_document *doc, int type)
{
- md->work_bufs[type].size--;
+ doc->work_bufs[type].size--;
}
static void
@@ -428,26 +428,26 @@ tag_length(uint8_t *data, size_t size, enum hoedown_autolink *autolink)
/* parse_inline • parses inline markdown elements */
static void
-parse_inline(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_inline(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t i = 0, end = 0;
uint8_t action = 0;
hoedown_buffer work = { 0, 0, 0, 0 };
- if (md->work_bufs[BUFFER_SPAN].size +
- md->work_bufs[BUFFER_BLOCK].size > md->max_nesting)
+ if (doc->work_bufs[BUFFER_SPAN].size +
+ doc->work_bufs[BUFFER_BLOCK].size > doc->max_nesting)
return;
while (i < size) {
/* copying inactive chars into the output */
- while (end < size && (action = md->active_char[data[end]]) == 0) {
+ while (end < size && (action = doc->active_char[data[end]]) == 0) {
end++;
}
- if (md->md.normal_text) {
+ if (doc->md.normal_text) {
work.data = data + i;
work.size = end - i;
- md->md.normal_text(ob, &work, md->md.opaque);
+ doc->md.normal_text(ob, &work, doc->md.opaque);
}
else
hoedown_buffer_put(ob, data + i, end - i);
@@ -455,7 +455,7 @@ parse_inline(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t siz
if (end >= size) break;
i = end;
- end = markdown_char_ptrs[(int)action](ob, md, data + i, i, size - i);
+ end = markdown_char_ptrs[(int)action](ob, doc, data + i, i, size - i);
if (!end) /* no action from the callback */
end = i + 1;
else {
@@ -559,7 +559,7 @@ find_emph_char(uint8_t *data, size_t size, uint8_t c)
/* parse_emph1 • parsing single emphase */
/* closed by a symbol not preceded by whitespace and not followed by symbol */
static size_t
-parse_emph1(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, uint8_t c)
+parse_emph1(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, uint8_t c)
{
size_t i = 0, len;
hoedown_buffer *work = 0;
@@ -576,20 +576,20 @@ parse_emph1(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
if (data[i] == c && !_isspace(data[i - 1])) {
- if (md->ext_flags & HOEDOWN_EXT_NO_INTRA_EMPHASIS) {
+ if (doc->ext_flags & HOEDOWN_EXT_NO_INTRA_EMPHASIS) {
if (i + 1 < size && isalnum(data[i + 1]))
continue;
}
- work = newbuf(md, BUFFER_SPAN);
- parse_inline(work, md, data, i);
+ work = newbuf(doc, BUFFER_SPAN);
+ parse_inline(work, doc, data, i);
- if (md->ext_flags & HOEDOWN_EXT_UNDERLINE && c == '_')
- r = md->md.underline(ob, work, md->md.opaque);
+ if (doc->ext_flags & HOEDOWN_EXT_UNDERLINE && c == '_')
+ r = doc->md.underline(ob, work, doc->md.opaque);
else
- r = md->md.emphasis(ob, work, md->md.opaque);
+ r = doc->md.emphasis(ob, work, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
return r ? i + 1 : 0;
}
}
@@ -599,7 +599,7 @@ parse_emph1(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
/* parse_emph2 • parsing single emphase */
static size_t
-parse_emph2(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, uint8_t c)
+parse_emph2(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, uint8_t c)
{
size_t i = 0, len;
hoedown_buffer *work = 0;
@@ -611,17 +611,17 @@ parse_emph2(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
i += len;
if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {
- work = newbuf(md, BUFFER_SPAN);
- parse_inline(work, md, data, i);
+ work = newbuf(doc, BUFFER_SPAN);
+ parse_inline(work, doc, data, i);
if (c == '~')
- r = md->md.strikethrough(ob, work, md->md.opaque);
+ r = doc->md.strikethrough(ob, work, doc->md.opaque);
else if (c == '=')
- r = md->md.highlight(ob, work, md->md.opaque);
+ r = doc->md.highlight(ob, work, doc->md.opaque);
else
- r = md->md.double_emphasis(ob, work, md->md.opaque);
+ r = doc->md.double_emphasis(ob, work, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
return r ? i + 2 : 0;
}
i++;
@@ -632,7 +632,7 @@ parse_emph2(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
/* parse_emph3 • parsing single emphase */
/* finds the first closing tag, and delegates to the other emph */
static size_t
-parse_emph3(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, uint8_t c)
+parse_emph3(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, uint8_t c)
{
size_t i = 0, len;
int r;
@@ -646,24 +646,24 @@ parse_emph3(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
if (data[i] != c || _isspace(data[i - 1]))
continue;
- if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && md->md.triple_emphasis) {
+ if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && doc->md.triple_emphasis) {
/* triple symbol found */
- hoedown_buffer *work = newbuf(md, BUFFER_SPAN);
+ hoedown_buffer *work = newbuf(doc, BUFFER_SPAN);
- parse_inline(work, md, data, i);
- r = md->md.triple_emphasis(ob, work, md->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ parse_inline(work, doc, data, i);
+ r = doc->md.triple_emphasis(ob, work, doc->md.opaque);
+ popbuf(doc, BUFFER_SPAN);
return r ? i + 3 : 0;
} else if (i + 1 < size && data[i + 1] == c) {
/* double symbol found, handing over to emph1 */
- len = parse_emph1(ob, md, data - 2, size + 2, c);
+ len = parse_emph1(ob, doc, data - 2, size + 2, c);
if (!len) return 0;
else return len - 2;
} else {
/* single symbol found, handing over to emph2 */
- len = parse_emph2(ob, md, data - 1, size + 1, c);
+ len = parse_emph2(ob, doc, data - 1, size + 1, c);
if (!len) return 0;
else return len - 1;
}
@@ -673,12 +673,12 @@ parse_emph3(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
/* char_emphasis • single and double emphasis parsing */
static size_t
-char_emphasis(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_emphasis(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
uint8_t c = data[0];
size_t ret;
- if (md->ext_flags & HOEDOWN_EXT_NO_INTRA_EMPHASIS) {
+ if (doc->ext_flags & HOEDOWN_EXT_NO_INTRA_EMPHASIS) {
if (offset > 0 && !_isspace(data[-1]) && data[-1] != '>' && data[-1] != '(')
return 0;
}
@@ -686,21 +686,21 @@ char_emphasis(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t of
if (size > 2 && data[1] != c) {
/* whitespace cannot follow an opening emphasis;
* strikethrough only takes two characters '~~' */
- if (c == '~' || c == '=' || _isspace(data[1]) || (ret = parse_emph1(ob, md, data + 1, size - 1, c)) == 0)
+ if (c == '~' || c == '=' || _isspace(data[1]) || (ret = parse_emph1(ob, doc, data + 1, size - 1, c)) == 0)
return 0;
return ret + 1;
}
if (size > 3 && data[1] == c && data[2] != c) {
- if (_isspace(data[2]) || (ret = parse_emph2(ob, md, data + 2, size - 2, c)) == 0)
+ if (_isspace(data[2]) || (ret = parse_emph2(ob, doc, data + 2, size - 2, c)) == 0)
return 0;
return ret + 2;
}
if (size > 4 && data[1] == c && data[2] == c && data[3] != c) {
- if (c == '~' || c == '=' || _isspace(data[3]) || (ret = parse_emph3(ob, md, data + 3, size - 3, c)) == 0)
+ if (c == '~' || c == '=' || _isspace(data[3]) || (ret = parse_emph3(ob, doc, data + 3, size - 3, c)) == 0)
return 0;
return ret + 3;
@@ -712,7 +712,7 @@ char_emphasis(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t of
/* char_linebreak • '\n' preceded by two spaces (assuming linebreak != 0) */
static size_t
-char_linebreak(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_linebreak(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
if (offset < 2 || data[-1] != ' ' || data[-2] != ' ')
return 0;
@@ -721,13 +721,13 @@ char_linebreak(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t o
while (ob->size && ob->data[ob->size - 1] == ' ')
ob->size--;
- return md->md.linebreak(ob, md->md.opaque) ? 1 : 0;
+ return doc->md.linebreak(ob, doc->md.opaque) ? 1 : 0;
}
/* char_codespan • '`' parsing a code span (assuming codespan != 0) */
static size_t
-char_codespan(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_codespan(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
size_t end, nb = 0, i, f_begin, f_end;
@@ -757,10 +757,10 @@ char_codespan(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t of
/* real code span */
if (f_begin < f_end) {
hoedown_buffer work = { data + f_begin, f_end - f_begin, 0, 0 };
- if (!md->md.codespan(ob, &work, md->md.opaque))
+ if (!doc->md.codespan(ob, &work, doc->md.opaque))
end = 0;
} else {
- if (!md->md.codespan(ob, 0, md->md.opaque))
+ if (!doc->md.codespan(ob, 0, doc->md.opaque))
end = 0;
}
@@ -769,7 +769,7 @@ char_codespan(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t of
/* char_quote • '"' parsing a quote */
static size_t
-char_quote(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_quote(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
size_t end, nq = 0, i, f_begin, f_end;
@@ -799,10 +799,10 @@ char_quote(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offse
/* real quote */
if (f_begin < f_end) {
hoedown_buffer work = { data + f_begin, f_end - f_begin, 0, 0 };
- if (!md->md.quote(ob, &work, md->md.opaque))
+ if (!doc->md.quote(ob, &work, doc->md.opaque))
end = 0;
} else {
- if (!md->md.quote(ob, 0, md->md.opaque))
+ if (!doc->md.quote(ob, 0, doc->md.opaque))
end = 0;
}
@@ -812,7 +812,7 @@ char_quote(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offse
/* char_escape • '\\' backslash escape */
static size_t
-char_escape(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_escape(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
static const char *escape_chars = "\\`*_{}[]()#+-.!:|&<>^~";
hoedown_buffer work = { 0, 0, 0, 0 };
@@ -821,10 +821,10 @@ char_escape(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offs
if (strchr(escape_chars, data[1]) == NULL)
return 0;
- if (md->md.normal_text) {
+ if (doc->md.normal_text) {
work.data = data + 1;
work.size = 1;
- md->md.normal_text(ob, &work, md->md.opaque);
+ doc->md.normal_text(ob, &work, doc->md.opaque);
}
else hoedown_buffer_putc(ob, data[1]);
} else if (size == 1) {
@@ -837,7 +837,7 @@ char_escape(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offs
/* char_entity • '&' escaped when it doesn't belong to an entity */
/* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */
static size_t
-char_entity(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_entity(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
size_t end = 1;
hoedown_buffer work = { 0, 0, 0, 0 };
@@ -853,10 +853,10 @@ char_entity(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offs
else
return 0; /* lone '&' */
- if (md->md.entity) {
+ if (doc->md.entity) {
work.data = data;
work.size = end;
- md->md.entity(ob, &work, md->md.opaque);
+ doc->md.entity(ob, &work, doc->md.opaque);
}
else hoedown_buffer_put(ob, data, end);
@@ -865,7 +865,7 @@ char_entity(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offs
/* char_langle_tag • '<' when tags or autolinks are allowed */
static size_t
-char_langle_tag(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_langle_tag(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
enum hoedown_autolink altype = HOEDOWN_AUTOLINK_NONE;
size_t end = tag_length(data, size, &altype);
@@ -873,16 +873,16 @@ char_langle_tag(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
int ret = 0;
if (end > 2) {
- if (md->md.autolink && altype != HOEDOWN_AUTOLINK_NONE) {
- hoedown_buffer *u_link = newbuf(md, BUFFER_SPAN);
+ if (doc->md.autolink && altype != HOEDOWN_AUTOLINK_NONE) {
+ hoedown_buffer *u_link = newbuf(doc, BUFFER_SPAN);
work.data = data + 1;
work.size = end - 2;
unscape_text(u_link, &work);
- ret = md->md.autolink(ob, u_link, altype, md->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ ret = doc->md.autolink(ob, u_link, altype, doc->md.opaque);
+ popbuf(doc, BUFFER_SPAN);
}
- else if (md->md.raw_html_tag)
- ret = md->md.raw_html_tag(ob, &work, md->md.opaque);
+ else if (doc->md.raw_html_tag)
+ ret = doc->md.raw_html_tag(ob, &work, doc->md.opaque);
}
if (!ret) return 0;
@@ -890,80 +890,80 @@ char_langle_tag(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
}
static size_t
-char_autolink_www(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_autolink_www(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
hoedown_buffer *link, *link_url, *link_text;
size_t link_len, rewind;
- if (!md->md.link || md->in_link_body)
+ if (!doc->md.link || doc->in_link_body)
return 0;
- link = newbuf(md, BUFFER_SPAN);
+ link = newbuf(doc, BUFFER_SPAN);
if ((link_len = hoedown_autolink__www(&rewind, link, data, offset, size, HOEDOWN_AUTOLINK_SHORT_DOMAINS)) > 0) {
- link_url = newbuf(md, BUFFER_SPAN);
+ link_url = newbuf(doc, BUFFER_SPAN);
HOEDOWN_BUFPUTSL(link_url, "http://");
hoedown_buffer_put(link_url, link->data, link->size);
ob->size -= rewind;
- if (md->md.normal_text) {
- link_text = newbuf(md, BUFFER_SPAN);
- md->md.normal_text(link_text, link, md->md.opaque);
- md->md.link(ob, link_url, NULL, link_text, md->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ if (doc->md.normal_text) {
+ link_text = newbuf(doc, BUFFER_SPAN);
+ doc->md.normal_text(link_text, link, doc->md.opaque);
+ doc->md.link(ob, link_url, NULL, link_text, doc->md.opaque);
+ popbuf(doc, BUFFER_SPAN);
} else {
- md->md.link(ob, link_url, NULL, link, md->md.opaque);
+ doc->md.link(ob, link_url, NULL, link, doc->md.opaque);
}
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
}
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
return link_len;
}
static size_t
-char_autolink_email(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_autolink_email(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
hoedown_buffer *link;
size_t link_len, rewind;
- if (!md->md.autolink || md->in_link_body)
+ if (!doc->md.autolink || doc->in_link_body)
return 0;
- link = newbuf(md, BUFFER_SPAN);
+ link = newbuf(doc, BUFFER_SPAN);
if ((link_len = hoedown_autolink__email(&rewind, link, data, offset, size, 0)) > 0) {
ob->size -= rewind;
- md->md.autolink(ob, link, HOEDOWN_AUTOLINK_EMAIL, md->md.opaque);
+ doc->md.autolink(ob, link, HOEDOWN_AUTOLINK_EMAIL, doc->md.opaque);
}
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
return link_len;
}
static size_t
-char_autolink_url(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_autolink_url(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
hoedown_buffer *link;
size_t link_len, rewind;
- if (!md->md.autolink || md->in_link_body)
+ if (!doc->md.autolink || doc->in_link_body)
return 0;
- link = newbuf(md, BUFFER_SPAN);
+ link = newbuf(doc, BUFFER_SPAN);
if ((link_len = hoedown_autolink__url(&rewind, link, data, offset, size, 0)) > 0) {
ob->size -= rewind;
- md->md.autolink(ob, link, HOEDOWN_AUTOLINK_NORMAL, md->md.opaque);
+ doc->md.autolink(ob, link, HOEDOWN_AUTOLINK_NORMAL, doc->md.opaque);
}
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
return link_len;
}
/* char_link • '[': parsing a link or an image */
static size_t
-char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
int is_img = (offset && data[-1] == '!'), level;
size_t i = 1, txt_e, link_b = 0, link_e = 0, title_b = 0, title_e = 0;
@@ -971,12 +971,12 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
hoedown_buffer *link = 0;
hoedown_buffer *title = 0;
hoedown_buffer *u_link = 0;
- size_t org_work_size = md->work_bufs[BUFFER_SPAN].size;
+ size_t org_work_size = doc->work_bufs[BUFFER_SPAN].size;
int text_has_nl = 0, ret = 0;
int in_title = 0, qtype = 0;
/* checking whether the correct renderer exists */
- if ((is_img && !md->md.image) || (!is_img && !md->md.link))
+ if ((is_img && !doc->md.image) || (!is_img && !doc->md.link))
goto cleanup;
/* looking for the matching closing bracket */
@@ -1004,7 +1004,7 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
i++;
/* footnote link */
- if (md->ext_flags & HOEDOWN_EXT_FOOTNOTES && data[1] == '^') {
+ if (doc->ext_flags & HOEDOWN_EXT_FOOTNOTES && data[1] == '^') {
hoedown_buffer id = { 0, 0, 0, 0 };
struct footnote_ref *fr;
@@ -1014,19 +1014,19 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
id.data = data + 2;
id.size = txt_e - 2;
- fr = find_footnote_ref(&md->footnotes_found, id.data, id.size);
+ fr = find_footnote_ref(&doc->footnotes_found, id.data, id.size);
/* mark footnote used */
if (fr && !fr->is_used) {
- if(!add_footnote_ref(&md->footnotes_used, fr))
+ if(!add_footnote_ref(&doc->footnotes_used, fr))
goto cleanup;
fr->is_used = 1;
- fr->num = md->footnotes_used.count;
+ fr->num = doc->footnotes_used.count;
}
/* render */
- if (fr && md->md.footnote_ref)
- ret = md->md.footnote_ref(ob, fr->num, md->md.opaque);
+ if (fr && doc->md.footnote_ref)
+ ret = doc->md.footnote_ref(ob, fr->num, doc->md.opaque);
goto cleanup;
}
@@ -1105,12 +1105,12 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
/* building escaped link and title */
if (link_e > link_b) {
- link = newbuf(md, BUFFER_SPAN);
+ link = newbuf(doc, BUFFER_SPAN);
hoedown_buffer_put(link, data + link_b, link_e - link_b);
}
if (title_e > title_b) {
- title = newbuf(md, BUFFER_SPAN);
+ title = newbuf(doc, BUFFER_SPAN);
hoedown_buffer_put(title, data + title_b, title_e - title_b);
}
@@ -1132,7 +1132,7 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
/* finding the link_ref */
if (link_b == link_e) {
if (text_has_nl) {
- hoedown_buffer *b = newbuf(md, BUFFER_SPAN);
+ hoedown_buffer *b = newbuf(doc, BUFFER_SPAN);
size_t j;
for (j = 1; j < txt_e; j++) {
@@ -1153,7 +1153,7 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
id.size = link_e - link_b;
}
- lr = find_link_ref(md->refs, id.data, id.size);
+ lr = find_link_ref(doc->refs, id.data, id.size);
if (!lr)
goto cleanup;
@@ -1170,7 +1170,7 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
/* crafting the id */
if (text_has_nl) {
- hoedown_buffer *b = newbuf(md, BUFFER_SPAN);
+ hoedown_buffer *b = newbuf(doc, BUFFER_SPAN);
size_t j;
for (j = 1; j < txt_e; j++) {
@@ -1188,7 +1188,7 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
}
/* finding the link_ref */
- lr = find_link_ref(md->refs, id.data, id.size);
+ lr = find_link_ref(doc->refs, id.data, id.size);
if (!lr)
goto cleanup;
@@ -1202,20 +1202,20 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
/* building content: img alt is escaped, link content is parsed */
if (txt_e > 1) {
- content = newbuf(md, BUFFER_SPAN);
+ content = newbuf(doc, BUFFER_SPAN);
if (is_img) {
hoedown_buffer_put(content, data + 1, txt_e - 1);
} else {
/* disable autolinking when parsing inline the
* content of a link */
- md->in_link_body = 1;
- parse_inline(content, md, data + 1, txt_e - 1);
- md->in_link_body = 0;
+ doc->in_link_body = 1;
+ parse_inline(content, doc, data + 1, txt_e - 1);
+ doc->in_link_body = 0;
}
}
if (link) {
- u_link = newbuf(md, BUFFER_SPAN);
+ u_link = newbuf(doc, BUFFER_SPAN);
unscape_text(u_link, link);
}
@@ -1224,24 +1224,24 @@ char_link(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset
if (ob->size && ob->data[ob->size - 1] == '!')
ob->size -= 1;
- ret = md->md.image(ob, u_link, title, content, md->md.opaque);
+ ret = doc->md.image(ob, u_link, title, content, doc->md.opaque);
} else {
- ret = md->md.link(ob, u_link, title, content, md->md.opaque);
+ ret = doc->md.link(ob, u_link, title, content, doc->md.opaque);
}
/* cleanup */
cleanup:
- md->work_bufs[BUFFER_SPAN].size = (int)org_work_size;
+ doc->work_bufs[BUFFER_SPAN].size = (int)org_work_size;
return ret ? i : 0;
}
static size_t
-char_superscript(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t offset, size_t size)
+char_superscript(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
{
size_t sup_start, sup_len;
hoedown_buffer *sup;
- if (!md->md.superscript)
+ if (!doc->md.superscript)
return 0;
if (size < 2)
@@ -1265,10 +1265,10 @@ char_superscript(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
if (sup_len - sup_start == 0)
return (sup_start == 2) ? 3 : 0;
- sup = newbuf(md, BUFFER_SPAN);
- parse_inline(sup, md, data + sup_start, sup_len - sup_start);
- md->md.superscript(ob, sup, md->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ sup = newbuf(doc, BUFFER_SPAN);
+ parse_inline(sup, doc, data + sup_start, sup_len - sup_start);
+ doc->md.superscript(ob, sup, doc->md.opaque);
+ popbuf(doc, BUFFER_SPAN);
return (sup_start == 2) ? sup_len + 1 : sup_len;
}
@@ -1381,12 +1381,12 @@ parse_codefence(uint8_t *data, size_t size, hoedown_buffer *lang, size_t *width,
/* is_atxheader • returns whether the line is a hash-prefixed header */
static int
-is_atxheader(hoedown_markdown *md, uint8_t *data, size_t size)
+is_atxheader(hoedown_document *doc, uint8_t *data, size_t size)
{
if (data[0] != '#')
return 0;
- if (md->ext_flags & HOEDOWN_EXT_SPACE_HEADERS) {
+ if (doc->ext_flags & HOEDOWN_EXT_SPACE_HEADERS) {
size_t level = 0;
while (level < size && level < 6 && data[level] == '#')
@@ -1511,19 +1511,19 @@ prefix_uli(uint8_t *data, size_t size)
/* parse_block • parsing of one block, returning next uint8_t to parse */
-static void parse_block(hoedown_buffer *ob, hoedown_markdown *md,
+static void parse_block(hoedown_buffer *ob, hoedown_document *doc,
uint8_t *data, size_t size);
/* parse_blockquote • handles parsing of a blockquote fragment */
static size_t
-parse_blockquote(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_blockquote(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t beg, end = 0, pre, work_size = 0;
uint8_t *work_data = 0;
hoedown_buffer *out = 0;
- out = newbuf(md, BUFFER_BLOCK);
+ out = newbuf(doc, BUFFER_BLOCK);
beg = 0;
while (beg < size) {
for (end = beg + 1; end < size && data[end - 1] != '\n'; end++);
@@ -1550,19 +1550,19 @@ parse_blockquote(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
beg = end;
}
- parse_block(out, md, work_data, work_size);
- if (md->md.blockquote)
- md->md.blockquote(ob, out, md->md.opaque);
- popbuf(md, BUFFER_BLOCK);
+ parse_block(out, doc, work_data, work_size);
+ if (doc->md.blockquote)
+ doc->md.blockquote(ob, out, doc->md.opaque);
+ popbuf(doc, BUFFER_BLOCK);
return end;
}
static size_t
-parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, int do_render);
+parse_htmlblock(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, int do_render);
/* parse_blockquote • handles parsing of a regular paragraph */
static size_t
-parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_paragraph(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t i = 0, end = 0;
int level = 0;
@@ -1577,7 +1577,7 @@ parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
if ((level = is_headerline(data + i, size - i)) != 0)
break;
- if (is_atxheader(md, data + i, size - i) ||
+ if (is_atxheader(doc, data + i, size - i) ||
is_hrule(data + i, size - i) ||
prefix_quote(data + i, size - i)) {
end = i;
@@ -1593,7 +1593,7 @@ parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
* let's check to see if there's some kind of block starting
* here
*/
- if ((md->ext_flags & HOEDOWN_EXT_LAX_SPACING) && !isalnum(data[i])) {
+ if ((doc->ext_flags & HOEDOWN_EXT_LAX_SPACING) && !isalnum(data[i])) {
if (prefix_oli(data + i, size - i) ||
prefix_uli(data + i, size - i)) {
end = i;
@@ -1601,14 +1601,14 @@ parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
}
/* see if an html block starts here */
- if (data[i] == '<' && md->md.blockhtml &&
- parse_htmlblock(ob, md, data + i, size - i, 0)) {
+ if (data[i] == '<' && doc->md.blockhtml &&
+ parse_htmlblock(ob, doc, data + i, size - i, 0)) {
end = i;
break;
}
/* see if a code fence starts here */
- if ((md->ext_flags & HOEDOWN_EXT_FENCED_CODE) != 0 &&
+ if ((doc->ext_flags & HOEDOWN_EXT_FENCED_CODE) != 0 &&
is_codefence(data + i, size - i, NULL, NULL)) {
end = i;
break;
@@ -1623,11 +1623,11 @@ parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
work.size--;
if (!level) {
- hoedown_buffer *tmp = newbuf(md, BUFFER_BLOCK);
- parse_inline(tmp, md, work.data, work.size);
- if (md->md.paragraph)
- md->md.paragraph(ob, tmp, md->md.opaque);
- popbuf(md, BUFFER_BLOCK);
+ hoedown_buffer *tmp = newbuf(doc, BUFFER_BLOCK);
+ parse_inline(tmp, doc, work.data, work.size);
+ if (doc->md.paragraph)
+ doc->md.paragraph(ob, tmp, doc->md.opaque);
+ popbuf(doc, BUFFER_BLOCK);
} else {
hoedown_buffer *header_work;
@@ -1644,26 +1644,26 @@ parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
work.size -= 1;
if (work.size > 0) {
- hoedown_buffer *tmp = newbuf(md, BUFFER_BLOCK);
- parse_inline(tmp, md, work.data, work.size);
+ hoedown_buffer *tmp = newbuf(doc, BUFFER_BLOCK);
+ parse_inline(tmp, doc, work.data, work.size);
- if (md->md.paragraph)
- md->md.paragraph(ob, tmp, md->md.opaque);
+ if (doc->md.paragraph)
+ doc->md.paragraph(ob, tmp, doc->md.opaque);
- popbuf(md, BUFFER_BLOCK);
+ popbuf(doc, BUFFER_BLOCK);
work.data += beg;
work.size = i - beg;
}
else work.size = i;
}
- header_work = newbuf(md, BUFFER_SPAN);
- parse_inline(header_work, md, work.data, work.size);
+ header_work = newbuf(doc, BUFFER_SPAN);
+ parse_inline(header_work, doc, work.data, work.size);
- if (md->md.header)
- md->md.header(ob, header_work, (int)level, md->md.opaque);
+ if (doc->md.header)
+ doc->md.header(ob, header_work, (int)level, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
}
return end;
@@ -1671,7 +1671,7 @@ parse_paragraph(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
/* parse_fencedcode • handles parsing of a block-level code fragment */
static size_t
-parse_fencedcode(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_fencedcode(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t i = 0, text_start, line_start;
size_t w, w2;
@@ -1700,20 +1700,20 @@ parse_fencedcode(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
text.size = line_start - text_start;
// call callback
- if (md->md.blockcode)
- md->md.blockcode(ob, text.size ? &text : NULL, lang.size ? &lang : NULL, md->md.opaque);
+ if (doc->md.blockcode)
+ doc->md.blockcode(ob, text.size ? &text : NULL, lang.size ? &lang : NULL, doc->md.opaque);
if (data[i] == '\n') i++;
return i;
}
static size_t
-parse_blockcode(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_blockcode(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t beg, end, pre;
hoedown_buffer *work = 0;
- work = newbuf(md, BUFFER_BLOCK);
+ work = newbuf(doc, BUFFER_BLOCK);
beg = 0;
while (beg < size) {
@@ -1741,17 +1741,17 @@ parse_blockcode(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
hoedown_buffer_putc(work, '\n');
- if (md->md.blockcode)
- md->md.blockcode(ob, work, NULL, md->md.opaque);
+ if (doc->md.blockcode)
+ doc->md.blockcode(ob, work, NULL, doc->md.opaque);
- popbuf(md, BUFFER_BLOCK);
+ popbuf(doc, BUFFER_BLOCK);
return beg;
}
/* parse_listitem • parsing of a single list item */
/* assuming initial prefix is already removed */
static size_t
-parse_listitem(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, int *flags)
+parse_listitem(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, int *flags)
{
hoedown_buffer *work = 0, *inter = 0;
size_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;
@@ -1774,8 +1774,8 @@ parse_listitem(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t s
end++;
/* getting working buffers */
- work = newbuf(md, BUFFER_SPAN);
- inter = newbuf(md, BUFFER_SPAN);
+ work = newbuf(doc, BUFFER_SPAN);
+ inter = newbuf(doc, BUFFER_SPAN);
/* putting the first line into the working buffer */
hoedown_buffer_put(work, data + beg, end - beg);
@@ -1804,7 +1804,7 @@ parse_listitem(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t s
pre = i;
- if (md->ext_flags & HOEDOWN_EXT_FENCED_CODE) {
+ if (doc->ext_flags & HOEDOWN_EXT_FENCED_CODE) {
if (is_codefence(data + beg + i, end - beg - i, NULL, NULL))
in_fence = !in_fence;
}
@@ -1861,57 +1861,57 @@ parse_listitem(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t s
if (*flags & HOEDOWN_LI_BLOCK) {
/* intermediate render of block li */
if (sublist && sublist < work->size) {
- parse_block(inter, md, work->data, sublist);
- parse_block(inter, md, work->data + sublist, work->size - sublist);
+ parse_block(inter, doc, work->data, sublist);
+ parse_block(inter, doc, work->data + sublist, work->size - sublist);
}
else
- parse_block(inter, md, work->data, work->size);
+ parse_block(inter, doc, work->data, work->size);
} else {
/* intermediate render of inline li */
if (sublist && sublist < work->size) {
- parse_inline(inter, md, work->data, sublist);
- parse_block(inter, md, work->data + sublist, work->size - sublist);
+ parse_inline(inter, doc, work->data, sublist);
+ parse_block(inter, doc, work->data + sublist, work->size - sublist);
}
else
- parse_inline(inter, md, work->data, work->size);
+ parse_inline(inter, doc, work->data, work->size);
}
/* render of li itself */
- if (md->md.listitem)
- md->md.listitem(ob, inter, *flags, md->md.opaque);
+ if (doc->md.listitem)
+ doc->md.listitem(ob, inter, *flags, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
return beg;
}
/* parse_list • parsing ordered or unordered list block */
static size_t
-parse_list(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, int flags)
+parse_list(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, int flags)
{
hoedown_buffer *work = 0;
size_t i = 0, j;
- work = newbuf(md, BUFFER_BLOCK);
+ work = newbuf(doc, BUFFER_BLOCK);
while (i < size) {
- j = parse_listitem(work, md, data + i, size - i, &flags);
+ j = parse_listitem(work, doc, data + i, size - i, &flags);
i += j;
if (!j || (flags & HOEDOWN_LI_END))
break;
}
- if (md->md.list)
- md->md.list(ob, work, flags, md->md.opaque);
- popbuf(md, BUFFER_BLOCK);
+ if (doc->md.list)
+ doc->md.list(ob, work, flags, doc->md.opaque);
+ popbuf(doc, BUFFER_BLOCK);
return i;
}
/* parse_atxheader • parsing of atx-style headers */
static size_t
-parse_atxheader(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_atxheader(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t level = 0;
size_t i, end, skip;
@@ -1931,14 +1931,14 @@ parse_atxheader(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
end--;
if (end > i) {
- hoedown_buffer *work = newbuf(md, BUFFER_SPAN);
+ hoedown_buffer *work = newbuf(doc, BUFFER_SPAN);
- parse_inline(work, md, data + i, end - i);
+ parse_inline(work, doc, data + i, end - i);
- if (md->md.header)
- md->md.header(ob, work, (int)level, md->md.opaque);
+ if (doc->md.header)
+ doc->md.header(ob, work, (int)level, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
}
return skip;
@@ -1946,21 +1946,21 @@ parse_atxheader(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
/* parse_footnote_def • parse a single footnote definition */
static void
-parse_footnote_def(hoedown_buffer *ob, hoedown_markdown *md, unsigned int num, uint8_t *data, size_t size)
+parse_footnote_def(hoedown_buffer *ob, hoedown_document *doc, unsigned int num, uint8_t *data, size_t size)
{
hoedown_buffer *work = 0;
- work = newbuf(md, BUFFER_SPAN);
+ work = newbuf(doc, BUFFER_SPAN);
- parse_block(work, md, data, size);
+ parse_block(work, doc, data, size);
- if (md->md.footnote_def)
- md->md.footnote_def(ob, work, num, md->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ if (doc->md.footnote_def)
+ doc->md.footnote_def(ob, work, num, doc->md.opaque);
+ popbuf(doc, BUFFER_SPAN);
}
/* parse_footnote_list • render the contents of the footnotes */
static void
-parse_footnote_list(hoedown_buffer *ob, hoedown_markdown *md, struct footnote_list *footnotes)
+parse_footnote_list(hoedown_buffer *ob, hoedown_document *doc, struct footnote_list *footnotes)
{
hoedown_buffer *work = 0;
struct footnote_item *item;
@@ -1969,18 +1969,18 @@ parse_footnote_list(hoedown_buffer *ob, hoedown_markdown *md, struct footnote_li
if (footnotes->count == 0)
return;
- work = newbuf(md, BUFFER_BLOCK);
+ work = newbuf(doc, BUFFER_BLOCK);
item = footnotes->head;
while (item) {
ref = item->ref;
- parse_footnote_def(work, md, ref->num, ref->contents->data, ref->contents->size);
+ parse_footnote_def(work, doc, ref->num, ref->contents->data, ref->contents->size);
item = item->next;
}
- if (md->md.footnotes)
- md->md.footnotes(ob, work, md->md.opaque);
- popbuf(md, BUFFER_BLOCK);
+ if (doc->md.footnotes)
+ doc->md.footnotes(ob, work, doc->md.opaque);
+ popbuf(doc, BUFFER_BLOCK);
}
/* htmlblock_end • checking end of HTML block : </tag>[ \t]*\n[ \t*]\n */
@@ -1989,7 +1989,7 @@ static size_t
htmlblock_end_tag(
const char *tag,
size_t tag_len,
- hoedown_markdown *md,
+ hoedown_document *doc,
uint8_t *data,
size_t size)
{
@@ -2017,7 +2017,7 @@ htmlblock_end_tag(
static size_t
htmlblock_end(const char *curtag,
- hoedown_markdown *md,
+ hoedown_document *doc,
uint8_t *data,
size_t size,
int start_of_line)
@@ -2048,7 +2048,7 @@ htmlblock_end(const char *curtag,
if (i + 2 + tag_size >= size)
break;
- end_tag = htmlblock_end_tag(curtag, tag_size, md, data + i - 1, size - i + 1);
+ end_tag = htmlblock_end_tag(curtag, tag_size, doc, data + i - 1, size - i + 1);
if (end_tag)
return i + end_tag - 1;
}
@@ -2059,7 +2059,7 @@ htmlblock_end(const char *curtag,
/* parse_htmlblock • parsing of inline HTML block */
static size_t
-parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size, int do_render)
+parse_htmlblock(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, int do_render)
{
size_t i, j = 0, tag_end;
const char *curtag = NULL;
@@ -2093,8 +2093,8 @@ parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
if (j) {
work.size = i + j;
- if (do_render && md->md.blockhtml)
- md->md.blockhtml(ob, &work, md->md.opaque);
+ if (do_render && doc->md.blockhtml)
+ doc->md.blockhtml(ob, &work, doc->md.opaque);
return work.size;
}
}
@@ -2110,8 +2110,8 @@ parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
j = is_empty(data + i, size - i);
if (j) {
work.size = i + j;
- if (do_render && md->md.blockhtml)
- md->md.blockhtml(ob, &work, md->md.opaque);
+ if (do_render && doc->md.blockhtml)
+ doc->md.blockhtml(ob, &work, doc->md.opaque);
return work.size;
}
}
@@ -2123,12 +2123,12 @@ parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
/* looking for an unindented matching closing tag */
/* followed by a blank line */
- tag_end = htmlblock_end(curtag, md, data, size, 1);
+ tag_end = htmlblock_end(curtag, doc, data, size, 1);
/* if not found, trying a second pass looking for indented match */
/* but not if tag is "ins" or "del" (following original Markdown.pl) */
if (!tag_end && strcmp(curtag, "ins") != 0 && strcmp(curtag, "del") != 0) {
- tag_end = htmlblock_end(curtag, md, data, size, 0);
+ tag_end = htmlblock_end(curtag, doc, data, size, 0);
}
if (!tag_end)
@@ -2136,8 +2136,8 @@ parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
/* the end of the block has been found */
work.size = tag_end;
- if (do_render && md->md.blockhtml)
- md->md.blockhtml(ob, &work, md->md.opaque);
+ if (do_render && doc->md.blockhtml)
+ doc->md.blockhtml(ob, &work, doc->md.opaque);
return tag_end;
}
@@ -2145,7 +2145,7 @@ parse_htmlblock(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t
static void
parse_table_row(
hoedown_buffer *ob,
- hoedown_markdown *md,
+ hoedown_document *doc,
uint8_t *data,
size_t size,
size_t columns,
@@ -2155,10 +2155,10 @@ parse_table_row(
size_t i = 0, col;
hoedown_buffer *row_work = 0;
- if (!md->md.table_cell || !md->md.table_row)
+ if (!doc->md.table_cell || !doc->md.table_row)
return;
- row_work = newbuf(md, BUFFER_SPAN);
+ row_work = newbuf(doc, BUFFER_SPAN);
if (i < size && data[i] == '|')
i++;
@@ -2167,7 +2167,7 @@ parse_table_row(
size_t cell_start, cell_end;
hoedown_buffer *cell_work;
- cell_work = newbuf(md, BUFFER_SPAN);
+ cell_work = newbuf(doc, BUFFER_SPAN);
while (i < size && _isspace(data[i]))
i++;
@@ -2182,27 +2182,27 @@ parse_table_row(
while (cell_end > cell_start && _isspace(data[cell_end]))
cell_end--;
- parse_inline(cell_work, md, data + cell_start, 1 + cell_end - cell_start);
- md->md.table_cell(row_work, cell_work, col_data[col] | header_flag, md->md.opaque);
+ parse_inline(cell_work, doc, data + cell_start, 1 + cell_end - cell_start);
+ doc->md.table_cell(row_work, cell_work, col_data[col] | header_flag, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
i++;
}
for (; col < columns; ++col) {
hoedown_buffer empty_cell = { 0, 0, 0, 0 };
- md->md.table_cell(row_work, &empty_cell, col_data[col] | header_flag, md->md.opaque);
+ doc->md.table_cell(row_work, &empty_cell, col_data[col] | header_flag, doc->md.opaque);
}
- md->md.table_row(ob, row_work, md->md.opaque);
+ doc->md.table_row(ob, row_work, doc->md.opaque);
- popbuf(md, BUFFER_SPAN);
+ popbuf(doc, BUFFER_SPAN);
}
static size_t
parse_table_header(
hoedown_buffer *ob,
- hoedown_markdown *md,
+ hoedown_document *doc,
uint8_t *data,
size_t size,
size_t *columns,
@@ -2281,7 +2281,7 @@ parse_table_header(
return 0;
parse_table_row(
- ob, md, data,
+ ob, doc, data,
header_end,
*columns,
*column_data,
@@ -2294,7 +2294,7 @@ parse_table_header(
static size_t
parse_table(
hoedown_buffer *ob,
- hoedown_markdown *md,
+ hoedown_document *doc,
uint8_t *data,
size_t size)
{
@@ -2306,10 +2306,10 @@ parse_table(
size_t columns;
int *col_data = NULL;
- header_work = newbuf(md, BUFFER_SPAN);
- body_work = newbuf(md, BUFFER_BLOCK);
+ header_work = newbuf(doc, BUFFER_SPAN);
+ body_work = newbuf(doc, BUFFER_BLOCK);
- i = parse_table_header(header_work, md, data, size, &columns, &col_data);
+ i = parse_table_header(header_work, doc, data, size, &columns, &col_data);
if (i > 0) {
while (i < size) {
@@ -2329,7 +2329,7 @@ parse_table(
parse_table_row(
body_work,
- md,
+ doc,
data + row_start,
i - row_start,
columns,
@@ -2339,45 +2339,45 @@ parse_table(
i++;
}
- if (md->md.table)
- md->md.table(ob, header_work, body_work, md->md.opaque);
+ if (doc->md.table)
+ doc->md.table(ob, header_work, body_work, doc->md.opaque);
}
free(col_data);
- popbuf(md, BUFFER_SPAN);
- popbuf(md, BUFFER_BLOCK);
+ popbuf(doc, BUFFER_SPAN);
+ popbuf(doc, BUFFER_BLOCK);
return i;
}
/* parse_block • parsing of one block, returning next uint8_t to parse */
static void
-parse_block(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size)
+parse_block(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size)
{
size_t beg, end, i;
uint8_t *txt_data;
beg = 0;
- if (md->work_bufs[BUFFER_SPAN].size +
- md->work_bufs[BUFFER_BLOCK].size > md->max_nesting)
+ if (doc->work_bufs[BUFFER_SPAN].size +
+ doc->work_bufs[BUFFER_BLOCK].size > doc->max_nesting)
return;
while (beg < size) {
txt_data = data + beg;
end = size - beg;
- if (is_atxheader(md, txt_data, end))
- beg += parse_atxheader(ob, md, txt_data, end);
+ if (is_atxheader(doc, txt_data, end))
+ beg += parse_atxheader(ob, doc, txt_data, end);
- else if (data[beg] == '<' && md->md.blockhtml &&
- (i = parse_htmlblock(ob, md, txt_data, end, 1)) != 0)
+ else if (data[beg] == '<' && doc->md.blockhtml &&
+ (i = parse_htmlblock(ob, doc, txt_data, end, 1)) != 0)
beg += i;
else if ((i = is_empty(txt_data, end)) != 0)
beg += i;
else if (is_hrule(txt_data, end)) {
- if (md->md.hrule)
- md->md.hrule(ob, md->md.opaque);
+ if (doc->md.hrule)
+ doc->md.hrule(ob, doc->md.opaque);
while (beg < size && data[beg] != '\n')
beg++;
@@ -2385,28 +2385,28 @@ parse_block(hoedown_buffer *ob, hoedown_markdown *md, uint8_t *data, size_t size
beg++;
}
- else if ((md->ext_flags & HOEDOWN_EXT_FENCED_CODE) != 0 &&
- (i = parse_fencedcode(ob, md, txt_data, end)) != 0)
+ else if ((doc->ext_flags & HOEDOWN_EXT_FENCED_CODE) != 0 &&
+ (i = parse_fencedcode(ob, doc, txt_data, end)) != 0)
beg += i;
- else if ((md->ext_flags & HOEDOWN_EXT_TABLES) != 0 &&
- (i = parse_table(ob, md, txt_data, end)) != 0)
+ else if ((doc->ext_flags & HOEDOWN_EXT_TABLES) != 0 &&
+ (i = parse_table(ob, doc, txt_data, end)) != 0)
beg += i;
else if (prefix_quote(txt_data, end))
- beg += parse_blockquote(ob, md, txt_data, end);
+ beg += parse_blockquote(ob, doc, txt_data, end);
- else if (!(md->ext_flags & HOEDOWN_EXT_DISABLE_INDENTED_CODE) && prefix_code(txt_data, end))
- beg += parse_blockcode(ob, md, txt_data, end);
+ else if (!(doc->ext_flags & HOEDOWN_EXT_DISABLE_INDENTED_CODE) && prefix_code(txt_data, end))
+ beg += parse_blockcode(ob, doc, txt_data, end);
else if (prefix_uli(txt_data, end))
- beg += parse_list(ob, md, txt_data, end, 0);
+ beg += parse_list(ob, doc, txt_data, end, 0);
else if (prefix_oli(txt_data, end))
- beg += parse_list(ob, md, txt_data, end, HOEDOWN_LIST_ORDERED);
+ beg += parse_list(ob, doc, txt_data, end, HOEDOWN_LIST_ORDERED);
else
- beg += parse_paragraph(ob, md, txt_data, end);
+ beg += parse_paragraph(ob, doc, txt_data, end);
}
}
@@ -2664,71 +2664,71 @@ static void expand_tabs(hoedown_buffer *ob, const uint8_t *line, size_t size)
* EXPORTED FUNCTIONS *
**********************/
-hoedown_markdown *
-hoedown_markdown_new(
+hoedown_document *
+hoedown_document_new(
unsigned int extensions,
size_t max_nesting,
const hoedown_renderer *renderer)
{
- hoedown_markdown *md = NULL;
+ hoedown_document *doc = NULL;
assert(max_nesting > 0 && renderer);
- md = malloc(sizeof(hoedown_markdown));
- if (!md)
+ doc = malloc(sizeof(hoedown_document));
+ if (!doc)
return NULL;
- memcpy(&md->md, renderer, sizeof(hoedown_renderer));
+ memcpy(&doc->md, renderer, sizeof(hoedown_renderer));
- hoedown_stack_new(&md->work_bufs[BUFFER_BLOCK], 4);
- hoedown_stack_new(&md->work_bufs[BUFFER_SPAN], 8);
+ hoedown_stack_new(&doc->work_bufs[BUFFER_BLOCK], 4);
+ hoedown_stack_new(&doc->work_bufs[BUFFER_SPAN], 8);
- memset(md->active_char, 0x0, 256);
+ memset(doc->active_char, 0x0, 256);
- if (md->md.emphasis || md->md.double_emphasis || md->md.triple_emphasis) {
- md->active_char['*'] = MD_CHAR_EMPHASIS;
- md->active_char['_'] = MD_CHAR_EMPHASIS;
+ if (doc->md.emphasis || doc->md.double_emphasis || doc->md.triple_emphasis) {
+ doc->active_char['*'] = MD_CHAR_EMPHASIS;
+ doc->active_char['_'] = MD_CHAR_EMPHASIS;
if (extensions & HOEDOWN_EXT_STRIKETHROUGH)
- md->active_char['~'] = MD_CHAR_EMPHASIS;
+ doc->active_char['~'] = MD_CHAR_EMPHASIS;
if (extensions & HOEDOWN_EXT_HIGHLIGHT)
- md->active_char['='] = MD_CHAR_EMPHASIS;
+ doc->active_char['='] = MD_CHAR_EMPHASIS;
}
- if (md->md.codespan)
- md->active_char['`'] = MD_CHAR_CODESPAN;
+ if (doc->md.codespan)
+ doc->active_char['`'] = MD_CHAR_CODESPAN;
- if (md->md.linebreak)
- md->active_char['\n'] = MD_CHAR_LINEBREAK;
+ if (doc->md.linebreak)
+ doc->active_char['\n'] = MD_CHAR_LINEBREAK;
- if (md->md.image || md->md.link)
- md->active_char['['] = MD_CHAR_LINK;
+ if (doc->md.image || doc->md.link)
+ doc->active_char['['] = MD_CHAR_LINK;
- md->active_char['<'] = MD_CHAR_LANGLE;
- md->active_char['\\'] = MD_CHAR_ESCAPE;
- md->active_char['&'] = MD_CHAR_ENTITITY;
+ doc->active_char['<'] = MD_CHAR_LANGLE;
+ doc->active_char['\\'] = MD_CHAR_ESCAPE;
+ doc->active_char['&'] = MD_CHAR_ENTITITY;
if (extensions & HOEDOWN_EXT_AUTOLINK) {
- md->active_char[':'] = MD_CHAR_AUTOLINK_URL;
- md->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;
- md->active_char['w'] = MD_CHAR_AUTOLINK_WWW;
+ doc->active_char[':'] = MD_CHAR_AUTOLINK_URL;
+ doc->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;
+ doc->active_char['w'] = MD_CHAR_AUTOLINK_WWW;
}
if (extensions & HOEDOWN_EXT_SUPERSCRIPT)
- md->active_char['^'] = MD_CHAR_SUPERSCRIPT;
+ doc->active_char['^'] = MD_CHAR_SUPERSCRIPT;
if (extensions & HOEDOWN_EXT_QUOTE)
- md->active_char['"'] = MD_CHAR_QUOTE;
+ doc->active_char['"'] = MD_CHAR_QUOTE;
/* Extension data */
- md->ext_flags = extensions;
- md->max_nesting = max_nesting;
- md->in_link_body = 0;
+ doc->ext_flags = extensions;
+ doc->max_nesting = max_nesting;
+ doc->in_link_body = 0;
- return md;
+ return doc;
}
void
-hoedown_markdown_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_size, hoedown_markdown *md)
+hoedown_document_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_size, hoedown_document *doc)
{
static const uint8_t UTF8_BOM[] = {0xEF, 0xBB, 0xBF};
@@ -2745,14 +2745,14 @@ hoedown_markdown_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_
hoedown_buffer_grow(text, doc_size);
/* reset the references table */
- memset(&md->refs, 0x0, REF_TABLE_SIZE * sizeof(void *));
+ memset(&doc->refs, 0x0, REF_TABLE_SIZE * sizeof(void *));
- footnotes_enabled = md->ext_flags & HOEDOWN_EXT_FOOTNOTES;
+ footnotes_enabled = doc->ext_flags & HOEDOWN_EXT_FOOTNOTES;
/* reset the footnotes lists */
if (footnotes_enabled) {
- memset(&md->footnotes_found, 0x0, sizeof(md->footnotes_found));
- memset(&md->footnotes_used, 0x0, sizeof(md->footnotes_used));
+ memset(&doc->footnotes_found, 0x0, sizeof(doc->footnotes_found));
+ memset(&doc->footnotes_used, 0x0, sizeof(doc->footnotes_used));
}
/* first pass: looking for references, copying everything else */
@@ -2764,9 +2764,9 @@ hoedown_markdown_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_
beg += 3;
while (beg < doc_size) /* iterating over lines */
- if (footnotes_enabled && is_footnote(document, beg, doc_size, &end, &md->footnotes_found))
+ if (footnotes_enabled && is_footnote(document, beg, doc_size, &end, &doc->footnotes_found))
beg = end;
- else if (is_ref(document, beg, doc_size, &end, md->refs))
+ else if (is_ref(document, beg, doc_size, &end, doc->refs))
beg = end;
else { /* skipping to the next line */
end = beg;
@@ -2791,51 +2791,51 @@ hoedown_markdown_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_
hoedown_buffer_grow(ob, text->size + (text->size >> 1));
/* second pass: actual rendering */
- if (md->md.doc_header)
- md->md.doc_header(ob, md->md.opaque);
+ if (doc->md.doc_header)
+ doc->md.doc_header(ob, doc->md.opaque);
if (text->size) {
/* adding a final newline if not already present */
if (text->data[text->size - 1] != '\n' && text->data[text->size - 1] != '\r')
hoedown_buffer_putc(text, '\n');
- parse_block(ob, md, text->data, text->size);
+ parse_block(ob, doc, text->data, text->size);
}
/* footnotes */
if (footnotes_enabled)
- parse_footnote_list(ob, md, &md->footnotes_used);
+ parse_footnote_list(ob, doc, &doc->footnotes_used);
- if (md->md.doc_footer)
- md->md.doc_footer(ob, md->md.opaque);
+ if (doc->md.doc_footer)
+ doc->md.doc_footer(ob, doc->md.opaque);
/* clean-up */
hoedown_buffer_free(text);
- free_link_refs(md->refs);
+ free_link_refs(doc->refs);
if (footnotes_enabled) {
- free_footnote_list(&md->footnotes_found, 1);
- free_footnote_list(&md->footnotes_used, 0);
+ free_footnote_list(&doc->footnotes_found, 1);
+ free_footnote_list(&doc->footnotes_used, 0);
}
- assert(md->work_bufs[BUFFER_SPAN].size == 0);
- assert(md->work_bufs[BUFFER_BLOCK].size == 0);
+ assert(doc->work_bufs[BUFFER_SPAN].size == 0);
+ assert(doc->work_bufs[BUFFER_BLOCK].size == 0);
}
void
-hoedown_markdown_free(hoedown_markdown *md)
+hoedown_document_free(hoedown_document *doc)
{
size_t i;
- for (i = 0; i < (size_t)md->work_bufs[BUFFER_SPAN].asize; ++i)
- hoedown_buffer_free(md->work_bufs[BUFFER_SPAN].item[i]);
+ for (i = 0; i < (size_t)doc->work_bufs[BUFFER_SPAN].asize; ++i)
+ hoedown_buffer_free(doc->work_bufs[BUFFER_SPAN].item[i]);
- for (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i)
- hoedown_buffer_free(md->work_bufs[BUFFER_BLOCK].item[i]);
+ for (i = 0; i < (size_t)doc->work_bufs[BUFFER_BLOCK].asize; ++i)
+ hoedown_buffer_free(doc->work_bufs[BUFFER_BLOCK].item[i]);
- hoedown_stack_free(&md->work_bufs[BUFFER_SPAN]);
- hoedown_stack_free(&md->work_bufs[BUFFER_BLOCK]);
+ hoedown_stack_free(&doc->work_bufs[BUFFER_SPAN]);
+ hoedown_stack_free(&doc->work_bufs[BUFFER_BLOCK]);
- free(md);
+ free(doc);
}
void
diff --git a/src/document.h b/src/document.h
index 9af673b..7fb5afa 100644
--- a/src/document.h
+++ b/src/document.h
@@ -98,9 +98,9 @@ struct hoedown_renderer {
typedef struct hoedown_renderer hoedown_renderer;
-struct hoedown_markdown;
+struct hoedown_document;
-typedef struct hoedown_markdown hoedown_markdown;
+typedef struct hoedown_document hoedown_document;
/*********
* FLAGS *
@@ -114,17 +114,17 @@ typedef struct hoedown_markdown hoedown_markdown;
* EXPORTED FUNCTIONS *
**********************/
-extern hoedown_markdown *
-hoedown_markdown_new(
+extern hoedown_document *
+hoedown_document_new(
unsigned int extensions,
size_t max_nesting,
const hoedown_renderer *renderer);
extern void
-hoedown_markdown_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_size, hoedown_markdown *md);
+hoedown_document_render(hoedown_buffer *ob, const uint8_t *document, size_t doc_size, hoedown_document *doc);
extern void
-hoedown_markdown_free(hoedown_markdown *md);
+hoedown_document_free(hoedown_document *doc);
extern void
hoedown_version(int *major, int *minor, int *revision);