109 lines
2.7 KiB
Clojure
109 lines
2.7 KiB
Clojure
(ns core
|
|
"Parse files and generate some html reports"
|
|
(:require [clojure.string :as str]
|
|
[hiccup.core :as hiccup]
|
|
[clojure.java.io :as io]))
|
|
|
|
;; TODO: do something whenever the mode has just `.yas-parents` and nothing else?
|
|
(def bulma-url "https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.css")
|
|
|
|
(defn kw-pattern
|
|
[kw]
|
|
(re-pattern (format "# %s: (.*)" kw)))
|
|
|
|
(defn extract-keyword
|
|
[filename keyword]
|
|
(let [lines (-> filename
|
|
slurp
|
|
str/split-lines)]
|
|
(first
|
|
(remove nil?
|
|
(map #(last (re-find (kw-pattern keyword) %)) lines)))))
|
|
|
|
(defn mode-files
|
|
[mode-dir]
|
|
(filter #(.isFile %)
|
|
(file-seq (io/file mode-dir))))
|
|
|
|
(defn parse-mode
|
|
[mode-dir]
|
|
(for [f (mode-files mode-dir)]
|
|
{:filename (.getName (io/file mode-dir f))
|
|
:name (extract-keyword f "name")
|
|
:key (or (extract-keyword f "key")
|
|
(extract-keyword f "name"))
|
|
:group (extract-keyword f "group")
|
|
:desc (extract-keyword f "desc")}))
|
|
|
|
(defn parse-everything
|
|
[snippets-dir]
|
|
(into {}
|
|
(remove nil?)
|
|
(for [d (file-seq (io/file snippets-dir))]
|
|
(when (.isDirectory d)
|
|
{(.getName d) (parse-mode d)}))))
|
|
|
|
(defn store-to-edn
|
|
[snippets-dir output-file]
|
|
(spit output-file (parse-everything snippets-dir)))
|
|
|
|
(def header [:name :key :filename :group :desc])
|
|
|
|
(defn table
|
|
"Generate a table"
|
|
[header rows]
|
|
[:table.table.is-striped
|
|
[:thead (into [:tr.tr]
|
|
(for [h header]
|
|
[:td.td (name h)]))]
|
|
|
|
(into [:tbody.tbody]
|
|
(for [r rows]
|
|
(into [:tr.tr]
|
|
(for [h header]
|
|
[:td.td (r h)]))))])
|
|
|
|
(defn structure
|
|
[body]
|
|
[:html
|
|
[:head
|
|
[:link {:rel "stylesheet"
|
|
:href bulma-url
|
|
:crossorigin "anonymous"}]]
|
|
(into [:body] body)])
|
|
|
|
(defn gen-html
|
|
[snips-dir]
|
|
(let [all-modes (parse-everything snips-dir)
|
|
tables (for [[m snips] (sort all-modes)]
|
|
[:div.section
|
|
[:h2.subtitle m]
|
|
(table header snips)])]
|
|
(spit
|
|
"hello.html"
|
|
(hiccup/html
|
|
(structure tables)))))
|
|
|
|
(def mode-line "# -*- mode: snippet -*-")
|
|
|
|
(defn all-snips
|
|
[d]
|
|
(filter #(and (.isFile %)
|
|
(not= (.getName %) ".yas-parents")
|
|
(not (.endsWith (str %) ".el")))
|
|
|
|
(file-seq (io/file d))))
|
|
|
|
(defn fix-all-modelines
|
|
[snips]
|
|
(doseq [s snips]
|
|
(let [content (-> s slurp str/split-lines)
|
|
f-line (first content)]
|
|
|
|
(when-not (str/includes? f-line "# -*- mode")
|
|
(println "Writing to " s)
|
|
(spit s (str/join "\n" (cons mode-line content)))))))
|
|
|
|
(comment
|
|
(gen-html "../snippets"))
|