Свершилось — Jevix 1.0


    Jevix — система автоматического применения правил набора текстов (типографика) разработанная в ТМ™ для собственных проектов (Хабр, Кадабра, Дрибблер), с открытым исходным кодом, наделённая способностью унифицировать разметку HTML/XML документов, контролировать перечень допустимых тегов и атрибутов и предотвращать возможные XSS-атаки в коде документов.

    В связи с катастрофической нехваткой времени, не смотря на мои обещания, код версии 1.0 выложен только сегодня. Но зато он всё же вышел! Причём вместе с исправлением вчерашнего хабрабага с перечёркиванием текста.

    Теперь Jevix доступен на google code. Я не поссорился с Juks — автором perl-версии (если кто что подумал) — просто с google code мне работать проще.

    За написание тестового примера огромное спасибо vaart. Без него бы ничего не было.

    Какие произошли изменения (копи-паст из исходника):
    1.00
     + Исправлен баг с закрывающимися тегами приводящий к созданию непарного тега рушащего вёрстку
    1.00 RC2
     + Небольшая чистка кода
    1.00 RC1
     + Добавлен символьный класс Jevix::RUS для определния русских символов 
     + Авторасстановка пробелов после пунктуации только для кирилицы 
     + Добавлена настройка cfgSetTagNoTypography() отключающая типографирование в указанном теге
     + Немного переделан алгоритм обработки кавычек. Он стал более строгим
     + Знак дюйма 33" больше не превращается в открывающуюся кавычку. Однако варриант "мой 24" монитор" - парсер не переварит.
    0.99
     + Расширена функциональность для проверки атрибутов тега: 
       можно указать тип атрибута ( 'colspan'=>'#int', 'value' => '#text' )
       в Jevix, по-умолчанию, определён массив типов для нескольких стандартных атрибутов (src, href, width, height)
    0.98
     + Расширена функциональность для проверки атрибутов тега: 
       можно задавать список дозможных значений атрибута (  'align'=>array('left', 'right', 'center') )
    0.97
     + Обычные "кавычки" сохраняются как "e; если они были так написаны
    0.96
     + Добавлены разрешённые протоколы https и ftp для ссылок (a href="https://...)
    0.95
     + Исправлено типографирование ?.. и !.. (две точки в конце больше не превращаются в троеточие)
     + Отключено автоматическое добавление пробела после точки для латиницы из-за чего невозможно было написать 
       index.php или .htaccess
    0.94
     + Добавлена настройка автодобавления параметров тегов. Непример rel = "nofolow" для ссылок. 
       Спасибо Myroslav Holyak (vbhjckfd at gmail.com)
    


    P.S. Я ни черта не понимаю в лицензиях. Посоветуйте пожалуйста. Мне бы хотелось, чтобы код мог использоваться как в open-source так и в коммерческих проектах с возможностью модификации кода, но, с указанием авторства
    P.P.S. Если есть желание присоединиться к проекту и усовершенствовать его или поработать над документацией — обращайтесь в инбокс
    Поделиться публикацией

    Похожие публикации

    Комментарии 104
      +4
      Отличненько! Давно уже прикрутил к TinyMCE и радостно пользуюсь в проектах.
        +4
        поделитесь
        0
        можно где-то скачать это?
          0
          Ждите.
          Пожалуй, сделаю запись в блоге.

          Уведомлю в данном топике.

          Без проблем.
            0
            Ну как и все остальное в тиниМЦЕ возможно 2-мя способами — автоматом обрабатывать текст после «сохранения» (постпроцессинг) или плагин. В моем случае это почти плагин. Сыроватый. Недоработанный (не учитывает верстку, режет).
              0
              Потестируем, поотлаживаем заодно :)

              Интересно было бы увидеть оба варианта :)
        • НЛО прилетело и опубликовало эту надпись здесь
          +3
          спасибо :)
          отличная штука
            +1
            Спасибо.

            P.S. Я ни черта не понимаю в лицензиях. Посоветуйте пожалуйста

            Только не public domain.
              0
              Ну и как его посмотреть, если исходники скачать с google code нельзя по причине их отсутствия?
                0
                source — browse — trunc
                  0
                  Думаю, нужно так и прописывать ( что-то вроде «Смотрите в trunc»)
                    0
                    Да не, прописывать не нужно, это обычное соглашение о дереве папок в хранилище SubVersion.

                    см. в мануале Subversion.
                  0
                  svn checkout http://jevix.googlecode.com/svn/trunk/


                  Либо скачать из trunk jevix.class.php и папку tests
                  –33
                  а может не стоит своё -дебильное- интеллектуальное типографирование навязывать всем? почему человеку нужно специально что-то писать, чтобы машина не занималась самодеятельностью? тем более с учётом невозможности редактировать коммент или использовать тэги с недостаточной кармой…
                    +3
                    Троль?
                      0
                      стоит на хабре запретить коментить с кармой меньше -5 например…
                        –1
                        ага, все, кому не нравится, что ему срут на голову — толь, лжец и девственник…
                        +2
                        Не хочешь — не катай
                          –1
                          ок, подскажи, как отключить на хабре этот порнотипограф. буду безмерно благодарен!
                            0
                            Ну вообще топик не о типографе на хабре. А просто о типографе, который используется на хабре :)
                            Можешь обрамлять свои тексты в тег pre или code, тогда вроде типограф действовать не должен
                              0
                              мне было интересно отношение разработчиков к посетителям. к сожалению, мои опасения оправдались. разработчики не хотят думать о пользователях. им интересно сделать автотипограф (о боже! конечный автомат на пхп!) и они старательно закрывают глаза на то, что от него больше вреда, чем пользы.

                              использовать тэги я не могу благодаря быдло-кунам. тем не менее, оборачивать все сообщения в pre или code, чтобы типограф банально не портил ссылки, — это безусловно воркэраунд, но проблема не в том, как запостить какой-то контент (впрочем, она тоже довольно актуальна: case.habrahabr.ru/blog/44483/), а в том, чтобы объяснить, что разработчики «do it wrong». проблема видимо нерешаемая…

                              на всякий случай:
                              «pre»
                              «code»
                                +1
                                У вас карма маленькая. Потому что вы человек деструктивный.
                                Все кто хотели конструктива поучаствовали в тестировании парсера или помогли дополнить код (видели сколько изменений).

                                Да с позиции «do it wrong» задача действительно не решаемая. Нельзя изменить мир культивируя к нему отвращение. Его можно изменить другим способом
                                  –1
                                  не деструктивный, а трезвый. я всеми руками за создание вещей, которые делают жизнь пользователя в сети лучше, проще, удобней. и категорически против вещей, которые делают ровно противоположное, чтобы удовлетворить тягу разработчиков к длинному тире и ёлочным кавычкам.
                              +3
                              Очень просто — убить себя ап стену
                          +1
                          (С) 1999-2003г., ООО "Фирма "Эдельвейс". Все права защищены.
                          Она добавила: "И цвет мой самый любимый - "эсмеральда"".
                          ООО "Фирма "Терминал", НИИ "ОблСнабВротКомпот"

                          (пример взят из www.typograf.ru/flog/test1.txt)

                          Если обрабатывать кавычки начиная с последней (с конца документа), то можно решить проблему «тройных» кавычек. И, в некоторых случаях, расставлять знак дюйма для чисел.
                            0
                            Так если в первой строке ошибка, так и в последней оказаться может.
                              +1
                              Не понял о чем вы. Если в тексте ошибка, то тут уж никакой алгоритм не поможет.

                              Попытался описать алгоритм словами, но что-то туго выходит :-)
                              Поэтому, примерный код из моего типографа:
                              for ( $close = 0, $i = -1, $k = strlen( $text ) - 1; $i >= -$k && ( $p = strrpos( $text, '"', $i ) ) !== false; $i = $p - $k ) {
                                if ( $p == $k || ( $p != 0 && strpos( ' (', $text[ $p - 1 ] ) === false && strpos( " ,.?!)<¬]&}\"\n;:-»“", $text[ $p + 1 ] ) !== false ) ) {
                                  $close++;
                                  $text[ $p ] = $close > 1 ? '“' : '»';
                                }
                                else {
                                  $text[ $p ] = $close > 1 ? '„' : '«';
                                  if ( $close != 0 ) {
                                    $close--;
                                  }
                                  elseif ( ( $p1 = strpos( $text, '“', $p ) ) !== false && strpos( $text, '»', $p ) > $p1 ) {
                                    $text[ strrpos( $text, '«', $i ) ] = '„';
                                  }
                                }
                              }
                              $text = str_replace( array( '«', '»', '„', '“' ), array( '«', '»', '„', '“' ), $text );
                            0
                            Долго ждал, спасибо!
                              +1
                              А версия для Perl будет?
                                +2
                                Perl версия скорее всего не будет развиваться. К тому же они сильно разошлись и стали, в принципе, разными проектами. Старая версия доступна на Jevix.ru
                                  0
                                  Очень жаль…
                                    +1
                                    Не стоит верить буквально всему :-)
                                      0
                                      А ты собираешься её развивать дальше?
                                        +2
                                        Я очень много чего собираюсь развивать.

                                        Это — в частности. Особенно если попаду в такое место, где используют Perl.

                                        Вообще, конечно, этому способствовал бы и фидбэк с пожеланиями. На perl-версию его практически нет.
                                          +1
                                          Тогда извиняюсь за дезинформацию
                                          +1
                                          Ты хоть иногда в скайп выходи чтоли, а то ведь вообще никакой связи
                                            +1
                                            ок
                                  +6
                                  P.S. Я ни черта не понимаю в лицензиях. Посоветуйте пожалуйста. Мне бы хотелось, чтобы код мог использоваться как в open-source так и в коммерческих проектах с возможностью модификации кода, но, с указанием авторства

                                  BSD/MIT
                                  0
                                  спасибо!
                                    +1
                                    Успешно использую типограф на своем сайте, написал авторам письмо с просьбой вылать пример настройки с сайта, а мне никто не ответил(

                                    А вообще очень классная штука. Из замеченных багов — преждевременное обрезание ссылок со скобкой (http://4stud.org/blog.php?id=114)
                                      0
                                      И с «тройными» кавычками трабла была, и со знаком дюйма.
                                        +1
                                        Да, от тройных кавычек отказались намеренно, в пользу более качественной работы с двойными.
                                        С дюймами тоже сложно. Дело в том что фильтровать приходится не валидный HTML/XHTML а псевдо-код который пишут пользователи и надо определять это знак >, < или начало тега, то же с кавычками…
                                        +1
                                        Я старался всем ответить. Если про Вас забыл — извините. Было много писем, а я один
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          +1
                                          У меня в .htaccess:
                                          php_value       mbstring.func_overload  7
                                          php_value       default_charset         UTF-8
                                          php_value       mbstring.language       Russian
                                          php_value       mbstring.internal_encoding      UTF-8
                                          php_flag        mbstring.encoding_translation   on
                                          php_value       mbstring.http_input     "UTF-8,CP1251,KOI8-R"
                                          php_value       mbstring.http_output    UTF-8
                                          php_value       mbstring.detect_order   "UTF-8,CP1251,KOI8-R"
                                          
                                            0
                                            php_value mbstring.func_overload 7 не рекомендованно использовать, тк иногда нужно посчитать длинну чего нить в байтах
                                              0
                                              Ну тогда можно не использовать, но заменить функции внутри класса на mb_* эквиваленты
                                          +2
                                          Ваш ченджлог уполз под «Похожие публикации».
                                            0
                                            This project currently has no downloads.

                                            Я что-то не понимаю в Google Code?
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              А они в чём?
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                  0
                                                  Ничего не понял. У меня везде по-умолчанию стоит UTF-8, и файлы в svn-е наверняка тоже в нём. Или нет?
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                              –1
                                              creativecommons.org/about/
                                              Creative Commons License

                                              Если в кратце, то:
                                              «Распространяйте [option: в таком же виде], изменяйте [option: или не изменяйте], пользуйтесь [option: только в некоммерческих целях], только укажите автора.»

                                              Выбор лицензии: creativecommons.org/about/license/
                                                0
                                                Я не хочу запрещать коммерческое использование
                                                  0
                                                  Посмотрите сами. Тут и выбор, и помощь, и ссылки на СС-GNU, СС-LGNU и BSD лицензии.
                                                  creativecommons.org/license/
                                                    +1
                                                    Конечно я сам могу. Некогда вникать, по этому прошу помощи
                                                      +2
                                                      BSD или тот вариант CC где не запрещено коммерческое использование.
                                                      вообще, лучше всё-таки вникнуть хотя бы в BSD.
                                                      кракое содержание BSD — делайте чего хотите, только чтоб был копирайт, условия, и дисклеймер о том, что автора не волнуют ваши прямые или косвенные убытки, и никакой отвественности он за это не несёт.

                                                      пример лицензии вашего шаблонного движка ;)

                                                      Copyright © 2005 Alexey A. Rybak

                                                      Redistribution and use in source and binary forms, with or without
                                                      modification, are permitted provided that the following conditions
                                                      are met:
                                                      1. Redistributions of source code must retain the above copyright
                                                      notice, this list of conditions and the following disclaimer.
                                                      2. Redistributions in binary form must reproduce the above copyright
                                                      notice, this list of conditions and the following disclaimer in the
                                                      documentation and/or other materials provided with the distribution.

                                                      THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                                                      ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                                                      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                                                      ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
                                                      FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                                                      DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                                                      OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                                                      HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                                                      LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                                                      OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                                                      SUCH DAMAGE.
                                                        0
                                                        А BSD не обязывает, как GPL исходный код публиковать?
                                                          0
                                                          так это, написано же всё

                                                          Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

                                                          про исходники как видно ничего нет
                                                            0
                                                            да, важно: приведенный пример — это так называемая BSD-like licence, а тру BSD лицензию можно посмотреть на википедии например
                                                            en.wikipedia.org/wiki/BSD_licenses
                                                  +2
                                                  LGPL
                                                    0
                                                    Что это даёт?
                                                      0
                                                      > Мне бы хотелось, чтобы код мог использоваться как в open-source так и в коммерческих проектах
                                                      > с возможностью модификации кода, но, с указанием авторства

                                                      человек может поюзать ваш код в закрытых проектах, но если он делает изменения или дополнения, то обязан их опубликовать.
                                                        0
                                                        О — это мне нравится. А в коммерческих целях можно?
                                                          0
                                                          можно.
                                                          –1
                                                          И ещё — я не нашёл там LGPL. Вот предлагаемый список:

                                                          Apache License 2.0
                                                          Artistic License/GPL
                                                          Eclipse Public License 1.0
                                                          GNU General Public License v2
                                                          GNU General Public License v3
                                                          GNU Lesser General Public License
                                                          MIT License
                                                          Mozilla Public License 1.1
                                                          New BSD License
                                                            +2
                                                            GNU Lesser General Public License
                                                      +1
                                                      отличный типограф и отличная работа!
                                                        0
                                                        Большое спасибо, хороший продукт от разработчиков любимого ресурса.
                                                          0
                                                          Может быть, поднимете где-то демку?
                                                            +2
                                                            Не, не до этого. Хабр — как одна из демок
                                                              0
                                                              ну могли бы вставить скриншоты какие-нибудь для примера, наглядности и ясности что этот скрипт делает.
                                                            0
                                                            Намекните, как прикрутить к IPB?
                                                              +1
                                                              А как тут дела обстоят с вставкой видео (с youtube, rutube и т.д.)?!?
                                                                0
                                                                0.94
                                                                + Добавлена настройка автодобавления параметров тегов. Непример rel = «nofolow» для ссылок.

                                                                Я надеюсь, вы опечатались и там на самом деле движок пишет «nofollow», а не «nofolow»?
                                                                  +1
                                                                  Движок пишет что укажешь, а я опячатался
                                                                  +1
                                                                  скажите, а то, что абзацы вовсе не размечаются, а только расставляются br'ы — это зачем? может, стоит сделать по выбору?
                                                                    +1
                                                                    особенно учитывая, что у jevix, который на jevix.ru, это есть, хоть и не очень верное — хочется иметь возможность параграфить текст, в котором перенос строки — это и есть абзац; если копировать текст, скажем, из ворда, то там так и будет…
                                                                    +1
                                                                    не особо читабельный код, все свалено в кучу, плохая расширяемость.
                                                                    зато опенсорс, это похвально.

                                                                    успехов в дальнейшей разработке проекта.
                                                                      +3
                                                                      Знаете, я с Вами соглашусь. Оба недочета имеют место быть — это, наверно, один из самых запутаных кодов которые я когда-либо писал. Не буду вдаваться с чем это связано, это и так не сложно понять. Но Jevix оказался востребован, по этому, я его выложил, несмотря на код.
                                                                        0
                                                                        первый раз вижу адекватного автора, спасибо =)
                                                                        я, собственно, написал это не с целью как-то «обкакать» продукт — мне нравятся такие инициативы, а затем, чтобы проект не забрасывали и развивали в сторону улучшения этих аспектов.
                                                                          +3
                                                                          Да, я вовремя я его выложил в opensource, сегодня вечером меня уволили :) По этому насчёт развития сложно теперь прогнозировать что-либо…
                                                                            0
                                                                            за это и уволили?
                                                                              +3
                                                                              Да нет, не за это. Просто совпадение. Троих разом — кризис же. Меня, в частности, за то что слишком откровенно выражаю своё мнение
                                                                                0
                                                                                Даже во время кризиса много кому нужны программисты. Думаю, Вам хорошее место найти будет не трудно, особенно после такой статьи ;)
                                                                                Искренне желаю успеха.
                                                                                  +3
                                                                                  Спасибо. Вот хочу отдаться гуглу
                                                                                  +2
                                                                                  ага, насрали в карму так, что она ушла в минус, а потому пропали такие права как «получать зарплату», «писать код для компании» и «помогать улучшать её продукты» ^_^ знакомо…
                                                                        0
                                                                        Он по-прежнему вырезает неугодные теги, а не оставляет в безопасном виде? Возможно, стоит добавить пункт настроек с выбором нужного варианта.
                                                                          0
                                                                          Рискуя вызвать недовольство всё же спрошу: а почему те тесты, которые входят в комплект, не автоматизированные? Строго говоря, это и не тест даже, а пример использования, верить ему нельзя…
                                                                            0
                                                                            Жаль, что в jevixtest.php нет примера с таблицами, а то вот, сделал:

                                                                            // 1. Устанавливаем разрешённые теги. (Все не разрешенные теги считаются запрещенными.)
                                                                            $jevix->cfgAllowTags(array( 'table', 'tr', 'td', 'tbody', 'th',
                                                                            
                                                                            // 7. Устанавливаем теги, которые может содержать тег контейнер
                                                                            $jevix->cfgSetTagChilds('table', array('tr', 'tbody'), true, true);
                                                                            $jevix->cfgSetTagChilds('tbody', array('tr'), true, true);
                                                                            $jevix->cfgSetTagChilds('tr', array('td', 'th'), true, true);
                                                                            


                                                                            Вроде все работает, но стоит написать, например:

                                                                             <tr>
                                                                                <th> </th>
                                                                              </tr>
                                                                            


                                                                            То jevix теги
                                                                            <tr></tr>
                                                                            удалит, а
                                                                            <th></th>
                                                                            оставит, может кто-нибудь подскажет, как надо сделать, что бы в моем примере удалялись все теги?
                                                                              0
                                                                              Делаю также п.1,7. Но на таблицу не ругается только в том случае, если записываю её в строку без символов перевода строки, т.е. — тогда нормально. Это баг или что-то пропустил?
                                                                                0
                                                                                Я пришел к выводу, что пока еще Jevix таблицы (теги, вложенные во вложенных) обрабатывать не умеет.
                                                                                И еще один интересный баг: Если в пункте 1 разрешить теги $jevix->cfgAllowTags(array( … 'noindex', 'index', 'x', … )); то результаты обработки для каждого из этих тегов будет разный.
                                                                              0
                                                                              Еще добавлю: не пойму, почему в файле jevixtest.php, где прописали правила, не написали правил для таблиц? А то как-то таблицы обошли стороной, может, эта версия их еще не умеет обрабатывать как следует?
                                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                                  0
                                                                                  а нет ли возможности, установить для русского языка одни топографические правила, а для английского другие?

                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                  Самое читаемое