Compare commits

..

3 Commits

Author SHA1 Message Date
c3b444c36c wip: tests 2026-02-27 19:59:20 -07:00
071a15ca51 2026-02-27 19:41:40 -07:00
f811a519b5 feat: to-html 2026-02-27 18:48:15 -07:00
5 changed files with 39 additions and 12 deletions

View File

@@ -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")))

View File

@@ -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])

View File

@@ -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

View 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))])))

View File

@@ -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\)