diff --git a/lisp/org-lint.el b/lisp/org-lint.el index 37d05edc9..be25a5c29 100644 --- a/lisp/org-lint.el +++ b/lisp/org-lint.el @@ -68,8 +68,10 @@ ;; - orphaned affiliated keywords ;; - obsolete affiliated keywords ;; - missing language in src blocks +;; - missing back-end in export blocks ;; - invalid Babel call blocks ;; - NAME values with a colon +;; - deprecated export block syntax ;; - deprecated Babel header properties ;; - wrong header arguments in src blocks ;; - misuse of CATEGORY keyword @@ -80,6 +82,7 @@ ;; - links to non-existent local files ;; - SETUPFILE keywords with non-existent file parameter ;; - INCLUDE keywords with wrong link parameter +;; - obsolete markup in INCLUDE keyword ;; - unknown items in OPTIONS keyword ;; - spurious macro arguments or invalid macro templates ;; - special properties in properties drawer @@ -142,15 +145,24 @@ :name 'obsolete-affiliated-keywords :description "Report obsolete affiliated keywords" :categories '(obsolete)) + (make-org-lint-checker + :name 'deprecated-export-blocks + :description "Report deprecated export block syntax" + :categories '(obsolete export) + :trust 'low) (make-org-lint-checker :name 'deprecated-header-syntax :description "Report deprecated Babel header syntax" - :categories '(babel obsolete) + :categories '(obsolete babel) :trust 'low) (make-org-lint-checker :name 'missing-language-in-src-block :description "Report missing language in src blocks" :categories '(babel)) + (make-org-lint-checker + :name 'missing-backend-in-export-block + :description "Report missing back-end in export blocks" + :categories '(export)) (make-org-lint-checker :name 'invalid-babel-call-block :description "Report invalid Babel call blocks" @@ -202,6 +214,11 @@ :description "Report INCLUDE keywords with misleading link parameter" :categories '(export) :trust 'low) + (make-org-lint-checker + :name 'obsolete-include-markup + :description "Report obsolete markup in INCLUDE keyword" + :categories '(obsolete export) + :trust 'low) (make-org-lint-checker :name 'unknown-options-item :description "Report unknown items in OPTIONS keyword" @@ -368,6 +385,20 @@ called with one argument, the key used for comparison." reports)))) reports)) +(defun org-lint-deprecated-export-blocks (ast) + (let ((deprecated '("ASCII" "BEAMER" "HTML" "LATEX" "MAN" "MARKDOWN" "MD" + "ODT" "ORG" "TEXINFO"))) + (org-element-map ast 'special-block + (lambda (b) + (let ((type (org-element-property :type b))) + (when (member-ignore-case type deprecated) + (list + (org-element-property :post-affiliated b) + (format + "Deprecated syntax for export block. Use \"BEGIN_EXPORT %s\" \ +instead" + type)))))))) + (defun org-lint-deprecated-header-syntax (ast) (let* ((deprecated-babel-properties (mapcar (lambda (arg) (symbol-name (car arg))) @@ -401,6 +432,13 @@ Use :header-args: instead" (list (org-element-property :post-affiliated b) "Missing language in source block"))))) +(defun org-lint-missing-backend-in-export-block (ast) + (org-element-map ast 'export-block + (lambda (b) + (unless (org-element-property :type b) + (list (org-element-property :post-affiliated b) + "Missing back-end in export block"))))) + (defun org-lint-invalid-babel-call-block (ast) (org-element-map ast 'babel-call (lambda (b) @@ -555,6 +593,25 @@ Use :header-args: instead" search)))) (unless visiting (kill-buffer buffer)))))))))))) +(defun org-lint-obsolete-include-markup (ast) + (let ((regexp (format "\\`\\(?:\".+\"\\|\\S-+\\)[ \t]+%s" + (regexp-opt + '("ASCII" "BEAMER" "HTML" "LATEX" "MAN" "MARKDOWN" "MD" + "ODT" "ORG" "TEXINFO") + t)))) + (org-element-map ast 'keyword + (lambda (k) + (when (equal (org-element-property :key k) "INCLUDE") + (let ((case-fold-search t) + (value (org-element-property :value k))) + (when (string-match regexp value) + (let ((markup (match-string-no-properties 1 value))) + (list (org-element-property :post-affiliated k) + (format "Obsolete markup \"%s\" in INCLUDE keyword. \ +Use \"export %s\" instead" + markup + markup)))))))))) + (defun org-lint-unknown-options-item (ast) (let ((allowed (delq nil (append