From 100d3d9931cc2027e1729df7bf4c6dcfdf9d75aa Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Wed, 24 May 2023 13:59:51 +0100 Subject: Make ID increments total and add tests --- org-zettelkasten.el | 41 +++++++++++++++++++++++------------ tests/org-zettelkasten-test.el | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 tests/org-zettelkasten-test.el 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 -;; Maintainer: Yann Herklotz + +;; Author: Yann Herklotz +;; Maintainer: Yann Herklotz ;; 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 +;; Maintainer: Yann Herklotz + +;; 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 . + +;;; 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"))) -- cgit