类似于释放的实现,只在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的支持
  • 更好地支持添加新的选择器、条件、规则
  • 更好的解析
  • 更好地处理附加参数,以便规则可以 轻松缓存

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么程序显示空结果?   java应用程序在测试设备上调试时工作正常,但在发布版apk中没有,它没有获得post。来自firebase的类变量   java Android:从主活动按钮确定在listview中选中哪个复选框   在Spring中添加@OneToOne注释时启动ApplicationContext时发生java错误   用JAVA Android实现矩阵计算的最快方法   SpringJava语义有没有更好的编写方法?   java从hashmap中减去两个值后返回最小差值的键?   Java中的静态初始化顺序:Netty 4.0.7的例外   java如何检查用户输入是否为字符串   循环Java计数单词索引   java如何使用以下代码将视频流传输到Android异步Http服务器?   java如何在jtable的所有行中循环   java如何使用maven将unicode插入mysql   java使用安卓加速远程数据检索   java试图模拟麦克风(javax.sound.sampled)   swing SwingWorker从不归还任何东西?(爪哇)   首次在Android Studio上未加载java LibGDX文件   java如何在多个Mysql服务器上设置限制和偏移?   如何防止从java连接到mongodb时登录控制台?