clojure - Agregar a un atributo en Enlive
(2)
¿Es posible agregar un valor a un atributo usando enlive?
ejemplo: tengo esto
<a href="/item/edit/">edit</a>
y me gustaría esto
<a href="/item/edit/123">edit</a>
Actualmente estoy haciendo esto:
(html/defsnippet foo "views/foo.html" [:#main]
[ctxt]
[:a] (html/set-attr :href (str "/item/edit/" (ctxt :id))))
Pero preferiría no insertar la URL en mi código, simplemente agregando el ID a la URL existente.
(html/defsnippet foo "views/foo.html" [:#main]
[ctxt]
[:a@href] (html/append (ctxt :id)))
Siempre puedes escribir tu propio append-attr
en la misma línea que set-attr
. Aquí está mi intento
(defn append-attr
[& kvs]
(fn [node]
(let [in-map (apply array-map kvs)
old-attrs (:attrs node {})
new-attrs (into {} (for [[k v] old-attrs]
[k (str v (get in-map k))]))]
(assoc node :attrs new-attrs))))
Lo que proporciona lo siguiente, al agregar "/bar"
a href
, en la representación de <a href="/foo">A link</a>
de <a href="/foo">A link</a>
((append-attr :href "/bar")
{:tag :a, :attrs {:href "/foo"}, :content "A link"})
;=> {:tag :a, :attrs {:href "/foo/bar"}, :content "A link"}
La respuesta de @ddk es inmediata, pero es posible que prefiera una forma más genérica para resolver el problema
(defn update-attr [attr f & args]
(fn [node]
(apply update-in node [:attrs attr] f args))))
y entonces
(update-attr :href str "123")