emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 005c9ae747: lisp/org-datetree.el: Allow datetrees w


From: ELPA Syncer
Subject: [elpa] externals/org 005c9ae747: lisp/org-datetree.el: Allow datetrees with TODO, priority, tags
Date: Sat, 21 Jan 2023 04:58:23 -0500 (EST)

branch: externals/org
commit 005c9ae7474e8652a628aee392f1bc377eeb15fa
Author: Ilya Chernyshov <ichernyshovvv@gmail.com>
Commit: Ihor Radchenko <yantar92@posteo.net>

    lisp/org-datetree.el: Allow datetrees with TODO, priority, tags
    
    * org-datetree.el (org-datetree--find-create): Add optional argument
    MATCH-TITLE that controls whether to match REGEX-TEMPLATE against
    heading title inside complex heading or to match REGEX-TEMPLATE
    against the whole heading line.
    
    * org-datetree.el (org-datetree--find-create-group,
    org-datetree-find-iso-week-create): Allow finding a datetree with TODO
    state, priority, tags, statistics cookies, or COMMENT keyword.
    
    * testing/lisp/test-org-datetree.el
    (test-org-datetree/find-date-create,
    test-org-datetree/find-iso-week-create): Add tests for a datetree with
    tags, TODO or priority keywords.
    
    * etc/ORG-NEWS (Datetree structure headlines can now be complex):
    Document the change.
    
    * doc/org-manual.org: Update datetree definition.
---
 doc/org-manual.org                |  3 ++-
 etc/ORG-NEWS                      |  6 +++++
 lisp/org-datetree.el              | 57 +++++++++++++++++++++++++--------------
 testing/lisp/test-org-datetree.el | 16 +++++++++++
 4 files changed, 61 insertions(+), 21 deletions(-)

diff --git a/doc/org-manual.org b/doc/org-manual.org
index 5217e647d0..ce32f77408 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -22510,7 +22510,8 @@ level.
 ,*** 2022-10-08 Saturday
 #+end_example
 
-Tags are allowed in the tree structure.
+TODO state, priority, tags, statistics cookies, and COMMENT keywords
+are allowed in the tree structure.
 
 [fn:31] This is always the other, not the user.  See the variable
 ~org-link-from-user-regexp~.
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 613b324088..3ef76ec1ab 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -60,6 +60,12 @@ The face ~org-agenda-calendar-daterange~ is used to show 
entries with
 a date range in the agenda.  It inherits from the default face in
 order to remain backward-compatible.
 
+** New features
+*** Datetree structure headlines can now be complex
+
+TODO state, priority, tags, statistics cookies, and COMMENT keywords
+are allowed in the tree structure.
+
 * Version 9.6
 
 ** Important announcements and breaking changes
diff --git a/lisp/org-datetree.el b/lisp/org-datetree.el
index 035ef047a9..8a617e90cf 100644
--- a/lisp/org-datetree.el
+++ b/lisp/org-datetree.el
@@ -99,16 +99,15 @@ If time-period is month, then group entries by month."
          (month (calendar-extract-month d))
          (day (calendar-extract-day d)))
       (org-datetree--find-create
-       "^\\*+[ \t]+\\([12][0-9]\\{3\\}\\)\\(\\s-*?\
-\\([ \t]:[[:alnum:]:_@#%%]+:\\)?\\s-*$\\)"
-       year)
+       "\\([12][0-9]\\{3\\}\\)"
+       year nil nil nil t)
       (org-datetree--find-create
-       "^\\*+[ \t]+%d-\\([01][0-9]\\) \\w+$"
-       year month)
+       "%d-\\([01][0-9]\\) \\w+"
+       year month nil nil t)
       (when (eq time-grouping 'day)
        (org-datetree--find-create
-        "^\\*+[ \t]+%d-%02d-\\([0123][0-9]\\) \\w+$"
-        year month day)))))
+         "%d-%02d-\\([0123][0-9]\\) \\w+"
+        year month day nil t)))))
 
 ;;;###autoload
 (defun org-datetree-find-iso-week-create (d &optional keep-restriction)
@@ -147,33 +146,51 @@ will be built under the headline at point."
           (week (nth 0 iso-date)))
       ;; ISO 8601 week format is %G-W%V(-%u)
       (org-datetree--find-create
-       "^\\*+[ \t]+\\([12][0-9]\\{3\\}\\)\\(\\s-*?\
-\\([ \t]:[[:alnum:]:_@#%%]+:\\)?\\s-*$\\)"
-       weekyear nil nil
-       (format-time-string "%G" time))
+       "\\([12][0-9]\\{3\\}\\)"
+       weekyear nil nil (format-time-string "%G" time) t)
       (org-datetree--find-create
-       "^\\*+[ \t]+%d-W\\([0-5][0-9]\\)$"
-       weekyear week nil
-       (format-time-string "%G-W%V" time))
+       "%d-W\\([0-5][0-9]\\)"
+       weekyear week nil (format-time-string "%G-W%V" time) t)
       ;; For the actual day we use the regular date instead of ISO week.
       (org-datetree--find-create
-       "^\\*+[ \t]+%d-%02d-\\([0123][0-9]\\) \\w+$"
-       year month day))))
+       "%d-%02d-\\([0123][0-9]\\) \\w+" year month day nil t))))
 
 (defun org-datetree--find-create
-    (regex-template year &optional month day insert)
+    (regex-template year &optional month day insert match-title)
   "Find the datetree matched by REGEX-TEMPLATE for YEAR, MONTH, or DAY.
 REGEX-TEMPLATE is passed to `format' with YEAR, MONTH, and DAY as
-arguments.  Match group 1 is compared against the specified date
+arguments.
+
+If MATCH-TITLE is non-nil, REGEX-TEMPLATE is matched against
+heading title and the exact regexp matched against heading line is:
+
+  (format org-complex-heading-regexp-format
+          (format regex-template year month day))
+
+If MATCH-TITLE is nil, the regexp matched against heading line is
+REGEX-TEMPLATE:
+
+  (format regex-template year month day)
+
+Match group 1 in REGEX-TEMPLATE is compared against the specified date
 component.  If INSERT is non-nil and there is no match then it is
 inserted into the buffer."
   (when (or month day)
     (org-narrow-to-subtree))
-  (let ((re (format regex-template year month day))
+  ;; ensure that the first match group in REGEX-TEMPLATE
+  ;; is the first inside `org-complex-heading-regexp-format'
+  (when (and match-title
+             (not (string-match-p "\\\\(\\?1:" regex-template))
+             (string-match "\\\\(" regex-template))
+    (setq regex-template (replace-match "\\(?1:" nil t regex-template)))
+  (let ((re (if match-title
+                (format org-complex-heading-regexp-format
+                        (format regex-template year month day))
+              (format regex-template year month day)))
        match)
     (goto-char (point-min))
     (while (and (setq match (re-search-forward re nil t))
-               (goto-char (match-beginning 1))
+                (goto-char (match-beginning 1))
                (< (string-to-number (match-string 1)) (or day month year))))
     (cond
      ((not match)
diff --git a/testing/lisp/test-org-datetree.el 
b/testing/lisp/test-org-datetree.el
index 59ef8c33b1..bd06462f2c 100644
--- a/testing/lisp/test-org-datetree.el
+++ b/testing/lisp/test-org-datetree.el
@@ -58,6 +58,14 @@
         (let ((org-datetree-add-timestamp nil))
          (org-datetree-find-date-create '(3 29 2012)))
         (org-trim (buffer-string)))))
+    ;; Do not create new day node when one exists.
+    (should
+     (string-match
+      "\\`\\* DONE 2012 :tag1:tag2:\n\n\\*\\* TODO 2012-03 .*\n\n\\*\\*\\* 
\\[#A\\] 2012-03-29 .*\\'"
+      (org-test-with-temp-text "* DONE 2012 :tag1:tag2:\n\n** TODO 2012-03 
month\n\n*** [#A] 2012-03-29 day :tag3:"
+        (let ((org-datetree-add-timestamp nil))
+         (org-datetree-find-date-create '(3 29 2012)))
+        (org-trim (buffer-string)))))
     ;; Sort new entry in right place.
     (should
      (string-match
@@ -163,6 +171,14 @@
         (let ((org-datetree-add-timestamp nil))
          (org-datetree-find-iso-week-create '(12 31 2014)))
         (org-trim (buffer-string)))))
+    ;; Do not create new day node when one exists.
+    (should
+     (string-match
+      "\\`\\* TODO \\[#B\\] 2015\n\n\\*\\* 2015-W01 :tag1:\n\n\\*\\*\\* 
2014-12-31 .*\\'"
+      (org-test-with-temp-text "* TODO [#B] 2015\n\n** 2015-W01 :tag1:\n\n*** 
2014-12-31 day"
+        (let ((org-datetree-add-timestamp nil))
+         (org-datetree-find-iso-week-create '(12 31 2014)))
+        (org-trim (buffer-string)))))
     ;; Sort new entry in right place.
     (should
      (string-match



reply via email to

[Prev in Thread] Current Thread [Next in Thread]