emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 6766c45 3/3: org-lint: Add checkers for citations a


From: ELPA Syncer
Subject: [elpa] externals/org 6766c45 3/3: org-lint: Add checkers for citations and related
Date: Tue, 30 Nov 2021 16:57:25 -0500 (EST)

branch: externals/org
commit 6766c45bfd09d6cd2dee1e1400a80b137f6aaaa5
Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Commit: Nicolas Goaziou <mail@nicolasgoaziou.fr>

    org-lint: Add checkers for citations and related
    
    * lisp/org-lint.el (org-lint--checkers): Register new checkers.
    (org-lint-non-existent-bibliography):
    (org-lint-missing-print-bibliography):
    (org-lint-invalid-cite-export-declaration):
    (org-lint-incomplete-citation): New functions.
    * testing/lisp/test-org-lint.el (test-org-lint/non-existent-bibliography):
    (test-org-lint/missing-print-bibliography):
    (test-org-lint/invalid-cite-export-declaration):
    (test-org-lint/incomplete-citation): New tests.
---
 lisp/org-lint.el              | 73 ++++++++++++++++++++++++++++++++++++++++++-
 testing/lisp/test-org-lint.el | 50 +++++++++++++++++++++++++++++
 2 files changed, 122 insertions(+), 1 deletion(-)

diff --git a/lisp/org-lint.el b/lisp/org-lint.el
index da5e6ae..a35aed8 100644
--- a/lisp/org-lint.el
+++ b/lisp/org-lint.el
@@ -101,12 +101,17 @@
 ;;   - obsolete QUOTE section
 ;;   - obsolete "file+application" link
 ;;   - spurious colons in tags
+;;   - non-existent bibliography file
+;;   - missing "print_bibliography" keyword
+;;   - invalid "cite_export" value
+;;   - incomplete citation object
 
 
 ;;; Code:
 
 (require 'cl-lib)
 (require 'ob)
+(require 'oc)
 (require 'ol)
 (require 'org-attach)
 (require 'org-macro)
@@ -296,7 +301,24 @@
    (make-org-lint-checker
     :name 'spurious-colons
     :description "Report spurious colons in tags"
-    :categories '(tags)))
+    :categories '(tags))
+   (make-org-lint-checker
+    :name 'non-existent-bibliography
+    :description "Report invalid bibliography file"
+    :categories '(cite))
+   (make-org-lint-checker
+    :name 'missing-print-bibliography
+    :description "Report missing \"print_bibliography\" keyword"
+    :categories '(cite))
+   (make-org-lint-checker
+    :name 'invalid-cite-export-declaration
+    :description "Report invalid value for \"cite_export\" keyword"
+    :categories '(cite))
+   (make-org-lint-checker
+    :name 'incomplete-citation
+    :description "Report incomplete citation object"
+    :categories '(cite)
+    :trust 'low))
   "List of all available checkers.")
 
 (defun org-lint--collect-duplicates
@@ -1121,6 +1143,55 @@ Use \"export %s\" instead"
        (list (org-element-property :begin h)
              "Tags contain a spurious colon")))))
 
+(defun org-lint-non-existent-bibliography (ast)
+  (org-element-map ast 'keyword
+    (lambda (k)
+      (when (equal "BIBLIOGRAPHY" (org-element-property :key k))
+        (let ((file (org-strip-quotes (org-element-property :value k))))
+          (and (not (file-remote-p file))
+              (not (file-exists-p file))
+              (list (org-element-property :begin k)
+                    (format "Non-existent bibliography %S" file))))))))
+
+(defun org-lint-missing-print-bibliography (ast)
+  (and (org-element-map ast 'citation #'identity nil t)
+       (not (org-element-map ast 'keyword
+              (lambda (k)
+                (equal "PRINT_BIBLIOGRAPHY" (org-element-property :key k)))
+              nil t))
+       (list
+        (list (point-max) "Possibly missing \"PRINT_BIBLIOGRAPHY\" keyword"))))
+
+(defun org-lint-invalid-cite-export-declaration (ast)
+  (org-element-map ast 'keyword
+    (lambda (k)
+      (when (equal "CITE_EXPORT" (org-element-property :key k))
+        (let ((value (org-element-property :value k))
+              (source (org-element-property :begin k)))
+          (if (equal value "")
+              (list source "Missing export processor name")
+            (condition-case _
+                (pcase (org-cite-read-processor-declaration value)
+                  (`(,(and (pred symbolp) name)
+                     ,(pred string-or-null-p)
+                     ,(pred string-or-null-p))
+                   (unless (org-cite-get-processor name)
+                     (list source "Unknown cite export processor %S" name)))
+                  (_
+                   (list source "Invalid cite export processor declaration")))
+              (error
+               (list source "Invalid cite export processor 
declaration")))))))))
+
+(defun org-lint-incomplete-citation (ast)
+  (org-element-map ast 'plain-text
+    (lambda (text)
+      (and (string-match-p org-element-citation-prefix-re text)
+           ;; XXX: The code below signals the error at the beginning
+           ;; of the paragraph containing the faulty object.  It is
+           ;; not very accurate but may be enough for now.
+           (list (org-element-property :contents-begin
+                                       (org-element-property :parent text))
+                 "Possibly incomplete citation markup")))))
 
 
 ;;; Reports UI
diff --git a/testing/lisp/test-org-lint.el b/testing/lisp/test-org-lint.el
index e57993c..decef6e 100644
--- a/testing/lisp/test-org-lint.el
+++ b/testing/lisp/test-org-lint.el
@@ -573,6 +573,56 @@ SCHEDULED: <2012-03-29 thu.>"
    (org-test-with-temp-text "* H :tag::"
      (org-lint '(spurious-colons)))))
 
+(ert-deftest test-org-lint/non-existent-bibliography ()
+  "Test `org-lint-non-existent-bibliography' checker."
+  (should
+   (org-test-with-temp-text "#+bibliography: Idonotexist.bib"
+     (org-lint '(non-existent-bibliography)))))
+
+(ert-deftest test-org-lint/missing-print-bibliography ()
+  "Test `org-lint-missing-print-bibliography' checker."
+  (should
+   (org-test-with-temp-text "[cite:@foo]"
+     (org-lint '(missing-print-bibliography))))
+  (should-not
+   (org-test-with-temp-text "[cite:@foo]\n#+print_bibliography:"
+     (org-lint '(missing-print-bibliography))))
+  (should-not
+   (org-test-with-temp-text ""
+     (org-lint '(missing-print-bibliography)))))
+
+(ert-deftest test-org-lint/invalid-cite-export-declaration ()
+  "Test `org-lint-invalid-cite-export-declaration' checker."
+  (should
+   (org-test-with-temp-text "#+cite_export: "
+     (org-lint '(invalid-cite-export-declaration))))
+  (should
+   (org-test-with-temp-text "#+cite_export: 2"
+     (org-lint '(invalid-cite-export-declaration))))
+  (should
+   (org-test-with-temp-text "#+cite_export: basic bar baz qux"
+     (org-lint '(invalid-cite-export-declaration))))
+  (should
+   (org-test-with-temp-text "#+cite_export: basic \"bar"
+     (org-lint '(invalid-cite-export-declaration))))
+  (should
+   (org-test-with-temp-text "#+cite_export: unknown"
+     (org-lint '(invalid-cite-export-declaration))))
+  (should-not
+   (org-test-with-temp-text "#+cite_export: basic"
+     (org-lint '(invalid-cite-export-declaration)))))
+
+(ert-deftest test-org-lint/incomplete-citation ()
+  "Test `org-lint-incomplete-citation' checker."
+  (should
+   (org-test-with-temp-text "[cite:foo]"
+     (org-lint '(incomplete-citation))))
+  (should
+   (org-test-with-temp-text "[cite:@foo"
+     (org-lint '(incomplete-citation))))
+  (should-not
+   (org-test-with-temp-text "[cite:@foo]"
+     (org-lint '(incomplete-citation)))))
 
 (provide 'test-org-lint)
 ;;; test-org-lint.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]