Преобразование "прямые кавычки" на "кавычки"
у меня есть приложение, которое использует движок правил на основе Javascript. Мне нужен способ конвертировать регулярные прямые кавычки в фигурные (или умные) кавычки. Было бы легко просто сделать string.replace
на ["]
, только это будет вставлять только один случай фигурной цитаты.
лучший способ, который я мог придумать, - это заменить первое вхождение цитаты левой фигурной цитатой, а все остальные-левой, а остальные-правой.
есть ли способ, чтобы выполнить это использование Javascript?
8 ответов
вы можете заменить все, что предшествует символу слова с левой кавычкой, и все, что следует за символом слова с правой кавычкой.
str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "”"); // IF the language supports look-
// behind. Otherwise, see below.
как указано в комментариях ниже, это не учитывает пунктуацию, но легко может:
/(?<=[\w,.?!\)]|^)"/g
[редактировать:] для языков, которые не поддерживают внешний вид, например Javascript, если вы сначала замените все фронтальные, у вас есть два варианта:
str = str.replace(/"/g, "”"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "”"); // Replace any quotes after a word
// boundary with right curly quotes
(я оставил исходное решение выше, если это полезно для кого-то, кто использует язык, который поддерживает look-behind)
вы можете посмотреть, что Pandoc не-видимо с --smart
опция, она обрабатывает кавычки правильно во всех случаях (включая, например, ’tis и ’twere).
недавно я написал JavaScript typography prettification engine, который, среди прочего, цитирует замену; я закончил, используя в основном алгоритм, предложенный Ренесис, но в настоящее время неудачный тест ждет более умного решения.
Если вы заинтересованы в cribbing мой код (и / или отправки патча на основе работы, которую вы сделали), проверьте его: jsPrettify. jsprettify.prettifyStr
делает то, что вы ищете. Если вы не хотите иметь дело с зависимостью закрытия, есть старая версия который работает сам по себе-он даже работает на носороге.
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
return "“" + m1 + "”";
});
следующее просто изменяет каждую цитату, чередуя (этот конкретный пример, однако, опустил бы осиротевшие кавычки).
str.replace(/\"([^\"]*)\"/gi,"“”");
отлично работает, пока текст, который вы текстурируете, еще не испорчен неправильным использованием двойной кавычки. В английском языке кавычки никогда не вложены.
спасибо. Чтобы сделать это с помощью PHP:http://pastebin.com/CEK0NN43
противоположное с JavaScript:http://www.kevinkorb.com/post/37
но проблема на страницах, которые преобразуют из вертикальных кавычек в фигурные, заключается в том, что если преобразование выполняется в компьютерный код, он обычно не работает, поэтому вам нужно повторно преобразовать все кавычки обратно в вертикальные.
Я не думаю, что что-то подобное В общем легко вообще, потому что вам придется точно интерпретировать, что означает каждый символ двойной кавычки в вашем контенте. Тем не менее, я бы собрал все текстовые узлы, которые меня интересовали, а затем прошел и отслеживал "вкл/выкл" (или "нечетный/четный"; что угодно) характер каждого экземпляра двойной цитаты. Затем вы можете узнать, какой заменяющий объект использовать.
Я не нашел логики, которую хотел здесь, поэтому вот что я закончил.
value = value.replace(/(^|\s)(")/g, "“"); // replace quotes that start a line or follow spaces
value = value.replace(/"/g, "”"); // replace rest of quotes with the back smart quote
У меня есть небольшая текстовая область, которую мне нужно заменить прямыми кавычками на фигурные (умные) кавычки. Я просто выполняю эту логику на keyup. Я попытался заставить его вести себя как Microsoft Word.
публикация для потомков.
как предложил @Steven Dee, я пошел в Pandoc.
Я пытаюсь использовать зрелый и испытанный инструмент, когда могу, а не выпекать собственное регулярное выражение. Построенные вручную regex могут быть чрезмерно жадными или недостаточно жадными, и они могут не быть чувствительны к границам слов и запятым и т. д. Pandoc составляет большинство этого и многое другое.
из командной строки (параметр --smart включает smart цитаты):
pandoc --smart --standalone -o output.html input.html
..и я знаю, что сценарий командной строки может или не может соответствовать требованию OP использование Javascript. (по теме: Как выполнить команду оболочки в Javascript)