# HG changeset patch # User Carsten Dominik # Date 1140692069 0 # Node ID 79fc120cc4c1251bb90a2f989741fe8e5b16bfae # Parent 61a9a1f755ecaafae9ae5f7cf72f3e0c35cac7a9 (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. diff -r 61a9a1f755ec -r 79fc120cc4c1 lisp/textmodes/org.el --- 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 ;; 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 @@ -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 "\n")) (throw 'nextline nil)) - ;; Protect the links + + ;; make targets to anchors + (while (string-match "<<]*\\)>>>?[ \t]*\n?" line) + (setq line (replace-match + (concat "@\\nbsp@") + t t line))) + ;; Replace internal links + (while (string-match org-bracket-link-regexp line) + (setq line (replace-match + (concat + "@" + (match-string (if (match-end 3) 3 1) line) + "@") + 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?