branch: externals/denote-review
commit 8982003875789d3d098d0a164da3c2bf716307b0
Author: Matto Fransen <[email protected]>
Commit: Matto Fransen <[email protected]>
Added support for other denote-file-types
---
README.org | 10 +++---
my-denote-review.el | 99 ++++++++++++++++++++++++++++++++++++++---------------
2 files changed, 76 insertions(+), 33 deletions(-)
diff --git a/README.org b/README.org
index 91a3eb3bb9..57ea70205b 100644
--- a/README.org
+++ b/README.org
@@ -3,12 +3,13 @@
`my-denote-review' aims to provide a practical and simple manner to
implement a review process for some of your [[
https://protesilaos.com/emacs/denote][denote]] notes.
-It is made for notes in org mode format.
-
`my-denote-review' adds a single line to the frontmatter:
~#+reviewdate: [2024-06-12]~
+The format of this line is according to `denote-file-type' (defaults
+to org).
+
** Usage
The aim is to implement a process for reviewing your denote notes in a
@@ -20,7 +21,7 @@ The ~#+reviewdate~ frontmatter can be inserted or updated
with a single
key binding.
To get started, select a number of denote notes in Dired and bulk
-insert the ~#+reviewdate~ frontmatter (see below). Default this
+insert the ~reviewdate~ frontmatter (see below). Default this
inserts a review date derived from the identifier in the file name.
With the Universal Argument (~C-u~) this current date is used as
review date.
@@ -135,8 +136,7 @@ point a few lines below your frontmatter and issue the
command
~my-denote-review-max-search-point~ could be.
** Limitations
-Currenlty only org-mode denote notes are supported.
-`my-denote-review' does not dive into subdirectories.
+`my-denote-review' doesn't support denote-silos yet.
** Source code. bugs and patches
~my-denote-review~ is developed at
diff --git a/my-denote-review.el b/my-denote-review.el
index 2f485db62b..c4333383b7 100644
--- a/my-denote-review.el
+++ b/my-denote-review.el
@@ -45,18 +45,53 @@
"Point to stop `re-search-forward' after some lines."
:type 'natnum)
+;; Regexps for different filetypes
+
+(defun search-regexp-for-filetype ()
+ "Regexp to search for the reviewdate.
+Defaults to regexp for org filetype."
+ (cond ((string= denote-file-type "markdown-yaml")
+ "\\(^reviewdate:[ \t]\\)\\([^\t\n]+\\)")
+ ((string= denote-file-type "markdown-toml")
+ "\\(^reviewdate[ \t]\\)= \\([^\t\n]+\\)")
+ ((string= denote-file-type "text")
+ "\\(^reviewdate:[ \t]\\)\\([^\t\n]+\\)")
+ (t "\\(^#\\+reviewdate:[ \t]\\[\\)\\([^\t\n]+\\)\\]")))
+
+(defun insert-regexp-location-for-filetype ()
+ "Regexp to search for the identifier string in frontmatter."
+ (if (or
+ (string= denote-file-type 'markdown-yaml)
+ (string= denote-file-type 'markdown-toml)
+ (string= denote-file-type 'text))
+ "^identifier"
+ "^#\\+identifier"))
+
;; Setting and getting the reviewdate
-(defun my-denote-review-insert-date (&optional thisdate)
- "Insert current date as reviewdate.
+(defun my-denote-review-insert-reviewdate-line (mydate)
+ "Insert the review date MYDATE frontmatter line.
+Format according to denote-file-type.
+Insert just after the identifier line."
+ (cond ((string= denote-file-type "markdown-yaml")
+ (format "reviewdate: %s" mydate))
+ ((string= denote-file-type "markdown-toml")
+ (format "reviewdate = %s" mydate))
+ ((string= denote-file-type "text")
+ (format "reviewdate: %s" mydate))
+ (t (format "#+reviewdate: [%s]" mydate))))
+
+(defun my-denote-review-insert-date (&optional thisdate insert-regexp)
+ "Insert current date in ISO 8601 format as reviewdate.
Or use THISDATE, when not nil."
- (goto-char (point-min))
- (let ((mydate (format-time-string "%F")))
- (unless (null thisdate)
- (setq mydate thisdate))
- (re-search-forward "^$" nil t)
- (replace-match (format "#+reviewdate: [%s]" mydate))
- (newline)))
+ (goto-char (point-min))
+ (let ((mydate (format-time-string "%F")))
+ (unless (null thisdate)
+ (setq mydate thisdate))
+ (re-search-forward insert-regexp nil t)
+ (end-of-line)
+ (newline)
+ (insert (my-denote-review-insert-reviewdate-line mydate))))
(defun my-denote-review-set-date ()
"Set the reviewdate in the current buffer.
@@ -64,11 +99,11 @@ Replace an existing reviewdate."
(interactive)
(save-excursion
(goto-char (point-min))
- (if (re-search-forward "^#\\+reviewdate:[ \t][^\t\n]+"
+ (if (re-search-forward (search-regexp-for-filetype)
my-denote-review-max-search-point t)
(replace-match
- (format "#+reviewdate: [%s]" (format-time-string "%F")))
- (my-denote-review-insert-date))))
+ (my-denote-review-insert-reviewdate-line (format-time-string "%F")))
+ (my-denote-review-insert-date nil (insert-regexp-location-for-filetype)))))
(defun my-denote-review-get-date (search-regexp)
"Get the reviewdate from current buffer."
@@ -80,12 +115,11 @@ Replace an existing reviewdate."
;; Bulk operation, to be run from Dired.
-(defun my-denote-review-set-initial-date (thisdate)
+(defun my-denote-review-set-initial-date (thisdate search-regexp insert-regexp)
"Insert reviewdate with THISDATE.
Only do this when no reviewdate already exist."
- (when (null (my-denote-review-get-date
- "\\(^#\\+reviewdate:[ \t]\\[\\)\\([^\t\n]+\\)\\]"))
- (my-denote-review-insert-date thisdate)))
+ (when (null (my-denote-review-get-date search-regexp))
+ (my-denote-review-insert-date thisdate insert-regexp)))
(defun my-denote-review-get-date-from-filename (filename)
"Convert identifier in FILENAME into a date."
@@ -94,16 +128,21 @@ Only do this when no reviewdate already exist."
(defun my-denote-review-bulk-set-date (filename current-date-p)
"Opens FILENAME and insert a reviewdate.
When CURRENT-DATE-P is not null, use current date."
- (let (fpath fname mybuffer len)
- (setq fpath filename)
- (setq fname (file-name-nondirectory fpath))
- (setq mybuffer (find-file fpath))
+ (let ((fpath filename)
+ (fname (file-name-nondirectory filename))
+ (mybuffer '())
+ (search-regexp (search-regexp-for-filetype))
+ (insert-regexp (insert-regexp-location-for-filetype)))
+ (find-file fpath)
(if (null current-date-p)
(my-denote-review-set-initial-date
- (my-denote-review-get-date-from-filename fname))
- (my-denote-review-set-initial-date (format-time-string "%F")))
+ (my-denote-review-get-date-from-filename fname)
+ search-regexp insert-regexp)
+ (my-denote-review-set-initial-date (format-time-string "%F")
+ search-regexp
+ insert-regexp))
(save-buffer)
- (kill-buffer mybuffer)))
+ (kill-buffer fname)))
(defun my-denote-review-set-date-dired-marked-files ()
"Insert a reviewdate in the marked files.
@@ -149,12 +188,12 @@ Does not overwrite existing reviewdates."
;; Collect data to fill the tabular mode list
-(defun my-denote-review-check-date-of-file (myfile)
+(defun my-denote-review-check-date-of-file (myfile search-regexp)
"Get the reviewdate of MYFILE."
(let ((mybuffer (find-file myfile))
myreviewdate)
(setq myreviewdate (my-denote-review-get-date
- "\\(^#\\+reviewdate:[ \t]\\[\\)\\([^\t\n]+\\)\\]"))
+ search-regexp))
(kill-buffer mybuffer)
myreviewdate))
@@ -163,21 +202,25 @@ Does not overwrite existing reviewdates."
Filter filenames according to DENOTEPATH-AND-KEYWORD.
DENOTEPATH-AND-KEYWORD is a cons of a path and a keyword.
Create a list in the format required by `tabulated-list-mode'."
- (let ((list-of-files '()))
+ (let ((list-of-files '())
+ (search-regexp (search-regexp-for-filetype))
+ (denote-directory (car denotepath-and-keyword)))
(save-excursion
(mapc
(lambda (myfile)
(when (or (string= (cdr denotepath-and-keyword) "All")
(string-match
(format "_%s" (cdr denotepath-and-keyword)) myfile))
- (let ((reviewdate (my-denote-review-check-date-of-file myfile)))
+ (let ((reviewdate (my-denote-review-check-date-of-file
+ myfile
+ search-regexp)))
(unless (null reviewdate)
(push (list myfile
(vector
reviewdate
(file-name-nondirectory myfile)))
list-of-files)))))
- (directory-files (car denotepath-and-keyword) t "\.org$" )))
+ (denote-directory-files nil t nil)))
(when (null list-of-files)
(error (format
"No files with a reviewdate found (filter: keyword %s)"