Compare commits
13 Commits
dcaac98252
...
7e6fb22d03
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e6fb22d03 | |||
| ac1c0eacd9 | |||
| e0ceefa399 | |||
| a9d105b639 | |||
| 1c31f4064a | |||
| 4e343fde99 | |||
| d967188e18 | |||
| 694136b643 | |||
| 32a45b3a16 | |||
| 5472d93cff | |||
| 32dad302f0 | |||
| 7fbc5c8059 | |||
| 55dd22f220 |
17
dev/user.clj
Normal file
17
dev/user.clj
Normal file
@@ -0,0 +1,17 @@
|
||||
(ns user
|
||||
(:require [net.deertopia.doerg.server :as server]
|
||||
[net.deertopia.doerg.config :as cfg]
|
||||
[net.deertopia.doerg.cached-file :as cached-file]
|
||||
[babashka.fs :as fs]))
|
||||
|
||||
(cfg/load-config! :profile :dev)
|
||||
|
||||
(when (not= :running (server/status))
|
||||
(server/start!))
|
||||
|
||||
(defn invalidate-html-cache! []
|
||||
(fs/delete-tree (server/html-dir))
|
||||
nil)
|
||||
|
||||
(defn toggle-html-cache! []
|
||||
(alter-var-root #'cached-file/*use-cache?* not))
|
||||
@@ -3,6 +3,7 @@
|
||||
#env IBM_PLEX_WEB]
|
||||
:latex "xelatex"
|
||||
:dvisvgm "dvisvgm"
|
||||
:debug-unimplemented? #profile {:dev true :default false}
|
||||
:doerg-temml-worker
|
||||
#profile {:dev #file "../../../../doerg-temml-worker/index.js"
|
||||
:default "doerg-temml-worker"}
|
||||
|
||||
@@ -66,9 +66,6 @@
|
||||
(throw (ex-info "Failed to conform config"
|
||||
(s/explain-data ::config r))))))
|
||||
|
||||
(defn load-config! [var spec files & {:as opts}]
|
||||
(alter-var-root var (constantly (read-config files opts))))
|
||||
|
||||
(def sources
|
||||
[;; Default config.
|
||||
(io/resource "net/deertopia/doerg/default-config.edn")
|
||||
@@ -80,3 +77,10 @@
|
||||
(def default (read-config sources))
|
||||
|
||||
(def ^:dynamic *cfg* default)
|
||||
|
||||
(defn load-config!
|
||||
([& {:as opts :keys [files]
|
||||
:or {files sources}}]
|
||||
(let [passthru-opts (-> opts (dissoc :files))]
|
||||
(alter-var-root
|
||||
#'*cfg* (constantly (read-config files passthru-opts))))))
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
[babashka.process :as p]
|
||||
[cheshire.core :as json]
|
||||
[clojure.core.match :refer [match]]
|
||||
[net.deertopia.doerg :as-alias doerg]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.set :as set]
|
||||
[clojure.string :as str]
|
||||
@@ -35,7 +34,7 @@
|
||||
:or {in *in*}}]
|
||||
(let [r (-> (p/process
|
||||
{:in in :out :string}
|
||||
(-> cfg/*cfg* ::doerg/doerg-parser str))
|
||||
(-> cfg/*cfg* ::cfg/doerg-parser str))
|
||||
(common/deref-with-timeout *uniorg-timeout-duration*))]
|
||||
(when (zero? (:exit r))
|
||||
(-> r :out (json/parse-string (comp keyword camel->kebab))))))
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
(ns net.deertopia.doerg.main
|
||||
(:require [net.deertopia.doerg.server :as server]
|
||||
[net.deertopia.doerg.config :as cfg])
|
||||
(:gen-class))
|
||||
|
||||
(defn -main []
|
||||
(println "hello from doerg"))
|
||||
(defn -main [& _]
|
||||
(binding [cfg/*cfg* (cfg/read-config cfg/sources)]
|
||||
(server/start!)))
|
||||
|
||||
@@ -63,16 +63,19 @@
|
||||
|
||||
(defn org-document
|
||||
"Recursively render an Org-mode document to Hiccup."
|
||||
[doc & {:as opts :keys [postamble]}]
|
||||
[doc & {:as opts :keys [postamble header title]}]
|
||||
(binding [*opts* opts]
|
||||
(tex-temml/binding-worker
|
||||
(let [rendered (-> doc gather-footnotes render-tex-snippets
|
||||
org-element-recursive)]
|
||||
[:html
|
||||
[:head
|
||||
[:title "org document"]
|
||||
(when title
|
||||
[:title title])
|
||||
doerg-html/head]
|
||||
[:body {:lang default-language}
|
||||
(when header
|
||||
[:header header])
|
||||
[:article
|
||||
rendered
|
||||
(when postamble
|
||||
@@ -273,11 +276,14 @@
|
||||
(defmethod org-element "bold" [{:keys [children]}]
|
||||
[:b children])
|
||||
|
||||
(defmethod org-element "strike-through" [{:keys [children]}]
|
||||
[:s children])
|
||||
|
||||
(defmethod org-element "subscript" [{:keys [children]}]
|
||||
[:sub children])
|
||||
|
||||
(defmethod org-element "superscript" [{:keys [children]}]
|
||||
[:super children])
|
||||
[:sup children])
|
||||
|
||||
(defmethod org-element "italic" [{:keys [children]}]
|
||||
[:em children])
|
||||
@@ -382,9 +388,18 @@
|
||||
(defmethod org-keyword "TITLE" [{:keys [value]}]
|
||||
[:h1 value])
|
||||
|
||||
(defmethod org-keyword "SUBTITLE" [{:keys [value]}]
|
||||
[:p.subtitle value])
|
||||
|
||||
(defmethod org-keyword "LATEX_COMPILER" [_] nil)
|
||||
(defmethod org-keyword "LATEX_HEADER" [_] nil)
|
||||
|
||||
;; TODO: A bunch of things I'd rather hide for now, but should be
|
||||
;; implemented eventually.
|
||||
(defmethod org-keyword "FILETAGS" [_] nil)
|
||||
(defmethod org-element "planning" [_] nil)
|
||||
(defmethod org-element "timestamp" [_] nil)
|
||||
|
||||
;; Not sure how to deal with this one yet.
|
||||
(defmethod org-keyword "AUTHOR" [_] nil)
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
(fs/create-dirs dest)
|
||||
(fs/create-dirs resource-dir)
|
||||
(force-create-sym-link (fs/file resource-dir "ibm-plex-web")
|
||||
(-> cfg/*cfg* ::doerg/ibm-plex-web))
|
||||
(-> cfg/*cfg* ::cfg/ibm-plex-web))
|
||||
(doseq [x #{"Temml-Plex.css" "tuftesque.css" "deerstar.css"}]
|
||||
(force-create-sym-link
|
||||
(fs/file resource-dir x)
|
||||
|
||||
@@ -133,11 +133,11 @@
|
||||
elisp/read-alist)))
|
||||
|
||||
(defn public? [node]
|
||||
(-> node properties (get "DEERTOPIAVISIBILITY") (= "public")))
|
||||
(some-> (properties node) (get "DEERTOPIAVISIBILITY") (= "public")))
|
||||
|
||||
(defn graph-visible? [node]
|
||||
(#{"public" "graphonly"}
|
||||
(-> node properties (get "DEERTOPIAVISIBILITY"))))
|
||||
(some-> (properties node) (get "DEERTOPIAVISIBILITY"))))
|
||||
|
||||
(defn backlinks
|
||||
"Returns a collection of nodes linking to `node`."
|
||||
@@ -149,7 +149,8 @@
|
||||
where links.dest = ?"
|
||||
(elisp/print (str (:id node)))])
|
||||
:let [id' (elisp/read-string id)]
|
||||
:when (-> id' parse-uuid get-node public?)]
|
||||
:when (some-> (-> id' parse-uuid get-node)
|
||||
public?)]
|
||||
(make-node id' {:title (elisp/read-string title)})))
|
||||
|
||||
|
||||
|
||||
@@ -51,8 +51,13 @@
|
||||
(defn html-dir []
|
||||
(-> cfg/*cfg* ::cfg/state-directory (fs/file "html")))
|
||||
|
||||
(defn not-found [req]
|
||||
(response/not-found "not found"))
|
||||
(declare node-by-slug)
|
||||
|
||||
;; This could infinitely loop if the 404 page can't be found. lmfao.
|
||||
(defn not-found [_req]
|
||||
(-> (node-by-slug {:path-params {:slug not-found-slug}})
|
||||
(assoc :status 404))
|
||||
#_(response/not-found "not found"))
|
||||
|
||||
(defn org-file->html-file [org-file]
|
||||
(fs/file (html-dir)
|
||||
@@ -73,14 +78,31 @@
|
||||
#_[:a {:href (str "/n/" (slug/from-uuid path))}
|
||||
(or (seq children) raw-link)]])
|
||||
|
||||
(def navbar
|
||||
"Hiccup element for Deertopia.net's navbar."
|
||||
[:nav.navbar
|
||||
[:ol.navbar-list
|
||||
[:li
|
||||
[:a.home-link {:href "/"}
|
||||
"🦌 deertopia.net"]]
|
||||
#_[:li
|
||||
[:a.home-link {:href "/graph"}
|
||||
"graph"]]
|
||||
#_
|
||||
[:li
|
||||
[:a.home-link {:onclick "alert('unimplemented }:(')"}
|
||||
"search"]]]])
|
||||
|
||||
(defn backlinks-postamble [node]
|
||||
(let [backlinks (roam/backlinks node)]
|
||||
(when-not (empty? backlinks)
|
||||
[:section#backlinks
|
||||
[:h2 "Backlinks"]
|
||||
[:ul
|
||||
(for [n (->> (roam/backlinks node)
|
||||
(for [n (->> backlinks
|
||||
(sort-by (comp str/lower-case roam/title)))]
|
||||
[:li (slug-link (roam/slug n)
|
||||
(roam/title n))])]])
|
||||
(roam/title n))])]])))
|
||||
|
||||
(defn node-by-slug [{{:keys [slug]} :path-params :as req}]
|
||||
(if-some [node (some-> slug slug/from-string roam/get-node)]
|
||||
@@ -91,7 +113,9 @@
|
||||
:stale? (cached-file/newer-than? org-file html-file)
|
||||
:compute #(doerg-render/to-html
|
||||
org-file
|
||||
:postamble (backlinks-postamble node)))
|
||||
:postamble (backlinks-postamble node)
|
||||
:header navbar
|
||||
:title (roam/title node)))
|
||||
(-> (str html-file)
|
||||
response/file-response
|
||||
(response/content-type "text/html")))
|
||||
@@ -118,7 +142,7 @@
|
||||
(if-some [[_ resource] (re-matches #"^/resource/ibm-plex-web/(.*)" uri)]
|
||||
(-> resource
|
||||
(response/file-response
|
||||
{:root (-> doerg-config/*cfg* ::doerg/ibm-plex-web str)}))
|
||||
{:root (-> doerg-config/*cfg* ::cfg/ibm-plex-web str)}))
|
||||
(-> uri
|
||||
(str/replace-first #"^/resource/" "")
|
||||
(response/resource-response
|
||||
|
||||
@@ -83,14 +83,14 @@
|
||||
acc))))
|
||||
|
||||
(defn- invoke-latex [& {:keys [file output-dir]}]
|
||||
(let [latex (-> cfg/*cfg* ::doerg/latex)]
|
||||
(let [latex (-> cfg/*cfg* ::cfg/latex)]
|
||||
(invoke
|
||||
{:dir output-dir}
|
||||
latex "-no-pdf" "-interaction" "nonstopmode"
|
||||
"-output-directory" output-dir file)))
|
||||
|
||||
(defn- invoke-dvisvgm [& {:keys [file output-dir]}]
|
||||
(let [dvisvgm (-> cfg/*cfg* ::doerg/dvisvgm)]
|
||||
(let [dvisvgm (-> cfg/*cfg* ::cfg/dvisvgm)]
|
||||
(invoke
|
||||
{:dir output-dir}
|
||||
dvisvgm "--page=1-" "--optimize" "--clipjoin"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
fs/file))
|
||||
|
||||
(defn worker []
|
||||
(let [doerg-temml-worker (-> cfg/*cfg* ::doerg/doerg-temml-worker)]
|
||||
(let [doerg-temml-worker (-> cfg/*cfg* ::cfg/doerg-temml-worker)]
|
||||
(when (or (not (fs/exists? prelude-file))
|
||||
(zero? (fs/size prelude-file)))
|
||||
(-> "net/deertopia/doerg/prelude.tex"
|
||||
|
||||
Reference in New Issue
Block a user