Преобразование ″ прямых цитат ″ в «фигурные цитаты» - PullRequest
20 голосов
/ 04 февраля 2010

У меня есть приложение, которое использует движок правил на основе Javascript. Мне нужен способ конвертировать обычные прямые кавычки в фигурные (или умные) кавычки. Было бы просто сделать string.replace для ["], только это вставит только один случай кавычки.

Лучший способ, которым я мог придумать, - заменить первое вхождение кавычки на левую фигурную кавычку, а все последующие - на левую, а остальные - на вьющуюся.

Есть ли способ сделать это с помощью Javascript?

Ответы [ 7 ]

15 голосов
/ 04 февраля 2010

Вы можете заменить все, что предшествует символу слова, левой кавычкой, а все, что следует за символом слова, правой кавычкой.

str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "&#8221;"); // IF the language supports look-
                                             // behind. Otherwise, see below.

Как указано в комментариях ниже, это не учитывает пунктуацию, но легко может:

/(?<=[\w,.?!\)]|^)"/g

[ Редактировать :] Для языков, которые не поддерживают ретроспективный просмотр, таких как Javascript, до тех пор, пока вы сначала замените все фронтальные, у вас есть два варианта:

str = str.replace(/"/g, "&#8221;"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "&#8221;"); // Replace any quotes after a word
                                      // boundary with right curly quotes

(я оставил оригинальное решение выше на случай, если это будет полезно для кого-то, использующего язык, который поддерживает поиск)

5 голосов
/ 25 марта 2010

Возможно, вы захотите посмотреть, что делает Pandoc - очевидно, с опцией --smart, он правильно обрабатывает кавычки во всех случаях (включая, например, tis и twere).

Недавно я написал движок для предварительного оформления типографики Javascript, который, помимо прочего, заменяет цитаты; В итоге я использовал алгоритм, предложенный Renesis , но в настоящее время не удается проверить более разумное решение.

Если вы заинтересованы в том, чтобы написать мой код (и / или отправить патч, основанный на проделанной вами работе), проверьте его: jsPrettify . jsprettify.prettifyStr делает то, что вы ищете. Если вы не хотите иметь дело с зависимостью Closure, существует более старая версия , которая работает сама по себе - она ​​даже работает в Rhino.

3 голосов
/ 04 февраля 2010
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
    return "“" + m1 + "”";
});
2 голосов
/ 29 ноября 2010

Следующее просто меняет каждую цитату путем чередования (однако в этом конкретном примере опущены потерянные цитаты).

str.replace(/\"([^\"]*)\"/gi,"&#8220;$1&#8221;");

Прекрасно работает, если текст, который вы текстурируете, еще не испорчен неправильным использованием двойной кавычки. На английском языке кавычки никогда не бывают вложенными.

0 голосов
/ 27 февраля 2016

Размещение для потомков.

Как подсказал @Steven Dee, я пошел к Pandoc .

Я стараюсь использовать зрелый и проверенный инструмент всякий раз, когда могу, вместо того, чтобы испечь свое собственное регулярное выражение. Созданные вручную регулярные выражения могут быть слишком жадными или недостаточно жадными, и они могут не быть чувствительными к границам слов, запятым и т. Д. Пандок объясняет большинство из этого и даже больше.

Из командной строки (параметр --smart включает умные кавычки):

pandoc --smart --standalone -o output.html input.html

.. и я знаю, что сценарий командной строки может соответствовать или не соответствовать требованию OP с использованием Javascript . (связанный: Как выполнить команду оболочки в Javascript )

0 голосов
/ 12 декабря 2014

Я не нашел здесь логику, которую хотел, поэтому вот что я закончил.

value = value.replace(/(^|\s)(")/g, "$1“"); // replace quotes that start a line or follow spaces
value = value.replace(/"/g, "”"); // replace rest of quotes with the back smart quote

У меня есть небольшая текстовая область, которая мне нужна, чтобы заменить прямые кавычки на фигурные (умные) кавычки. Я просто выполняю эту логику по ключу. Я пытался заставить его вести себя как Microsoft Word.

0 голосов
/ 04 февраля 2010

Я не думаю, что что-то подобное в общем вообще легко, потому что вам придется точно понимать, что означает каждый символ двойной кавычки в вашем контенте. Тем не менее, я бы собрал все интересующие меня текстовые узлы, а затем прошел и проследил за характером «вкл / выкл» (или «нечетное / четное»; что угодно) каждого экземпляра двойной кавычки. Затем вы можете узнать, какой объект для замены использовать.

...