\n"); 88 | } else { 89 | cr(html); 90 | cmark_strbuf_puts(html, "\n"); 91 | } 92 | break; 93 | 94 | case CMARK_NODE_LIST: { 95 | cmark_list_type list_type = node->as.list.list_type; 96 | int start = node->as.list.start; 97 | 98 | if (entering) { 99 | cr(html); 100 | if (list_type == CMARK_BULLET_LIST) { 101 | cmark_strbuf_puts(html, "
");
153 | } else {
154 | bufsize_t first_tag = 0;
155 | while (first_tag < node->as.code.info.len &&
156 | !cmark_isspace(node->as.code.info.data[first_tag])) {
157 | first_tag += 1;
158 | }
159 |
160 | cmark_strbuf_puts(html, "as.code.info.data, first_tag);
164 | cmark_strbuf_puts(html, "\">");
165 | }
166 |
167 | escape_html(html, node->as.code.literal.data, node->as.code.literal.len);
168 | cmark_strbuf_puts(html, "
\n");
169 | break;
170 |
171 | case CMARK_NODE_HTML_BLOCK:
172 | cr(html);
173 | if (options & CMARK_OPT_SAFE) {
174 | cmark_strbuf_puts(html, "");
175 | } else {
176 | cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
177 | }
178 | cr(html);
179 | break;
180 |
181 | case CMARK_NODE_CUSTOM_BLOCK:
182 | cr(html);
183 | if (entering) {
184 | cmark_strbuf_put(html, node->as.custom.on_enter.data,
185 | node->as.custom.on_enter.len);
186 | } else {
187 | cmark_strbuf_put(html, node->as.custom.on_exit.data,
188 | node->as.custom.on_exit.len);
189 | }
190 | cr(html);
191 | break;
192 |
193 | case CMARK_NODE_THEMATIC_BREAK:
194 | cr(html);
195 | cmark_strbuf_puts(html, "
\n");
198 | break;
199 |
200 | case CMARK_NODE_PARAGRAPH:
201 | parent = cmark_node_parent(node);
202 | grandparent = cmark_node_parent(parent);
203 | if (grandparent != NULL && grandparent->type == CMARK_NODE_LIST) {
204 | tight = grandparent->as.list.tight;
205 | } else {
206 | tight = false;
207 | }
208 | if (!tight) {
209 | if (entering) {
210 | cr(html);
211 | cmark_strbuf_puts(html, "');
214 | } else {
215 | cmark_strbuf_puts(html, "
\n");
216 | }
217 | }
218 | break;
219 |
220 | case CMARK_NODE_TEXT:
221 | escape_html(html, node->as.literal.data, node->as.literal.len);
222 | break;
223 |
224 | case CMARK_NODE_LINEBREAK:
225 | cmark_strbuf_puts(html, "
\n");
226 | break;
227 |
228 | case CMARK_NODE_SOFTBREAK:
229 | if (options & CMARK_OPT_HARDBREAKS) {
230 | cmark_strbuf_puts(html, "
\n");
231 | } else {
232 | cmark_strbuf_putc(html, '\n');
233 | }
234 | break;
235 |
236 | case CMARK_NODE_CODE:
237 | cmark_strbuf_puts(html, "");
238 | escape_html(html, node->as.literal.data, node->as.literal.len);
239 | cmark_strbuf_puts(html, "
");
240 | break;
241 |
242 | case CMARK_NODE_HTML_INLINE:
243 | if (options & CMARK_OPT_SAFE) {
244 | cmark_strbuf_puts(html, "");
245 | } else {
246 | cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
247 | }
248 | break;
249 |
250 | case CMARK_NODE_CUSTOM_INLINE:
251 | if (entering) {
252 | cmark_strbuf_put(html, node->as.custom.on_enter.data,
253 | node->as.custom.on_enter.len);
254 | } else {
255 | cmark_strbuf_put(html, node->as.custom.on_exit.data,
256 | node->as.custom.on_exit.len);
257 | }
258 | break;
259 |
260 | case CMARK_NODE_STRONG:
261 | if (entering) {
262 | cmark_strbuf_puts(html, "");
263 | } else {
264 | cmark_strbuf_puts(html, "");
265 | }
266 | break;
267 |
268 | case CMARK_NODE_EMPH:
269 | if (entering) {
270 | cmark_strbuf_puts(html, "");
271 | } else {
272 | cmark_strbuf_puts(html, "");
273 | }
274 | break;
275 |
276 | case CMARK_NODE_LINK:
277 | if (entering) {
278 | cmark_strbuf_puts(html, "as.link.url, 0))) {
281 | houdini_escape_href(html, node->as.link.url.data,
282 | node->as.link.url.len);
283 | }
284 | if (node->as.link.title.len) {
285 | cmark_strbuf_puts(html, "\" title=\"");
286 | escape_html(html, node->as.link.title.data, node->as.link.title.len);
287 | }
288 | cmark_strbuf_puts(html, "\">");
289 | } else {
290 | cmark_strbuf_puts(html, "");
291 | }
292 | break;
293 |
294 | case CMARK_NODE_IMAGE:
295 | if (entering) {
296 | cmark_strbuf_puts(html, "
as.link.url, 0))) {
299 | houdini_escape_href(html, node->as.link.url.data,
300 | node->as.link.url.len);
301 | }
302 | cmark_strbuf_puts(html, "\" alt=\"");
303 | state->plain = node;
304 | } else {
305 | if (node->as.link.title.len) {
306 | cmark_strbuf_puts(html, "\" title=\"");
307 | escape_html(html, node->as.link.title.data, node->as.link.title.len);
308 | }
309 |
310 | cmark_strbuf_puts(html, "\" />");
311 | }
312 | break;
313 |
314 | default:
315 | assert(false);
316 | break;
317 | }
318 |
319 | // cmark_strbuf_putc(html, 'x');
320 | return 1;
321 | }
322 |
323 | char *cmark_render_html(cmark_node *root, int options) {
324 | char *result;
325 | cmark_strbuf html = GH_BUF_INIT;
326 | cmark_event_type ev_type;
327 | cmark_node *cur;
328 | struct render_state state = {&html, NULL};
329 | cmark_iter *iter = cmark_iter_new(root);
330 |
331 | while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
332 | cur = cmark_iter_get_node(iter);
333 | S_render_node(cur, ev_type, &state, options);
334 | }
335 | result = (char *)cmark_strbuf_detach(&html);
336 |
337 | cmark_iter_free(iter);
338 | return result;
339 | }
340 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/inlines.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_INLINES_H
2 | #define CMARK_INLINES_H
3 |
4 | #import "references.h"
5 |
6 | #ifdef __cplusplus
7 | extern "C" {
8 | #endif
9 |
10 | cmark_chunk cmark_clean_url(cmark_chunk *url);
11 | cmark_chunk cmark_clean_title(cmark_chunk *title);
12 |
13 | void cmark_parse_inlines(cmark_node *parent, cmark_reference_map *refmap,
14 | int options);
15 |
16 | bufsize_t cmark_parse_reference_inline(cmark_strbuf *input,
17 | cmark_reference_map *refmap);
18 |
19 | #ifdef __cplusplus
20 | }
21 | #endif
22 |
23 | #endif
24 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/iterator.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | #include "config.h"
5 | #include "node.h"
6 | #include "cmark.h"
7 | #include "iterator.h"
8 |
9 | static const int S_leaf_mask =
10 | (1 << CMARK_NODE_HTML_BLOCK) | (1 << CMARK_NODE_THEMATIC_BREAK) |
11 | (1 << CMARK_NODE_CODE_BLOCK) | (1 << CMARK_NODE_TEXT) |
12 | (1 << CMARK_NODE_SOFTBREAK) | (1 << CMARK_NODE_LINEBREAK) |
13 | (1 << CMARK_NODE_CODE) | (1 << CMARK_NODE_HTML_INLINE);
14 |
15 | cmark_iter *cmark_iter_new(cmark_node *root) {
16 | if (root == NULL) {
17 | return NULL;
18 | }
19 | cmark_iter *iter = (cmark_iter *)malloc(sizeof(cmark_iter));
20 | if (iter == NULL) {
21 | return NULL;
22 | }
23 | iter->root = root;
24 | iter->cur.ev_type = CMARK_EVENT_NONE;
25 | iter->cur.node = NULL;
26 | iter->next.ev_type = CMARK_EVENT_ENTER;
27 | iter->next.node = root;
28 | return iter;
29 | }
30 |
31 | void cmark_iter_free(cmark_iter *iter) { free(iter); }
32 |
33 | static bool S_is_leaf(cmark_node *node) {
34 | return ((1 << node->type) & S_leaf_mask) != 0;
35 | }
36 |
37 | cmark_event_type cmark_iter_next(cmark_iter *iter) {
38 | cmark_event_type ev_type = iter->next.ev_type;
39 | cmark_node *node = iter->next.node;
40 |
41 | iter->cur.ev_type = ev_type;
42 | iter->cur.node = node;
43 |
44 | if (ev_type == CMARK_EVENT_DONE) {
45 | return ev_type;
46 | }
47 |
48 | /* roll forward to next item, setting both fields */
49 | if (ev_type == CMARK_EVENT_ENTER && !S_is_leaf(node)) {
50 | if (node->first_child == NULL) {
51 | /* stay on this node but exit */
52 | iter->next.ev_type = CMARK_EVENT_EXIT;
53 | } else {
54 | iter->next.ev_type = CMARK_EVENT_ENTER;
55 | iter->next.node = node->first_child;
56 | }
57 | } else if (node == iter->root) {
58 | /* don't move past root */
59 | iter->next.ev_type = CMARK_EVENT_DONE;
60 | iter->next.node = NULL;
61 | } else if (node->next) {
62 | iter->next.ev_type = CMARK_EVENT_ENTER;
63 | iter->next.node = node->next;
64 | } else if (node->parent) {
65 | iter->next.ev_type = CMARK_EVENT_EXIT;
66 | iter->next.node = node->parent;
67 | } else {
68 | assert(false);
69 | iter->next.ev_type = CMARK_EVENT_DONE;
70 | iter->next.node = NULL;
71 | }
72 |
73 | return ev_type;
74 | }
75 |
76 | void cmark_iter_reset(cmark_iter *iter, cmark_node *current,
77 | cmark_event_type event_type) {
78 | iter->next.ev_type = event_type;
79 | iter->next.node = current;
80 | cmark_iter_next(iter);
81 | }
82 |
83 | cmark_node *cmark_iter_get_node(cmark_iter *iter) { return iter->cur.node; }
84 |
85 | cmark_event_type cmark_iter_get_event_type(cmark_iter *iter) {
86 | return iter->cur.ev_type;
87 | }
88 |
89 | cmark_node *cmark_iter_get_root(cmark_iter *iter) { return iter->root; }
90 |
91 | void cmark_consolidate_text_nodes(cmark_node *root) {
92 | if (root == NULL) {
93 | return;
94 | }
95 | cmark_iter *iter = cmark_iter_new(root);
96 | cmark_strbuf buf = GH_BUF_INIT;
97 | cmark_event_type ev_type;
98 | cmark_node *cur, *tmp, *next;
99 |
100 | while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
101 | cur = cmark_iter_get_node(iter);
102 | if (ev_type == CMARK_EVENT_ENTER && cur->type == CMARK_NODE_TEXT &&
103 | cur->next && cur->next->type == CMARK_NODE_TEXT) {
104 | cmark_strbuf_clear(&buf);
105 | cmark_strbuf_put(&buf, cur->as.literal.data, cur->as.literal.len);
106 | tmp = cur->next;
107 | while (tmp && tmp->type == CMARK_NODE_TEXT) {
108 | cmark_iter_next(iter); // advance pointer
109 | cmark_strbuf_put(&buf, tmp->as.literal.data, tmp->as.literal.len);
110 | next = tmp->next;
111 | cmark_node_free(tmp);
112 | tmp = next;
113 | }
114 | cmark_chunk_free(&cur->as.literal);
115 | cur->as.literal = cmark_chunk_buf_detach(&buf);
116 | }
117 | }
118 |
119 | cmark_strbuf_free(&buf);
120 | cmark_iter_free(iter);
121 | }
122 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/iterator.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_ITERATOR_H
2 | #define CMARK_ITERATOR_H
3 |
4 | #ifdef __cplusplus
5 | extern "C" {
6 | #endif
7 |
8 | #include "cmark.h"
9 |
10 | typedef struct {
11 | cmark_event_type ev_type;
12 | cmark_node *node;
13 | } cmark_iter_state;
14 |
15 | struct cmark_iter {
16 | cmark_node *root;
17 | cmark_iter_state cur;
18 | cmark_iter_state next;
19 | };
20 |
21 | #ifdef __cplusplus
22 | }
23 | #endif
24 |
25 | #endif
26 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/latex.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 |
7 | #include "config.h"
8 | #include "cmark.h"
9 | #include "node.h"
10 | #include "buffer.h"
11 | #include "utf8.h"
12 | #include "scanners.h"
13 | #include "render.h"
14 |
15 | #define safe_strlen(s) cmark_strbuf_safe_strlen(s)
16 | #define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping)
17 | #define LIT(s) renderer->out(renderer, s, false, LITERAL)
18 | #define CR() renderer->cr(renderer)
19 | #define BLANKLINE() renderer->blankline(renderer)
20 | #define LIST_NUMBER_STRING_SIZE 20
21 |
22 | static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
23 | int32_t c, unsigned char nextc) {
24 | if (escape == LITERAL) {
25 | cmark_render_code_point(renderer, c);
26 | return;
27 | }
28 |
29 | switch (c) {
30 | case 123: // '{'
31 | case 125: // '}'
32 | case 35: // '#'
33 | case 37: // '%'
34 | case 38: // '&'
35 | cmark_render_ascii(renderer, "\\");
36 | cmark_render_code_point(renderer, c);
37 | break;
38 | case 36: // '$'
39 | case 95: // '_'
40 | if (escape == NORMAL) {
41 | cmark_render_ascii(renderer, "\\");
42 | }
43 | cmark_render_code_point(renderer, c);
44 | break;
45 | case 45: // '-'
46 | if (nextc == 45) { // prevent ligature
47 | cmark_render_ascii(renderer, "\\-");
48 | } else {
49 | cmark_render_ascii(renderer, "-");
50 | }
51 | break;
52 | case 126: // '~'
53 | if (escape == NORMAL) {
54 | cmark_render_ascii(renderer, "\\textasciitilde{}");
55 | } else {
56 | cmark_render_code_point(renderer, c);
57 | }
58 | break;
59 | case 94: // '^'
60 | cmark_render_ascii(renderer, "\\^{}");
61 | break;
62 | case 92: // '\\'
63 | if (escape == URL) {
64 | // / acts as path sep even on windows:
65 | cmark_render_ascii(renderer, "/");
66 | } else {
67 | cmark_render_ascii(renderer, "\\textbackslash{}");
68 | }
69 | break;
70 | case 124: // '|'
71 | cmark_render_ascii(renderer, "\\textbar{}");
72 | break;
73 | case 60: // '<'
74 | cmark_render_ascii(renderer, "\\textless{}");
75 | break;
76 | case 62: // '>'
77 | cmark_render_ascii(renderer, "\\textgreater{}");
78 | break;
79 | case 91: // '['
80 | case 93: // ']'
81 | cmark_render_ascii(renderer, "{");
82 | cmark_render_code_point(renderer, c);
83 | cmark_render_ascii(renderer, "}");
84 | break;
85 | case 34: // '"'
86 | cmark_render_ascii(renderer, "\\textquotedbl{}");
87 | // requires \usepackage[T1]{fontenc}
88 | break;
89 | case 39: // '\''
90 | cmark_render_ascii(renderer, "\\textquotesingle{}");
91 | // requires \usepackage{textcomp}
92 | break;
93 | case 160: // nbsp
94 | cmark_render_ascii(renderer, "~");
95 | break;
96 | case 8230: // hellip
97 | cmark_render_ascii(renderer, "\\ldots{}");
98 | break;
99 | case 8216: // lsquo
100 | if (escape == NORMAL) {
101 | cmark_render_ascii(renderer, "`");
102 | } else {
103 | cmark_render_code_point(renderer, c);
104 | }
105 | break;
106 | case 8217: // rsquo
107 | if (escape == NORMAL) {
108 | cmark_render_ascii(renderer, "\'");
109 | } else {
110 | cmark_render_code_point(renderer, c);
111 | }
112 | break;
113 | case 8220: // ldquo
114 | if (escape == NORMAL) {
115 | cmark_render_ascii(renderer, "``");
116 | } else {
117 | cmark_render_code_point(renderer, c);
118 | }
119 | break;
120 | case 8221: // rdquo
121 | if (escape == NORMAL) {
122 | cmark_render_ascii(renderer, "''");
123 | } else {
124 | cmark_render_code_point(renderer, c);
125 | }
126 | break;
127 | case 8212: // emdash
128 | if (escape == NORMAL) {
129 | cmark_render_ascii(renderer, "---");
130 | } else {
131 | cmark_render_code_point(renderer, c);
132 | }
133 | break;
134 | case 8211: // endash
135 | if (escape == NORMAL) {
136 | cmark_render_ascii(renderer, "--");
137 | } else {
138 | cmark_render_code_point(renderer, c);
139 | }
140 | break;
141 | default:
142 | cmark_render_code_point(renderer, c);
143 | }
144 | }
145 |
146 | typedef enum {
147 | NO_LINK,
148 | URL_AUTOLINK,
149 | EMAIL_AUTOLINK,
150 | NORMAL_LINK,
151 | INTERNAL_LINK
152 | } link_type;
153 |
154 | static link_type get_link_type(cmark_node *node) {
155 | size_t title_len, url_len;
156 | cmark_node *link_text;
157 | char *realurl;
158 | int realurllen;
159 | bool isemail = false;
160 |
161 | if (node->type != CMARK_NODE_LINK) {
162 | return NO_LINK;
163 | }
164 |
165 | const char *url = cmark_node_get_url(node);
166 | cmark_chunk url_chunk = cmark_chunk_literal(url);
167 |
168 | if (url && *url == '#') {
169 | return INTERNAL_LINK;
170 | }
171 |
172 | url_len = safe_strlen(url);
173 | if (url_len == 0 || scan_scheme(&url_chunk, 0) == 0) {
174 | return NO_LINK;
175 | }
176 |
177 | const char *title = cmark_node_get_title(node);
178 | title_len = safe_strlen(title);
179 | // if it has a title, we can't treat it as an autolink:
180 | if (title_len == 0) {
181 |
182 | link_text = node->first_child;
183 | cmark_consolidate_text_nodes(link_text);
184 | realurl = (char *)url;
185 | realurllen = url_len;
186 | if (strncmp(realurl, "mailto:", 7) == 0) {
187 | realurl += 7;
188 | realurllen -= 7;
189 | isemail = true;
190 | }
191 | if (realurllen == link_text->as.literal.len &&
192 | strncmp(realurl, (char *)link_text->as.literal.data,
193 | link_text->as.literal.len) == 0) {
194 | if (isemail) {
195 | return EMAIL_AUTOLINK;
196 | } else {
197 | return URL_AUTOLINK;
198 | }
199 | }
200 | }
201 |
202 | return NORMAL_LINK;
203 | }
204 |
205 | static int S_get_enumlevel(cmark_node *node) {
206 | int enumlevel = 0;
207 | cmark_node *tmp = node;
208 | while (tmp) {
209 | if (tmp->type == CMARK_NODE_LIST &&
210 | cmark_node_get_list_type(node) == CMARK_ORDERED_LIST) {
211 | enumlevel++;
212 | }
213 | tmp = tmp->parent;
214 | }
215 | return enumlevel;
216 | }
217 |
218 | static int S_render_node(cmark_renderer *renderer, cmark_node *node,
219 | cmark_event_type ev_type, int options) {
220 | int list_number;
221 | char list_number_string[LIST_NUMBER_STRING_SIZE];
222 | bool entering = (ev_type == CMARK_EVENT_ENTER);
223 | cmark_list_type list_type;
224 | const char *roman_numerals[] = {"", "i", "ii", "iii", "iv", "v",
225 | "vi", "vii", "viii", "ix", "x"};
226 |
227 | // avoid warning about unused parameter:
228 | (void)(options);
229 |
230 | switch (node->type) {
231 | case CMARK_NODE_DOCUMENT:
232 | break;
233 |
234 | case CMARK_NODE_BLOCK_QUOTE:
235 | if (entering) {
236 | LIT("\\begin{quote}");
237 | CR();
238 | } else {
239 | LIT("\\end{quote}");
240 | BLANKLINE();
241 | }
242 | break;
243 |
244 | case CMARK_NODE_LIST:
245 | list_type = cmark_node_get_list_type(node);
246 | if (entering) {
247 | LIT("\\begin{");
248 | LIT(list_type == CMARK_ORDERED_LIST ? "enumerate" : "itemize");
249 | LIT("}");
250 | CR();
251 | list_number = cmark_node_get_list_start(node);
252 | if (list_number > 1) {
253 | snprintf(list_number_string, LIST_NUMBER_STRING_SIZE, "%d",
254 | list_number);
255 | LIT("\\setcounter{enum");
256 | LIT((char *)roman_numerals[S_get_enumlevel(node)]);
257 | LIT("}{");
258 | OUT(list_number_string, false, NORMAL);
259 | LIT("}");
260 | CR();
261 | }
262 | } else {
263 | LIT("\\end{");
264 | LIT(list_type == CMARK_ORDERED_LIST ? "enumerate" : "itemize");
265 | LIT("}");
266 | BLANKLINE();
267 | }
268 | break;
269 |
270 | case CMARK_NODE_ITEM:
271 | if (entering) {
272 | LIT("\\item ");
273 | } else {
274 | CR();
275 | }
276 | break;
277 |
278 | case CMARK_NODE_HEADING:
279 | if (entering) {
280 | switch (cmark_node_get_heading_level(node)) {
281 | case 1:
282 | LIT("\\section");
283 | break;
284 | case 2:
285 | LIT("\\subsection");
286 | break;
287 | case 3:
288 | LIT("\\subsubsection");
289 | break;
290 | case 4:
291 | LIT("\\paragraph");
292 | break;
293 | case 5:
294 | LIT("\\subparagraph");
295 | break;
296 | }
297 | LIT("{");
298 | } else {
299 | LIT("}");
300 | BLANKLINE();
301 | }
302 | break;
303 |
304 | case CMARK_NODE_CODE_BLOCK:
305 | CR();
306 | LIT("\\begin{verbatim}");
307 | CR();
308 | OUT(cmark_node_get_literal(node), false, LITERAL);
309 | CR();
310 | LIT("\\end{verbatim}");
311 | BLANKLINE();
312 | break;
313 |
314 | case CMARK_NODE_HTML_BLOCK:
315 | break;
316 |
317 | case CMARK_NODE_CUSTOM_BLOCK:
318 | CR();
319 | OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node),
320 | false, LITERAL);
321 | CR();
322 | break;
323 |
324 | case CMARK_NODE_THEMATIC_BREAK:
325 | BLANKLINE();
326 | LIT("\\begin{center}\\rule{0.5\\linewidth}{\\linethickness}\\end{center}");
327 | BLANKLINE();
328 | break;
329 |
330 | case CMARK_NODE_PARAGRAPH:
331 | if (!entering) {
332 | BLANKLINE();
333 | }
334 | break;
335 |
336 | case CMARK_NODE_TEXT:
337 | OUT(cmark_node_get_literal(node), true, NORMAL);
338 | break;
339 |
340 | case CMARK_NODE_LINEBREAK:
341 | LIT("\\\\");
342 | CR();
343 | break;
344 |
345 | case CMARK_NODE_SOFTBREAK:
346 | if (renderer->width == 0) {
347 | CR();
348 | } else {
349 | OUT(" ", true, NORMAL);
350 | }
351 | break;
352 |
353 | case CMARK_NODE_CODE:
354 | LIT("\\texttt{");
355 | OUT(cmark_node_get_literal(node), false, NORMAL);
356 | LIT("}");
357 | break;
358 |
359 | case CMARK_NODE_HTML_INLINE:
360 | break;
361 |
362 | case CMARK_NODE_CUSTOM_INLINE:
363 | OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node),
364 | false, LITERAL);
365 | break;
366 |
367 | case CMARK_NODE_STRONG:
368 | if (entering) {
369 | LIT("\\textbf{");
370 | } else {
371 | LIT("}");
372 | }
373 | break;
374 |
375 | case CMARK_NODE_EMPH:
376 | if (entering) {
377 | LIT("\\emph{");
378 | } else {
379 | LIT("}");
380 | }
381 | break;
382 |
383 | case CMARK_NODE_LINK:
384 | if (entering) {
385 | const char *url = cmark_node_get_url(node);
386 | // requires \usepackage{hyperref}
387 | switch (get_link_type(node)) {
388 | case URL_AUTOLINK:
389 | LIT("\\url{");
390 | OUT(url, false, URL);
391 | break;
392 | case EMAIL_AUTOLINK:
393 | LIT("\\href{");
394 | OUT(url, false, URL);
395 | LIT("}\\nolinkurl{");
396 | break;
397 | case NORMAL_LINK:
398 | LIT("\\href{");
399 | OUT(url, false, URL);
400 | LIT("}{");
401 | break;
402 | case INTERNAL_LINK:
403 | LIT("\\protect\\hyperlink{");
404 | OUT(url + 1, false, URL);
405 | LIT("}{");
406 | break;
407 | case NO_LINK:
408 | LIT("{"); // error?
409 | }
410 | } else {
411 | LIT("}");
412 | }
413 |
414 | break;
415 |
416 | case CMARK_NODE_IMAGE:
417 | if (entering) {
418 | LIT("\\protect\\includegraphics{");
419 | // requires \include{graphicx}
420 | OUT(cmark_node_get_url(node), false, URL);
421 | LIT("}");
422 | return 0;
423 | }
424 | break;
425 |
426 | default:
427 | assert(false);
428 | break;
429 | }
430 |
431 | return 1;
432 | }
433 |
434 | char *cmark_render_latex(cmark_node *root, int options, int width) {
435 | return cmark_render(root, options, width, outc, S_render_node);
436 | }
437 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/man.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | #include "config.h"
7 | #include "cmark.h"
8 | #include "node.h"
9 | #include "buffer.h"
10 | #include "utf8.h"
11 | #include "render.h"
12 |
13 | #define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping)
14 | #define LIT(s) renderer->out(renderer, s, false, LITERAL)
15 | #define CR() renderer->cr(renderer)
16 | #define BLANKLINE() renderer->blankline(renderer)
17 | #define LIST_NUMBER_SIZE 20
18 |
19 | // Functions to convert cmark_nodes to groff man strings.
20 | static void S_outc(cmark_renderer *renderer, cmark_escaping escape, int32_t c,
21 | unsigned char nextc) {
22 | (void)(nextc);
23 |
24 | if (escape == LITERAL) {
25 | cmark_render_code_point(renderer, c);
26 | return;
27 | }
28 |
29 | switch (c) {
30 | case 46:
31 | if (renderer->begin_line) {
32 | cmark_render_ascii(renderer, "\\&.");
33 | } else {
34 | cmark_render_code_point(renderer, c);
35 | }
36 | break;
37 | case 39:
38 | if (renderer->begin_line) {
39 | cmark_render_ascii(renderer, "\\&'");
40 | } else {
41 | cmark_render_code_point(renderer, c);
42 | }
43 | break;
44 | case 45:
45 | cmark_render_ascii(renderer, "\\-");
46 | break;
47 | case 92:
48 | cmark_render_ascii(renderer, "\\e");
49 | break;
50 | case 8216: // left single quote
51 | cmark_render_ascii(renderer, "\\[oq]");
52 | break;
53 | case 8217: // right single quote
54 | cmark_render_ascii(renderer, "\\[cq]");
55 | break;
56 | case 8220: // left double quote
57 | cmark_render_ascii(renderer, "\\[lq]");
58 | break;
59 | case 8221: // right double quote
60 | cmark_render_ascii(renderer, "\\[rq]");
61 | break;
62 | case 8212: // em dash
63 | cmark_render_ascii(renderer, "\\[em]");
64 | break;
65 | case 8211: // en dash
66 | cmark_render_ascii(renderer, "\\[en]");
67 | break;
68 | default:
69 | cmark_render_code_point(renderer, c);
70 | }
71 | }
72 |
73 | static int S_render_node(cmark_renderer *renderer, cmark_node *node,
74 | cmark_event_type ev_type, int options) {
75 | cmark_node *tmp;
76 | int list_number;
77 | bool entering = (ev_type == CMARK_EVENT_ENTER);
78 |
79 | // avoid unused parameter error:
80 | (void)(options);
81 |
82 | switch (node->type) {
83 | case CMARK_NODE_DOCUMENT:
84 | break;
85 |
86 | case CMARK_NODE_BLOCK_QUOTE:
87 | if (entering) {
88 | CR();
89 | LIT(".RS");
90 | CR();
91 | } else {
92 | CR();
93 | LIT(".RE");
94 | CR();
95 | }
96 | break;
97 |
98 | case CMARK_NODE_LIST:
99 | break;
100 |
101 | case CMARK_NODE_ITEM:
102 | if (entering) {
103 | CR();
104 | LIT(".IP ");
105 | if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
106 | LIT("\\[bu] 2");
107 | } else {
108 | list_number = cmark_node_get_list_start(node->parent);
109 | tmp = node;
110 | while (tmp->prev) {
111 | tmp = tmp->prev;
112 | list_number += 1;
113 | }
114 | char list_number_s[LIST_NUMBER_SIZE];
115 | snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number);
116 | LIT(list_number_s);
117 | }
118 | CR();
119 | } else {
120 | CR();
121 | }
122 | break;
123 |
124 | case CMARK_NODE_HEADING:
125 | if (entering) {
126 | CR();
127 | LIT(cmark_node_get_heading_level(node) == 1 ? ".SH" : ".SS");
128 | CR();
129 | } else {
130 | CR();
131 | }
132 | break;
133 |
134 | case CMARK_NODE_CODE_BLOCK:
135 | CR();
136 | LIT(".IP\n.nf\n\\f[C]\n");
137 | OUT(cmark_node_get_literal(node), false, NORMAL);
138 | CR();
139 | LIT("\\f[]\n.fi");
140 | CR();
141 | break;
142 |
143 | case CMARK_NODE_HTML_BLOCK:
144 | break;
145 |
146 | case CMARK_NODE_CUSTOM_BLOCK:
147 | CR();
148 | OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node),
149 | false, LITERAL);
150 | CR();
151 | break;
152 |
153 | case CMARK_NODE_THEMATIC_BREAK:
154 | CR();
155 | LIT(".PP\n * * * * *");
156 | CR();
157 | break;
158 |
159 | case CMARK_NODE_PARAGRAPH:
160 | if (entering) {
161 | // no blank line if first paragraph in list:
162 | if (node->parent && node->parent->type == CMARK_NODE_ITEM &&
163 | node->prev == NULL) {
164 | // no blank line or .PP
165 | } else {
166 | CR();
167 | LIT(".PP");
168 | CR();
169 | }
170 | } else {
171 | CR();
172 | }
173 | break;
174 |
175 | case CMARK_NODE_TEXT:
176 | OUT(cmark_node_get_literal(node), true, NORMAL);
177 | break;
178 |
179 | case CMARK_NODE_LINEBREAK:
180 | LIT(".PD 0\n.P\n.PD");
181 | CR();
182 | break;
183 |
184 | case CMARK_NODE_SOFTBREAK:
185 | if (renderer->width == 0) {
186 | CR();
187 | } else {
188 | OUT(" ", true, LITERAL);
189 | }
190 | break;
191 |
192 | case CMARK_NODE_CODE:
193 | LIT("\\f[C]");
194 | OUT(cmark_node_get_literal(node), true, NORMAL);
195 | LIT("\\f[]");
196 | break;
197 |
198 | case CMARK_NODE_HTML_INLINE:
199 | break;
200 |
201 | case CMARK_NODE_CUSTOM_INLINE:
202 | OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node),
203 | false, LITERAL);
204 | break;
205 |
206 | case CMARK_NODE_STRONG:
207 | if (entering) {
208 | LIT("\\f[B]");
209 | } else {
210 | LIT("\\f[]");
211 | }
212 | break;
213 |
214 | case CMARK_NODE_EMPH:
215 | if (entering) {
216 | LIT("\\f[I]");
217 | } else {
218 | LIT("\\f[]");
219 | }
220 | break;
221 |
222 | case CMARK_NODE_LINK:
223 | if (!entering) {
224 | LIT(" (");
225 | OUT(cmark_node_get_url(node), true, URL);
226 | LIT(")");
227 | }
228 | break;
229 |
230 | case CMARK_NODE_IMAGE:
231 | if (entering) {
232 | LIT("[IMAGE: ");
233 | } else {
234 | LIT("]");
235 | }
236 | break;
237 |
238 | default:
239 | assert(false);
240 | break;
241 | }
242 |
243 | return 1;
244 | }
245 |
246 | char *cmark_render_man(cmark_node *root, int options, int width) {
247 | return cmark_render(root, options, width, S_outc, S_render_node);
248 | }
249 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/module.modulemap:
--------------------------------------------------------------------------------
1 | module libcmark [system][extern_c] {
2 | header "node.h"
3 | header "cmark.h"
4 | export *
5 | }
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/node.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_NODE_H
2 | #define CMARK_NODE_H
3 |
4 | #ifdef __cplusplus
5 | extern "C" {
6 | #endif
7 |
8 | #include
9 | #include
10 |
11 | #include "cmark.h"
12 | #include "buffer.h"
13 | #include "chunk.h"
14 |
15 | typedef struct {
16 | cmark_list_type list_type;
17 | int marker_offset;
18 | int padding;
19 | int start;
20 | cmark_delim_type delimiter;
21 | unsigned char bullet_char;
22 | bool tight;
23 | } cmark_list;
24 |
25 | typedef struct {
26 | cmark_chunk info;
27 | cmark_chunk literal;
28 | int fence_length;
29 | /* fence_offset must be 0-3, so we can use int8_t */
30 | int8_t fence_offset;
31 | unsigned char fence_char;
32 | bool fenced;
33 | } cmark_code;
34 |
35 | typedef struct {
36 | int level;
37 | bool setext;
38 | } cmark_heading;
39 |
40 | typedef struct {
41 | cmark_chunk url;
42 | cmark_chunk title;
43 | } cmark_link;
44 |
45 | typedef struct {
46 | cmark_chunk on_enter;
47 | cmark_chunk on_exit;
48 | } cmark_custom;
49 |
50 | struct cmark_node {
51 | struct cmark_node *next;
52 | struct cmark_node *prev;
53 | struct cmark_node *parent;
54 | struct cmark_node *first_child;
55 | struct cmark_node *last_child;
56 |
57 | void *user_data;
58 |
59 | int start_line;
60 | int start_column;
61 | int end_line;
62 | int end_column;
63 |
64 | cmark_node_type type;
65 |
66 | bool open;
67 | bool last_line_blank;
68 |
69 | cmark_strbuf string_content;
70 |
71 | union {
72 | cmark_chunk literal;
73 | cmark_list list;
74 | cmark_code code;
75 | cmark_heading heading;
76 | cmark_link link;
77 | cmark_custom custom;
78 | int html_block_type;
79 | } as;
80 | };
81 |
82 | CMARK_EXPORT int cmark_node_check(cmark_node *node, FILE *out);
83 |
84 | #ifdef __cplusplus
85 | }
86 | #endif
87 |
88 | #endif
89 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/parser.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_AST_H
2 | #define CMARK_AST_H
3 |
4 | #include
5 | #include "node.h"
6 | #include "buffer.h"
7 |
8 | #ifdef __cplusplus
9 | extern "C" {
10 | #endif
11 |
12 | #define MAX_LINK_LABEL_LENGTH 1000
13 |
14 | struct cmark_parser {
15 | struct cmark_reference_map *refmap;
16 | struct cmark_node *root;
17 | struct cmark_node *current;
18 | int line_number;
19 | bufsize_t offset;
20 | bufsize_t column;
21 | bufsize_t first_nonspace;
22 | bufsize_t first_nonspace_column;
23 | int indent;
24 | bool blank;
25 | bool partially_consumed_tab;
26 | cmark_strbuf *curline;
27 | bufsize_t last_line_length;
28 | cmark_strbuf *linebuf;
29 | int options;
30 | bool last_buffer_ended_with_cr;
31 | };
32 |
33 | #ifdef __cplusplus
34 | }
35 | #endif
36 |
37 | #endif
38 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/references.c:
--------------------------------------------------------------------------------
1 | #include "cmark.h"
2 | #include "utf8.h"
3 | #include "parser.h"
4 | #include "references.h"
5 | #include "inlines.h"
6 | #include "chunk.h"
7 |
8 | static unsigned int refhash(const unsigned char *link_ref) {
9 | unsigned int hash = 0;
10 |
11 | while (*link_ref)
12 | hash = (*link_ref++) + (hash << 6) + (hash << 16) - hash;
13 |
14 | return hash;
15 | }
16 |
17 | static void reference_free(cmark_reference *ref) {
18 | if (ref != NULL) {
19 | free(ref->label);
20 | cmark_chunk_free(&ref->url);
21 | cmark_chunk_free(&ref->title);
22 | free(ref);
23 | }
24 | }
25 |
26 | // normalize reference: collapse internal whitespace to single space,
27 | // remove leading/trailing whitespace, case fold
28 | // Return NULL if the reference name is actually empty (i.e. composed
29 | // solely from whitespace)
30 | static unsigned char *normalize_reference(cmark_chunk *ref) {
31 | cmark_strbuf normalized = GH_BUF_INIT;
32 | unsigned char *result;
33 |
34 | if (ref == NULL)
35 | return NULL;
36 |
37 | if (ref->len == 0)
38 | return NULL;
39 |
40 | cmark_utf8proc_case_fold(&normalized, ref->data, ref->len);
41 | cmark_strbuf_trim(&normalized);
42 | cmark_strbuf_normalize_whitespace(&normalized);
43 |
44 | result = cmark_strbuf_detach(&normalized);
45 | assert(result);
46 |
47 | if (result[0] == '\0') {
48 | free(result);
49 | return NULL;
50 | }
51 |
52 | return result;
53 | }
54 |
55 | static void add_reference(cmark_reference_map *map, cmark_reference *ref) {
56 | cmark_reference *t = ref->next = map->table[ref->hash % REFMAP_SIZE];
57 |
58 | while (t) {
59 | if (t->hash == ref->hash && !strcmp((char *)t->label, (char *)ref->label)) {
60 | reference_free(ref);
61 | return;
62 | }
63 |
64 | t = t->next;
65 | }
66 |
67 | map->table[ref->hash % REFMAP_SIZE] = ref;
68 | }
69 |
70 | void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label,
71 | cmark_chunk *url, cmark_chunk *title) {
72 | cmark_reference *ref;
73 | unsigned char *reflabel = normalize_reference(label);
74 |
75 | /* empty reference name, or composed from only whitespace */
76 | if (reflabel == NULL)
77 | return;
78 |
79 | ref = (cmark_reference *)calloc(1, sizeof(*ref));
80 | if (ref != NULL) {
81 | ref->label = reflabel;
82 | ref->hash = refhash(ref->label);
83 | ref->url = cmark_clean_url(url);
84 | ref->title = cmark_clean_title(title);
85 | ref->next = NULL;
86 |
87 | add_reference(map, ref);
88 | }
89 | }
90 |
91 | // Returns reference if refmap contains a reference with matching
92 | // label, otherwise NULL.
93 | cmark_reference *cmark_reference_lookup(cmark_reference_map *map,
94 | cmark_chunk *label) {
95 | cmark_reference *ref = NULL;
96 | unsigned char *norm;
97 | unsigned int hash;
98 |
99 | if (label->len > MAX_LINK_LABEL_LENGTH)
100 | return NULL;
101 |
102 | if (map == NULL)
103 | return NULL;
104 |
105 | norm = normalize_reference(label);
106 | if (norm == NULL)
107 | return NULL;
108 |
109 | hash = refhash(norm);
110 | ref = map->table[hash % REFMAP_SIZE];
111 |
112 | while (ref) {
113 | if (ref->hash == hash && !strcmp((char *)ref->label, (char *)norm))
114 | break;
115 | ref = ref->next;
116 | }
117 |
118 | free(norm);
119 | return ref;
120 | }
121 |
122 | void cmark_reference_map_free(cmark_reference_map *map) {
123 | unsigned int i;
124 |
125 | if (map == NULL)
126 | return;
127 |
128 | for (i = 0; i < REFMAP_SIZE; ++i) {
129 | cmark_reference *ref = map->table[i];
130 | cmark_reference *next;
131 |
132 | while (ref) {
133 | next = ref->next;
134 | reference_free(ref);
135 | ref = next;
136 | }
137 | }
138 |
139 | free(map);
140 | }
141 |
142 | cmark_reference_map *cmark_reference_map_new(void) {
143 | return (cmark_reference_map *)calloc(1, sizeof(cmark_reference_map));
144 | }
145 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/references.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_REFERENCES_H
2 | #define CMARK_REFERENCES_H
3 |
4 | #include "chunk.h"
5 |
6 | #ifdef __cplusplus
7 | extern "C" {
8 | #endif
9 |
10 | #define REFMAP_SIZE 16
11 |
12 | struct cmark_reference {
13 | struct cmark_reference *next;
14 | unsigned char *label;
15 | cmark_chunk url;
16 | cmark_chunk title;
17 | unsigned int hash;
18 | };
19 |
20 | typedef struct cmark_reference cmark_reference;
21 |
22 | struct cmark_reference_map {
23 | cmark_reference *table[REFMAP_SIZE];
24 | };
25 |
26 | typedef struct cmark_reference_map cmark_reference_map;
27 |
28 | cmark_reference_map *cmark_reference_map_new(void);
29 | void cmark_reference_map_free(cmark_reference_map *map);
30 | cmark_reference *cmark_reference_lookup(cmark_reference_map *map,
31 | cmark_chunk *label);
32 | extern void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label,
33 | cmark_chunk *url, cmark_chunk *title);
34 |
35 | #ifdef __cplusplus
36 | }
37 | #endif
38 |
39 | #endif
40 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/render.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include "buffer.h"
3 | #include "chunk.h"
4 | #include "cmark.h"
5 | #include "utf8.h"
6 | #include "render.h"
7 |
8 | static CMARK_INLINE void S_cr(cmark_renderer *renderer) {
9 | if (renderer->need_cr < 1) {
10 | renderer->need_cr = 1;
11 | }
12 | }
13 |
14 | static CMARK_INLINE void S_blankline(cmark_renderer *renderer) {
15 | if (renderer->need_cr < 2) {
16 | renderer->need_cr = 2;
17 | }
18 | }
19 |
20 | static void S_out(cmark_renderer *renderer, const char *source, bool wrap,
21 | cmark_escaping escape) {
22 | int length = cmark_strbuf_safe_strlen(source);
23 | unsigned char nextc;
24 | int32_t c;
25 | int i = 0;
26 | int last_nonspace;
27 | int len;
28 | cmark_chunk remainder = cmark_chunk_literal("");
29 | int k = renderer->buffer->size - 1;
30 |
31 | wrap = wrap && !renderer->no_wrap;
32 |
33 | if (renderer->in_tight_list_item && renderer->need_cr > 1) {
34 | renderer->need_cr = 1;
35 | }
36 | while (renderer->need_cr) {
37 | if (k < 0 || renderer->buffer->ptr[k] == '\n') {
38 | k -= 1;
39 | } else {
40 | cmark_strbuf_putc(renderer->buffer, '\n');
41 | if (renderer->need_cr > 1) {
42 | cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr,
43 | renderer->prefix->size);
44 | }
45 | }
46 | renderer->column = 0;
47 | renderer->begin_line = true;
48 | renderer->begin_content = true;
49 | renderer->need_cr -= 1;
50 | }
51 |
52 | while (i < length) {
53 | if (renderer->begin_line) {
54 | cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr,
55 | renderer->prefix->size);
56 | // note: this assumes prefix is ascii:
57 | renderer->column = renderer->prefix->size;
58 | }
59 |
60 | len = cmark_utf8proc_iterate((const uint8_t *)source + i, length - i, &c);
61 | if (len == -1) { // error condition
62 | return; // return without rendering rest of string
63 | }
64 | nextc = source[i + len];
65 | if (c == 32 && wrap) {
66 | if (!renderer->begin_line) {
67 | last_nonspace = renderer->buffer->size;
68 | cmark_strbuf_putc(renderer->buffer, ' ');
69 | renderer->column += 1;
70 | renderer->begin_line = false;
71 | renderer->begin_content = false;
72 | // skip following spaces
73 | while (source[i + 1] == ' ') {
74 | i++;
75 | }
76 | // We don't allow breaks that make a digit the first character
77 | // because this causes problems with commonmark output.
78 | if (!cmark_isdigit(source[i + 1])) {
79 | renderer->last_breakable = last_nonspace;
80 | }
81 | }
82 |
83 | } else if (c == 10) {
84 | cmark_strbuf_putc(renderer->buffer, '\n');
85 | renderer->column = 0;
86 | renderer->begin_line = true;
87 | renderer->begin_content = true;
88 | renderer->last_breakable = 0;
89 | } else if (escape == LITERAL) {
90 | cmark_render_code_point(renderer, c);
91 | renderer->begin_line = false;
92 | // we don't set 'begin_content' to false til we've
93 | // finished parsing a digit. Reason: in commonmark
94 | // we need to escape a potential list marker after
95 | // a digit:
96 | renderer->begin_content =
97 | renderer->begin_content && cmark_isdigit(c) == 1;
98 | } else {
99 | (renderer->outc)(renderer, escape, c, nextc);
100 | renderer->begin_line = false;
101 | renderer->begin_content =
102 | renderer->begin_content && cmark_isdigit(c) == 1;
103 | }
104 |
105 | // If adding the character went beyond width, look for an
106 | // earlier place where the line could be broken:
107 | if (renderer->width > 0 && renderer->column > renderer->width &&
108 | !renderer->begin_line && renderer->last_breakable > 0) {
109 |
110 | // copy from last_breakable to remainder
111 | cmark_chunk_set_cstr(&remainder, (char *)renderer->buffer->ptr +
112 | renderer->last_breakable + 1);
113 | // truncate at last_breakable
114 | cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable);
115 | // add newline, prefix, and remainder
116 | cmark_strbuf_putc(renderer->buffer, '\n');
117 | cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr,
118 | renderer->prefix->size);
119 | cmark_strbuf_put(renderer->buffer, remainder.data, remainder.len);
120 | renderer->column = renderer->prefix->size + remainder.len;
121 | cmark_chunk_free(&remainder);
122 | renderer->last_breakable = 0;
123 | renderer->begin_line = false;
124 | renderer->begin_content = false;
125 | }
126 |
127 | i += len;
128 | }
129 | }
130 |
131 | // Assumes no newlines, assumes ascii content:
132 | void cmark_render_ascii(cmark_renderer *renderer, const char *s) {
133 | int origsize = renderer->buffer->size;
134 | cmark_strbuf_puts(renderer->buffer, s);
135 | renderer->column += renderer->buffer->size - origsize;
136 | }
137 |
138 | void cmark_render_code_point(cmark_renderer *renderer, uint32_t c) {
139 | cmark_utf8proc_encode_char(c, renderer->buffer);
140 | renderer->column += 1;
141 | }
142 |
143 | char *cmark_render(cmark_node *root, int options, int width,
144 | void (*outc)(cmark_renderer *, cmark_escaping, int32_t,
145 | unsigned char),
146 | int (*render_node)(cmark_renderer *renderer,
147 | cmark_node *node,
148 | cmark_event_type ev_type, int options)) {
149 | cmark_strbuf pref = GH_BUF_INIT;
150 | cmark_strbuf buf = GH_BUF_INIT;
151 | cmark_node *cur;
152 | cmark_event_type ev_type;
153 | char *result;
154 | cmark_iter *iter = cmark_iter_new(root);
155 |
156 | cmark_renderer renderer = {&buf, &pref, 0, width, 0,
157 | 0, true, true, false, false,
158 | outc, S_cr, S_blankline, S_out};
159 |
160 | while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
161 | cur = cmark_iter_get_node(iter);
162 | if (!render_node(&renderer, cur, ev_type, options)) {
163 | // a false value causes us to skip processing
164 | // the node's contents. this is used for
165 | // autolinks.
166 | cmark_iter_reset(iter, cur, CMARK_EVENT_EXIT);
167 | }
168 | }
169 |
170 | // ensure final newline
171 | if (renderer.buffer->ptr[renderer.buffer->size - 1] != '\n') {
172 | cmark_strbuf_putc(renderer.buffer, '\n');
173 | }
174 |
175 | result = (char *)cmark_strbuf_detach(renderer.buffer);
176 |
177 | cmark_iter_free(iter);
178 | cmark_strbuf_free(renderer.prefix);
179 | cmark_strbuf_free(renderer.buffer);
180 |
181 | return result;
182 | }
183 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/render.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_RENDER_H
2 | #define CMARK_RENDER_H
3 |
4 | #ifdef __cplusplus
5 | extern "C" {
6 | #endif
7 |
8 | #include
9 | #include "buffer.h"
10 | #include "chunk.h"
11 |
12 | typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping;
13 |
14 | struct cmark_renderer {
15 | cmark_strbuf *buffer;
16 | cmark_strbuf *prefix;
17 | int column;
18 | int width;
19 | int need_cr;
20 | bufsize_t last_breakable;
21 | bool begin_line;
22 | bool begin_content;
23 | bool no_wrap;
24 | bool in_tight_list_item;
25 | void (*outc)(struct cmark_renderer *, cmark_escaping, int32_t, unsigned char);
26 | void (*cr)(struct cmark_renderer *);
27 | void (*blankline)(struct cmark_renderer *);
28 | void (*out)(struct cmark_renderer *, const char *, bool, cmark_escaping);
29 | };
30 |
31 | typedef struct cmark_renderer cmark_renderer;
32 |
33 | void cmark_render_ascii(cmark_renderer *renderer, const char *s);
34 |
35 | void cmark_render_code_point(cmark_renderer *renderer, uint32_t c);
36 |
37 | char *cmark_render(cmark_node *root, int options, int width,
38 | void (*outc)(cmark_renderer *, cmark_escaping, int32_t,
39 | unsigned char),
40 | int (*render_node)(cmark_renderer *renderer,
41 | cmark_node *node,
42 | cmark_event_type ev_type, int options));
43 |
44 | #ifdef __cplusplus
45 | }
46 | #endif
47 |
48 | #endif
49 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/scanners.h:
--------------------------------------------------------------------------------
1 | #include "cmark.h"
2 | #include "chunk.h"
3 |
4 | #ifdef __cplusplus
5 | extern "C" {
6 | #endif
7 |
8 | bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c,
9 | bufsize_t offset);
10 | bufsize_t _scan_scheme(const unsigned char *p);
11 | bufsize_t _scan_autolink_uri(const unsigned char *p);
12 | bufsize_t _scan_autolink_email(const unsigned char *p);
13 | bufsize_t _scan_html_tag(const unsigned char *p);
14 | bufsize_t _scan_html_block_start(const unsigned char *p);
15 | bufsize_t _scan_html_block_start_7(const unsigned char *p);
16 | bufsize_t _scan_html_block_end_1(const unsigned char *p);
17 | bufsize_t _scan_html_block_end_2(const unsigned char *p);
18 | bufsize_t _scan_html_block_end_3(const unsigned char *p);
19 | bufsize_t _scan_html_block_end_4(const unsigned char *p);
20 | bufsize_t _scan_html_block_end_5(const unsigned char *p);
21 | bufsize_t _scan_link_url(const unsigned char *p);
22 | bufsize_t _scan_link_title(const unsigned char *p);
23 | bufsize_t _scan_spacechars(const unsigned char *p);
24 | bufsize_t _scan_atx_heading_start(const unsigned char *p);
25 | bufsize_t _scan_setext_heading_line(const unsigned char *p);
26 | bufsize_t _scan_thematic_break(const unsigned char *p);
27 | bufsize_t _scan_open_code_fence(const unsigned char *p);
28 | bufsize_t _scan_close_code_fence(const unsigned char *p);
29 | bufsize_t _scan_entity(const unsigned char *p);
30 | bufsize_t _scan_dangerous_url(const unsigned char *p);
31 |
32 | #define scan_scheme(c, n) _scan_at(&_scan_scheme, c, n)
33 | #define scan_autolink_uri(c, n) _scan_at(&_scan_autolink_uri, c, n)
34 | #define scan_autolink_email(c, n) _scan_at(&_scan_autolink_email, c, n)
35 | #define scan_html_tag(c, n) _scan_at(&_scan_html_tag, c, n)
36 | #define scan_html_block_start(c, n) _scan_at(&_scan_html_block_start, c, n)
37 | #define scan_html_block_start_7(c, n) _scan_at(&_scan_html_block_start_7, c, n)
38 | #define scan_html_block_end_1(c, n) _scan_at(&_scan_html_block_end_1, c, n)
39 | #define scan_html_block_end_2(c, n) _scan_at(&_scan_html_block_end_2, c, n)
40 | #define scan_html_block_end_3(c, n) _scan_at(&_scan_html_block_end_3, c, n)
41 | #define scan_html_block_end_4(c, n) _scan_at(&_scan_html_block_end_4, c, n)
42 | #define scan_html_block_end_5(c, n) _scan_at(&_scan_html_block_end_5, c, n)
43 | #define scan_link_url(c, n) _scan_at(&_scan_link_url, c, n)
44 | #define scan_link_title(c, n) _scan_at(&_scan_link_title, c, n)
45 | #define scan_spacechars(c, n) _scan_at(&_scan_spacechars, c, n)
46 | #define scan_atx_heading_start(c, n) _scan_at(&_scan_atx_heading_start, c, n)
47 | #define scan_setext_heading_line(c, n) \
48 | _scan_at(&_scan_setext_heading_line, c, n)
49 | #define scan_thematic_break(c, n) _scan_at(&_scan_thematic_break, c, n)
50 | #define scan_open_code_fence(c, n) _scan_at(&_scan_open_code_fence, c, n)
51 | #define scan_close_code_fence(c, n) _scan_at(&_scan_close_code_fence, c, n)
52 | #define scan_entity(c, n) _scan_at(&_scan_entity, c, n)
53 | #define scan_dangerous_url(c, n) _scan_at(&_scan_dangerous_url, c, n)
54 |
55 | #ifdef __cplusplus
56 | }
57 | #endif
58 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/utf8.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | #include "cmark_ctype.h"
6 | #include "utf8.h"
7 |
8 | static const int8_t utf8proc_utf8class[256] = {
9 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
10 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
11 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
12 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
13 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
14 | 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
18 | 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
19 | 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0};
20 |
21 | static void encode_unknown(cmark_strbuf *buf) {
22 | static const uint8_t repl[] = {239, 191, 189};
23 | cmark_strbuf_put(buf, repl, 3);
24 | }
25 |
26 | static int utf8proc_charlen(const uint8_t *str, bufsize_t str_len) {
27 | int length, i;
28 |
29 | if (!str_len)
30 | return 0;
31 |
32 | length = utf8proc_utf8class[str[0]];
33 |
34 | if (!length)
35 | return -1;
36 |
37 | if (str_len >= 0 && (bufsize_t)length > str_len)
38 | return -str_len;
39 |
40 | for (i = 1; i < length; i++) {
41 | if ((str[i] & 0xC0) != 0x80)
42 | return -i;
43 | }
44 |
45 | return length;
46 | }
47 |
48 | // Validate a single UTF-8 character according to RFC 3629.
49 | static int utf8proc_valid(const uint8_t *str, bufsize_t str_len) {
50 | int length = utf8proc_utf8class[str[0]];
51 |
52 | if (!length)
53 | return -1;
54 |
55 | if ((bufsize_t)length > str_len)
56 | return -str_len;
57 |
58 | switch (length) {
59 | case 2:
60 | if ((str[1] & 0xC0) != 0x80)
61 | return -1;
62 | if (str[0] < 0xC2) {
63 | // Overlong
64 | return -length;
65 | }
66 | break;
67 |
68 | case 3:
69 | if ((str[1] & 0xC0) != 0x80)
70 | return -1;
71 | if ((str[2] & 0xC0) != 0x80)
72 | return -2;
73 | if (str[0] == 0xE0) {
74 | if (str[1] < 0xA0) {
75 | // Overlong
76 | return -length;
77 | }
78 | } else if (str[0] == 0xED) {
79 | if (str[1] >= 0xA0) {
80 | // Surrogate
81 | return -length;
82 | }
83 | }
84 | break;
85 |
86 | case 4:
87 | if ((str[1] & 0xC0) != 0x80)
88 | return -1;
89 | if ((str[2] & 0xC0) != 0x80)
90 | return -2;
91 | if ((str[3] & 0xC0) != 0x80)
92 | return -3;
93 | if (str[0] == 0xF0) {
94 | if (str[1] < 0x90) {
95 | // Overlong
96 | return -length;
97 | }
98 | } else if (str[0] >= 0xF4) {
99 | if (str[0] > 0xF4 || str[1] >= 0x90) {
100 | // Above 0x10FFFF
101 | return -length;
102 | }
103 | }
104 | break;
105 | }
106 |
107 | return length;
108 | }
109 |
110 | void cmark_utf8proc_check(cmark_strbuf *ob, const uint8_t *line,
111 | bufsize_t size) {
112 | bufsize_t i = 0;
113 |
114 | while (i < size) {
115 | bufsize_t org = i;
116 | int charlen = 0;
117 |
118 | while (i < size) {
119 | if (line[i] < 0x80 && line[i] != 0) {
120 | i++;
121 | } else if (line[i] >= 0x80) {
122 | charlen = utf8proc_valid(line + i, size - i);
123 | if (charlen < 0) {
124 | charlen = -charlen;
125 | break;
126 | }
127 | i += charlen;
128 | } else if (line[i] == 0) {
129 | // ASCII NUL is technically valid but rejected
130 | // for security reasons.
131 | charlen = 1;
132 | break;
133 | }
134 | }
135 |
136 | if (i > org) {
137 | cmark_strbuf_put(ob, line + org, i - org);
138 | }
139 |
140 | if (i >= size) {
141 | break;
142 | } else {
143 | // Invalid UTF-8
144 | encode_unknown(ob);
145 | i += charlen;
146 | }
147 | }
148 | }
149 |
150 | int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len,
151 | int32_t *dst) {
152 | int length;
153 | int32_t uc = -1;
154 |
155 | *dst = -1;
156 | length = utf8proc_charlen(str, str_len);
157 | if (length < 0)
158 | return -1;
159 |
160 | switch (length) {
161 | case 1:
162 | uc = str[0];
163 | break;
164 | case 2:
165 | uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F);
166 | if (uc < 0x80)
167 | uc = -1;
168 | break;
169 | case 3:
170 | uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6) + (str[2] & 0x3F);
171 | if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000))
172 | uc = -1;
173 | break;
174 | case 4:
175 | uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) +
176 | ((str[2] & 0x3F) << 6) + (str[3] & 0x3F);
177 | if (uc < 0x10000 || uc >= 0x110000)
178 | uc = -1;
179 | break;
180 | }
181 |
182 | if (uc < 0)
183 | return -1;
184 |
185 | *dst = uc;
186 | return length;
187 | }
188 |
189 | void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf) {
190 | uint8_t dst[4];
191 | bufsize_t len = 0;
192 |
193 | assert(uc >= 0);
194 |
195 | if (uc < 0x80) {
196 | dst[0] = (uint8_t)(uc);
197 | len = 1;
198 | } else if (uc < 0x800) {
199 | dst[0] = (uint8_t)(0xC0 + (uc >> 6));
200 | dst[1] = 0x80 + (uc & 0x3F);
201 | len = 2;
202 | } else if (uc == 0xFFFF) {
203 | dst[0] = 0xFF;
204 | len = 1;
205 | } else if (uc == 0xFFFE) {
206 | dst[0] = 0xFE;
207 | len = 1;
208 | } else if (uc < 0x10000) {
209 | dst[0] = (uint8_t)(0xE0 + (uc >> 12));
210 | dst[1] = 0x80 + ((uc >> 6) & 0x3F);
211 | dst[2] = 0x80 + (uc & 0x3F);
212 | len = 3;
213 | } else if (uc < 0x110000) {
214 | dst[0] = (uint8_t)(0xF0 + (uc >> 18));
215 | dst[1] = 0x80 + ((uc >> 12) & 0x3F);
216 | dst[2] = 0x80 + ((uc >> 6) & 0x3F);
217 | dst[3] = 0x80 + (uc & 0x3F);
218 | len = 4;
219 | } else {
220 | encode_unknown(buf);
221 | return;
222 | }
223 |
224 | cmark_strbuf_put(buf, dst, len);
225 | }
226 |
227 | void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str,
228 | bufsize_t len) {
229 | int32_t c;
230 |
231 | #define bufpush(x) cmark_utf8proc_encode_char(x, dest)
232 |
233 | while (len > 0) {
234 | bufsize_t char_len = cmark_utf8proc_iterate(str, len, &c);
235 |
236 | if (char_len >= 0) {
237 | #include "case_fold_switch.inc"
238 | } else {
239 | encode_unknown(dest);
240 | char_len = -char_len;
241 | }
242 |
243 | str += char_len;
244 | len -= char_len;
245 | }
246 | }
247 |
248 | // matches anything in the Zs class, plus LF, CR, TAB, FF.
249 | int cmark_utf8proc_is_space(int32_t uc) {
250 | return (uc == 9 || uc == 10 || uc == 12 || uc == 13 || uc == 32 ||
251 | uc == 160 || uc == 5760 || (uc >= 8192 && uc <= 8202) || uc == 8239 ||
252 | uc == 8287 || uc == 12288);
253 | }
254 |
255 | // matches anything in the P[cdefios] classes.
256 | int cmark_utf8proc_is_punctuation(int32_t uc) {
257 | return (
258 | (uc < 128 && cmark_ispunct((char)uc)) || uc == 161 || uc == 167 ||
259 | uc == 171 || uc == 182 || uc == 183 || uc == 187 || uc == 191 ||
260 | uc == 894 || uc == 903 || (uc >= 1370 && uc <= 1375) || uc == 1417 ||
261 | uc == 1418 || uc == 1470 || uc == 1472 || uc == 1475 || uc == 1478 ||
262 | uc == 1523 || uc == 1524 || uc == 1545 || uc == 1546 || uc == 1548 ||
263 | uc == 1549 || uc == 1563 || uc == 1566 || uc == 1567 ||
264 | (uc >= 1642 && uc <= 1645) || uc == 1748 || (uc >= 1792 && uc <= 1805) ||
265 | (uc >= 2039 && uc <= 2041) || (uc >= 2096 && uc <= 2110) || uc == 2142 ||
266 | uc == 2404 || uc == 2405 || uc == 2416 || uc == 2800 || uc == 3572 ||
267 | uc == 3663 || uc == 3674 || uc == 3675 || (uc >= 3844 && uc <= 3858) ||
268 | uc == 3860 || (uc >= 3898 && uc <= 3901) || uc == 3973 ||
269 | (uc >= 4048 && uc <= 4052) || uc == 4057 || uc == 4058 ||
270 | (uc >= 4170 && uc <= 4175) || uc == 4347 || (uc >= 4960 && uc <= 4968) ||
271 | uc == 5120 || uc == 5741 || uc == 5742 || uc == 5787 || uc == 5788 ||
272 | (uc >= 5867 && uc <= 5869) || uc == 5941 || uc == 5942 ||
273 | (uc >= 6100 && uc <= 6102) || (uc >= 6104 && uc <= 6106) ||
274 | (uc >= 6144 && uc <= 6154) || uc == 6468 || uc == 6469 || uc == 6686 ||
275 | uc == 6687 || (uc >= 6816 && uc <= 6822) || (uc >= 6824 && uc <= 6829) ||
276 | (uc >= 7002 && uc <= 7008) || (uc >= 7164 && uc <= 7167) ||
277 | (uc >= 7227 && uc <= 7231) || uc == 7294 || uc == 7295 ||
278 | (uc >= 7360 && uc <= 7367) || uc == 7379 || (uc >= 8208 && uc <= 8231) ||
279 | (uc >= 8240 && uc <= 8259) || (uc >= 8261 && uc <= 8273) ||
280 | (uc >= 8275 && uc <= 8286) || uc == 8317 || uc == 8318 || uc == 8333 ||
281 | uc == 8334 || (uc >= 8968 && uc <= 8971) || uc == 9001 || uc == 9002 ||
282 | (uc >= 10088 && uc <= 10101) || uc == 10181 || uc == 10182 ||
283 | (uc >= 10214 && uc <= 10223) || (uc >= 10627 && uc <= 10648) ||
284 | (uc >= 10712 && uc <= 10715) || uc == 10748 || uc == 10749 ||
285 | (uc >= 11513 && uc <= 11516) || uc == 11518 || uc == 11519 ||
286 | uc == 11632 || (uc >= 11776 && uc <= 11822) ||
287 | (uc >= 11824 && uc <= 11842) || (uc >= 12289 && uc <= 12291) ||
288 | (uc >= 12296 && uc <= 12305) || (uc >= 12308 && uc <= 12319) ||
289 | uc == 12336 || uc == 12349 || uc == 12448 || uc == 12539 || uc == 42238 ||
290 | uc == 42239 || (uc >= 42509 && uc <= 42511) || uc == 42611 ||
291 | uc == 42622 || (uc >= 42738 && uc <= 42743) ||
292 | (uc >= 43124 && uc <= 43127) || uc == 43214 || uc == 43215 ||
293 | (uc >= 43256 && uc <= 43258) || uc == 43310 || uc == 43311 ||
294 | uc == 43359 || (uc >= 43457 && uc <= 43469) || uc == 43486 ||
295 | uc == 43487 || (uc >= 43612 && uc <= 43615) || uc == 43742 ||
296 | uc == 43743 || uc == 43760 || uc == 43761 || uc == 44011 || uc == 64830 ||
297 | uc == 64831 || (uc >= 65040 && uc <= 65049) ||
298 | (uc >= 65072 && uc <= 65106) || (uc >= 65108 && uc <= 65121) ||
299 | uc == 65123 || uc == 65128 || uc == 65130 || uc == 65131 ||
300 | (uc >= 65281 && uc <= 65283) || (uc >= 65285 && uc <= 65290) ||
301 | (uc >= 65292 && uc <= 65295) || uc == 65306 || uc == 65307 ||
302 | uc == 65311 || uc == 65312 || (uc >= 65339 && uc <= 65341) ||
303 | uc == 65343 || uc == 65371 || uc == 65373 ||
304 | (uc >= 65375 && uc <= 65381) || (uc >= 65792 && uc <= 65794) ||
305 | uc == 66463 || uc == 66512 || uc == 66927 || uc == 67671 || uc == 67871 ||
306 | uc == 67903 || (uc >= 68176 && uc <= 68184) || uc == 68223 ||
307 | (uc >= 68336 && uc <= 68342) || (uc >= 68409 && uc <= 68415) ||
308 | (uc >= 68505 && uc <= 68508) || (uc >= 69703 && uc <= 69709) ||
309 | uc == 69819 || uc == 69820 || (uc >= 69822 && uc <= 69825) ||
310 | (uc >= 69952 && uc <= 69955) || uc == 70004 || uc == 70005 ||
311 | (uc >= 70085 && uc <= 70088) || uc == 70093 ||
312 | (uc >= 70200 && uc <= 70205) || uc == 70854 ||
313 | (uc >= 71105 && uc <= 71113) || (uc >= 71233 && uc <= 71235) ||
314 | (uc >= 74864 && uc <= 74868) || uc == 92782 || uc == 92783 ||
315 | uc == 92917 || (uc >= 92983 && uc <= 92987) || uc == 92996 ||
316 | uc == 113823);
317 | }
318 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/utf8.h:
--------------------------------------------------------------------------------
1 | #ifndef CMARK_UTF8_H
2 | #define CMARK_UTF8_H
3 |
4 | #include
5 | #include "buffer.h"
6 |
7 | #ifdef __cplusplus
8 | extern "C" {
9 | #endif
10 |
11 | void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str,
12 | bufsize_t len);
13 | void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf);
14 | int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len, int32_t *dst);
15 | void cmark_utf8proc_check(cmark_strbuf *dest, const uint8_t *line,
16 | bufsize_t size);
17 | int cmark_utf8proc_is_space(int32_t uc);
18 | int cmark_utf8proc_is_punctuation(int32_t uc);
19 |
20 | #ifdef __cplusplus
21 | }
22 | #endif
23 |
24 | #endif
25 |
--------------------------------------------------------------------------------
/Pods/Down/Source/cmark/xml.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | #include "config.h"
7 | #include "cmark.h"
8 | #include "node.h"
9 | #include "buffer.h"
10 | #include "houdini.h"
11 |
12 | #define BUFFER_SIZE 100
13 |
14 | // Functions to convert cmark_nodes to XML strings.
15 |
16 | static void escape_xml(cmark_strbuf *dest, const unsigned char *source,
17 | bufsize_t length) {
18 | houdini_escape_html0(dest, source, length, 0);
19 | }
20 |
21 | struct render_state {
22 | cmark_strbuf *xml;
23 | int indent;
24 | };
25 |
26 | static CMARK_INLINE void indent(struct render_state *state) {
27 | int i;
28 | for (i = 0; i < state->indent; i++) {
29 | cmark_strbuf_putc(state->xml, ' ');
30 | }
31 | }
32 |
33 | static int S_render_node(cmark_node *node, cmark_event_type ev_type,
34 | struct render_state *state, int options) {
35 | cmark_strbuf *xml = state->xml;
36 | bool literal = false;
37 | cmark_delim_type delim;
38 | bool entering = (ev_type == CMARK_EVENT_ENTER);
39 | char buffer[BUFFER_SIZE];
40 |
41 | if (entering) {
42 | indent(state);
43 | cmark_strbuf_putc(xml, '<');
44 | cmark_strbuf_puts(xml, cmark_node_get_type_string(node));
45 |
46 | if (options & CMARK_OPT_SOURCEPOS && node->start_line != 0) {
47 | snprintf(buffer, BUFFER_SIZE, " sourcepos=\"%d:%d-%d:%d\"",
48 | node->start_line, node->start_column, node->end_line,
49 | node->end_column);
50 | cmark_strbuf_puts(xml, buffer);
51 | }
52 |
53 | literal = false;
54 |
55 | switch (node->type) {
56 | case CMARK_NODE_DOCUMENT:
57 | cmark_strbuf_puts(xml, " xmlns=\"http://commonmark.org/xml/1.0\"");
58 | break;
59 | case CMARK_NODE_TEXT:
60 | case CMARK_NODE_CODE:
61 | case CMARK_NODE_HTML_BLOCK:
62 | case CMARK_NODE_HTML_INLINE:
63 | cmark_strbuf_puts(xml, ">");
64 | escape_xml(xml, node->as.literal.data, node->as.literal.len);
65 | cmark_strbuf_puts(xml, "");
66 | cmark_strbuf_puts(xml, cmark_node_get_type_string(node));
67 | literal = true;
68 | break;
69 | case CMARK_NODE_LIST:
70 | switch (cmark_node_get_list_type(node)) {
71 | case CMARK_ORDERED_LIST:
72 | cmark_strbuf_puts(xml, " type=\"ordered\"");
73 | snprintf(buffer, BUFFER_SIZE, " start=\"%d\"",
74 | cmark_node_get_list_start(node));
75 | cmark_strbuf_puts(xml, buffer);
76 | delim = cmark_node_get_list_delim(node);
77 | if (delim == CMARK_PAREN_DELIM) {
78 | cmark_strbuf_puts(xml, " delim=\"paren\"");
79 | } else if (delim == CMARK_PERIOD_DELIM) {
80 | cmark_strbuf_puts(xml, " delim=\"period\"");
81 | }
82 | break;
83 | case CMARK_BULLET_LIST:
84 | cmark_strbuf_puts(xml, " type=\"bullet\"");
85 | break;
86 | default:
87 | break;
88 | }
89 | snprintf(buffer, BUFFER_SIZE, " tight=\"%s\"",
90 | (cmark_node_get_list_tight(node) ? "true" : "false"));
91 | cmark_strbuf_puts(xml, buffer);
92 | break;
93 | case CMARK_NODE_HEADING:
94 | snprintf(buffer, BUFFER_SIZE, " level=\"%d\"", node->as.heading.level);
95 | cmark_strbuf_puts(xml, buffer);
96 | break;
97 | case CMARK_NODE_CODE_BLOCK:
98 | if (node->as.code.info.len > 0) {
99 | cmark_strbuf_puts(xml, " info=\"");
100 | escape_xml(xml, node->as.code.info.data, node->as.code.info.len);
101 | cmark_strbuf_putc(xml, '"');
102 | }
103 | cmark_strbuf_puts(xml, ">");
104 | escape_xml(xml, node->as.code.literal.data, node->as.code.literal.len);
105 | cmark_strbuf_puts(xml, "");
106 | cmark_strbuf_puts(xml, cmark_node_get_type_string(node));
107 | literal = true;
108 | break;
109 | case CMARK_NODE_CUSTOM_BLOCK:
110 | case CMARK_NODE_CUSTOM_INLINE:
111 | cmark_strbuf_puts(xml, " on_enter=\"");
112 | escape_xml(xml, node->as.custom.on_enter.data,
113 | node->as.custom.on_enter.len);
114 | cmark_strbuf_putc(xml, '"');
115 | cmark_strbuf_puts(xml, " on_exit=\"");
116 | escape_xml(xml, node->as.custom.on_exit.data,
117 | node->as.custom.on_exit.len);
118 | cmark_strbuf_putc(xml, '"');
119 | break;
120 | case CMARK_NODE_LINK:
121 | case CMARK_NODE_IMAGE:
122 | cmark_strbuf_puts(xml, " destination=\"");
123 | escape_xml(xml, node->as.link.url.data, node->as.link.url.len);
124 | cmark_strbuf_putc(xml, '"');
125 | cmark_strbuf_puts(xml, " title=\"");
126 | escape_xml(xml, node->as.link.title.data, node->as.link.title.len);
127 | cmark_strbuf_putc(xml, '"');
128 | break;
129 | default:
130 | break;
131 | }
132 | if (node->first_child) {
133 | state->indent += 2;
134 | } else if (!literal) {
135 | cmark_strbuf_puts(xml, " /");
136 | }
137 | cmark_strbuf_puts(xml, ">\n");
138 |
139 | } else if (node->first_child) {
140 | state->indent -= 2;
141 | indent(state);
142 | cmark_strbuf_puts(xml, "");
143 | cmark_strbuf_puts(xml, cmark_node_get_type_string(node));
144 | cmark_strbuf_puts(xml, ">\n");
145 | }
146 |
147 | return 1;
148 | }
149 |
150 | char *cmark_render_xml(cmark_node *root, int options) {
151 | char *result;
152 | cmark_strbuf xml = GH_BUF_INIT;
153 | cmark_event_type ev_type;
154 | cmark_node *cur;
155 | struct render_state state = {&xml, 0};
156 |
157 | cmark_iter *iter = cmark_iter_new(root);
158 |
159 | cmark_strbuf_puts(state.xml, "\n");
160 | cmark_strbuf_puts(state.xml,
161 | "\n");
162 | while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
163 | cur = cmark_iter_get_node(iter);
164 | S_render_node(cur, ev_type, &state, options);
165 | }
166 | result = (char *)cmark_strbuf_detach(&xml);
167 |
168 | cmark_iter_free(iter);
169 | return result;
170 | }
171 |
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Down (0.3.4)
3 |
4 | DEPENDENCIES:
5 | - Down
6 |
7 | SPEC CHECKSUMS:
8 | Down: 3f35b61e51a603df3e9e7e0289b15752e72f82e6
9 |
10 | PODFILE CHECKSUM: 390b72be4a2772d690fda4f93f87102e224636f9
11 |
12 | COCOAPODS: 1.3.1
13 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/Luka.xcuserdatad/xcschemes/Down.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/Luka.xcuserdatad/xcschemes/Pods-markr.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
35 |
36 |
47 |
48 |
54 |
55 |
56 |
57 |
58 |
59 |
65 |
66 |
68 |
69 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/Luka.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Down.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 0
13 |
14 | Pods-Markr.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 1
20 |
21 |
22 | SuppressBuildableAutocreation
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Down/Down-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Down : NSObject
3 | @end
4 | @implementation PodsDummy_Down
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Down/Down-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Down/Down-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 | #import "Down.h"
14 |
15 | FOUNDATION_EXPORT double DownVersionNumber;
16 | FOUNDATION_EXPORT const unsigned char DownVersionString[];
17 |
18 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Down/Down.modulemap:
--------------------------------------------------------------------------------
1 | framework module Down {
2 | umbrella header "Down-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Down/Down.xcconfig:
--------------------------------------------------------------------------------
1 | CODE_SIGN_IDENTITY =
2 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Down
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
6 | PODS_BUILD_DIR = $BUILD_DIR
7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_ROOT = ${SRCROOT}
9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Down
10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
11 | SKIP_INSTALL = YES
12 | SWIFT_INCLUDE_PATHS = $(SRCROOT)/Down/Source/cmark/**
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Down/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 0.3.4
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Markr/Pods-Markr.debug.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | CODE_SIGN_IDENTITY =
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Down"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks'
6 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Down/Down.framework/Headers"
7 | OTHER_LDFLAGS = $(inherited) -framework "Down"
8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
9 | PODS_BUILD_DIR = $BUILD_DIR
10 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
12 | PODS_ROOT = ${SRCROOT}/Pods
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-Markr/Pods-Markr.release.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | CODE_SIGN_IDENTITY =
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Down"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks'
6 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Down/Down.framework/Headers"
7 | OTHER_LDFLAGS = $(inherited) -framework "Down"
8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
9 | PODS_BUILD_DIR = $BUILD_DIR
10 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
12 | PODS_ROOT = ${SRCROOT}/Pods
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 |
4 | ## Down
5 |
6 | The MIT License (MIT)
7 |
8 | Copyright (c) 2016 Rob Phillips.
9 |
10 | Permission is hereby granted, free of charge, to any person obtaining a copy
11 | of this software and associated documentation files (the "Software"), to deal
12 | in the Software without restriction, including without limitation the rights
13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 | copies of the Software, and to permit persons to whom the Software is
15 | furnished to do so, subject to the following conditions:
16 |
17 | The above copyright notice and this permission notice shall be included in
18 | all copies or substantial portions of the Software.
19 |
20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 | THE SOFTWARE.
27 | Generated by CocoaPods - https://cocoapods.org
28 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr-acknowledgements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreferenceSpecifiers
6 |
7 |
8 | FooterText
9 | This application makes use of the following third party libraries:
10 | Title
11 | Acknowledgements
12 | Type
13 | PSGroupSpecifier
14 |
15 |
16 | FooterText
17 | The MIT License (MIT)
18 |
19 | Copyright (c) 2016 Rob Phillips.
20 |
21 | Permission is hereby granted, free of charge, to any person obtaining a copy
22 | of this software and associated documentation files (the "Software"), to deal
23 | in the Software without restriction, including without limitation the rights
24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
25 | copies of the Software, and to permit persons to whom the Software is
26 | furnished to do so, subject to the following conditions:
27 |
28 | The above copyright notice and this permission notice shall be included in
29 | all copies or substantial portions of the Software.
30 |
31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
37 | THE SOFTWARE.
38 | License
39 | MIT
40 | Title
41 | Down
42 | Type
43 | PSGroupSpecifier
44 |
45 |
46 | FooterText
47 | Generated by CocoaPods - https://cocoapods.org
48 | Title
49 |
50 | Type
51 | PSGroupSpecifier
52 |
53 |
54 | StringsTable
55 | Acknowledgements
56 | Title
57 | Acknowledgements
58 |
59 |
60 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_Markr : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_Markr
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr-frameworks.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 |
4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
6 |
7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
8 |
9 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
10 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
11 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
12 |
13 | install_framework()
14 | {
15 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
16 | local source="${BUILT_PRODUCTS_DIR}/$1"
17 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
18 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
19 | elif [ -r "$1" ]; then
20 | local source="$1"
21 | fi
22 |
23 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
24 |
25 | if [ -L "${source}" ]; then
26 | echo "Symlinked..."
27 | source="$(readlink "${source}")"
28 | fi
29 |
30 | # Use filter instead of exclude so missing patterns don't throw errors.
31 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
32 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
33 |
34 | local basename
35 | basename="$(basename -s .framework "$1")"
36 | binary="${destination}/${basename}.framework/${basename}"
37 | if ! [ -r "$binary" ]; then
38 | binary="${destination}/${basename}"
39 | fi
40 |
41 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
42 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
43 | strip_invalid_archs "$binary"
44 | fi
45 |
46 | # Resign the code if required by the build settings to avoid unstable apps
47 | code_sign_if_enabled "${destination}/$(basename "$1")"
48 |
49 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
50 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
51 | local swift_runtime_libs
52 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]})
53 | for lib in $swift_runtime_libs; do
54 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
55 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
56 | code_sign_if_enabled "${destination}/${lib}"
57 | done
58 | fi
59 | }
60 |
61 | # Copies the dSYM of a vendored framework
62 | install_dsym() {
63 | local source="$1"
64 | if [ -r "$source" ]; then
65 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\""
66 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}"
67 | fi
68 | }
69 |
70 | # Signs a framework with the provided identity
71 | code_sign_if_enabled() {
72 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
73 | # Use the current code_sign_identitiy
74 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
75 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'"
76 |
77 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
78 | code_sign_cmd="$code_sign_cmd &"
79 | fi
80 | echo "$code_sign_cmd"
81 | eval "$code_sign_cmd"
82 | fi
83 | }
84 |
85 | # Strip invalid architectures
86 | strip_invalid_archs() {
87 | binary="$1"
88 | # Get architectures for current file
89 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
90 | stripped=""
91 | for arch in $archs; do
92 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then
93 | # Strip non-valid architectures in-place
94 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1
95 | stripped="$stripped $arch"
96 | fi
97 | done
98 | if [[ "$stripped" ]]; then
99 | echo "Stripped $binary of architectures:$stripped"
100 | fi
101 | }
102 |
103 |
104 | if [[ "$CONFIGURATION" == "Debug" ]]; then
105 | install_framework "${BUILT_PRODUCTS_DIR}/Down/Down.framework"
106 | fi
107 | if [[ "$CONFIGURATION" == "Release" ]]; then
108 | install_framework "${BUILT_PRODUCTS_DIR}/Down/Down.framework"
109 | fi
110 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
111 | wait
112 | fi
113 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 |
4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
5 |
6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
7 | > "$RESOURCES_TO_COPY"
8 |
9 | XCASSET_FILES=()
10 |
11 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
12 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
13 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
14 |
15 | case "${TARGETED_DEVICE_FAMILY}" in
16 | 1,2)
17 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
18 | ;;
19 | 1)
20 | TARGET_DEVICE_ARGS="--target-device iphone"
21 | ;;
22 | 2)
23 | TARGET_DEVICE_ARGS="--target-device ipad"
24 | ;;
25 | 3)
26 | TARGET_DEVICE_ARGS="--target-device tv"
27 | ;;
28 | 4)
29 | TARGET_DEVICE_ARGS="--target-device watch"
30 | ;;
31 | *)
32 | TARGET_DEVICE_ARGS="--target-device mac"
33 | ;;
34 | esac
35 |
36 | install_resource()
37 | {
38 | if [[ "$1" = /* ]] ; then
39 | RESOURCE_PATH="$1"
40 | else
41 | RESOURCE_PATH="${PODS_ROOT}/$1"
42 | fi
43 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
44 | cat << EOM
45 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
46 | EOM
47 | exit 1
48 | fi
49 | case $RESOURCE_PATH in
50 | *.storyboard)
51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
53 | ;;
54 | *.xib)
55 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
56 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
57 | ;;
58 | *.framework)
59 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
60 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
61 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
62 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
63 | ;;
64 | *.xcdatamodel)
65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true
66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
67 | ;;
68 | *.xcdatamodeld)
69 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true
70 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
71 | ;;
72 | *.xcmappingmodel)
73 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true
74 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
75 | ;;
76 | *.xcassets)
77 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
78 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
79 | ;;
80 | *)
81 | echo "$RESOURCE_PATH" || true
82 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
83 | ;;
84 | esac
85 | }
86 |
87 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
88 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
89 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
90 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
91 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
92 | fi
93 | rm -f "$RESOURCES_TO_COPY"
94 |
95 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
96 | then
97 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
98 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
99 | while read line; do
100 | if [[ $line != "${PODS_ROOT}*" ]]; then
101 | XCASSET_FILES+=("$line")
102 | fi
103 | done <<<"$OTHER_XCASSETS"
104 |
105 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
106 | fi
107 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_MarkrVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_MarkrVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-markr/Pods-markr.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_Markr {
2 | umbrella header "Pods-Markr-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Markr
2 |
3 | 
4 |
5 | **Also check out [Twig](https://github.com/lukakerr/twig), a modern MacOS markdown editor and the successor to Markr**
6 |
7 | Markr is a minimal, lightweight MacOS desktop application for markdown editing.
8 |
9 | Simply start typing and immediately see rendered markdown.
10 |
11 | ### Features
12 | - Split panels
13 | - No delay in rendering markdown
14 | - Change font-size and font of editor
15 | - Minimal, lightweight and easy to use
16 | - Dark and light modes
17 | - Word count
18 |
19 | ### Screenshots
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/markr.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/markr.xcworkspace/xcuserdata/Luka.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lukakerr/markr/286b2779ababb2a9e8e36fecab9b0f48154a43f6/markr.xcworkspace/xcuserdata/Luka.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------