[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/textmodes/org.el
From: |
Carsten Dominik |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/textmodes/org.el |
Date: |
Fri, 18 Nov 2005 11:08:29 -0500 |
Index: emacs/lisp/textmodes/org.el
diff -c emacs/lisp/textmodes/org.el:1.46 emacs/lisp/textmodes/org.el:1.47
*** emacs/lisp/textmodes/org.el:1.46 Mon Nov 7 10:57:10 2005
--- emacs/lisp/textmodes/org.el Fri Nov 18 16:08:29 2005
***************
*** 1,11 ****
! ;;; org.el --- Outline-based notes management and organizer
;; Carstens outline-mode for keeping track of everything.
;; 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.19
;;
;; This file is part of GNU Emacs.
;;
--- 1,11 ----
! ;;; org.el --- Outline-based notes management and organize
;; Carstens outline-mode for keeping track of everything.
;; 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.20
;;
;; This file is part of GNU Emacs.
;;
***************
*** 80,85 ****
--- 80,99 ----
;;
;; Changes:
;; -------
+ ;; Version 3.20
+ ;; - There is finally an option to make TAB jump over horizontal lines
+ ;; in tables instead of creating a new line before that line.
+ ;; The option is `org-table-tab-jumps-over-hlines', default nil.
+ ;; - New command for sorting tables, on `C-c ^'.
+ ;; - Changes to the HTML exporter
+ ;; - hand-formatted lists are exported correctly, similar to
+ ;; markdown lists. Nested lists are possible. See the docstring
+ ;; of the variable `org-export-local-list-max-depth'.
+ ;; - cleaned up to produce valid HTML 4.0 (transitional).
+ ;; - support for cascading style sheets.
+ ;; - New command to cycle through all agenda files, on C-,
+ ;; - C-c [ can now also be used to change the sequence of agenda files.
+ ;;
;; Version 3.19
;; - Bug fixes
;;
***************
*** 220,226 ****
;;; Customization variables
! (defvar org-version "3.19"
"The version number of the file org.el.")
(defun org-version ()
(interactive)
--- 234,240 ----
;;; Customization variables
! (defvar org-version "3.20"
"The version number of the file org.el.")
(defun org-version ()
(interactive)
***************
*** 530,536 ****
(defcustom org-agenda-files nil
"A list of org files for agenda/diary display.
! Entries are added to this list with \\[org-add-file] and removed with
\\[org-remove-file]. You can also use customize to edit the list."
:group 'org-agenda
:type '(repeat file))
--- 544,550 ----
(defcustom org-agenda-files nil
"A list of org files for agenda/diary display.
! Entries are added to this list with \\[org-agenda-file-to-front] and removed
with
\\[org-remove-file]. You can also use customize to edit the list."
:group 'org-agenda
:type '(repeat file))
***************
*** 1128,1133 ****
--- 1142,1158 ----
(const :tag "on" t)
(const :tag "on, optimized" optimized)))
+ ;; FIXME: We could have a third option which makes it jump onle over the first
+ ;; hline in a table.
+ (defcustom org-table-tab-jumps-over-hlines t
+ "Non-nil means, tab in the last column of a table with jump over a hline.
+ If a horizontal separator line is following the current line,
+ `org-table-next-field' can either create a new row before that line, or jump
+ over the line. When this option is nil, a new line will be created before
+ this line."
+ :group 'org-table
+ :type 'boolean)
+
(defcustom org-table-auto-blank-field t
"Non-nil means, automatically blank table field when starting to type into
it.
This only happens when typing immediately after a field motion
***************
*** 1313,1319 ****
(defcustom org-export-default-language "en"
"The default language of HTML export, as a string.
! This should have an association in `org-export-language-setup'"
:group 'org-export
:type 'string)
--- 1338,1365 ----
(defcustom org-export-default-language "en"
"The default language of HTML export, as a string.
! This should have an association in `org-export-language-setup'."
! :group 'org-export
! :type 'string)
!
! (defcustom org-export-html-style ""
! "The default style specification for exported HTML files.
! Since there are different ways of setting style information, this variable
! needs to contain the full HTML structure to provide a style, including the
! surrounding HTML tags. For example, legal values would be
!
! <style type=\"text/css\">
! p {font-weight: normal; color: gray; }
! h1 {color: black; }
! </style>
!
! or
!
! <link rel=\"stylesheet\" type=\"text/css\" href=\"mystyles.css\">
!
! As the value of this option simply gets inserted into the HTML <head> header,
! you can \"misuse\" it to add arbitrary text to the header.
! "
:group 'org-export
:type 'string)
***************
*** 1347,1352 ****
--- 1393,1422 ----
:group 'org-export
:type 'boolean)
+ (defcustom org-export-local-list-max-depth 1
+ "Maximum depth of hand-formatted lists in HTML export.
+ Org-mode parses hand-formatted enumeration and bullet lists and
+ transforms them to HTML open export. Different indentation of the bullet
+ or number indicates different list nesting levels. To avoid confusion,
+ only a single level is allowed by default. This means that a list is started
+ with an item, and that all further items are consitered as long as the
+ indentation is larger or equal to the indentation of the first item. When
this
+ is larger than 1, deeper indentation leads to deeper list nesting.
+ If you are careful with hand formatting, you can increase this limit and
+ get lists of arbitrary depth. For example, by setting this option to 3, the
+ following list would look correct in HTML:
+
+ * Fruit
+ - Apple
+ - Banana
+ 1. from Africa
+ 2. from South America
+ - Pineapple
+ * Bread
+ * Dairy products"
+ :group 'org-export
+ :type 'integer)
+
(defcustom org-export-preserve-breaks nil
"Non-nil means, preserve all line breaks when exporting.
Normally, in HTML output paragraphs will be reformatted. In ASCII
***************
*** 1874,1892 ****
(make-local-hook 'before-change-functions) ;; needed for XEmacs
(add-hook 'before-change-functions 'org-before-change-function nil
'local)
! ;; Paragraph regular expressions
! (set (make-local-variable 'paragraph-separate) "\f\\|[
]*$\\|\\([*\f]+\\)")
! (set (make-local-variable 'paragraph-start) "\f\\|[
]*$\\|\\([*\f]+\\)")
! ;; Inhibit auto-fill for headers, tables and fixed-width lines.
! (set (make-local-variable 'auto-fill-inhibit-regexp)
! (concat "\\*\\|#"
! (if (or org-enable-table-editor org-enable-fixed-width-editor)
! (concat
! "\\|[ \t]*["
! (if org-enable-table-editor "|" "")
! (if org-enable-fixed-width-editor ":" "")
! "]"))))
! (set (make-local-variable 'fill-paragraph-function) 'org-fill-paragraph)
;; Settings for Calc embedded mode
(set (make-local-variable 'calc-embedded-open-formula) "|\\|\n")
(set (make-local-variable 'calc-embedded-close-formula) "|\\|\n")
--- 1944,1951 ----
(make-local-hook 'before-change-functions) ;; needed for XEmacs
(add-hook 'before-change-functions 'org-before-change-function nil
'local)
! ;; Paragraphs and auto-filling
! (org-set-autofill-regexps)
;; Settings for Calc embedded mode
(set (make-local-variable 'calc-embedded-open-formula) "|\\|\n")
(set (make-local-variable 'calc-embedded-close-formula) "|\\|\n")
***************
*** 1918,1929 ****
(let ((this-command 'org-cycle) (last-command 'org-cycle))
(org-cycle '(4)) (org-cycle '(4))))))))
- (defun org-fill-paragraph (&optional justify)
- "Re-align a table, pass through to fill-paragraph if no table."
- (save-excursion
- (beginning-of-line 1)
- (looking-at "\\s-*\\(|\\|\\+-+\\)")))
-
(defsubst org-current-line (&optional pos)
(+ (if (bolp) 1 0) (count-lines (point-min) (or pos (point)))))
--- 1977,1982 ----
***************
*** 4230,4263 ****
(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'.
! These are the files which are being checked for agenda entries.
! Optional argument FILE means, use this file instead of the current.
! It is possible (but not recommended) to add this function to the
! `org-mode-hook'."
! (interactive)
! (catch 'exit
! (let* ((file (or file (buffer-file-name)
! (if (interactive-p)
! (error "Buffer is not visiting a file")
! (throw 'exit nil))))
! (true-file (file-truename file))
! (afile (abbreviate-file-name file))
! (present (delq nil (mapcar
! (lambda (x)
! (equal true-file (file-truename x)))
! org-agenda-files))))
! (if (not present)
! (progn
! (setq org-agenda-files
! (cons afile org-agenda-files))
! ;; Make sure custom.el does not end up with Org-mode
! (let ((org-mode-hook nil) (default-major-mode 'fundamental-mode))
! (customize-save-variable 'org-agenda-files org-agenda-files))
! (org-install-agenda-files-menu)
! (message "Added file: %s" afile))
! (message "File was already in list: %s" afile)))))
(defun org-remove-file (&optional file)
"Remove current file from the list of files in variable `org-agenda-files'.
--- 4283,4335 ----
(error
(add-to-diary-list original-date "Org-mode dummy" "" nil)))))
! (defun org-cycle-agenda-files ()
! "Cycle through the files in `org-agenda-files'.
! If the current buffer visits an agenda file, find the next one in the list.
! If the current buffer does not, find the first agenda file."
! (interactive)
! (let ((files (append org-agenda-files (list (car org-agenda-files))))
! (tcf (if (buffer-file-name) (file-truename (buffer-file-name))))
! file)
! (unless files (error "No agenda files"))
! (catch 'exit
! (while (setq file (pop files))
! (if (equal (file-truename file) tcf)
! (when (car files)
! (find-file (car files))
! (throw 'exit t))))
! (find-file (car org-agenda-files)))))
!
! (defun org-agenda-file-to-end (&optional file)
! "Move/add the current file to the end of the agenda fiole list.
! I the file is not present in the list, it is appended ot the list. If it is
! present, it is moved there."
! (interactive)
! (org-agenda-file-to-front 'to-end file))
!
! (defun org-agenda-file-to-front (&optional to-end file)
! "Move/add the current file to the top of the agenda file list.
! If the file is not present in the list, it is added to the front. If it is
! present, it is moved there. With optional argument TO-END, add/move to the
! end of the list."
! (interactive "P")
! (let ((file-alist (mapcar (lambda (x)
! (cons (file-truename x) x))
! org-agenda-files))
! (ctf (file-truename (buffer-file-name)))
! x had)
! (setq x (assoc ctf file-alist) had x)
!
! (if (not x) (setq x (cons ctf (abbreviate-file-name (buffer-file-name)))))
! (if to-end
! (setq file-alist (append (delq x file-alist) (list x)))
! (setq file-alist (cons x (delq x file-alist))))
! (setq org-agenda-files (mapcar 'cdr file-alist))
! (let ((org-mode-hook nil) (default-major-mode 'fundamental-mode))
! (customize-save-variable 'org-agenda-files org-agenda-files))
! (org-install-agenda-files-menu)
! (message "File %s to %s of agenda file list"
! (if had "moved" "added") (if to-end "end" "front"))))
(defun org-remove-file (&optional file)
"Remove current file from the list of files in variable `org-agenda-files'.
***************
*** 6300,6306 ****
(goto-char pos))))))
(defun org-table-next-field ()
! "Go to the next field in the current table.
Before doing so, re-align the table if necessary."
(interactive)
(org-table-maybe-eval-formula)
--- 6372,6378 ----
(goto-char pos))))))
(defun org-table-next-field ()
! "Go to the next field in the current table, creating new lines as needed.
Before doing so, re-align the table if necessary."
(interactive)
(org-table-maybe-eval-formula)
***************
*** 6308,6327 ****
(if (and org-table-automatic-realign
org-table-may-need-update)
(org-table-align))
! (if (org-at-table-hline-p)
! (end-of-line 1))
! (condition-case nil
! (progn
! (re-search-forward "|" (org-table-end))
! (if (looking-at "[ \t]*$")
! (re-search-forward "|" (org-table-end)))
! (if (looking-at "-")
! (progn
! (beginning-of-line 0)
! (org-table-insert-row 'below))
! (if (looking-at " ") (forward-char 1))))
! (error
! (org-table-insert-row 'below))))
(defun org-table-previous-field ()
"Go to the previous field in the table.
--- 6380,6404 ----
(if (and org-table-automatic-realign
org-table-may-need-update)
(org-table-align))
! (let ((end (org-table-end)))
! (if (org-at-table-hline-p)
! (end-of-line 1))
! (condition-case nil
! (progn
! (re-search-forward "|" end)
! (if (looking-at "[ \t]*$")
! (re-search-forward "|" end))
! (if (and (looking-at "-")
! org-table-tab-jumps-over-hlines
! (re-search-forward "^[ \t]*|\\([^-]\\)" end t))
! (goto-char (match-beginning 1)))
! (if (looking-at "-")
! (progn
! (beginning-of-line 0)
! (org-table-insert-row 'below))
! (if (looking-at " ") (forward-char 1))))
! (error
! (org-table-insert-row 'below)))))
(defun org-table-previous-field ()
"Go to the previous field in the table.
***************
*** 6472,6477 ****
--- 6549,6555 ----
of the field.
If there are less than N fields, just go to after the last delimiter.
However, when FORCE is non-nil, create new columns if necessary."
+ (interactive "p")
(let ((pos (point-at-eol)))
(beginning-of-line 1)
(when (> n 0)
***************
*** 6490,6496 ****
(defun org-at-table-p (&optional table-type)
"Return t if the cursor is inside an org-type table.
! If TABLE-TYPE is non-nil, also chack for table.el-type tables."
(if org-enable-table-editor
(save-excursion
(beginning-of-line 1)
--- 6568,6574 ----
(defun org-at-table-p (&optional table-type)
"Return t if the cursor is inside an org-type table.
! If TABLE-TYPE is non-nil, also check for table.el-type tables."
(if org-enable-table-editor
(save-excursion
(beginning-of-line 1)
***************
*** 6498,6503 ****
--- 6576,6588 ----
org-table-line-regexp)))
nil))
+ (defun org-at-table.el-p ()
+ "Return t if and only if we are at a table.el table."
+ (and (org-at-table-p 'any)
+ (save-excursion
+ (goto-char (org-table-begin 'any))
+ (looking-at org-table1-hline-regexp))))
+
(defun org-table-recognize-table.el ()
"If there is a table.el table nearby, recognize it and move into it."
(if org-table-tab-recognizes-table.el
***************
*** 6524,6538 ****
nil)
nil))
- (defun org-at-table.el-p ()
- "Return t if the cursor is inside a table.el-type table."
- (save-excursion
- (if (org-at-table-p 'any)
- (progn
- (goto-char (org-table-begin 'any))
- (looking-at org-table1-hline-regexp))
- nil)))
-
(defun org-at-table-hline-p ()
"Return t if the cursor is inside a hline in a table."
(if org-enable-table-editor
--- 6609,6614 ----
***************
*** 6745,6750 ****
--- 6821,6869 ----
(if (not (org-at-table-p)) (beginning-of-line 0))
(move-to-column col)))
+ (defun org-table-sort-lines (beg end numericp)
+ "Sort table lines in region.
+ Point and mark define the first and last line to include. Both point and
+ mark should be in the column that is used for sorting. For example, to
+ sort according to column 3, put the mark in the first line to sort, in
+ table column 3. Put point into the last line to be included in the sorting,
+ also in table column 3. The command will prompt for the sorting method (n for
+ numerical, a for alphanumeric)."
+ (interactive "r\nsSorting method: [n]=numeric [a]=alpha: ")
+ (setq numericp (string-match "[nN]" numericp))
+ (org-table-align) ;; Just to be safe
+ (let* (bcol ecol cmp column lns)
+ (goto-char beg)
+ (org-table-check-inside-data-field)
+ (setq column (org-table-current-column)
+ beg (move-marker (make-marker) (point-at-bol)))
+ (goto-char end)
+ (org-table-check-inside-data-field)
+ (setq end (move-marker (make-marker) (1+ (point-at-eol))))
+ (untabify beg end)
+ (goto-char beg)
+ (org-table-goto-column column)
+ (skip-chars-backward "^|")
+ (setq bcol (current-column))
+ (org-table-goto-column (1+ column))
+ (skip-chars-backward "^|")
+ (setq ecol (1- (current-column)))
+ (setq cmp (if numericp
+ (lambda (a b) (< (car a) (car b)))
+ (lambda (a b) (string< (car a) (car b)))))
+ (setq lns (mapcar (lambda(x) (cons (org-trim (substring x bcol ecol)) x))
+ (split-string (buffer-substring beg end) "\n")))
+ (if numericp
+ (setq lns (mapcar (lambda(x)
+ (cons (string-to-number (car x)) (cdr x)))
+ lns)))
+ (delete-region beg end)
+ (move-marker beg nil)
+ (move-marker end nil)
+ (insert (mapconcat 'cdr (setq lns (sort lns cmp)) "\n") "\n")
+ (message "%d lines sorted %s based on column %d"
+ (length lns)
+ (if numericp "numerically" "alphabetically") column)))
(defun org-table-cut-region (beg end)
"Copy region in table to the clipboard and blank all relevant fields."
***************
*** 8013,8018 ****
--- 8132,8138 ----
'("\C-c=" org-table-eval-formula)
'("\C-c'" org-table-edit-formulas)
'("\C-c*" org-table-recalculate)
+ '("\C-c^" org-table-sort-lines)
'([(control ?#)] org-table-rotate-recalc-marks)))
elt key fun cmd)
(while (setq elt (pop bindings))
***************
*** 8063,8068 ****
--- 8183,8189 ----
["Move Row Down" org-metadown :active (org-at-table-p) :keys
"M-<down>"]
["Delete Row" org-shiftmetaup :active (org-at-table-p) :keys
"M-S-<up>"]
["Insert Row" org-shiftmetadown :active (org-at-table-p) :keys
"M-S-<down>"]
+ ["Sort lines in region" org-table-sort-lines (org-at-table-p) :keys
"C-c ^"]
"--"
["Insert Hline" org-table-insert-hline :active (org-at-table-p) :keys
"C-c -"])
("Rectangle"
***************
*** 8838,8844 ****
(setq-default org-todo-line-regexp org-todo-line-regexp)
(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))
--- 8959,8966 ----
(setq-default org-todo-line-regexp org-todo-line-regexp)
(setq-default org-deadline-line-regexp org-deadline-line-regexp)
(setq-default org-done-string org-done-string)
! (let* ((style org-export-html-style)
! (region-p (org-region-active-p))
(region
(buffer-substring
(if region-p (region-beginning) (point-min))
***************
*** 8859,8864 ****
--- 8981,8990 ----
(options nil)
(quote-re (concat "^\\*+[ \t]*" org-quote-string "\\>"))
(inquote nil)
+ (infixed nil)
+ (in-local-list nil)
+ (local-list-num nil)
+ (local-list-indent nil)
(email user-mail-address)
(language org-export-default-language)
(text nil)
***************
*** 8875,8880 ****
--- 9001,9007 ----
(coding-system-get coding-system 'mime-charset)))
table-open type
table-buffer table-orig-buffer
+ ind start-is-num starter
)
(message "Exporting...")
***************
*** 8899,8914 ****
;; File header
(insert (format
! "<html lang=\"%s\"><head>
<title>%s</title>
<meta http-equiv=\"Content-Type\" content=\"text/html;charset=%s\">
<meta name=generator content=\"Org-mode\">
<meta name=generated content=\"%s %s\">
<meta name=author content=\"%s\">
</head><body>
"
language (org-html-expand title) (or charset "iso-8859-1")
! 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")))
--- 9026,9044 ----
;; File header
(insert (format
! "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0
Transitional//EN\"
! \"http://www.w3.org/TR/REC-html40/loose.dtd\">
! <html lang=\"%s\"><head>
<title>%s</title>
<meta http-equiv=\"Content-Type\" content=\"text/html;charset=%s\">
<meta name=generator content=\"Org-mode\">
<meta name=generated content=\"%s %s\">
<meta name=author content=\"%s\">
+ %s
</head><body>
"
language (org-html-expand title) (or charset "iso-8859-1")
! date time author style))
(if title (insert (concat "<H1 align=\"center\">"
(org-html-expand title) "</H1>\n")))
(if author (insert (concat (nth 1 lang-words) ": " author "\n")))
***************
*** 8959,8966 ****
(insert
(format
(if todo
! "<li><a href=\"#sec-%d\"><span
style='color:red'>%s</span></a></li>\n"
! "<li><a href=\"#sec-%d\">%s</a></li>\n")
head-count txt))
(setq org-last-level level))
))))
--- 9089,9096 ----
(insert
(format
(if todo
! "<li><a href=\"#sec-%d\"><span
style='color:red'>%s</span></a>\n"
! "<li><a href=\"#sec-%d\">%s</a>\n")
head-count txt))
(setq org-last-level level))
))))
***************
*** 8973,8987 ****
(org-init-section-numbers)
(while (setq line (pop lines) origline line)
! ;; end of quote?
! (when (and inquote (string-match "^\\*+" line))
! (insert "</pre>\n")
! (setq inquote nil))
! ;; inquote
! (if inquote
! (progn
! (insert line "\n")
! (setq line (org-html-expand line))) ;;????? FIXME: not needed?
;; Protect the links
(setq start 0)
--- 9103,9132 ----
(org-init-section-numbers)
(while (setq line (pop lines) origline line)
! (catch 'nextline
!
! ;; end of quote section?
! (when (and inquote (string-match "^\\*+" line))
! (insert "</pre>\n")
! (setq inquote nil))
! ;; inside a quote section?
! (when inquote
! (insert (org-html-protect line) "\n")
! (throw 'nextline nil))
!
! ;; verbatim lines
! (when (and org-export-with-fixed-width
! (string-match "^[ \t]*:\\(.*\\)" line))
! (when (not infixed)
! (setq infixed t)
! (insert "<pre>\n"))
! (insert (org-html-protect (match-string 1 line)) "\n")
! (when (and lines
! (not (string-match "^[ \t]+\\(:.*\\)"
! (car lines))))
! (setq infixed nil)
! (insert "</pre>\n"))
! (throw 'nextline nil))
;; Protect the links
(setq start 0)
***************
*** 8991,9111 ****
(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
; "<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
! (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."
--- 9136,9280 ----
(concat "\000" (match-string 1 line) "\000")
t t line)))
! ;; replace "&" by "&", "<" and ">" by "<" and ">"
;; handle @<..> HTML tags (replace "@>..<" by "<..>")
(setq line (org-html-expand line))
! ;; Format 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))))
(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)
! (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)))
+ (when in-local-list
+ ;; Close any local lists before inserting a new header line
+ (while local-list-num
+ (insert (if (car local-list-num) "</ol>\n" "</ul>"))
+ (pop local-list-num))
+ (setq local-list-indent nil
+ in-local-list nil))
+ (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
+ (when (and (> org-export-local-list-max-depth 0)
+ (string-match
+ "^\\( *\\)\\(\\([-+*]\\)\\|\\([0-9]+\\.\\)\\)? *\\([^
\t\n\r]\\)"
+ line))
+ (setq ind (- (match-end 1) (match-beginning 1))
+ start-is-num (match-beginning 4)
+ starter (if (match-beginning 2) (match-string 2 line)))
+ (while (and in-local-list
+ (or (and (= ind (car local-list-indent))
+ (not starter))
+ (< ind (car local-list-indent))))
+ (insert (if (car local-list-num) "</ol>\n" "</ul>"))
+ (pop local-list-num) (pop local-list-indent)
+ (setq in-local-list local-list-indent))
! (cond
! ((and starter
! (or (not in-local-list)
! (> ind (car local-list-indent)))
! (< (length local-list-indent)
! org-export-local-list-max-depth))
! ;; Start new (level of ) list
! (insert (if start-is-num "<ol>\n<li>\n" "<ul>\n<li>\n"))
! (push start-is-num local-list-num)
! (push ind local-list-indent)
! (setq in-local-list t))
! (starter
! ;; continue current list
! (insert "<li>\n")))
! (setq line (substring line (match-beginning 5))))
! ;; Empty lines start a new paragraph. If hand-formatted lists
! ;; are not fully interpreted, lines starting with "-", "+", "*"
! ;; also start a new paragraph.
! (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."
***************
*** 9235,9252 ****
(set-buffer " org-tmp2 ")
(buffer-substring (point-min) (point-max))))
(defun org-html-expand (string)
"Prepare STRING for HTML export. Applies all active conversions."
;; First check if there is a link in the line - if yes, apply conversions
;; only before the start of the link.
(let* ((m (string-match org-link-regexp string))
(s (if m (substring string 0 m) string))
(r (if m (substring string m) "")))
! ;; convert < to < and > to >
! (while (string-match "<" s)
! (setq s (replace-match "<" t t s)))
! (while (string-match ">" s)
! (setq s (replace-match ">" t t s)))
(if org-export-html-expand
(while (string-match "@<\\([^&]*\\)>" s)
(setq s (replace-match "<\\1>" nil nil s))))
--- 9404,9431 ----
(set-buffer " org-tmp2 ")
(buffer-substring (point-min) (point-max))))
+ (defun org-html-protect (s)
+ ;; convert & to &, < to < and > to >
+ (let ((start 0))
+ (while (string-match "&" s start)
+ (setq s (replace-match "&" t t s)
+ start (1+ (match-beginning 0))))
+ (while (string-match "<" s)
+ (setq s (replace-match "<" t t s)))
+ (while (string-match ">" s)
+ (setq s (replace-match ">" t t s))))
+ s)
+
(defun org-html-expand (string)
"Prepare STRING for HTML export. Applies all active conversions."
;; First check if there is a link in the line - if yes, apply conversions
;; only before the start of the link.
+ ;; FIXME: This is no longer correct, because links now have an end.
(let* ((m (string-match org-link-regexp string))
(s (if m (substring string 0 m) string))
(r (if m (substring string m) "")))
! ;; convert & to &, < to < and > to >
! (setq s (org-html-protect s))
(if org-export-html-expand
(while (string-match "@<\\([^&]*\\)>" s)
(setq s (replace-match "<\\1>" nil nil s))))
***************
*** 9446,9454 ****
string))
-
-
-
(defun org-export-icalendar-this-file ()
"Export current file as an iCalendar file.
The iCalendar file will be located in the same directory as the Org-mode
--- 9625,9630 ----
***************
*** 9496,9502 ****
(let ((standard-output ical-buffer))
(if combine
(and (not started) (setq started t)
! (org-start-icalendar-file "OrgMode"))
(org-start-icalendar-file category))
(org-print-icalendar-entries combine category)
(when (or (and combine (not files)) (not combine))
--- 9672,9678 ----
(let ((standard-output ical-buffer))
(if combine
(and (not started) (setq started t)
! (org-start-icalendar-file org-icalendar-combined-name))
(org-start-icalendar-file category))
(org-print-icalendar-entries combine category)
(when (or (and combine (not files)) (not combine))
***************
*** 9540,9546 ****
donep (org-entry-is-done-p)))
(if (or (string-match org-tr-regexp hd)
(string-match org-ts-regexp hd))
! (setq hd (replace-match "" t t hd)))
(if combine
(setq hd (concat hd " (category " category ")")))
(if deadlinep (setq hd (concat "DL: " hd " This is a deadline")))
--- 9716,9722 ----
donep (org-entry-is-done-p)))
(if (or (string-match org-tr-regexp hd)
(string-match org-ts-regexp hd))
! (setq hd (replace-match "" t t hd)))
(if combine
(setq hd (concat hd " (category " category ")")))
(if deadlinep (setq hd (concat "DL: " hd " This is a deadline")))
***************
*** 9693,9702 ****
(define-key org-mode-map "\C-c\C-y" 'org-evaluate-time-range)
(define-key org-mode-map "\C-c>" 'org-goto-calendar)
(define-key org-mode-map "\C-c<" 'org-date-from-calendar)
! (define-key org-mode-map "\C-c[" 'org-add-file)
(define-key org-mode-map "\C-c]" 'org-remove-file)
(define-key org-mode-map "\C-c\C-r" 'org-timeline)
(define-key org-mode-map "\C-c-" 'org-table-insert-hline)
(define-key org-mode-map "\C-c\C-c" 'org-ctrl-c-ctrl-c)
(define-key org-mode-map "\C-m" 'org-return)
(define-key org-mode-map "\C-c?" 'org-table-current-column)
--- 9869,9880 ----
(define-key org-mode-map "\C-c\C-y" 'org-evaluate-time-range)
(define-key org-mode-map "\C-c>" 'org-goto-calendar)
(define-key org-mode-map "\C-c<" 'org-date-from-calendar)
! (define-key org-mode-map [(control ?,)] 'org-cycle-agenda-files)
! (define-key org-mode-map "\C-c[" 'org-agenda-file-to-front)
(define-key org-mode-map "\C-c]" 'org-remove-file)
(define-key org-mode-map "\C-c\C-r" 'org-timeline)
(define-key org-mode-map "\C-c-" 'org-table-insert-hline)
+ (define-key org-mode-map "\C-c^" 'org-table-sort-lines)
(define-key org-mode-map "\C-c\C-c" 'org-ctrl-c-ctrl-c)
(define-key org-mode-map "\C-m" 'org-return)
(define-key org-mode-map "\C-c?" 'org-table-current-column)
***************
*** 9807,9813 ****
(if (fboundp 'command-remapping)
(define-key map (vector 'remap old) new)
(substitute-key-definition old new map global-map)))))
!
(when (eq org-enable-table-editor 'optimized)
;; If the user wants maximum table support, we need to hijack
;; some standard editing functions
--- 9985,9991 ----
(if (fboundp 'command-remapping)
(define-key map (vector 'remap old) new)
(substitute-key-definition old new map global-map)))))
!
(when (eq org-enable-table-editor 'optimized)
;; If the user wants maximum table support, we need to hijack
;; some standard editing functions
***************
*** 10044,10049 ****
--- 10222,10228 ----
["Move Row Down" org-metadown (org-at-table-p)]
["Delete Row" org-shiftmetaup (org-at-table-p)]
["Insert Row" org-shiftmetadown (org-at-table-p)]
+ ["Sort lines in region" org-table-sort-lines (org-at-table-p)]
"--"
["Insert Hline" org-table-insert-hline (org-at-table-p)])
("Rectangle"
***************
*** 10185,10192 ****
(append
(list
["Edit File List" (customize-variable 'org-agenda-files) t]
! ["Add Current File to List" org-add-file t]
["Remove Current File from List" org-remove-file t]
"--")
(mapcar 'org-file-menu-entry org-agenda-files))))
--- 10364,10372 ----
(append
(list
["Edit File List" (customize-variable 'org-agenda-files) t]
! ["Add/Move Current File to Front of List" org-agenda-file-to-front t]
["Remove Current File from List" org-remove-file t]
+ ["Cycle through agenda files" org-cycle-agenda-files t]
"--")
(mapcar 'org-file-menu-entry org-agenda-files))))
***************
*** 10243,10248 ****
--- 10423,10480 ----
(goto-char pos)
(move-to-column col)))
+ ;; Paragraph filling stuff.
+ ;; We want this to be just right, so use the full arsenal.
+ ;; FIXME: This very likely does not work correctly for XEmacs, because the
+ ;; filladapt package works slightly differently.
+
+ (defun org-set-autofill-regexps ()
+ (interactive)
+ ;; In the paragraph separator we include headlines, because filling
+ ;; text in a line directly attached to a headline would otherwise
+ ;; fill the headline as well.
+ (set (make-local-variable 'paragraph-separate) "\f\\|\\*\\|[ ]*$\\|[
\t]*[:|]")
+ ;; The paragraph starter includes hand-formatted lists.
+ (set (make-local-variable 'paragraph-start)
+ "\f\\|[ ]*$\\|\\([*\f]+\\)\\|[ \t]*\\([-+*]\\|[0-9]+\\.[
\t]+\\)\\|[ \t]*[:|]")
+ ;; Inhibit auto-fill for headers, tables and fixed-width lines.
+ ;; But only if the user has not turned off tables or fixed-width regions
+ (set (make-local-variable 'auto-fill-inhibit-regexp)
+ (concat "\\*\\|#"
+ (if (or org-enable-table-editor org-enable-fixed-width-editor)
+ (concat
+ "\\|[ \t]*["
+ (if org-enable-table-editor "|" "")
+ (if org-enable-fixed-width-editor ":" "")
+ "]"))))
+ ;; We use our own fill-paragraph function, to make sure that tables
+ ;; and fixed-width regions are not wrapped. That function will pass
+ ;; through to `fill-paragraph' when appropriate.
+ (set (make-local-variable 'fill-paragraph-function) 'org-fill-paragraph)
+ ;; Adaptive filling: To get full control, first make sure that
+ ;; `adaptive-fill-regexp' never matches. Then install our won matcher.
+ (setq adaptive-fill-regexp "\000")
+ (setq adaptive-fill-function 'org-adaptive-fill-function))
+
+ (defun org-fill-paragraph (&optional justify)
+ "Re-align a table, pass through to fill-paragraph if no table."
+ (let ((table-p (org-at-table-p))
+ (table.el-p (org-at-table.el-p)))
+ (cond ((equal (char-after (point-at-bol)) ?*) t) ; skip headlines
+ (table.el-p t) ; skip table.el tables
+ (table-p (org-table-align) t) ; align org-mode tables
+ (t nil)))) ; call paragraph-fill
+
+ ;; For reference, this is the default value of adaptive-fill-regexp
+ ;; "[ \t]*\\([-|#;>*]+[ \t]*\\|(?[0-9]+[.)][ \t]*\\)*"
+
+ (defun org-adaptive-fill-function ()
+ "Return a fill prefix for org-mode files.
+ In particular, this makes sure hanging paragraphs for hand-formatted lists
+ work correctly."
+ (if (looking-at " *\\([-*+] \\|[0-9]+\\. \\)?")
+ (make-string (- (match-end 0) (match-beginning 0)) ?\ )))
+
;; Functions needed for Emacs/XEmacs region compatibility
(defun org-region-active-p ()
***************
*** 10474,10476 ****
--- 10706,10709 ----
;; arch-tag: e77da1a7-acc7-4336-b19e-efa25af3f9fd
;;; org.el ends here
+