Clojure: оживший deftemplate не может использовать фрагмент
Я пытаюсь создать шаблон, который производит таблицу с некоторыми данными в нем. Данные поступают с карты, определенной в msh-contents.
(require '[net.cgrand.enlive-html :as html])
(def msh-contents {:title "Events mashup",
:data-content [{:title "ICTM Study Group ",
:url "http://some-url.com"}
{:title "Volodja Balzalorsky - Hinko Haas",
:url "http://some- other-url.com"}
]})
;; define snippets based on some divs in the template
(html/defsnippet header-cell (template-div) [:div.Heading :div.Cell][value]
(html/content value))
(html/defsnippet value-cell (template-div) [:div.Row :div.Cell] [value]
(html/content value))
;; define a template
(html/deftemplate mshp "index.html" [cont]
[:div.Heading]
(html/content (for [c (keys (first (:data-content cont)))] (header-cell (name c))))
[:div.Row]
(html/content (map #(value-cell %) (for[e (:data-content cont)] (vals e)))))
Итак, вызывая шаблон в REPL
(mshp msh-contents)
Выдает ошибку: IllegalArgumentException ArityException Неверное количество аргументов (0), переданных: PersistentArrayMap clojure.lang.AFn.throwArity (AFn.java:437), и это, вероятно, потому что фрагменты производят LazySeq.
1 ответ
Это может быть очень глупо, но код прекрасно работает для меня. Единственное отличие, которое я сделал, состояло в том, чтобы представить ваш html в виде нотации hiccup, а затем преобразовать в узлы, что эквивалентно просто предоставлению html-файла (я делаю это, потому что я до сих пор не понял, как именно html-resource
работает и не уверен, где я могу положить файл). Рабочий код ниже:
(require '[net.cgrand.enlive-html :as h])
(def msh-contents {:title "Events mashup",
:data-content [{:title "ICTM Study Group ",
:url "http://some-url.com"}
{:title "Volodja Balzalorsky - Hinko Haas",
:url "http://some- other-url.com"}]})
(defn template-div []
(h/html [:div {:class "Table"}
[:div {:class "Title"}
[:p "This is a Table"]]
[:div {:class "Heading"}
[:div {:class "Cell"}
[:p "Heading 1"]]]
[:div {:class "Row"}
[:div {:class "Cell"}
[:p "Row 1 Column 1"]]]]))
(defn index []
(h/html [:html [:div {:class "Table"}
[:div {:class "Title"}
[:p "This is a Table"]]
[:div {:class "Heading"}
[:div {:class "Cell"}
[:p "Heading 1"]]]
[:div {:class "Row"}
[:div {:class "Cell"}
[:p "Row 1 Column 1"]]]]]))
(h/defsnippet header-cell (template-div) [:div.Heading :div.Cell] [value]
(h/content value))
(h/defsnippet value-cell (template-div) [:div.Row :div.Cell] [value]
(h/content value))
(h/deftemplate mshp (index) [cont]
[:div.Heading]
(h/content (for [c (keys (first (:data-content cont)))] (header-cell (name c))))
[:div.Row]
(h/content (map #(value-cell %) (for[e (:data-content cont)] (vals e)))))
Конечный результат:
(clojure.string/join (mshp msh-contents))
=> "<html><div class=\"Table\"><div class=\"Title\"><p>This is a Table</p></div><div class=\"Heading\"><div class=\"Cell\">title</div><div class=\"Cell\">url</div></div><div class=\"Row\"><div class=\"Cell\">ICTM Study Group http://some-url.com</div><div class=\"Cell\">Volodja Balzalorsky - Hinko Haashttp://some- other-url.com</div></div></div></html>"
Возможно, вы даете defsnippet
плохой источник при выполнении (template-div)
, defsnippet
а также deftemplate
оба принимают узлы. Когда вы даете им файл, как "index.html"
, он преобразует файл в узлы.