2010-01-24 1 views
3

Несмотря на то, что предлагает отличный способ избежать выхода с использованием фильтров, ни одна из них не делает правильные вещи. Принимая строку:Как правильно выполнить вывод (для XHTML) в mako?

x=u"&\u0092" 

Фильтры сделать следующее:

x    Turns the & into an entity but not the \u0092 (valid XML but not XHTML) 
h    Exactly the same 
u    Escapes both, but obviously uses url escaping 
entities  Only converts named entities, so again only the & is escaped 
decode.latin1 The same 

HTML использует стандартный UNICODE Consortium символьный репертуар, и он оставляет неопределенным (среди прочих) 65 кодов символов (от 0 до 31 включительно и от 127 до 159 включительно)

Кажется, что символы пропущены. Есть идеи?

EDIT

Кажется, для проверки, если я использую файл в автономном режиме. Может ли это быть проблемой Content-Type?

ответ

2

Нет необходимости конвертировать символы Unicode в форму &#xxxx; для работы в HTML, если вы не намеренно используете кодировку ASCII. Это проще и эффективнее для удаления именованных объектов, а затем кодировать всю строку в UTF-8 и записывать ее так. Вероятно, вы должны объявить кодировку, используемую в заголовках HTTP, или в теге <meta>.

EDIT:

Кажется, для проверки, если я использую файл в автономном режиме. Может ли это быть проблемой Content-Type?

Да. Вы можете использовать HTTP-заголовки для обеспечения кодировку UTF-8 или указать его в HTML непосредственно через мета-тег:

<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" /> 
+0

Хотелось бы, чтобы все было так просто, но это не так. I * am * используя UTF-8, и он не будет проверять. – Draemon

+0

Хорошо проверяет как XHTML Strict. Однако у HTML 4 есть проблемы с этим. Вам нужно, чтобы он был не-X HTML? –

+0

Это XHTML Strict, UTF-8 и определяется как правильно с помощью онлайн-и оффлайн-валидаторов w3c. Но онлайн-валидатор говорит мне: «Вы использовали незаконный символ в своем тексте. HTML использует стандартный репертуар персонажа Консорциума UNICODE» – Draemon

1

вопросов Validation в сторону, это полезно, чтобы иметь возможность удалить эти символы (которые не дисплей в любом случае надежно) без обязательно сбежать от чего-нибудь еще. Для этого я добавил следующую функцию `Lib/helpers.py ':

__sgml_invalid = re.compile(r'[\x82-\x8c\x91-\x9c\x9f]', re.UNICODE) 

def sgmlsafe(text): 
    lookup = { 
     130:"&#8218;", #Single Low-9 Quotation Mark 
     131: "&#402;", #Latin Small Letter F With Hook 
     132:"&#8222;", #Double Low-9 Quotation Mark 
     133:"&#8230;", #Horizontal Ellipsis 
     134:"&#8224;", #Dagger 
     135:"&#8225;", #Double Dagger 
     136: "&#710;", #Modifier Letter Circumflex Accent 
     137:"&#8240;", #Per Mille Sign 
     138: "&#352;", #Latin Capital Letter S With Caron 
     139:"&#8249;", #Single Left-Pointing Angle Quotation Mark 
     140: "&#338;", #Latin Capital Ligature OE 
     145:"&#8216;", #Left Single Quotation Mark 
     146:"&#8217;", #Right Single Quotation Mark 
     147:"&#8220;", #Left Double Quotation Mark 
     148:"&#8221;", #Right Double Quotation Mark 
     149:"&#8226;", #Bullet 
     150:"&#8211;", #En Dash 
     151:"&#8212;", #Em Dash 
     152: "&#732;", #Small Tilde 
     153:"&#8482;", #Trade Mark Sign 
     154: "&#353;", #Latin Small Letter S With Caron 
     155:"&#8250;", #Single Right-Pointing Angle Quotation Mark 
     156: "&#339;", #Latin Small Ligature OE 
     159: "&#376;"  #Latin Capital Letter Y With Diaeresis 
     } 

    return __sgml_invalid.sub(lambda x: lookup[ord(x.group())], text) 

И вы можете сделать его доступным в качестве фильтра путем редактирования environment.py:

config['pylons.app_globals'].mako_lookup = TemplateLookup(
    ... 
    imports=[....,'from appname.lib.helpers import sgmlsafe',...] 

Затем он должен быть доступен ваши шаблоны:

${c.content|n,sgmlsafe}