diff --git a/project.clj b/project.clj index f711f79..4ef9d57 100644 --- a/project.clj +++ b/project.clj @@ -7,4 +7,5 @@ [hiccup "2.0.0-RC3"]] :repl-options {:init-ns website.core} :main website.main + :plugins [[dev.weavejester/lein-cljfmt "0.13.0"]] ) diff --git a/src/website/core.clj b/src/website/core.clj index ad9dd16..4dd4133 100644 --- a/src/website/core.clj +++ b/src/website/core.clj @@ -1,19 +1,74 @@ (ns website.core - (:require [clojure.java.io :as io])) - + (:require + [clojure.java.io :as io] + [clojure.string :as string] + )) +(def template-reg #"#\{\{(.*)\}\}") (def template-dir "./site/templates") +(def html-dir "./site/html") +(def output-dir "./out") ;; Thank you https://clojure.org/api/cheatsheet -(def template-map +; Generate a keyword-string map of the templates folder +(defn generate-template-map [template-dir] "Grab all files in the template directory and insert them into a map with the filenames as keyword keys" (let [files (filter #(.isFile %) (file-seq (io/file template-dir))) - ] (mapcat #(assoc {} (keyword (.getName %)) (slurp %)) files))) + ] + (reduce #(assoc %1 (keyword (.getName %2)) (slurp %2)) {} files) + ) + ) +; Generate a string-string map of the new filepaths and the unprocessed contents +(defn generate-output-file-map [html-dir, output-dir] + "Take the input html files, read them, and create a mapping of their paths to + their contents. + This would probably be better as a list of maps each containing a :contents + and :path keyword. + " + (let [file-listing (filter #(.isFile %) (file-seq (io/file html-dir))) + contents (map slurp file-listing) + old-paths (map #(.getPath %) file-listing) + rootless-paths (map #(subs % (count html-dir)) old-paths) + new-paths (map #(string/join [output-dir %]) rootless-paths) + ] + (zipmap new-paths contents) + ) + ) -(defn foo - "I don't do a whole lot." - [x] - (println x "Hello, World!")) +(defn put_file [file_map_entry] + "Output a file to a location while ensuring the required parent directories exist." + (io/make-parents (first file_map_entry)) + (spit (first file_map_entry) (second file_map_entry)) + ) + +(defn insert_templates [file-map-entry template-map] + ; Will go through and check all the template names in the file then + ; mark which templates exist and which dont + ; + ; Using this we can report an error for any templates which do not exist + (let [template-names (map first template-map) + file (first file-map-entry) + contents (second file-map-entry) + templates-used (re-seq template-reg contents) + new-contents (reduce #(string/replace %1 (first %2) ((keyword (second %2)) template-map)) contents templates-used) + ] + [file new-contents] + )) + +; Main routine +; Read all the templates +(def template-map (generate-template-map template-dir)) +; Read all the html files +(def output-file-map (generate-output-file-map html-dir output-dir)) + +; For each html file: +; * Insert any matching templates +; * Stick it in the out directory +(for [of output-file-map] + ; of is a key-value pair + (put_file (insert_templates of template-map)) + ;(put_file of) + )