This commit is contained in:
@@ -1,21 +1,24 @@
|
|||||||
(ns net.deertopia.doerg.element
|
(ns net.deertopia.doerg.element
|
||||||
(:require [babashka.process :as p]
|
(:refer-clojure :exclude [read-string])
|
||||||
[net.deertopia.doerg.common :as common]
|
(:require
|
||||||
[clojure.string :as str]
|
[babashka.fs :as fs]
|
||||||
[clojure.zip]
|
[babashka.process :as p]
|
||||||
[babashka.fs :as fs]
|
[cheshire.core :as json]
|
||||||
[clojure.java.io :as io]
|
[clojure.core.match :refer [match]]
|
||||||
[cheshire.core :as json]
|
[clojure.java.io :as io]
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.set :as set]
|
||||||
[spec-dict.main :refer [dict]]
|
[clojure.spec.alpha :as s]
|
||||||
[net.deertopia.doerg.config :as cfg]
|
[clojure.string :as str]
|
||||||
[com.rpl.specter :as sp]
|
[clojure.tools.logging.readable :as lr]
|
||||||
[clojure.tools.logging.readable :as lr]
|
[clojure.zip :as z]
|
||||||
[clojure.zip :as z]
|
[com.rpl.specter :as sp]
|
||||||
[com.rpl.specter.zipper :as sz]
|
[com.rpl.specter.zipper :as sz]
|
||||||
[clojure.core.match :refer [match]])
|
[net.deertopia.doerg.common :as common]
|
||||||
(:import (java.util UUID))
|
[net.deertopia.doerg.config :as cfg]
|
||||||
(:refer-clojure :exclude [read-string]))
|
[spec-dict.main :refer [dict]])
|
||||||
|
(:import
|
||||||
|
(java.util UUID)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(def ^:dynamic *uniorg-timeout-duration*
|
(def ^:dynamic *uniorg-timeout-duration*
|
||||||
@@ -37,7 +40,7 @@
|
|||||||
(if (zero? (:exit r))
|
(if (zero? (:exit r))
|
||||||
(-> r :out (json/parse-string (comp keyword camel->kebab))))))
|
(-> r :out (json/parse-string (comp keyword camel->kebab))))))
|
||||||
|
|
||||||
(declare gather-first-section gather-latex-paragraphs)
|
(declare gather-first-section gather-latex-paragraphs element-types)
|
||||||
|
|
||||||
(defn read-string
|
(defn read-string
|
||||||
[s & {:keys [post-processors]
|
[s & {:keys [post-processors]
|
||||||
@@ -65,6 +68,9 @@
|
|||||||
(and (map? element)
|
(and (map? element)
|
||||||
(contains? element :type)))
|
(contains? element :type)))
|
||||||
|
|
||||||
|
(defn type [element]
|
||||||
|
(:type element))
|
||||||
|
|
||||||
(defn of-type?
|
(defn of-type?
|
||||||
"Return truthy if the Org node `element` is of type `type`. In the
|
"Return truthy if the Org node `element` is of type `type`. In the
|
||||||
vararg case, return truthy if `element` is of any of the types
|
vararg case, return truthy if `element` is of any of the types
|
||||||
@@ -280,3 +286,71 @@
|
|||||||
[c & rest]
|
[c & rest]
|
||||||
(recur (conj acc c) rest)
|
(recur (conj acc c) rest)
|
||||||
[] acc))))))
|
[] acc))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;; Specs
|
||||||
|
|
||||||
|
;; Data taken from uniorg/index.d.ts
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(defn- typescript-enum->set [s]
|
||||||
|
(as-> s
|
||||||
|
it
|
||||||
|
(str/split it #" \| ")
|
||||||
|
(map camel->kebab it)
|
||||||
|
(into #{} it))))
|
||||||
|
|
||||||
|
(def greater-element-types
|
||||||
|
#{"org-data" "section" "property-drawer" "drawer" "list" "list-item"
|
||||||
|
"quote-block" "verse-block" "center-block" "special-block"
|
||||||
|
"footnote-definition" "table"})
|
||||||
|
|
||||||
|
(def element-types
|
||||||
|
#{"list-item-tag" "src-block" "comment-block" "latex-environment"
|
||||||
|
"keyword" "paragraph" "node-property" "example-block" "clock"
|
||||||
|
"planning" "diary-sexp" "fixed-width" "export-block"
|
||||||
|
"horizontal-rule" "comment" "table-row" "headline"})
|
||||||
|
|
||||||
|
(def element-types
|
||||||
|
(set/union greater-element-types element-types))
|
||||||
|
|
||||||
|
(def object-types
|
||||||
|
#{"citation" "line-break" "citation-suffix" "footnote-reference"
|
||||||
|
"statistics-cookie" "timestamp" "superscript" "text" "table-cell"
|
||||||
|
"link" "verbatim" "italic" "citation-common-prefix" "subscript"
|
||||||
|
"citation-key" "export-snippet" "citation-prefix"
|
||||||
|
"citation-common-suffix" "latex-fragment" "strike-through" "entity"
|
||||||
|
"citation-reference" "bold" "underline" "code"})
|
||||||
|
|
||||||
|
(s/def ::greater-element-type
|
||||||
|
greater-element-types)
|
||||||
|
|
||||||
|
(s/def ::element-type
|
||||||
|
element-types)
|
||||||
|
|
||||||
|
(s/def ::object-type
|
||||||
|
object-types)
|
||||||
|
|
||||||
|
(s/def ::contents-begin nat-int?)
|
||||||
|
(s/def ::contents-end nat-int?)
|
||||||
|
|
||||||
|
(defmulti element-spec type)
|
||||||
|
(defmulti object-spec type)
|
||||||
|
|
||||||
|
(s/def ::object (s/multi-spec object-spec type))
|
||||||
|
|
||||||
|
(s/def ::element
|
||||||
|
(s/and (dict ^:opt {:contents-begin ::contents-begin
|
||||||
|
:contents-end ::contents-end}
|
||||||
|
{:children (s/coll-of ::object :kind vector?)
|
||||||
|
:type ::element-type})
|
||||||
|
(s/multi-spec element-spec type)))
|
||||||
|
|
||||||
|
(defmethod object-spec "text" [_]
|
||||||
|
(dict {:value string?}))
|
||||||
|
|
||||||
|
#_
|
||||||
|
(s/def ::greater-element
|
||||||
|
(s/keys :req-un [::contents-begin
|
||||||
|
::contents-end
|
||||||
|
(s/coll-of ::element-type vector?)]))
|
||||||
|
|||||||
@@ -57,28 +57,31 @@
|
|||||||
())
|
())
|
||||||
|
|
||||||
(defn- paragraph-ends-with-latex? [doc]
|
(defn- paragraph-ends-with-latex? [doc]
|
||||||
(-> (sp/select-first [(walk-types "paragraph")
|
(let [type (-> (sp/select-first [(walk-types "paragraph")
|
||||||
(sp/must :children)
|
(sp/must :children)
|
||||||
sp/LAST]
|
sp/LAST]
|
||||||
doc)
|
doc)
|
||||||
(sut/of-type? "latex-environment")))
|
sut/type)]
|
||||||
|
(t/is type "latex-environment")))
|
||||||
|
|
||||||
(defn- paragraph-has-latex? [doc]
|
(defn- paragraph-has-latex? [doc]
|
||||||
(sp/select-first [(walk-types "paragraph")
|
(t/is (sp/select-first [(walk-types "paragraph")
|
||||||
(sp/must :children)
|
(sp/must :children)
|
||||||
sp/ALL
|
sp/ALL
|
||||||
#(sut/of-type? % "latex-environment")]
|
#(sut/of-type? % "latex-environment")]
|
||||||
doc))
|
doc)))
|
||||||
|
|
||||||
(defn- paragraph-has-multiple-latex? [doc]
|
(defn- paragraph-has-multiple-latex? [doc]
|
||||||
(let [[interleaved fenceposted]
|
(let [paragraphs (sp/select (walk-types "paragraph") doc)]
|
||||||
(sp/select [(walk-types "section")
|
(t/is (= 2 (count paragraphs)))
|
||||||
(sp/must :children)
|
(let [[p₁ p₂] paragraphs]
|
||||||
#(some-> % first (sut/of-type? "headline"))
|
(t/are [p ts] (= ts
|
||||||
(sp/subselect (sp/view #(drop 1 %))
|
(sp/select [(sp/must :children)
|
||||||
sp/ALL (sp/must :children) sp/ALL
|
sp/ALL (sp/view sut/type)] p))
|
||||||
(sp/must :type))]
|
p₁ ["text" "latex-environment"
|
||||||
doc)]))
|
"text" "latex-environment"]
|
||||||
|
p₂ ["text" "latex-environment"
|
||||||
|
"text" "latex-environment" "text"]))))
|
||||||
|
|
||||||
(t/deftest paragraph-separation
|
(t/deftest paragraph-separation
|
||||||
(t/testing "paragraph ending with latex"
|
(t/testing "paragraph ending with latex"
|
||||||
@@ -88,5 +91,5 @@
|
|||||||
(-> (parse-resource "paragraph-surrounding-latex.org")
|
(-> (parse-resource "paragraph-surrounding-latex.org")
|
||||||
paragraph-has-latex?))
|
paragraph-has-latex?))
|
||||||
(t/testing "paragraph with interleaved latex"
|
(t/testing "paragraph with interleaved latex"
|
||||||
(let [(parse-resource "paragraph-with-multiple-latex.org")])
|
(-> (parse-resource "paragraph-with-multiple-latex.org")
|
||||||
(t/is (-))))
|
paragraph-has-multiple-latex?)))
|
||||||
|
|||||||
Reference in New Issue
Block a user