progress
This commit is contained in:
@@ -16,7 +16,7 @@ let
|
|||||||
});
|
});
|
||||||
|
|
||||||
plex = ibm-plex-web.override {
|
plex = ibm-plex-web.override {
|
||||||
families = [ "math" "serif" "sans-kr" ];
|
families = [ "math" "serif" "sans" "sans-kr" ];
|
||||||
};
|
};
|
||||||
in mkCljBin' {
|
in mkCljBin' {
|
||||||
name = "net.deertopia/doerg";
|
name = "net.deertopia/doerg";
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
(fs/file (format "css/ibm-plex-%s-default.min.css" family))
|
(fs/file (format "css/ibm-plex-%s-default.min.css" family))
|
||||||
slurp)]
|
slurp)]
|
||||||
(external-stylesheet
|
(external-stylesheet
|
||||||
(format "ibm-plex-web/css/ibm-plex-%s-default.min.css" family))))
|
(format "ibm-plex-web/css/ibm-plex-%s-all.min.css" family))))
|
||||||
|
|
||||||
(def deerstar
|
(def deerstar
|
||||||
(external-stylesheet "deerstar.css")
|
(external-stylesheet "deerstar.css")
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
(:require [net.deertopia.doerg.element :as element]
|
(:require [net.deertopia.doerg.element :as element]
|
||||||
[clojure.stacktrace]
|
[clojure.stacktrace]
|
||||||
[clojure.tools.logging :as l]
|
[clojure.tools.logging :as l]
|
||||||
|
[clojure.core.match :refer [match]]
|
||||||
[clojure.tools.logging.readable :as lr]
|
[clojure.tools.logging.readable :as lr]
|
||||||
[net.deertopia.doerg.html :as doerg-html]
|
[net.deertopia.doerg.html :as doerg-html]
|
||||||
|
[clojure.pprint]
|
||||||
[clojure.zip :as z]))
|
[clojure.zip :as z]))
|
||||||
|
|
||||||
;;; Top-level API
|
;;; Top-level API
|
||||||
@@ -33,7 +35,8 @@
|
|||||||
|
|
||||||
(def ^:dynamic ^:private *document-info*)
|
(def ^:dynamic ^:private *document-info*)
|
||||||
|
|
||||||
(declare ^:private gather-footnotes renderer-error)
|
(declare ^:private
|
||||||
|
gather-footnotes render-renderer-error)
|
||||||
|
|
||||||
(defn org-element-recursive
|
(defn org-element-recursive
|
||||||
"Recursively render an Org-mode element to Hiccup."
|
"Recursively render an Org-mode element to Hiccup."
|
||||||
@@ -42,10 +45,14 @@
|
|||||||
(-> loc
|
(-> loc
|
||||||
(element/cata
|
(element/cata
|
||||||
(fn [node]
|
(fn [node]
|
||||||
(try (org-element node)
|
(prn node)
|
||||||
|
(try (let [x (org-element node)]
|
||||||
|
(println "⇒" (pr-str x))
|
||||||
|
(newline)
|
||||||
|
x)
|
||||||
(catch Throwable e
|
(catch Throwable e
|
||||||
(lr/error e "Error in renderer" {:node node})
|
(lr/error e "Error in renderer" {:node node})
|
||||||
(renderer-error e)))))
|
(render-renderer-error e)))))
|
||||||
z/node)))
|
z/node)))
|
||||||
|
|
||||||
(defn org-document
|
(defn org-document
|
||||||
@@ -68,6 +75,9 @@
|
|||||||
(defmethod org-element "keyword" [e]
|
(defmethod org-element "keyword" [e]
|
||||||
(org-keyword e))
|
(org-keyword e))
|
||||||
|
|
||||||
|
(defmethod org-element "link" [e]
|
||||||
|
(org-link e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn- gather-footnotes [loc]
|
(defn- gather-footnotes [loc]
|
||||||
@@ -75,21 +85,45 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn- render-pprint [x]
|
(defn- render-pprint
|
||||||
|
"Render the argument inline as `clojure.pprint/pprint` output."
|
||||||
|
[x & {:keys [text]
|
||||||
|
:or {text "debug!"}}]
|
||||||
[:details
|
[:details
|
||||||
{:summary (:type x)}
|
[:summary {:style {:font-family "IBM Plex Sans"}}
|
||||||
|
(if (:type x)
|
||||||
|
(list text " (" [:code (:type x)] ")")
|
||||||
|
text)]
|
||||||
[:samp {:style {:overflow "scroll"
|
[:samp {:style {:overflow "scroll"
|
||||||
:display "block"
|
:display "block"
|
||||||
:white-space "pre"}}
|
:white-space "pre"}}
|
||||||
()]])
|
(with-out-str
|
||||||
|
(clojure.pprint/pprint x))]])
|
||||||
|
|
||||||
|
(defn- level->tag
|
||||||
|
"Convert a number 1–5 to a hiccup :h1, :h2, :h3, … tag."
|
||||||
|
[level]
|
||||||
|
(cond (<= 1 level 5) (keyword (str \h (+ level 1)))
|
||||||
|
:else :h5))
|
||||||
|
|
||||||
|
(defn- descriptive-list-item-components
|
||||||
|
"If `e` is an Org-mode descriptive list item, return a map {:dt x
|
||||||
|
:dd y} with the corresponding dt and dd tags. Otherwise, return
|
||||||
|
nil."
|
||||||
|
[e]
|
||||||
|
(match (:children e)
|
||||||
|
([[:dt & dts] & dds] :seq) {:dt (apply vector :dt dts)
|
||||||
|
:dd (apply vector :dd dds)}
|
||||||
|
_ nil))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn- renderer-error
|
(defn- render-renderer-error
|
||||||
"Render a `Throwable` to display within the document."
|
"Render a `Throwable` to display within the document."
|
||||||
[e]
|
[e]
|
||||||
[:details
|
[:details
|
||||||
[:summary "Renderer error!"]
|
[:summary {:style {:font-family "IBM Plex Sans"}}
|
||||||
|
"Renderer error!"]
|
||||||
[:samp {:style {:overflow "scroll"
|
[:samp {:style {:overflow "scroll"
|
||||||
:display "block"
|
:display "block"
|
||||||
:white-space "pre"}}
|
:white-space "pre"}}
|
||||||
@@ -100,4 +134,72 @@
|
|||||||
[{:keys [children]}]
|
[{:keys [children]}]
|
||||||
children)
|
children)
|
||||||
|
|
||||||
(defmethod org-keyword "TITLE" [e])
|
(defmethod org-element "paragraph" [{:keys [children]}]
|
||||||
|
[:p children])
|
||||||
|
|
||||||
|
(defmethod org-element "text" [{:keys [value]}]
|
||||||
|
value)
|
||||||
|
|
||||||
|
(defmethod org-element "bold" [{:keys [children]}]
|
||||||
|
[:b children])
|
||||||
|
|
||||||
|
(defmethod org-element "section" [{:keys [children]}]
|
||||||
|
[:section
|
||||||
|
(or (seq children)
|
||||||
|
[:div.empty-section-message "This section is empty…"])])
|
||||||
|
|
||||||
|
(defmethod org-element "headline" [{:keys [children level]}]
|
||||||
|
[(level->tag level) children])
|
||||||
|
|
||||||
|
(defmethod org-element "footnote-reference"
|
||||||
|
[{:keys [label children]}]
|
||||||
|
;; FIXME: This will break if there are multiple references to a
|
||||||
|
;; single footnote, since `label` is assumed to be unique.
|
||||||
|
(list [:label.margin-toggle.sidenote-number {:for label}]
|
||||||
|
[:input.margin-toggle {:type "checkbox"
|
||||||
|
:id label}]
|
||||||
|
[:span.sidenote
|
||||||
|
"«todo: footnote here lol»"]))
|
||||||
|
|
||||||
|
(defmethod org-element "plain-list" [{:keys [list-type children]}]
|
||||||
|
(let [tag (case list-type
|
||||||
|
"descriptive" :dl
|
||||||
|
"unordered" :ul
|
||||||
|
"ordered" :ol)]
|
||||||
|
[tag children]))
|
||||||
|
|
||||||
|
(defmethod org-element "list-item" [{:keys [children] :as e}]
|
||||||
|
(if-some [{:keys [dt dd]} (descriptive-list-item-components e)]
|
||||||
|
(list dt dd)
|
||||||
|
[:li children]))
|
||||||
|
|
||||||
|
(defmethod org-element "list-item-tag" [{:keys [children]}]
|
||||||
|
[:dt children])
|
||||||
|
|
||||||
|
(defmethod org-element "property-drawer" [{:keys [children]}]
|
||||||
|
[:table.property-drawer {:hidden true}
|
||||||
|
[:tbody children]])
|
||||||
|
|
||||||
|
(defmethod org-element "node-property" [{:keys [key value]}]
|
||||||
|
[:tr [:th key] [:td value]])
|
||||||
|
|
||||||
|
(defmethod org-element "citation" [{:keys [prefix suffix children]}]
|
||||||
|
[:div prefix children suffix])
|
||||||
|
|
||||||
|
(defmethod org-keyword "TITLE" [{:keys [value]}]
|
||||||
|
[:h1 value])
|
||||||
|
|
||||||
|
(defmethod org-element :default [x]
|
||||||
|
(render-pprint x :text "unimplemented!"))
|
||||||
|
|
||||||
|
#_#_
|
||||||
|
(defmethod org-keyword :default [x]
|
||||||
|
(render-pprint x :text "unimplemented!"))
|
||||||
|
|
||||||
|
(defmethod org-special-block :default [x]
|
||||||
|
(render-pprint x :text "unimplemented!"))
|
||||||
|
|
||||||
|
(defmethod org-link :default [{:keys [raw-link children]}]
|
||||||
|
[:span {:class "org-link external"}
|
||||||
|
[:a {:href raw-link}
|
||||||
|
(or (seq children) raw-link)]])
|
||||||
|
|||||||
Reference in New Issue
Block a user