Selaa lähdekoodia

Merge branch 'master' of orgmode.org:org-mode

Bastien Guerry 12 vuotta sitten
vanhempi
commit
77a6acff0b
4 muutettua tiedostoa jossa 90 lisäystä ja 67 poistoa
  1. 31 37
      contrib/lisp/org-export.el
  2. 25 12
      lisp/org-element.el
  3. 15 17
      lisp/org.el
  4. 19 1
      testing/lisp/test-org-element.el

+ 31 - 37
contrib/lisp/org-export.el

@@ -153,7 +153,7 @@ KEYWORD is a string representing a buffer keyword, or nil.  Each
   property).
 OPTION is a string that could be found in an #+OPTIONS: line.
 DEFAULT is the default value for the property.
-BEHAVIOUR determine how Org should handle multiple keywords for
+BEHAVIOUR determines how Org should handle multiple keywords for
   the same property.  It is a symbol among:
   nil       Keep old value and discard the new one.
   t         Replace old value with the new one.
@@ -163,7 +163,8 @@ BEHAVIOUR determine how Org should handle multiple keywords for
   `split'   Split values at white spaces, and cons them to the
 	    previous list.
 
-KEYWORD and OPTION have precedence over DEFAULT.
+Values set through KEYWORD and OPTION have precedence over
+DEFAULT.
 
 All these properties should be back-end agnostic.  Back-end
 specific properties are set through `org-export-define-backend'.
