|
| 1 | +(ns core |
| 2 | + "Parse files and generate some html reports" |
| 3 | + (:require [clojure.string :as str] |
| 4 | + [hiccup.core :as hiccup] |
| 5 | + [clojure.java.io :as io])) |
| 6 | + |
| 7 | +;; TODO: do something whenever the mode has just `.yas-parents` and nothing else? |
| 8 | +(def bulma-url "https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.css") |
| 9 | + |
| 10 | +(defn kw-pattern |
| 11 | + [kw] |
| 12 | + (re-pattern (format "# %s: (.*)" kw))) |
| 13 | + |
| 14 | +(defn extract-keyword |
| 15 | + [filename keyword] |
| 16 | + (let [lines (-> filename |
| 17 | + slurp |
| 18 | + str/split-lines)] |
| 19 | + (first |
| 20 | + (remove nil? |
| 21 | + (map #(last (re-find (kw-pattern keyword) %)) lines))))) |
| 22 | + |
| 23 | +(defn mode-files |
| 24 | + [mode-dir] |
| 25 | + (filter #(.isFile %) |
| 26 | + (file-seq (io/file mode-dir)))) |
| 27 | + |
| 28 | +(defn parse-mode |
| 29 | + [mode-dir] |
| 30 | + (for [f (mode-files mode-dir)] |
| 31 | + {:filename (.getName (io/file mode-dir f)) |
| 32 | + :name (extract-keyword f "name") |
| 33 | + :key (or (extract-keyword f "key") |
| 34 | + (extract-keyword f "name")) |
| 35 | + :group (extract-keyword f "group") |
| 36 | + :desc (extract-keyword f "desc")})) |
| 37 | + |
| 38 | +(defn parse-everything |
| 39 | + [snippets-dir] |
| 40 | + (into {} |
| 41 | + (remove nil?) |
| 42 | + (for [d (file-seq (io/file snippets-dir))] |
| 43 | + (when (.isDirectory d) |
| 44 | + {(.getName d) (parse-mode d)})))) |
| 45 | + |
| 46 | +(defn store-to-edn |
| 47 | + [snippets-dir output-file] |
| 48 | + (spit output-file (parse-everything snippets-dir))) |
| 49 | + |
| 50 | +(def header [:name :key :filename :group :desc]) |
| 51 | + |
| 52 | +(defn table |
| 53 | + "Generate a table" |
| 54 | + [header rows] |
| 55 | + [:table.table.is-striped |
| 56 | + [:thead (into [:tr.tr] |
| 57 | + (for [h header] |
| 58 | + [:td.td (name h)]))] |
| 59 | + |
| 60 | + (into [:tbody.tbody] |
| 61 | + (for [r rows] |
| 62 | + (into [:tr.tr] |
| 63 | + (for [h header] |
| 64 | + [:td.td (r h)]))))]) |
| 65 | + |
| 66 | +(defn structure |
| 67 | + [body] |
| 68 | + [:html |
| 69 | + [:head |
| 70 | + [:link {:rel "stylesheet" |
| 71 | + :href bulma-url |
| 72 | + :crossorigin "anonymous"}]] |
| 73 | + (into [:body] body)]) |
| 74 | + |
| 75 | +(defn gen-html |
| 76 | + [snips-dir] |
| 77 | + (let [all-modes (parse-everything snips-dir) |
| 78 | + tables (for [[m snips] (sort all-modes)] |
| 79 | + [:div.section |
| 80 | + [:h2.subtitle m] |
| 81 | + (table header snips)])] |
| 82 | + (spit |
| 83 | + "hello.html" |
| 84 | + (hiccup/html |
| 85 | + (structure tables))))) |
| 86 | + |
| 87 | +(comment |
| 88 | + (gen-html "../snippets")) |
0 commit comments