Skip to content

Commit

Permalink
Merge pull request #872 from notriddle/notriddle/strikethrough-0.11
Browse files Browse the repository at this point in the history
[0.11] Adjust strikethrough flanking rule to better fit Rustdoc Crater run
  • Loading branch information
Martin1887 committed Mar 26, 2024
2 parents 74aed2f + fa1f1c2 commit 84ebb86
Show file tree
Hide file tree
Showing 5 changed files with 306 additions and 5 deletions.
125 changes: 125 additions & 0 deletions pulldown-cmark/specs/strikethrough.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
This is an extension of gfm_strikethrough.txt. Some of these tests are also pulled from commonmark-hs.

# Two tildes

Basic strikethrough is between two tildes:

```````````````````````````````` example
~~This is *stricken out*~~
.
<p><del>This is <em>stricken out</em></del></p>
````````````````````````````````

Backslash escapes:

```````````````````````````````` example
~~This is \~\~stricken~~
.
<p><del>This is ~~stricken</del></p>
````````````````````````````````

Intraword strikeout:

```````````````````````````````` example
This~~is~~stricken
.
<p>This<del>is</del>stricken</p>
````````````````````````````````

```````````````````````````````` example
~~This~~is~~stricken~~
.
<p><del>This</del>is<del>stricken</del></p>
````````````````````````````````

Punctuation is ignored for purposes of determining
flankingness on two tildes:

```````````````````````````````` example
Here I strike out an exclamation point~~!~~.
.
<p>Here I strike out an exclamation point<del>!</del>.</p>
````````````````````````````````

# One tilde

One tilde—and this is where we differ from commonmark-hs—is allowed in certain situations:

```````````````````````````````` example
~This is stricken out~
.
<p><del>This is stricken out</del></p>
````````````````````````````````

Backslash escapes:

```````````````````````````````` example
~This is \~stricken~
.
<p><del>This is ~stricken</del></p>
````````````````````````````````

Intraword strikeout requires two tildes:

```````````````````````````````` example
This~is~nothing
.
<p>This~is~nothing</p>
````````````````````````````````

```````````````````````````````` example
~This~is~nothing~
.
<p><del>This~is~nothing</del></p>
````````````````````````````````

Punctuation is used for purposes of determining
flankingness:

```````````````````````````````` example
Here I fail to strike out an exclamation point~!~.
.
<p>Here I fail to strike out an exclamation point~!~.</p>
````````````````````````````````

Tilde runs can't mix.

```````````````````````````````` example
Here I fail to strike out a tilde ~~~.
.
<p>Here I fail to strike out a tilde ~~~.</p>
````````````````````````````````

```````````````````````````````` example
Here I fail to match up ~~tildes~.
.
<p>Here I fail to match up ~~tildes~.</p>
````````````````````````````````

```````````````````````````````` example
Here I fail to match up ~tildes~~.
.
<p>Here I fail to match up ~tildes~~.</p>
````````````````````````````````

Double tildes are allowed to contain single tildes, and the other way around:

```````````````````````````````` example
~~This ~is stricken.~~
.
<p><del>This ~is stricken.</del></p>
````````````````````````````````

```````````````````````````````` example
~This ~~is stricken.~
.
<p><del>This ~~is stricken.</del></p>
````````````````````````````````

The first one wins.

