Skip to content

Instantly share code, notes, and snippets.

@shaunlebron
Created Dec 15, 2018
Embed
What would you like to do?
parindent on rum
diff --git a/examples/rum/examples.cljs b/examples/rum/examples.cljs
index 70d2a96..e0e5ed3 100644
--- a/examples/rum/examples.cljs
+++ b/examples/rum/examples.cljs
@@ -1,26 +1,26 @@
(ns rum.examples
(:require
- [clojure.string :as str]
- [rum.core :as rum]
- [rum.examples.core :as core]
-
- [rum.examples.timer-static :as timer-static]
- [rum.examples.timer-reactive :as timer-reactive]
- [rum.examples.controls :as controls]
- [rum.examples.binary-clock :as binary-clock]
- [rum.examples.board-reactive :as board-reactive]
- [rum.examples.bmi-calculator :as bmi-calculator]
- [rum.examples.form-validation :as form-validation]
- [rum.examples.inputs :as inputs]
- [rum.examples.refs :as refs]
- [rum.examples.local-state :as local-state]
- [rum.examples.keys :as keys]
- [rum.examples.self-reference :as self-reference]
- [rum.examples.context :as context]
- [rum.examples.custom-props :as custom-props]
- [rum.examples.multiple-return :as multiple-return]
- [rum.examples.portals :as portals]
- [rum.examples.errors :as errors]))
+ [clojure.string :as str]
+ [rum.core :as rum]
+ [rum.examples.core :as core]
+
+ [rum.examples.timer-static :as timer-static]
+ [rum.examples.timer-reactive :as timer-reactive]
+ [rum.examples.controls :as controls]
+ [rum.examples.binary-clock :as binary-clock]
+ [rum.examples.board-reactive :as board-reactive]
+ [rum.examples.bmi-calculator :as bmi-calculator]
+ [rum.examples.form-validation :as form-validation]
+ [rum.examples.inputs :as inputs]
+ [rum.examples.refs :as refs]
+ [rum.examples.local-state :as local-state]
+ [rum.examples.keys :as keys]
+ [rum.examples.self-reference :as self-reference]
+ [rum.examples.context :as context]
+ [rum.examples.custom-props :as custom-props]
+ [rum.examples.multiple-return :as multiple-return]
+ [rum.examples.portals :as portals]
+ [rum.examples.errors :as errors]))
(enable-console-print!)
diff --git a/examples/rum/examples/binary_clock.cljc b/examples/rum/examples/binary_clock.cljc
index 28bbccd..566b007 100644
--- a/examples/rum/examples/binary_clock.cljc
+++ b/examples/rum/examples/binary_clock.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.binary-clock
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;; Binary clock
@@ -35,15 +35,15 @@
msm (-> msec (quot 10) (mod 10))
msl (mod msec 10)]
[:table.bclock
- [:tbody
- [:tr [:td] (bit hl 3) [:th] [:td] (bit ml 3) [:th] [:td] (bit sl 3) [:th] (bit msh 3) (bit msm 3) (bit msl 3)]
- [:tr [:td] (bit hl 2) [:th] (bit mh 2) (bit ml 2) [:th] (bit sh 2) (bit sl 2) [:th] (bit msh 2) (bit msm 2) (bit msl 2)]
- [:tr (bit hh 1) (bit hl 1) [:th] (bit mh 1) (bit ml 1) [:th] (bit sh 1) (bit sl 1) [:th] (bit msh 1) (bit msm 1) (bit msl 1)]
- [:tr (bit hh 0) (bit hl 0) [:th] (bit mh 0) (bit ml 0) [:th] (bit sh 0) (bit sl 0) [:th] (bit msh 0) (bit msm 0) (bit msl 0)]
- [:tr [:th hh] [:th hl] [:th] [:th mh] [:th ml] [:th] [:th sh] [:th sl] [:th] [:th msh] [:th msm] [:th msl]]
- [:tr [:th {:col-span 8} (render-count *bclock-renders)]]]]))
+ [:tbody
+ [:tr [:td] (bit hl 3) [:th] [:td] (bit ml 3) [:th] [:td] (bit sl 3) [:th] (bit msh 3) (bit msm 3) (bit msl 3)]
+ [:tr [:td] (bit hl 2) [:th] (bit mh 2) (bit ml 2) [:th] (bit sh 2) (bit sl 2) [:th] (bit msh 2) (bit msm 2) (bit msl 2)]
+ [:tr (bit hh 1) (bit hl 1) [:th] (bit mh 1) (bit ml 1) [:th] (bit sh 1) (bit sl 1) [:th] (bit msh 1) (bit msm 1) (bit msl 1)]
+ [:tr (bit hh 0) (bit hl 0) [:th] (bit mh 0) (bit ml 0) [:th] (bit sh 0) (bit sl 0) [:th] (bit msh 0) (bit msm 0) (bit msl 0)]
+ [:tr [:th hh] [:th hl] [:th] [:th mh] [:th ml] [:th] [:th sh] [:th sl] [:th] [:th msh] [:th msm] [:th msl]]
+ [:tr [:th {:col-span 8} (render-count *bclock-renders)]]]]))
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (binary-clock) mount-el)))
diff --git a/examples/rum/examples/bmi_calculator.cljc b/examples/rum/examples/bmi_calculator.cljc
index 99fd598..ed6997c 100644
--- a/examples/rum/examples/bmi_calculator.cljc
+++ b/examples/rum/examples/bmi_calculator.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.bmi-calculator
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -36,25 +36,25 @@
(rum/defc bmi-calculator < rum/reactive []
(let [{:keys [weight height bmi] :as data} (calc-bmi (rum/react *bmi-data))
[color diagnose] (cond
- (< bmi 18.5) ["orange" "underweight"]
- (< bmi 25) ["inherit" "normal"]
- (< bmi 30) ["orange" "overweight"]
- :else ["red" "obese"])]
+ (< bmi 18.5) ["orange" "underweight"]
+ (< bmi 25) ["inherit" "normal"]
+ (< bmi 30) ["orange" "overweight"]
+ :else ["red" "obese"])]
(reset! *bmi-data data)
[:div.bmi
- [:div
- "Height: " (int height) "cm"
- (slider :height height 100 220)]
- [:div
- "Weight: " (int weight) "kg"
- (slider :weight weight 30 150)]
- [:div
- "BMI: " (int bmi) " "
- [:span {:style {:color color}} diagnose]
- (slider :bmi bmi 10 50)]]))
+ [:div
+ "Height: " (int height) "cm"
+ (slider :height height 100 220)]
+ [:div
+ "Weight: " (int weight) "kg"
+ (slider :weight weight 30 150)]
+ [:div
+ "BMI: " (int bmi) " "
+ [:span {:style {:color color}} diagnose]
+ (slider :bmi bmi 10 50)]]))
;; After initial mount, all changes will be re-rendered automatically
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (bmi-calculator) mount-el)))
diff --git a/examples/rum/examples/board_reactive.cljc b/examples/rum/examples/board_reactive.cljc
index 9a62733..3e80aca 100644
--- a/examples/rum/examples/board_reactive.cljc
+++ b/examples/rum/examples/board_reactive.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.board-reactive
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;; Reactive drawing board
@@ -24,15 +24,15 @@
(rum/defc board-reactive []
[:div.artboard
- (for [y (range 0 core/board-height)]
- [:div.art-row {:key y}
- (for [x (range 0 core/board-width)]
- ;; this is how one can specify React key for component
- (-> (cell x y)
- (rum/with-key [x y])))])
+ (for [y (range 0 core/board-height)]
+ [:div.art-row {:key y}
+ (for [x (range 0 core/board-width)]
+ ;; this is how one can specify React key for component
+ (-> (cell x y)
+ (rum/with-key [x y])))])
(core/board-stats *board *board-renders)])
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (board-reactive) mount-el)))
diff --git a/examples/rum/examples/context.cljs b/examples/rum/examples/context.cljs
index faa8392..0d365e7 100644
--- a/examples/rum/examples/context.cljs
+++ b/examples/rum/examples/context.cljs
@@ -1,8 +1,8 @@
(ns rum.examples.context
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]
- [cljsjs.prop-types]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]
+ [cljsjs.prop-types]))
;; Components with context that all descendants have access to implicitly.
@@ -14,20 +14,20 @@
(rum/defcc rum-context-comp < { :static-properties { :contextTypes {:color js/PropTypes.string}}}
[comp]
[:span
- { :style { :color (.. comp -context -color) }}
- "Child component uses context to set font color."])
+ { :style { :color (.. comp -context -color) }}
+ "Child component uses context to set font color."])
;; Assume the following component is from our source code.
(def color-theme
{ :child-context (fn [state] {:color @core/*color})
- :static-properties { :childContextTypes {:color js/PropTypes.string} } })
+ :static-properties { :childContextTypes {:color js/PropTypes.string} } })
(rum/defc context < color-theme []
[:div
- [:div "Root component implicitly passes data to descendants."]
- (rum-context-comp)])
+ [:div "Root component implicitly passes data to descendants."]
+ (rum-context-comp)])
(defn mount! [mount-el]
diff --git a/examples/rum/examples/controls.cljc b/examples/rum/examples/controls.cljc
index 8e47b79..8dcc39f 100644
--- a/examples/rum/examples/controls.cljc
+++ b/examples/rum/examples/controls.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.controls
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -19,22 +19,22 @@
;; Raw top-level component, everything interesting is happening inside
(rum/defc controls []
[:dl
- [:dt "Color: "]
- [:dd (input core/*color)]
- ;; Binding another component to the same atom will keep 2 input boxes in sync
- [:dt "Clone: "]
- [:dd (input core/*color)]
- [:dt "Color: "]
- [:dd (core/watches-count core/*color) " watches"]
+ [:dt "Color: "]
+ [:dd (input core/*color)]
+ ;; Binding another component to the same atom will keep 2 input boxes in sync
+ [:dt "Clone: "]
+ [:dd (input core/*color)]
+ [:dt "Color: "]
+ [:dd (core/watches-count core/*color) " watches"]
- [:dt "Tick: "]
- [:dd (input core/*speed) " ms"]
- [:dt "Time:"]
- [:dd (core/watches-count core/*clock) " watches"]
-])
+ [:dt "Tick: "]
+ [:dd (input core/*speed) " ms"]
+ [:dt "Time:"]
+ [:dd (core/watches-count core/*clock) " watches"]
+ ])
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (controls) mount-el)))
diff --git a/examples/rum/examples/core.cljc b/examples/rum/examples/core.cljc
index fcebede..00386cc 100644
--- a/examples/rum/examples/core.cljc
+++ b/examples/rum/examples/core.cljc
@@ -1,6 +1,6 @@
(ns rum.examples.core
(:require
- [rum.core :as rum]))
+ [rum.core :as rum]))
(def *clock (atom 0))
@@ -9,9 +9,9 @@
#?(:clj
- (def formatter
- (doto (java.text.SimpleDateFormat. "HH:mm:ss.SSS")
- (.setTimeZone (java.util.TimeZone/getTimeZone "UTC")))))
+ (def formatter
+ (doto (java.text.SimpleDateFormat. "HH:mm:ss.SSS")
+ (.setTimeZone (java.util.TimeZone/getTimeZone "UTC")))))
(defn format-time [ts]
@@ -20,22 +20,22 @@
#?(:cljs
- (defn el [id]
- (js/document.getElementById id)))
+ (defn el [id]
+ (js/document.getElementById id)))
;; Custom mixin for updating components on timer
;; for cases where you have nothing to subscribe to
(defn periodic-refresh [period]
#?(:cljs
- { :did-mount
- (fn [state]
- (let [react-comp (:rum/react-component state)
- interval (js/setInterval #(rum/request-render react-comp) period)]
- (assoc state ::interval interval)))
- :will-unmount
- (fn [state]
- (js/clearInterval (::interval state))) }
+ { :did-mount
+ (fn [state]
+ (let [react-comp (:rum/react-component state)
+ interval (js/setInterval #(rum/request-render react-comp) period)]
+ (assoc state ::interval interval)))
+ :will-unmount
+ (fn [state]
+ (js/clearInterval (::interval state))) }
:clj {}))
@@ -65,8 +65,8 @@
(rum/defc board-stats < rum/reactive [*board *renders]
[:div.stats
- "Renders: " (rum/react *renders)
- [:br]
- "Board watches: " (watches-count *board)
- [:br]
- "Color watches: " (watches-count *color) ])
+ "Renders: " (rum/react *renders)
+ [:br]
+ "Board watches: " (watches-count *board)
+ [:br]
+ "Color watches: " (watches-count *color) ])
diff --git a/examples/rum/examples/custom_props.cljs b/examples/rum/examples/custom_props.cljs
index 67dc9da..d996bf7 100644
--- a/examples/rum/examples/custom_props.cljs
+++ b/examples/rum/examples/custom_props.cljs
@@ -1,8 +1,8 @@
(ns rum.examples.custom-props
(:require
- [goog.object :as gobj]
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [goog.object :as gobj]
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;; Custom methods and data on the underlying React components.
@@ -22,7 +22,7 @@
(reset! core/*color (rand-color))
(gobj/set this "msgData"
[:div {:style {:color @core/*color}}
- (:msgData props)])
+ (:msgData props)])
(rum/request-render this))}
"Custom methods too. Hover over me!"])})
diff --git a/examples/rum/examples/errors.cljc b/examples/rum/examples/errors.cljc
index 9181348..c0741d2 100644
--- a/examples/rum/examples/errors.cljc
+++ b/examples/rum/examples/errors.cljc
@@ -1,6 +1,6 @@
(ns rum.examples.errors
(:require
- [rum.core :as rum]))
+ [rum.core :as rum]))
(rum/defc faulty-render [msg]
@@ -9,17 +9,17 @@
(rum/defc faulty-mount
< { :did-mount
- (fn [state]
- (let [[msg] (:rum/args state)]
- (throw (ex-info msg {})))) }
+ (fn [state]
+ (let [[msg] (:rum/args state)]
+ (throw (ex-info msg {})))) }
[msg]
"Some test you’ll never see")
(rum/defcs child-error
< { :did-catch
- (fn [state error info]
- (assoc state ::error error)) }
+ (fn [state error info]
+ (assoc state ::error error)) }
[{error ::error, c :rum/react-component} comp msg]
(if (some? error)
[:span "CAUGHT: " (str error)]
@@ -28,10 +28,10 @@
(rum/defc errors []
[:span
- (child-error faulty-render "render error")
- #_(child-error faulty-mount "mount error")])
+ (child-error faulty-render "render error")
+ #_(child-error faulty-mount "mount error")])
#?(:cljs
-(defn mount! [mount-el]
- (rum/mount (errors) mount-el)))
+ (defn mount! [mount-el]
+ (rum/mount (errors) mount-el)))
diff --git a/examples/rum/examples/form_validation.cljs b/examples/rum/examples/form_validation.cljs
index 4978e03..7ad39d2 100644
--- a/examples/rum/examples/form_validation.cljs
+++ b/examples/rum/examples/form_validation.cljs
@@ -1,7 +1,7 @@
(ns rum.examples.form-validation
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
(rum/defc validating-input < rum/reactive [ref f]
@@ -44,12 +44,12 @@
:phone "+7913 000 0000"
:age "22"})]
[:dl
- [:dt "E-mail:"]
- [:dd (validating-input (rum/cursor state :email) #(re-matches #"[^@]+@[^@.]+\..+" %))]
- [:dt "Phone:"]
- [:dd (restricting-input (rum/cursor state :phone) #(re-matches #"[0-9\- +()]*" %))]
- [:dt "Age:"]
- [:dd (restricting-input-native (rum/cursor state :age) #(re-matches #"([1-9][0-9]*)?" %))]]))
+ [:dt "E-mail:"]
+ [:dd (validating-input (rum/cursor state :email) #(re-matches #"[^@]+@[^@.]+\..+" %))]
+ [:dt "Phone:"]
+ [:dd (restricting-input (rum/cursor state :phone) #(re-matches #"[0-9\- +()]*" %))]
+ [:dt "Age:"]
+ [:dd (restricting-input-native (rum/cursor state :age) #(re-matches #"([1-9][0-9]*)?" %))]]))
(defn mount! [mount-el]
diff --git a/examples/rum/examples/inputs.cljc b/examples/rum/examples/inputs.cljc
index 82b2eca..8e537b1 100644
--- a/examples/rum/examples/inputs.cljc
+++ b/examples/rum/examples/inputs.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.inputs
(:require
- [clojure.string :as str]
- [rum.core :as rum]))
+ [clojure.string :as str]
+ [rum.core :as rum]))
(def values (range 1 5))
@@ -11,46 +11,46 @@
[*ref]
(let [value (rum/react *ref)]
[:input { :type "text"
- :value (str value)
- :style { :width 170 }
- :on-change (fn [e] (reset! *ref (long (.. e -currentTarget -value)))) }]))
+ :value (str value)
+ :style { :width 170 }
+ :on-change (fn [e] (reset! *ref (long (.. e -currentTarget -value)))) }]))
(rum/defc checkboxes < rum/reactive
[*ref]
(let [value (rum/react *ref)]
[:div
- (for [v values]
- [:input { :key v
- :type "checkbox"
- :checked (= v value)
- :value v
- :on-click (fn [_] (reset! *ref v)) }])]))
+ (for [v values]
+ [:input { :key v
+ :type "checkbox"
+ :checked (= v value)
+ :value v
+ :on-click (fn [_] (reset! *ref v)) }])]))
(rum/defc radio < rum/reactive
[*ref]
(let [value (rum/react *ref)]
[:div
- (for [v values]
- [:input { :key v
- :type "radio"
- :name "inputs_radio"
- :checked (= v value)
- :value v
- :on-click (fn [_] (reset! *ref v)) }])]))
+ (for [v values]
+ [:input { :key v
+ :type "radio"
+ :name "inputs_radio"
+ :checked (= v value)
+ :value v
+ :on-click (fn [_] (reset! *ref v)) }])]))
(rum/defc select < rum/reactive
[*ref]
(let [value (rum/react *ref)]
[:select
- { :on-change (fn [e] (reset! *ref (long (.. e -target -value))))
- :value (str value) }
- (for [v values]
- [:option { :key v
- :value (str v)}
- v])]))
+ { :on-change (fn [e] (reset! *ref (long (.. e -target -value))))
+ :value (str value) }
+ (for [v values]
+ [:option { :key v
+ :value (str v)}
+ v])]))
(defn next-value [v]
@@ -63,9 +63,9 @@
(rum/defc shuffle-button < rum/reactive
[*ref]
[:button
- { :on-click (fn [_]
- (swap! *ref next-value)) }
- "Next value"])
+ { :on-click (fn [_]
+ (swap! *ref next-value)) }
+ "Next value"])
(rum/defc value < rum/reactive
@@ -76,15 +76,15 @@
(rum/defc inputs []
(let [*ref (atom 1)]
[:dl
- [:dt "Input"] [:dd (reactive-input *ref)]
- [:dt "Checks"] [:dd (checkboxes *ref)]
- [:dt "Radio"] [:dd (radio *ref)]
- [:dt "Select"] [:dd (select *ref)]
- [:dt (value *ref)] [:dd (shuffle-button *ref)]]))
+ [:dt "Input"] [:dd (reactive-input *ref)]
+ [:dt "Checks"] [:dd (checkboxes *ref)]
+ [:dt "Radio"] [:dd (radio *ref)]
+ [:dt "Select"] [:dd (select *ref)]
+ [:dt (value *ref)] [:dd (shuffle-button *ref)]]))
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (inputs) mount-el)))
diff --git a/examples/rum/examples/keys.cljc b/examples/rum/examples/keys.cljc
index b81c6c8..76c508d 100644
--- a/examples/rum/examples/keys.cljc
+++ b/examples/rum/examples/keys.cljc
@@ -1,8 +1,8 @@
(ns rum.examples.keys
(:refer-clojure :exclude [keys])
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
(rum/defc keyed
@@ -14,13 +14,13 @@
(rum/defc keys []
[:div
- (list
- (keyed "a" 1)
- (keyed "a" 2)
- (keyed "b" 1)
- (rum/with-key (keyed "a" 1) "x"))])
+ (list
+ (keyed "a" 1)
+ (keyed "a" 2)
+ (keyed "b" 1)
+ (rum/with-key (keyed "a" 1) "x"))])
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (keys) mount-el)))
diff --git a/examples/rum/examples/local_state.cljc b/examples/rum/examples/local_state.cljc
index e204912..ea8f1e3 100644
--- a/examples/rum/examples/local_state.cljc
+++ b/examples/rum/examples/local_state.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.local-state
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;; Local component state
@@ -18,5 +18,5 @@
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (local-state "Clicks count") mount-el)))
diff --git a/examples/rum/examples/multiple_return.cljc b/examples/rum/examples/multiple_return.cljc
index 1547ad8..f771ffe 100644
--- a/examples/rum/examples/multiple_return.cljc
+++ b/examples/rum/examples/multiple_return.cljc
@@ -13,5 +13,5 @@
#?(:cljs
-(defn mount! [mount-el]
- (rum/hydrate (ulist (multiple-return)) mount-el)))
+ (defn mount! [mount-el]
+ (rum/hydrate (ulist (multiple-return)) mount-el)))
diff --git a/examples/rum/examples/portals.cljc b/examples/rum/examples/portals.cljc
index 054967b..ea157c9 100644
--- a/examples/rum/examples/portals.cljc
+++ b/examples/rum/examples/portals.cljc
@@ -1,26 +1,26 @@
(ns rum.examples.portals
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
(rum/defc portal [*clicks]
[:div
- { :on-click (fn [_] (swap! *clicks inc))
- :style { :user-select "none", :cursor "pointer" }}
- "[ PORTAL Clicks: " @*clicks " ]"])
+ { :on-click (fn [_] (swap! *clicks inc))
+ :style { :user-select "none", :cursor "pointer" }}
+ "[ PORTAL Clicks: " @*clicks " ]"])
(rum/defcs root
< (rum/local 0 ::*clicks)
[{*clicks ::*clicks}]
[:div
- { :on-click (fn [_] (swap! *clicks inc))
- :style { :user-select "none", :cursor "pointer" } }
- "[ ROOT Clicks: " @*clicks " ]"
- #?(:cljs (rum/portal (portal *clicks) (core/el "portal-off-root")))])
+ { :on-click (fn [_] (swap! *clicks inc))
+ :style { :user-select "none", :cursor "pointer" } }
+ "[ ROOT Clicks: " @*clicks " ]"
+ #?(:cljs (rum/portal (portal *clicks) (core/el "portal-off-root")))])
#?(:cljs
-(defn mount! [mount-el]
- (rum/hydrate (root) mount-el)))
+ (defn mount! [mount-el]
+ (rum/hydrate (root) mount-el)))
diff --git a/examples/rum/examples/refs.cljc b/examples/rum/examples/refs.cljc
index 0640c64..8a7e2dd 100644
--- a/examples/rum/examples/refs.cljc
+++ b/examples/rum/examples/refs.cljc
@@ -1,34 +1,34 @@
(ns rum.examples.refs
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
(rum/defcc ta
< { :after-render
- (fn [state]
- (let [ta (rum/ref-node state "ta")]
- (set! (.-height (.-style ta)) "0")
- (set! (.-height (.-style ta)) (str (+ 2 (.-scrollHeight ta)) "px")))
- state) }
+ (fn [state]
+ (let [ta (rum/ref-node state "ta")]
+ (set! (.-height (.-style ta)) "0")
+ (set! (.-height (.-style ta)) (str (+ 2 (.-scrollHeight ta)) "px")))
+ state) }
[comp]
[:textarea
- { :ref :ta
- :style { :width "100%"
- :padding "10px"
- :font "inherit"
- :outline "none"
- :resize "none"}
- :default-value "Auto-resizing\ntextarea"
- :placeholder "Auto-resizing textarea"
- :on-change (fn [_] (rum/request-render comp)) }])
+ { :ref :ta
+ :style { :width "100%"
+ :padding "10px"
+ :font "inherit"
+ :outline "none"
+ :resize "none"}
+ :default-value "Auto-resizing\ntextarea"
+ :placeholder "Auto-resizing textarea"
+ :on-change (fn [_] (rum/request-render comp)) }])
(rum/defc refs []
[:div
- (ta)])
+ (ta)])
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (refs) mount-el)))
diff --git a/examples/rum/examples/self_reference.cljc b/examples/rum/examples/self_reference.cljc
index 837889f..400f06c 100644
--- a/examples/rum/examples/self_reference.cljc
+++ b/examples/rum/examples/self_reference.cljc
@@ -1,6 +1,6 @@
(ns rum.examples.self-reference
(:require
- [rum.core :as rum]))
+ [rum.core :as rum]))
;; Self-referencing component
@@ -9,12 +9,12 @@
(rum/defc self-reference < rum/static
([form] (self-reference form 0))
([form depth]
- (let [offset {:style {:margin-left (* 10 depth)}}]
- (if (sequential? form)
- [:.branch offset (map #(rum/with-key (self-reference % (inc depth)) (str %)) form)]
- [:.leaf offset (str form)]))))
+ (let [offset {:style {:margin-left (* 10 depth)}}]
+ (if (sequential? form)
+ [:.branch offset (map #(rum/with-key (self-reference % (inc depth)) (str %)) form)]
+ [:.leaf offset (str form)]))))
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (self-reference [:a [:b [:c :d [:e] :g]]]) mount-el)))
diff --git a/examples/rum/examples/timer_reactive.cljc b/examples/rum/examples/timer_reactive.cljc
index 415da2a..e7a8aa2 100644
--- a/examples/rum/examples/timer_reactive.cljc
+++ b/examples/rum/examples/timer_reactive.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.timer-reactive
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -15,12 +15,12 @@
(rum/defc timer-reactive < rum/reactive []
[:div "Reactive: "
- ;; Subscribing to atom changes with rum/react
- ;; Then pass _dereferenced values_ to static component
- (colored-clock (rum/react core/*clock) (rum/react core/*color))])
+ ;; Subscribing to atom changes with rum/react
+ ;; Then pass _dereferenced values_ to static component
+ (colored-clock (rum/react core/*clock) (rum/react core/*color))])
;; After initial mount, all changes will be re-rendered automatically
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (timer-reactive) mount-el)))
diff --git a/examples/rum/examples/timer_static.cljc b/examples/rum/examples/timer_static.cljc
index 64eaf22..254eaa4 100644
--- a/examples/rum/examples/timer_static.cljc
+++ b/examples/rum/examples/timer_static.cljc
@@ -1,7 +1,7 @@
(ns rum.examples.timer-static
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -10,14 +10,14 @@
(rum/defc timer-static < rum/static [label ts]
[:div label ": "
- [:span {:style {:color @core/*color}} (core/format-time ts)]])
+ [:span {:style {:color @core/*color}} (core/format-time ts)]])
#?(:cljs
-(defn mount! [mount-el]
+ (defn mount! [mount-el]
(rum/hydrate (timer-static "Static" @core/*clock) mount-el)
- ;; Setting up watch manually,
- ;; force top-down re-render via mount
- (add-watch core/*clock :timer-static
- (fn [_ _ _ new-val]
+ ;; Setting up watch manually,
+ ;; force top-down re-render via mount
+ (add-watch core/*clock :timer-static
+ (fn [_ _ _ new-val]
(rum/hydrate (timer-static "Static" new-val) mount-el)))))
diff --git a/examples/rum/examples_page.clj b/examples/rum/examples_page.clj
index 8b44b40..e79e0d2 100644
--- a/examples/rum/examples_page.clj
+++ b/examples/rum/examples_page.clj
@@ -1,23 +1,23 @@
(ns rum.examples-page
(:require
- [rum.core :as rum]
- [rum.examples.core :as core]
- [rum.examples.timer-reactive :as timer-reactive]
- [rum.examples.timer-static :as timer-static]
- [rum.examples.controls :as controls]
- [rum.examples.binary-clock :as binary-clock]
- [rum.examples.board-reactive :as board-reactive]
- [rum.examples.bmi-calculator :as bmi-calculator]
- [rum.examples.inputs :as inputs]
- [rum.examples.refs :as refs]
- [rum.examples.local-state :as local-state]
- [rum.examples.keys :as keys]
- [rum.examples.self-reference :as self-reference]
- [rum.examples.multiple-return :as multiple-return]
- [rum.examples.errors :as errors]))
+ [rum.core :as rum]
+ [rum.examples.core :as core]
+ [rum.examples.timer-reactive :as timer-reactive]
+ [rum.examples.timer-static :as timer-static]
+ [rum.examples.controls :as controls]
+ [rum.examples.binary-clock :as binary-clock]
+ [rum.examples.board-reactive :as board-reactive]
+ [rum.examples.bmi-calculator :as bmi-calculator]
+ [rum.examples.inputs :as inputs]
+ [rum.examples.refs :as refs]
+ [rum.examples.local-state :as local-state]
+ [rum.examples.keys :as keys]
+ [rum.examples.self-reference :as self-reference]
+ [rum.examples.multiple-return :as multiple-return]
+ [rum.examples.errors :as errors]))
(def page (str
-"<!doctype html>
+ "<!doctype html>
<html>
<head>
<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>
diff --git a/perf/rum/perf.clj b/perf/rum/perf.clj
index 77334b3..3c1ad4c 100644
--- a/perf/rum/perf.clj
+++ b/perf/rum/perf.clj
@@ -1,11 +1,11 @@
(ns rum.perf
(:require
- [rum.core :as rum]
- [clojure.string :as str]
- [net.cgrand.enlive-html :as enlive]
- [clojure.test :refer [deftest]]
- [criterium.core :as criterium]
- [hiccup.core :as hiccup]))
+ [rum.core :as rum]
+ [clojure.string :as str]
+ [net.cgrand.enlive-html :as enlive]
+ [clojure.test :refer [deftest]]
+ [criterium.core :as criterium]
+ [hiccup.core :as hiccup]))
(def ^:dynamic *convert-style?* true)
diff --git a/project.clj b/project.clj
index 70d0a88..d1e6219 100644
--- a/project.clj
+++ b/project.clj
@@ -1,7 +1,7 @@
(defproject rum "0.11.3"
:description "ClojureScript wrapper for React"
:license { :name "Eclipse"
- :url "http://www.eclipse.org/legal/epl-v10.html" }
+ :url "http://www.eclipse.org/legal/epl-v10.html" }
:url "https://github.com/tonsky/rum"
:dependencies
@@ -14,15 +14,15 @@
:plugins [ [lein-cljsbuild "1.1.7"] ]
:profiles {
- :dev { :source-paths ["examples"]
- :dependencies [[cljsjs/react-dom-server "16.2.0-3"]
- [cljsjs/prop-types "15.6.0-0"]
- [clj-diffmatchpatch "0.0.9.3" :exclusions [org.clojure/clojure]]] }
- :perf { :source-paths ["perf"]
- :dependencies
- [[enlive "1.1.6"]
- [criterium "0.4.4"]
- [hiccup "1.0.5"]] } }
+ :dev { :source-paths ["examples"]
+ :dependencies [[cljsjs/react-dom-server "16.2.0-3"]
+ [cljsjs/prop-types "15.6.0-0"]
+ [clj-diffmatchpatch "0.0.9.3" :exclusions [org.clojure/clojure]]] }
+ :perf { :source-paths ["perf"]
+ :dependencies
+ [[enlive "1.1.6"]
+ [criterium "0.4.4"]
+ [hiccup "1.0.5"]] } }
:aliases {"package" ["do" ["clean"] ["test"] ["clean"] ["cljsbuild" "once" "advanced"] ["run" "-m" "rum.examples-page"]]
"perf" ["with-profile" "perf" "run" "-m" "rum.perf"]}
@@ -30,38 +30,38 @@
:cljsbuild
{ :builds
- [{ :id "advanced"
- :source-paths ["src" "examples" "test"]
- :compiler
- { :main rum.examples
- :output-to "target/main.js"
- :optimizations :advanced
- :source-map "target/main.js.map"
- :pretty-print false
- :compiler-stats true
- :parallel-build true }}
+ [{ :id "advanced"
+ :source-paths ["src" "examples" "test"]
+ :compiler
+ { :main rum.examples
+ :output-to "target/main.js"
+ :optimizations :advanced
+ :source-map "target/main.js.map"
+ :pretty-print false
+ :compiler-stats true
+ :parallel-build true }}
- { :id "none"
- :source-paths ["src" "examples" "test"]
- :compiler
- { :main rum.examples
- :output-to "target/main.js"
- :output-dir "target/none"
- :asset-path "target/none"
- :optimizations :none
- :source-map true
- :compiler-stats true
- :parallel-build true }}
+ { :id "none"
+ :source-paths ["src" "examples" "test"]
+ :compiler
+ { :main rum.examples
+ :output-to "target/main.js"
+ :output-dir "target/none"
+ :asset-path "target/none"
+ :optimizations :none
+ :source-map true
+ :compiler-stats true
+ :parallel-build true }}
- { :id "test"
- :source-paths ["src" "test"]
- :compiler
- { :main rum.test.server-render
- :output-to "target/test.js"
- :output-dir "target/test"
- :asset-path "target/test"
- :optimizations :advanced
- :pretty-print true
- :pseudo-names true
- :parallel-build true }}]}
-)
+ { :id "test"
+ :source-paths ["src" "test"]
+ :compiler
+ { :main rum.test.server-render
+ :output-to "target/test.js"
+ :output-dir "target/test"
+ :asset-path "target/test"
+ :optimizations :advanced
+ :pretty-print true
+ :pseudo-names true
+ :parallel-build true }}]}
+ )
diff --git a/src/rum/core.clj b/src/rum/core.clj
index b32b526..3fdde77 100644
--- a/src/rum/core.clj
+++ b/src/rum/core.clj
@@ -1,12 +1,12 @@
(ns rum.core
(:refer-clojure :exclude [ref])
(:require
- [rum.cursor :as cursor]
- [rum.server-render :as render]
- [rum.util :as util :refer [collect collect* call-all]]
- [rum.derived-atom :as derived-atom])
+ [rum.cursor :as cursor]
+ [rum.server-render :as render]
+ [rum.util :as util :refer [collect collect* call-all]]
+ [rum.derived-atom :as derived-atom])
(:import
- [rum.cursor Cursor]))
+ [rum.cursor Cursor]))
(defn- fn-body? [form]
@@ -30,15 +30,15 @@
next (next xs)]
(cond
(and (empty? res) (symbol? x))
- (recur {:name x} next nil)
+ (recur {:name x} next nil)
(fn-body? xs) (assoc res :bodies (list xs))
(every? fn-body? xs) (assoc res :bodies xs)
(string? x) (recur (assoc res :doc x) next nil)
(= '< x) (recur res next :mixins)
(= mode :mixins)
- (recur (update-in res [:mixins] (fnil conj []) x) next :mixins)
+ (recur (update-in res [:mixins] (fnil conj []) x) next :mixins)
:else
- (throw (IllegalArgumentException. (str "Syntax error at " xs)))))))
+ (throw (IllegalArgumentException. (str "Syntax error at " xs)))))))
(defn- compile-body [[argvec conditions & body]]
@@ -199,8 +199,8 @@
```"
([initial] (local initial :rum/local))
([initial key]
- {:will-mount (fn [state]
- (assoc state key (atom initial)))}))
+ {:will-mount (fn [state]
+ (assoc state key (atom initial)))}))
(def reactive "Supported, does nothing." {})
diff --git a/src/rum/core.cljs b/src/rum/core.cljs
index 981bc25..358a8e0 100644
--- a/src/rum/core.cljs
+++ b/src/rum/core.cljs
@@ -2,13 +2,13 @@
(:refer-clojure :exclude [ref])
(:require-macros rum.core)
(:require
- [cljsjs.react]
- [cljsjs.react.dom]
- [goog.object :as gobj]
- [sablono.core]
- [rum.cursor :as cursor]
- [rum.util :as util :refer [collect collect* call-all]]
- [rum.derived-atom :as derived-atom]))
+ [cljsjs.react]
+ [cljsjs.react.dom]
+ [goog.object :as gobj]
+ [sablono.core]
+ [rum.cursor :as cursor]
+ [rum.util :as util :refer [collect collect* call-all]]
+ [rum.derived-atom :as derived-atom]))
(defn state
@@ -140,7 +140,7 @@
ctor (if (some? key-fn)
(fn [& args]
(let [props #js { ":rum/initial-state" { :rum/args args }
- "key" (apply key-fn args) }]
+ "key" (apply key-fn args) }]
(js/React.createElement class props)))
(fn [& args]
(let [props #js { ":rum/initial-state" { :rum/args args }}]
@@ -303,8 +303,8 @@
(rum/mount (label \"def\") js/document.body)
```"
{ :should-update
- (fn [old-state new-state]
- (not= (:rum/args old-state) (:rum/args new-state))) })
+ (fn [old-state new-state]
+ (not= (:rum/args old-state) (:rum/args new-state))) })
;; local mixin
@@ -323,14 +323,14 @@
```"
([initial] (local initial :rum/local))
([initial key]
- { :will-mount
- (fn [state]
- (let [local-state (atom initial)
- component (:rum/react-component state)]
- (add-watch local-state key
- (fn [_ _ _ _]
- (request-render component)))
- (assoc state key local-state))) }))
+ { :will-mount
+ (fn [state]
+ (let [local-state (atom initial)
+ component (:rum/react-component state)]
+ (add-watch local-state key
+ (fn [_ _ _ _]
+ (request-render component)))
+ (assoc state key local-state))) }))
;; reactive mixin
@@ -351,32 +351,32 @@
(swap! *counter inc) ;; will force comp to re-render
```"
{ :init
- (fn [state props]
- (assoc state :rum.reactive/key (random-uuid)))
- :wrap-render
- (fn [render-fn]
- (fn [state]
- (binding [*reactions* (volatile! #{})]
- (let [comp (:rum/react-component state)
- old-reactions (:rum.reactive/refs state #{})
- [dom next-state] (render-fn state)
- new-reactions @*reactions*
- key (:rum.reactive/key state)]
- (doseq [ref old-reactions]
- (when-not (contains? new-reactions ref)
- (remove-watch ref key)))
- (doseq [ref new-reactions]
- (when-not (contains? old-reactions ref)
- (add-watch ref key
- (fn [_ _ _ _]
- (request-render comp)))))
- [dom (assoc next-state :rum.reactive/refs new-reactions)]))))
- :will-unmount
- (fn [state]
- (let [key (:rum.reactive/key state)]
- (doseq [ref (:rum.reactive/refs state)]
- (remove-watch ref key)))
- (dissoc state :rum.reactive/refs :rum.reactive/key)) })
+ (fn [state props]
+ (assoc state :rum.reactive/key (random-uuid)))
+ :wrap-render
+ (fn [render-fn]
+ (fn [state]
+ (binding [*reactions* (volatile! #{})]
+ (let [comp (:rum/react-component state)
+ old-reactions (:rum.reactive/refs state #{})
+ [dom next-state] (render-fn state)
+ new-reactions @*reactions*
+ key (:rum.reactive/key state)]
+ (doseq [ref old-reactions]
+ (when-not (contains? new-reactions ref)
+ (remove-watch ref key)))
+ (doseq [ref new-reactions]
+ (when-not (contains? old-reactions ref)
+ (add-watch ref key
+ (fn [_ _ _ _]
+ (request-render comp)))))
+ [dom (assoc next-state :rum.reactive/refs new-reactions)]))))
+ :will-unmount
+ (fn [state]
+ (let [key (:rum.reactive/key state)]
+ (doseq [ref (:rum.reactive/refs state)]
+ (remove-watch ref key)))
+ (dissoc state :rum.reactive/refs :rum.reactive/key)) })
(defn react
diff --git a/src/rum/derived_atom.cljc b/src/rum/derived_atom.cljc
index 3eff51c..1341089 100644
--- a/src/rum/derived_atom.cljc
+++ b/src/rum/derived_atom.cljc
@@ -3,25 +3,25 @@
(defn derived-atom
([refs key f]
- (derived-atom refs key f {}))
+ (derived-atom refs key f {}))
([refs key f opts]
- (let [{ :keys [ref check-equals?]
- :or { check-equals? true }} opts
- recalc (case (count refs)
- 1 (let [[a] refs] #(f @a))
- 2 (let [[a b] refs] #(f @a @b))
- 3 (let [[a b c] refs] #(f @a @b @c))
- #(apply f (map deref refs)))
- sink (if ref
- (doto ref (reset! (recalc)))
- (atom (recalc)))
- watch (if check-equals?
- (fn [_ _ _ _]
- (let [new-val (recalc)]
- (when (not= @sink new-val)
- (reset! sink new-val))))
- (fn [_ _ _ _]
- (reset! sink (recalc))))]
- (doseq [ref refs]
- (add-watch ref key watch))
- sink)))
+ (let [{ :keys [ref check-equals?]
+ :or { check-equals? true }} opts
+ recalc (case (count refs)
+ 1 (let [[a] refs] #(f @a))
+ 2 (let [[a b] refs] #(f @a @b))
+ 3 (let [[a b c] refs] #(f @a @b @c))
+ #(apply f (map deref refs)))
+ sink (if ref
+ (doto ref (reset! (recalc)))
+ (atom (recalc)))
+ watch (if check-equals?
+ (fn [_ _ _ _]
+ (let [new-val (recalc)]
+ (when (not= @sink new-val)
+ (reset! sink new-val))))
+ (fn [_ _ _ _]
+ (reset! sink (recalc))))]
+ (doseq [ref refs]
+ (add-watch ref key watch))
+ sink)))
diff --git a/src/rum/server_render.clj b/src/rum/server_render.clj
index 0fa7c3f..6da9482 100644
--- a/src/rum/server_render.clj
+++ b/src/rum/server_render.clj
@@ -1,8 +1,8 @@
(ns ^:no-doc rum.server-render
(:require
- [clojure.string :as str])
+ [clojure.string :as str])
(:import
- [clojure.lang IPersistentVector ISeq Named Numbers Ratio Keyword]))
+ [clojure.lang IPersistentVector ISeq Named Numbers Ratio Keyword]))
(defn nothing? [element]
@@ -15,23 +15,23 @@
(defn append!
([^StringBuilder sb s0] (.append sb s0))
([^StringBuilder sb s0 s1]
- (.append sb s0)
- (.append sb s1))
+ (.append sb s0)
+ (.append sb s1))
([^StringBuilder sb s0 s1 s2]
- (.append sb s0)
- (.append sb s1)
- (.append sb s2))
+ (.append sb s0)
+ (.append sb s1)
+ (.append sb s2))
([^StringBuilder sb s0 s1 s2 s3]
- (.append sb s0)
- (.append sb s1)
- (.append sb s2)
- (.append sb s3))
+ (.append sb s0)
+ (.append sb s1)
+ (.append sb s2)
+ (.append sb s3))
([^StringBuilder sb s0 s1 s2 s3 s4]
- (.append sb s0)
- (.append sb s1)
- (.append sb s2)
- (.append sb s3)
- (.append sb s4)))
+ (.append sb s0)
+ (.append sb s1)
+ (.append sb s2)
+ (.append sb s3)
+ (.append sb s4)))
(defprotocol ToString
@@ -56,137 +56,137 @@
(def normalized-attrs
{ ;; special cases
- :default-checked "checked"
- :default-value "value"
-
- ;; https://github.com/facebook/react/blob/v15.6.2/src/renderers/dom/shared/HTMLDOMPropertyConfig.js
- :accept-charset "accept-charset"
- :access-key "accessKey"
- :allow-full-screen "allowfullscreen"
- :allow-transparency "allowTransparency"
- :auto-complete "autoComplete"
- :auto-play "autoplay"
- :cell-padding "cellPadding"
- :cell-spacing "cellSpacing"
- :char-set "charSet"
- :class-id "classId"
- :col-span "colSpan"
- :content-editable "contenteditable"
- :context-menu "contextMenu"
- :cross-origin "crossOrigin"
- :date-time "dateTime"
- :enc-type "encType"
- :form-action "formAction"
- :form-enc-type "formEncType"
- :form-method "formMethod"
- :form-no-validate "formnovalidate"
- :form-target "formTarget"
- :frame-border "frameBorder"
- :href-lang "hrefLang"
- :http-equiv "http-equiv"
- :input-mode "inputMode"
- :key-params "keyParams"
- :key-type "keyType"
- :margin-height "marginHeight"
- :margin-width "marginWidth"
- :max-length "maxLength"
- :media-group "mediaGroup"
- :min-length "minLength"
- :no-validate "novalidate"
- :radio-group "radioGroup"
- :referrer-policy "referrerPolicy"
- :read-only "readonly"
- :row-span "rowspan"
- :spell-check "spellcheck"
- :src-doc "srcDoc"
- :src-lang "srcLang"
- :src-set "srcSet"
- :tab-index "tabindex"
- :use-map "useMap"
- :auto-capitalize "autoCapitalize"
- :auto-correct "autoCorrect"
- :auto-save "autoSave"
- :item-prop "itemProp"
- :item-scope "itemscope"
- :item-type "itemType"
- :item-id "itemId"
- :item-ref "itemRef"
+ :default-checked "checked"
+ :default-value "value"
+
+ ;; https://github.com/facebook/react/blob/v15.6.2/src/renderers/dom/shared/HTMLDOMPropertyConfig.js
+ :accept-charset "accept-charset"
+ :access-key "accessKey"
+ :allow-full-screen "allowfullscreen"
+ :allow-transparency "allowTransparency"
+ :auto-complete "autoComplete"
+ :auto-play "autoplay"
+ :cell-padding "cellPadding"
+ :cell-spacing "cellSpacing"
+ :char-set "charSet"
+ :class-id "classId"
+ :col-span "colSpan"
+ :content-editable "contenteditable"
+ :context-menu "contextMenu"
+ :cross-origin "crossOrigin"
+ :date-time "dateTime"
+ :enc-type "encType"
+ :form-action "formAction"
+ :form-enc-type "formEncType"
+ :form-method "formMethod"
+ :form-no-validate "formnovalidate"
+ :form-target "formTarget"
+ :frame-border "frameBorder"
+ :href-lang "hrefLang"
+ :http-equiv "http-equiv"
+ :input-mode "inputMode"
+ :key-params "keyParams"
+ :key-type "keyType"
+ :margin-height "marginHeight"
+ :margin-width "marginWidth"
+ :max-length "maxLength"
+ :media-group "mediaGroup"
+ :min-length "minLength"
+ :no-validate "novalidate"
+ :radio-group "radioGroup"
+ :referrer-policy "referrerPolicy"
+ :read-only "readonly"
+ :row-span "rowspan"
+ :spell-check "spellcheck"
+ :src-doc "srcDoc"
+ :src-lang "srcLang"
+ :src-set "srcSet"
+ :tab-index "tabindex"
+ :use-map "useMap"
+ :auto-capitalize "autoCapitalize"
+ :auto-correct "autoCorrect"
+ :auto-save "autoSave"
+ :item-prop "itemProp"
+ :item-scope "itemscope"
+ :item-type "itemType"
+ :item-id "itemId"
+ :item-ref "itemRef"
- ;; https://github.com/facebook/react/blob/v15.6.2/src/renderers/dom/shared/SVGDOMPropertyConfig.js
- :allow-reorder "allowReorder"
- :attribute-name "attributeName"
- :attribute-type "attributeType"
- :auto-reverse "autoReverse"
- :base-frequency "baseFrequency"
- :base-profile "baseProfile"
- :calc-mode "calcMode"
- :clip-path-units "clipPathUnits"
- :content-script-type "contentScriptType"
- :content-style-type "contentStyleType"
- :diffuse-constant "diffuseConstant"
- :edge-mode "edgeMode"
- :external-resources-required "externalResourcesRequired"
- :filter-res "filterRes"
- :filter-units "filterUnits"
- :glyph-ref "glyphRef"
- :gradient-transform "gradientTransform"
- :gradient-units "gradientUnits"
- :kernel-matrix "kernelMatrix"
- :kernel-unit-length "kernelUnitLength"
- :key-points "keyPoints"
- :key-splines "keySplines"
- :key-times "keyTimes"
- :length-adjust "lengthAdjust"
- :limiting-cone-angle "limitingConeAngle"
- :marker-height "markerHeight"
- :marker-units "markerUnits"
- :marker-width "markerWidth"
- :mask-content-units "maskContentUnits"
- :mask-units "maskUnits"
- :num-octaves "numOctaves"
- :path-length "pathLength"
- :pattern-content-units "patternContentUnits"
- :pattern-transform "patternTransform"
- :pattern-units "patternUnits"
- :points-at-x "pointsAtX"
- :points-at-y "pointsAtY"
- :points-at-z "pointsAtZ"
- :preserve-alpha "preserveAlpha"
- :preserve-aspect-ratio "preserveAspectRatio"
- :primitive-units "primitiveUnits"
- :ref-x "refX"
- :ref-y "refY"
- :repeat-count "repeatCount"
- :repeat-dur "repeatDur"
- :required-extensions "requiredExtensions"
- :required-features "requiredFeatures"
- :specular-constant "specularConstant"
- :specular-exponent "specularExponent"
- :spread-method "spreadMethod"
- :start-offset "startOffset"
- :std-deviation "stdDeviation"
- :stitch-tiles "stitchTiles"
- :surface-scale "surfaceScale"
- :system-language "systemLanguage"
- :table-values "tableValues"
- :target-x "targetX"
- :target-y "targetY"
- :view-box "viewBox"
- :view-target "viewTarget"
- :x-channel-selector "xChannelSelector"
- :xlink-actuate "xlink:actuate"
- :xlink-arcrole "xlink:arcrole"
- :xlink-href "xlink:href"
- :xlink-role "xlink:role"
- :xlink-show "xlink:show"
- :xlink-title "xlink:title"
- :xlink-type "xlink:type"
- :xml-base "xml:base"
- :xmlns-xlink "xmlns:xlink"
- :xml-lang "xml:lang"
- :xml-space "xml:space"
- :y-channel-selector "yChannelSelector"
- :zoom-and-pan "zoomAndPan" })
+ ;; https://github.com/facebook/react/blob/v15.6.2/src/renderers/dom/shared/SVGDOMPropertyConfig.js
+ :allow-reorder "allowReorder"
+ :attribute-name "attributeName"
+ :attribute-type "attributeType"
+ :auto-reverse "autoReverse"
+ :base-frequency "baseFrequency"
+ :base-profile "baseProfile"
+ :calc-mode "calcMode"
+ :clip-path-units "clipPathUnits"
+ :content-script-type "contentScriptType"
+ :content-style-type "contentStyleType"
+ :diffuse-constant "diffuseConstant"
+ :edge-mode "edgeMode"
+ :external-resources-required "externalResourcesRequired"
+ :filter-res "filterRes"
+ :filter-units "filterUnits"
+ :glyph-ref "glyphRef"
+ :gradient-transform "gradientTransform"
+ :gradient-units "gradientUnits"
+ :kernel-matrix "kernelMatrix"
+ :kernel-unit-length "kernelUnitLength"
+ :key-points "keyPoints"
+ :key-splines "keySplines"
+ :key-times "keyTimes"
+ :length-adjust "lengthAdjust"
+ :limiting-cone-angle "limitingConeAngle"
+ :marker-height "markerHeight"
+ :marker-units "markerUnits"
+ :marker-width "markerWidth"
+ :mask-content-units "maskContentUnits"
+ :mask-units "maskUnits"
+ :num-octaves "numOctaves"
+ :path-length "pathLength"
+ :pattern-content-units "patternContentUnits"
+ :pattern-transform "patternTransform"
+ :pattern-units "patternUnits"
+ :points-at-x "pointsAtX"
+ :points-at-y "pointsAtY"
+ :points-at-z "pointsAtZ"
+ :preserve-alpha "preserveAlpha"
+ :preserve-aspect-ratio "preserveAspectRatio"
+ :primitive-units "primitiveUnits"
+ :ref-x "refX"
+ :ref-y "refY"
+ :repeat-count "repeatCount"
+ :repeat-dur "repeatDur"
+ :required-extensions "requiredExtensions"
+ :required-features "requiredFeatures"
+ :specular-constant "specularConstant"
+ :specular-exponent "specularExponent"
+ :spread-method "spreadMethod"
+ :start-offset "startOffset"
+ :std-deviation "stdDeviation"
+ :stitch-tiles "stitchTiles"
+ :surface-scale "surfaceScale"
+ :system-language "systemLanguage"
+ :table-values "tableValues"
+ :target-x "targetX"
+ :target-y "targetY"
+ :view-box "viewBox"
+ :view-target "viewTarget"
+ :x-channel-selector "xChannelSelector"
+ :xlink-actuate "xlink:actuate"
+ :xlink-arcrole "xlink:arcrole"
+ :xlink-href "xlink:href"
+ :xlink-role "xlink:role"
+ :xlink-show "xlink:show"
+ :xlink-title "xlink:title"
+ :xlink-type "xlink:type"
+ :xml-base "xml:base"
+ :xmlns-xlink "xmlns:xlink"
+ :xml-lang "xml:lang"
+ :xml-space "xml:space"
+ :y-channel-selector "yChannelSelector"
+ :zoom-and-pan "zoomAndPan" })
(defn get-value [attrs]
@@ -281,11 +281,11 @@
(defn normalize-css-value [key value]
(cond
(contains? unitless-css-props key)
- (escape-html (str/trim (to-str value)))
+ (escape-html (str/trim (to-str value)))
(number? value)
- (str value (when (not= 0 value) "px"))
+ (str value (when (not= 0 value) "px"))
:else
- (escape-html (str/trim (to-str value)))))
+ (escape-html (str/trim (to-str value)))))
(defn render-style-kv! [sb empty? k v]
@@ -310,18 +310,18 @@
(defn render-class! [sb first? class]
(cond
(nil? class)
- first?
+ first?
(string? class)
- (do
- (when-not first?
- (append! sb " "))
- (append! sb class)
- false)
+ (do
+ (when-not first?
+ (append! sb " "))
+ (append! sb class)
+ false)
(or (sequential? class)
(set? class))
- (reduce #(render-class! sb %1 %2) first? class)
+ (reduce #(render-class! sb %1 %2) first? class)
:else
- (render-class! sb first? (to-str class))))
+ (render-class! sb first? (to-str class))))
(defn render-classes! [classes sb]
@@ -465,9 +465,9 @@
(defn render-html
([src] (render-html src nil))
([src opts]
- (let [sb (StringBuilder.)]
- (-render-html src (volatile! :state/root) sb)
- (str sb))))
+ (let [sb (StringBuilder.)]
+ (-render-html src (volatile! :state/root) sb)
+ (str sb))))
(defn render-static-markup [src]
diff --git a/test/rum/test/cursor.clj b/test/rum/test/cursor.clj
index cb5a69c..b56effd 100644
--- a/test/rum/test/cursor.clj
+++ b/test/rum/test/cursor.clj
@@ -1,7 +1,7 @@
(ns rum.test.cursor
(:require
- [rum.core :as rum]
- [clojure.test :refer [deftest is are testing]]))
+ [rum.core :as rum]
+ [clojure.test :refer [deftest is are testing]]))
(deftest test-cursor
diff --git a/test/rum/test/defc.clj b/test/rum/test/defc.clj
index 93006ab..4734d82 100644
--- a/test/rum/test/defc.clj
+++ b/test/rum/test/defc.clj
@@ -1,9 +1,9 @@
(ns rum.test.defc
(:require
- [rum.core]
- [clojure.string :as str]
- [clojure.test :refer [deftest is are testing]]
- [clojure.java.shell :as shell]))
+ [rum.core]
+ [clojure.string :as str]
+ [clojure.test :refer [deftest is are testing]]
+ [clojure.java.shell :as shell]))
(defmacro eval-in-temp-ns [& forms]
`(binding [*ns* *ns*]
@@ -11,7 +11,7 @@
(clojure.core/use 'clojure.core)
(clojure.core/use 'rum.core)
(eval
- '(do ~@forms))))
+ '(do ~@forms))))
;; Copied from Clojure: https://git.io/vwFsG
(deftest defc-error-messages
@@ -22,44 +22,44 @@
(eval-in-temp-ns (defc "bad docstring" testname [arg1 arg2])))))
(testing "mixins after argvec"
(is (thrown-with-msg?
- IllegalArgumentException
- #"Mixins must be given before argument list"
- (eval-in-temp-ns (defc testname "docstring" [arg1 arg2] < misplaced-mixin))))
+ IllegalArgumentException
+ #"Mixins must be given before argument list"
+ (eval-in-temp-ns (defc testname "docstring" [arg1 arg2] < misplaced-mixin))))
(is (thrown-with-msg?
- IllegalArgumentException
- #"Mixins must be given before argument list"
- (eval-in-temp-ns (defc testname "docstring"
- ([arg1] < misplaced-mixin)
- ([arg1 arg2] < misplaced-mixin)))))
+ IllegalArgumentException
+ #"Mixins must be given before argument list"
+ (eval-in-temp-ns (defc testname "docstring"
+ ([arg1] < misplaced-mixin)
+ ([arg1 arg2] < misplaced-mixin)))))
(is (thrown-with-msg?
- IllegalArgumentException
- #"Mixins must be given before argument list"
- (eval-in-temp-ns (defc testname
- ([arg1] < misplaced-mixin)
- ([arg1 arg2] < misplaced-mixin)))))))
+ IllegalArgumentException
+ #"Mixins must be given before argument list"
+ (eval-in-temp-ns (defc testname
+ ([arg1] < misplaced-mixin)
+ ([arg1 arg2] < misplaced-mixin)))))))
(deftest defc-conditions
(testing "no conditions supplied"
(is (= '(def pre-post-test
(rum.core/build-defc
- (clojure.core/fn
- ([y] (do {:x 1}))
- ([y z] (do (sablono.interpreter/interpret (+ y z 1)))))
- nil
- "pre-post-test"))
+ (clojure.core/fn
+ ([y] (do {:x 1}))
+ ([y z] (do (sablono.interpreter/interpret (+ y z 1)))))
+ nil
+ "pre-post-test"))
(#'rum.core/-defc 'rum.core/build-defc
- true ; cljs?
- '(pre-post-test ([y] {:x 1})
- ([y z] (+ y z 1)))))))
+ true ; cljs?
+ '(pre-post-test ([y] {:x 1})
+ ([y z] (+ y z 1)))))))
(testing "some conditions supplied"
(is (= '(def pre-post-test
(rum.core/build-defc
- (clojure.core/fn
- ([y] {:pre [(pos? y)]} (do {:x 1}))
- ([y z] (do (sablono.interpreter/interpret (+ y z 1)))))
- nil
- "pre-post-test"))
+ (clojure.core/fn
+ ([y] {:pre [(pos? y)]} (do {:x 1}))
+ ([y z] (do (sablono.interpreter/interpret (+ y z 1)))))
+ nil
+ "pre-post-test"))
(#'rum.core/-defc 'rum.core/build-defc
- true ; cljs?
- '(pre-post-test ([y] {:pre [(pos? y)]} {:x 1})
- ([y z] (+ y z 1))))))))
\ No newline at end of file
+ true ; cljs?
+ '(pre-post-test ([y] {:pre [(pos? y)]} {:x 1})
+ ([y z] (+ y z 1))))))))
\ No newline at end of file
diff --git a/test/rum/test/derived_atom.clj b/test/rum/test/derived_atom.clj
index 436e7cb..d0569a5 100644
--- a/test/rum/test/derived_atom.clj
+++ b/test/rum/test/derived_atom.clj
@@ -1,15 +1,15 @@
(ns rum.test.derived-atom
(:require
- [rum.core :as rum]
- [clojure.test :refer [deftest is are testing]]))
+ [rum.core :as rum]
+ [clojure.test :refer [deftest is are testing]]))
(deftest test-derived
(let [*a (atom 0)
*b (atom "x")
*d (rum/derived-atom [*a *b] ::key
- (fn [a b]
- (str a ":" b)))]
+ (fn [a b]
+ (str a ":" b)))]
(is (= "0:x" @*d))
(swap! *a inc)
(is (= "1:x" @*d))
diff --git a/test/rum/test/server.clj b/test/rum/test/server.clj
index 6f55758..a944a10 100644
--- a/test/rum/test/server.clj
+++ b/test/rum/test/server.clj
@@ -1,22 +1,22 @@
(ns rum.test.server
(:require
- [rum.core :as rum]
- [clojure.test :refer [deftest is are testing]]))
+ [rum.core :as rum]
+ [clojure.test :refer [deftest is are testing]]))
(rum/defcs comp-mixins < (rum/local 7)
- { :will-mount (fn [s] (assoc s ::key 1)) }
+ { :will-mount (fn [s] (assoc s ::key 1)) }
[state]
[:div
- [:.local @(:rum/local state)]
- [:.key (::key state)]])
+ [:.local @(:rum/local state)]
+ [:.key (::key state)]])
(deftest test-lifecycle
(is (= (comp-mixins)
[:div
- [:.local 7]
- [:.key 1]])))
+ [:.local 7]
+ [:.key 1]])))
(rum/defc comp-arglists
diff --git a/test/rum/test/server_render.cljc b/test/rum/test/server_render.cljc
index dfe6519..34176bd 100644
--- a/test/rum/test/server_render.cljc
+++ b/test/rum/test/server_render.cljc
@@ -1,26 +1,26 @@
(ns rum.test.server-render
(:require
- [rum.core :as rum]
- [clojure.string :as str]
- #?@(:clj [[clojure.test :refer [deftest is are testing]]
- [clojure.java.shell :as shell]
- [clojure.java.io :as io]
- [clj-diffmatchpatch :as diff]]
- :cljs [[cljs.test :refer-macros [deftest is are testing]]
- [cljsjs.react.dom.server]])))
+ [rum.core :as rum]
+ [clojure.string :as str]
+ #?@(:clj [[clojure.test :refer [deftest is are testing]]
+ [clojure.java.shell :as shell]
+ [clojure.java.io :as io]
+ [clj-diffmatchpatch :as diff]]
+ :cljs [[cljs.test :refer-macros [deftest is are testing]]
+ [cljsjs.react.dom.server]])))
(rum/defc comp-simple []
[:div
- [:div "A"
- [:span "A1"]
- [:span "A2"]]
- [:div "B"]
- [:div "C" "D"]
- [:div "E"
- [:span "E1"]]
- [:div nil]
- [:div nil "F"]
- [:div {} ((constantly nil)) "G"]])
+ [:div "A"
+ [:span "A1"]
+ [:span "A2"]]
+ [:div "B"]
+ [:div "C" "D"]
+ [:div "E"
+ [:span "E1"]]
+ [:div nil]
+ [:div nil "F"]
+ [:div {} ((constantly nil)) "G"]])
(rum/defc comp-tag []
@@ -33,9 +33,9 @@
(rum/defc comp-lists []
[:div
- [:.a (list [:.b])]
- [:.c "d" (list [:.e])]
- [:.f "g" (list [:.h]) "i"]])
+ [:.a (list [:.b])]
+ [:.c "d" (list [:.e])]
+ [:.f "g" (list [:.h]) "i"]])
(rum/defc comp-root-array []
@@ -47,9 +47,9 @@
(rum/defc comp-header []
[:ul.nav__content
- (list [:li.menu-item {:key "F"} "Женщинам"]
- [:li.menu-item {:key "M"} "Мужчинам"])
- [:li.menu-item {:key "outlet"} "Outlet"]])
+ (list [:li.menu-item {:key "F"} "Женщинам"]
+ [:li.menu-item {:key "M"} "Мужчинам"])
+ [:li.menu-item {:key "outlet"} "Outlet"]])
(rum/defc comp-nil1 []
@@ -75,139 +75,139 @@
(rum/defc comp-nothing2 []
[:div
- [:div (comp-nothing)]
- [:div "a" (comp-nothing)]
- [:div (comp-nothing) "b"]
- [:div "a" (comp-nothing) "b" [:span "x"]]
- [:div [:.a] (comp-nothing) [:.b]]
- [:div (rum/with-key (comp-nothing) "K")]])
+ [:div (comp-nothing)]
+ [:div "a" (comp-nothing)]
+ [:div (comp-nothing) "b"]
+ [:div "a" (comp-nothing) "b" [:span "x"]]
+ [:div [:.a] (comp-nothing) [:.b]]
+ [:div (rum/with-key (comp-nothing) "K")]])
(rum/defc comp-span []
[:span
- "a" "b"
- "a" [:tag "b"] "c"
- "a" (list "b" "c") "d"
- "a" (list "b" "c") (list "d" "e") "f"
- (list "a" "b") [:tag "c"] (list "d" "e")
- "a" nil "b"
- "a" (comp-nothing) "b"
- "a" (list nil) "b"])
+ "a" "b"
+ "a" [:tag "b"] "c"
+ "a" (list "b" "c") "d"
+ "a" (list "b" "c") (list "d" "e") "f"
+ (list "a" "b") [:tag "c"] (list "d" "e")
+ "a" nil "b"
+ "a" (comp-nothing) "b"
+ "a" (list nil) "b"])
(rum/defc comp-campaign []
[:div#today.content.wrapper
- (list
- [:div.banner { :class " big "
- :style { :background-image "url(123)" }
- :key "campaign-20871" }
- [:a.banner__item-link { :href "/catalogue/s-10079-colin-s/" }]]
+ (list
+ [:div.banner { :class " big "
+ :style { :background-image "url(123)" }
+ :key "campaign-20871" }
+ [:a.banner__item-link { :href "/catalogue/s-10079-colin-s/" }]]
- [:div.banner { :class " "
- :key "banner-:promo" }
- [:a.banner__item-link { :href nil, :target "_blank" }]]
+ [:div.banner { :class " "
+ :key "banner-:promo" }
+ [:a.banner__item-link { :href nil, :target "_blank" }]]
- [:div.banner { :class " medium "
- :style { :background-image "url(321)" }
- :key "campaign-20872" }
- [:a.banner__item-link { :href "/catalogue/s-10089-rinascimento/" }]])])
+ [:div.banner { :class " medium "
+ :style { :background-image "url(321)" }
+ :key "campaign-20872" }
+ [:a.banner__item-link { :href "/catalogue/s-10089-rinascimento/" }]])])
(rum/defc comp-styles []
[:div
- [:div.a { :style {} }]
- [:div.b { :style { :background-color nil } }]
- [:div.c { :style { :background-color "" } }]
- [:div.d { :style
- { :background-image "url(\"123\")" ;; should escape quotes
- :line-height 24 ;; unitless, should not add 'px'
- :-webkit-box-flex 3 ;; prefixed unitless
- :margin-top 17 ;; should add 'px'
- :margin-right 17.1
- :margin-left 0 }}] ;; no 'px' added to 0
- [:div.e { :style
- { :border-width " 1 " ;; trim numeric & append 'px'
- :padding-right " 1.2 "
- :padding-bottom "1em" ;; do not add 'px' if unit already specified
- :text-align " left " ;; trim non-numeric values
- :flex-grow " 1 " }}] ;; trim unitless values
- [:div.f { :style
- { :background-image "url('123')" ;; should escape quotes
- :fontWeight 10 ;; should convert from react-style properties to CSS
- "WebkitFlex" 1 ;; prefixed react-style prop
- "msFlex" 1 ;; prefixed react-style prop (lowecase ms)
- "zIndex" 1 }}]]) ;; accept strings too
+ [:div.a { :style {} }]
+ [:div.b { :style { :background-color nil } }]
+ [:div.c { :style { :background-color "" } }]
+ [:div.d { :style
+ { :background-image "url(\"123\")" ;; should escape quotes
+ :line-height 24 ;; unitless, should not add 'px'
+ :-webkit-box-flex 3 ;; prefixed unitless
+ :margin-top 17 ;; should add 'px'
+ :margin-right 17.1
+ :margin-left 0 }}] ;; no 'px' added to 0
+ [:div.e { :style
+ { :border-width " 1 " ;; trim numeric & append 'px'
+ :padding-right " 1.2 "
+ :padding-bottom "1em" ;; do not add 'px' if unit already specified
+ :text-align " left " ;; trim non-numeric values
+ :flex-grow " 1 " }}] ;; trim unitless values
+ [:div.f { :style
+ { :background-image "url('123')" ;; should escape quotes
+ :fontWeight 10 ;; should convert from react-style properties to CSS
+ "WebkitFlex" 1 ;; prefixed react-style prop
+ "msFlex" 1 ;; prefixed react-style prop (lowecase ms)
+ "zIndex" 1 }}]]) ;; accept strings too
(rum/defc comp-attrs []
[:div
- (for [[a v] [[:data-attr-ibute "b"] ;; should not touch data-* and aria* attr names
- [:aria-checked "c"]
- [:form-enc-type "text/plain"] ;; should normalize (remove dashes)
- [:checked false] ;; nil and false attrs not printed
- [:allow-full-screen true] ;; true printed as attr=""
- [:href "/a=b&c=d"]]]
- [:div { a v }])])
+ (for [[a v] [[:data-attr-ibute "b"] ;; should not touch data-* and aria* attr names
+ [:aria-checked "c"]
+ [:form-enc-type "text/plain"] ;; should normalize (remove dashes)
+ [:checked false] ;; nil and false attrs not printed
+ [:allow-full-screen true] ;; true printed as attr=""
+ [:href "/a=b&c=d"]]]
+ [:div { a v }])])
(rum/defc comp-attrs-capitalization []
[:div
- (for [a [:accept-charset :access-key :allow-transparency :auto-complete :cell-padding :cell-spacing :char-set :class-id :content-editable :context-menu :cross-origin :date-time :enc-type :form-action :form-enc-type :form-method :form-target :frame-border :href-lang :http-equiv :input-mode :key-params :key-type :margin-height :margin-width :max-length :media-group :min-length :radio-group :referrer-policy :spell-check :src-doc :src-lang :src-set :tab-index :use-map :auto-capitalize :auto-correct :auto-save :item-prop :item-type :item-id :item-ref]]
- [:div { a "_" }])
+ (for [a [:accept-charset :access-key :allow-transparency :auto-complete :cell-padding :cell-spacing :char-set :class-id :content-editable :context-menu :cross-origin :date-time :enc-type :form-action :form-enc-type :form-method :form-target :frame-border :href-lang :http-equiv :input-mode :key-params :key-type :margin-height :margin-width :max-length :media-group :min-length :radio-group :referrer-policy :spell-check :src-doc :src-lang :src-set :tab-index :use-map :auto-capitalize :auto-correct :auto-save :item-prop :item-type :item-id :item-ref]]
+ [:div { a "_" }])
- [:table
- [:td { :col-span 1
- :row-span 1 }]]
+ [:table
+ [:td { :col-span 1
+ :row-span 1 }]]
- [:svg
- (for [a [:allow-reorder :attribute-name :attribute-type :auto-reverse :base-frequency :base-profile :calc-mode :clip-path-units :content-script-type :content-style-type :diffuse-constant :edge-mode :external-resources-required :filter-res :filter-units :glyph-ref :gradient-transform :gradient-units :kernel-matrix :kernel-unit-length :key-points :key-splines :key-times :length-adjust :limiting-cone-angle :marker-height :marker-units :marker-width :mask-content-units :mask-units :num-octaves :path-length :pattern-content-units :pattern-transform :pattern-units :points-at-x :points-at-y :points-at-z :preserve-alpha :preserve-aspect-ratio :primitive-units :ref-x :ref-y :repeat-count :repeat-dur :required-extensions :required-features :specular-constant :specular-exponent :spread-method :start-offset :std-deviation :stitch-tiles :surface-scale :system-language :table-values :target-x :target-y :view-box :view-target :x-channel-selector :xlink-actuate :xlink-arcrole :xlink-href :xlink-role :xlink-show :xlink-title :xlink-type :xml-base :xmlns-xlink :xml-lang :xml-space :y-channel-selector :zoom-and-pan]]
- [:path { a "_" }])]
+ [:svg
+ (for [a [:allow-reorder :attribute-name :attribute-type :auto-reverse :base-frequency :base-profile :calc-mode :clip-path-units :content-script-type :content-style-type :diffuse-constant :edge-mode :external-resources-required :filter-res :filter-units :glyph-ref :gradient-transform :gradient-units :kernel-matrix :kernel-unit-length :key-points :key-splines :key-times :length-adjust :limiting-cone-angle :marker-height :marker-units :marker-width :mask-content-units :mask-units :num-octaves :path-length :pattern-content-units :pattern-transform :pattern-units :points-at-x :points-at-y :points-at-z :preserve-alpha :preserve-aspect-ratio :primitive-units :ref-x :ref-y :repeat-count :repeat-dur :required-extensions :required-features :specular-constant :specular-exponent :spread-method :start-offset :std-deviation :stitch-tiles :surface-scale :system-language :table-values :target-x :target-y :view-box :view-target :x-channel-selector :xlink-actuate :xlink-arcrole :xlink-href :xlink-role :xlink-show :xlink-title :xlink-type :xml-base :xmlns-xlink :xml-lang :xml-space :y-channel-selector :zoom-and-pan]]
+ [:path { a "_" }])]
- (for [a [:allow-full-screen :auto-play :form-no-validate :no-validate :read-only :item-scope]]
- [:div { a true }])])
+ (for [a [:allow-full-screen :auto-play :form-no-validate :no-validate :read-only :item-scope]]
+ [:div { a true }])])
(rum/defc comp-attrs-order []
[:div
- [:a { :title "a"
- :alt "b"
- :rel "c"
- :target "d"
- :src "e" }]
- [:a { :src "a"
- :target "b"
- :rel "c"
- :alt "d"
- :title "e" }]
- [:a { :title "a" :class "b" :rel "d" }]
- [:a { :title "a" :class ["b" "c"] :rel "d" }]
- [:a.clazz { :title "a" :class "b" :rel "d" }]
- [:a.clazz { :title "a" :class ["b" "c"] :rel "d" }]
- [:a.clazz#id { :title "a" }]
- [:a#id.clazz { :title "a" }]
- [:a.clazz#id { :title "a" :class "b" }]
- [:a#clazz.id { :title "a" :class "b" }]])
+ [:a { :title "a"
+ :alt "b"
+ :rel "c"
+ :target "d"
+ :src "e" }]
+ [:a { :src "a"
+ :target "b"
+ :rel "c"
+ :alt "d"
+ :title "e" }]
+ [:a { :title "a" :class "b" :rel "d" }]
+ [:a { :title "a" :class ["b" "c"] :rel "d" }]
+ [:a.clazz { :title "a" :class "b" :rel "d" }]
+ [:a.clazz { :title "a" :class ["b" "c"] :rel "d" }]
+ [:a.clazz#id { :title "a" }]
+ [:a#id.clazz { :title "a" }]
+ [:a.clazz#id { :title "a" :class "b" }]
+ [:a#clazz.id { :title "a" :class "b" }]])
(rum/defc comp-classes []
[:div
- [:div { :class [nil] }]
- [:div { :class :c3 }]
- [:div { :class [:c3 :c4] }] ;; list form
- [:div { :class "c3" }] ;; string form
- [:div { :class ["c3" "c4"]}]
- [:div { :class [" c3 " " c4 "]}] ;; trimming
- [:div { :class [:c3 nil :c4] }] ;; nils are not removed
- [:div { :class [:c2 :c3]}] ;; removing duplicates
- [:.c1 { :class nil }]
- [:.c1 { :class (when false "...") }] ;; see #99
- [:.c1.c2 { :class :c3 }]
- [:.c1.c2 { :class [:c3 :c4] }] ;; list form
- [:.c1.c2 { :class "c3" }] ;; string form
- [:.c1.c2 { :class ["c3" "c4"]}]
- [:.c1.c2 { :class [" c3 " " c4 "]}] ;; trimming
- [:.c1.c2 { :class [:c3 nil :c4] }] ;; nils are not removed
- [:.c1.c2 { :class [:c2 :c3]}]]) ;; not removing duplicates
+ [:div { :class [nil] }]
+ [:div { :class :c3 }]
+ [:div { :class [:c3 :c4] }] ;; list form
+ [:div { :class "c3" }] ;; string form
+ [:div { :class ["c3" "c4"]}]
+ [:div { :class [" c3 " " c4 "]}] ;; trimming
+ [:div { :class [:c3 nil :c4] }] ;; nils are not removed
+ [:div { :class [:c2 :c3]}] ;; removing duplicates
+ [:.c1 { :class nil }]
+ [:.c1 { :class (when false "...") }] ;; see #99
+ [:.c1.c2 { :class :c3 }]
+ [:.c1.c2 { :class [:c3 :c4] }] ;; list form
+ [:.c1.c2 { :class "c3" }] ;; string form
+ [:.c1.c2 { :class ["c3" "c4"]}]
+ [:.c1.c2 { :class [" c3 " " c4 "]}] ;; trimming
+ [:.c1.c2 { :class [:c3 nil :c4] }] ;; nils are not removed
+ [:.c1.c2 { :class [:c2 :c3]}]]) ;; not removing duplicates
(rum/defc comp-html []
@@ -216,126 +216,126 @@
(rum/defc comp-inputs []
[:div
- [:input#id {:class "x" :type "text" :auto-complete "off"}]
- [:input {:type "text" :default-value "x"}]
- [:input {:type "checkbox" :default-checked true}]
- [:input {:type "radio" :default-checked true}]
- [:select {:default-value "A"}
- [:option {:value "A"} "Apple"]
- [:option {:value "B"} "Banana"]]
- [:select {:value "A"}
- [:option#id.class {:value "A"} "Apple"]
- [:option#id.class {:value "B"} "Banana"]]
- [:textarea {:value "text"}]
- [:textarea "text"]
- [:textarea {:default-value "text"}]])
+ [:input#id {:class "x" :type "text" :auto-complete "off"}]
+ [:input {:type "text" :default-value "x"}]
+ [:input {:type "checkbox" :default-checked true}]
+ [:input {:type "radio" :default-checked true}]
+ [:select {:default-value "A"}
+ [:option {:value "A"} "Apple"]
+ [:option {:value "B"} "Banana"]]
+ [:select {:value "A"}
+ [:option#id.class {:value "A"} "Apple"]
+ [:option#id.class {:value "B"} "Banana"]]
+ [:textarea {:value "text"}]
+ [:textarea "text"]
+ [:textarea {:default-value "text"}]])
(rum/defc comp-svg []
[:svg.cclogo
- { :width 100
- :height 100
- :view-box "0 232.5 333.2 232.5" ;; should be rendered as viewBox
- :vector-effect "effect" ;; should be rendered as vector-effect
- :version "1.1"
- :dangerouslySetInnerHTML {:__html "[...tons of raw SVG removed...]"} }])
+ { :width 100
+ :height 100
+ :view-box "0 232.5 333.2 232.5" ;; should be rendered as viewBox
+ :vector-effect "effect" ;; should be rendered as vector-effect
+ :version "1.1"
+ :dangerouslySetInnerHTML {:__html "[...tons of raw SVG removed...]"} }])
(rum/defc comp-aria []
[:div
{ :aria-hidden true
- :aria-readonly false
- :aria-disabled "true"
- :aria-checked "false" }])
+ :aria-readonly false
+ :aria-disabled "true"
+ :aria-checked "false" }])
(def components
{ "simple" comp-simple
- "tag" comp-tag
- "list" comp-list
- "lists" comp-lists
- "root-array" comp-root-array
- "header" comp-header
- "nil1" comp-nil1
- "nil2" comp-nil2
- "nothing" comp-nothing
- "nothing2" comp-nothing2
- "span" comp-span
- "campaign" comp-campaign
- "styles" comp-styles
- "attrs" comp-attrs
- "attrs-cap" comp-attrs-capitalization
- "attrs-order" comp-attrs-order
- "classes" comp-classes
- "html" comp-html
- "inputs" comp-inputs
- "svg" comp-svg
- "aria" comp-aria})
+ "tag" comp-tag
+ "list" comp-list
+ "lists" comp-lists
+ "root-array" comp-root-array
+ "header" comp-header
+ "nil1" comp-nil1
+ "nil2" comp-nil2
+ "nothing" comp-nothing
+ "nothing2" comp-nothing2
+ "span" comp-span
+ "campaign" comp-campaign
+ "styles" comp-styles
+ "attrs" comp-attrs
+ "attrs-cap" comp-attrs-capitalization
+ "attrs-order" comp-attrs-order
+ "classes" comp-classes
+ "html" comp-html
+ "inputs" comp-inputs
+ "svg" comp-svg
+ "aria" comp-aria})
(def render-dir "target/server_render_test")
#?(:cljs
-(defn ^:export react_render_html
- "Renders components with ReactDOMServer.renderToString
+ (defn ^:export react_render_html
+ "Renders components with ReactDOMServer.renderToString
and saves them to render-dir"
- [write-fn]
- (enable-console-print!)
- (doseq [[name ctor] components]
- (let [html (js/ReactDOMServer.renderToString (ctor))
- path (str render-dir "/html/" name ".html")]
- (println " writing" path)
- (write-fn path html))
- (let [html (js/ReactDOMServer.renderToStaticMarkup (ctor))
- path (str render-dir "/markup/" name ".html")]
- (println " writing" path)
- (write-fn path html)))))
+ [write-fn]
+ (enable-console-print!)
+ (doseq [[name ctor] components]
+ (let [html (js/ReactDOMServer.renderToString (ctor))
+ path (str render-dir "/html/" name ".html")]
+ (println " writing" path)
+ (write-fn path html))
+ (let [html (js/ReactDOMServer.renderToStaticMarkup (ctor))
+ path (str render-dir "/markup/" name ".html")]
+ (println " writing" path)
+ (write-fn path html)))))
#?(:clj
-(defn exec [& cmd]
- (testing cmd
- (println "Running" (str "\"" (str/join " " cmd) "\""))
- (let [{:keys [exit out err]} (apply shell/sh cmd)]
- (is (= exit 0))
- (when-not (str/blank? err)
- (binding [*out* *err*]
- (println err)))
- (when-not (str/blank? out)
- (println out))))))
+ (defn exec [& cmd]
+ (testing cmd
+ (println "Running" (str "\"" (str/join " " cmd) "\""))
+ (let [{:keys [exit out err]} (apply shell/sh cmd)]
+ (is (= exit 0))
+ (when-not (str/blank? err)
+ (binding [*out* *err*]
+ (println err)))
+ (when-not (str/blank? out)
+ (println out))))))
#?(:clj
-(defn diff [s1 s2]
- (->>
- (diff/wdiff s1 s2)
- (map (fn [[op text]]
- (case op
- :delete (str "\033[37;41;1m" text "\033[0m")
- :insert (str "\033[37;42;1m" text "\033[0m")
- :equal text)))
- (str/join))))
+ (defn diff [s1 s2]
+ (->>
+ (diff/wdiff s1 s2)
+ (map (fn [[op text]]
+ (case op
+ :delete (str "\033[37;41;1m" text "\033[0m")
+ :insert (str "\033[37;42;1m" text "\033[0m")
+ :equal text)))
+ (str/join))))
#?(:clj
-(deftest test-server-render
- ;; run cljsbuid to get target/test.js
- (exec "lein" "with-profile" "dev" "cljsbuild" "once" "test")
- (doseq [f (reverse (file-seq (io/file render-dir)))]
- (.delete ^java.io.File f))
- (.mkdir (io/file render-dir))
- (.mkdir (io/file render-dir "html"))
- (.mkdir (io/file render-dir "markup"))
- ;; run react_render_html using node
- (exec "node" "test/rum/test/react_render_html.js")
- (doseq [[name ctor] components]
- (testing name
- ;; compare html rendered with react
- ;; to html rendered with rum/render-html
- (let [react-html (slurp (str render-dir "/html/" name ".html"))
- rum-html (rum/render-html (ctor))]
- (is (= react-html rum-html) (diff react-html rum-html)))
- (let [react-html (slurp (str render-dir "/markup/" name ".html"))
- rum-html (rum/render-static-markup (ctor))]
- (is (= react-html rum-html) (diff react-html rum-html)))))))
+ (deftest test-server-render
+ ;; run cljsbuid to get target/test.js
+ (exec "lein" "with-profile" "dev" "cljsbuild" "once" "test")
+ (doseq [f (reverse (file-seq (io/file render-dir)))]
+ (.delete ^java.io.File f))
+ (.mkdir (io/file render-dir))
+ (.mkdir (io/file render-dir "html"))
+ (.mkdir (io/file render-dir "markup"))
+ ;; run react_render_html using node
+ (exec "node" "test/rum/test/react_render_html.js")
+ (doseq [[name ctor] components]
+ (testing name
+ ;; compare html rendered with react
+ ;; to html rendered with rum/render-html
+ (let [react-html (slurp (str render-dir "/html/" name ".html"))
+ rum-html (rum/render-html (ctor))]
+ (is (= react-html rum-html) (diff react-html rum-html)))
+ (let [react-html (slurp (str render-dir "/markup/" name ".html"))
+ rum-html (rum/render-static-markup (ctor))]
+ (is (= react-html rum-html) (diff react-html rum-html)))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment