diff options
author | John MacFarlane <jgm@berkeley.edu> | 2014-12-14 18:21:04 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2014-12-25 11:44:26 -0700 |
commit | 2da7c3f21e2b70cfd08d0f193eeaa6f00e9eb1b8 (patch) | |
tree | e474197b6151dd5f9922368a6eebaf1f24dc3806 /src/inlines.c | |
parent | ba8f2c48b700a466a8cf7097d5f72d43372d4c37 (diff) |
Improved rules for emphasis and strong emphasis.
This improves parsing of emphasis around punctuation.
Background:
http://talk.commonmark.org/t/emphasis-inside-strong-broken-in-js-implementation-when-parenthesis-involved/903/6
The basic idea of the change is that if the delimiter is part of
a delimiter clump that has punctuation to the left and a normal
character (non-space, non-punctuation) to the right, it can only
be an opener. If it has punctuation to the right and a normal
character (non-space, non-punctuation) to the left, it can only be a closer.
This handles cases like
**Gomphocarpus (*Gomphocarpus physocarpus*, syn. *Asclepias
physocarpa*)**
and
**foo "*bar*" foo**
better than before.
The spec section on Emphasis and Strong Emphasis has been extensively
revised. The C and JS implementations have been brought up to date,
and all tests pass.
Diffstat (limited to 'src/inlines.c')
-rw-r--r-- | src/inlines.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/inlines.c b/src/inlines.c index f63fabe..3f69837 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -261,7 +261,7 @@ scan_delims(subject* subj, unsigned char c, bool * can_open, bool * can_close) } len = utf8proc_iterate(subj->input.data + before_char_pos, subj->pos - before_char_pos, &before_char); - if (len == 0) { + if (len == -1) { before_char = 10; } } @@ -273,11 +273,17 @@ scan_delims(subject* subj, unsigned char c, bool * can_open, bool * can_close) len = utf8proc_iterate(subj->input.data + subj->pos, subj->input.len - subj->pos, &after_char); - if (len == 0) { + if (len == -1) { after_char = 10; } - *can_open = numdelims > 0 && !utf8proc_is_space(after_char); - *can_close = numdelims > 0 && !utf8proc_is_space(before_char); + *can_open = numdelims > 0 && !utf8proc_is_space(after_char) && + !(utf8proc_is_punctuation(after_char) && + !utf8proc_is_space(before_char) && + !utf8proc_is_punctuation(before_char)); + *can_close = numdelims > 0 && !utf8proc_is_space(before_char) && + !(utf8proc_is_punctuation(before_char) && + !utf8proc_is_space(after_char) && + !utf8proc_is_punctuation(after_char)); if (c == '_') { *can_open = *can_open && !(before_char < 128 && isalnum((char)before_char)); |