Кавычкер

Главные вкладки

Лучший ответ

Комментарии

Аватар пользователя axel axel 27 декабря 2004 в 23:22

А при чем здесь Drupal? В описании к проге ведь написано - работает как самостоятельная программа либо как плагин к IE. Если хочется что-то подобное в Drupal - надо модуль-фильтр писать и в нём такую функцию реализовывать.

--
Axel

Аватар пользователя Basielienis Basielienis 28 декабря 2004 в 0:32

Могу обрадовать - эти самые кавычки и есть одна из причин неправильного поиска на русском в друпале. При индексации текста модуль поиска, естественно, пытается убрать сначала все знаки препинания, скобки, кавычки и прочее. Так вот, именно при убирании угловых кавычек он больше всего гадит с русским языком. Даже заставив нормально работать поиск, мне пришлось от "ёлочек" отказаться. Хотя задача вроде простая - надо скормить функции mb_pregreplace правильное регулярное выражение, но у меня ничего не вышло.

Для всякой типографики по-простому - можно хакнуть какой-нибудь подходящий фильтр, типа textile, marksmarty или wiki. Кстати, marksmarty умеет делать длинные тире.

Аватар пользователя Basielienis Basielienis 28 декабря 2004 в 1:09

Вообще-то, поиск, по идее, работает с исходным текстом. Так что фильтр, наоборот, должен помочь с кавычками-ёлочками. Ведь в исходном тексте для модуля поиска их не будет, а в отфильтрованном варианте они появятся.

Аватар пользователя Mops Mops 5 февраля 2005 в 2:19

поставил кавычкер - все расставвляет правильно, почти все...
везде вместо буквы л - ставится �»
может кто знает в чем проблема?

Аватар пользователя Mops Mops 5 февраля 2005 в 4:17

оказывается уже есть модуль-фильтр под это дело. Только вот, правила типографики в нем английские Smile Sad блин.

...эх, надо учить php и регулярные выражения...

Аватар пользователя Basielienis Basielienis 5 февраля 2005 в 8:18

Буква "л" имееет код 0xBB, а кавычки - xAB, xBB. В результате, как я понимаю, происходит путаница между двухбайтовыми и однобайтовыми кодами, функция preg_replace и даже mb_preg_replace как-то неправильно это дело обрабатывает, причем с другими двухбайтовыми кодами такого не происходит.
В чем тут дело, я так и не разобрался, может специалисты в PHP знают, чей это глюк, мой или PHP?

Аватар пользователя Mops Mops 5 февраля 2005 в 11:00

как же мне надоела эта буква л
вот код, может кто-нибудь разберется в чем проблема

<?

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\"(])(\")/", "\\\\3\\4»", $contents);

// что, остались в тексте нераставленные кавычки? значит есть вложенные!
if (stristr ($contents, '"')):

// расставляем оставшиеся кавычки (еще раз).
$contents=preg_replace ( "/([>(\s])(\")([^\"]*)([^\s\"(])(\")/", "\\\\3\\4»", $contents);

// расставляем вложенные кавычки
// видим: комбинация из идущих двух подряд открывающихся кавычек без закрывающей
// значит, вторая кавычка - вложенная. меняем ее и идущую после нее, на вложенную (132 и 147)
 while (preg_match ("/(«)([^»]*)(«)/", $contents)) $contents=preg_replace ( "/(«)([^»]*)(«)([^»]*)(»)/", "\\1\\2&#132;\\4&#147;", $contents);

// конец вложенным кавычкам
endif;

// кавычки снаружу
$contents = preg_replace("/\<a\s+href([^>]*)\>\s*([^<^«^»]*)\s*\<\/a\>/", "&#171;<a href\\1>\\2</a>&#187;", $contents);

// расстанавливаем правильные коды, тире и многоточия

$contents = str_replace ('«','&laquo;', $contents);
$contents = str_replace ('»','&raquo;', $contents);
$contents = str_replace (' - ','&nbsp;&#151; ', $contents);
$contents = str_replace ('...','&hellip;', $contents);

// тире в начале строки (диалоги)
$contents = preg_replace ('/([>|\s])- /',"\\1&#151; ", $contents);

// меняем  "¬" обратно на кавычки
$contents = str_replace ('¬','"', $contents);

// предлоги вместе со словом (слово не переносится на другую строку отдельно от предлога)
 $contents = preg_replace("/ (.) (.)/", " \\1&nbsp;\\2", $contents);

// дефисы
// $contents = preg_replace("/(\s[^- >]*)-([^ - >]*\s)/", "<nobr>\\1-\\2</nobr>", $contents);

return $contents;

}

?>

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

Аватар пользователя PG PG 5 февраля 2005 в 22:06

Кстати, музыкой навеяло. Чем порекомендуете редактировать исходники? Есть какая-то возможность прикрутить UTF-8 к редактору фара, никто не в курсе?

Аватар пользователя PG PG 7 февраля 2005 в 1:42

Работать может и будет.

Я непонимаю, как ты внедрил в исходники друпала (которые на английском языке) операторы проверки, которые в качестве образца для сравнения берут строку, содержащую юникодные символы.

Аватар пользователя Mops Mops 10 февраля 2005 в 11:30

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

Аватар пользователя B.X B.X 11 февраля 2005 в 3:08

ещё один довод, чтобы использовать cp1251. Причём нерабочими будут только модули drupal и agregator (которые лично мне не нужны), но если очень нужно, даже drupal-модуль можно сделать частично рабочим (будет пользователей с других drupal-сайтов прописывать)...

кстати, учитывая то, что utf8 "тяжелее", то сайт в кодировке cp1251 должен быстрее работать, поскольку выдача контента происходит тоже быстрее...

Аватар пользователя PG PG 11 февраля 2005 в 18:30

Опоздатушки, перепрятушки. Сказано же, что всё удалось заставить работать несмотря на юникодность.

А после драки кулаками не машут. Smile

Аватар пользователя Mops Mops 12 февраля 2005 в 14:48

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