feat: doerg에서 configuration을 씀
This commit is contained in:
@@ -10,7 +10,8 @@
|
||||
lambdaisland/deep-diff2 {:mvn/version "2.12.219"}
|
||||
mvxcvi/clj-cbor {:mvn/version "1.1.1"}
|
||||
ch.qos.logback/logback-classic {:mvn/version "1.1.3"}
|
||||
org.clojure/test.check {:mvn/version "1.1.3"}}
|
||||
org.clojure/test.check {:mvn/version "1.1.3"}
|
||||
aero/aero {:mvn/version "1.1.6"}}
|
||||
:paths ["src" "resources" "test"]
|
||||
:aliases
|
||||
{:test {:extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}}
|
||||
|
||||
13
doerg/resources/net/deertopia/doerg/config.edn
Normal file
13
doerg/resources/net/deertopia/doerg/config.edn
Normal file
@@ -0,0 +1,13 @@
|
||||
#:net.deertopia.doerg
|
||||
{:ibm-plex-web #or [#xdg-data-dir "ibm-plex-web"
|
||||
#env IBM_PLEX_WEB]
|
||||
:latex "xelatex"
|
||||
:dvisvgm "dvisvgm"
|
||||
:doerg-temml-worker
|
||||
#profile {:dev-publisher "../doerg/doerg-temml-worker/index.js"
|
||||
:dev-doerg "./doerg-temml-worker/index.js"
|
||||
:default "doerg-temml-worker"}
|
||||
:doerg-parser
|
||||
#profile {:dev-publisher "../doerg/doerg-parser/index.js"
|
||||
:dev-doerg "./doerg-parser/index.js"
|
||||
:default "doerg-parser"}}
|
||||
@@ -1,42 +1,58 @@
|
||||
(ns net.deertopia.doerg.config
|
||||
(:require [clojure.spec.alpha :as s]
|
||||
[babashka.fs :as fs]
|
||||
[spec-dict.main :refer [dict]]))
|
||||
[spec-dict.main :refer [dict]]
|
||||
[aero.core :as aero]
|
||||
[net.deertopia.doerg :as-alias d]
|
||||
[clojure.java.io :as io]))
|
||||
|
||||
(s/def ::config
|
||||
(s/keys :req [::ibm-plex-web
|
||||
::latex
|
||||
::dvisvgm
|
||||
::doerg-temml-worker
|
||||
::doerg-parser]))
|
||||
(s/def ::d/config
|
||||
(s/keys :req [::d/ibm-plex-web
|
||||
::d/latex
|
||||
::d/dvisvgm
|
||||
::d/doerg-temml-worker
|
||||
::d/doerg-parser]))
|
||||
|
||||
(s/def ::file
|
||||
(s/conformer (comp fs/file fs/absolutize fs/expand-home)))
|
||||
(s/def ::d/directory
|
||||
(s/conformer #(if-some [x (fs/file %)]
|
||||
(if (fs/directory? x) x ::s/invalid)
|
||||
::s/invalid)))
|
||||
|
||||
(s/def ::executable #(or (fs/executable? %)
|
||||
(and (fs/relative? %)
|
||||
(fs/which %))))
|
||||
(s/def ::d/file
|
||||
(s/conformer #(or (-> % fs/file fs/expand-home fs/absolutize)
|
||||
::s/invalid)))
|
||||
|
||||
(s/def ::d/executable
|
||||
(s/conformer
|
||||
#(or (some-> (fs/which %) fs/file)
|
||||
::s/invalid)))
|
||||
|
||||
(s/def ::d/ibm-plex-web ::d/directory)
|
||||
|
||||
(s/def ::d/latex ::d/executable)
|
||||
|
||||
(s/def ::d/dvisvgm ::d/executable)
|
||||
|
||||
(s/def ::d/doerg-temml-worker ::d/executable)
|
||||
|
||||
(s/def ::d/doerg-parser ::d/executable)
|
||||
|
||||
(defmethod aero/reader 'xdg-data-dir
|
||||
[_opts tag value]
|
||||
"Aero tag to search for a directory on $XDG_DATA_DIRS."
|
||||
(some #(let [x (fs/path % value)]
|
||||
(and (fs/exists? x) x))
|
||||
(fs/split-paths (System/getenv "XDG_DATA_DIRS"))))
|
||||
|
||||
(defn read-config [f]
|
||||
(->> f aero/read-config (s/conform ::d/config)))
|
||||
|
||||
(def default
|
||||
{::ibm-plex-web
|
||||
(fs/file (some #(let [x (fs/path % "ibm-plex-web")]
|
||||
(and (fs/exists? x) x))
|
||||
(fs/split-paths (System/getenv "XDG_DATA_DIRS"))))
|
||||
::latex "xelatex"
|
||||
::dvisvgm "dvisvgm"
|
||||
;; TODO: Can we automatically set this to "./doerg-temml-worker/index.js" in
|
||||
;; a development environment?
|
||||
::doerg-temml-worker "doerg-temml-worker"
|
||||
::doerg-parser "doerg-parser"})
|
||||
(let [r (->> "net/deertopia/doerg/config.edn"
|
||||
io/resource read-config)]
|
||||
(if (s/invalid? r)
|
||||
(throw (IllegalArgumentException.
|
||||
"default config is bad!"))
|
||||
r)))
|
||||
|
||||
(def ^:dynamic *cfg* default)
|
||||
|
||||
(s/def ::ibm-plex-web ::file)
|
||||
|
||||
(s/def ::latex ::executable)
|
||||
|
||||
(s/def ::dvisvgm ::executable)
|
||||
|
||||
(s/def ::doerg-temml-worker ::executable)
|
||||
|
||||
(s/def ::doerg-parser ::executable)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[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.spec.alpha :as s]
|
||||
@@ -36,7 +37,7 @@
|
||||
:or {in *in*}}]
|
||||
(let [r (-> (p/process
|
||||
{:in in :out :string}
|
||||
(::cfg/doerg-parser cfg/*cfg*))
|
||||
(-> cfg/*cfg* ::doerg/doerg-parser str))
|
||||
(common/deref-with-timeout *uniorg-timeout-duration*))]
|
||||
(when (zero? (:exit r))
|
||||
(-> r :out (json/parse-string (comp keyword camel->kebab))))))
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
(ns net.deertopia.doerg.html
|
||||
"Common HTML elements and utilities"
|
||||
(:require [clojure.java.io :as io]
|
||||
[net.deertopia.doerg.config :as cfg]
|
||||
[babashka.fs :as fs]))
|
||||
|
||||
#_
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
[clojure.java.io :as io]
|
||||
[hiccup2.core :as h]
|
||||
[clojure.pprint]
|
||||
[babashka.fs :as fs]))
|
||||
[babashka.fs :as fs]
|
||||
[net.deertopia.doerg :as-alias doerg]))
|
||||
|
||||
(def some-org-file
|
||||
#_
|
||||
@@ -27,19 +28,12 @@
|
||||
(fs/delete-if-exists path)
|
||||
(fs/create-sym-link path target))
|
||||
|
||||
(defn reconfigure-doerg! []
|
||||
(alter-var-root
|
||||
#'cfg/*cfg*
|
||||
#(assoc %
|
||||
::cfg/doerg-temml-worker "./doerg-temml-worker/index.js"
|
||||
::cfg/doerg-parser "./doerg-parser/index.js")))
|
||||
|
||||
(defn render-html [& {:keys [src dest]
|
||||
:or {src some-org-file
|
||||
dest "/tmp/doerg-test"}}]
|
||||
(fs/create-dirs dest)
|
||||
(force-create-sym-link (fs/file dest "ibm-plex-web")
|
||||
(-> cfg/*cfg* ::cfg/ibm-plex-web))
|
||||
(-> cfg/*cfg* ::doerg/ibm-plex-web))
|
||||
(force-create-sym-link (fs/file dest "deerstar.css")
|
||||
(io/resource "net/deertopia/doerg/deerstar.css"))
|
||||
(force-create-sym-link (fs/file dest "tuftesque.css")
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
[clojure.string :as str]
|
||||
[clojure.tools.logging :as l]
|
||||
[babashka.fs :as fs]
|
||||
[net.deertopia.doerg.config :as cfg])
|
||||
[net.deertopia.doerg.config :as cfg]
|
||||
[net.deertopia.doerg :as-alias doerg])
|
||||
(:import (java.io ByteArrayOutputStream)))
|
||||
|
||||
(def ^:private scale-divisor 66873.46948423679)
|
||||
@@ -82,14 +83,14 @@
|
||||
acc))))
|
||||
|
||||
(defn- invoke-latex [& {:keys [file output-dir]}]
|
||||
(let [latex (::cfg/latex cfg/*cfg*)]
|
||||
(let [latex (-> cfg/*cfg* ::doerg/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/dvisvgm cfg/*cfg*)]
|
||||
(let [dvisvgm (-> cfg/*cfg* ::doerg/dvisvgm)]
|
||||
(invoke
|
||||
{:dir output-dir}
|
||||
dvisvgm "--page=1-" "--optimize" "--clipjoin"
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[clojure.tools.logging :as l]
|
||||
[babashka.fs :as fs])
|
||||
[babashka.fs :as fs]
|
||||
[net.deertopia.doerg :as-alias doerg])
|
||||
(:import (java.io ByteArrayOutputStream)))
|
||||
|
||||
(def ^:dynamic *worker-timeout-duration*
|
||||
@@ -21,7 +22,7 @@
|
||||
:suffix ".tex"}))
|
||||
|
||||
(defn worker []
|
||||
(let [doerg-temml-worker (::cfg/doerg-temml-worker cfg/*cfg*)]
|
||||
(let [doerg-temml-worker (-> cfg/*cfg* ::doerg/doerg-temml-worker)]
|
||||
(when-not (fs/exists? prelude-file)
|
||||
(-> "net/deertopia/doerg/prelude.tex"
|
||||
io/resource
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
(ns net.deertopia.doerg.config-test
|
||||
(:require [net.deertopia.doerg.config :as sut]
|
||||
[clojure.test :as t]
|
||||
[clojure.spec.alpha :as s]))
|
||||
|
||||
(t/deftest default-config-is-config
|
||||
(t/testing "default config is valid"
|
||||
(t/is (s/valid? ::sut/config sut/default))))
|
||||
@@ -11,5 +11,6 @@
|
||||
net.deertopia/doerg {:local/root "../doerg"}
|
||||
metosin/reitit {:mvn/version "0.10.1"}
|
||||
http-kit/http-kit {:mvn/version "2.8.0"}
|
||||
instaparse/instaparse {:mvn/version "1.5.0"}}
|
||||
instaparse/instaparse {:mvn/version "1.5.0"}
|
||||
aero/aero {:mvn/version "1.1.6"}}
|
||||
:paths ["src" "resources" "test"]}
|
||||
|
||||
@@ -18,7 +18,10 @@
|
||||
[reitit.spec]
|
||||
[reitit.dev.pretty]
|
||||
[clojure.spec.alpha :as s]
|
||||
[net.deertopia.doerg.render :as doerg-render]))
|
||||
[net.deertopia.doerg.render :as doerg-render]
|
||||
[net.deertopia.publisher.cached-file :as cached-file]
|
||||
[babashka.fs :as fs]
|
||||
[aero.core :as aero]))
|
||||
|
||||
|
||||
;;; Routes
|
||||
|
||||
Reference in New Issue
Block a user