Как стать автором
Обновить

Комментарии 19

Насколько я помню, у Лебедева типограф реализован в виде сервиса. А хотелось что-то локальное, чтобы можно было поработать в тишине, без интернета, без почты и других внешних раздражителей…
НЛО прилетело и опубликовало эту надпись здесь
Спасибо, посмотрел — поизучаю. Есть толковое преобразование slug-ов в url. Хотя, я предпочитаю транслитерацию урлов в классический ascii.
НЛО прилетело и опубликовало эту надпись здесь
Определённо + в карму
PS. Чёт я совсем не догоняю на счёт UTF8. Давно уже с такой проблемой не сталкивался
НЛО прилетело и опубликовало эту надпись здесь
Типограф требует, чтобы тип строки в параметрах был utf. По всей видимости, при выполнении переноса строк в {{ portfolio.text|linebreaks|typographus }} фильтр linebreaks отдает что-то отличное от юникода (что странно). Тогда typographus ругается. База у меня mysql в кодировке utf8_unicode_ci.
Посмотрите эту бесплатную библиотеку веб-типографа pridedesign.ru/works/tg/.
if type(string) is not unicode — устаревший способ, правильно: if not isinstance(string, unicode)

Впрочем, эта проверка вообще не нужна: декоратор stringfilter() вызовет force_unicode().

autoescape лучше не выключать, а использовать фильтр safe.
Про isinstance — понял. Будем использовать более новый стиль.

А декоратор почему то не выполняет возложенную на него функцию force_unicode() — конвертацию пришлось дописывать ровно из-за ошибки.
Исправляем ошибки/Пишем правильный фильтр.

1) Патчим typographus.py, иначе он не примет результат работы force_unicode.

В 128 строке заменяем:
if type(string) is not unicode:
на:
if not isinstance(string, unicode):

2) Грамотно пишем фильтр, помня о безопасности (простите, карма не позволяет <pre></pre> использовать):

typographus.py:

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe

from engine.common.typographus import typo

register = template.Library()

@register.filter('typo')
@stringfilter
def do_typo(value, autoescape=False):
____if autoescape:
________value = conditional_escape(value)
____return mark_safe(typo(value))
do_typo.needs_autoescape = True

3) Используем в шаблонах:

{% load typographus %}
{{ variable|typo }}
Спасибо, что делитесь опытом (karma+). Отправлю автору типографа ваши комментарии, да и сам подправлю код в этом посте с указанием вашего авторства.

Подскажите, а почему правильно регистрировать фильтр 'typo', а функция называется 'do_typo'? Просто в примерах доки именование функции схоже с названием фильтра.
Регистрировать можно под любым именем.

Но строчкой
from engine.common.typographus import typo (у вас она должна быть from typographus import typo)
я импортирую в модуль функцию typo, чтобы не было конфликта имен надо функцию-фильтр назвать как-то по-другому. В джанге принято в таких случаях приписывать do_* что я и сделал
Т. е. лучше всего оригинальный typographus.py положить туда где его сможет найти питон (в PYTHONPATH...).
В директории templatetags создать новый файл typograhus.py (лучше бы конечно по-другому назвать, что-нибудь типо typo_filters.py).
В него поместить код фильтра, а нужную функцию typo — импортировать.

Все, пошел спать, а-то мысли сонно спотыкаются на ходу.
Премного благодарствую!
Лучше из-за поддержки правил русского языка (предлоги, абревиатуры...). Кавычки-елочки можно, конечно, и для typogrify сделать. Плюс, авторы самого typographus хотели слить типограф вместе с py-utils (поддержка числительных и пр.). Вобщем, есть ньюансы.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории