2013-06-17 2 views
2

Я пытаюсь создать селектор диапазона и, похоже, не может сойти с земли.Селектор диапазонов в порядке

Я пытаюсь что-то вроде:

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

И просто возвращает прилагаемый HTML. Я ожидаю, что он вернет div с телом «Привет».

Как это сделать?

EDIT

Просто чтобы быть более кратким, это то, что я сделал с 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")) 

Я следую с this tutorial, но он использует фрагмент для соответствия диапазонам. Это необходимо?

Можно ли проверить их только sniptest?

+0

Я могу быть недоразумением, хотя , вы имели в виду (контент «Привет») вместо (контент «Привет»)? –

+0

Нет, я думал, что контент заменит согласованный контент. Это неправильно? – Khanzor

ответ

3

Они называются «селекторами фрагментов» в приветственном выражении и, к сожалению, для ваших целей они не поддерживают content, хотя, если вы завернете их в 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>" 
+0

Спасибо, он не нажимал на меня, что мне нужно было бы сопоставить: .start внутри клона. Но это имеет смысл сейчас :). – Khanzor