]> code.delx.au - gnu-emacs/blobdiff - lisp/org/org-ascii.el
Copyright, license, and header fixes for Org.
[gnu-emacs] / lisp / org / org-ascii.el
index 3d86e7a52303df68a4efc0e71add41482d71e618..90f39fd3d8da5437652dd37b213fa781137314f0 100644 (file)
@@ -1,12 +1,10 @@
 ;;; org-ascii.el --- ASCII export for Org-mode
 
-;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 2004-2012 Free Software Foundation, Inc.
 
 ;; Author: Carsten Dominik <carsten at orgmode dot org>
 ;; Keywords: outlines, hypermedia, calendar, wp
 ;; Homepage: http://orgmode.org
-;; Version: 6.35i
 ;;
 ;; This file is part of GNU Emacs.
 ;;
 ;;
 ;;; Commentary:
 
+;;; Code:
+
 (require 'org-exp)
+
 (eval-when-compile
   (require 'cl))
 
@@ -35,7 +36,7 @@
   :tag "Org Export ASCII"
   :group 'org-export)
 
-(defcustom org-export-ascii-underline '(?\$ ?\# ?^ ?\~ ?\= ?\-)
+(defcustom org-export-ascii-underline '(?\- ?\= ?\~ ?^ ?\# ?\$)
   "Characters for underlining headings in ASCII export.
 In the given sequence, these characters will be used for level 1, 2, ..."
   :group 'org-export-ascii
@@ -93,29 +94,30 @@ utf8      Use all UTF-8 characters")
 (defun org-export-as-latin1 (&rest args)
   "Like `org-export-as-ascii', use latin1 encoding for special symbols."
   (interactive)
-  (org-export-as-encoding 'org-export-as-ascii (interactive-p)
+  (org-export-as-encoding 'org-export-as-ascii (org-called-interactively-p 'any)
                          'latin1 args))
 
 ;;;###autoload
 (defun org-export-as-latin1-to-buffer (&rest args)
   "Like `org-export-as-ascii-to-buffer', use latin1 encoding for symbols."
   (interactive)
-  (org-export-as-encoding 'org-export-as-ascii-to-buffer (interactive-p)
-                         'latin1 args))
+  (org-export-as-encoding 'org-export-as-ascii-to-buffer
+                         (org-called-interactively-p 'any) 'latin1 args))
 
 ;;;###autoload
 (defun org-export-as-utf8 (&rest args)
-  "Like `org-export-as-ascii', use use encoding for special symbols."
+  "Like `org-export-as-ascii', use encoding for special symbols."
   (interactive)
-  (org-export-as-encoding 'org-export-as-ascii (interactive-p)
+  (org-export-as-encoding 'org-export-as-ascii
+                         (org-called-interactively-p 'any)
                          'utf8 args))
 
 ;;;###autoload
 (defun org-export-as-utf8-to-buffer (&rest args)
   "Like `org-export-as-ascii-to-buffer', use utf8 encoding for symbols."
   (interactive)
-  (org-export-as-encoding 'org-export-as-ascii-to-buffer (interactive-p)
-                         'utf8 args))
+  (org-export-as-encoding 'org-export-as-ascii-to-buffer
+                         (org-called-interactively-p 'any) 'utf8 args))
 
 (defun org-export-as-encoding (command interactivep encoding &rest args)
   (let ((org-export-ascii-entities encoding))
@@ -142,7 +144,7 @@ command to convert it."
   (interactive "r")
   (let (reg ascii buf pop-up-frames)
     (save-window-excursion
-      (if (org-mode-p)
+      (if (eq major-mode 'org-mode)
          (setq ascii (org-export-region-as-ascii
                      beg end t 'string))
        (setq reg (buffer-substring beg end)
@@ -173,7 +175,7 @@ a Lisp program could call this function in the following way:
 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)
+  (when (org-called-interactively-p 'any)
     (setq buffer "*Org ASCII Export*"))
   (let ((transient-mark-mode t) (zmacs-regions t)
        ext-plist rtn)
@@ -185,7 +187,7 @@ in a window.  A non-interactive call will only return the buffer."
               nil nil ext-plist
               buffer body-only))
     (if (fboundp 'deactivate-mark) (deactivate-mark))
-    (if (and (interactive-p) (bufferp rtn))
+    (if (and (org-called-interactively-p 'any) (bufferp rtn))
        (switch-to-buffer-other-window rtn)
       rtn)))
 
@@ -281,17 +283,19 @@ publishing directory."
                    "UNTITLED"))
         (email (plist-get opt-plist :email))
         (language (plist-get opt-plist :language))
-        (quote-re0 (concat "^[ \t]*" org-quote-string "\\>"))
+        (quote-re0 (concat "^\\(" org-quote-string "\\)\\( +\\|[ \t]*$\\)"))
         (todo nil)
         (lang-words nil)
         (region
          (buffer-substring
           (if (org-region-active-p) (region-beginning) (point-min))
           (if (org-region-active-p) (region-end) (point-max))))
+        (org-export-footnotes-seen nil)
+        (org-export-footnotes-data (org-footnote-all-labels 'with-defs))
         (lines (org-split-string
                 (org-export-preprocess-string
                  region
-                 :for-ascii t
+                 :for-backend 'ascii
                  :skip-before-1st-heading
                  (plist-get opt-plist :skip-before-1st-heading)
                  :drawers (plist-get opt-plist :drawers)
@@ -300,6 +304,7 @@ publishing directory."
                  :footnotes (plist-get opt-plist :footnotes)
                  :timestamps (plist-get opt-plist :timestamps)
                  :todo-keywords (plist-get opt-plist :todo-keywords)
+                 :tasks (plist-get opt-plist :tasks)
                  :verbatim-multiline t
                  :select-tags (plist-get opt-plist :select-tags)
                  :exclude-tags (plist-get opt-plist :exclude-tags)
@@ -308,7 +313,7 @@ publishing directory."
                  :add-text (plist-get opt-plist :text))
                 "\n"))
         thetoc have-headings first-heading-pos
-        table-open table-buffer link-buffer link desc desc0 rpl wrap)
+        table-open table-buffer link-buffer link type path desc desc0 rpl wrap fnc)
     (let ((inhibit-read-only t))
       (org-unmodified
        (remove-text-properties (point-min) (point-max)
@@ -344,7 +349,7 @@ publishing directory."
 
       (if (and (or author email)
               org-export-author-info)
-         (insert(concat (nth 1 lang-words) ": " (or author "")
+         (insert (concat (nth 1 lang-words) ": " (or author "")
                          (if (and org-export-email-info
                                   email (string-match "\\S-" email))
                              (concat " <" email ">") "")
@@ -367,7 +372,7 @@ publishing directory."
          (push (concat (nth 3 lang-words) "\n") thetoc)
          (push (concat (make-string (string-width (nth 3 lang-words)) ?=)
                        "\n") thetoc)
-         (mapc '(lambda (line)
+         (mapc #'(lambda (line)
                   (if (string-match org-todo-line-regexp
                                     line)
                       ;; This is a headline
@@ -397,11 +402,11 @@ publishing directory."
 
                         (if (and (memq org-export-with-tags '(not-in-toc nil))
                                  (string-match
-                                  (org-re "[ \t]+:[[:alnum:]_@:]+:[ \t]*$")
+                                  (org-re "[ \t]+:[[:alnum:]_@#%:]+:[ \t]*$")
                                   txt))
                             (setq txt (replace-match "" t t txt)))
                         (if (string-match quote-re0 txt)
-                            (setq txt (replace-match "" t t txt)))
+                            (setq txt (replace-match "" t t txt 1)))
 
                         (if org-export-with-section-numbers
                             (setq txt (concat (org-section-number level)
@@ -421,17 +426,19 @@ publishing directory."
 
     (org-init-section-numbers)
     (while (setq line (pop lines))
-      (when (and link-buffer (string-match "^\\*+ " line))
+      (when (and link-buffer (string-match org-outline-regexp-bol line))
        (org-export-ascii-push-links (nreverse link-buffer))
        (setq link-buffer nil))
       (setq wrap nil)
       ;; Remove the quoted HTML tags.
       (setq line (org-html-expand-for-ascii line))
       ;; Replace links with the description when possible
-      (while (string-match org-bracket-link-regexp line)
-       (setq link (match-string 1 line)
-             desc0 (match-string 3 line)
-             desc (or desc0 (match-string 1 line)))
+      (while (string-match org-bracket-link-analytic-regexp++ line)
+       (setq path (match-string 3 line)
+             link (concat (match-string 1 line) path)
+             type (match-string 2 line)
+             desc0 (match-string 5 line)
+             desc (or desc0 link))
        (if (and (> (length link) 8)
                 (equal (substring link 0 8) "coderef:"))
            (setq line (replace-match
@@ -440,15 +447,18 @@ publishing directory."
                                      (substring link 8)
                                      org-export-code-refs)))
                        t t line))
-         (setq rpl (concat "["
-                           (or (match-string 3 line) (match-string 1 line))
-                           "]"))
-         (when (and desc0 (not (equal desc0 link)))
-           (if org-export-ascii-links-to-notes
-               (push (cons desc0 link) link-buffer)
-             (setq rpl (concat rpl " (" link ")")
-                   wrap (+ (length line) (- (length (match-string 0 line)))
-                           (length desc)))))
+         (setq rpl (concat "[" desc "]"))
+         (if (functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
+             (setq rpl (or (save-match-data
+                             (funcall fnc (org-link-unescape path)
+                                      desc0 'ascii))
+                           rpl))
+           (when (and desc0 (not (equal desc0 link)))
+             (if org-export-ascii-links-to-notes
+                 (push (cons desc0 link) link-buffer)
+               (setq rpl (concat rpl " (" link ")")
+                     wrap (+ (length line) (- (length (match-string 0 line)))
+                             (length desc))))))
          (setq line (replace-match rpl t t line))))
       (when custom-times
        (setq line (org-translate-time line)))
@@ -479,7 +489,8 @@ publishing directory."
                   (org-format-table-ascii table-buffer)
                   "\n") "\n")))
        (t
-       (if (string-match "^\\([ \t]*\\)\\([-+*][ \t]+\\)\\(.*?\\)\\( ::\\)" line)
+       (if (string-match "^\\([ \t]*\\)\\([-+*][ \t]+\\)\\(.*?\\)\\( ::\\)"
+                         line)
            (setq line (replace-match "\\1\\3:" t nil line)))
        (setq line (org-fix-indentation line org-ascii-current-indentation))
        ;; Remove forced line breaks
@@ -541,7 +552,7 @@ publishing directory."
       (current-buffer))))
 
 (defun org-export-ascii-preprocess (parameters)
-  "Do extra work for ASCII export"
+  "Do extra work for ASCII export."
   ;;
   ;; Realign tables to get rid of narrowing
   (when org-export-ascii-table-widen-columns
@@ -550,9 +561,8 @@ publishing directory."
       (org-ascii-replace-entities)
       (goto-char (point-min))
       (org-table-map-tables
-       (lambda ()
-        (org-if-unprotected
-         (org-table-align))))))
+       (lambda () (org-if-unprotected (org-table-align)))
+       'quietly)))
   ;; Put quotes around verbatim text
   (goto-char (point-min))
   (while (re-search-forward org-verbatim-re nil t)
@@ -566,7 +576,15 @@ publishing directory."
   (goto-char (point-min))
   (while (re-search-forward  "<<<?\\([^<>]*\\)>>>?\\([ \t]*\\)" nil t)
     (org-if-unprotected-at (match-beginning 1)
-      (replace-match "\\1\\2"))))
+      (replace-match "\\1\\2")))
+  ;; Remove list start counters
+  (goto-char (point-min))
+  (while (org-list-search-forward
+         "\\[@\\(?:start:\\)?\\([0-9]+\\|[A-Za-z]\\)\\][ \t]*" nil t)
+    (replace-match ""))
+  (remove-text-properties
+   (point-min) (point-max)
+   '(face nil font-lock-fontified nil font-lock-multiline nil line-prefix nil wrap-prefix nil)))
 
 (defun org-html-expand-for-ascii (line)
   "Handle quoted HTML for ASCII export."
@@ -579,7 +597,7 @@ publishing directory."
 (defun org-ascii-replace-entities ()
   "Replace entities with the ASCII representation."
   (let (e)
-    (while (re-search-forward "\\\\\\([a-zA-Z]+[0-9]*\\)" nil t)
+    (while (re-search-forward "\\\\\\([a-zA-Z]+[0-9]*\\)\\({}\\)?" nil t)
       (org-if-unprotected-at (match-beginning 1)
        (setq e (org-entity-get-representation (match-string 1)
                                               org-export-ascii-entities))
@@ -609,7 +627,9 @@ publishing directory."
       (save-match-data
        (if (save-excursion
              (re-search-backward
-              "^\\(\\([ \t]*\\)\\|\\(\\*+ \\)\\)[^ \t\n]" nil t))
+              (concat "^\\(\\([ \t]*\\)\\|\\("
+                      org-outline-regexp
+                      "\\)\\)[^ \t\n]") nil t))
            (setq ind (or (match-string 2)
                          (make-string (length (match-string 3)) ?\ )))))
       (mapc (lambda (x) (insert ind "[" (car x) "]: " (cdr x) "\n"))
@@ -636,9 +656,10 @@ publishing directory."
       (if (or (not (equal (char-before) ?\n))
              (not (equal (char-before (1- (point))) ?\n)))
          (insert "\n"))
-      (setq char (nth (- umax level) (reverse org-export-ascii-underline)))
+      (setq char (or (nth (1- level) org-export-ascii-underline)
+                    (car (last org-export-ascii-underline))))
       (unless org-export-with-tags
-       (if (string-match (org-re "[ \t]+\\(:[[:alnum:]_@:]+:\\)[ \t]*$") title)
+       (if (string-match (org-re "[ \t]+\\(:[[:alnum:]_@#%:]+:\\)[ \t]*$") title)
            (setq title (replace-match "" t t title))))
       (if org-export-with-section-numbers
          (setq title (concat (org-section-number level) " " title)))
@@ -703,5 +724,4 @@ publishing directory."
 
 (provide 'org-ascii)
 
-;; arch-tag: aa96f882-f477-4e13-86f5-70d43e7adf3c
 ;;; org-ascii.el ends here