I have a file that contains "straight" (normal, ASCII) quotes, and I'm trying to convert them to real quotation mark glyphs (“curly” quotes, U+2018 to U+201D). Since the transformation from two different quote characters into a single one has been lossy in the first place, obviously there is no way to automatically perform this conversion; nevertheless I suspect a few heuristics will cover most cases. So the plan is a script (in Emacs) that does something like the following: for each straight quote character,
This question is about the first step: what would be a good algorithm (a set of heuristics, more like) to use, for normal English text (a novel, for example)? Here are some preliminary ideas, which I believe work for double-quotes (counterexamples are welcome!):
Single quotes are trickier, because a '
might be either an opening quote, closing quote, or apostrophe, and we want to leave apostrophes alone (mustn't write “mustn’t”). Some of the same rules as above apply, but 'tis possible apostrophes are at the beginning of words (or lines), although it's less common than 'twas in the past. I can't offhand think of rules that would properly handle fragments like ["I like 'That '70s show'", she said]. It might require looking at more than just neighbouring characters, and compute distances between quotes, for example…
Any more ideas? It is okay if not all possible cases are covered; the goal is to be as intelligent as possible but no further. :-)
Edit: Some more things that might be worth thinking about (or might be irrelevant, not sure):
For the curly single opening and closing quote mark (or apostrophe), use ‘ and ’ respectively. For the curly opening and closing double quotation marks, use “ and ” respectively.
You can simply insert the ALT code to insert the curly quotations. Long press the ALT key and then type the number. Using this code guide, you can easily insert the desired smart quotations.
In a document that already has straight quotes (I assume that is where you are seeing the problem), do a find and replace: Find: single or double quote (' or " - use the actual character) and Replace: same type of quote as in Find (' or "). This will replace the straight quotes with curly (smart) quotes.
A good place to start would be with a state machine:
You can make additional decisions at each of the state transitions.
You could attempt to normalize the single quotes by identifying known conjunctions, for instance, and converting them to a different, not text, character prior to processing.
My $0.02
guess which curly quote character to use, if possible
It is not, in the general case.
The simple algorithm that most automatic converters use is just to look at the previous letter you typed before the ' or ". If it's a space, start of line, opening bracket or other opening quote, choose opening quote, else closing. The advantage of this method is that it can run as-you-type, so when it chooses the wrong one you can generally correct it.
we want to leave apostrophes alone
I agree! But not many people do. It's normal typesetting practice to turn an apostrophe into a left-facing single quote. Personally I prefer to leave them as they are, to distinguish them from enclosing quotes, making the text easier (I find) to read, and possible to process automatically.
However this really is just my taste and is not generally considered justified merely because the character is defined by the Unicode standard as being APOSTROPHE.
'tis possible apostrophes are at the beginning of words
Indeed. There is no way to tell an apostrophe from a potential open quote in cases like the classic Fish 'n' Chips, short of enormous amounts of cultural context.
(Not to mention primes, okinas, glottal stops and various other uses of the apostrophe...)
The best thing to do, of course, is install a keyboard layout that can type smart quotes directly. I have ‘’ on AltGr+[], “” on AltGr+Shift+[], –— on AltGr+[Shift]+dash, and so on.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With