changeset 698: | 96958d3eb5b0 |
parent: | cad61259ba57 |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: | -rw-r--r-- |
description: | fixes |
587 | 1 | ;;; ulang.el --- ulang compliance lib -*- lexical-binding:t -*- |
50
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
2 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
3 | ;; Copyright (C) 2023 |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
4 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
5 | ;; Author: <ellis@zor> |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
6 | ;; Keywords: comm |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
7 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
8 | ;; This program is free software; you can redistribute it and/or modify |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
9 | ;; it under the terms of the GNU General Public License as published by |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
10 | ;; the Free Software Foundation, either version 3 of the License, or |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
11 | ;; (at your option) any later version. |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
12 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
13 | ;; This program is distributed in the hope that it will be useful, |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
14 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
15 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
16 | ;; GNU General Public License for more details. |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
17 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
18 | ;; You should have received a copy of the GNU General Public License |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
19 | ;; along with this program. If not, see <https://www.gnu.org/licenses/>. |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
20 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
21 | ;;; Commentary: |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
22 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
23 | ;; |
623 | 24 | |
50
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
25 | |
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
26 | ;;; Code: |
57 | 27 | (require 'org) |
651
af486e0a40c9
multi-binaries, working on removing x.lisp
Richard Westhaver <ellis@rwest.io>
parents:
648
diff
changeset
|
28 | (require 'org-element) |
59 | 29 | (require 'ox) |
623 | 30 | |
31 | (defgroup ulang nil |
|
32 | "CC Universal Language.") |
|
33 | ||
34 | (defvar ulang-link-history nil) |
|
35 | (defvar ulang-file-history nil) |
|
586
7ce855f76e1d
net/fetch upgrades, fixes, net/err -> net/condition
Richard Westhaver <ellis@rwest.io>
parents:
428
diff
changeset
|
36 | |
631 | 37 | ;; see org-special-properties |
38 | (defvar ulang-special-properties |
|
630
f4a464cc1628
skel/vm work, added json benchmark
Richard Westhaver <ellis@rwest.io>
parents:
628
diff
changeset
|
39 | '("VERSION")) |
f4a464cc1628
skel/vm work, added json benchmark
Richard Westhaver <ellis@rwest.io>
parents:
628
diff
changeset
|
40 | |
50
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
41 | ;;;###autoload |
623 | 42 | (defun dblock-insert-links (regexp) |
57 | 43 | "Create dblock to insert links matching REGEXP." |
631 | 44 | (interactive (list (read-regexp "Insert links matching: " nil ulang-link-history))) |
57 | 45 | (org-create-dblock (list :name "links" |
46 | :regexp regexp |
|
47 | :id-only nil)) |
|
48 | (org-update-dblock)) |
|
49 | ||
623 | 50 | (org-dynamic-block-define "links" 'dblock-insert-links) |
57 | 51 | |
638 | 52 | ;; (org-export-translate-to-lang (list '("Table of Contents" "Index")) "ulang") |
623 | 53 | ;; (setq org-export-global-macros nil) |
57 | 54 | |
604
74a55d5decce
emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
596
diff
changeset
|
55 | ;; todo keywords |
618
5e57683a0c28
rocksdb updates and tests, emacs org config
Richard Westhaver <ellis@rwest.io>
parents:
611
diff
changeset
|
56 | (setq org-stuck-projects '("+PROJECT/-DONE" ("NEXT") nil "")) |
604
74a55d5decce
emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
596
diff
changeset
|
57 | |
587 | 58 | (setq org-todo-keywords |
626 | 59 | '((sequence "TBD(0!)" "TODO(t!)" "NEXT(n!)" "WIP(i!)" "|" "DONE(d!)") |
60 | (sequence "HOLD(H@/!)" "WIP(!)" "|") |
|
61 | (sequence "WAIT(W@/!)" "WIP(!)" "|") |
|
630
f4a464cc1628
skel/vm work, added json benchmark
Richard Westhaver <ellis@rwest.io>
parents:
628
diff
changeset
|
62 | (sequence "RESEARCH(s!)" "WIP(!)" "REPORT(c!)" "|") |
619 | 63 | (sequence "OUTLINE(O!)" "DRAFT(M!)" "REVIEW(V!)" "|") |
630
f4a464cc1628
skel/vm work, added json benchmark
Richard Westhaver <ellis@rwest.io>
parents:
628
diff
changeset
|
64 | (sequence "FIXME(f!)" "WIP(!)" "TEST(T!)" "|") |
626 | 65 | (type "FIND(q!)" "READ(r@!)" "WATCH(A@!)" "HACK(h!)" |
66 | "CODE(c!)" "BENCH(b!)" "DEPLOY(D!)" "RUN(X!)" |
|
630
f4a464cc1628
skel/vm work, added json benchmark
Richard Westhaver <ellis@rwest.io>
parents:
628
diff
changeset
|
67 | "REFILE(w!)" "LOG(L!)" "GOTO(g!)" "|") |
596 | 68 | (type "PROJECT(p!)" "PRODUCT(P!)" "SPRINT(S!)" "RELEASE(R!)" "|") |
626 | 69 | (sequence "|" "DONE(d!)" "NOPE(x@!)"))) |
587 | 70 | |
71 | (setq org-todo-keyword-faces |
|
72 | '(("PROJECT" . (:foreground "lightseagreen" :weight bold)) |
|
596 | 73 | ("PRODUCT" . (:foreground "olivedrab" :weight bold)) |
74 | ("RELEASE" . (:foreground "maroon3" :weight bold)) |
|
75 | ("RESEARCH" . (:foreground "maroon2" :weight bold)) |
|
76 | ("HACK" . (:foreground "maroon3" :weight bold)) |
|
630
f4a464cc1628
skel/vm work, added json benchmark
Richard Westhaver <ellis@rwest.io>
parents:
628
diff
changeset
|
77 | ("TBD" . (:foreground "brown" :weight bold)) |
596 | 78 | ("CODE" . (:foreground "bisque" :weight bold :background "midnightblue")) |
79 | ("HOLD" . (:foreground "red1" :weight bold :background "yellow1")) |
|
80 | ("WAIT" . (:foreground "red4" :weight bold :background "yellow1")) |
|
81 | ("WIP" . (:foreground "darkorchid2" :weight bold)) |
|
82 | ("NOPE" . (:foreground "hotpink" :weight bold :background "darkgreen")))) |
|
587 | 83 | |
604
74a55d5decce
emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
596
diff
changeset
|
84 | ;; link abbrevs |
57 | 85 | (setq org-link-abbrev-alist |
86 | '(("vc" . "https://vc.compiler.company/%s") |
|
87 | ("comp" . "https://compiler.company/%s") |
|
88 | ("cdn" . "https://cdn.compiler.company/%s") |
|
89 | ("packy" . "https://packy.compiler.company/%s") |
|
596 | 90 | ("yt" . "https://youtube.com/watch?v=%s") |
91 | ("wikipedia" . "https://en.wikipedia.org/wiki/%s") |
|
92 | ("reddit" . "https://reddit.com/%s") |
|
93 | ("hn" . "https://news.ycombinator.com/%s") |
|
94 | ("so" . "https://stackoverflow.com/%s"))) |
|
57 | 95 | |
588
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
96 | ;;; IDs |
659 | 97 | |
98 | (defun org-title-to-filename (title) |
|
99 | "Convert TITLE to a reasonable filename." |
|
100 | ;; Based on the slug logic in org-roam, but org-roam also uses a |
|
101 | ;; timestamp. |
|
102 | (setq title (downcase title)) |
|
103 | (setq title (s-replace-regexp "[^a-zA-Z0-9]+" "-" title)) |
|
104 | (setq title (s-replace-regexp "-+" "-" title)) |
|
105 | (setq title (s-replace-regexp "^-" "" title)) |
|
106 | (setq title (s-replace-regexp "-$" "" title)) |
|
107 | title) |
|
108 | ||
109 | (defun org-get-custom-id-list () |
|
110 | (flatten |
|
111 | (org-map-entries |
|
112 | (lambda () |
|
113 | (org-entry-get nil "CUSTOM_ID"))))) |
|
114 | ||
115 | (defun org-generate-custom-id (&optional id-list) |
|
116 | (let* ((custom-id (org-entry-get nil "CUSTOM_ID")) |
|
117 | (heading (org-heading-components)) |
|
118 | (level (nth 0 heading)) |
|
119 | (todo (nth 2 heading)) |
|
120 | (headline (nth 4 heading)) |
|
121 | (slug (org-title-to-filename headline)) |
|
122 | (duplicate-id (when id-list (member slug id-list)))) |
|
123 | (when (not duplicate-id) |
|
124 | (message "Adding CUSTOM_ID %s to %s" slug headline) |
|
125 | (org-entry-put nil "CUSTOM_ID" slug)))) |
|
126 | ||
127 | (defun org-generate-custom-ids () |
|
128 | "Generate CUSTOM_ID for any headings that are missing one" |
|
129 | (save-excursion |
|
130 | (org-with-wide-buffer |
|
131 | (let ((existing-ids (org-get-custom-id-list))) |
|
132 | (org-map-entries |
|
133 | (lambda () |
|
134 | (org-generate-custom-id existing-ids))))))) |
|
588
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
135 | |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
136 | ;;;###autoload |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
137 | (defun org-id-add-to-headlines-in-file () |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
138 | "Add ID properties to all headlines in the |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
139 | current file which do not already have one." |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
140 | (interactive) |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
141 | (org-map-entries (lambda () (org-id-get (point) 'create)))) |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
142 | |
623 | 143 | (defun org-id-add-to-headlines-in-files (&optional files) |
588
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
144 | (interactive) |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
145 | (with-temp-buffer |
623 | 146 | (dolist (f (or files org-agenda-files)) |
588
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
147 | (find-file f) |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
148 | (org-id-add-to-headlines-in-file) |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
149 | (save-buffer)))) |
0552341ac196
refactor org-id stuff to ulang, pkgbuild notes
Richard Westhaver <ellis@rwest.io>
parents:
587
diff
changeset
|
150 | |
623 | 151 | (defun org-id-add-to-headlines-in-directory (&optional dir) |
152 | (interactive) |
|
153 | (let ((dir (or dir org-directory))) |
|
154 | (org-id-add-to-headlines-in-files |
|
155 | (directory-files-recursively dir "[.]org$")))) |
|
156 | ||
57 | 157 | (message "Initialized ULANG.") |
50
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
158 | |
631 | 159 | ;;; Commands |
160 | ||
161 | ;; (org-property-inherit-p "LOCATION") |
|
639 | 162 | |
163 | ;; currently does not support locations with spaces.. need to walk |
|
164 | ;; ancestors ourselves to do so. for now only URIs and pathnames are |
|
165 | ;; supported. |
|
640
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
166 | (defun org-get-with-inheritance (property &optional literal-nil epom) |
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
167 | "Like `org-entry-get-with-inheritance' but in additional to properties we |
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
168 | also check file keywords (aka in-buffer settings). |
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
169 | |
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
170 | For example, a PROPERTY value of 'LOCATION' would check all property |
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
171 | values in addition to the keyword '#+LOCATION:'." |
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
172 | (interactive (list nil nil)) |
641
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
173 | (let* ((property (or property (org-read-property-name))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
174 | (kw (when-let ((val (org-collect-keywords '("LOCATION") nil))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
175 | (cadar val))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
176 | ;; most of the work passed through to the property handler |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
177 | (props (org-entry-get-with-inheritance property literal-nil epom))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
178 | (if kw |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
179 | (append (list kw) (if (listp props) props (list props))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
180 | props))) |
640
642b3b82b20d
thrift fixes, org-get-with-inheritance init
Richard Westhaver <ellis@rwest.io>
parents:
639
diff
changeset
|
181 | |
639 | 182 | (defun org-get-location (point) |
183 | "Get the value of property LOCATION at POINT." |
|
184 | (interactive "d") |
|
641
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
185 | (let ((path (org-get-with-inheritance "LOCATION" nil point))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
186 | ;; when the second path component is an absolute path, skip the first |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
187 | (when (and (< 1 (length path)) (file-name-absolute-p (print (cadr path)))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
188 | (setq path (cdr path))) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
189 | (message "%s" |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
190 | (apply 'join-paths |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
191 | (flatten |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
192 | (mapcar |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
193 | (lambda (x) (split-string x " ")) |
48bcbca019e6
org-project-info dblock update
Richard Westhaver <ellis@rwest.io>
parents:
640
diff
changeset
|
194 | path)))))) |
639 | 195 | |
196 | (defun org-set-location (value) |
|
197 | "Set the value of property LOCATION. If point is before first heading |
|
198 | instead set or replace the location file keyword." |
|
199 | (interactive (list nil)) |
|
200 | (let ((val (or value (org-read-property-value "LOCATION" nil nil)))) |
|
201 | (if (org-before-first-heading-p) |
|
202 | (save-excursion |
|
203 | (beginning-of-buffer) |
|
204 | (let ((start (point))) |
|
205 | (when (re-search-forward (rx bol "#+LOCATION:" (+ space) (group (* (not space))) eol) nil t) |
|
206 | (setq start (match-beginning 0)) |
|
207 | (goto-char start) |
|
208 | (delete-line)) |
|
209 | (insert "#+LOCATION: " val "\n"))) |
|
210 | (org-set-property "LOCATION" value)))) |
|
211 | ||
648
926d95e5fdc7
cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
641
diff
changeset
|
212 | (defun org-follow-location (point) |
631 | 213 | "Open the location specified by the LOCATION property of the org heading |
214 | or file at point." |
|
648
926d95e5fdc7
cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
641
diff
changeset
|
215 | (interactive "d") |
926d95e5fdc7
cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
641
diff
changeset
|
216 | (let ((loc (org-get-location point))) |
631 | 217 | (cond |
218 | ((string-match-p org-link-any-re loc) (org-link-open-from-string loc)) |
|
219 | ;; TODO 2024-08-29: handle other location types (physical, etc) |
|
220 | (t (find-file loc t))))) |
|
221 | ||
639 | 222 | (provide 'ulang) |
50
e62a6a0d5997
organ/lexer, ulang support, gui and web stuff
ellis <ellis@rwest.io>
parents:
diff
changeset
|
223 | ;;; ulang.el ends here |