diff --git a/Makefile b/Makefile index 5a6e245d6..a70ac3296 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,7 @@ LISPF = org.el \ org-colview-xemacs.el \ org-compat.el \ org-crypt.el \ + org-datetree.el \ org-exp.el \ org-exp-blocks.el \ org-docbook.el \ @@ -337,6 +338,7 @@ lisp/org-colview.elc: lisp/org.el lisp/org-colview-xemacs.elc: lisp/org.el lisp/org-compat.elc: lisp/org-macs.el lisp/org-crypt.elc: lisp/org-crypt.el lisp/org.el +lisp/org-datetree.elc: lisp/org.el lisp/org-exp.elc: lisp/org.el lisp/org-agenda.el lisp/org-exp-blocks.elc: lisp/org.el lisp/org-latex.elc: lisp/org.el lisp/org-exp.el diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 192f42b23..8d2c2677b 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2009-11-08 Carsten Dominik + * org-datetree.el: New file. + * org-latex.el (org-export-latex-preprocess): Protect targets in verbatim emphasis. diff --git a/lisp/org-datetree.el b/lisp/org-datetree.el new file mode 100644 index 000000000..a7b750f25 --- /dev/null +++ b/lisp/org-datetree.el @@ -0,0 +1,126 @@ +;;; org-datetree.el --- Create Date entries in a tree + +;; Copyright (C) 2009 Free Software Foundation, Inc. + +;; Author: Carsten Dominik +;; Keywords: outlines, hypermedia, calendar, wp +;; Homepage: http://orgmode.org +;; Version: 6.32trans +;; +;; This file is part of GNU Emacs. +;; +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: + +;; This file contains code to create entries in a tree where the top-level +;; nodes represent years, the level 2 nodes represent the months, and the +;; level 1 entries days. + +;;; Code: + +(require 'org) + +(defun org-datetree-find-date-create (date) + "Find or create an entry for DATE." + (let ((year (nth 2 date)) + (month (car date)) + (day (nth 1 date))) + (org-datetree-find-year-create year) + (org-datetree-find-month-create year month) + (org-datetree-find-day-create year month day) + (goto-char (prog1 (point) (widen))))) + +(defun org-datetree-find-year-create (year) + (let ((re "^\\*+[ \t]+\\([12][0-9][0-9][0-9]\\)[ \t\n]") + match) + (goto-char (point-min)) + (while (and (setq match (re-search-forward re nil t)) + (goto-char (match-beginning 1)) + (< (string-to-number (match-string 1)) year))) + (cond + ((not match) + (goto-char (point-max)) + (or (bolp) (newline)) + (org-datetree-insert-line year)) + ((= (string-to-number (match-string 1)) year) + (goto-char (point-at-bol))) + (t + (beginning-of-line 1) + (org-datetree-insert-line year))))) + +(defun org-datetree-find-month-create (year month) + (org-narrow-to-subtree) + (let ((re (format "^\\*+[ \t]+%d-\\([01][0-9]\\)[ \t\n]" year)) + match) + (goto-char (point-min)) + (while (and (setq match (re-search-forward re nil t)) + (goto-char (match-beginning 1)) + (< (string-to-number (match-string 1)) month))) + (cond + ((not match) + (goto-char (point-max)) + (or (bolp) (newline)) + (org-datetree-insert-line year month)) + ((= (string-to-number (match-string 1)) month) + (goto-char (point-at-bol))) + (t + (beginning-of-line 1) + (org-datetree-insert-line year month))))) + +(defun org-datetree-find-day-create (year month day) + (org-narrow-to-subtree) + (let ((re (format "^\\*+[ \t]+%d-%02d-\\([01][0-9]\\)[ \t\n]" year month)) + match) + (goto-char (point-min)) + (while (and (setq match (re-search-forward re nil t)) + (goto-char (match-beginning 1)) + (< (string-to-number (match-string 1)) day))) + (cond + ((not match) + (goto-char (point-max)) + (or (bolp) (newline)) + (org-datetree-insert-line year month day)) + ((= (string-to-number (match-string 1)) day) + (goto-char (point-at-bol))) + (t + (beginning-of-line 1) + (org-datetree-insert-line year month day))))) + +(defun org-datetree-insert-line (year &optional month day) + (let ((pos (point))) + (skip-chars-backward " \t\n") + (delete-region (point) pos) + (insert "\n* \n") + (backward-char 1) + (if month (org-do-demote)) + (if day (org-do-demote)) + (insert (format "%d" year)) + (when month + (insert (format "-%02d" month)) + (if day + (insert (format "-%02d %s" + day (format-time-string + "%A" (encode-time 0 0 0 day month year)))) + (insert (format " %s" + (format-time-string + "%B" (encode-time 0 0 0 1 month year)))))) + (beginning-of-line 1))) + +(provide 'org-datetree) + +;; arch-tag: 1daea962-fd08-448b-9f98-6e8b511b3601 + +;;; org-datetree.el ends here