changeset 69116:79fc120cc4c1

(org-cleaned-string-for-export, org-solidify-link-text): New function. (org-add-hook): Use `add-local-hook' instead of `make-local-hook' for XEmacs, just to silence the compiler. (org-export-as-ascii, org-export-as-html-and-open): Use `org-cleaned-string-for-export' and create internal links. (org-follow-mhe-link): Require mh-e, use folder.
author Carsten Dominik <dominik@science.uva.nl>
date Thu, 23 Feb 2006 10:54:29 +0000
parents 61a9a1f755ec
children 5ddb96998b75
files lisp/textmodes/org.el
diffstat 1 files changed, 88 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/org.el	Thu Feb 23 10:54:15 2006 +0000
+++ b/lisp/textmodes/org.el	Thu Feb 23 10:54:29 2006 +0000
@@ -5,7 +5,7 @@
 ;; Author: Carsten Dominik <dominik at science dot uva dot nl>
 ;; Keywords: outlines, hypermedia, calendar, wp
 ;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/
-;; Version: 4.05
+;; Version: 4.06
 ;;
 ;; This file is part of GNU Emacs.
 ;;
@@ -81,6 +81,10 @@
 ;;
 ;; Changes since version 4.00:
 ;; ---------------------------
+;; Version 4.06
+;;    - HTML exporter treats targeted internal links.
+;;    - Bug fixes.
+;;
 ;; Version 4.05
 ;;    - Changes to internal link system (thanks to David Wainberg for ideas).
 ;;      - in-file links: [[Search String]] instead of <file:::Search String>
@@ -126,7 +130,7 @@
 
 ;;; Customization variables
 
-(defvar org-version "4.05"
+(defvar org-version "4.06"
   "The version number of the file org.el.")
 (defun org-version ()
   (interactive)
@@ -7211,11 +7215,12 @@
 (defun org-follow-mhe-link (folder article)
   "Follow an MHE link to FOLDER and ARTICLE."
   (setq article (org-add-angle-brackets article))
-;;  (require 'mh-e)
-  (mh-rmail) ;; mh-e is standard with emacs 22
+  (require 'mh-e)
+  (mh-find-path)
   (let* ((show-buf (concat "show-" folder)))
+    (mh-visit-folder folder)
     (get-buffer-create show-buf)
-    (mh-display-msg
+    (mh-show-msg
      (string-to-number
       (car (split-string 
 	    (with-temp-buffer
@@ -7226,8 +7231,7 @@
 	       "--message-id"
 	       article)
 	      (buffer-string))
-	    "\n")))
-     folder)
+	    "\n"))))
     (pop-to-buffer show-buf)))
 
 (defun org-open-file (path &optional in-emacs line search)
@@ -10440,6 +10444,45 @@
 It is supplemented by a number of commonly used TeX macros with appropriate
 translations.  There is currently no way for users to extend this.")
 
+(defun org-cleaned-string-for-export (string)
+  "Cleanup a buffer substring so that links can be created safely."
+  (interactive)
+  (let* ((cb (current-buffer))
+	 (re-radio (concat "\\([^<]\\)\\(" org-target-link-regexp "\\)"))
+	 rtn)
+    (save-excursion
+      (set-buffer (get-buffer-create " org-mode-tmp"))
+      (erase-buffer)
+      (insert string)
+      (org-mode)
+      ;; Find targets in comments and move them out of comments
+      (goto-char (point-min))
+      (while (re-search-forward "^#.*?\\(<<<?[^>\r\n]+>>>?\\).*" nil t)
+	(replace-match "\\1"))
+      ;; Find matches for radio targets and turn them into links
+      (goto-char (point-min))
+      (while (re-search-forward re-radio nil t)
+	(replace-match "\\1[[\\2]]"))
+      ;; Find all links that contain a newline and put them into a single line
+      (goto-char (point-min))
+      (while (re-search-forward "\\(\\[\\[[^]]*?\\)[ \t]*\n[ \t]*\\([^]]*\\]\\]\\)" nil t)
+	(replace-match "\\1 \\2")
+	(goto-char (match-beginning 0)))
+      ;; Remove comments
+      (goto-char (point-min))
+      (while (re-search-forward "^#.*\n?" nil t)
+	(replace-match ""))
+      (setq rtn (buffer-string)))
+    (kill-buffer " org-mode-tmp")
+    rtn))
+
+(defun org-solidify-link-text (s)
+  "Take link text and make a safe target out of it."
+  (save-match-data
+    (mapconcat
+     'identity
+     (org-split-string s "[ \t\r\n]+") "--")))
+
 (defvar org-last-level nil) ; dynamically scoped variable
 
 (defun org-export-as-ascii (arg)
@@ -10454,7 +10497,10 @@
 	   (if (org-region-active-p) (region-beginning) (point-min))
 	   (if (org-region-active-p) (region-end) (point-max))))
 	 (lines (org-export-find-first-heading-line
-		 (org-skip-comments (org-split-string region "[\r\n]"))))
+		 (org-skip-comments
+		  (org-split-string
+		   (org-cleaned-string-for-export region)
+		   "[\r\n]"))))
 	 (org-startup-with-deadline-check nil)
 	 (level 0) line txt
 	 (umax nil)
@@ -10543,6 +10589,14 @@
     (while (setq line (pop lines))
       ;; Remove the quoted HTML tags.
       (setq line (org-html-expand-for-ascii line))
+      ;; Remove targets
+      (while (string-match "<<<?[^<>]*>>>?[ \t]*\n?" line)
+	(setq line (replace-match "" t t line)))
+      ;; Replace internal links
+      (while (string-match org-bracket-link-regexp line)
+	(setq line (replace-match
+		    (if (match-end 3) "[\\3]" "[\\1]")
+		    t nil line)))
       (cond
        ((string-match "^\\(\\*+\\)[ \t]*\\(.*\\)" line)
 	;; a Headline
@@ -10781,7 +10835,9 @@
            (if region-p (region-beginning) (point-min))
            (if region-p (region-end) (point-max))))
          (all_lines
-          (org-skip-comments (org-split-string region "[\r\n]")))
+          (org-skip-comments (org-split-string
+			      (org-cleaned-string-for-export region)
+			      "[\r\n]")))
          (lines (org-export-find-first-heading-line all_lines))
          (level 0) (line "") (origline "") txt todo
          (umax nil)
@@ -10944,7 +11000,26 @@
 	      (insert "</pre>\n"))
 	    (throw 'nextline nil))
 
-	  ;; Protect the links
+
+	  ;; make targets to anchors
+	  (while (string-match "<<<?\\([^<>]*\\)>>>?[ \t]*\n?" line)
+	    (setq line (replace-match
+			(concat "@<a name=\"" 
+				(org-solidify-link-text (match-string 1 line))
+				"\">\\nbsp@</a>")
+			t t line)))
+	  ;; Replace internal links
+	  (while (string-match org-bracket-link-regexp line)
+	    (setq line (replace-match
+			(concat
+			    "@<a href=\"#" 
+			    (org-solidify-link-text (match-string 1 line))
+			    "\">"
+			    (match-string (if (match-end 3) 3 1) line)
+			    "@</a>")
+			t t line)))
+
+	  ;; Protect the external links
 	  (setq start 0)
 	  (while (string-match org-link-maybe-angles-regexp line start)
 	    (setq start (match-end 0))
@@ -12363,8 +12438,9 @@
 
 (defun org-add-hook (hook function &optional append local)
   "Add-hook, compatible with both Emacsen."
-  (if (and local org-xemacs-p) (make-local-hook hook)) ;; Needed for XEmacs
-  (add-hook hook function append local))
+  (if (and local org-xemacs-p)
+      (add-local-hook hook function append)
+    (add-hook hook function append local)))
 
 (defun org-region-active-p ()
   "Is `transient-mark-mode' on and the region active?