-
Notifications
You must be signed in to change notification settings - Fork 28
/
builder.clj
49 lines (46 loc) · 1.71 KB
/
builder.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(ns cljss.builder
(:require [cljss.media :refer [build-media]]
[cljss.collect :as c]
[cljss.utils :as utils]))
(defn status? [[rule value]]
(and (re-matches #"^.*\?$" (name rule))
(map? value)))
(defn build-styles [cls styles]
(c/reset-env! {:cls cls})
(let [pseudo (filterv utils/pseudo? styles)
nested (->> styles
(filterv (comp not utils/pseudo?))
(filterv utils/nested?))
[mstatic mvals] (some-> styles :cljss.core/media build-media)
styles (dissoc styles :cljss.core/media)
styles (filterv #(and (not (utils/pseudo? %)) (not (utils/nested? %))) styles)
[static vals] (c/collect-styles cls styles)
pstyles (->> pseudo
(reduce
(fn [coll [rule styles]]
(conj coll (c/collect-styles (str cls (subs (name rule) 1)) styles)))
[]))
nstyles (->> nested
(reduce
(fn [coll [rule styles]]
(conj coll (c/collect-styles (str cls " " rule) styles)))
[]))
vals (->> pstyles
(mapcat second)
(into vals)
(concat mvals)
(into []))
vals (->> nstyles
(mapcat second)
(into vals))
static (into [static] (map first pstyles))
static (into static (map first nstyles))
static (if mstatic
(conj static mstatic)
static)]
[cls static vals]))
(comment
(build-styles
"hello"
{"&:first-child" {:color "red"}
"a" {:color "blue"}}))