Blame


1 ddc03123 2020-03-28 op (ns blog.core
2 ddc03123 2020-03-28 op (:require [blog.time :as time]
3 ddc03123 2020-03-28 op [blog.templates :as templates]
4 4f9bd2e2 2020-03-30 op [blog.rss :as rss]
5 ddc03123 2020-03-28 op [boot.core :as core]
6 ddc03123 2020-03-28 op [boot.task.built-in :as task]
7 ddc03123 2020-03-28 op [ring.adapter.jetty :as jetty]
8 ddc03123 2020-03-28 op [ring.middleware.resource :refer [wrap-resource]]
9 ddc03123 2020-03-28 op [ring.middleware.content-type :refer [wrap-content-type]]
10 ddc03123 2020-03-28 op [clojure.java.io :as io]
11 ddc03123 2020-03-28 op [clojure.java.shell :refer [sh]])
12 ddc03123 2020-03-28 op (:import (java.io File)))
13 ddc03123 2020-03-28 op
14 ddc03123 2020-03-28 op (defn copy-file [src dst]
15 ddc03123 2020-03-28 op (with-open [in (io/input-stream (io/file src))
16 ddc03123 2020-03-28 op out (io/output-stream (io/file dst))]
17 ddc03123 2020-03-28 op (io/copy in out)))
18 ddc03123 2020-03-28 op
19 ddc03123 2020-03-28 op (defn post [{:keys [slug title short date tags]}]
20 ddc03123 2020-03-28 op (let [f (io/resource (str "posts/" slug ".md"))]
21 ddc03123 2020-03-28 op {:slug slug
22 ddc03123 2020-03-28 op :title title
23 ddc03123 2020-03-28 op :short short
24 ddc03123 2020-03-28 op :date (time/parse date)
25 ddc03123 2020-03-28 op :body (slurp f)
26 ddc03123 2020-03-28 op :tags tags}))
27 ddc03123 2020-03-28 op
28 ddc03123 2020-03-28 op (def per-tag (atom {}))
29 ddc03123 2020-03-28 op (def posts (atom []))
30 ddc03123 2020-03-28 op
31 ddc03123 2020-03-28 op (defn add-post! [m]
32 ddc03123 2020-03-28 op (let [p (post m)]
33 ddc03123 2020-03-28 op (swap! posts conj p)
34 ddc03123 2020-03-28 op (doseq [t (:tags m)]
35 ddc03123 2020-03-28 op (swap! per-tag update t conj p))))
36 ddc03123 2020-03-28 op
37 ddc03123 2020-03-28 op (load "posts")
38 ddc03123 2020-03-28 op
39 ddc03123 2020-03-28 op (defn create-dirs! []
40 ddc03123 2020-03-28 op (doseq [d ["resources/out"
41 ddc03123 2020-03-28 op "resources/out/css"
42 ddc03123 2020-03-28 op "resources/out/post"
43 ddc03123 2020-03-28 op "resources/out/tag"
44 ddc03123 2020-03-28 op "resources/out/img"]]
45 ddc03123 2020-03-28 op (.. (File. d) mkdirs)))
46 ddc03123 2020-03-28 op
47 ddc03123 2020-03-28 op (defn post-pages []
48 ddc03123 2020-03-28 op (let [tags (keys @per-tag)]
49 ddc03123 2020-03-28 op (map-indexed (fn [i posts]
50 ddc03123 2020-03-28 op {:filename (if (= i 0)
51 ddc03123 2020-03-28 op "index.html"
52 ddc03123 2020-03-28 op (str (inc i) ".html"))
53 ddc03123 2020-03-28 op :tags tags
54 ddc03123 2020-03-28 op :nth (inc i)
55 ddc03123 2020-03-28 op :posts posts
56 ddc03123 2020-03-28 op :has-next true
57 ddc03123 2020-03-28 op :has-prev true})
58 ddc03123 2020-03-28 op (partition-all 6 @posts))))
59 ddc03123 2020-03-28 op
60 ddc03123 2020-03-28 op (defn fix-next-last
61 ddc03123 2020-03-28 op "Fix the :has-prev/:has-next for the post pages. This assumes
62 ddc03123 2020-03-28 op that `(not (empty? post-pages))`"
63 ddc03123 2020-03-28 op [post-pages]
64 ddc03123 2020-03-28 op (-> post-pages
65 ddc03123 2020-03-28 op (->> (into []))
66 ddc03123 2020-03-28 op (update 0 assoc :has-prev false)
67 ddc03123 2020-03-28 op (update (dec (count post-pages)) assoc :has-next false)))
68 ddc03123 2020-03-28 op
69 ddc03123 2020-03-28 op (defn render-post-list []
70 ddc03123 2020-03-28 op (doseq [p (fix-next-last (post-pages))
71 ddc03123 2020-03-28 op :let [{:keys [filename]} p]]
72 ddc03123 2020-03-28 op (spit (str "resources/out/" filename)
73 ddc03123 2020-03-28 op (templates/home-page p))))
74 ddc03123 2020-03-28 op
75 ddc03123 2020-03-28 op (defn render-post [{s :slug, :as post}]
76 ddc03123 2020-03-28 op (spit (str "resources/out/post/" s ".html")
77 ddc03123 2020-03-28 op (templates/post-page post)))
78 ddc03123 2020-03-28 op
79 ddc03123 2020-03-28 op (defn render-tags [tags]
80 ddc03123 2020-03-28 op (spit (str "resources/out/tags.html")
81 ddc03123 2020-03-28 op (templates/tags-page tags)))
82 ddc03123 2020-03-28 op
83 ddc03123 2020-03-28 op (defn render-tag [tag posts]
84 ddc03123 2020-03-28 op (spit (str "resources/out/tag/" tag ".html")
85 ddc03123 2020-03-28 op (templates/tag-page tag posts)))
86 ddc03123 2020-03-28 op
87 4f9bd2e2 2020-03-30 op (defn render-rss []
88 4f9bd2e2 2020-03-30 op (spit (str "resources/out/rss.xml")
89 4f9bd2e2 2020-03-30 op (rss/feed @posts)))
90 4f9bd2e2 2020-03-30 op
91 ddc03123 2020-03-28 op (defn copy-dir
92 ddc03123 2020-03-28 op "Copy the content of resources/`dir` to resources/out/`dir`, assuming
93 ddc03123 2020-03-28 op these two directories exists. It does not copy recursively."
94 ddc03123 2020-03-28 op [dir]
95 ddc03123 2020-03-28 op (let [in (io/file (str "resources/" dir "/"))
96 ddc03123 2020-03-28 op out (str "resources/out/" dir "/")]
97 ddc03123 2020-03-28 op (doseq [f (->> in file-seq (filter #(.isFile %)))]
98 ddc03123 2020-03-28 op (io/copy f (io/file (str out (.getName f)))))))
99 ddc03123 2020-03-28 op
100 ddc03123 2020-03-28 op (comment
101 ddc03123 2020-03-28 op (copy-dir "img")
102 ddc03123 2020-03-28 op (io/copy (io/file "resources/img/unbound-dashboard.png")
103 ddc03123 2020-03-28 op (io/file "resources/out/img/unbound-dashboard.png"))
104 ddc03123 2020-03-28 op )
105 ddc03123 2020-03-28 op
106 ddc03123 2020-03-28 op (defn copy-assets
107 ddc03123 2020-03-28 op "Copy css and images to their places"
108 ddc03123 2020-03-28 op []
109 ddc03123 2020-03-28 op (copy-dir "img")
110 ddc03123 2020-03-28 op (copy-file "resources/favicon.ico" "resources/out/favicon.ico")
111 ddc03123 2020-03-28 op (copy-file "resources/css/style.css" "resources/out/css/style.css"))
112 ddc03123 2020-03-28 op
113 ddc03123 2020-03-28 op (core/deftask build
114 ddc03123 2020-03-28 op "Build the blog"
115 ddc03123 2020-03-28 op []
116 ddc03123 2020-03-28 op (create-dirs!)
117 ddc03123 2020-03-28 op (copy-assets)
118 4f9bd2e2 2020-03-30 op (render-rss)
119 ddc03123 2020-03-28 op (render-post-list)
120 ddc03123 2020-03-28 op (doseq [p @posts]
121 ddc03123 2020-03-28 op (render-post p))
122 ddc03123 2020-03-28 op (render-tags (keys @per-tag))
123 ddc03123 2020-03-28 op (doseq [t @per-tag
124 ddc03123 2020-03-28 op :let [[tag posts] t]]
125 ddc03123 2020-03-28 op (render-tag (name tag) posts)))
126 ddc03123 2020-03-28 op
127 ddc03123 2020-03-28 op (def j (atom nil))
128 ddc03123 2020-03-28 op
129 ddc03123 2020-03-28 op (core/deftask serve
130 ddc03123 2020-03-28 op "Serve a preview"
131 ddc03123 2020-03-28 op []
132 ddc03123 2020-03-28 op (reset!
133 ddc03123 2020-03-28 op j
134 ddc03123 2020-03-28 op (jetty/run-jetty (-> (fn [_] {:status 404, :body "not found"})
135 ddc03123 2020-03-28 op (wrap-resource "out")
136 ddc03123 2020-03-28 op (wrap-content-type))
137 ddc03123 2020-03-28 op {:port 3000
138 ddc03123 2020-03-28 op :join? false})))
139 ddc03123 2020-03-28 op
140 60905fa3 2020-03-29 op (core/deftask clean
141 60905fa3 2020-03-29 op "clean the output directory"
142 60905fa3 2020-03-29 op []
143 ac603499 2020-03-29 op (sh "rm" "-rf" "resources/out/"))
144 60905fa3 2020-03-29 op
145 ddc03123 2020-03-28 op (core/deftask deploy
146 ddc03123 2020-03-28 op "Copy the files to the server"
147 ddc03123 2020-03-28 op []
148 ddc03123 2020-03-28 op (sh "openrsync" "-r" "--delete" "resources/out/" "op:sites/www.omarpolo.com/"))
149 ddc03123 2020-03-28 op
150 ddc03123 2020-03-28 op (defn stop-jetty []
151 ddc03123 2020-03-28 op (.stop @j)
152 ddc03123 2020-03-28 op (reset! j nil))
153 ddc03123 2020-03-28 op
154 ddc03123 2020-03-28 op (comment
155 ddc03123 2020-03-28 op (build)
156 ddc03123 2020-03-28 op (serve)
157 ddc03123 2020-03-28 op (stop-jetty)
158 ddc03123 2020-03-28 op )