-
Notifications
You must be signed in to change notification settings - Fork 873
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SmartyPants: Apostrophes at the start of leading contractions #1305
Comments
Yes, unfortunately smarty does not play well with any markup. I would suggest to include everything, including 's, into abbr, that should help. |
Oh, I had not originally noticed that the contraction was split across multiple HTML elements when this was brought up in the MkDocs Material issues. Yes, in order for smarty to deduce that a quote is in a contraction, it must be contained within the same element. It's just the way the Python Markdown parser works. |
I was curious what the reference implementation did so I checked with the filter set to "SmartyPants". The following input:
Results in the correct output:
So this is clearly a bug. However, this is a limitation of building SmartyPants into the Markdown parser directly. The text content of each element is processed separately and we are not always able to take into consideration the larger context. It occurs to me that perhaps we could special case a quote at the start of a "tail" of an inline element. Although, I don't recall off-hand if all of that info is available or not. But, more importantly, I wonder if this would introduce errors in other edge cases. |
So I got curios and checked what the reference implementation does with this:
Note that I added a space as the last character of the content of the |
I think actually it's (at least trying) to be particularly smart about That's the wrong apostrophe
<b>That</b>'s the wrong apostrophe
That<b>'s</b> the wrong apostrophe And both of these: I <b>don't</b> want wrong apostrophes
<i>That'd</i> be a good apostrophe all of these result in a wrong-way apostrophe: I <b>don</b>'t want wrong apostrophes
I <b>don </b>'t want wrong apostrophes
<i>That</i>'d be a good apostrophe
That<i>'d</i> be a good apostrophe It seems Edit: (In fact, that special-casing is mentioned as having "always" been there, in the SmartyPants 1.3 blurb from its version history.) |
@ferdnyc thanks for taking a closer look as this. The link to the reference implementation's change log is especially helpful. Apparently, it has always has a special case for |
When 's is not preceded by anything, it probably means that it comes after some HTML tag, so it should be converted to a closing quote. The reference Perl implementation makes the close_class optional and adds a lookahead check for (\s|s\b) when close_class was not matched. Let's copy that behavior by removing closeClass lookbehind check from closingSingleQuotesRegex2. Fixes Python-Markdown#1305.
When 's is not preceded by anything, it probably means that it comes after some HTML tag, so it should be converted to a closing quote. The reference Perl implementation makes the close_class optional and adds a lookahead check for (\s|s\b) when close_class was not matched. Let's copy that behavior by removing closeClass lookbehind check from closingSingleQuotesRegex2. Fixes Python-Markdown#1305.
I have created PR #1348 which fixes this issue. I hope I didn't break any other cases, but ideas what to add to tests are welcome. |
When 's is not preceded by anything, it probably means that it comes after some HTML tag, so it should be converted to a closing quote. The reference Perl implementation makes the close_class optional and adds a lookahead check for (\s|s\b) when close_class was not matched. Let's copy that behavior by removing closeClass lookbehind check from closingSingleQuotesRegex2. Fixes #1305.
As mentioned in the original project here, "SmartyPants will turn the apostrophe into an opening single-quote, when in fact it should be a closing one."
This is specifically presenting an issue for me when
smarty
collides withabbr
. For instance, this code:is rendering like this:
because when
access group
gets rendered byabbr
, the'
is no longer recognized as being mid-word and instead renders as a leading single quote for the possessives
.I've implemented a stopgap via javascript, but there are a lot of different contraction situations and it would be great to have a real fix.
The text was updated successfully, but these errors were encountered: