类似于释放的实现,只在HTML输出上工作(没有主题文件)
Bumblebee的Python项目详细描述
简介
大黄蜂是一个类似于html转换框架的解救工具。 只对HTML文档的输出起作用的实现。
它不使用xslt,因此不像diazo那样快;但是, 它完成了移动元素的非常简单的用例 在HTML输出上。
为什么
因为我几乎不需要完全的解脱方法 为了我想做的事。事实上,当 我只想在页面上移动一个元素。
如何使用
使用一种非常xml的语法来配置转换。
示例:
HTML:
<html> <head></head> <body> <div id="#header"></div> <div id="content"></div> <div id="footer"></div> </body> </html>
规则XML:
<xml> <block if-content="#content"> <after src="#header" dst="#footer" /> </block> </xml>
运行:
from bumblebee import transform from repoze.xmliter.utils import getHTMLSerializer from bumblebee.xml import convertRules html = getHTMLSerializer(output) rules = convertRules(rules_xml) result = transform(html, rules)
选择器
对于选择元素的XML配置,可以使用CSS选择器(默认) 或者xpath。
要使用xpath,只需将'-path'附加到节点名:
<after src-xpath="/html/body/div[0]" src-xpath="/html/body/div[2]" />
任意HTML
使用此项将HTML插入页面:
<after src-html="" dst="#foo"> <div id="foobar"> <h1>hello, world</h1> </div> </after>
规则
之前
在另一个元素之前移动元素:
<before src="#foo" dst="#bar" />
将“foo”移到“bar”
之后
逐个移动元素:
<after src="#foo" "#bar" />
将“foo”移到“bar”
下降
从dom中删除元素:
<drop src="#foo" />
更换
用另一个元素替换一个元素:
<replace src="#foo" dst="#bar" />
将“dst”替换为“src”
类
从元素中添加或删除类:
<class src="#foo" add="three four" remove="one two" />
从“foo”中删除类“one”和“two”,并添加 三班和四班。
标记
更改标记:
<tag src="#foo" tag="p" />
组
将规则与条件分组:
<group if-content="#foo"> <drop src="#bar" /> </group>
如果文档中有“foo”,则执行一些规则。
条件
如果内容
如果在文档中找到选择器,则执行操作:
<after src="#foo" dst="#bar" if-content="#foo" />
非条件
任何条件都可能因相反的影响而被否定:
<drop src="#foo" if-not-content="#bar" />
延伸
创建规则:
from bumblebee.rules import BaseDouble class Append(BaseDouble): def __call__(self, root): src, dst, skip = self.process_nodes(root) if skip: return None dst = dst[0] for el in dst: dst.append(el) return src from bumblebee.xml import addTag addTag('append', Append)
要使用规则,您可以:
<append src="#foo" dst="#bar" />
创建条件:
from bumblebee.conditions import BaseIf class IfPath(BaseIf): def __init__(self, path, extras={}): super(IfPath, self).__init__(extras) self.path = path def __call__(self, root): req = self.extras['request'] path = req['PATH_INFO'] if self.path.startswith('/'): return path.startswith(self.path) else: return self.path in path from bumblebee.xml import addCondition addCondition('path', IfPath)
要使用此条件,您可以:
<drop src="#foo" if-path="/foo/bar" />
或:
<drop src="#foo" if-not-path="/foo/bar" />
更改日志
1.0a2~(2011-09-22)
- 添加对任意HTML的支持
- 更好地支持添加新的选择器、条件、规则
- 更好的解析
- 更好地处理附加参数,以便规则可以 轻松缓存