diff options
author | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2020-04-22 16:06:43 +0200 |
---|---|---|
committer | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2020-04-22 16:06:43 +0200 |
commit | 4a27b67fd221f84df8ddefe50a642668b5356ee0 (patch) | |
tree | e2cf419510ea136240c2f10e4a86979a9b21e257 | |
parent | bc90264ac689150367f9e25717775afcf3648c7a (diff) | |
download | org-mode-4a27b67fd221f84df8ddefe50a642668b5356ee0.tar.gz |
org-element: Fix property drawers parsing
* lisp/org-element.el (org-element--next-mode): Properly handle first section.
* lisp/org-lint.el (org-lint-obsolete-properties-drawer): Ignore
document-level property drawers.
* testing/lisp/test-org-lint.el (test-org-lint/obsolete-properties-drawer):
Add tests.
-rw-r--r-- | lisp/org-element.el | 2 | ||||
-rw-r--r-- | lisp/org-lint.el | 19 | ||||
-rw-r--r-- | testing/lisp/test-org-lint.el | 32 |
3 files changed, 43 insertions, 10 deletions
diff --git a/lisp/org-element.el b/lisp/org-element.el index 1e620d1..30f4745 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -4329,7 +4329,7 @@ located inside the current one. " (if parent? (pcase type (`headline 'section) - (`first-section 'top-comment) + ((and `section (guard (eq mode 'first-section))) 'top-comment) (`inlinetask 'planning) (`plain-list 'item) (`property-drawer 'node-property) diff --git a/lisp/org-lint.el b/lisp/org-lint.el index 012edc8..0438eab 100644 --- a/lisp/org-lint.el +++ b/lisp/org-lint.el @@ -541,15 +541,16 @@ Use :header-args: instead" (org-element-map ast 'drawer (lambda (d) (when (equal (org-element-property :drawer-name d) "PROPERTIES") - (let ((section (org-element-lineage d '(section)))) - (unless (org-element-map section 'property-drawer #'identity nil t) - (list (org-element-property :post-affiliated d) - (if (save-excursion - (goto-char (org-element-property :post-affiliated d)) - (forward-line -1) - (or (org-at-heading-p) (org-at-planning-p))) - "Incorrect contents for PROPERTIES drawer" - "Incorrect location for PROPERTIES drawer")))))))) + (let ((headline? (org-element-lineage d '(headline))) + (before + (mapcar #'org-element-type + (assq d (reverse (org-element-contents + (org-element-property :parent d))))))) + (list (org-element-property :post-affiliated d) + (if (or (and headline? (member before '(nil (planning)))) + (and (null headline?) (member before '(nil (comment))))) + "Incorrect contents for PROPERTIES drawer" + "Incorrect location for PROPERTIES drawer"))))))) (defun org-lint-invalid-effort-property (ast) (org-element-map ast 'node-property diff --git a/testing/lisp/test-org-lint.el b/testing/lisp/test-org-lint.el index ab8f674..82c6627 100644 --- a/testing/lisp/test-org-lint.el +++ b/testing/lisp/test-org-lint.el @@ -205,6 +205,32 @@ Paragraph 2" (ert-deftest test-org-lint/obsolete-properties-drawer () "Test `org-lint-obsolete-properties-drawer' checker." + (should-not + (org-test-with-temp-text " +* H +:PROPERTIES: +:SOMETHING: foo +:END:" + (org-lint '(obsolete-properties-drawer)))) + (should-not + (org-test-with-temp-text " +* H +SCHEDULED: <2012-03-29> +:PROPERTIES: +:SOMETHING: foo +:END:" + (org-lint '(obsolete-properties-drawer)))) + (should-not + (org-test-with-temp-text ":PROPERTIES: +:SOMETHING: foo +:END:" + (org-lint '(obsolete-properties-drawer)))) + (should-not + (org-test-with-temp-text "# Comment +:PROPERTIES: +:SOMETHING: foo +:END:" + (org-lint '(obsolete-properties-drawer)))) (should (org-test-with-temp-text " * H @@ -219,6 +245,12 @@ Paragraph :PROPERTIES: This is not a node property :END:" + (org-lint '(obsolete-properties-drawer)))) + (should + (org-test-with-temp-text "Paragraph +:PROPERTIES: +:FOO: bar +:END:" (org-lint '(obsolete-properties-drawer))))) (ert-deftest test-org-lint/invalid-effort-property () |