我不确定我应该如何接近这一点。我有一个CSS文件列表,我希望将其输入某些内容并获取HTML。例如,
(list "base.css" "index.css" "more_css.css") ;vector might be more appropriate?
应转换为:
<link href="css/base.css" rel="stylesheet" />
<link href="css/index.css" rel="stylesheet" />
<link href="css/more_css.css" rel="stylesheet" />
从那里它应该被附加到<head>
。
defsnippet
几乎看起来合适,但是为该文件的一部分提供了模板文件和选择器。这里生成的HTML不依赖于模板,只生成HTML的东西似乎是合适的。 clone-for
可能会做我想要的循环部分,但我无法弄清楚如何使用它。
答案 0 :(得分:5)
defsnippet
实际上需要Enlive可以理解的任何来源,它不需要是一个文件。特别是,它可以是link
标记模板的内联Enlive样式表示。从版本1.1.0开始,Enlive还提供了一个解析Hiccup样式表示法的帮助器(net.grand.enlive-html/html
);我发现Hiccup风格更方便手工编写,所以这就是我将在下面使用的内容。 (您也可以使用内联HTML字符串将其包装在StringReader
:(java.io.StringReader. "<div></div>")
中。)
以下是代码:
(require '[net.cgrand.enlive-html :as enlive])
(enlive/defsnippet link-css
;; representation of the link tag template:
(enlive/html [:link {:href "" :rel "stylesheet"}])
;; selector is required, :link works fine here:
[:link]
;; this is the parameter vector of the fn defsnippet will generate:
[hrefs]
;; clone-for will generate one link tag for each provided href:
(enlive/clone-for [href hrefs]
[:link]
(enlive/set-attr :href href)))
你会这样使用它:
(->> (link-css ["css/base.css" "css/index.css" "css/more_css.css"])
(enlive/emit*)
(apply str))
;= "<link href=\"css/base.css\" rel=\"stylesheet\" /><link href=\"css/index.css\" rel=\"stylesheet\" /><link href=\"css/more_css.css\" rel=\"stylesheet\" />"
将println
添加到->>
管道的末尾是测试此方法的便捷方式;这是输出(为了清楚起见,手动插入了两个换行符):
<link href="css/base.css" rel="stylesheet" />
<link href="css/index.css" rel="stylesheet" />
<link href="css/more_css.css" rel="stylesheet" />
答案 1 :(得分:0)
可替换地:
(require '[net.cgrand.enlive-html :as enlive])
(defn include-css [href]
(first (enlive/html [:link {:href href :rel "stylesheet"}])))
(map include-css ["css/base.css" "css/index.css" "css/more_css.css"])
;; newlines added by hand for clarity
=> ({:tag :link, :attrs {:href "css/base.css", :rel "stylesheet"}, :content ()}
{:tag :link, :attrs {:href "css/index.css", :rel "stylesheet"}, :content ()}
{:tag :link, :attrs {:href "css/more_css.css", :rel "stylesheet"}, :content ()})
仔细检查它是否产生正确的HTML:
(print (apply str (html/emit* (map include-css ["css/base.css" "css/index.css" "css/more_css.css"]))))
;; newlines added by hand for clarity
=> <link href="css/base.css" rel="stylesheet" />
<link href="css/index.css" rel="stylesheet" />
<link href="css/more_css.css" rel="stylesheet" />
nil