活跃的模板 - 添加到头部

时间:2012-04-02 14:28:30

标签: clojure enlive

我的应用程序的某些页面会有自己的js / css包含,所以我想知道如何将这些资源添加到带有Enlive的html文档的head部分。我发现 “附加”变换器,但没有自动转义的“html-append”。或者这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

其他答案可能早于打嗝的打嗝式助手。答案:Enlive templating - Adding CSS includes to <head>。{/ p>

(require '[net.cgrand.enlive-html :as html])

生成HTML节点的功能(简单得多):

(defn include-js [src]
      (first (html/html [:script {:src src}])))

(defn include-css [href]
      (first (html/html [:link {:href href :rel "stylesheet"}])))

使用示例:

;; Example templates/base.html file    
<html>
  <head>
  </head>
  <body>
  </body>
</html>

(def jquery "http://code.jquery.com/jquery-1.11.0.min.js") ; links work as well
(html/deftemplate home-page "templates/base.html"
  []
   [:head] (html/append (map include-css ["css/some_file" "css/index.css"]))
   [:head] (html/append (map include-js [jquery "js/index.js"])))

检查它是否产生正确的HTML:

(print (apply str (home-page)))
;; newlines added by hand for clarity
=> <html>
     <head>
       <link href="css/some_file" rel="stylesheet" />
       <link href="css/index.css" rel="stylesheet" />
       <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
       <script src="js/index.js"></script>
     </head>
     <body>
     </body>

   </html>
   nil

答案 1 :(得分:1)

在Enlive中,您可以在simple HTML中编写模板:

然后只需用enlive模板规则交换内容:

(deftemplate microblog-template
 "net/cgrand/enlive_html/example.html"  
 [title posts]
 [:title] (content title)
 [:h1] (content title)
 [:div.no-msg] #(when (empty? posts) %) 
 [:div.post] #(for [{:keys [title body]} posts]
              (at %
                [:h2 :a] (content title)
                [:p] (content body)))
   [[:a (attr? :href)]] (set-attr :title "it's a link"))

最后,只需返回结果:

(apply str (microblog-template "Hello user!" 
           [{:title "post #1" 
             :body "hello with dangerous chars: <>&"}
            {:title "post #2" 
             :body "dolor ipsum"}]))

因此,在第一个HTML模板中,只需为javascripts和CSS文件编写必要的导入。 请注意,您还可以定义可重复使用的子模板以保持DRY。

答案 2 :(得分:1)

所以,我找到了一种方法来为每个模板添加媒体资源。在我的基本模板中,我有非html标签,我在页面的模板文件中有这样的“更多媒体”部分,需要的东西和片段将它插入到基本模板中(内容),最后我做(解包)。有点棘手,但它有效,并且clojure代码中没有html数据。

答案 3 :(得分:1)

我想我找到了一个解决方案,虽然我远不是一个Enlive专业人士(几周前刚开始),所以请耐心等待。

以下转换假设link-includes<link rel="stylesheet" href="/css/this-page-custom.css">的序列(具有适当的值)。

[:head] (html/append
          (for [link link-includes]
            (-> link
                html/html-snippet)))

tl; dr:我使用lein2开始了一个全新的项目。

jacek:~/sandbox
$ lein2 new stackoverflow/add-to-head-section
Generating a project called stackoverflow/add-to-head-section based on the 'default' template.
To see other templates (app, lein plugin, etc), try `lein help new`.

并将[enlive "1.0.1"]添加到project.clj(加:main命名空间,以便lein2 repl在命名空间中启动):

jacek:~/sandbox/add-to-head-section
$ cat project.clj 
(defproject stackoverflow/add-to-head-section "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [enlive "1.0.1"]]
  :main stackoverflow.add-to-head-section.core)

我从Twitter Bootstrap's Getting Started借用了一个简单的HTML模板,并将其保存在src/stackoverflow/add_to_head_section/index.html中。

jacek:~/sandbox/add-to-head-section
$ cat src/stackoverflow/add_to_head_section/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Bootstrap 101 Template</title>
  </head>
  <body>
    <h1>Hello, world!</h1>
    <script src="http://code.jquery.com/jquery-latest.js"></script>
  </body>
</html>

最后一个难题是在src/stackoverflow/add_to_head_section/core.clj中编写一个Enlive脚本,如下所示:

(ns stackoverflow.add-to-head-section.core
  (:require [net.cgrand.enlive-html :as html]))

(html/deftemplate index-html "stackoverflow/add_to_head_section/index.html"
  [link-includes]
  [:head] (html/append
            (for [link link-includes]
              (-> link
                  html/html-snippet))))

(defn render-index-html []
  (index-html ["<link rel='stylesheet' href='/css/this-page-custom.css'>"
               "<link rel='stylesheet' href='/css/another-custom.css'>"]))

(print (apply str (render-index-html)))

lein2 repl启动后,最后一个print功能启动并打印预期结果。

我可能一直在使用Enlive的sniptest,但正如我所提到的,我还没有习惯它。