| 
					
				 | 
			
			
				@@ -85,11 +85,11 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; An Org buffer is a nested list of such elements and objects, whose 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; type is `org-data' and properties is nil. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; The first part of this file implements a parser and an interpreter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; for each type of Org syntax. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; The first part of this file defines Org syntax, while the second 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; one provide accessors and setters functions. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; The next two parts introduce accessors, setters, and a function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; retrieving the element starting at point. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; The next part implements a parser and an interpreter for each 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; element and object type in Org syntax. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; The following part creates a fully recursive buffer parser.  It 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; also provides a tool to map a function to elements or objects 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -102,7 +102,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; The library ends by furnishing a set of interactive tools for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; element's navigation and manipulation, mostly based on 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; `org-element-at-point' function. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; `org-element-at-point' function, and a way to give information 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; about document structure around point with `org-element-context'. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Code: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -328,6 +329,97 @@ still has an entry since one of its properties (`:title') does.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Alist between element types and location of secondary value.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;; Accessors and Setters 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; Provide four accessors: `org-element-type', `org-element-property' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; `org-element-contents' and `org-element-restriction'. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; Setter functions allow to modify elements by side effect.  There is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; `org-element-put-property', `org-element-set-contents', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; `org-element-set-element' and `org-element-adopt-element'.  Note 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; that `org-element-set-element' and `org-element-adopt-element' are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; higher level functions since also update `:parent' property. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-type (element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Return type of ELEMENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The function returns the type of the element or object provided. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+It can also return the following special value: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  `plain-text'       for a string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  `org-data'         for a complete document 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  nil                in any other case." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (cond 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ((not (consp element)) (and (stringp element) 'plain-text)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ((symbolp (car element)) (car element)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-property (property element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Extract the value from the PROPERTY of an ELEMENT." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (plist-get (nth 1 element) property)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-contents (element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Extract contents from an ELEMENT." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (and (consp element) (nthcdr 2 element))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-restriction (element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Return restriction associated to ELEMENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ELEMENT can be an element, an object or a symbol representing an 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+element or object type." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (cdr (assq (if (symbolp element) element (org-element-type element)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     org-element-object-restrictions))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-put-property (element property value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "In ELEMENT set PROPERTY to VALUE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Return modified element." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (when (consp element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (setcar (cdr element) (plist-put (nth 1 element) property value))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-set-contents (element &rest contents) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Set ELEMENT contents to CONTENTS. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Return modified element." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (cond ((not element) (list contents)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	((cdr element) (setcdr (cdr element) contents)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(t (nconc element contents)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-set-element (old new) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Replace element or object OLD with element or object NEW. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The function takes care of setting `:parent' property for NEW." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ;; OLD can belong to the contents of PARENT or to its secondary 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ;; string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((parent (org-element-property :parent old)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (sec-loc (cdr (assq (org-element-type parent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			     org-element-secondary-value-alist))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (sec-value (and sec-loc (org-element-property sec-loc parent))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (place (or (member old sec-value) (member old parent)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ;; Make sure NEW has correct `:parent' property. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (org-element-put-property new :parent parent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ;; Replace OLD with NEW in PARENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (setcar place new))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defsubst org-element-adopt-element (parent child &optional append) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Add an element to the contents of another element. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+PARENT is an element or object.  CHILD is an element, an object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+or a string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CHILD is added at the beginning of PARENT contents, unless the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+optional argument APPEND is non-nil, in which case CHILD is added 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+at the end. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The function takes care of setting `:parent' property for CHILD. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Return parent element." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (if (not parent) (list child) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (let ((contents (org-element-contents parent))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (apply 'org-element-set-contents 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     parent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     (if append (append contents (list child)) (cons child contents)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ;; Link the CHILD element with PARENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (when (consp child) (org-element-put-property child :parent parent)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ;; Return the parent element. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parent)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Greater elements 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3085,97 +3177,6 @@ CONTENTS is nil." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (format "=%s=" (org-element-property :value verbatim))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;; Accessors and Setters 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; Provide four accessors: `org-element-type', `org-element-property' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; `org-element-contents' and `org-element-restriction'. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; Setter functions allow to modify elements by side effect.  There is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; `org-element-put-property', `org-element-set-contents', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; `org-element-set-element' and `org-element-adopt-element'.  Note 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; that `org-element-set-element' and `org-element-adopt-element' are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; higher level functions since also update `:parent' property. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-type (element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Return type of ELEMENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-The function returns the type of the element or object provided. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-It can also return the following special value: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  `plain-text'       for a string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  `org-data'         for a complete document 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  nil                in any other case." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (cond 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   ((not (consp element)) (and (stringp element) 'plain-text)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   ((symbolp (car element)) (car element)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-property (property element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Extract the value from the PROPERTY of an ELEMENT." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (plist-get (nth 1 element) property)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-contents (element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Extract contents from an ELEMENT." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (and (consp element) (nthcdr 2 element))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-restriction (element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Return restriction associated to ELEMENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-ELEMENT can be an element, an object or a symbol representing an 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-element or object type." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (cdr (assq (if (symbolp element) element (org-element-type element)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     org-element-object-restrictions))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-put-property (element property value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "In ELEMENT set PROPERTY to VALUE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Return modified element." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (when (consp element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (setcar (cdr element) (plist-put (nth 1 element) property value))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-set-contents (element &rest contents) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Set ELEMENT contents to CONTENTS. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Return modified element." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (cond ((not element) (list contents)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	((cdr element) (setcdr (cdr element) contents)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	(t (nconc element contents)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-set-element (old new) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Replace element or object OLD with element or object NEW. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-The function takes care of setting `:parent' property for NEW." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ;; OLD can belong to the contents of PARENT or to its secondary 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ;; string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let* ((parent (org-element-property :parent old)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (sec-loc (cdr (assq (org-element-type parent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			     org-element-secondary-value-alist))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (sec-value (and sec-loc (org-element-property sec-loc parent))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (place (or (member old sec-value) (member old parent)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ;; Make sure NEW has correct `:parent' property. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (org-element-put-property new :parent parent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ;; Replace OLD with NEW in PARENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (setcar place new))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defsubst org-element-adopt-element (parent child &optional append) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Add an element to the contents of another element. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-PARENT is an element or object.  CHILD is an element, an object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-or a string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CHILD is added at the beginning of PARENT contents, unless the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-optional argument APPEND is non-nil, in which case CHILD is added 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-at the end. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-The function takes care of setting `:parent' property for CHILD. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Return parent element." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (if (not parent) (list child) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (let ((contents (org-element-contents parent))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (apply 'org-element-set-contents 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     parent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     (if append (append contents (list child)) (cons child contents)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ;; Link the CHILD element with PARENT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (when (consp child) (org-element-put-property child :parent parent)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ;; Return the parent element. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    parent)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Parsing Element Starting At Point 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; 
			 |