Идиоматический способ визуализации информации о стиле с использованием Clojure Hiccup

Мне нужно собрать информацию о стиле в hiccup, чтобы разместить элемент в месте, указанном переменными "top" и "left". Мой код выглядит так:

(html [: div {: style (str "top" top "; left" left)} "некоторый текст"])

Этот код довольно уродливый. Было бы лучше, если бы hiccup автоматически отображал атрибут "style", используя стандартные правила стиля CSS... Тогда я мог бы написать следующее:

(html [: div {: style {: top top: left left}} "некоторый текст"])

Уже есть библиотека, которая делает это? Или мне нужно свернуть свое собственное решение?

Спасибо Clojurians за любые указатели!

3 ответа

Решение

Вы могли бы написать функцию, которая бы это делала, и она даже была бы немного менее типичной, чем карта. Например:

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

Что позволит вам написать это так...

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

Пример вывода из функции...

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

Как насчет этого:

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

Пока не слишком в Clojure, но подход, основанный на "преобразовании", подобный подходу Enlive, звучит как решение для такого рода потребностей - https://github.com/cgrand/enlive

Другие вопросы по тегам