Модуль Типограф

Тема в разделе "DLE", создана пользователем $aSH, 10 янв 2009.

Информация :
Актуальная версия DataLife Engine 11.3
( Final Release v.11.3 | Скачать DataLife Engine | Скачать 11.3 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.2 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. $aSH

    $aSH

    Регистр.:
    3 ноя 2006
    Сообщения:
    536
    Симпатии:
    233
    Основа взята из _http://iskariot.ru/wordpress/typo/ (Типограф для Wordpress - "ВП Типограф Фулл").
    Так что (с) Сергей М.

    Код адаптирован (?) для dle.

    Уже ближе к полноценной интеграции

    \engine\classes\parse.class.php
    после
    PHP:
    if(!defined('DATALIFEENGINE'))
    {
      die(
    "Hacking attempt!");
    }
    вставить
    PHP:
    /* типограф */
    function quotes($qtxt)
    {
        
    $quotes=array('&quot;''&laquo;''&raquo;''«''»''“''„''„''“');
        
    $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|&nbsp;|(?:(?U)<.*>))(--?-?)(?=\s)/" => '$1&mdash;',

            
    //правим неразрывный до тире
            
    "(( |\s|\t|&nbsp;)+&mdash;)" => '&nbsp;&mdash;',
                
            
    // Знак дефиса, ограниченный с обоих сторон цифрами — на знак минуса
            
    '/(?<=\d)-(?=\d)/' => '&minus;',
            
    '/(?<=\s)-(?=\d)/' => '&minus;',
            
    '/(?<=\d)-(?=\s)/' => '&minus;',

    /*
            //диапазоны дат?
            '/(?<=\d{4})(&minus;|-)(?=\d{4})/' => '&mdash;',
    */

            // Неразрывный пробел после инициалов.
            
    '~([А-ЯA-Z]\.)\s?([А-ЯA-Z]\.)\s?([А-Яа-яA-Za-z]+)~s' => '<nobr>$1$2&nbsp;$3</nobr>',
            
    '~([А-Яа-яA-Za-z]+)\s?([А-ЯA-Z]\.)\s?([А-ЯA-Z]\.)~s' => '<nobr>$1&nbsp;$2$3</nobr>',

    /*
            // Русские денежные суммы, расставляя пробелы в нужных местах.
            '~(\d+)\s?(млн.|тыс.|млрд.)?\s?(руб.|коп.)~s'    =>    '$1&nbsp;$2&nbsp;$3',
            '~(\d+)\s?(руб.|коп.)~s'    =>    '$1&nbsp;$2',
    */

    /*
            //Номер версии программы пишем неразрывно с буковкой v.
            '~([vв]\.) ?([0-9])~i' => '$1&nbsp;$2',
            '~(\w) ([vв]\.)~i' => '$1&nbsp;$2',/
    */

    /*
            //до н.э, н.э, заодно фиксится пробел
            "#(\d)\s*(до)\s+(н\.э\.)#i" => "$1&nbsp;$2&nbsp;$3",
            "#\s*(и)\s+(т\.(д|п)\.)#i" => " $1&nbsp;$2",
            "#(\d)\s*(н\.э\.)#i" => "\\1&nbsp;\\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}(?!\.)~"    => "&hellip;",

                
    // Знаки (c), (r), (tm)
                
    '~\((c|C|с|С)\)~i'        => '&copy;',
                
    '~\((r|R)\)~i'            => '<sup><small>&reg;</small></sup>',
                
    '~\((tm|TM|тм|ТМ)\)~i'        => '<sup>&trade;</sup>',

                
    //знак умножения
                
    '~\b(\d+)(x|х)(\d+)\b~'        => '$1&times;$3',

                
    // Спецсимволы для 1/2 1/4 3/4
                
    '~\b1/2\b~'            => '&frac12;',
                
    '~\b1/4\b~'            => '&frac14;',
                
    '~\b3/4\b~'            => '&frac34;',

                
    //Плюс-минус
                
    '~([^\+]|^)\+-~'        => '$1&plusmn;',

                
    //Меры измерения в степени
                
    '~\s(мм|см|м|км|г|кг|т|б|кб|Кб|Мб|Гб|кбит|Кбит|мбит|Мбит|гбит|Гбит)(\d+)\b~'    => '&nbsp;$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',
                
    '~&nbsp;"~'        => ' "',

                
    // Оторвать скобку от слова
                
    '~(\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($source011);
        
    /*
        что означают три циферки...
        1) включает расставление ввложенных кавычек, работает на половину. включить можно при желании
        2) замена разных спецсимволов, например (c), (r), tm
        3) небольшая шлифовка текста
        */
        /* типограф */
    После этого типографируется ВСЕ (новости, комментарии...), что идет через BBCODES редактор

    на данный момент ЕСТЬ не ошибка, а коссяк. скрипт правильно переделывает вложенные кавычки,а потом их исправляет сам двиг. поглядите кому не лень в каком месте это происходит, я уже всю голову изломал
    входной текст
    должно быть
    на деле
     
    Goodcat, Walkman и DiMk@™ нравится это.
  2. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    посмотрел прикольный класс, может нужно будет сделать как в википедии редактор чтобы таблици можно было мутить
     
  3. GauraStyle

    GauraStyle Kot

    Регистр.:
    13 фев 2007
    Сообщения:
    1.496
    Симпатии:
    918
    Ничё непонял чё там типографируеться.
    Можно скрин например или сайт, где посмотреть на сие чудо.
    Там понял что с символами что то, но вот по поводу остального ничё непонял.
    :nezn:
     
  4. $aSH

    $aSH

    Регистр.:
    3 ноя 2006
    Сообщения:
    536
    Симпатии:
    233
    зайди на _http://iskariot.ru/wordpress/typo/ и все прочтешь
     
  5. basct

    basct Постоялец

    Регистр.:
    13 июн 2008
    Сообщения:
    101
    Симпатии:
    46
    Смысл модуля - исправление ошибок в статьях, в соответствии с правилами русской типографии. Пунктуация, грамматика и т.п.
     
  6. Ricona

    Ricona

    Регистр.:
    21 окт 2007
    Сообщения:
    270
    Симпатии:
    97
    Я так понял,что новости типографирються только через добовления через админку,
    А если новости грабером грабить оно будет добовляться или нет????
    Вроде ж через парсер идет :)
     
  7. $aSH

    $aSH

    Регистр.:
    3 ноя 2006
    Сообщения:
    536
    Симпатии:
    233
    в том то и дело, что НУЖНО типограф встраивать в парсер, пока оно работает отдельно
     
  8. dm_mb

    dm_mb

    Регистр.:
    6 июн 2006
    Сообщения:
    610
    Симпатии:
    122
    целсофт отказался весной его встраивать. сказал что он немец и ему вообще русский язык неродной теперь.
     
  9. krott

    krott Читатель

    Заблокирован
    Регистр.:
    5 ноя 2007
    Сообщения:
    95
    Симпатии:
    63
    Если он на самом деле так сказал, кретин полный... Причём здесь вообще он? Его клиенты получается не волнуют вовсе.. Т.к я думаю процент Россиян в списке клиентов по более остальных.

    А по теме скажу - Типограф нужен 100% сейчас мой программист делает сайт какрас на DLE также в нём будет типограф, так что я обязательно по окончанию выложу его в клуб.
     
    $aSH нравится это.
  10. dm_mb

    dm_mb

    Регистр.:
    6 июн 2006
    Сообщения:
    610
    Симпатии:
    122
    издеваетесь? какой типограф, какие запятые и тире... целсофт отказался проверку орфографии прикрутить. вот бы что реально полезно было. pspell и aspell практически на всех хостингах стоит. а движков которые юзают её мало.
     
    Ricona нравится это.
Статус темы:
Закрыта.