|
1 |
| -(ns tech.thomas-sojka.org-parser-tree.stratify |
2 |
| - (:require [clojure.string :as str] |
3 |
| - [clojure.zip :as z])) |
4 |
| - |
5 |
| -(defmulti stratify (fn [_ {:keys [type]}] type)) |
6 |
| -(defmethod stratify :head-line [org-tree headline] |
7 |
| - (let [previous-level (:level (z/node org-tree)) |
8 |
| - current-level (:level headline)] |
9 |
| - (cond |
10 |
| - (= previous-level current-level) |
11 |
| - (-> org-tree |
12 |
| - (z/insert-right (merge headline {:children []})) |
13 |
| - z/rightmost) |
14 |
| - :else |
15 |
| - (let [next (apply comp (repeat (+ (- previous-level current-level) (if (> previous-level current-level) 1 0)) |
16 |
| - (if (> previous-level current-level) z/up z/down)))] |
17 |
| - (-> org-tree |
18 |
| - next |
19 |
| - (z/append-child (merge headline {:children []})) |
20 |
| - z/down |
21 |
| - z/rightmost))))) |
22 |
| -(defn edit [org-tree & args] (apply z/edit org-tree update args)) |
23 |
| - |
24 |
| -(defmethod stratify :list-item-line [org-tree list-item-line] |
25 |
| - (edit org-tree :list (fn [list] (if (coll? list) (conj list (:list-item list-item-line)) [(:list-item list-item-line)])))) |
26 |
| -(defn property [property-content-line] |
27 |
| - (let [[_ name value] |
28 |
| - (re-find |
29 |
| - #":(.*):\s(.*)" |
30 |
| - property-content-line)] |
31 |
| - (hash-map (keyword (str/trim name)) |
32 |
| - (str/trim value)))) |
33 |
| -(defmethod stratify :content-line [org-tree {:keys [content]}] |
34 |
| - (if (:drawer (z/node org-tree)) |
35 |
| - (z/replace org-tree (update-in (z/node org-tree) [:drawer :node-properties] merge (property content))) |
36 |
| - (edit org-tree :content str content))) |
37 |
| -(defmethod stratify :drawer-begin-line [org-tree drawer-begin-line] |
38 |
| - (z/replace org-tree (assoc (z/node org-tree) :drawer {:name (:drawer drawer-begin-line) |
39 |
| - :node-properties {}}))) |
40 |
| -(defmethod stratify :drawer-end-line [org-tree _] |
41 |
| - (let [node (z/node org-tree)] |
42 |
| - (z/replace org-tree (-> node |
43 |
| - (assoc (:name (:drawer node)) (:node-properties (:drawer node))) |
44 |
| - (dissoc :drawer))))) |
45 |
| -(defmethod stratify :default [org-tree _] org-tree) |
46 |
| - |
| 1 | +(ns tech.thomas-sojka.org-parser-tree.stratify |
| 2 | + (:require [clojure.string :as str] |
| 3 | + [clojure.zip :as z])) |
| 4 | + |
| 5 | +(defmulti stratify (fn [_ {:keys [type]}] type)) |
| 6 | +(defmethod stratify :head-line [org-tree headline] |
| 7 | + (let [previous-level (:level (z/node org-tree)) |
| 8 | + current-level (:level headline)] |
| 9 | + (cond |
| 10 | + (= previous-level current-level) |
| 11 | + (-> org-tree |
| 12 | + (z/insert-right (merge headline {:children []})) |
| 13 | + z/rightmost) |
| 14 | + :else |
| 15 | + (let [next (apply comp (repeat (+ (- previous-level current-level) (if (> previous-level current-level) 1 0)) |
| 16 | + (if (> previous-level current-level) z/up z/down)))] |
| 17 | + (-> org-tree |
| 18 | + next |
| 19 | + (z/append-child (merge headline {:children []})) |
| 20 | + z/down |
| 21 | + z/rightmost))))) |
| 22 | +(defn edit [org-tree & args] (apply z/edit org-tree update args)) |
| 23 | + |
| 24 | +(defmethod stratify :list-item-line [org-tree list-item-line] |
| 25 | + (edit org-tree :list (fn [list] (if (coll? list) (conj list (:list-item list-item-line)) [(:list-item list-item-line)])))) |
| 26 | +(defn property [property-content-line] |
| 27 | + (let [[_ name value] |
| 28 | + (re-find |
| 29 | + #":(.*):\s(.*)" |
| 30 | + property-content-line)] |
| 31 | + (hash-map (keyword (str/trim name)) |
| 32 | + (str/trim value)))) |
| 33 | +(defmethod stratify :content-line [org-tree {:keys [content]}] |
| 34 | + (if (:drawer (z/node org-tree)) |
| 35 | + (z/replace org-tree (update-in (z/node org-tree) [:drawer :node-properties] merge (property content))) |
| 36 | + (edit org-tree :content str content))) |
| 37 | +(defmethod stratify :drawer-begin-line [org-tree drawer-begin-line] |
| 38 | + (z/replace org-tree (assoc (z/node org-tree) :drawer {:name (:drawer drawer-begin-line) |
| 39 | + :node-properties {}}))) |
| 40 | +(defmethod stratify :drawer-end-line [org-tree _] |
| 41 | + (let [node (z/node org-tree)] |
| 42 | + (z/replace org-tree (-> node |
| 43 | + (assoc (:name (:drawer node)) (:node-properties (:drawer node))) |
| 44 | + (dissoc :drawer))))) |
| 45 | +(defmethod stratify :default [org-tree _] org-tree) |
| 46 | + |
0 commit comments