@@ -2591,7 +2592,7 @@ Return the updated communication channel."
 ;; associated to the file, that is before parsing.
 
 (defun org-export-as
-  (backend &optional subtreep visible-only body-only ext-plist noexpand)
+  (backend &optional subtreep visible-only body-only ext-plist)
   "Transcode current Org buffer into BACKEND code.
 
 If narrowing is active in the current buffer, only transcode its
@@ -2613,9 +2614,6 @@ Optional argument EXT-PLIST, when provided, is a property list
 with external parameters overriding Org default settings, but
 still inferior to file-local settings.
 
-Optional argument NOEXPAND, when non-nil, prevents included files
-to be expanded and Babel code to be executed.
-
 Return code as a string."
   ;; Barf if BACKEND isn't registered.
   (org-export-barf-if-invalid-backend backend)
@@ -2634,20 +2632,19 @@ Return code as a string."
       ;; Initialize communication channel with original buffer
       ;; attributes, unavailable in its copy.
       (let ((info (org-export--get-buffer-attributes)) tree)
+	;; Update communication channel and get parse tree.  Buffer
+	;; isn't parsed directly.  Instead, a temporary copy is
+	;; created, where include keywords, macros are expanded and
+	;; code blocks are evaluated.
 	(org-export-with-buffer-copy
 	 ;; Run first hook with current back-end as argument.
 	 (run-hook-with-args 'org-export-before-processing-hook backend)
-	 ;; Update communication channel and get parse tree.  Buffer
-	 ;; isn't parsed directly.  Instead, a temporary copy is
-	 ;; created, where include keywords, macros are expanded and
-	 ;; code blocks are evaluated.
-	 (unless noexpand
-	   (org-export-expand-include-keyword)
-	   ;; Update macro templates since #+INCLUDE keywords might
-	   ;; have added some new ones.
-	   (org-macro-initialize-templates)
-	   (org-macro-replace-all org-macro-templates)
-	   (org-export-execute-babel-code))
+	 (org-export-expand-include-keyword)
+	 ;; Update macro templates since #+INCLUDE keywords might have
+	 ;; added some new ones.
+	 (org-macro-initialize-templates)
+	 (org-macro-replace-all org-macro-templates)
+	 (org-export-execute-babel-code)
 	 ;; Update radio targets since keyword inclusion might have
 	 ;; added some more.
 	 (org-update-radio-target-regexp)
@@ -2664,16 +2661,15 @@ Return code as a string."
 	 ;; {{{date}}}, {{{email}}} and {{{title}}}.  It must be done
 	 ;; once regular macros have been expanded, since document
 	 ;; keywords may contain one of them.
-	 (unless noexpand
-	   (org-macro-replace-all
-	    (list (cons "author"
-			(org-element-interpret-data (plist-get info :author)))
-		  (cons "date"
-			(org-element-interpret-data (plist-get info :date)))
-		  ;; EMAIL is not a parsed keyword: store it as-is.
-		  (cons "email" (or (plist-get info :email) ""))
-		  (cons "title"
-			(org-element-interpret-data (plist-get info :title))))))
+	 (org-macro-replace-all
+	  (list (cons "author"
+		      (org-element-interpret-data (plist-get info :author)))
+		(cons "date"
+		      (org-element-interpret-data (plist-get info :date)))
+		;; EMAIL is not a parsed keyword: store it as-is.
+		(cons "email" (or (plist-get info :email) ""))
+		(cons "title"
+		      (org-element-interpret-data (plist-get info :title)))))
 	 ;; Eventually parse buffer.  Call parse-tree filters to get
 	 ;; the final tree.
 	 (setq tree
@@ -2705,7 +2701,7 @@ Return code as a string."
 	  output)))))
 
 (defun org-export-to-buffer
-  (backend buffer &optional subtreep visible-only body-only ext-plist noexpand)
+  (backend buffer &optional subtreep visible-only body-only ext-plist)
   "Call `org-export-as' with output to a specified buffer.
 
 BACKEND is the back-end used for transcoding, as a symbol.
@@ -2713,13 +2709,12 @@ BACKEND is the back-end used for transcoding, as a symbol.
 BUFFER is the output buffer.  If it already exists, it will be
 erased first, otherwise, it will be created.
 
-Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY, EXT-PLIST
-and NOEXPAND are similar to those used in `org-export-as', which
+Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY and
+EXT-PLIST are similar to those used in `org-export-as', which
 see.
 
 Return buffer."
-  (let ((out (org-export-as
-	      backend subtreep visible-only body-only ext-plist noexpand))
+  (let ((out (org-export-as backend subtreep visible-only body-only ext-plist))
 	(buffer (get-buffer-create buffer)))
     (with-current-buffer buffer
       (erase-buffer)
@@ -2728,14 +2723,14 @@ Return buffer."
     buffer))
 
 (defun org-export-to-file
-  (backend file &optional subtreep visible-only body-only ext-plist noexpand)
+  (backend file &optional subtreep visible-only body-only ext-plist)
   "Call `org-export-as' with output to a specified file.
 
 BACKEND is the back-end used for transcoding, as a symbol.  FILE
 is the name of the output file, as a string.
 
-Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY, EXT-PLIST
-and NOEXPAND are similar to those used in `org-export-as', which
+Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY and
+EXT-PLIST are similar to those used in `org-export-as', which
 see.
 
 Return output file's name."
@@ -2743,8 +2738,7 @@ Return output file's name."
   ;; we'd rather avoid needless transcoding of parse tree.
   (unless (file-writable-p file) (error "Output file not writable"))
   ;; Insert contents to a temporary buffer and write it to FILE.
-  (let ((out (org-export-as
-	      backend subtreep visible-only body-only ext-plist noexpand)))
+  (let ((out (org-export-as backend subtreep visible-only body-only ext-plist)))
     (with-temp-buffer
       (insert out)
       (let ((coding-system-for-write org-export-coding-system))

+ 25 - 12
lisp/org-element.el

@@ -358,6 +358,11 @@ still has an entry since one of its properties (`:title') does.")
     (footnote-reference . :inline-definition))
   "Alist between element types and location of secondary value.")
 
+(defconst org-element-object-variables '(org-link-abbrev-alist-local)
+  "List of buffer-local variables used when parsing objects.
+These variables are copied to the temporary buffer created by
+`org-export-secondary-string'.")
+
 
 
 ;;; Accessors and Setters
@@ -2998,10 +3003,10 @@ Assume point is at the beginning of the link."
 	      contents-end (match-end 3)
 	      link-end (match-end 0)
 	      ;; RAW-LINK is the original link.
-	      raw-link (org-match-string-no-properties 1)
-	      link (org-translate-link
-		    (org-link-expand-abbrev
-		     (org-link-unescape raw-link))))
+	      raw-link (org-translate-link
+			(org-link-expand-abbrev
+			 (org-match-string-no-properties 1)))
+	      link (org-link-unescape raw-link))
 	;; Determine TYPE of link and set PATH accordingly.
 	(cond
 	 ;; File type.
@@ -3930,14 +3935,22 @@ looked after.
 Optional argument PARENT, when non-nil, is the element or object
 containing the secondary string.  It is used to set correctly
 `:parent' property within the string."
-  (with-temp-buffer
-    (insert string)
-    (let ((secondary (org-element--parse-objects
-		      (point-min) (point-max) nil restriction)))
-      (when parent
-	(mapc (lambda (obj) (org-element-put-property obj :parent parent))
-	      secondary))
-      secondary)))
+  ;; Copy buffer-local variables listed in
+  ;; `org-element-object-variables' into temporary buffer.  This is
+  ;; required since object parsing is dependent on these variables.
+  (let ((pairs (delq nil (mapcar (lambda (var)
+				   (when (boundp var)
+				     (cons var (symbol-value var))))
+				 org-element-object-variables))))
+    (with-temp-buffer
+      (mapc (lambda (pair) (org-set-local (car pair) (cdr pair))) pairs)
+      (insert string)
+      (let ((secondary (org-element--parse-objects
+			(point-min) (point-max) nil restriction)))
+	(when parent
+	  (mapc (lambda (obj) (org-element-put-property obj :parent parent))
+		secondary))
+	secondary))))
 
 (defun org-element-map
   (data types fun &optional info first-match no-recursion with-affiliated)

+ 15 - 17
lisp/org.el

@@ -21485,22 +21485,18 @@ width for filling.
 For convenience, when point is at a plain list, an item or
 a footnote definition, try to fill the first paragraph within."
   (interactive)
-  (cond ;; First ensure filling in correct in message-mode
-   ((and (derived-mode-p 'message-mode)
-	 (or (not (message-in-body-p))
-	     (save-excursion (move-beginning-of-line 1)
-			     (looking-at message-cite-prefix-regexp))))
-    (let ((fill-paragraph-function
-	   (cadadr (assoc 'fill-paragraph-function org-fb-vars)))
-	  (fill-prefix (cadadr (assoc 'fill-prefix org-fb-vars)))
-	  (paragraph-start (cadadr (assoc 'paragraph-start org-fb-vars)))
-	  (paragraph-separate
-	   (cadadr (assoc 'paragraph-separate org-fb-vars))))
-      (fill-paragraph nil)))
-   ;; Correct filling in source block
-   ((org-in-src-block-p)
-    (org-babel-do-key-sequence-in-edit-buffer (kbd "M-q")))
-   (t
+  (if (and (derived-mode-p 'message-mode)
+	   (or (not (message-in-body-p))
+	       (save-excursion (move-beginning-of-line 1)
+			       (looking-at message-cite-prefix-regexp))))
+      ;; First ensure filling is correct in message-mode.
+      (let ((fill-paragraph-function
+	     (cadadr (assoc 'fill-paragraph-function org-fb-vars)))
+	    (fill-prefix (cadadr (assoc 'fill-prefix org-fb-vars)))
+	    (paragraph-start (cadadr (assoc 'paragraph-start org-fb-vars)))
+	    (paragraph-separate
+	     (cadadr (assoc 'paragraph-separate org-fb-vars))))
+	(fill-paragraph nil))
     (save-excursion
       ;; Move to end of line in order to get the first paragraph
       ;; within a plain list or a footnote definition.
@@ -21510,6 +21506,8 @@ a footnote definition, try to fill the first paragraph within."
 	;; the buffer.  In that case, ignore filling.
 	(if (< (point) (org-element-property :begin element)) t
 	  (case (org-element-type element)
+	    ;; Use major mode filling function is src blocks.
+	    (src-block (org-babel-do-key-sequence-in-edit-buffer (kbd "M-q")))
 	    ;; Align Org tables, leave table.el tables as-is.
 	    (table-row (org-table-align) t)
 	    (table
@@ -21586,7 +21584,7 @@ a footnote definition, try to fill the first paragraph within."
 	    ;; Fill comments.
 	    (comment (fill-comment-paragraph justify))
 	    ;; Ignore every other element.
-	    (otherwise t))))))))
+	    (otherwise t)))))))
 
 (defun org-auto-fill-function ()
   "Auto-fill function."

+ 19 - 1
testing/lisp/test-org-element.el

@@ -1260,7 +1260,25 @@ e^{i\\pi}+1=0
   ;; 4. Angular link.
   (should
    (org-test-with-temp-text "A link: <http://orgmode.org>"
-     (org-element-map (org-element-parse-buffer) 'link 'identity nil t))))
+     (org-element-map (org-element-parse-buffer) 'link 'identity nil t)))
+  ;; Link abbreviation.
+  (should
+   (equal "http"
+	  (org-test-with-temp-text
+	      "#+LINK: orgmode http://www.orgmode.org/\n[[orgmode:#docs]]"
+	    (progn (org-mode-restart)
+		   (goto-char (point-max))
+		   (org-element-property :type (org-element-context))))))
+  ;; Link abbreviation in a secondary string.
+  (should
+   (equal "http"
+	  (org-test-with-temp-text
+	      "#+LINK: orgmode http://www.orgmode.org/\n* H [[orgmode:#docs]]"
+	    (progn (org-mode-restart)
+		   (org-element-map
+		    (org-element-parse-buffer) 'link
+		    (lambda (link) (org-element-property :type link))
+		    nil t nil t))))))
 
 
 ;;;; Macro