А при чем здесь Drupal? В описании к проге ведь написано - работает как самостоятельная программа либо как плагин к IE. Если хочется что-то подобное в Drupal - надо модуль-фильтр писать и в нём такую функцию реализовывать.
Могу обрадовать - эти самые кавычки и есть одна из причин неправильного поиска на русском в друпале. При индексации текста модуль поиска, естественно, пытается убрать сначала все знаки препинания, скобки, кавычки и прочее. Так вот, именно при убирании угловых кавычек он больше всего гадит с русским языком. Даже заставив нормально работать поиск, мне пришлось от "ёлочек" отказаться. Хотя задача вроде простая - надо скормить функции mb_pregreplace правильное регулярное выражение, но у меня ничего не вышло.
Для всякой типографики по-простому - можно хакнуть какой-нибудь подходящий фильтр, типа textile, marksmarty или wiki. Кстати, marksmarty умеет делать длинные тире.
Вообще-то, поиск, по идее, работает с исходным текстом. Так что фильтр, наоборот, должен помочь с кавычками-ёлочками. Ведь в исходном тексте для модуля поиска их не будет, а в отфильтрованном варианте они появятся.
Буква "л" имееет код 0xBB, а кавычки - xAB, xBB. В результате, как я понимаю, происходит путаница между двухбайтовыми и однобайтовыми кодами, функция preg_replace и даже mb_preg_replace как-то неправильно это дело обрабатывает, причем с другими двухбайтовыми кодами такого не происходит.
В чем тут дело, я так и не разобрался, может специалисты в PHP знают, чей это глюк, мой или PHP?
как же мне надоела эта буква л
вот код, может кто-нибудь разберется в чем проблема
<?
function kavych ($contents) {
// Copyright (c) Spectator.ru
// замена кавычек в html-тэгах на символ "¬" $contents=preg_replace("/<([^>]*)>/es", "'<'.str_replace ('\\\"', '¬','\\1').'>'", $contents);
// замена кавычек внутри <code> на символ "¬" $contents=preg_replace("/<code>(.*?)<\/code>/es", "'<code>'.str_replace ('\\\"', '¬','\\1').'</cod>'", $contents);
// расстановка кавычек: кавычка, перед которой идет ( или > или пробел = начало слова, // кавычка, после которой не идет пробел = это конец слова.
// расставляем вложенные кавычки // видим: комбинация из идущих двух подряд открывающихся кавычек без закрывающей // значит, вторая кавычка - вложенная. меняем ее и идущую после нее, на вложенную (132 и 147) while(preg_match("/(«)([^»]*)(«)/", $contents))$contents=preg_replace("/(«)([^»]*)(«)([^»]*)(»)/", "\\1\\2„\\4“", $contents);
// тире в начале строки (диалоги) $contents = preg_replace('/([>|\s])- /',"\\1— ", $contents);
// меняем "¬" обратно на кавычки $contents = str_replace('¬','"', $contents);
// предлоги вместе со словом (слово не переносится на другую строку отдельно от предлога) $contents = preg_replace("/ (.) (.)/", " \\1 \\2", $contents);
if you enable the mbstring and mbregex, you can use the ereg_ functions
with regular expressions and UTF-8 strings. preg_ functions are not ever
UTF-8 enabled as far as i'm aware ...
Я непонимаю, как ты внедрил в исходники друпала (которые на английском языке) операторы проверки, которые в качестве образца для сравнения берут строку, содержащую юникодные символы.
ещё один довод, чтобы использовать cp1251. Причём нерабочими будут только модули drupal и agregator (которые лично мне не нужны), но если очень нужно, даже drupal-модуль можно сделать частично рабочим (будет пользователей с других drupal-сайтов прописывать)...
кстати, учитывая то, что utf8 "тяжелее", то сайт в кодировке cp1251 должен быстрее работать, поскольку выдача контента происходит тоже быстрее...
да про юникодность - там просто в скрипте идет перекодировка, потом обработка (расставляются кавычки, тире, спец знаки и т.п.), а потом снова кодируется в юникод чтоб на сайте нормально все видно было. вот тебе и юникод
Комментарии
А .. не работает?
imho это может быть из-за utf8 кодировки.
Я думаю, что с таким вопросом нужно обращаться к авторам. Они лучше знают свою софтину.
--
USU-Lug http://usu-lug.org.ru
да я не том... куда именно вставить код кавычкера, чтобы он расставлял все как надо при постинге?
А при чем здесь Drupal? В описании к проге ведь написано - работает как самостоятельная программа либо как плагин к IE. Если хочется что-то подобное в Drupal - надо модуль-фильтр писать и в нём такую функцию реализовывать.
--
Axel
есть php скрипт Кавычкера
Могу обрадовать - эти самые кавычки и есть одна из причин неправильного поиска на русском в друпале. При индексации текста модуль поиска, естественно, пытается убрать сначала все знаки препинания, скобки, кавычки и прочее. Так вот, именно при убирании угловых кавычек он больше всего гадит с русским языком. Даже заставив нормально работать поиск, мне пришлось от "ёлочек" отказаться. Хотя задача вроде простая - надо скормить функции mb_pregreplace правильное регулярное выражение, но у меня ничего не вышло.
Для всякой типографики по-простому - можно хакнуть какой-нибудь подходящий фильтр, типа textile, marksmarty или wiki. Кстати, marksmarty умеет делать длинные тире.
Вообще-то, поиск, по идее, работает с исходным текстом. Так что фильтр, наоборот, должен помочь с кавычками-ёлочками. Ведь в исходном тексте для модуля поиска их не будет, а в отфильтрованном варианте они появятся.
поставил кавычкер - все расставвляет правильно, почти все...
везде вместо буквы л - ставится �»
может кто знает в чем проблема?
оказывается уже есть модуль-фильтр под это дело. Только вот, правила типографики в нем английские блин.
...эх, надо учить php и регулярные выражения...
Буква "л" имееет код 0xBB, а кавычки - xAB, xBB. В результате, как я понимаю, происходит путаница между двухбайтовыми и однобайтовыми кодами, функция preg_replace и даже mb_preg_replace как-то неправильно это дело обрабатывает, причем с другими двухбайтовыми кодами такого не происходит.
В чем тут дело, я так и не разобрался, может специалисты в PHP знают, чей это глюк, мой или PHP?
как же мне надоела эта буква л
вот код, может кто-нибудь разберется в чем проблема
function kavych ($contents)
{
// Copyright (c) Spectator.ru
// замена кавычек в html-тэгах на символ "¬"
$contents=preg_replace ( "/<([^>]*)>/es", "'<'.str_replace ('\\\"', '¬','\\1').'>'", $contents);
// замена кавычек внутри <code> на символ "¬"
$contents=preg_replace ( "/<code>(.*?)<\/code>/es", "'<code>'.str_replace ('\\\"', '¬','\\1').'</cod>'", $contents);
// расстановка кавычек: кавычка, перед которой идет ( или > или пробел = начало слова,
// кавычка, после которой не идет пробел = это конец слова.
$contents=preg_replace ( "/([>(\s])(\")([^\"]*)([^\s\"(])(\")/", "\\1«\\3\\4»", $contents);
// что, остались в тексте нераставленные кавычки? значит есть вложенные!
if (stristr ($contents, '"')):
// расставляем оставшиеся кавычки (еще раз).
$contents=preg_replace ( "/([>(\s])(\")([^\"]*)([^\s\"(])(\")/", "\\1«\\3\\4»", $contents);
// расставляем вложенные кавычки
// видим: комбинация из идущих двух подряд открывающихся кавычек без закрывающей
// значит, вторая кавычка - вложенная. меняем ее и идущую после нее, на вложенную (132 и 147)
while (preg_match ("/(«)([^»]*)(«)/", $contents)) $contents=preg_replace ( "/(«)([^»]*)(«)([^»]*)(»)/", "\\1\\2„\\4“", $contents);
// конец вложенным кавычкам
endif;
// кавычки снаружу
$contents = preg_replace("/\<a\s+href([^>]*)\>\s*\«([^<^«^»]*)\»\s*\<\/a\>/", "«<a href\\1>\\2</a>»", $contents);
// расстанавливаем правильные коды, тире и многоточия
$contents = str_replace ('«','«', $contents);
$contents = str_replace ('»','»', $contents);
$contents = str_replace (' - ',' — ', $contents);
$contents = str_replace ('...','…', $contents);
// тире в начале строки (диалоги)
$contents = preg_replace ('/([>|\s])- /',"\\1— ", $contents);
// меняем "¬" обратно на кавычки
$contents = str_replace ('¬','"', $contents);
// предлоги вместе со словом (слово не переносится на другую строку отдельно от предлога)
$contents = preg_replace("/ (.) (.)/", " \\1 \\2", $contents);
// дефисы
// $contents = preg_replace("/(\s[^- >]*)-([^ - >]*\s)/", "<nobr>\\1-\\2</nobr>", $contents);
return $contents;
}
?>
я прям в шаблоне, при выводе текст через скрипт пропускаю, всё нормально меняет кроме буквы л...
http://coding.derkeiler.com/Archive/PHP/php.general/2004-12/0108.html
if you enable the mbstring and mbregex, you can use the ereg_ functions
with regular expressions and UTF-8 strings. preg_ functions are not ever
UTF-8 enabled as far as i'm aware ...
Кстати, музыкой навеяло. Чем порекомендуете редактировать исходники? Есть какая-то возможность прикрутить UTF-8 к редактору фара, никто не в курсе?
А зачем utf8 чтобы редактировать исходники? Там все в ascii
--
USU-Lug http://usu-lug.org.ru
(*разглядывая листинг*)
А кавычки-ёлочки там тоже в ASCII?
Если Вы про листинг Mops`а, то это не код Друпала.
В коде Друпала встречаются только 2 языка PHP и Английский.
--
USU-Lug http://usu-lug.org.ru
Ясно. Но тогда непонятно, в чем Mops просит помочь разобраться. Из контекста - в коде, который он внедрил в Drupal.
как я понял этот код не будет правильно работать с UTF, тогда вопросов нет..
Работать может и будет.
Я непонимаю, как ты внедрил в исходники друпала (которые на английском языке) операторы проверки, которые в качестве образца для сравнения берут строку, содержащую юникодные символы.
в общем - сделал щас с собой нет, как дома буду выложу скрипт и как его прикрутить,, попозже может сделаю модуль-фильтр чтоб все красиво было
Нужная штучка.
Вот бы еще виковское форматирование текста к drupal прикрутить...
Я тоже заинтересовался данным скриптом. Можно будет увидеть правильный код и пару предложений куда его вставлять?
ещё один довод, чтобы использовать cp1251. Причём нерабочими будут только модули drupal и agregator (которые лично мне не нужны), но если очень нужно, даже drupal-модуль можно сделать частично рабочим (будет пользователей с других drupal-сайтов прописывать)...
кстати, учитывая то, что utf8 "тяжелее", то сайт в кодировке cp1251 должен быстрее работать, поскольку выдача контента происходит тоже быстрее...
Опоздатушки, перепрятушки. Сказано же, что всё удалось заставить работать несмотря на юникодность.
А после драки кулаками не машут.
да про юникодность - там просто в скрипте идет перекодировка, потом обработка (расставляются кавычки, тире, спец знаки и т.п.), а потом снова кодируется в юникод чтоб на сайте нормально все видно было. вот тебе и юникод
скачать можно отсюда
http://drupal.ru/node/624
Ветка старая, но очень интересная...