2

我正在尝试创建一个范围选择器,但似乎无法起步。

我正在尝试类似的事情:

(sniptest "<div><p class='start'>Hi</p><p class='end'>There</p></div>"
      [{[:.start] [:.end]}] (content "Hello"))

这只是返回提供的 html。我希望它返回一个主体为“Hello”的 div。

我该怎么做呢?

编辑

为了更简洁,这是我用 deftemplate 和一个真正的 html 文件所做的:

HTML

<html>
<head>
  <title></title>
</head>
<body>
  <h1>Not hello</h1>

<div class="start">
 foo
 </div>

 <div class="end">
    bar
 </div>
</body>
</html>

CLJ

(ns compojure-blog-test.views.landing-page
  (:require [net.cgrand.enlive-html :as html]))

(html/deftemplate landing-page "compojure_blog_test/views/landing_page.html"
  [blogs]
  {[:.start] [:.end]} (html/content "Blah blah"))

我正在关注本教程,但它使用一个片段来匹配范围。这是必要的吗?

是否可以用 just 测试这些sniptest

4

1 回答 1

3

这些在现场用语中被称为“片段选择器”,不幸的是它们不content直接支持您的目的,但如果您将它们包装在 a 中,clone-for您可以获得相同的效果。

user> (require '[net.cgrand.enlive-html :as html])
nil
user> (html/sniptest "<div>
                        <p class='before'>before</p>
                        <p class='start'>Hi</p>
                        <p class='end'>There</p>
                        <p class='after'>after</p>
                        <p class='end'>last</p>
                      </div>"
                     {[:.start] [:.end]} (html/clone-for [m ["Hello"]]
                                            [:p] (html/content m)))
"<div>
   <p class=\"before\">before</p>
   <p class=\"start\">Hello</p>
   <p class=\"end\">Hello</p>
   <p class=\"after\">after</p>
   <p class=\"end\">last</p>
 </div>"

这允许您根据片段中的位置做更多有趣的事情

user> (html/sniptest "<div>
                        <p class='before'>before</p>
                        <p class='start'>Hi</p>
                        <p class='end'>There</p>
                        <p class='after'>after</p>
                        <p class='end'>last</p>
                     </div>"
    {[:.start] [:.end]} (html/clone-for [m [["Hello" "Sir"]]]
                           [:p.start] (html/content (first m))
                           [:p.end]   (html/content (last m))))
"<div>
  <p class=\"before\">before</p>
  <p class=\"start\">Hello</p>
  <p class=\"end\">Sir</p>
  <p class=\"after\">after</p>
  <p class=\"end\">last</p>
 </div>"

您也可以使用do->代替clone-for

user> (html/sniptest "<div>
                        <p class='before'>before</p>
                        <p class='start'>Hi</p>
                        <p class='end'>There</p>
                        <p class='after'>after</p>
                        <p class='end'>last</p>
                      </div>"
    {[:.start] [:.end]} (html/do-> (html/content "Hello")))
"<div>
   <p class=\"before\">before</p>
   <p class=\"start\">Hello</p>
   <p class=\"end\">Hello</p>
   <p class=\"after\">after</p>
   <p class=\"end\">last</p>
</div>"
于 2013-06-18T00:41:27.537 回答