enlive教程

Enlive教程

Enlive是应用基于clojure的转换到html文档的类库,基本过程就是定义一个具有一些规则的模板, 每个规则有一个选择符从要分析的
html文档中选择一些节点 和 应用到选择节点转换为新输出文档的转换指令。

这个教程使用repl会话介绍Enlive的主要特性

先看一个简单的例子,假设有文件 t1.html包含下面内容

<html>
<body>
<h1></h1>
</body>
</html>

首先确认类路径中包括clojure.jar clojure-contrib.jar, enlive/src, tagsoup.jar ,然后设置命名空间为

(ns x (:use net.cgrand.enlive-html))

这行代码加载enlive-html 并设置命名空间为x

(html-resource "t1.html")

这行代码 文件中的html内容被分析成节点表示的Hash Map, html-resource载入源从
文件,类路径资源,URL等。

在deftemplate中,html源的类型从参数中推断出来,字符串表示文件, Reader表示reader

定义enlive clojure模板

下一步定义转换html内容的模板

(deftemplate t1 "t1.html" [] [:html] (content "wargh"))

这个模板t1表示转换文件t1.html, 不传递任何参数[], 随后就是转换规则,由多个成对的选择符和指令组成。
在这个例子中,选择html节点且替换它的内容为"wargh"

t1表示一个函数

转换:
为了去执行转换,调用模板函数并传递参数

(apply str (t1)) //

为什么使用(apply str ……?

因为模板函数返回字符串序列,所以需要(apply str [])

我们可能只想替换hl的内容而不是html的所有内容,所以

(deftemplate t1 "t1.html" [hdr] [:hl] (content hdr))

更加详细的例子

需要一个更加详细的html文件

<html>
<body>
<h1>Sample Header</h1>
<div id="d1">
<p class="d"></p>
</div>
<div id="d2">
<ul class="l">
<li>an item</li>
</ul>
</div>
</body>
</html>

我们的目标是创建一个clojure程序将转换这个html通过:

1:替换sample Header

2: 添加一句话道 div#d1

3: 添加 一些项到 div#d2下的ul中

(deftemplate t2 "t2.html"
[hdr para-txt li-items]
[:h1] (content hdr]
[:div#d1 :p] (content para-txt)
[:dic :ul.l :li] (clone-for [item li-items] (content item))))

从低级看:

选择符类似于css选择符。

在使用enlive中使用一些低级的API尝试一些东西是非常有用的, at sniptest就是用于这个


转换指令:

每个规则在左边有一个选择符右边一个转换指令, 转换指令是一个左边选择符选择的节点作为参数,返回节点或者节点序列的函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值