跳转到主要内容

类似于deliverance的实现,仅适用于html输出(没有主题文件)

项目描述

简介

Bumblebee是一个类似于deliverance的html转换框架实现,仅适用于html文档输出。

它不使用xslt,所以不如Diazo快;然而,它实现了在html输出上移动元素这一非常简单的用例。

为什么

因为我几乎不需要完整的deliverance方法来完成我想做的事情。事实上,如果我只是想在一个页面上移动一个元素,通常是一件麻烦事。

如何使用

使用非常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" />

用“#src”替换“#dst”

为元素添加或删除类

<class src="#foo" add="three four" remove="one two" />

从“#foo”中删除类“one”和“two”,并添加类“three”和“four”。

标签

更改标签

<tag src="#foo" tag="p" />

分组

用条件将规则分组在一起

<group if-content="#foo">
    <drop src="#bar" />
</group>

如果“#foo”在文档中,则执行一些规则。

条件

if-content

如果选择器在文档中找到,则执行操作

<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的支持

  • 更好地支持添加新的选择器、条件、规则

  • 更好的解析

  • 更好地处理额外的参数,以便规则可以更容易地缓存

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

Bumblebee-1.0a2.zip (19.1 kB 查看哈希值)

由以下支持