summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <git@yannherklotz.com>2023-05-24 13:59:51 +0100
committerYann Herklotz <git@yannherklotz.com>2023-05-24 13:59:51 +0100
commit100d3d9931cc2027e1729df7bf4c6dcfdf9d75aa (patch)
tree9ae65bbb6f03a19e4d2188ee3ce22bb2e1363aec
parentef005996a857af1049fdf80e07cb5eb46990626e (diff)
downloadorg-zettelkasten-100d3d9931cc2027e1729df7bf4c6dcfdf9d75aa.tar.gz
org-zettelkasten-100d3d9931cc2027e1729df7bf4c6dcfdf9d75aa.zip
Make ID increments total and add tests
-rw-r--r--org-zettelkasten.el41
-rw-r--r--tests/org-zettelkasten-test.el49
2 files changed, 76 insertions, 14 deletions
diff --git a/org-zettelkasten.el b/org-zettelkasten.el
index 07b2fc7..ed67e1a 100644
--- a/org-zettelkasten.el
+++ b/org-zettelkasten.el
@@ -1,11 +1,12 @@
;;; org-zettelkasten.el --- A Zettelkasten mode leveraging Org -*- lexical-binding: t; -*-
;; Copyright (C) 2021-2023 Yann Herklotz
-;;
-;; Author: Yann Herklotz <yann@ymhg.org>
-;; Maintainer: Yann Herklotz <yann@ymhg.org>
+
+;; Author: Yann Herklotz <git@yannherklotz.com>
+;; Maintainer: Yann Herklotz <git@yannherklotz.com>
;; Keywords: files, hypermedia, Org, notes
;; Homepage: https://sr.ht/~ymherklotz/org-zettelkasten
+;; Mailing-List: https://lists.sr.ht/~ymherklotz/org-zettelkasten
;; Package-Requires: ((emacs "25.1") (org "9.3"))
;; Version: 0.8.0
@@ -137,26 +138,38 @@ This function assumes that IDs will start with a number."
(concat "[[file:" (org-zettelkasten--abs-file file)
"::#" id "]]"))))
-(defun org-zettelkasten--incr-id (ident)
- "Simple function to increment any IDENT.
+(defun org-zettelkasten--incr-alpha (ident-part)
+ "Increments a string of lowercase letters in IDENT-PART."
+ (let ((carry 0)
+ (new-list nil)
+ (rev-list (reverse (string-to-list ident-part))))
+ (let ((new-val (dolist (ident-el
+ (cons (+ (car rev-list) 1) (cdr rev-list))
+ (concat new-list))
+ (let ((incr-val (+ ident-el carry)))
+ (if (<= incr-val ?z)
+ (progn
+ (setq new-list (cons incr-val new-list))
+ (setq carry 0))
+ (setq new-list (cons ?a new-list))
+ (setq carry 1))))))
+ (if (< 0 carry) (concat "a" new-val) new-val))))
-This might result in duplicate IDs though."
- (let ((ident-list (string-to-list ident)))
- (cl-incf (car (last ident-list)))
- (concat ident-list)))
-
-(defun org-zettelkasten--incr-id-total (ident)
+(defun org-zettelkasten--incr-id (ident)
"A better way to incement numerical IDENT.
This might still result in duplicate IDENTs for an IDENT that
ends with a letter."
- (if (string-match-p "\\(.*[a-z]\\)\\([0-9]+\\)$" ident)
+ (if (string-match-p "\\(.*[a-z]\\)?\\([0-9]+\\)$" ident)
(progn
- (string-match "\\(.*[a-z]\\)\\([0-9]+\\)$" ident)
+ (string-match "\\(.*[a-z]\\)?\\([0-9]+\\)$" ident)
(let ((pre (match-string 1 ident))
(post (match-string 2 ident)))
(concat pre (number-to-string (+ 1 (string-to-number post))))))
- (org-zettelkasten--incr-id ident)))
+ (string-match "\\(.*[0-9]\\)?\\([a-z]+\\)$" ident)
+ (let ((pre (match-string 1 ident))
+ (post (match-string 2 ident)))
+ (concat pre (org-zettelkasten--incr-alpha post)))))
(defun org-zettelkasten--branch-id (ident)
"Create a branch ID from IDENT."
diff --git a/tests/org-zettelkasten-test.el b/tests/org-zettelkasten-test.el
new file mode 100644
index 0000000..dc666b7
--- /dev/null
+++ b/tests/org-zettelkasten-test.el
@@ -0,0 +1,49 @@
+;;; org-zettelkasten-test.el --- Tests for org-zettelkasten -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021-2023 Yann Herklotz
+
+;; Author: Yann Herklotz <git@yannherklotz.com>
+;; Maintainer: Yann Herklotz <git@yannherklotz.com>
+
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Work-in-progress tests.
+
+;;; Code:
+
+(require 'org-zettelkasten)
+(require 'ert)
+
+(ert-deftest org-zettelkasten-test-incr-id-numeric ()
+ "Test increment of purely numeric IDs."
+ (should (string= (org-zettelkasten--incr-id "1") "2"))
+ (should (string= (org-zettelkasten--incr-id "9") "10"))
+ (should (string= (org-zettelkasten--incr-id "1023") "1024"))
+ (should (string= (org-zettelkasten--incr-id "939") "940"))
+ (should (string= (org-zettelkasten--incr-id "39999") "40000")))
+
+(ert-deftest org-zettelkasten-test-incr-id-alpha ()
+ "Test increment of purely alpha IDs."
+ (should (string= (org-zettelkasten--incr-id "a") "b"))
+ (should (string= (org-zettelkasten--incr-id "z") "aa"))
+ (should (string= (org-zettelkasten--incr-id "roina") "roinb"))
+ (should (string= (org-zettelkasten--incr-id "zzzzzzzzz") "aaaaaaaaaa"))
+ (should (string= (org-zettelkasten--incr-id "bhz") "bia")))
+
+(ert-deftest org-zettelkasten-test-incr-id-mixed ()
+ "Test increment of mixed realistic IDs."
+ (should (string= (org-zettelkasten--incr-id "1a1a1a") "1a1a1b"))
+ (should (string= (org-zettelkasten--incr-id "1a1a1a1") "1a1a1a2")))