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就是用于这个
转换指令:
每个规则在左边有一个选择符右边一个转换指令, 转换指令是一个左边选择符选择的节点作为参数,返回节点或者节点序列的函数。
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就是用于这个
转换指令:
每个规则在左边有一个选择符右边一个转换指令, 转换指令是一个左边选择符选择的节点作为参数,返回节点或者节点序列的函数。