Compare commits
3 Commits
fa42052a6a
...
c3b444c36c
| Author | SHA1 | Date | |
|---|---|---|---|
| c3b444c36c | |||
| 071a15ca51 | |||
| f811a519b5 |
@@ -180,8 +180,8 @@
|
|||||||
parser, return a map with the following keys
|
parser, return a map with the following keys
|
||||||
• :top-level-nodes The nodes that /should/ be at the top-level.
|
• :top-level-nodes The nodes that /should/ be at the top-level.
|
||||||
• :first-section-nodes The nodes that should be wrapped in a new
|
• :first-section-nodes The nodes that should be wrapped in a new
|
||||||
section node
|
section node.
|
||||||
• :rest Everything else!"
|
• :rest Everything else."
|
||||||
[nodes]
|
[nodes]
|
||||||
(let [[of-top-level remaining-nodes]
|
(let [[of-top-level remaining-nodes]
|
||||||
(->> nodes (split-with #(of-type? % "property-drawer" "keyword")))
|
(->> nodes (split-with #(of-type? % "property-drawer" "keyword")))
|
||||||
|
|||||||
@@ -72,6 +72,12 @@
|
|||||||
[:article
|
[:article
|
||||||
rendered]]])))
|
rendered]]])))
|
||||||
|
|
||||||
|
(defn to-html
|
||||||
|
"Read `f` with `slurp` as an Org document and return a string of
|
||||||
|
rendered HTML."
|
||||||
|
[f]
|
||||||
|
(str (hiccup/html {} (-> f slurp element/read-string org-document))))
|
||||||
|
|
||||||
|
|
||||||
;;; Further dispatching on `org-element`
|
;;; Further dispatching on `org-element`
|
||||||
|
|
||||||
@@ -161,7 +167,10 @@
|
|||||||
(format "height:%.4fem;vertical-align:%.4fem;display:inline-block"
|
(format "height:%.4fem;vertical-align:%.4fem;display:inline-block"
|
||||||
height (- depth)))))))
|
height (- depth)))))))
|
||||||
|
|
||||||
(defn- render-tex-snippets [doc]
|
(defn render-tex-snippets
|
||||||
|
"Traverse doc, adorning each LaTeX node with a promise resolving to,
|
||||||
|
optimistically, Hiccup-rendered SVG or MathML code."
|
||||||
|
[doc]
|
||||||
(let [promises (atom [])
|
(let [promises (atom [])
|
||||||
r (->> doc (sp/transform
|
r (->> doc (sp/transform
|
||||||
[element/postorder-walker
|
[element/postorder-walker
|
||||||
@@ -190,13 +199,20 @@
|
|||||||
(deliver promise))))
|
(deliver promise))))
|
||||||
(deliver promise (hiccup/raw temml))))
|
(deliver promise (hiccup/raw temml))))
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(prn e)
|
(lr/error e)
|
||||||
(flush)
|
|
||||||
(throw e))))
|
(throw e))))
|
||||||
(when (fs/exists? "/tmp/doerg-svgs")
|
(when (fs/exists? "/tmp/doerg-svgs")
|
||||||
(fs/delete-tree "/tmp/doerg-svgs"))
|
(fs/delete-tree "/tmp/doerg-svgs"))
|
||||||
(fs/copy-tree svg-dir "/tmp/doerg-svgs"))))]
|
(fs/copy-tree svg-dir "/tmp/doerg-svgs"))))
|
||||||
(future-call (bound-fn* f))
|
fut (future-call (bound-fn* f))]
|
||||||
|
;; Time out after eight seconds. With all the LaTeX and IPC, there
|
||||||
|
;; are so many opportunities for things to go wrong </3.
|
||||||
|
(let [fut-res (deref fut (* 10 1000) ::timed-out)]
|
||||||
|
(if (= fut-res ::timed-out)
|
||||||
|
(do (future-cancel fut)
|
||||||
|
(doseq [{:keys [promise]} @promises]
|
||||||
|
(deliver promise ::timed-out)))
|
||||||
|
fut-res))
|
||||||
r))
|
r))
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
@@ -346,11 +362,11 @@
|
|||||||
|
|
||||||
(defmethod org-element "latex-fragment" [{:keys [contents value] :as e}]
|
(defmethod org-element "latex-fragment" [{:keys [contents value] :as e}]
|
||||||
[:span.latex-fragment
|
[:span.latex-fragment
|
||||||
(-> e ::rendered (deref #_#_ 2000 "«timed out»"))])
|
(-> e ::rendered deref)])
|
||||||
|
|
||||||
(defmethod org-element "latex-environment" [{:keys [value] :as e}]
|
(defmethod org-element "latex-environment" [{:keys [value] :as e}]
|
||||||
[:span.latex-fragment
|
[:span.latex-fragment
|
||||||
(-> e ::rendered (deref #_#_ 2000 "«timed out»"))])
|
(-> e ::rendered deref)])
|
||||||
|
|
||||||
(defmethod org-element "example-block" [{:keys [value]}]
|
(defmethod org-element "example-block" [{:keys [value]}]
|
||||||
[:pre value])
|
[:pre value])
|
||||||
|
|||||||
@@ -37,8 +37,7 @@
|
|||||||
(force-create-sym-link (fs/file dest "Temml-Plex.css")
|
(force-create-sym-link (fs/file dest "Temml-Plex.css")
|
||||||
(io/resource "net/deertopia/doerg/Temml-Plex.css"))
|
(io/resource "net/deertopia/doerg/Temml-Plex.css"))
|
||||||
(fs/delete-if-exists (fs/file dest "index.html"))
|
(fs/delete-if-exists (fs/file dest "index.html"))
|
||||||
(->> (h/html (-> src slurp element/read-string render/org-document))
|
(->> src render/to-html str (spit (fs/file dest "index.html"))))
|
||||||
str (spit (fs/file dest "index.html"))))
|
|
||||||
|
|
||||||
(defn render-edn [& {:keys [src dest]
|
(defn render-edn [& {:keys [src dest]
|
||||||
:or {src some-org-file
|
:or {src some-org-file
|
||||||
|
|||||||
13
doerg/test/net/deertopia/doerg/render_test.clj
Normal file
13
doerg/test/net/deertopia/doerg/render_test.clj
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
(ns net.deertopia.doerg.render-test
|
||||||
|
(:require [net.deertopia.doerg.render :as sut]
|
||||||
|
[net.deertopia.doerg.element :as element]
|
||||||
|
[net.deertopia.doerg.tex.temml :as temml]
|
||||||
|
[com.rpl.specter :as sp]
|
||||||
|
[clojure.test :as t]))
|
||||||
|
|
||||||
|
(t/deftest fallbacks
|
||||||
|
(t/testing "expected fallback behaviour"
|
||||||
|
(let [doc (temml/binding-worker
|
||||||
|
(-> "net/deertopia/doerg/render_test/fallbacks.org"
|
||||||
|
io/resource slurp element/read-string
|
||||||
|
sut/render-tex-snippets))])))
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
#+title: aghhh
|
#+title: aghhh
|
||||||
#+latex_header: \usepackage{ifxetex}
|
|
||||||
|
|
||||||
- blah blah prose prose prose \(c = \sqrt{x^2 + y^2}\), alal.
|
- blah blah prose prose prose \(c = \sqrt{x^2 + y^2}\), alal.
|
||||||
- this thing is \(x\)
|
- this thing is \(x\)
|
||||||
Reference in New Issue
Block a user