summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2020-04-22 16:06:43 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2020-04-22 16:06:43 +0200
commit4a27b67fd221f84df8ddefe50a642668b5356ee0 (patch)
treee2cf419510ea136240c2f10e4a86979a9b21e257
parentbc90264ac689150367f9e25717775afcf3648c7a (diff)
downloadorg-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.el2
-rw-r--r--lisp/org-lint.el19
-rw-r--r--testing/lisp/test-org-lint.el32
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 ()