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就是用于这个


转换指令:

   每个规则在左边有一个选择符右边一个转换指令, 转换指令是一个左边选择符选择的节点作为参数,返回节点或者节点序列的函数。

你可能感兴趣的:(html,.net,css)