Локальный типограф на python — typus β

    diff


    Я уже презентовал свой типограф на хабре. С того момента он несколько обновился: я добавил доки, дифф типографированного результата на сайте и скромненький web api.


    Прежде всего: что это и зачем оно надо?


    Грубо говоря, это субъективщина. Но если вдруг у вас мак, то, скорее всего, вы заметили, что при наборе текста у вас двойной дефис и «простые» кавычки подменяются другими символами. То же самое творится в ворде и других текстовых процессорах.


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


    Вот, собственно, весь аргумент: «такой текст приятно читать». Как правило, большинство зарубежных информационных ресурсов, вроде medium.com, уделяют огромное внимание тому, чтобы текст был оформлен по всем канонам.


    Typus


    Typus — это локальный типограф на Python. Очень долгое время я пользовался веб-сервисом Лебедева, однако задержка в ответе, которая неизменно появляется в работе с удаленным api, просто убивала. Поэтому я решил написать свой.


    Что оно делает


    • заменяет кавычки на типографские
    • расставляет апострафы
    • расставляет короткие, длинные тире и знак минуса
    • заменяет всякие (c) на спец-символы
    • связывает союзы и предлоги неразрывным пробелом со словами, перед которыми они стоят
    • связывает числа с единицами измерения
    • расставляет всякие математические символы
    • ставит знак рубля в некоторых случаях
    • триммит, чистит, в общем, избавляет текст от лишнего «оформления»

    Конечно же, все это конфигурируется (локально). Более-менее полный список с примерами доступен в доках.


    Demo


    Чтобы лучше понять «что происходит», можно поиграться с демкой. «Отреставрированные» части будут подсвечены (не всегда идеально).


    "I don't feel very much like Pooh today..." said Pooh.
    "There there," said Piglet. "I'll bring you tea and honey until you do."
    - A.A. Milne, Winnie-the-Pooh
    
    “I don’t feel very much like Pooh today…” said Pooh.
    “There there,” said Piglet. “I’ll bring you tea and honey until you do.”
    — A. A. Milne, Winnie-the-Pooh
    

    diff


    Стоит отметить, что результат частично зависит от выбранной вами гарнитуры. К примеру, в некоторых нет короткого неразрывного пробела, а в моноширинных многое вообще теряет смысл.


    API


    Ну как api. На самом деле, не знал как назвать. Но может пригодиться:


    $ curl --data "text='foo'&lang=ru" https://byashimov.com/typus/api/v1/                  
    {
      "text": "\u00abfoo\u00bb"
    }

    Исходный код всего сайта (и апи в том числе) доступен на гитхабе.


    Доки


    Довольно подробно расписал что и как работает, до кучи многое покрыто доктестами. Пока только на ломанном английском.


    Планы и вообще


    1. Надо бы написать plugin для InDesign и Illustrator, которые бы общались с API. Идея в том, чтобы можно было по щелчку получить полностью готовый к печати текст в выбранном текст-боксе. Однако, я давно не работаю с этими пакетами, так что, если есть желание, жду вашего пулл-реквеста )
    2. Поддержка Markdown и reStructuredText. Последнее, идеально бы, прикрутить прямо в sphinx-doc, потому что красивые доки — это хорошо и приятно.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 7

      –1
      А расскажите поподробнее, как вы отличаете кавычки в кавычках от двух пар кавычек.
      Вот пример фразы на английском языке:
      "I think," said the rabbit," that so-called "deep hole", as you might say, is not so "deep"."
      Кстати, парсер хабра отформатировал это так:
      «I think,» said the rabbit," that so-called «deep hole», as you might say, is not so «deep»."
      Хотелось бы применить проект для агрегатора новостей, а разные издатели используют разные схемы — где-то прямой и обратный апостроф для прямой речи, где-то двойные кавычки, где-то наклонные кавычки.
        –1

        Сначала идет поиск вложенных кавычек (не содержащих в себе кавычки), затем внешние, пока не закончатся.
        Ваш пример я сам не сразу понял из-за кавычки после rabbit, тайпус тоже )
        Если ее поправить — все гуд:


        “I think,” said the rabbit, “that so-called ‘deep hole’, as you might say, is not so ‘deep’.”
          0

          Ну и все типы кавычек будут заменены на выбранный стиль. Вначале весь этот зоопарк приводится к одному виду.

            0
            Опечатка была допущена специально. Значит, вы всё же как-то отличаете по пунктуации вложенные кавычки и прямую речь ( [A ] B [ C] против [A [ B ] C] ). Вот я и спрашиваю: как именно? Набор регулярных выражений или более сложная грамматика?
              0

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

                0
                Лушче строить полноценное синтаксическое дерево, чем парсить регулярками.
                  0
                  Многократное применение регулярных выражений для ограниченной максимальной глубины рекурсии в подобных задачах эквивалентно синтаксическому дереву, но зачастую работает гораздо быстрее за счёт компилирования регулярных выражений, меньшего количества копирований и созданий временных объектов.
                  С кавычками у нас обычно всего один или два уровня вложенности. Со скобками очень редко больше трёх.

        Only users with full accounts can post comments. Log in, please.