annotate hoedown/src/html.c @ 51:2856db357c69

sqlite: upgrade to 3.16.2
author David Demelier <markand@malikania.fr>
date Sat, 04 Feb 2017 19:12:38 +0100
parents 2dce41ab17e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 #include "html.h"
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
2
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 #include <string.h>
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 #include <stdlib.h>
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 #include <stdio.h>
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 #include <ctype.h>
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 #include "escape.h"
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
9
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 #define USE_XHTML(opt) (opt->flags & HOEDOWN_HTML_USE_XHTML)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
11
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 hoedown_html_tag
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 hoedown_html_is_tag(const uint8_t *data, size_t size, const char *tagname)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 size_t i;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 int closed = 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
17
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 if (size < 3 || data[0] != '<')
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 return HOEDOWN_HTML_TAG_NONE;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 i = 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 if (data[i] == '/') {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 closed = 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 i++;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 for (; i < size; ++i, ++tagname) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 if (*tagname == 0)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 break;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 if (data[i] != *tagname)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 return HOEDOWN_HTML_TAG_NONE;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 if (i == size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 return HOEDOWN_HTML_TAG_NONE;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 if (isspace(data[i]) || data[i] == '>')
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 return closed ? HOEDOWN_HTML_TAG_CLOSE : HOEDOWN_HTML_TAG_OPEN;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 return HOEDOWN_HTML_TAG_NONE;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 static void escape_html(hoedown_buffer *ob, const uint8_t *source, size_t length)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 hoedown_escape_html(ob, source, length, 0);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 static void escape_href(hoedown_buffer *ob, const uint8_t *source, size_t length)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 hoedown_escape_href(ob, source, length);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 /********************
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * GENERIC RENDERER *
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 ********************/
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 rndr_autolink(hoedown_buffer *ob, const hoedown_buffer *link, hoedown_autolink_type type, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 if (!link || !link->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 HOEDOWN_BUFPUTSL(ob, "<a href=\"");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 if (type == HOEDOWN_AUTOLINK_EMAIL)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 HOEDOWN_BUFPUTSL(ob, "mailto:");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 escape_href(ob, link->data, link->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 if (state->link_attributes) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 hoedown_buffer_putc(ob, '\"');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 state->link_attributes(ob, link, data);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 hoedown_buffer_putc(ob, '>');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 HOEDOWN_BUFPUTSL(ob, "\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 /*
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * Pretty printing: if we get an email address as
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 * an actual URI, e.g. `mailto:foo@bar.com`, we don't
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 * want to print the `mailto:` prefix
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 if (hoedown_buffer_prefix(link, "mailto:") == 0) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 escape_html(ob, link->data + 7, link->size - 7);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 escape_html(ob, link->data, link->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 HOEDOWN_BUFPUTSL(ob, "</a>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 rndr_blockcode(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_buffer *lang, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 if (lang) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 HOEDOWN_BUFPUTSL(ob, "<pre><code class=\"language-");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 escape_html(ob, lang->data, lang->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 HOEDOWN_BUFPUTSL(ob, "\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 HOEDOWN_BUFPUTSL(ob, "<pre><code>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 if (text)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 escape_html(ob, text->data, text->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 HOEDOWN_BUFPUTSL(ob, "</code></pre>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 rndr_blockquote(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 HOEDOWN_BUFPUTSL(ob, "<blockquote>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 HOEDOWN_BUFPUTSL(ob, "</blockquote>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 rndr_codespan(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 HOEDOWN_BUFPUTSL(ob, "<code>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (text) escape_html(ob, text->data, text->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 HOEDOWN_BUFPUTSL(ob, "</code>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 rndr_strikethrough(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 if (!content || !content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 HOEDOWN_BUFPUTSL(ob, "<del>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 HOEDOWN_BUFPUTSL(ob, "</del>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 rndr_double_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 if (!content || !content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 HOEDOWN_BUFPUTSL(ob, "<strong>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 HOEDOWN_BUFPUTSL(ob, "</strong>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
153
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
156
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 rndr_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 if (!content || !content->size) return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 HOEDOWN_BUFPUTSL(ob, "<em>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 HOEDOWN_BUFPUTSL(ob, "</em>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 rndr_underline(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 if (!content || !content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 HOEDOWN_BUFPUTSL(ob, "<u>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 HOEDOWN_BUFPUTSL(ob, "</u>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
179
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 rndr_highlight(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 if (!content || !content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 HOEDOWN_BUFPUTSL(ob, "<mark>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 HOEDOWN_BUFPUTSL(ob, "</mark>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
189
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
192
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 rndr_quote(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 if (!content || !content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 HOEDOWN_BUFPUTSL(ob, "<q>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 HOEDOWN_BUFPUTSL(ob, "</q>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 rndr_linebreak(hoedown_buffer *ob, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 hoedown_buffer_puts(ob, USE_XHTML(state) ? "<br/>\n" : "<br>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 rndr_header(hoedown_buffer *ob, const hoedown_buffer *content, int level, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 if (ob->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
221
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 if (level <= state->toc_data.nesting_level)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 hoedown_buffer_printf(ob, "<h%d id=\"toc_%d\">", level, state->toc_data.header_count++);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 else
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 hoedown_buffer_printf(ob, "<h%d>", level);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 hoedown_buffer_printf(ob, "</h%d>\n", level);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 rndr_link(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_buffer *link, const hoedown_buffer *title, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 HOEDOWN_BUFPUTSL(ob, "<a href=\"");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
237
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 if (link && link->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 escape_href(ob, link->data, link->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 if (title && title->size) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 HOEDOWN_BUFPUTSL(ob, "\" title=\"");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 escape_html(ob, title->data, title->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 if (state->link_attributes) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 hoedown_buffer_putc(ob, '\"');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 state->link_attributes(ob, link, data);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 hoedown_buffer_putc(ob, '>');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 HOEDOWN_BUFPUTSL(ob, "\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
253
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 if (content && content->size) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 HOEDOWN_BUFPUTSL(ob, "</a>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
258
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 rndr_list(hoedown_buffer *ob, const hoedown_buffer *content, hoedown_list_flags flags, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 hoedown_buffer_put(ob, (const uint8_t *)(flags & HOEDOWN_LIST_ORDERED ? "<ol>\n" : "<ul>\n"), 5);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 hoedown_buffer_put(ob, (const uint8_t *)(flags & HOEDOWN_LIST_ORDERED ? "</ol>\n" : "</ul>\n"), 6);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
267
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 rndr_listitem(hoedown_buffer *ob, const hoedown_buffer *content, hoedown_list_flags flags, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 HOEDOWN_BUFPUTSL(ob, "<li>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 if (content) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 size_t size = content->size;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 while (size && content->data[size - 1] == '\n')
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 size--;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
276
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 hoedown_buffer_put(ob, content->data, size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 HOEDOWN_BUFPUTSL(ob, "</li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
281
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 rndr_paragraph(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 size_t i = 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
287
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
289
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 if (!content || !content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 return;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
292
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 while (i < content->size && isspace(content->data[i])) i++;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
294
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 if (i == content->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 return;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 HOEDOWN_BUFPUTSL(ob, "<p>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 if (state->flags & HOEDOWN_HTML_HARD_WRAP) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 size_t org;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 while (i < content->size) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 org = i;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 while (i < content->size && content->data[i] != '\n')
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 i++;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
305
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 if (i > org)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 hoedown_buffer_put(ob, content->data + org, i - org);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
308
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 /*
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 * do not insert a line break if this newline
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 * is the last character on the paragraph
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 if (i >= content->size - 1)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 break;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
315
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 rndr_linebreak(ob, data);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 i++;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 hoedown_buffer_put(ob, content->data + i, content->size - i);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 HOEDOWN_BUFPUTSL(ob, "</p>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
324
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 rndr_raw_block(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 size_t org, sz;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 if (!text)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 return;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
332
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 /* FIXME: Do we *really* need to trim the HTML? How does that make a difference? */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 sz = text->size;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 while (sz > 0 && text->data[sz - 1] == '\n')
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 sz--;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
337
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 org = 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 while (org < sz && text->data[org] == '\n')
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 org++;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 if (org >= sz)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 return;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
344
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 if (ob->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 hoedown_buffer_put(ob, text->data + org, sz - org);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 rndr_triple_emphasis(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 if (!content || !content->size) return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 HOEDOWN_BUFPUTSL(ob, "<strong><em>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 HOEDOWN_BUFPUTSL(ob, "</em></strong>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 rndr_hrule(hoedown_buffer *ob, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 hoedown_buffer_puts(ob, USE_XHTML(state) ? "<hr/>\n" : "<hr>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
369
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 rndr_image(hoedown_buffer *ob, const hoedown_buffer *link, const hoedown_buffer *title, const hoedown_buffer *alt, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 if (!link || !link->size) return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
375
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 HOEDOWN_BUFPUTSL(ob, "<img src=\"");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 escape_href(ob, link->data, link->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 HOEDOWN_BUFPUTSL(ob, "\" alt=\"");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
379
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 if (alt && alt->size)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 escape_html(ob, alt->data, alt->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 if (title && title->size) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 HOEDOWN_BUFPUTSL(ob, "\" title=\"");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 escape_html(ob, title->data, title->size); }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
386
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 hoedown_buffer_puts(ob, USE_XHTML(state) ? "\"/>" : "\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
390
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 rndr_raw_html(hoedown_buffer *ob, const hoedown_buffer *text, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
395
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 /* ESCAPE overrides SKIP_HTML. It doesn't look to see if
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 * there are any valid tags, just escapes all of them. */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 if((state->flags & HOEDOWN_HTML_ESCAPE) != 0) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 escape_html(ob, text->data, text->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
402
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 if ((state->flags & HOEDOWN_HTML_SKIP_HTML) != 0)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
405
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 hoedown_buffer_put(ob, text->data, text->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
409
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 rndr_table(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 HOEDOWN_BUFPUTSL(ob, "<table>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 HOEDOWN_BUFPUTSL(ob, "</table>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
418
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 rndr_table_header(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 HOEDOWN_BUFPUTSL(ob, "<thead>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 HOEDOWN_BUFPUTSL(ob, "</thead>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
427
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 rndr_table_body(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 HOEDOWN_BUFPUTSL(ob, "<tbody>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 HOEDOWN_BUFPUTSL(ob, "</tbody>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
436
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 rndr_tablerow(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 HOEDOWN_BUFPUTSL(ob, "<tr>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 HOEDOWN_BUFPUTSL(ob, "</tr>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
444
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
446 rndr_tablecell(hoedown_buffer *ob, const hoedown_buffer *content, hoedown_table_flags flags, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 if (flags & HOEDOWN_TABLE_HEADER) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
449 HOEDOWN_BUFPUTSL(ob, "<th");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 HOEDOWN_BUFPUTSL(ob, "<td");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
453
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 switch (flags & HOEDOWN_TABLE_ALIGNMASK) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 case HOEDOWN_TABLE_ALIGN_CENTER:
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 HOEDOWN_BUFPUTSL(ob, " style=\"text-align: center\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 break;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
458
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 case HOEDOWN_TABLE_ALIGN_LEFT:
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 HOEDOWN_BUFPUTSL(ob, " style=\"text-align: left\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 break;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
462
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 case HOEDOWN_TABLE_ALIGN_RIGHT:
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 HOEDOWN_BUFPUTSL(ob, " style=\"text-align: right\">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 break;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
466
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 default:
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
468 HOEDOWN_BUFPUTSL(ob, ">");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
470
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
471 if (content)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
473
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 if (flags & HOEDOWN_TABLE_HEADER) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 HOEDOWN_BUFPUTSL(ob, "</th>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
476 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 HOEDOWN_BUFPUTSL(ob, "</td>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
478 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
480
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
481 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 rndr_superscript(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 if (!content || !content->size) return 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
485 HOEDOWN_BUFPUTSL(ob, "<sup>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 HOEDOWN_BUFPUTSL(ob, "</sup>");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
488 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
490
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
491 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
492 rndr_normal_text(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
493 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
494 if (content)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
495 escape_html(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
496 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
497
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 rndr_footnotes(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
500 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
502
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
503 if (ob->size) hoedown_buffer_putc(ob, '\n');
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
504 HOEDOWN_BUFPUTSL(ob, "<div class=\"footnotes\">\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
505 hoedown_buffer_puts(ob, USE_XHTML(state) ? "<hr/>\n" : "<hr>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
506 HOEDOWN_BUFPUTSL(ob, "<ol>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
507
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
508 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
509
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
510 HOEDOWN_BUFPUTSL(ob, "\n</ol>\n</div>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
512
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
513 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
514 rndr_footnote_def(hoedown_buffer *ob, const hoedown_buffer *content, unsigned int num, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
515 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
516 size_t i = 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
517 int pfound = 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
518
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
519 /* insert anchor at the end of first paragraph block */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
520 if (content) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
521 while ((i+3) < content->size) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
522 if (content->data[i++] != '<') continue;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
523 if (content->data[i++] != '/') continue;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
524 if (content->data[i++] != 'p' && content->data[i] != 'P') continue;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
525 if (content->data[i] != '>') continue;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
526 i -= 3;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
527 pfound = 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
528 break;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
529 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
530 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
531
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
532 hoedown_buffer_printf(ob, "\n<li id=\"fn%d\">\n", num);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
533 if (pfound) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
534 hoedown_buffer_put(ob, content->data, i);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
535 hoedown_buffer_printf(ob, "&nbsp;<a href=\"#fnref%d\" rev=\"footnote\">&#8617;</a>", num);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
536 hoedown_buffer_put(ob, content->data + i, content->size - i);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
537 } else if (content) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
538 hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
539 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
540 HOEDOWN_BUFPUTSL(ob, "</li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
541 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
542
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
543 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
544 rndr_footnote_ref(hoedown_buffer *ob, unsigned int num, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
545 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 hoedown_buffer_printf(ob, "<sup id=\"fnref%d\"><a href=\"#fn%d\" rel=\"footnote\">%d</a></sup>", num, num, num);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
547 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
548 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
549
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
550 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
551 rndr_math(hoedown_buffer *ob, const hoedown_buffer *text, int displaymode, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
552 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
553 hoedown_buffer_put(ob, (const uint8_t *)(displaymode ? "\\[" : "\\("), 2);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
554 escape_html(ob, text->data, text->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
555 hoedown_buffer_put(ob, (const uint8_t *)(displaymode ? "\\]" : "\\)"), 2);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
556 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
557 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
558
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
559 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
560 toc_header(hoedown_buffer *ob, const hoedown_buffer *content, int level, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
561 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
562 hoedown_html_renderer_state *state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
563
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
564 if (level <= state->toc_data.nesting_level) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
565 /* set the level offset if this is the first header
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
566 * we're parsing for the document */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
567 if (state->toc_data.current_level == 0)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
568 state->toc_data.level_offset = level - 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
569
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
570 level -= state->toc_data.level_offset;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
571
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 if (level > state->toc_data.current_level) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
573 while (level > state->toc_data.current_level) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
574 HOEDOWN_BUFPUTSL(ob, "<ul>\n<li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
575 state->toc_data.current_level++;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
576 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
577 } else if (level < state->toc_data.current_level) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
578 HOEDOWN_BUFPUTSL(ob, "</li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 while (level < state->toc_data.current_level) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
580 HOEDOWN_BUFPUTSL(ob, "</ul>\n</li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
581 state->toc_data.current_level--;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
582 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
583 HOEDOWN_BUFPUTSL(ob,"<li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
584 } else {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
585 HOEDOWN_BUFPUTSL(ob,"</li>\n<li>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
586 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
587
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 hoedown_buffer_printf(ob, "<a href=\"#toc_%d\">", state->toc_data.header_count++);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 if (content) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 HOEDOWN_BUFPUTSL(ob, "</a>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
591 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
592 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
593
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
594 static int
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
595 toc_link(hoedown_buffer *ob, const hoedown_buffer *content, const hoedown_buffer *link, const hoedown_buffer *title, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
596 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
597 if (content && content->size) hoedown_buffer_put(ob, content->data, content->size);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
598 return 1;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
599 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
600
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
601 static void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
602 toc_finalize(hoedown_buffer *ob, int inline_render, const hoedown_renderer_data *data)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
603 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
604 hoedown_html_renderer_state *state;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
605
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
606 if (inline_render)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
607 return;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
608
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
609 state = data->opaque;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
610
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
611 while (state->toc_data.current_level > 0) {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
612 HOEDOWN_BUFPUTSL(ob, "</li>\n</ul>\n");
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
613 state->toc_data.current_level--;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
614 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
615
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
616 state->toc_data.header_count = 0;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
617 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
618
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
619 hoedown_renderer *
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
620 hoedown_html_toc_renderer_new(int nesting_level)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
621 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
622 static const hoedown_renderer cb_default = {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
623 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
624
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
625 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
626 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
627 toc_header,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
628 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
629 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
630 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
631 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
632 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
633 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
634 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
635 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
636 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
637 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
638 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
639 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
640
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
641 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
642 rndr_codespan,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
643 rndr_double_emphasis,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
644 rndr_emphasis,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
645 rndr_underline,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
646 rndr_highlight,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
647 rndr_quote,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
648 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
649 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
650 toc_link,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
651 rndr_triple_emphasis,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
652 rndr_strikethrough,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
653 rndr_superscript,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
654 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
655 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
656 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
657
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
658 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
659 rndr_normal_text,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
660
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
661 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
662 toc_finalize
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
663 };
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
664
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
665 hoedown_html_renderer_state *state;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
666 hoedown_renderer *renderer;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
667
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
668 /* Prepare the state pointer */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
669 state = hoedown_malloc(sizeof(hoedown_html_renderer_state));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
670 memset(state, 0x0, sizeof(hoedown_html_renderer_state));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
671
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
672 state->toc_data.nesting_level = nesting_level;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
673
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
674 /* Prepare the renderer */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
675 renderer = hoedown_malloc(sizeof(hoedown_renderer));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
676 memcpy(renderer, &cb_default, sizeof(hoedown_renderer));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
677
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
678 renderer->opaque = state;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
679 return renderer;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
680 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
681
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
682 hoedown_renderer *
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
683 hoedown_html_renderer_new(hoedown_html_flags render_flags, int nesting_level)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
684 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
685 static const hoedown_renderer cb_default = {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
686 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
687
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
688 rndr_blockcode,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
689 rndr_blockquote,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
690 rndr_header,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
691 rndr_hrule,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
692 rndr_list,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
693 rndr_listitem,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
694 rndr_paragraph,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
695 rndr_table,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
696 rndr_table_header,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
697 rndr_table_body,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
698 rndr_tablerow,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
699 rndr_tablecell,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
700 rndr_footnotes,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
701 rndr_footnote_def,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
702 rndr_raw_block,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
703
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
704 rndr_autolink,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
705 rndr_codespan,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
706 rndr_double_emphasis,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
707 rndr_emphasis,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
708 rndr_underline,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
709 rndr_highlight,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
710 rndr_quote,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
711 rndr_image,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
712 rndr_linebreak,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
713 rndr_link,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
714 rndr_triple_emphasis,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
715 rndr_strikethrough,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
716 rndr_superscript,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
717 rndr_footnote_ref,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
718 rndr_math,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
719 rndr_raw_html,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
720
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
721 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
722 rndr_normal_text,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
723
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
724 NULL,
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
725 NULL
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
726 };
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
727
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
728 hoedown_html_renderer_state *state;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
729 hoedown_renderer *renderer;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
730
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
731 /* Prepare the state pointer */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
732 state = hoedown_malloc(sizeof(hoedown_html_renderer_state));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
733 memset(state, 0x0, sizeof(hoedown_html_renderer_state));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
734
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
735 state->flags = render_flags;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
736 state->toc_data.nesting_level = nesting_level;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
737
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
738 /* Prepare the renderer */
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
739 renderer = hoedown_malloc(sizeof(hoedown_renderer));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
740 memcpy(renderer, &cb_default, sizeof(hoedown_renderer));
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
741
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
742 if (render_flags & HOEDOWN_HTML_SKIP_HTML || render_flags & HOEDOWN_HTML_ESCAPE)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
743 renderer->blockhtml = NULL;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
744
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
745 renderer->opaque = state;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
746 return renderer;
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
747 }
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
748
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
749 void
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
750 hoedown_html_renderer_free(hoedown_renderer *renderer)
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
751 {
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
752 free(renderer->opaque);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
753 free(renderer);
2dce41ab17e8 hoedown: import 3.0.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
754 }