Преобразование ″Straight заключает  в кавычки к “изогнутым кавычкам”

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

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

Существует ли способ выполнить это использование JavaScript?

20
задан tchrist 29 November 2010 в 05:38
поделиться

4 ответа

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

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

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

15
ответ дан 30 November 2019 в 00:51
поделиться
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
    return "“" + m1 + "”";
});
3
ответ дан 30 November 2019 в 00:51
поделиться

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

0
ответ дан 30 November 2019 в 00:51
поделиться

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

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

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

5
ответ дан 30 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: