From 46532af16d5d0e2f1346e2b2c7debb4050b26851 Mon Sep 17 00:00:00 2001 From: Carsten Dominik Date: Mon, 4 May 2009 18:26:42 +0200 Subject: [PATCH] ASCII Export: Implement export to buffer Samuel Wales writes: > I frequently export to ascii without wanting a file to be created, > especially not in a useful directory, as the files are temporary. > > Is there a way to export ascii to just a buffer? There is now, `C-c C-e A'. This commit also implements commands - org-export-as-ascii-to-buffer - org-replace-region-by-ascii - org-export-region-as-ascii which are similar to what is available for HTML and LaTeX. `C-c C-e A' used to be the key for publishing all projects. This functionality has now been moved to `C-c C-e E'. --- doc/org.texi | 11 ++- lisp/ChangeLog | 9 +++ lisp/org-ascii.el | 198 +++++++++++++++++++++++++++++++++------------- lisp/org-exp.el | 8 +- 4 files changed, 168 insertions(+), 58 deletions(-) diff --git a/doc/org.texi b/doc/org.texi index 45ef0bd05..f49ea0797 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -8340,6 +8340,9 @@ current subtree, use @kbd{C-c @@}.}, the tree head will become the document title. If the tree head entry has or inherits an @code{EXPORT_FILE_NAME} property, that name will be used for the export. +@kindex C-c C-e A +@item C-c C-e A +Export to a temporary buffer, do not create a file. @kindex C-c C-e v a @item C-c C-e v a Export only the visible part of the document. @@ -9567,14 +9570,18 @@ right place on the web server, and publishing images to it. Once properly configured, Org can publish with the following commands: @table @kbd +@kindex C-c C-e C @item C-c C-e C Prompt for a specific project and publish all files that belong to it. +@kindex C-c C-e P @item C-c C-e P Publish the project containing the current file. +@kindex C-c C-e F @item C-c C-e F Publish only the current file. -@item C-c C-e A -Publish all projects. +@kindex C-c C-e E +@item C-c C-e E +Publish every project. @end table @vindex org-publish-use-timestamps-flag diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 14252fde8..cb7ee58b4 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,14 @@ 2009-05-04 Carsten Dominik + * org-exp.el (org-export, org-export-visible): Support ASCII + export to buffer + + * org-ascii.el (org-export-as-ascii-to-buffer) + (org-replace-region-by-ascii, org-export-region-as-ascii): New + commands. + (org-export-as-ascii): Add all the same parameters that are also + supported by the other export functions. + * org-list.el (org-reset-checkbox-state-subtree): Moved here from org-checklist.el. (org-reset-checkbox-state-subtree): Call diff --git a/lisp/org-ascii.el b/lisp/org-ascii.el index 1f68143f5..ae33502e2 100644 --- a/lisp/org-ascii.el +++ b/lisp/org-ascii.el @@ -62,24 +62,101 @@ in this way, it will be wrapped." (defvar org-ascii-current-indentation nil) ; For communication ;;;###autoload -(defun org-export-as-ascii (arg) +(defun org-export-as-ascii-to-buffer (arg) + "Call `org-export-as-ascii` with output to a temporary buffer. +No file is created. The prefix ARG is passed through to `org-export-as-ascii'." + (interactive "P") + (org-export-as-ascii arg nil nil "*Org ASCII Export*") + (switch-to-buffer-other-window "*Org ASCII Export*")) + +;;;###autoload +(defun org-replace-region-by-ascii (beg end) + "Assume the current region has org-mode syntax, and convert it to plain ASCII. +This can be used in any buffer. For example, you could write an +itemized list in org-mode syntax in a Mail buffer and then use this +command to convert it." + (interactive "r") + (let (reg ascii buf pop-up-frames) + (save-window-excursion + (if (org-mode-p) + (setq ascii (org-export-region-as-ascii + beg end t 'string)) + (setq reg (buffer-substring beg end) + buf (get-buffer-create "*Org tmp*")) + (with-current-buffer buf + (erase-buffer) + (insert reg) + (org-mode) + (setq ascii (org-export-region-as-ascii + (point-min) (point-max) t 'string))) + (kill-buffer buf))) + (delete-region beg end) + (insert ascii))) + +;;;###autoload +(defun org-export-region-as-ascii (beg end &optional body-only buffer) + "Convert region from BEG to END in org-mode buffer to plain ASCII. +If prefix arg BODY-ONLY is set, omit file header, footer, and table of +contents, and only produce the region of converted text, useful for +cut-and-paste operations. +If BUFFER is a buffer or a string, use/create that buffer as a target +of the converted ASCII. If BUFFER is the symbol `string', return the +produced ASCII as a string and leave not buffer behind. For example, +a Lisp program could call this function in the following way: + + (setq ascii (org-export-region-as-ascii beg end t 'string)) + +When called interactively, the output buffer is selected, and shown +in a window. A non-interactive call will only return the buffer." + (interactive "r\nP") + (when (interactive-p) + (setq buffer "*Org ASCII Export*")) + (let ((transient-mark-mode t) (zmacs-regions t) + ext-plist rtn) + (setq ext-plist (plist-put ext-plist :ignore-subree-p t)) + (goto-char end) + (set-mark (point)) ;; to activate the region + (goto-char beg) + (setq rtn (org-export-as-ascii + nil nil ext-plist + buffer body-only)) + (if (fboundp 'deactivate-mark) (deactivate-mark)) + (if (and (interactive-p) (bufferp rtn)) + (switch-to-buffer-other-window rtn) + rtn))) + +;;;###autoload +(defun org-export-as-ascii (arg &optional hidden ext-plist + to-buffer body-only pub-dir) "Export the outline as a pretty ASCII file. If there is an active region, export only the region. The prefix ARG specifies how many levels of the outline should become -underlined headlines. The default is 3." +underlined headlines, default is 3. Lower levels will become bulleted +lists. When HIDDEN is non-nil, don't display the ASCII buffer. +EXT-PLIST is a property list with external parameters overriding +org-mode's default settings, but still inferior to file-local +settings. When TO-BUFFER is non-nil, create a buffer with that +name and export to that buffer. If TO-BUFFER is the symbol +`string', don't leave any buffer behind but just return the +resulting ASCII as a string. When BODY-ONLY is set, don't produce +the file header and footer. When PUB-DIR is set, use this as the +publishing directory." (interactive "P") (setq-default org-todo-line-regexp org-todo-line-regexp) (let* ((opt-plist (org-combine-plists (org-default-export-plist) + ext-plist (org-infile-export-plist))) (region-p (org-region-active-p)) (rbeg (and region-p (region-beginning))) (rend (and region-p (region-end))) (subtree-p - (when region-p - (save-excursion - (goto-char rbeg) - (and (org-at-heading-p) - (>= (org-end-of-subtree t t) rend))))) + (if (plist-get opt-plist :ignore-subree-p) + nil + (when region-p + (save-excursion + (goto-char rbeg) + (and (org-at-heading-p) + (>= (org-end-of-subtree t t) rend)))))) (level-offset (if subtree-p (save-excursion (goto-char rbeg) @@ -97,34 +174,42 @@ underlined headlines. The default is 3." (umax-toc nil) (case-fold-search nil) (bfname (buffer-file-name (or (buffer-base-buffer) (current-buffer)))) - (filename (concat (file-name-as-directory - (org-export-directory :ascii opt-plist)) - (file-name-sans-extension - (or (and subtree-p - (org-entry-get (region-beginning) - "EXPORT_FILE_NAME" t)) - (file-name-nondirectory bfname))) - ".txt")) - (filename (if (equal (file-truename filename) - (file-truename bfname)) - (concat filename ".txt") - filename)) - (buffer (find-file-noselect filename)) + (filename (if to-buffer + nil + (concat (file-name-as-directory + (or pub-dir + (org-export-directory :ascii opt-plist))) + (file-name-sans-extension + (or (and subtree-p + (org-entry-get (region-beginning) + "EXPORT_FILE_NAME" t)) + (file-name-nondirectory bfname))) + ".txt"))) + (filename (and filename + (if (equal (file-truename filename) + (file-truename bfname)) + (concat filename ".txt") + filename))) + (buffer (if to-buffer + (cond + ((eq to-buffer 'string) + (get-buffer-create "*Org ASCII Export*")) + (t (get-buffer-create to-buffer))) + (find-file-noselect filename))) (org-levels-open (make-vector org-level-max nil)) (odd org-odd-levels-only) (date (plist-get opt-plist :date)) - (author (plist-get opt-plist :author)) - (title (or (and subtree-p (org-export-get-title-from-subtree)) - (plist-get opt-plist :title) - (and (not - (plist-get opt-plist :skip-before-1st-heading)) - (org-export-grab-title-from-buffer)) - (file-name-sans-extension - (file-name-nondirectory bfname)))) - (email (plist-get opt-plist :email)) - (language (plist-get opt-plist :language)) - (quote-re0 (concat "^[ \t]*" org-quote-string "\\>")) -; (quote-re (concat "^\\(\\*+\\)\\([ \t]*" org-quote-string "\\>\\)")) + (author (plist-get opt-plist :author)) + (title (or (and subtree-p (org-export-get-title-from-subtree)) + (plist-get opt-plist :title) + (and (not + (plist-get opt-plist :skip-before-1st-heading)) + (org-export-grab-title-from-buffer)) + (file-name-sans-extension + (file-name-nondirectory bfname)))) + (email (plist-get opt-plist :email)) + (language (plist-get opt-plist :language)) + (quote-re0 (concat "^[ \t]*" org-quote-string "\\>")) (todo nil) (lang-words nil) (region @@ -161,7 +246,7 @@ underlined headlines. The default is 3." (setq org-last-level org-min-level) (org-init-section-numbers) - (find-file-noselect filename) + (switch-to-buffer buffer) (setq lang-words (or (assoc language org-export-language-setup) (assoc "en" org-export-language-setup))) @@ -182,26 +267,27 @@ underlined headlines. The default is 3." umax)) ;; File header - (if title (org-insert-centered title ?=)) - (insert "\n") - (if (and (or author email) - org-export-author-info) - (insert (concat (nth 1 lang-words) ": " (or author "") - (if email (concat " <" email ">") "") - "\n"))) + (unless body-only + (if title (org-insert-centered title ?=)) + (insert "\n") + (if (and (or author email) + org-export-author-info) + (insert (concat (nth 1 lang-words) ": " (or author "") + (if email (concat " <" email ">") "") + "\n"))) - (cond - ((and date (string-match "%" date)) - (setq date (format-time-string date))) - (date) - (t (setq date (format-time-string "%Y-%m-%d %T %Z")))) + (cond + ((and date (string-match "%" date)) + (setq date (format-time-string date))) + (date) + (t (setq date (format-time-string "%Y-%m-%d %T %Z")))) + + (if (and date org-export-time-stamp-file) + (insert (concat (nth 2 lang-words) ": " date"\n"))) + + (insert "\n\n")) - (if (and date org-export-time-stamp-file) - (insert (concat (nth 2 lang-words) ": " date"\n"))) - - (insert "\n\n") - - (if org-export-with-toc + (if (and org-export-with-toc (not body-only)) (progn (push (concat (nth 3 lang-words) "\n") thetoc) (push (concat (make-string (string-width (nth 3 lang-words)) ?=) @@ -355,7 +441,6 @@ underlined headlines. The default is 3." (delete-region beg end) (insert (make-string (- end beg) ?\ )))) - (save-buffer) ;; remove display and invisible chars (let (beg end) (goto-char (point-min)) @@ -369,7 +454,14 @@ underlined headlines. The default is 3." (setq end (next-single-property-change beg 'org-cwidth)) (delete-region beg end) (goto-char beg))) - (goto-char (point-min)))) + (or to-buffer (save-buffer)) + (goto-char (point-min)) + (prog1 (if (eq to-buffer 'string) + (prog1 (buffer-substring (point-min) (point-max)) + (kill-buffer (current-buffer))) + (current-buffer)) + (when hidden + (delete-window))))) (defun org-export-ascii-preprocess (parameters) "Do extra work for ASCII export" diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 112464401..29346a4d2 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -754,7 +754,7 @@ value of `org-export-run-in-background'." (help "[t] insert the export option template \[v] limit export to visible part of outline tree -\[a] export as ASCII +\[a] export as ASCII [A] to temporary buffer \[h] export as HTML [H] to temporary buffer [R] export region \[b] export as HTML and open in browser @@ -773,11 +773,12 @@ value of `org-export-run-in-background'." \[c] export agenda files into combined iCalendar file \[F] publish current file [P] publish current project -\[X] publish a project... [A] publish all projects") +\[X] publish a project... [E] publish every projects") (cmds '((?t org-insert-export-options-template nil) (?v org-export-visible nil) (?a org-export-as-ascii t) + (?A org-export-as-ascii-to-buffer t) (?h org-export-as-html t) (?b org-export-as-html-and-open t) (?H org-export-as-html-to-buffer nil) @@ -795,7 +796,7 @@ value of `org-export-run-in-background'." (?F org-publish-current-file t) (?P org-publish-current-project t) (?X org-publish t) - (?A org-publish-all t))) + (?E org-publish-all t))) r1 r2 ass) (save-excursion (save-window-excursion @@ -2306,6 +2307,7 @@ command." (error "Invalid export key")) (let* ((binding (cdr (assoc type '((?a . org-export-as-ascii) + (?A . org-export-as-ascii-to-buffer) (?\C-a . org-export-as-ascii) (?b . org-export-as-html-and-open) (?\C-b . org-export-as-html-and-open)