Hash in url bar is page to load for frames When you click a nav link, it sets the hash If you go to nav link in new tab, and click home, it will load the same page, but in the frames
144 lines
4.4 KiB
Clojure
144 lines
4.4 KiB
Clojure
(ns play-clj-doclet.html
|
|
(:require [clojure.java.io :as io]
|
|
[clojure.string :as string]
|
|
[hiccup.core :refer :all]))
|
|
|
|
(defn str->filename
|
|
[ns s]
|
|
(-> (subs ns (+ (.lastIndexOf ns ".") 1))
|
|
(str "." s)
|
|
(string/replace "?" "_q")
|
|
(string/replace "->" "_")
|
|
(string/replace ">" "_r")
|
|
(string/replace "<" "_l")
|
|
(str ".html")))
|
|
|
|
(defn sidebar
|
|
[parsed-files]
|
|
[:div {:class "sidebar"}
|
|
(for [[ns groups] parsed-files]
|
|
(cons [:div {:class "ns"} ns]
|
|
(for [{:keys [name]} groups]
|
|
[:div {:class "name"}
|
|
[:a {:href (str->filename ns name) :target "content-frame" :onClick (str "setHash(this)") :newHash (str->filename ns name)}
|
|
name]])))])
|
|
|
|
(defn java-param
|
|
[[type-name param-name]]
|
|
(html [:span {:class "j-arg"}
|
|
[:span {:class "j-type"} "^" type-name]
|
|
" "
|
|
param-name]))
|
|
|
|
(defn java-item
|
|
[{:keys [name text type args]}]
|
|
[:div {:class "j-item"}
|
|
[:span {:class "j-name"}
|
|
(str name)]
|
|
[:span {:class "j-args"}
|
|
(string/join ", " (map java-param args))]
|
|
(when text
|
|
[:div {:class "j-doc"} text])])
|
|
|
|
(defn content
|
|
[{:keys [name docstring arglists java raw raw*]}]
|
|
[:div {:class "content"}
|
|
[:div {:class "item"}
|
|
[:div {:class "clj"}
|
|
(for [args arglists]
|
|
[:div {:class "c-head"} (pr-str args)])
|
|
[:div {:class "c-doc"} docstring]]
|
|
(when (> (count java) 0)
|
|
(list [:div {:class "c-head"} "Options"]
|
|
(for [[item-name {:keys [text items]}] java]
|
|
(list (when (> (count java) 1)
|
|
[:div {:class "j-text"} text])
|
|
[:div {:class "java"}
|
|
(map java-item items)]))))
|
|
[:div {:class "c-head"} "Source"]
|
|
[:div {:class "c-src"}
|
|
(when raw* [:pre raw*])
|
|
[:pre raw]]]])
|
|
|
|
(defn create-site-file
|
|
([name content home-link-hash]
|
|
(html [:html
|
|
[:head
|
|
[:title name]
|
|
[:script {:src "nav.js"}]
|
|
[:link {:rel "stylesheet" :href "highlight.css"}]
|
|
[:link {:rel "stylesheet" :href "main.css"}]]
|
|
[:body
|
|
(when home-link-hash
|
|
[:div {:class "headbar"}
|
|
[:a {:href (str "index.html" (if (not-empty home-link-hash)
|
|
(str "#" home-link-hash)
|
|
""))
|
|
:target "_top"} "Home"]])
|
|
content
|
|
[:script {:src "highlight.js"}]
|
|
[:script {:src "main.js"}]]])))
|
|
|
|
(defn create-embed-file
|
|
[content]
|
|
(html [:html [:body content]]))
|
|
|
|
(defn copy-from-res
|
|
[dir file-name]
|
|
(spit (io/file dir file-name)
|
|
(-> file-name io/resource slurp)))
|
|
|
|
(defn index-frameset
|
|
[]
|
|
(html
|
|
[:html
|
|
[:head
|
|
[:title "play-clj docs"]
|
|
[:script {:src "nav.js"}]
|
|
[:link {:rel "stylesheet" :href "highlight.css"}]
|
|
[:link {:rel "stylesheet" :href "main.css"}]]
|
|
[:frameset {:cols "250px,100%" :onLoad "goToHash();"}
|
|
[:frame {:src "sidebar.html"}]
|
|
[:frame {:src "blank.html" :name "content-frame" :id "content-frame"}]
|
|
[:script {:src "highlight.js"}]
|
|
[:script {:src "main.js"}]]]))
|
|
|
|
(defn create-site!
|
|
[dir parsed-files]
|
|
(.mkdir (io/file dir))
|
|
(copy-from-res dir "main.css")
|
|
(copy-from-res dir "main.js")
|
|
(copy-from-res dir "nav.js")
|
|
(copy-from-res dir "highlight.css")
|
|
(copy-from-res dir "highlight.js")
|
|
(doseq [[ns groups] parsed-files]
|
|
(doseq [{:keys [name] :as group} groups]
|
|
(spit (io/file dir (str->filename ns name))
|
|
(create-site-file name (content group) (str->filename ns name)))))
|
|
(spit (io/file dir "sidebar.html")
|
|
(create-site-file "sidebar" (sidebar parsed-files) nil))
|
|
(spit (io/file dir "blank.html")
|
|
(create-site-file "blank" nil ""))
|
|
(spit (io/file dir "index.html")
|
|
(index-frameset))
|
|
(println "Created" (str dir "/")))
|
|
|
|
(defn create-embed!
|
|
[dir parsed-files]
|
|
(.mkdir (io/file dir))
|
|
(doseq [[ns groups] parsed-files]
|
|
(doseq [{:keys [name] :as group} groups]
|
|
(spit (io/file dir (str->filename ns name))
|
|
(create-embed-file (content group)))))
|
|
(spit (io/file dir "index.edn")
|
|
(->> parsed-files
|
|
(map (fn [[ns groups]]
|
|
(for [{:keys [name]} groups]
|
|
{:ns ns
|
|
:name name
|
|
:file (str->filename ns name)})))
|
|
(apply concat)
|
|
vec
|
|
pr-str))
|
|
(println "Created" (str dir "/")))
|