2012-10-01 12 views
7

Necesito construir información de estilo dentro de la falla para colocar un elemento en una ubicación indicada por las variables "superior" e "izquierda". Mi código es el siguiente manera:Forma idiomática de renderizar información de estilo usando Clojure Hiccup

(html [: div {: estilo (str "top" de arriba "; izquierda" izquierda)} "texto"])

Este código es bastante feo. Sería mejor si el hipo creara automáticamente el atributo "estilo" usando reglas de estilo CSS estándar ... Entonces podría escribir lo siguiente:

(html [: div {: style {: top top: left left} } "some text"])

¿Ya hay una biblioteca que hace esto? O, ¿tengo que rodar mi propia solución?

Gracias Clojurians por cualquier punteros!

Respuesta

7

Podría escribir una función que haría eso, e incluso sería un poco menos tipeo que el mapa. Por ejemplo:

(defn style [& info] 
    {:style (.trim (apply str (map #(let [[kwd val] %] 
            (str (name kwd) ":" val "; ")) 
           (apply hash-map info))))}) 

lo que permitiría a escribir así ...

(html [:div (style :top top :left left) "some text"]) 

Ejemplo de salida de la función ...

user=> (style :top 32 :left 14) 
{:style "top: 32; left: 14;"} 
+0

Gracias Facturación- creo que es claro a partir de las pocas respuestas a esta pregunta que "rodar su propia solución" es la respuesta correcta, como usted sugiere. Lo pregunté porque estoy creando una biblioteca de clojure que agrega esta característica y quería asegurarme de no estar "reinventando la rueda". – drcode

+0

@drcode Me acabo de dar cuenta de quién eres. Tengo Land of Lisp y me encanta. ¡Gracias! – Bill

+0

Al leer esto 3 años después ... el código siguiente (nombre kwd) debe ser ":" no es un espacio vacío para ser una sintaxis css válida para futuros lectores. –

0
No

tanto en Clojure sin embargo, pero un enfoque basado en la "transformación" como el de Enlive suena como la solución para este tipo de necesidades: https://github.com/cgrand/enlive

0

Qué tal esto:

(defn style [s] 
    (str/join ";" (map #(str (name %) ":" ((keyword %) s)) (keys s)))) 

(style {:padding  "20px" 
     :background "#e68a00" 
     :color  "white" 
     :font-size "large" 
     :font-weight "bold"}) 
Cuestiones relacionadas