```````````````````````````````` example
~This ~~is stricken~ but this is not~~
.
<p><del>This ~~is stricken</del> but this is not~~</p>
````````````````````````````````
18 changes: 13 additions & 5 deletions pulldown-cmark/src/firstpass.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2138,12 +2138,17 @@ fn delim_run_can_open(
}
}
let delim = suffix.chars().next().unwrap();
// `*` and `~~` can be intraword, `_` cannot
if (delim == '*' || delim == '~') && !is_punctuation(next_char) {
// `*` and `~~` can be intraword, `_` and `~` cannot
if delim == '*' && !is_punctuation(next_char) {
return true;
}
if delim == '~' && run_len > 1 {
return true;
}

let prev_char = s[..ix].chars().last().unwrap();
if delim == '~' && prev_char == '~' && !is_punctuation(next_char) {
return true;
}

prev_char.is_whitespace()
|| is_punctuation(prev_char) && (delim != '\'' || ![']', ')'].contains(&prev_char))
Expand Down Expand Up @@ -2180,8 +2185,11 @@ fn delim_run_can_close(
}
}
let delim = suffix.chars().next().unwrap();
// `*` and `~~` can be intraword, `_` cannot
if (delim == '*' || delim == '~') && !is_punctuation(prev_char) {
// `*` and `~~` can be intraword, `_` and `~` cannot
if (delim == '*' || (delim == '~' && run_len > 1)) && !is_punctuation(prev_char) {
return true;
}
if delim == '~' && prev_char == '~' {
return true;
}

Expand Down
3 changes: 3 additions & 0 deletions pulldown-cmark/src/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1455,6 +1455,9 @@ impl InlineStack {
.cloned()
.enumerate()
.rfind(|(_, el)| {
if c == b'~' && run_length != el.run_length {
return false;
}
el.c == c
&& (!both && !el.both
|| (run_length + el.run_length) % 3 != 0
Expand Down
1 change: 1 addition & 0 deletions pulldown-cmark/tests/suite/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ mod old_footnotes;
mod regression;
mod smart_punct;
mod spec;
mod strikethrough;
mod table;
164 changes: 164 additions & 0 deletions pulldown-cmark/tests/suite/strikethrough.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
// This file is auto-generated by the build script
// Please, do not modify it manually

use super::test_markdown_html;

#[test]
fn strikethrough_test_1() {
let original = r##"~~This is *stricken out*~~
"##;
let expected = r##"<p><del>This is <em>stricken out</em></del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_2() {
let original = r##"~~This is \~\~stricken~~
"##;
let expected = r##"<p><del>This is ~~stricken</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_3() {
let original = r##"This~~is~~stricken
"##;
let expected = r##"<p>This<del>is</del>stricken</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_4() {
let original = r##"~~This~~is~~stricken~~
"##;
let expected = r##"<p><del>This</del>is<del>stricken</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_5() {
let original = r##"Here I strike out an exclamation point~~!~~.
"##;
let expected = r##"<p>Here I strike out an exclamation point<del>!</del>.</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_6() {
let original = r##"~This is stricken out~
"##;
let expected = r##"<p><del>This is stricken out</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_7() {
let original = r##"~This is \~stricken~
"##;
let expected = r##"<p><del>This is ~stricken</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_8() {
let original = r##"This~is~nothing
"##;
let expected = r##"<p>This~is~nothing</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_9() {
let original = r##"~This~is~nothing~
"##;
let expected = r##"<p><del>This~is~nothing</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_10() {
let original = r##"Here I fail to strike out an exclamation point~!~.
"##;
let expected = r##"<p>Here I fail to strike out an exclamation point~!~.</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_11() {
let original = r##"Here I fail to strike out a tilde ~~~.
"##;
let expected = r##"<p>Here I fail to strike out a tilde ~~~.</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_12() {
let original = r##"Here I fail to match up ~~tildes~.
"##;
let expected = r##"<p>Here I fail to match up ~~tildes~.</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_13() {
let original = r##"Here I fail to match up ~tildes~~.
"##;
let expected = r##"<p>Here I fail to match up ~tildes~~.</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_14() {
let original = r##"~~This ~is stricken.~~
"##;
let expected = r##"<p><del>This ~is stricken.</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_15() {
let original = r##"~This ~~is stricken.~
"##;
let expected = r##"<p><del>This ~~is stricken.</del></p>
"##;

test_markdown_html(original, expected, false, false, false);
}

#[test]
fn strikethrough_test_16() {
let original = r##"~This ~~is stricken~ but this is not~~
"##;
let expected = r##"<p><del>This ~~is stricken</del> but this is not~~</p>
"##;

test_markdown_html(original, expected, false, false, false);
}

0 comments on commit 84ebb86

Please sign in to comment.