From 614b96f910ad77ca63d1aa4bc50c93acd0310ae9 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Tue, 4 Apr 2023 12:05:03 +0200 Subject: [PATCH] org-lint: Add checker for numbered list item numbers * lisp/org-lint.el (org-lint-item-number): New checker to ensure consistency between item bullet text and the counter Org will use when exporting. --- lisp/org-lint.el | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lisp/org-lint.el b/lisp/org-lint.el index 0e2967b6c..55f987ea3 100644 --- a/lisp/org-lint.el +++ b/lisp/org-lint.el @@ -1227,6 +1227,30 @@ Use \"export %s\" instead" (org-element-property :parent text)) "Possibly incomplete citation markup"))))) +(defun org-lint-item-number (ast) + (org-element-map ast 'item + (lambda (item) + (unless (org-element-property :counter item) + (when-let* ((bullet (org-element-property :bullet item)) + (bullet-number + (cond + ((string-match "[A-Za-z]" bullet) + (- (string-to-char (upcase (match-string 0 bullet))) + 64)) + ((string-match "[0-9]+" bullet) + (string-to-number (match-string 0 bullet))))) + (true-number + (org-list-get-item-number + (org-element-property :begin item) + (org-element-property :structure item) + (org-list-prevs-alist (org-element-property :structure item)) + (org-list-parents-alist (org-element-property :structure item))))) + (unless (equal bullet-number (car (last true-number))) + (list + (org-element-property :begin item) + (format "Bullet counter \"%s\" is not the same with item position %d. Consider adding manual [@%d] counter." + bullet (car (last true-number)) bullet-number)))))))) + ;;; Checkers declaration @@ -1450,6 +1474,11 @@ Use \"export %s\" instead" #'org-lint-incomplete-citation :categories '(cite) :trust 'low) +(org-lint-add-checker 'item-number + "Report inconsistent item numbers in lists" + #'org-lint-item-number + :categories '(plain-list)) + (provide 'org-lint) ;; Local variables: