Should parse nested quotes: . "foo 'bar' baz" 'foo 'bar' baz' .

“foo ‘bar’ baz”

‘foo ‘bar’ baz’

. Should not overlap quotes: . 'foo "bar' baz" .

‘foo "bar’ baz"

. Should match quotes on the same level: . "foo *bar* baz" .

“foo bar baz”

. Should handle adjacent nested quotes: . '"double in single"' "'single in double'" .

‘“double in single”’

“‘single in double’”

. Should not match quotes on different levels: . *"foo* bar" "foo *bar"* *"foo* bar *baz"* .

"foo bar"

"foo bar"

"foo bar baz"

. Smartquotes should not overlap with other tags: . *foo "bar* *baz" quux* .

foo "bar baz" quux

. Should try and find matching quote in this case: . "foo "bar 'baz" .

"foo “bar 'baz”

. Should not touch 'inches' in quotes: . "Monitor 21"" and "Monitor"" .

“Monitor 21"” and “Monitor”"

. Should render an apostrophe as a rsquo: . This isn't and can't be the best approach to implement this... .

This isn’t and can’t be the best approach to implement this…

. Apostrophe could end the word, that's why original smartypants replaces all of them as rsquo: . users' stuff .

users’ stuff

. Quotes between punctuation chars: . "(hai)". .

“(hai)”.

. Quotes at the start/end of the tokens: . "*foo* bar" "foo *bar*" "*foo bar*" .

foo bar”

“foo bar

foo bar

. Should treat softbreak as a space: . "this" and "that". "this" and "that". .

“this” and “that”.

“this” and “that”.

. Should treat hardbreak as a space: . "this"\ and "that". "this" and\ "that". .

“this”
and “that”.

“this” and
“that”.

. Should allow quotes adjacent to other punctuation characters, #643: . The dog---"'man's' best friend" .

The dog—“‘man’s’ best friend”

. Should parse quotes adjacent to code block, #677: . "test `code`" "`code` test" .

“test code

code test”

. Should parse quotes adjacent to inline html, #677: . "test
" "
test" .

“test


test”

. Should be escapable: . "foo" \"foo" "foo\" .

“foo”

"foo"

"foo"

. Should not replace entities: . "foo" "foo" "foo" .

"foo"

"foo"

"foo"

.