commit 52f2ea1857707c1a448616b262030486abcf9d37 from: Omar Polo date: Sat Oct 03 12:02:38 2020 UTC support building and deploying BOTH http and gemini commit - d68cd6bb12892e777f6f04a882de2be09f757741 commit + 52f2ea1857707c1a448616b262030486abcf9d37 blob - b34045166f18c095a0ef7f6b471894c32c0b87f7 blob + 18e4d87fce13503fa91d8383c9b7f4c0924bd332 --- src/blog/core.clj +++ src/blog/core.clj @@ -1,7 +1,8 @@ (ns blog.core (:require [blog.rss :as rss] - [blog.templates :as templates] + [blog.http :as http] + [blog.gemini :as gemini] [blog.time :as time] [clojure.edn :as edn] [clojure.java.io :as io] @@ -17,10 +18,11 @@ out (io/output-stream (io/file dst))] (io/copy in out))) -(defn post [{:keys [slug] :as p}] - (-> p - (assoc :body (-> (str "posts/" slug ".md") io/resource slurp)) - (update :date time/parse))) +(defn post [{:keys [slug gemtext?] :as p}] + (let [ext (if gemtext? ".gmi" ".md")] + (-> p + (assoc :body (-> (str "posts/" slug ext) io/resource slurp)) + (update :date time/parse)))) (def per-tag (atom {})) (def posts (atom [])) @@ -42,24 +44,32 @@ (defn create-dirs! [] (doseq [d ["resources/out" - "resources/out/css" - "resources/out/post" - "resources/out/tag" - "resources/out/img"]] + "resources/out/gemini" + "resources/out/gemini/post" + "resources/out/gemini/tag" + "resources/out/http" + "resources/out/http/css" + "resources/out/http/post" + "resources/out/http/tag" + "resources/out/http/img"]] (.. (File. d) mkdirs))) -(defn post-pages [] - (let [tags (keys @per-tag)] +(defn gemini-post [{? :gemtext?}] ?) + +(defn post-pages [{:keys [proto]}] + (let [tags (keys @per-tag) + ext (if (= proto :gemini) ".gmi" ".html") + ffn (if (= proto :gemini) gemini-post identity)] (map-indexed (fn [i posts] {:filename (if (= i 0) - "index.html" - (str (inc i) ".html")) + (str "index" ext) + (str (inc i) ext)) :tags tags :nth (inc i) :posts posts :has-next true :has-prev true}) - (partition-all 6 @posts)))) + (partition-all 6 (filter ffn @posts))))) (defn fix-next-last "Fix the :has-prev/:has-next for the post pages. This assumes @@ -70,26 +80,26 @@ (update 0 assoc :has-prev false) (update (dec (count post-pages)) assoc :has-next false))) -(defn render-post-list [] - (doseq [p (fix-next-last (post-pages)) +(defn render-post-list [viewfn proto] + (doseq [p (fix-next-last (post-pages {:proto proto})) :let [{:keys [filename]} p]] - (spit (str "resources/out/" filename) - (templates/home-page p)))) + (spit (str "resources/out/" (name proto) "/" filename) + (viewfn p)))) -(defn render-post [{s :slug, :as post}] - (spit (str "resources/out/post/" s ".html") - (templates/post-page post))) +(defn render-post [viewfn proto ext {s :slug, :as post}] + (spit (str "resources/out/" (name proto) "/post/" s ext) + (viewfn post))) -(defn render-tags [tags] - (spit (str "resources/out/tags.html") - (templates/tags-page tags))) +(defn render-tags [viewfn proto ext tags] + (spit (str "resources/out/" (name proto) "/tags" ext) + (viewfn tags))) -(defn render-tag [tag posts] - (spit (str "resources/out/tag/" tag ".html") - (templates/tag-page tag posts))) +(defn render-tag [viewfn proto ext tag posts] + (spit (str "resources/out/" (name proto) "/tag/" tag ext) + (viewfn tag posts))) (defn render-rss [] - (spit (str "resources/out/rss.xml") + (spit (str "resources/out/http/rss.xml") (rss/feed @posts))) (defn copy-dir @@ -97,36 +107,44 @@ these two directories exists. It does not copy recursively." [dir] (let [in (io/file (str "resources/" dir "/")) - out (str "resources/out/" dir "/")] + out (str "resources/out/http/" dir "/")] (doseq [f (->> in file-seq (filter #(.isFile %)))] (io/copy f (io/file (str out (.getName f))))))) (comment (copy-dir "img") (io/copy (io/file "resources/img/unbound-dashboard.png") - (io/file "resources/out/img/unbound-dashboard.png")) + (io/file "resources/out/http/img/unbound-dashboard.png")) ) (defn copy-assets "Copy css and images to their places" [] (copy-dir "img") - (copy-file "resources/favicon.ico" "resources/out/favicon.ico") - (copy-file "resources/css/style.css" "resources/out/css/style.css")) + (copy-file "resources/favicon.ico" "resources/out/http/favicon.ico") + (copy-file "resources/css/style.css" "resources/out/http/css/style.css")) +(comment (build) + (count (filter gemini-post @posts)) + (gemini/post-page (first @posts)) + ) + (defn build "Build the blog" [] (create-dirs!) (copy-assets) (render-rss) - (render-post-list) - (doseq [p @posts] - (render-post p)) - (render-tags (keys @per-tag)) - (doseq [t @per-tag - :let [[tag posts] t]] - (render-tag (name tag) posts))) + (doseq [[proto ffn ext homefn postfn tagsfn tagfn] + [[:http identity ".html" http/home-page http/post-page http/tags-page http/tag-page] + [:gemini gemini-post ".gmi" gemini/home-page gemini/post-page gemini/tags-page gemini/tag-page]]] + (render-post-list homefn proto) + (doseq [p (filter ffn @posts)] + (render-post postfn proto ext p)) + (render-tags tagsfn proto ext (keys @per-tag)) + (doseq [t @per-tag + :let [[tag posts] t]] + (render-tag tagfn proto ext (name tag) (filter ffn posts))))) (def j (atom nil)) @@ -144,17 +162,19 @@ (defn clean "clean the output directory" [] - (sh "rm" "-rf" "resources/out/")) + (sh "rm" "-rf" "resources/out/http/") + (sh "rm" "-rf" "resources/out/gemini/")) (defn local-deploy "Copy the files to the local server" [] - (sh "rsync" "-r" "--delete" "resources/out/" "/var/www/omarpolo.local/")) + (sh "rsync" "-r" "--delete" "resources/out/http/" "/var/www/omarpolo.local/")) (defn deploy "Copy the files to the server" [] - (sh "rsync" "-r" "--delete" "resources/out/" "op:sites/www.omarpolo.com/")) + (sh "rsync" "-r" "--delete" "resources/out/http/" "op:sites/www.omarpolo.com/") + (sh "rsync" "-r" "--delete" "resources/out/gemini/" "op:gemini")) (defn stop-jetty [] (.stop @j)