2012-10-01 4 views
7

Ich muss Stilinformationen innerhalb von Hiccup erstellen, um ein Element an einer Position zu platzieren, die durch die Variablen "top" und "left" angegeben wird. Mein Code sieht so aus:Idiomatische Art des Renderns von Stilinformationen mit Clojure Hiccup

(html [: div {: style (str "top" oben "; links" links)} "some text"])

Dieser Code ist ziemlich hässlich. Es wäre schöner, wenn Schluckauf das Attribut "style" mit Standard-CSS-Stilregeln automatisch gemacht ... Dann könnte ich schreiben folgend:

(html [: div {: style {: oben oben: links left} } "irgendein Text"])

Gibt es bereits eine Bibliothek, die das tut? Oder muss ich meine eigene Lösung rollen?

Danke Clojurians für irgendwelche Hinweise!

Antwort

7

Sie könnten eine Funktion schreiben, die das tun würde, und es wäre sogar etwas weniger tippen als die Karte. Zum Beispiel:

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

Welche Sie es so zu schreiben, würde es ...

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

Beispiel für die Ausgabe von der Funktion ...

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

Dank Bill- ich denke, es von den wenigen Antworten auf diese Frage ist klar, dass „Ihre eigene Lösung Rollen“ die richtige Antwort ist, wie Sie vorschlagen. Ich fragte, weil ich eine Clojure-Bibliothek erstelle, die diese Funktion hinzufügt und sicherstellen wollte, dass ich das Rad nicht "neu erfinde". – drcode

+0

@drcode Ich habe gerade erkannt, wer du bist. Ich habe Land von Lisp und ich liebe es. Vielen Dank! – Bill

+0

Komm über diese 3 Jahre später ... der Code nach (Name kwd) sollte ":" kein leerer Platz sein, um gültige CSS-Syntax für zukünftige Leser zu sein. –

0

Nicht viel in Clojure noch, aber ein auf 'Transformation' basierender Ansatz wie der von Enlive klingt nach der Lösung für diese Art von Bedarf - https://github.com/cgrand/enlive

0

Was dazu:

(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"}) 
Verwandte Themen