PhpHypher - расстановка переносов

Сделал простенький сниппет PhpHypher, который подключает класс для расстановки переносов от Сергея Куракина.

Пользоваться очень просто.
// Обычный вызов:
[[*content:phphypher]]

// Можно указывать длину получаемого текста. Лишний текст будет заменен многоточием.
[[*content:phphypher=`500`]]
Есть один параметр — exclude. Это регулярное выражение для исключения элементов из расстановки переносов. По умолчанию оно выключает все теги pre.

Слово автору:
Алгоритм Ляна-Кнута для автоматической расстановки переносов разработан в 1983 году. Автор алгоритма: Франклин Марк Лян (англ. Franklin Mark Liang), студент профессора Дональда Эрвина Кнута (англ. Donald Ervin Knuth). Впервые алгоритм был применен в издательской системе TeX, автором которой является проф. Дональд Кнут.

Алгоритм работает в два этапа. На первом этапе по словарю переносов строится относительно компактный (в сравнении с исходным словарем) набор правил, позволяющий восстановить все места мягких переносов во всех словах исходного словаря.

Второй этап — собственно расстановка переносов с использованием полученного набора правил. Практика показывает, что в большинстве случаев алгоритм позволяет найти правильные места для переносов даже в тех словах и словоформах, которые в исходном словаре отсутствовали.
Качество расстановки переносов напрямую зависит от качества набора правил, которое, в свою очередь, зависит от полноты и качества исходного словаря переносов.

Первый этап алгоритма — изготовление набора правил, так называемых «паттернов» — реализуется классической программой patgen, которая, однако, требует особого искусства в обращении.

Здесь будем говорить почти исключительно о втором этапе алгоритма Ляна-Кнута — расстановке мягких переносов с использованием готового набора правил. Вопросы первого этапа, не говоря уже о «нулевом», находятся далеко за пределами компетенции автора. Интересующиеся могут почитать учебник по patgen'у и диссертацию Франклина Ляна: Word Hy-phen-a-tion by Com-put-er.

Больше подробностей на сайте автора.
Готовый пакет лежит в репозитории.

Предыдущая заметка
Написал компонент miniPayment


Комментарии ()

  1. Александр Наумов 19 октября 2012, 11:42 # 0
    При сужении окна браузера, переносы переустанавливаются, просто Круто!!!
    1. Василий Наумкин 19 октября 2012, 11:44 # 0
      Посмотрите исходник страницы — магия исчезнет =)
      1. Александр Наумов 19 октября 2012, 12:16 # 0
        ))) А я думал, как так быстро JS рассчитывает и с библиотекой рас­ста­нов­ки пе­ре­но­сов работает.
    2. Viktor Minator 19 октября 2012, 12:10 # 0
      жить стало лучше, жить стало веселей.
      1. Илья Уткин 19 октября 2012, 12:55 # 0
        Супер, незаменимая вещь, когда дизайнер решил использовать в макете выравнивание по обеим сторонам — если переносов нет, то получаются очень большие пробелы в тех строчках, где есть длинные слова.

        Сниппет делает строки примерно одинаковой ширины и гигантские пробелы исчезают.
        1. Антон Слободчук 19 октября 2012, 17:33 # 0
          Спасибо, хорошая штука!
          Но опять же, возвращаясь к поисковикам — адекватно ли они воспринимают такой текст с переносами?
          1. Василий Наумкин 19 октября 2012, 17:47 # 0
            На сколько я вижу — вполне.

            goo.gl/dKeOY — вторая и третья ссылка там все с расставленными переносами.

            Более того, если смотреть код Хромом, или выбирать jQuery — переносов нет. Они видны только при копировании-вставке и в исходном коде страницы.
          2. Максим Франц 23 октября 2012, 18:19 # 0
            Включил на странице и все title картинок стали вида «Это те-сто-вая кар-тин-ка» :)
            1. Василий Наумкин 23 октября 2012, 18:52 # 0
              Используйте параметр &exclude=``.

              Там нужно придумать регулярное выражение, которое будет пропускать все title="".

              Я в этом не силен, но попробуйте !title=\"(.*?)\"!ise
            2. Владимир 27 октября 2012, 20:46 # 0
              Отличная идея и реализация! Все это постепенно превращает веб — верстку в верстку типографскую.
              А вот вопрос, в таком случае: как реализовать заполнение страницы (определенного блока) разбиением текста на колонки, подобно журнальному (газетному, полиграфическому) стандарту верстки, но с «резиновыми» свойствами?
              1. Виталий Батушев 28 октября 2012, 00:20 # 0
                Типа такого что ли: learning-html5.info/CSS3/CSS3_ThreeColumn.html?
                Тогда можно, например, здесь почитать: html5insight.ru/post/22245681441/introduction-to-css3-multi-column
                1. Владимир 28 октября 2012, 01:57 # 0
                  Да, с помощью CSS3 siteis.ru/html-i-css-retsepty/razbivka-teksta-na-kolonki, интересно будет попробовать с авто расстановкой переносов, что бы колонки заполнялись как можно плотнее. Но если кто верстал именно для полиграфии, например в InDesign, то поймет о тех нюансах которые пока ни как в веб верстке не реализовать.
                  1. Виталий Батушев 28 октября 2012, 03:08 # 0
                    Я верстаю в InDesign, начиная с версии 1.0. И что такое правила типографики знаю не по наслышке (http://szam5.com).
              2. Виталий Князь 02 ноября 2013, 16:54 # 0
                [[*content:phphypher]]
                как использовать параметр exclude?
                1. Василий Наумкин 02 ноября 2013, 17:45 # 0
                  Вызови как сниппет и укажи параметры.
                  1. Виталий Князь 18 декабря 2013, 23:09 # 0
                    Есть один параметр — exclude.
                    Как?)
                    1. Василий Наумкин 18 декабря 2013, 23:30 # 0
                      [[phphypher?
                      	&input=`[[*content]]`
                      	&exclude=`!<a(.*?)</a>!ise`
                      ]]
                      
                      Исключаем все ссылки.
                Добавление новых комментариев отключено.