2014-09-10 4 views
0

Я пытаюсь выяснить, как добавить CSS в Genshi к некоторой разметке, которая динамически генерируется. Я пытаюсь избежать встроенного CSS, и в идеале правила появятся в теге <head/> родительского документа.Добавление виджета (динамического) CSS в Genshi (TurboGears 2)

Я работаю с существующим кодом, который выглядит так (я переписал это из оригинала, чтобы упростить, поэтому я мог бы иметь некоторые синтаксические ошибки, но оригинал работает, поэтому я думаю, что вы можете игнорировать синтаксические ошибки, если таковые имеются) :


шаблоны/виджеты/file_widget.html

<html xmlns:py="http://genshi.edgewall.org/" 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
    py:strip=""> 
<head> 
    <style type="text/css"> 
     .file-widget { 
      background-color:#eee; display:inline-block; padding:4px; 
     } 
    </style> 
</head> 
<py:def function="file_widget(file_name)"> 
    <div class=".file-widget"> 
    ... 
    </div> 
</py:def> 
</html> 

widgets.py

class FileWidget: 

... 

    def html(): 
     markup_template = genshi.template.MarkupTemplate(''' 
      <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude"> 
       <xi:include href="my_project/widgets/file_widget.html" /> 
       ${description} 
       ${file_widget(file_name)} 
      </html>''') 
     markup = markup_template.generate(file_name = self.file_name, description = genshi.core.Markup(self.description)) 
     return markup.render('html', doctype = 'html') 

шаблоны/main_page.html

<div py:for='widget in app.widgets'> 
    ${ genshi.core.Markup(widget.html()) } 
</div> 

К сожалению, <style/> тег визуализируется дважды: один раз, как я хочу, чтобы это было, внутри исходного документа <head/>, а затем виджет <head/> снова отображается.

Как изменить код, чтобы правильно включить CSS в нужное место? Поскольку это совместный код, небольшие изменения и более четкий код оценены!

Спасибо за чтение и за вашу помощь.

ответ

1

Возможно, вы захотите использовать библиотеку виджетов, такую ​​как ToscaWidget2, которая предназначена для управления виджетами с ресурсами.

В противном случае вы можете использовать статические файлы структуру, как fanstatic, который обеспечивает поддержку для включения ресурсов: http://www.fanstatic.org/en/1.0a5/quickstart.html#including-resources-with-fanstatic

Если вы хотите, чтобы катить собственное решение, вы должны зарегистрировать ресурсы где-то всякий раз, когда отображение виджета (например, в запросе), а затем добавьте их в тег заголовка при визуализации шаблона. Это на самом деле то, что tw2.core.resources: https://github.com/toscawidgets/tw2.core/blob/develop/tw2/core/resources.py

+0

Спасибо за ответ. 'tw2.core.CSSLink' и' tw2.core.JSSource' выглядят как хорошие кандидаты, но я не уверен, как их включить в мой код выше. Как я объяснил, я редактирую существующий код в совместном проекте. Изменение или добавление библиотек сложнее. – Yuval