- Автор темы
- #1
Основа взята из _http://iskariot.ru/wordpress/typo/ (Типограф для Wordpress - "ВП Типограф Фулл").
Так что (с) Сергей М.
Код адаптирован (?) для dle.
Уже ближе к полноценной интеграции
\engine\classes\parse.class.php
после
вставить
после
вставить
После этого типографируется ВСЕ (новости, комментарии...), что идет через BBCODES редактор
на данный момент ЕСТЬ не ошибка, а коссяк. скрипт правильно переделывает вложенные кавычки,а потом их исправляет сам двиг. поглядите кому не лень в каком месте это происходит, я уже всю голову изломал
входной текст
Так что (с) Сергей М.
Код адаптирован (?) для dle.
Уже ближе к полноценной интеграции
\engine\classes\parse.class.php
после
PHP:
if(!defined('DATALIFEENGINE'))
{
die("Hacking attempt!");
}
PHP:
/* типограф */
function quotes($qtxt)
{
$quotes=array('"', '«', '»', '«', '»', '“', '„', '„', '“');
$qtxt = str_replace($quotes, '"', $qtxt);
$qtxt = preg_replace('/([^=]|\A)""(\.{2,4}[а-яА-Я\w\-]+|[а-яА-Я\w\-]+)/', '$1<typo:quot1>"$2', $qtxt);
$qtxt = preg_replace('/([^=]|\A)"(\.{2,4}[а-яА-Я\w\-]+|[а-яА-Я\w\-]+)/', '$1<typo:quot1>$2', $qtxt);
$qtxt = preg_replace('/([а-яА-Я\w\.\-]+)""([\n\.\?\!, \)][^>]{0,1})/', '$1"</typo:quot1>$2', $qtxt);
$qtxt = preg_replace('/([а-яА-Я\w\.\-]+)"([\n\.\?\!, \)][^>]{0,1})/', '$1</typo:quot1>$2', $qtxt);
$qtxt = preg_replace('/(<\/typo:quot1>[\.\?\!]{1,3})"([\n\.\?\!, \)][^>]{0,1})/', '$1</typo:quot1>$2', $qtxt);
$qtxt = preg_replace('/(<typo:quot1>[а-яА-Я\w\.\- \n]*?)<typo:quot1>(.+?)<\/typo:quot1>/', '$1<typo:quot2>$2</typo:quot2>', $qtxt);
$qtxt = preg_replace('/(<\/typo:quot2>.+?)<typo:quot1>(.+?)<\/typo:quot1>/', '$1<typo:quot2>$2</typo:quot2>', $qtxt);
$qtxt = preg_replace('/(<typo:quot2>.+?<\/typo:quot2>)\.(.+?<typo:quot1>)/', '$1<\/typo:quot1>.$2', $qtxt);
$qtxt = preg_replace('/(<typo:quot2>.+?<\/typo:quot2>)\.(?!<\/typo:quot1>)/', '$1</typo:quot1>.$2$3$4', $qtxt);
$qtxt = preg_replace('/""/', '</typo:quot2></typo:quot1>', $qtxt);
$qtxt = preg_replace('/(?<=<typo:quot2>)(.+?)<typo:quot1>(.+?)(?!<\/typo:quot2>)/', '$1<typo:quot2>$2', $qtxt);
$qtxt = preg_replace('/"/', '</typo:quot1>', $qtxt);
$qtxt = preg_replace('/(<[^>]+)<\/typo:quot\d>/', '$1"', $qtxt);
$qtxt = preg_replace('/(<[^>]+)<\/typo:quot\d>/', '$1"', $qtxt);
$qtxt = preg_replace('/(<[^>]+)<\/typo:quot\d>/', '$1"', $qtxt);
$qtxt = preg_replace('/(<[^>]+)<\/typo:quot\d>/', '$1"', $qtxt);
$qtxt = preg_replace('/(<[^>]+)<\/typo:quot\d>/', '$1"', $qtxt);
$qtxt = preg_replace('/(<[^>]+)<\/typo:quot\d>/', '$1"', $qtxt);
$qtxt = str_replace('<typo:quot1>', "«", $qtxt);
$qtxt = str_replace('</typo:quot1>', "»", $qtxt);
$qtxt = str_replace('<typo:quot2>', "„", $qtxt);
$qtxt = str_replace('</typo:quot2>', "“", $qtxt);
return $qtxt;
}
function typograf($typotxt, $opt_quotes = -1, $opt_spec = -1, $opt_correct = -1)
{
/* ОСНОВА */
$replace=array(
// Знак дефиса или два-три знака дефиса подряд — на знак длинного тире.
// + Нельзя разрывать строку перед тире
// Добавлена обработка диалогов
"/(\s+|^|\n| |(?:(?U)<.*>))(--?-?)(?=\s)/" => '$1—',
//правим неразрывный до тире
"(( |\s|\t| )+—)" => ' —',
// Знак дефиса, ограниченный с обоих сторон цифрами — на знак минуса
'/(?<=\d)-(?=\d)/' => '−',
'/(?<=\s)-(?=\d)/' => '−',
'/(?<=\d)-(?=\s)/' => '−',
/*
//диапазоны дат?
'/(?<=\d{4})(−|-)(?=\d{4})/' => '—',
*/
// Неразрывный пробел после инициалов.
'~([А-ЯA-Z]\.)\s?([А-ЯA-Z]\.)\s?([А-Яа-яA-Za-z]+)~s' => '<nobr>$1$2 $3</nobr>',
'~([А-Яа-яA-Za-z]+)\s?([А-ЯA-Z]\.)\s?([А-ЯA-Z]\.)~s' => '<nobr>$1 $2$3</nobr>',
/*
// Русские денежные суммы, расставляя пробелы в нужных местах.
'~(\d+)\s?(млн.|тыс.|млрд.)?\s?(руб.|коп.)~s' => '$1 $2 $3',
'~(\d+)\s?(руб.|коп.)~s' => '$1 $2',
*/
/*
//Номер версии программы пишем неразрывно с буковкой v.
'~([vв]\.) ?([0-9])~i' => '$1 $2',
'~(\w) ([vв]\.)~i' => '$1 $2',/
*/
/*
//до н.э, н.э, заодно фиксится пробел
"#(\d)\s*(до)\s+(н\.э\.)#i" => "$1 $2 $3",
"#\s*(и)\s+(т\.(д|п)\.)#i" => " $1 $2",
"#(\d)\s*(н\.э\.)#i" => "\\1 \\2",
*/
);
$typotxt=preg_replace(array_keys($replace), array_values($replace), $typotxt);
/*КАВЧКИ*/
if (1==$opt_quotes)
{
/*
РАБОТАЮТ НЕ ДО КОНЦА! В ПРОЦЕССЕ ПОИСКА АНАЛОГОВ/ДОРАБОТКИ
*/
$typotxt = quotes($typotxt);
}
/*СПЕЦСИМВОЛЫ*/
if (1==$opt_spec)
{
$replace=array(
//Многоточие
"~(?<!\.)\.{2,5}(?!\.)~" => "…",
// Знаки (c), (r), (tm)
'~\((c|C|с|С)\)~i' => '©',
'~\((r|R)\)~i' => '<sup><small>®</small></sup>',
'~\((tm|TM|тм|ТМ)\)~i' => '<sup>™</sup>',
//знак умножения
'~\b(\d+)(x|х)(\d+)\b~' => '$1×$3',
// Спецсимволы для 1/2 1/4 3/4
'~\b1/2\b~' => '½',
'~\b1/4\b~' => '¼',
'~\b3/4\b~' => '¾',
//Плюс-минус
'~([^\+]|^)\+-~' => '$1±',
//Меры измерения в степени
'~\s(мм|см|м|км|г|кг|т|б|кб|Кб|Мб|Гб|кбит|Кбит|мбит|Мбит|гбит|Гбит)(\d+)\b~' => ' $1<sup>$2</sup>',
);
$typotxt=preg_replace(array_keys($replace), array_values($replace), $typotxt);
}
/*ИСПРАВЛЕНИЯ*/
if(1==$opt_correct)
{
$replace=array(
//убираем ненужные табуляции и пробелы
"~( |\t)+~" => " ",
//оторвать тире от знаков препинания
'~-([\.;])~' => '- $1',
'~([\.,])- ?~' => '$1 - ',
// Разносим неправильные кавычки
'~([^"]\w+)"(\w+)"~' => '$1 "$2"',
'~"(\w+)"(\w+)~' => '"$1" $2',
'~ "~' => ' "',
// Оторвать скобку от слова
'~(\w)\(~' => '$1 (',
'~\)(\w)~' => ') $1',
//Слепляем скобки со словами
'~(?<![:;8=-])\(\s~s' => '(',
'~\s\)~s' => ')',
//Знаки с предшествующим пробелом... нехорошо!
'~(\S) +([,])~' => '$1$2',
'~([?,!])([-А-Яа-я"])~' => '$1 $2',
//неправильное количество других знаков препинания
"~[,]{2,}~" => ',',
"~[;]{2,}~" => ';',
"~[:]{3,6}~" => ':',
"~[\?]{2}~" => '?',
"~[\?]{4,}~" => '???',
"~[!]{2}~" => '!',
"~[!]{4,}~" => '!!!',
//дважды повторяющиеся слова убираем (выключено)
//"~(\S+)\s\\1~" => "$1",
//многажды повторяющиеся слова убираем (выключено)
//"~(\S+)(\s\\1)+~" => "$1",
);
$typotxt=preg_replace(array_keys($replace), array_values($replace), $typotxt);
}
return $typotxt;
}
/* типограф */
после
PHP:
if ($this->filter_mode) $source = $this->word_filter($source);
PHP:
/* типограф */
$source = typograf($source, 0, 1, 1);
/*
что означают три циферки...
1) включает расставление ввложенных кавычек, работает на половину. включить можно при желании
2) замена разных спецсимволов, например (c), (r), tm
3) небольшая шлифовка текста
*/
/* типограф */
После этого типографируется ВСЕ (новости, комментарии...), что идет через BBCODES редактор
на данный момент ЕСТЬ не ошибка, а коссяк. скрипт правильно переделывает вложенные кавычки,а потом их исправляет сам двиг. поглядите кому не лень в каком месте это происходит, я уже всю голову изломал
входной текст
должно быть"елочки и вложенные "лапки" тратата".
на деле«елочки и вложенные „лапки“ тратата».
«елочки и вложенные «лапки» тратата».