From 5b5ac68e138950e2f8d502e22350a62570da88a6 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 30 Apr 2026 00:30:36 -0500 Subject: feat: implement gloss-drill org-drill export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two public commands plus a small helper. `gloss-drill-export-all' walks `gloss-file' via `org-map-entries' and adds `:drill:' tag and `DRILL_CARD_TYPE: twosided' property to every top-level entry. Membership and equality guards make the operation idempotent: re-running adds nothing and writes nothing. `gloss-drill-untag-all' is the reverse, and intentionally does not require `org-drill' to be installed (the user might be cleaning up after uninstalling). The walking logic factors into a single private helper `gloss-drill--map-entries' that handles file open, modtime verification, org-mode activation, the level-1 filter, and a write-only-if-modified save. Both public commands compose it with their respective per-entry mutators. `org-drill' presence is checked with `featurep' before any walk so the file is never touched when the dep is missing. The user-error message includes the install command. Folds in a small fix to the idempotency test helper: the original used `throw' from inside `org-map-entries' but did not return the count to the caller. Switched to `catch' / `throw' with the count as the throw value. 98 tests pass in 0.24s — 88 prior plus 10 new across the four scenarios named in the design doc (tags-untagged, skips-already-tagged, no-orgdrill-installed, untag-all). --- tests/test-gloss-drill--export-all-skips-already-tagged.el | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'tests') diff --git a/tests/test-gloss-drill--export-all-skips-already-tagged.el b/tests/test-gloss-drill--export-all-skips-already-tagged.el index 52978c6..20fbaea 100644 --- a/tests/test-gloss-drill--export-all-skips-already-tagged.el +++ b/tests/test-gloss-drill--export-all-skips-already-tagged.el @@ -21,15 +21,13 @@ Reads the file fresh from disk." (with-current-buffer (find-file-noselect gloss-file) (revert-buffer t t t) - (let ((count 0)) + (catch 'done (org-map-entries (lambda () (when (= 1 (org-current-level)) - (setq count (length (cl-remove-if-not - (lambda (tag) (equal tag "drill")) - (org-get-tags nil t)))) - (throw 'done nil)))) - count))) + (throw 'done + (length (seq-filter (lambda (tag) (equal tag "drill")) + (org-get-tags nil t)))))))))) (ert-deftest test-gloss-drill-export-all-idempotent-tag-not-duplicated () "Boundary: running export-all twice does not duplicate the :drill: tag." @@ -37,8 +35,7 @@ Reads the file fresh from disk." (gloss-test--with-org-drill-feature (gloss-drill-export-all) (gloss-drill-export-all) - (catch 'done - (should (= (gloss-test--drill-tag-count-on-first-entry) 1)))))) + (should (= (gloss-test--drill-tag-count-on-first-entry) 1))))) (ert-deftest test-gloss-drill-export-all-idempotent-property-unchanged () "Boundary: running export-all twice keeps :DRILL_CARD_TYPE: twosided." -- cgit v1.2.3