Make image parsing a little more sane, by having an explicit char_image function (that delegates most work to char_link).
The current situation is incredibly hacky, because char_link has to reach into the output buffer to remove the last exclamation mark. For a non-standard renderer that does not just echo normal text to the output, this doesn't work well.
This commit is contained in:
parent
b234ae0a46
commit
b1402b50f1
4 changed files with 42 additions and 4 deletions
|
@ -77,6 +77,7 @@ static size_t char_autolink_url(hoedown_buffer *ob, hoedown_document *doc, uint8
|
||||||
static size_t char_autolink_email(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
static size_t char_autolink_email(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
||||||
static size_t char_autolink_www(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
static size_t char_autolink_www(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
||||||
static size_t char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
static size_t char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
||||||
|
static size_t char_image(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
||||||
static size_t char_superscript(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
static size_t char_superscript(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
||||||
static size_t char_math(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
static size_t char_math(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size);
|
||||||
|
|
||||||
|
@ -86,6 +87,7 @@ enum markdown_char_t {
|
||||||
MD_CHAR_CODESPAN,
|
MD_CHAR_CODESPAN,
|
||||||
MD_CHAR_LINEBREAK,
|
MD_CHAR_LINEBREAK,
|
||||||
MD_CHAR_LINK,
|
MD_CHAR_LINK,
|
||||||
|
MD_CHAR_IMAGE,
|
||||||
MD_CHAR_LANGLE,
|
MD_CHAR_LANGLE,
|
||||||
MD_CHAR_ESCAPE,
|
MD_CHAR_ESCAPE,
|
||||||
MD_CHAR_ENTITY,
|
MD_CHAR_ENTITY,
|
||||||
|
@ -103,6 +105,7 @@ static char_trigger markdown_char_ptrs[] = {
|
||||||
&char_codespan,
|
&char_codespan,
|
||||||
&char_linebreak,
|
&char_linebreak,
|
||||||
&char_link,
|
&char_link,
|
||||||
|
&char_image,
|
||||||
&char_langle_tag,
|
&char_langle_tag,
|
||||||
&char_escape,
|
&char_escape,
|
||||||
&char_entity,
|
&char_entity,
|
||||||
|
@ -1090,6 +1093,17 @@ char_autolink_url(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size
|
||||||
return link_len;
|
return link_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
char_image(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size) {
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
if (size < 2 || data[1] != '[') return 0;
|
||||||
|
|
||||||
|
ret = char_link(ob, doc, data + 1, offset + 1, size - 1);
|
||||||
|
if (!ret) return 0;
|
||||||
|
return ret + 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* char_link • '[': parsing a link, a footnote or an image */
|
/* char_link • '[': parsing a link, a footnote or an image */
|
||||||
static size_t
|
static size_t
|
||||||
char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
|
char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offset, size_t size)
|
||||||
|
@ -1302,9 +1316,6 @@ char_link(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t offse
|
||||||
|
|
||||||
/* calling the relevant rendering function */
|
/* calling the relevant rendering function */
|
||||||
if (is_img) {
|
if (is_img) {
|
||||||
if (ob->size && ob->data[ob->size - 1] == '!')
|
|
||||||
ob->size -= 1;
|
|
||||||
|
|
||||||
ret = doc->md.image(ob, u_link, title, content, &doc->data);
|
ret = doc->md.image(ob, u_link, title, content, &doc->data);
|
||||||
} else {
|
} else {
|
||||||
ret = doc->md.link(ob, content, u_link, title, &doc->data);
|
ret = doc->md.link(ob, content, u_link, title, &doc->data);
|
||||||
|
@ -2807,8 +2818,10 @@ hoedown_document_new(
|
||||||
if (doc->md.linebreak)
|
if (doc->md.linebreak)
|
||||||
doc->active_char['\n'] = MD_CHAR_LINEBREAK;
|
doc->active_char['\n'] = MD_CHAR_LINEBREAK;
|
||||||
|
|
||||||
if (doc->md.image || doc->md.link || doc->md.footnotes || doc->md.footnote_ref)
|
if (doc->md.image || doc->md.link || doc->md.footnotes || doc->md.footnote_ref) {
|
||||||
doc->active_char['['] = MD_CHAR_LINK;
|
doc->active_char['['] = MD_CHAR_LINK;
|
||||||
|
doc->active_char['!'] = MD_CHAR_IMAGE;
|
||||||
|
}
|
||||||
|
|
||||||
doc->active_char['<'] = MD_CHAR_LANGLE;
|
doc->active_char['<'] = MD_CHAR_LANGLE;
|
||||||
doc->active_char['\\'] = MD_CHAR_ESCAPE;
|
doc->active_char['\\'] = MD_CHAR_ESCAPE;
|
||||||
|
|
9
test/Tests/Images.html
Normal file
9
test/Tests/Images.html
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<p>This is an <img src="/url" alt="image">.</p>
|
||||||
|
|
||||||
|
<p>This is a tricky !<img src="/url" alt="image">.</p>
|
||||||
|
|
||||||
|
<p>This is another tricky case: !<a href="/url">not image</a>.</p>
|
||||||
|
|
||||||
|
<p>This is a reference <img src="/url2" alt="image">.</p>
|
||||||
|
|
||||||
|
<p>Terminating !</p>
|
11
test/Tests/Images.text
Normal file
11
test/Tests/Images.text
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
This is an ![image](/url).
|
||||||
|
|
||||||
|
This is a tricky !![image](/url).
|
||||||
|
|
||||||
|
This is another tricky case: \![not image](/url).
|
||||||
|
|
||||||
|
This is a reference ![image][ref].
|
||||||
|
|
||||||
|
[ref]: /url2
|
||||||
|
|
||||||
|
Terminating !
|
|
@ -115,6 +115,11 @@
|
||||||
"input": "Tests/Table.text",
|
"input": "Tests/Table.text",
|
||||||
"output": "Tests/Table.html",
|
"output": "Tests/Table.html",
|
||||||
"flags": ["--tables"]
|
"flags": ["--tables"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Tests/Images.text",
|
||||||
|
"output": "Tests/Images.html",
|
||||||
|
"flags": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue