|
@@ -0,0 +1,126 @@
|
|
|
+;;; org-datetree.el --- Create Date entries in a tree
|
|
|
+
|
|
|
+;; Copyright (C) 2009 Free Software Foundation, Inc.
|
|
|
+
|
|
|
+;; Author: Carsten Dominik <carsten at orgmode dot org>
|
|
|
+;; 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 <http://www.gnu.org/licenses/>.
|
|
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
+;;
|
|
|
+;;; 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
|