/
breadcrumb.clj
52 lines (43 loc) · 1.71 KB
/
breadcrumb.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
(ns mycroft.breadcrumb
(:use [hiccup.page-helpers :only (encode-params)]))
(defn options->query-string
"Generate query string for the options provided. Options include
:selectors vector of selectors for select-in
:start first item to show (for pagination)
:headers explicitly select table headers."
[options]
(str "?" (encode-params options)))
(defn namespace-link
[ns-name]
[:a {:href (str "/vars/" ns-name)} ns-name])
(defn top-link
[]
[:a {:href (str "/vars")} "top"])
(defn var-link
[ns-name var-name]
[:a {:href (str "/vars/" ns-name "/" (java.net.URLEncoder/encode (str var-name)))} var-name])
(defn breadcrumb-text
"Convert the internal names for meta and deref into user-friendly terms,
everything else renders unchanged."
[selector-component]
(get {:mycroft.data/deref "@" :mycroft.data/meta "<meta>"} selector-component selector-component))
(defn render
[ns var {:keys [selector]}]
[:div {:id "breadcrumb"}
(if ns (top-link) "ns")
(when ns
[:span " « "
(if var (namespace-link ns) ns)])
(when var
[:span " / "
(if selector (var-link (.ns var) (.sym var)) (.sym var))])
(when selector
(let [first-crumb (if (= ::deref (first selector)) 2 1)]
[:span
(->> (map (fn [n] (subvec selector 0 n)) (range first-crumb (count selector)))
(map (fn [partial-selector]
[:span
" » "
[:a {:href (options->query-string {:selectors partial-selector})}
(breadcrumb-text (last partial-selector)) ]])))
[:span " » " (breadcrumb-text (last selector))]]))])