|
@@ -34,8 +34,9 @@
|
|
|
;; `keyword', `planning', `property-drawer' and `section' types), it
|
|
|
;; can also accept a fixed set of keywords as attributes. Those are
|
|
|
;; called "affiliated keywords" to distinguish them from other
|
|
|
-;; keywords, which are full-fledged elements. All affiliated keywords
|
|
|
-;; are referenced in `org-element-affiliated-keywords'.
|
|
|
+;; keywords, which are full-fledged elements. Almost all affiliated
|
|
|
+;; keywords are referenced in `org-element-affiliated-keywords'; the
|
|
|
+;; others are export attributes and start with "ATTR_" prefix.
|
|
|
;;
|
|
|
;; Element containing other elements (and only elements) are called
|
|
|
;; greater elements. Concerned types are: `center-block', `drawer',
|
|
@@ -2861,10 +2862,11 @@ Names must be uppercase. Any block whose name has no association
|
|
|
is parsed with `org-element-special-block-parser'.")
|
|
|
|
|
|
(defconst org-element-affiliated-keywords
|
|
|
- '("ATTR_ASCII" "ATTR_DOCBOOK" "ATTR_HTML" "ATTR_LATEX" "ATTR_ODT" "CAPTION"
|
|
|
- "DATA" "HEADER" "HEADERS" "LABEL" "NAME" "PLOT" "RESNAME" "RESULT" "RESULTS"
|
|
|
- "SOURCE" "SRCNAME" "TBLNAME")
|
|
|
- "List of affiliated keywords as strings.")
|
|
|
+ '("CAPTION" "DATA" "HEADER" "HEADERS" "LABEL" "NAME" "PLOT" "RESNAME" "RESULT"
|
|
|
+ "RESULTS" "SOURCE" "SRCNAME" "TBLNAME")
|
|
|
+ "List of affiliated keywords as strings.
|
|
|
+By default, all keywords setting attributes (i.e. \"ATTR_LATEX\")
|
|
|
+are affiliated keywords and need not to be in this list.")
|
|
|
|
|
|
(defconst org-element-keyword-translation-alist
|
|
|
'(("DATA" . "NAME") ("LABEL" . "NAME") ("RESNAME" . "NAME")
|
|
@@ -2874,15 +2876,17 @@ is parsed with `org-element-special-block-parser'.")
|
|
|
The key is the old name and the value the new one. The property
|
|
|
holding their value will be named after the translated name.")
|
|
|
|
|
|
-(defconst org-element-multiple-keywords
|
|
|
- '("ATTR_ASCII" "ATTR_DOCBOOK" "ATTR_HTML" "ATTR_LATEX" "ATTR_ODT" "HEADER")
|
|
|
+(defconst org-element-multiple-keywords '("HEADER")
|
|
|
"List of affiliated keywords that can occur more that once in an element.
|
|
|
|
|
|
Their value will be consed into a list of strings, which will be
|
|
|
returned as the value of the property.
|
|
|
|
|
|
This list is checked after translations have been applied. See
|
|
|
-`org-element-keyword-translation-alist'.")
|
|
|
+`org-element-keyword-translation-alist'.
|
|
|
+
|
|
|
+By default, all keywords setting attributes (i.e. \"ATTR_LATEX\")
|
|
|
+allow multiple occurrences and need not to be in this list.")
|
|
|
|
|
|
(defconst org-element-parsed-keywords '("AUTHOR" "CAPTION" "DATE" "TITLE")
|
|
|
"List of keywords whose value can be parsed.
|
|
@@ -3158,14 +3162,10 @@ element it has to parse."
|
|
|
;; A keyword may belong to more than one category.
|
|
|
|
|
|
(defconst org-element--affiliated-re
|
|
|
- (format "[ \t]*#\\+\\(%s\\):"
|
|
|
- (mapconcat
|
|
|
- (lambda (keyword)
|
|
|
- (if (member keyword org-element-dual-keywords)
|
|
|
- (format "\\(%s\\)\\(?:\\[\\(.*\\)\\]\\)?"
|
|
|
- (regexp-quote keyword))
|
|
|
- (regexp-quote keyword)))
|
|
|
- org-element-affiliated-keywords "\\|"))
|
|
|
+ (format "[ \t]*#\\+%s:"
|
|
|
+ ;; Regular affiliated keywords.
|
|
|
+ (format "\\(%s\\|ATTR_[-_A-Za-z0-9]+\\)\\(?:\\[\\(.*\\)\\]\\)?"
|
|
|
+ (regexp-opt org-element-affiliated-keywords)))
|
|
|
"Regexp matching any affiliated keyword.
|
|
|
|
|
|
Keyword name is put in match group 1. Moreover, if keyword
|
|
@@ -3216,8 +3216,7 @@ CDR a plist of keywords and values."
|
|
|
(restrict (org-element-restriction 'keyword))
|
|
|
output)
|
|
|
(unless (bobp)
|
|
|
- (while (and (not (bobp))
|
|
|
- (progn (forward-line -1) (looking-at key-re)))
|
|
|
+ (while (and (not (bobp)) (progn (forward-line -1) (looking-at key-re)))
|
|
|
(let* ((raw-kwd (upcase (or (match-string 2) (match-string 1))))
|
|
|
;; Apply translation to RAW-KWD. From there, KWD is
|
|
|
;; the official keyword.
|
|
@@ -3243,7 +3242,8 @@ CDR a plist of keywords and values."
|
|
|
(when (member kwd duals)
|
|
|
;; VALUE is mandatory. Set it to nil if there is none.
|
|
|
(setq value (and value (cons value dual-value))))
|
|
|
- (when (member kwd consed)
|
|
|
+ ;; Attributes are always consed.
|
|
|
+ (when (or (member kwd consed) (string-match "^ATTR_" kwd))
|
|
|
(setq value (cons value (plist-get output kwd-sym))))
|
|
|
;; Eventually store the new value in OUTPUT.
|
|
|
(setq output (plist-put output kwd-sym value))))
|
|
@@ -3717,21 +3717,28 @@ If there is no affiliated keyword, return the empty string."
|
|
|
value)
|
|
|
"\n"))))))
|
|
|
(mapconcat
|
|
|
- (lambda (key)
|
|
|
- (let ((value (org-element-property (intern (concat ":" (downcase key)))
|
|
|
- element)))
|
|
|
+ (lambda (prop)
|
|
|
+ (let ((value (org-element-property prop element))
|
|
|
+ (keyword (upcase (substring (symbol-name prop) 1))))
|
|
|
(when value
|
|
|
- (if (member key org-element-multiple-keywords)
|
|
|
- (mapconcat (lambda (line)
|
|
|
- (funcall keyword-to-org key line))
|
|
|
- value "")
|
|
|
- (funcall keyword-to-org key value)))))
|
|
|
- ;; Remove translated keywords.
|
|
|
- (delq nil
|
|
|
- (mapcar
|
|
|
- (lambda (key)
|
|
|
- (and (not (assoc key org-element-keyword-translation-alist)) key))
|
|
|
- org-element-affiliated-keywords))
|
|
|
+ (if (or (member keyword org-element-multiple-keywords)
|
|
|
+ ;; All attribute keywords can have multiple lines.
|
|
|
+ (string-match "^ATTR_" keyword))
|
|
|
+ (mapconcat (lambda (line) (funcall keyword-to-org keyword line))
|
|
|
+ value
|
|
|
+ "")
|
|
|
+ (funcall keyword-to-org keyword value)))))
|
|
|
+ ;; List all ELEMENT's properties matching an attribute line or an
|
|
|
+ ;; affiliated keyword, but ignore translated keywords since they
|
|
|
+ ;; cannot belong to the property list.
|
|
|
+ (loop for prop in (nth 1 element) by 'cddr
|
|
|
+ when (let ((keyword (upcase (substring (symbol-name prop) 1))))
|
|
|
+ (or (string-match "^ATTR_" keyword)
|
|
|
+ (and
|
|
|
+ (member keyword org-element-affiliated-keywords)
|
|
|
+ (not (assoc keyword
|
|
|
+ org-element-keyword-translation-alist)))))
|
|
|
+ collect prop)
|
|
|
"")))
|
|
|
|
|
|
;; Because interpretation of the parse tree must return the same
|