Mercurial > emacs
changeset 65243:d0087dcb8981
(org-special-keyword): New face.
(org-table-copy-down, org-table-eval-formula)
(org-table-recalculate, org-init-section-numbers): Use
`string-to-number' instead of `string-to-int'.
(org-get-location): Use `insert-buffer-substring' instead of
`insert-buffer'.
(org-modify-diary-entry-string): New function.
(org-get-entries-from-diary): Set the hook for
`add-to-diary-list'.
(org-disable-agenda-to-diary): renamed from `org-disable-diary'.
(org-toggle-fixed-width-section): Use QUOTE keyword if there is no
active region.
(org-export-as-html): Handle QUOTE keyword.
(org-quote-string): New option.
(org-bookmark-jump-unhide): New function, used for
`bookmark-after-jump-hook'.
(org-diary-default-entry): Apply only when not called through
`org-agenda'.
author | Carsten Dominik <dominik@science.uva.nl> |
---|---|
date | Tue, 30 Aug 2005 12:06:14 +0000 |
parents | 5ebb62612b85 |
children | 66f0d4d6f32f |
files | lisp/textmodes/org.el |
diffstat | 1 files changed, 298 insertions(+), 222 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/textmodes/org.el Tue Aug 30 11:24:11 2005 +0000 +++ b/lisp/textmodes/org.el Tue Aug 30 12:06:14 2005 +0000 @@ -1,12 +1,11 @@ -;; org.el --- Outline-based notes management and organizer +;;; org.el --- Outline-based notes management and organizer ;; Carstens outline-mode for keeping track of everything. - -;; Copyright (C) 2004, 2005 Free Software Foundation, Inc. +;; Copyright (c) 2004, 2005 Free Software Foundation ;; ;; Author: Carsten Dominik <dominik at science dot uva dot nl> ;; Keywords: outlines, hypermedia, calendar ;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/ -;; Version: 3.14 +;; Version: 3.15 ;; ;; This file is part of GNU Emacs. ;; @@ -81,6 +80,13 @@ ;; ;; Changes: ;; ------- +;; Version 3.15 +;; - QUOTE keyword at the beginning of an entry causes fixed-width export +;; of unmodified entry text. `C-c :' toggles this keyword. +;; - New face `org-special-keyword' which is used for COMMENT, QUOTE, +;; DEADLINE and SCHEDULED, and priority cookies. Default is only a weak +;; color, to reduce the amount of aggressive color in the buffer. +;; ;; Version 3.14 ;; - Formulas for individual fields in table. ;; - Automatic recalculation in calculating tables. @@ -189,7 +195,7 @@ ;;; Customization variables -(defvar org-version "3.14" +(defvar org-version "3.15" "The version number of the file org.el.") (defun org-version () (interactive) @@ -388,6 +394,15 @@ :group 'org-keywords :type 'string) +(defcustom org-quote-string "QUOTE" + "Entries starting with this keyword will be exported in fixed-width font. +Quoting applies only to the text in the entry following the headline, and does +not extend beyond the next headline, even if that is lower level. +An entry can be toggled between QUOTE and normal with +\\[org-toggle-fixed-width-section]" + :group 'org-keywords + :type 'string) + (defcustom org-after-todo-state-change-hook nil "Hook which is run after the state of a TODO item was changed. The new state (a string with a todo keyword, or nil) is available in the @@ -1593,6 +1608,14 @@ "Face used for level 8 headlines." :group 'org-faces) +(defface org-special-keyword ;; font-lock-string-face + '((((type tty) (class color)) (:foreground "green")) + (((class color) (background light)) (:foreground "RosyBrown")) + (((class color) (background dark)) (:foreground "LightSalmon")) + (t (:italic t))) + "Face used for level 8 headlines." + :group 'org-faces) + (defface org-warning ;; font-lock-warning-face '((((type tty) (class color)) (:foreground "red")) (((class color) (background light)) (:foreground "Red" :bold t)) @@ -1919,17 +1942,22 @@ '(org-activate-dates (0 'org-link)) (list (concat "^\\*+[ \t]*" org-not-done-regexp) '(1 'org-warning t)) - (list (concat "\\[#[A-Z]\\]") '(0 'org-warning t)) - (list (concat "\\<" org-deadline-string) '(0 'org-warning t)) - (list (concat "\\<" org-scheduled-string) '(0 'org-warning t)) + (list (concat "\\[#[A-Z]\\]") '(0 'org-special-keyword t)) +; (list (concat "\\<" org-deadline-string) '(0 'org-warning t)) +; (list (concat "\\<" org-scheduled-string) '(0 'org-warning t)) + (list (concat "\\<" org-deadline-string) '(0 'org-special-keyword t)) + (list (concat "\\<" org-scheduled-string) '(0 'org-special-keyword t)) ;; '("\\(\\s-\\|^\\)\\(\\*\\([a-zA-Z]+\\)\\*\\)\\([^a-zA-Z*]\\|$\\)" ;; (3 'bold)) ;; '("\\(\\s-\\|^\\)\\(/\\([a-zA-Z]+\\)/\\)\\([^a-zA-Z*]\\|$\\)" ;; (3 'italic)) ;; '("\\(\\s-\\|^\\)\\(_\\([a-zA-Z]+\\)_\\)\\([^a-zA-Z*]\\|$\\)" ;; (3 'underline)) - (list (concat "^\\*+[ \t]*\\<\\(" org-comment-string "\\)\\>") - '(1 'org-warning t)) +; (list (concat "^\\*+[ \t]*\\<\\(" org-comment-string "\\)\\>") +; '(1 'org-warning t)) + (list (concat "^\\*+[ \t]*\\<\\(" org-comment-string + "\\|" org-quote-string "\\)\\>") + '(1 'org-special-keyword t)) '("^#.*" (0 'font-lock-comment-face t)) (if org-fontify-done-headline (list (concat "^[*]+ +\\<\\(" org-done-string "\\)\\(.*\\)\\>") @@ -2216,7 +2244,7 @@ (shrink-window-if-larger-than-buffer (get-buffer-window "*Help*")) (setq buffer-read-only nil) (erase-buffer) - (insert-buffer buf) + (insert-buffer-substring buf) (let ((org-startup-truncated t) (org-startup-folded t) (org-startup-with-deadline-check nil)) @@ -4013,7 +4041,7 @@ (get-text-property (point) 'org-marker)) (org-agenda-show))) -(defvar org-disable-diary nil) ;Dynamically-scoped param. +(defvar org-disable-agenda-to-diary nil) ;Dynamically-scoped param. (defun org-get-entries-from-diary (date) "Get the (Emacs Calendar) diary entries for DATE." @@ -4021,8 +4049,10 @@ (diary-display-hook '(fancy-diary-display)) (list-diary-entries-hook (cons 'org-diary-default-entry list-diary-entries-hook)) + (diary-file-name-prefix-function nil) ; turn this feature off + (diary-modify-entry-list-string-function 'org-modify-diary-entry-string) entries - (org-disable-diary t)) + (org-disable-agenda-to-diary t)) (save-excursion (save-window-excursion (list-diary-entries date 1))) @@ -4076,35 +4106,43 @@ (if (re-search-forward "^Org-mode dummy\n?" nil t) (replace-match ""))) -;; Advise the add-to-diary-list function to allow org to jump to -;; diary entries. Wrapped into eval-after-load to avoid loading -;; advice unnecessarily +;; Make sure entries from the diary have the right text properties. (eval-after-load "diary-lib" - '(defadvice add-to-diary-list (before org-mark-diary-entry activate) - "Make the position visible." - (if (and org-disable-diary ;; called from org-agenda - (stringp string) - (buffer-file-name)) - (add-text-properties - 0 (length string) - (list 'mouse-face 'highlight - 'keymap org-agenda-keymap - 'help-echo - (format - "mouse-2 or RET jump to diary file %s" - (abbreviate-file-name (buffer-file-name))) - 'org-agenda-diary-link t - 'org-marker (org-agenda-new-marker (point-at-bol))) - string)))) + '(if (boundp 'diary-modify-entry-list-string-function) + ;; We can rely on the hook, nothing to do + nil + ;; Hook not avaiable, must use advice to make this work + (defadvice add-to-diary-list (before org-mark-diary-entry activate) + "Make the position visible." + (if (and org-disable-agenda-to-diary ;; called from org-agenda + (stringp string) + (buffer-file-name)) + (setq string (org-modify-diary-entry-string string)))))) + +(defun org-modify-diary-entry-string (string) + "Add text properties to string, allowing org-mode to act on it." + (add-text-properties + 0 (length string) + (list 'mouse-face 'highlight + 'keymap org-agenda-keymap + 'help-echo + (format + "mouse-2 or RET jump to diary file %s" + (abbreviate-file-name (buffer-file-name))) + 'org-agenda-diary-link t + 'org-marker (org-agenda-new-marker (point-at-bol))) + string) + string) (defun org-diary-default-entry () "Add a dummy entry to the diary. Needed to avoid empty dates which mess up holiday display." ;; Catch the error if dealing with the new add-to-diary-alist - (condition-case nil - (add-to-diary-list original-date "Org-mode dummy" "") - (error - (add-to-diary-list original-date "Org-mode dummy" "" nil)))) + (when org-disable-agenda-to-diary + (condition-case nil + (add-to-diary-list original-date "Org-mode dummy" "") + (error + (add-to-diary-list original-date "Org-mode dummy" "" nil))))) (defun org-add-file (&optional file) "Add current file to the list of files in variable `org-agenda-files'. @@ -4238,11 +4276,12 @@ file rtn results) ;; If this is called during org-agenda, don't return any entries to ;; the calendar. Org Agenda will list these entries itself. - (if org-disable-diary (setq files nil)) + (if org-disable-agenda-to-diary (setq files nil)) (while (setq file (pop files)) (setq rtn (apply 'org-agenda-get-day-entries file date args)) (setq results (append results rtn))) - (concat (org-finalize-agenda-entries results) "\n"))) + (if results + (concat (org-finalize-agenda-entries results) "\n")))) (defun org-agenda-get-day-entries (file date &rest args) "Does the work for `org-diary' and `org-agenda'. @@ -6270,7 +6309,7 @@ (progn (if (and org-table-copy-increment (string-match "^[0-9]+$" txt)) - (setq txt (format "%d" (+ (string-to-int txt) 1)))) + (setq txt (format "%d" (+ (string-to-number txt) 1)))) (insert txt) (org-table-maybe-recalculate-line) (org-table-align)) @@ -6997,9 +7036,9 @@ (t n)))) (defun org-table-get-vertical-vector (desc &optional tbeg col) - "Get a calc vector from a column, according to descriptor DESC. -Optional arguments TBEG and COL can give the beginning of the table -and the current column, to avoid unnecessary parsing." + "Get a calc vector from a column, accorting to desctiptor DESC. +Optional arguments TBEG and COL can give the beginning of the table and +the current column, to avoid unnecessary parsing." (save-excursion (or tbeg (setq tbeg (org-table-begin))) (or col (setq col (org-table-current-column))) @@ -7047,7 +7086,7 @@ l ",") "]")) ((string-match "\\([0-9]+\\)" desc) (beginning-of-line 1) - (when (re-search-backward org-table-dataline-regexp tbeg t + (when (re-search-backward org-table-dataline-regexp tbeg t (string-to-number (match-string 0 desc))) (org-table-goto-column col) (org-trim (org-table-get-field)))))))) @@ -7143,7 +7182,7 @@ ACTION can be `remove', `insert', `swap'. For `swap', two column numbers are expected, for the other action only a single column number is needed." (let ((list (org-table-get-stored-formulas)) - (nmax (length (org-split-string + (nmax (length (org-split-string (buffer-substring (point-at-bol) (point-at-eol)) "|"))) col col1 col2 scol si sc1 sc2) @@ -7222,7 +7261,7 @@ fields (org-split-string (match-string 2) " *| *")) (save-excursion (beginning-of-line (if (equal c "_") 2 0)) - (setq line (org-current-line) col 1) + (setq line (org-current-line) col 1) (and (looking-at "^[ \t]*|[^|]*\\(|.*\\)") (setq fields1 (org-split-string (match-string 1) " *| *")))) (while (and fields1 (setq field (pop fields))) @@ -7440,7 +7479,7 @@ ;; Insert the references to fields in same row (while (string-match "\\$\\([0-9]+\\)?" form) (setq n (if (match-beginning 1) - (string-to-int (match-string 1 form)) + (string-to-number (match-string 1 form)) n0) x (nth (1- n) fields)) (unless x (error "Invalid field specifier \"%s\"" @@ -7539,7 +7578,7 @@ (setq eql eqlnum) (while (setq entry (pop eql)) (goto-line org-last-recalc-line) - (org-table-goto-column (string-to-int (car entry)) nil 'force) + (org-table-goto-column (string-to-number (car entry)) nil 'force) (org-table-eval-formula nil (cdr entry) 'noalign 'nocst 'nostore)))) (goto-line thisline) (org-table-goto-column thiscol) @@ -7622,7 +7661,7 @@ (set (make-local-variable 'org-pos) pos) (set (make-local-variable 'org-window-configuration) wc) (use-local-map org-edit-formulas-map) - (setq s "# Edit formulas and finish with `C-c C-c'. + (setq s "# Edit formulas and finish with `C-c C-c'. # Use `C-u C-c C-c' to also appy them immediately to the entire table. # Use `C-c ?' to get information about $name at point. # To cancel editing, press `C-c C-q'.\n") @@ -7660,7 +7699,7 @@ (switch-to-buffer-other-window (marker-buffer pos)) (goto-char pos) (goto-char (org-table-begin)) - (if (re-search-forward (concat "^[ \t]*| *! *.*?| *\\(" var "\\) *|") + (if (re-search-forward (concat "^[ \t]*| *! *.*?| *\\(" var "\\) *|") (org-table-end) t) (progn (goto-char (match-beginning 1)) @@ -7715,7 +7754,7 @@ (org-table-store-formulas eql) (move-marker pos nil) (kill-buffer "*Edit Formulas*") - (if arg + (if arg (org-table-recalculate 'all) (message "New formulas installed - press C-u C-c C-c to apply.")))) @@ -7801,7 +7840,7 @@ (and c (setq minor-mode-map-alist (cons c (delq c minor-mode-map-alist))))) (set (make-local-variable (quote org-table-may-need-update)) t) - (make-local-hook (quote before-change-functions)) + (make-local-hook (quote before-change-functions)) ; needed for XEmacs (add-hook 'before-change-functions 'org-before-change-function nil 'local) (set (make-local-variable 'org-old-auto-fill-inhibit-regexp) @@ -8620,14 +8659,13 @@ (insert s))) (defun org-toggle-fixed-width-section (arg) - "Toggle the fixed-width indicator at the beginning of lines in the region. -If there is no active region, only acts on the current line. -If the first non-white character in the first line of the region is a -vertical bar \"|\", then the command removes the bar from all lines in -the region. If the first character is not a bar, the command adds a -bar to all lines, in the column given by the beginning of the region. - -If there is a numerical prefix ARG, create ARG new lines starting with \"|\"." + "Toggle the fixed-width export. +If there is no active region, the QUOTE keyword at the current headline is +inserted or removed. When present, it causes the text between this headline +and the next to be exported as fixed-width text, and unmodified. +If there is an active region, this command adds or removes a colon as the +first character of this line. If the first character of a line is a colon, +this line is also exported in fixed-width font." (interactive "P") (let* ((cc 0) (regionp (org-region-active-p)) @@ -8636,23 +8674,33 @@ (nlines (or arg (if (and beg end) (count-lines beg end) 1))) (re "[ \t]*\\(:\\)") off) - (save-excursion - (goto-char beg) - (setq cc (current-column)) - (beginning-of-line 1) - (setq off (looking-at re)) - (while (> nlines 0) - (setq nlines (1- nlines)) - (beginning-of-line 1) - (cond - (arg - (move-to-column cc t) - (insert ":\n") - (forward-line -1)) - ((and off (looking-at re)) - (replace-match "" t t nil 1)) - ((not off) (move-to-column cc t) (insert ":"))) - (forward-line 1))))) + (if regionp + (save-excursion + (goto-char beg) + (setq cc (current-column)) + (beginning-of-line 1) + (setq off (looking-at re)) + (while (> nlines 0) + (setq nlines (1- nlines)) + (beginning-of-line 1) + (cond + (arg + (move-to-column cc t) + (insert ":\n") + (forward-line -1)) + ((and off (looking-at re)) + (replace-match "" t t nil 1)) + ((not off) (move-to-column cc t) (insert ":"))) + (forward-line 1))) + (save-excursion + (org-back-to-heading) + (if (looking-at (concat outline-regexp + "\\( +\\<" org-quote-string "\\>\\)")) + (replace-match "" t t nil 1) + (if (looking-at outline-regexp) + (progn + (goto-char (match-end 0)) + (insert " " org-quote-string)))))))) (defun org-export-as-html-and-open (arg) "Export the outline as HTML and immediately open it with a browser. @@ -8681,28 +8729,30 @@ (setq-default org-deadline-line-regexp org-deadline-line-regexp) (setq-default org-done-string org-done-string) (let* ((region-p (org-region-active-p)) - (region - (buffer-substring - (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]"))) - (lines (org-export-find-first-heading-line all_lines)) - (level 0) (line "") (origline "") txt todo - (umax nil) - (filename (concat (file-name-sans-extension (buffer-file-name)) - ".html")) - (buffer (find-file-noselect filename)) - (levels-open (make-vector org-level-max nil)) - (date (format-time-string "%Y/%m/%d" (current-time))) + (region + (buffer-substring + (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]"))) + (lines (org-export-find-first-heading-line all_lines)) + (level 0) (line "") (origline "") txt todo + (umax nil) + (filename (concat (file-name-sans-extension (buffer-file-name)) + ".html")) + (buffer (find-file-noselect filename)) + (levels-open (make-vector org-level-max nil)) + (date (format-time-string "%Y/%m/%d" (current-time))) (time (format-time-string "%X" (current-time))) - (author user-full-name) + (author user-full-name) (title (buffer-name)) - (options nil) + (options nil) + (quote-re (concat "^\\*+[ \t]*" org-quote-string "\\>")) + (inquote nil) (email user-mail-address) - (language org-export-default-language) + (language org-export-default-language) (text nil) - (lang-words nil) + (lang-words nil) (head-count 0) cnt (start 0) table-open type @@ -8716,22 +8766,22 @@ ;; Search for the export key lines (org-parse-key-lines) (setq lang-words (or (assoc language org-export-language-setup) - (assoc "en" org-export-language-setup))) + (assoc "en" org-export-language-setup))) ;; Switch to the output buffer (if (or hidden (not org-export-html-show-new-buffer)) - (set-buffer buffer) + (set-buffer buffer) (switch-to-buffer-other-window buffer)) (erase-buffer) (fundamental-mode) (let ((case-fold-search nil)) (if options (org-parse-export-options options)) (setq umax (if arg (prefix-numeric-value arg) - org-export-headline-levels)) + org-export-headline-levels)) ;; File header (insert (format - "<html lang=\"%s\"><head> + "<html lang=\"%s\"><head> <title>%s</title> <meta http-equiv=\"Content-Type\" content=\"text/html\"> <meta name=generator content=\"Org-mode\"> @@ -8739,15 +8789,15 @@ <meta name=author content=\"%s\"> </head><body> " - language (org-html-expand title) date time author)) + language (org-html-expand title) date time author)) (if title (insert (concat "<H1 align=\"center\">" (org-html-expand title) "</H1>\n"))) (if author (insert (concat (nth 1 lang-words) ": " author "\n"))) (if email (insert (concat "<a href=\"mailto:" email "\"><" - email "></a>\n"))) + email "></a>\n"))) (if (or author email) (insert "<br>\n")) (if (and date time) (insert (concat (nth 2 lang-words) ": " - date " " time "<br>\n"))) + date " " time "<br>\n"))) (if text (insert (concat "<p>\n" (org-html-expand text)))) (if org-export-with-toc (progn @@ -8802,124 +8852,141 @@ )) (setq head-count 0) (org-init-section-numbers) + (while (setq line (pop lines) origline line) - ;; Protect the links - (setq start 0) - (while (string-match org-link-maybe-angles-regexp line start) - (setq start (match-end 0)) - (setq line (replace-match - (concat "\000" (match-string 1 line) "\000") - t t line))) - - ;; replace "<" and ">" by "<" and ">" - ;; handle @<..> HTML tags (replace "@>..<" by "<..>") - (setq line (org-html-expand line)) - - ;; Verbatim lines - (if (and org-export-with-fixed-width - (string-match "^[ \t]*:\\(.*\\)" line)) + ;; end of quote? + (when (and inquote (string-match "^\\*+" line)) + (insert "</pre>\n") + (setq inquote nil)) + ;; inquote + (if inquote (progn - (let ((l (match-string 1 line))) - (while (string-match " " l) - (setq l (replace-match " " t t l))) - (insert "\n<span style='font-family:Courier'>" - l "</span>" - (if (and lines - (not (string-match "^[ \t]+\\(:.*\\)" - (car lines)))) - "<br>\n" "\n")))) + (insert line "\n") + (setq line (org-html-expand line))) ;;????? FIXME: not needed? + + ;; Protect the links (setq start 0) - (while (string-match org-protected-link-regexp line start) - (setq start (- (match-end 0) 2)) - (setq type (match-string 1 line)) - (cond - ((member type '("http" "https" "ftp" "mailto" "news")) - ;; standard URL - (setq line (replace-match -; "<a href=\"\\1:\\2\"><\\1:\\2></a>" - "<a href=\"\\1:\\2\">\\1:\\2</a>" - nil nil line))) - ((string= type "file") - ;; FILE link - (let* ((filename (match-string 2 line)) - (abs-p (file-name-absolute-p filename)) - (thefile (if abs-p (expand-file-name filename) filename)) - (thefile (save-match-data - (if (string-match ":[0-9]+$" thefile) - (replace-match "" t t thefile) - thefile))) - (file-is-image-p - (save-match-data - (string-match (org-image-file-name-regexp) thefile)))) + (while (string-match org-link-maybe-angles-regexp line start) + (setq start (match-end 0)) + (setq line (replace-match + (concat "\000" (match-string 1 line) "\000") + t t line))) + + ;; replace "<" and ">" by "<" and ">" + ;; handle @<..> HTML tags (replace "@>..<" by "<..>") + (setq line (org-html-expand line)) + + ;; Verbatim lines + (if (and org-export-with-fixed-width + (string-match "^[ \t]*:\\(.*\\)" line)) + (progn + (let ((l (match-string 1 line))) + (while (string-match " " l) + (setq l (replace-match " " t t l))) + (insert "\n<span style='font-family:Courier'>" + l "</span>" + (if (and lines + (not (string-match "^[ \t]+\\(:.*\\)" + (car lines)))) + "<br>\n" "\n")))) + + (setq start 0) + (while (string-match org-protected-link-regexp line start) + (setq start (- (match-end 0) 2)) + (setq type (match-string 1 line)) + (cond + ((member type '("http" "https" "ftp" "mailto" "news")) + ;; standard URL (setq line (replace-match - (if (and org-export-html-inline-images - file-is-image-p) - (concat "<img src=\"" thefile "\"/>") - (concat "<a href=\"" thefile "\">\\1:\\2</a>")) - nil nil line)))) - - ((member type '("bbdb" "vm" "wl" "rmail" "gnus" "shell")) - (setq line (replace-match - "<i><\\1:\\2></i>" nil nil line))))) - - ;; TODO items - (if (and (string-match org-todo-line-regexp line) - (match-beginning 2)) - (if (equal (match-string 2 line) org-done-string) + ; "<a href=\"\\1:\\2\"><\\1:\\2></a>" + "<a href=\"\\1:\\2\">\\1:\\2</a>" + nil nil line))) + ((string= type "file") + ;; FILE link + (let* ((filename (match-string 2 line)) + (abs-p (file-name-absolute-p filename)) + (thefile (if abs-p (expand-file-name filename) filename)) + (thefile (save-match-data + (if (string-match ":[0-9]+$" thefile) + (replace-match "" t t thefile) + thefile))) + (file-is-image-p + (save-match-data + (string-match (org-image-file-name-regexp) thefile)))) (setq line (replace-match - "<span style='color:green'>\\2</span>" - nil nil line 2)) - (setq line (replace-match "<span style='color:red'>\\2</span>" - nil nil line 2)))) - - ;; DEADLINES - (if (string-match org-deadline-line-regexp line) - (progn - (if (save-match-data - (string-match "<a href" - (substring line 0 (match-beginning 0)))) - nil ; Don't do the replacement - it is inside a link - (setq line (replace-match "<span style='color:red'>\\&</span>" - nil nil line 1))))) - - (cond - ((string-match "^\\(\\*+\\)[ \t]*\\(.*\\)" line) - ;; This is a headline - (setq level (- (match-end 1) (match-beginning 1)) - txt (match-string 2 line)) - (if (<= level umax) (setq head-count (+ head-count 1))) - (org-html-level-start level txt umax - (and org-export-with-toc (<= level umax)) - head-count)) - - ((and org-export-with-tables - (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" line)) - (if (not table-open) - ;; New table starts - (setq table-open t table-buffer nil table-orig-buffer nil)) - ;; Accumulate lines - (setq table-buffer (cons line table-buffer) - table-orig-buffer (cons origline table-orig-buffer)) - (when (or (not lines) - (not (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" - (car lines)))) - (setq table-open nil - table-buffer (nreverse table-buffer) - table-orig-buffer (nreverse table-orig-buffer)) - (insert (org-format-table-html table-buffer table-orig-buffer)))) - (t - ;; Normal lines - ;; Lines starting with "-", and empty lines make new paragraph. - ;; FIXME: Should we add + and *? - (if (string-match "^ *-\\|^[ \t]*$" line) (insert "<p>")) - (insert line (if org-export-preserve-breaks "<br>\n" "\n")))) - )) - (if org-export-html-with-timestamp - (insert org-export-html-html-helper-timestamp)) - (insert "</body>\n</html>\n") - (normal-mode) - (save-buffer) - (goto-char (point-min))))) + (if (and org-export-html-inline-images + file-is-image-p) + (concat "<img src=\"" thefile "\"/>") + (concat "<a href=\"" thefile "\">\\1:\\2</a>")) + nil nil line)))) + + ((member type '("bbdb" "vm" "wl" "rmail" "gnus" "shell")) + (setq line (replace-match + "<i><\\1:\\2></i>" nil nil line))))) + + ;; TODO items + (if (and (string-match org-todo-line-regexp line) + (match-beginning 2)) + (if (equal (match-string 2 line) org-done-string) + (setq line (replace-match + "<span style='color:green'>\\2</span>" + nil nil line 2)) + (setq line (replace-match "<span style='color:red'>\\2</span>" + nil nil line 2)))) + + ;; DEADLINES + (if (string-match org-deadline-line-regexp line) + (progn + (if (save-match-data + (string-match "<a href" + (substring line 0 (match-beginning 0)))) + nil ; Don't do the replacement - it is inside a link + (setq line (replace-match "<span style='color:red'>\\&</span>" + nil nil line 1))))) + + + (cond + ((string-match "^\\(\\*+\\)[ \t]*\\(.*\\)" line) + ;; This is a headline + (setq level (- (match-end 1) (match-beginning 1)) + txt (match-string 2 line)) + (if (<= level umax) (setq head-count (+ head-count 1))) + (org-html-level-start level txt umax + (and org-export-with-toc (<= level umax)) + head-count) + ;; QUOTES + (when (string-match quote-re line) + (insert "<pre>") + (setq inquote t))) + + ((and org-export-with-tables + (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" line)) + (if (not table-open) + ;; New table starts + (setq table-open t table-buffer nil table-orig-buffer nil)) + ;; Accumulate lines + (setq table-buffer (cons line table-buffer) + table-orig-buffer (cons origline table-orig-buffer)) + (when (or (not lines) + (not (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" + (car lines)))) + (setq table-open nil + table-buffer (nreverse table-buffer) + table-orig-buffer (nreverse table-orig-buffer)) + (insert (org-format-table-html table-buffer table-orig-buffer)))) + (t + ;; Normal lines + ;; Lines starting with "-", and empty lines make new paragraph. + ;; FIXME: Should we add + and *? + (if (string-match "^ *-\\|^[ \t]*$" line) (insert "<p>")) + (insert line (if org-export-preserve-breaks "<br>\n" "\n")))) + ))) + (if org-export-html-with-timestamp + (insert org-export-html-html-helper-timestamp)) + (insert "</body>\n</html>\n") + (normal-mode) + (save-buffer) + (goto-char (point-min))))) (defun org-format-table-html (lines olines) "Find out which HTML converter to use and return the HTML code." @@ -9229,7 +9296,7 @@ (if (string-match "\\`[A-Z]\\'" number-string) (aset org-section-numbers i (- (string-to-char number-string) ?A -1)) - (aset org-section-numbers i (string-to-int number-string))) + (aset org-section-numbers i (string-to-number number-string))) (pop numbers)) (setq i (1- i))))) @@ -9998,14 +10065,23 @@ "\\):[ \t]*" (if org-noutline-p "\\(.+\\)" "\\([^\n\r]+\\)"))) -;; Advise the bookmark-jump function to make jump position visible -;; Wrapped into eval-after-load to avoid loading advice unnecessarily +;; Make `bookmark-jump' show the jump location if it was hidden. (eval-after-load "bookmark" - '(defadvice bookmark-jump (after org-make-visible activate) - "Make the position visible." - (and (eq major-mode 'org-mode) - (org-invisible-p) - (org-show-hierarchy-above)))) + '(if (boundp 'bookmark-after-jump-hook) + ;; We can use the hook + (add-hook 'bookmark-after-jump-hook 'org-bookmark-jump-unhide) + ;; Hook not available, use advice + (defadvice bookmark-jump (after org-make-visible activate) + "Make the position visible." + (org-bookmark-jump-unhide)))) + +(defun org-bookmark-jump-unhide () + "Unhide the current position, to show the bookmark location." + (and (eq major-mode 'org-mode) + (or (org-invisible-p) + (save-excursion (goto-char (max (point-min) (1- (point)))) + (org-invisible-p))) + (org-show-hierarchy-above))) ;;; Finish up