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'.
This commit is contained in:
Carsten Dominik 2009-05-04 18:26:42 +02:00
parent 34a91b7f5b
commit 46532af16d
4 changed files with 168 additions and 58 deletions

View File

@ -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

View File

@ -1,5 +1,14 @@
2009-05-04 Carsten Dominik <carsten.dominik@gmail.com>
* 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

View File

@ -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"

View File

@ -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)