clojure enlive

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")