diff --git a/src/construct/attention.rs b/src/construct/attention.rs index ca7ad2e5..852fc9c5 100644 --- a/src/construct/attention.rs +++ b/src/construct/attention.rs @@ -239,18 +239,22 @@ fn get_sequences(tokenizer: &mut Tokenizer) -> Vec { let exit = &tokenizer.events[end]; let marker = tokenizer.parse_state.bytes[enter.point.index]; - let before = classify_opt(char_before_index( - tokenizer.parse_state.bytes, - enter.point.index, - )); - let after = classify_opt(char_after_index( - tokenizer.parse_state.bytes, - exit.point.index, - )); + let before_char = char_before_index(tokenizer.parse_state.bytes, enter.point.index); + let before = classify_opt(before_char); + let after_char = char_after_index(tokenizer.parse_state.bytes, exit.point.index); + let after = classify_opt(after_char); let open = after == CharacterKind::Other - || (after == CharacterKind::Punctuation && before != CharacterKind::Other); + || (after == CharacterKind::Punctuation && before != CharacterKind::Other) + // For regular attention markers (not strikethrough), the + // other attention markers can be used around them + || (marker != b'~' && matches!(after_char, Some('*' | '_'))) + || (marker != b'~' && tokenizer.parse_state.options.constructs.gfm_strikethrough && matches!(after_char, Some('~'))); let close = before == CharacterKind::Other - || (before == CharacterKind::Punctuation && after != CharacterKind::Other); + || (before == CharacterKind::Punctuation && after != CharacterKind::Other) + || (marker != b'~' && matches!(before_char, Some('*' | '_'))) + || (marker != b'~' + && tokenizer.parse_state.options.constructs.gfm_strikethrough + && matches!(before_char, Some('~'))); sequences.push(Sequence { index, diff --git a/src/util/char.rs b/src/util/char.rs index 3ea45006..4fe8ac7e 100644 --- a/src/util/char.rs +++ b/src/util/char.rs @@ -93,7 +93,7 @@ pub fn classify(char: char) -> Kind { Kind::Whitespace } // Unicode punctuation. - else if PUNCTUATION.contains(&char) { + else if char.is_ascii_punctuation() || PUNCTUATION.contains(&char) { Kind::Punctuation } // Everything else. diff --git a/tests/gfm_strikethrough.rs b/tests/gfm_strikethrough.rs index f400193b..120f6c1f 100644 --- a/tests/gfm_strikethrough.rs +++ b/tests/gfm_strikethrough.rs @@ -363,6 +363,18 @@ u ~**xxx**~ zzz "should handle interplay like GitHub" ); + assert_eq!( + to_html_with_options("a*~b~*c\n\na*.b.*c", &Options::gfm())?, + "

abc

\n

a*.b.*c

", + "should handle interplay w/ other attention markers (GFM)" + ); + + assert_eq!( + to_html("a*~b~*c\n\na*.b.*c"), + "

a*~b~*c

\n

a*.b.*c

", + "should handle interplay w/ other attention markers (CM reference)" + ); + assert_eq!( to_html_with_options( "a ~b~ ~~c~~ d",