-
Notifications
You must be signed in to change notification settings - Fork 228
/
utils.clj
111 lines (99 loc) · 3.63 KB
/
utils.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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
(ns foreclojure.utils
(:use (hiccup [core :only [html]]
[page-helpers :only [doctype include-css
javascript-tag link-to include-js]]
[form-helpers :only [label]])
[amalloy.utils.transform :only [transform-if]]
somnium.congomongo)
(:require [sandbar.stateful-session :as session]
(ring.util [response :as response])
[clojure.walk :as walk]))
(defmacro dbg [x]
`(let [x# ~x] (println '~x "=" x#) x#))
(defmacro assuming
"Guard body with a series of tests. Each clause is a test-expression
followed by a failure value. Tests will be performed in order; if
each test succeeds, then body is evaluated. Otherwise, fail-expr is
evaluated with the symbol 'why bound to the failure value associated
with the failing test."
[[& clauses] body & [fail-expr]]
`(if-let [[~'why]
(cond
~@(mapcat (fn [[test fail-value]]
[`(not ~test) [fail-value]])
(partition 2 clauses)))]
~fail-expr
~body))
(defn flash-fn [type]
(fn [msg url]
(session/flash-put! type msg)
(response/redirect url)))
(def flash-error (flash-fn :error))
(def flash-msg (flash-fn :message))
(defmacro def-page [page-name [& args] & code]
`(defn ~page-name [~@args]
(html-doc
~@code)))
(defn from-mongo [data]
(walk/postwalk (transform-if float? int)
data))
(defmacro with-user [[user-binding] & body]
`(if-let [username# (session/session-get :user)]
(let [~user-binding (from-mongo
(fetch-one :users :where {:user username#}))]
~@body)
[:span.error "You must " (link-to "/login" "Log in") " to do this."]))
(defn form-row [[type name info]]
[:tr
[:td (label name info)]
[:td (type name)]])
(defn row-class [x]
{:class (if (even? x)
"evenrow"
"oddrow")})
(defn html-doc [& body]
(html
(doctype :html5)
[:html
[:head
[:title "4Clojure"]
(include-js "/script/jquery-1.5.2.min.js" "/script/jquery.dataTables.min.js")
(include-js "/script/foreclojure.js")
(include-css "/css/style.css" "/css/demo_table.css")
]
[:body
[:div#top
[:img#logo {:src "/images/logo.png"}]]
[:div#content
(if (session/session-get :user)
[:div#account
[:a {:href "/login/update"} "Account Settings"]])
[:br]
[:div#menu
[:a.menu {:href "/"} "Main Page"]
[:a.menu {:href "/problems"} "Problem List"]
[:a.menu {:href "/users"} "Top Users"]
[:a.menu {:href "/directions"} "Getting Started"]
[:span#user-info
(if-let [user (session/session-get :user)]
[:div
[:span#username (str "Logged in as " user )]
[:a#logout {:href "/logout"} "Logout"]]
[:div
[:a#login {:href "/login"} "Login"]
[:a#register {:href "/register"} "Register"]])]]
[:div#content body]
[:div#footer
"The content on 4clojure.com is available under the EPL v 1.0 license."
[:a#contact {:href "mailto:team@4clojure.com"} "Contact us!"]]
(javascript-tag
" var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-22844856-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
"
)]]]))