2014-09-10 59 views
0

我想弄清楚如何在Genshi中添加CSS到一些动态生成的标记。我试图避免内联CSS,理想的规则将出现在母文档的<head/>标签中。我正在使用现有的代码,看起来像这样(为了简化,我重写了这个代码,所以我可能会有一些语法错误;但是原创的作品,所以我认为你可以忽略语法错误) :在Genshi(TurboGears 2)中添加小部件(动态)CSS


模板/小工具/ 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

如果你想推出自己的定制解决方案每当widget被渲染,你应该什么地方注册的资源(如在请求中),然后在模板呈现时将它们添加到头标记。这实际上是tw2.core.resources所做的:https://github.com/toscawidgets/tw2.core/blob/develop/tw2/core/resources.py

+0

感谢您的回答。 'tw2.core.CSSLink'和'tw2.core.JSSource'看起来不错,但我不确定如何将它们合并到我的代码中。正如我所解释的,我正在编辑一个合作项目中的现有代码。更改或添加库更加困难。 – Yuval 2014-09-15 11:59:03