Simplify some code regarding fenced blocks

This commit is contained in:
Xavier Mendez 2014-04-09 13:45:17 +02:00
parent f62c5a79bb
commit 08b0f2c3c7
2 changed files with 14 additions and 14 deletions

View file

@ -58,7 +58,7 @@ static struct extension_info extensions_info[] = {
{HOEDOWN_EXT_FENCED_CODE, "fenced-code", "Parse fenced code blocks."}, {HOEDOWN_EXT_FENCED_CODE, "fenced-code", "Parse fenced code blocks."},
{HOEDOWN_EXT_FOOTNOTES, "footnotes", "Parse footnotes."}, {HOEDOWN_EXT_FOOTNOTES, "footnotes", "Parse footnotes."},
{HOEDOWN_EXT_AUTOLINK, "autolink", "Automatically turn URLs into links."}, {HOEDOWN_EXT_AUTOLINK, "autolink", "Automatically turn safe URLs into links."},
{HOEDOWN_EXT_STRIKETHROUGH, "strikethrough", "Parse ~~stikethrough~~ spans."}, {HOEDOWN_EXT_STRIKETHROUGH, "strikethrough", "Parse ~~stikethrough~~ spans."},
{HOEDOWN_EXT_UNDERLINE, "underline", "Parse _underline_ instead of emphasis."}, {HOEDOWN_EXT_UNDERLINE, "underline", "Parse _underline_ instead of emphasis."},
{HOEDOWN_EXT_HIGHLIGHT, "highlight", "Parse ==highlight== spans."}, {HOEDOWN_EXT_HIGHLIGHT, "highlight", "Parse ==highlight== spans."},

View file

@ -1322,30 +1322,30 @@ is_hrule(uint8_t *data, size_t size)
} }
/* check if a line is a code fence; return the /* check if a line is a code fence; return the
* width of the code fence. if passed, width of * end of the code fence. if passed, width of
* the fence rule and character will be returned */ * the fence rule and character will be returned */
static size_t static size_t
is_codefence(uint8_t *data, size_t size, size_t *width, uint8_t *chr) is_codefence(uint8_t *data, size_t size, size_t *width, uint8_t *chr)
{ {
size_t i = 0, n = 0; size_t i = 0, n = 1;
uint8_t c; uint8_t c;
/* skipping initial spaces */ /* skipping initial spaces */
if (size < 3) return 0; if (size < 3)
return 0;
if (data[0] == ' ') { i++; if (data[0] == ' ') { i++;
if (data[1] == ' ') { i++; if (data[1] == ' ') { i++;
if (data[2] == ' ') { i++; } } } if (data[2] == ' ') { i++; } } }
/* looking at the hrule uint8_t */ /* looking at the hrule uint8_t */
if (i + 2 >= size || !(data[i] == '~' || data[i] == '`')) c = data[i];
if (i + 2 >= size || !(c=='~' || c=='`'))
return 0; return 0;
c = data[i]; /* the fence must be that same character */
while (++i < size && data[i] == c)
/* the whole line must be the uint8_t or whitespace */ ++n;
while (i < size && data[i] == c) {
n++; i++;
}
if (n < 3) if (n < 3)
return 0; return 0;
@ -1688,22 +1688,22 @@ parse_fencedcode(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_
// search for end // search for end
i++; i++;
text_start = i; text_start = i;
for (; (line_start = i) < size; i++) { while ((line_start = i) < size) {
while (i < size && data[i] != '\n') i++; while (i < size && data[i] != '\n') i++;
w2 = is_codefence(data + line_start, i - line_start, &width2, &chr2); w2 = is_codefence(data + line_start, i - line_start, &width2, &chr2);
if (w == w2 && width == width2 && chr == chr2 && if (w == w2 && width == width2 && chr == chr2 &&
is_empty(data + (line_start+w), i - (line_start+w))) is_empty(data + (line_start+w), i - (line_start+w)))
break; break;
i++;
} }
text.data = data + text_start; text.data = data + text_start;
text.size = line_start - text_start; text.size = line_start - text_start;
// call callback
if (doc->md.blockcode) if (doc->md.blockcode)
doc->md.blockcode(ob, text.size ? &text : NULL, lang.size ? &lang : NULL, doc->md.opaque); doc->md.blockcode(ob, text.size ? &text : NULL, lang.size ? &lang : NULL, doc->md.opaque);
if (data[i] == '\n') i++;
return i; return i;
} }