-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhlisp3.hl
92 lines (76 loc) · 2.63 KB
/
hlisp3.hl
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
; this is a comment
(defn partial [f & vals]
(fn [& args] (apply f (cat vals args))))
(defn merge-attrs [elem atrs]
(insert (fn [x xs] (attr xs [(first x) (first (rest x))])) atrs elem))
(defn build-dep-attr [ref on]
(strcat '"data-dep::" ref '":" on))
(defn build-dep-action [sym k]
(strcat '"data-" sym '"::" k))
(defn dep [{ref on} elem]
(def sym (gensym nil))
(insert
(fn [x xs]
(def k (first x))
(def v (first (rest x)))
(if (or (eq k '"ref") (eq k '"on"))
xs
(attr xs [(build-dep-action sym k) v])))
(attrs callee)
(attr-add elem [(build-dep-attr ref on) sym])))
(defn make-dep [event]
(fn [{ref} elem]
(eval (attrs '(dep elem) (conj (attrs callee) ['"on" event])))))
(def on-checked (make-dep '"checked"))
(def on-value (make-dep '"value"))
(def on-validate (make-dep '"validate"))
(defn validate-changed [elem]
(on-value
(meta '"ref" (attr elem '"name"))
(meta '"if" '"$UI.initComplete")
(meta '"validate" '"str($$.value) !== str($this['validate-initial'])")
(attr elem ['"data-validate-initial" (value elem)])))
(defn validate [{pred} elem]
(def not-pred (strcat '"!(" pred '")"))
(on-validate
(meta '"ref" (attr elem '"name"))
(meta '"if" '"$$.validate")
(meta '"validation-error" not-pred)
(meta '"class.validation-error" not-pred)
(meta '"validation-success" pred)
(meta '"class.validation-success" pred)
(on-value
(meta '"ref" (attr elem '"name"))
(meta '"if" '"! $$.validate")
(meta '"validation-error" '"false")
(meta '"class.validation-error" '"false")
(meta '"validation-success" '"false")
(meta '"class.validation-success" '"false")
elem)))
;;-----------------------------------------------------------------------------
;;
;; Ensures that the 'k' attribute exists. If it doesn't then it's given the
;; value 'v'.
;;
(defn attr-ensure-exists [elem k v]
(if (truthy (attr elem k))
elem
(attr elem [k v])))
;;
;; Makes any element act like a radio button.
;;
(defn make-radio [elem name value]
(merge-attrs elem [['"data-name" name] ['"data-type" '"radio"] ['"data-value" value]]))
(defn make-toggler [cont1 trig1 cont2 trig2]
(def sym (gensym nil))
(values
(on-checked
(meta '"ref" sym)
(meta '"hide" '"$$.value == 1")
cont1)
(make-radio trig1 sym '"1")
(on-checked
(meta '"ref" sym)
(meta '"hide" '"$$.value == 2")
(attr cont2 ['"data-hide" '"data-hide"]))
(make-radio trig2 sym '"2")))