Преглед изворни кода

org.el/org--property-local-values: Support cache and passing element arg

Ihor Radchenko пре 4 година
родитељ
комит
7b83168295
1 измењених фајлова са 30 додато и 20 уклоњено
  1. 30 20
      lisp/org.el

+ 30 - 20
lisp/org.el

@@ -13038,30 +13038,40 @@ strings."
 	  ;; Return value.
 	  props)))))
 
-(defun org--property-local-values (property literal-nil)
-  "Return value for PROPERTY in current entry.
+(defun org--property-local-values (property literal-nil &optional element)
+  "Return value for PROPERTY in current entry or ELEMENT.
 Value is a list whose car is the base value for PROPERTY and cdr
 a list of accumulated values.  Return nil if neither is found in
 the entry.  Also return nil when PROPERTY is set to \"nil\",
 unless LITERAL-NIL is non-nil."
-  (let ((range (org-get-property-block)))
-    (when range
-      (goto-char (car range))
-      (let* ((case-fold-search t)
-	     (end (cdr range))
-	     (value
-	      ;; Base value.
-	      (save-excursion
-		(let ((v (and (re-search-forward
-			       (org-re-property property nil t) end t)
-			      (match-string-no-properties 3))))
-		  (list (if literal-nil v (org-not-nil v)))))))
-	;; Find additional values.
-	(let* ((property+ (org-re-property (concat property "+") nil t)))
-	  (while (re-search-forward property+ end t)
-	    (push (match-string-no-properties 3) value)))
-	;; Return final values.
-	(and (not (equal value '(nil))) (nreverse value))))))
+  (if-let ((element (or element
+                        (and (org-element--cache-active-p)
+                             (org-element-at-point nil 'cached)))))
+      (let* ((element (org-element-lineage element '(headline org-data inlinetask) 'with-self))
+             (base-value (org-element-property (intern (concat ":" (upcase property))) element))
+             (base-value (if literal-nil base-value (org-not-nil base-value)))
+             (extra-value (org-element-property (intern (concat ":" (upcase property) "+")) element))
+             (extra-value (if (listp extra-value) extra-value (list extra-value)))
+             (value (cons base-value extra-value)))
+        (and (not (equal value '(nil))) value))
+    (let ((range (org-get-property-block)))
+      (when range
+        (goto-char (car range))
+        (let* ((case-fold-search t)
+	       (end (cdr range))
+	       (value
+	        ;; Base value.
+	        (save-excursion
+		  (let ((v (and (re-search-forward
+			         (org-re-property property nil t) end t)
+			        (match-string-no-properties 3))))
+		    (list (if literal-nil v (org-not-nil v)))))))
+	  ;; Find additional values.
+	  (let* ((property+ (org-re-property (concat property "+") nil t)))
+	    (while (re-search-forward property+ end t)
+	      (push (match-string-no-properties 3) value)))
+	  ;; Return final values.
+	  (and (not (equal value '(nil))) (nreverse value)))))))
 
 (defun org--property-global-or-keyword-value (property literal-nil)
   "Return value for PROPERTY as defined by global properties or by keyword.