[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/denote 21104787f7 024/355: Put link functionality in de
From: |
ELPA Syncer |
Subject: |
[elpa] externals/denote 21104787f7 024/355: Put link functionality in denote-link.el |
Date: |
Sun, 26 Jun 2022 23:57:56 -0400 (EDT) |
branch: externals/denote
commit 21104787f782056df9a0c9d737e0441661b8a217
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>
Put link functionality in denote-link.el
---
denote-link.el | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
denote.el | 77 --------------------------------------
2 files changed, 116 insertions(+), 77 deletions(-)
diff --git a/denote-link.el b/denote-link.el
new file mode 100644
index 0000000000..bb16594ca7
--- /dev/null
+++ b/denote-link.el
@@ -0,0 +1,116 @@
+;;; denote-link.el --- Link to file with denote -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Protesilaos Stavrou
+
+;; Author: Protesilaos Stavrou <info@protesilaos.com>
+;; URL: https://git.sr.ht/~protesilaos/denote
+;; Version: 0.1.0
+;; Package-Requires: ((emacs "27.1"))
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program 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.
+;;
+;; This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Links for denote.
+
+;;; Code:
+
+(require 'denote)
+
+(defgroup denote-link ()
+ "Simple tool for plain text notes."
+ :group 'files)
+
+;;; User options
+
+(defcustom denote-link-insert-functions
+ (list #'denote-link-backlink)
+ "Functions that run after `denote-link'.
+Each function accepts a TARGET-FILE and an ORIGIN-LINK argument.
+Both are supplied by `denote-link'."
+ :type 'hook
+ :group 'denote-link)
+
+;;;; Link to note
+
+(defun denote-link--find-key-value-pair (regexp)
+ "Produce a cons cell from REGEXP by searching the file."
+ (goto-char (point-min))
+ (re-search-forward regexp)
+ (cons (match-string-no-properties 1)
+ (match-string-no-properties 2)))
+
+(defvar denote-link--title-regexp "^\\(#\\+title:\\)[\s\t]+\\(.*\\)"
+ "Regular expression for title key and value.")
+
+(defvar denote-link--filename-regexp "^\\(#\\+filename:\\)[\s\t]+\\(.*\\)"
+ "Regular expression for filename key and value.")
+
+(defvar denote-link--identifier-regexp "^\\(#\\+identifier:\\)[\s\t]+\\(.*\\)"
+ "Regular expression for filename key and value.")
+
+;; TODO 2022-06-05: Maybe this should be a defcustom?
+(defvar denote-link--link-format "[[denote:%s][%s (%s)]]"
+ "Format of Org link to note.")
+
+(defvar denote-link--backlink-format "[[denote:%s][backlink: %s (%s)]]"
+ "Format of Org link to note.")
+
+(defun denote-link--retrieve-value (note regexp)
+ "Return REGEXP value from NOTE."
+ (let ((default-directory (denote--directory)))
+ (with-temp-buffer
+ (insert-file-contents-literally note)
+ (denote-link--find-key-value-pair regexp))))
+
+(defun denote-link--read-file-prompt ()
+ "Prompt for regular file in `denote-directory'."
+ (read-file-name "Select note: " (denote--directory)
+ nil t nil #'file-regular-p))
+
+;;;###autoload
+(defun denote-link (target)
+ "Create Org link to TARGET note in `denote-directory'.
+Run `denote-link-insert-functions' afterwards."
+ (interactive (list (denote-link--read-file-prompt)))
+ (let* ((dir (denote--directory))
+ (target-id (cdr (denote-link--retrieve-value target
denote-link--identifier-regexp)))
+ (target-name (string-remove-prefix
+ dir (cdr (denote-link--retrieve-value target
denote-link--filename-regexp))))
+ (target-title (cdr (denote-link--retrieve-value target
denote-link--title-regexp)))
+ (target-link (format denote-link--link-format target-name
target-title target-id))
+ (origin-note (buffer-file-name))
+ (origin-id (cdr (denote-link--retrieve-value origin-note
denote-link--identifier-regexp)))
+ (origin-name (string-remove-prefix
+ dir (cdr (denote-link--retrieve-value origin-note
denote-link--filename-regexp))))
+ (origin-title (cdr (denote-link--retrieve-value origin-note
denote-link--title-regexp)))
+ (origin-link (format denote-link--backlink-format origin-name
origin-title origin-id)))
+ (insert target-link)
+ (run-hook-with-args 'denote-link-insert-functions target origin-link)))
+
+;; NOTE 2022-06-05: A proof-of-concept. We need to: (i) have a
+;; Backlinks heading, (ii) delete duplicates, (iii) ensure one backlink
+;; per line, (iv) have a `denote-unlink' command or a
+;; `denote-clean-backlinks' for invalid links.
+(defun denote-link-backlink (target-file origin-link)
+ "Insert ORIGIN-LINK to TARGET-FILE."
+ (let ((default-directory (denote--directory)))
+ (with-current-buffer (find-file-noselect target-file)
+ (goto-char (point-max))
+ (insert origin-link))))
+
+(provide 'denote-link)
+;;; denote-link.el ends here
diff --git a/denote.el b/denote.el
index 2985060139..0795c14efa 100644
--- a/denote.el
+++ b/denote.el
@@ -92,14 +92,6 @@ define."
:type 'string
:group 'denote)
-(defcustom denote-link-insert-functions
- (list #'denote-write-backlink)
- "Functions that run after `denote-link'.
-Each function accepts a TARGET-FILE and an ORIGIN-LINK argument.
-Both are supplied by `denote-link'."
- :type 'hook
- :group 'denote)
-
;;; Main variables
;; TODO 2022-06-04: Can we make the entire file name format a defcustom?
@@ -372,74 +364,5 @@ sample template. We will eventually have a manual."
;; TODO 2022-06-04: `denote-rename-file'
-;;;; Link to note
-
-(defun denote--find-key-value-pair (regexp)
- "Produce a cons cell from REGEXP by searching the file."
- (goto-char (point-min))
- (re-search-forward regexp)
- (cons (match-string-no-properties 1)
- (match-string-no-properties 2)))
-
-(defvar denote--title-regexp "^\\(#\\+title:\\)[\s\t]+\\(.*\\)"
- "Regular expression for title key and value.")
-
-(defvar denote--filename-regexp "^\\(#\\+filename:\\)[\s\t]+\\(.*\\)"
- "Regular expression for filename key and value.")
-
-(defvar denote--identifier-regexp "^\\(#\\+identifier:\\)[\s\t]+\\(.*\\)"
- "Regular expression for filename key and value.")
-
-;; TODO 2022-06-05: Maybe this should be a defcustom?
-(defvar denote--link-format "[[denote:%s][%s (%s)]]"
- "Format of Org link to note.")
-
-(defvar denote--backlink-format "[[denote:%s][backlink: %s (%s)]]"
- "Format of Org link to note.")
-
-(defun denote--retrieve-value (note regexp)
- "Return REGEXP value from NOTE."
- (let ((default-directory (denote--directory)))
- (with-temp-buffer
- (insert-file-contents-literally note)
- (denote--find-key-value-pair regexp))))
-
-(defun denote--read-file-prompt ()
- "Prompt for regular file in `denote-directory'."
- (read-file-name "Select note: " (denote--directory)
- nil t nil #'file-regular-p))
-
-;;;###autoload
-(defun denote-link (target)
- "Create Org link to TARGET note in `denote-directory'.
-Run `denote-link-insert-functions' afterwards."
- (interactive (list (denote--read-file-prompt)))
- (let* ((target-id (cdr (denote--retrieve-value target
denote--identifier-regexp)))
- (target-name (string-remove-prefix
- (denote--directory)
- (cdr (denote--retrieve-value target
denote--filename-regexp))))
- (target-title (cdr (denote--retrieve-value target
denote--title-regexp)))
- (target-link (format denote--link-format target-name target-title
target-id))
- (origin-note (buffer-file-name))
- (origin-id (cdr (denote--retrieve-value origin-note
denote--identifier-regexp)))
- (origin-name (string-remove-prefix
- (denote--directory)
- (cdr (denote--retrieve-value origin-note
denote--filename-regexp))))
- (origin-title (cdr (denote--retrieve-value origin-note
denote--title-regexp)))
- (origin-link (format denote--backlink-format origin-name origin-title
origin-id)))
- (insert target-link)
- (run-hook-with-args 'denote-link-insert-functions target origin-link)))
-
-;; NOTE 2022-06-05: A proof-of-concept. We need to: (i) have a
-;; Backlinks heading, (ii) delete duplicates, (iii) ensure one backlink
-;; per line, (iv) have a `denote-unlink' command or a
-;; `denote-clean-backlinks' for invalid links.
-(defun denote-write-backlink (target-file origin-link)
- "Insert ORIGIN-LINK to TARGET-FILE."
- (let ((default-directory (denote--directory)))
- (with-current-buffer (find-file-noselect target-file)
- (goto-char (point-max))
- (insert origin-link))))
-
(provide 'denote)
;;; denote.el ends here
- [elpa] externals/denote 39d9870635 018/355: Change punct regexp location; make it defconst, (continued)
- [elpa] externals/denote 39d9870635 018/355: Change punct regexp location; make it defconst, ELPA Syncer, 2022/06/26
- [elpa] externals/denote dd488756f7 019/355: Refine denote--directory-files, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 0aab5bc835 012/355: Tweak code for the sake of org-capture, ELPA Syncer, 2022/06/26
- [elpa] externals/denote d90ea28d00 013/355: Update one-line description, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 0dd4700e32 014/355: Fix typo, ELPA Syncer, 2022/06/26
- [elpa] externals/denote c3674ff813 023/355: Fix typo, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 3790125482 027/355: Remove to-do, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 5744240289 036/355: Remove needless to-do, ELPA Syncer, 2022/06/26
- [elpa] externals/denote aaa691aa15 020/355: Refine front-matter, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 153827f6c8 021/355: Add denote-link, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 21104787f7 024/355: Put link functionality in denote-link.el,
ELPA Syncer <=
- [elpa] externals/denote b951a62245 025/355: Put capture code in denote-org-capture.el, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 9f4a99243c 035/355: Change how org-capture hook is added, ELPA Syncer, 2022/06/26
- [elpa] externals/denote fa6a3315dc 047/355: Add correct group for org capture specifiers, ELPA Syncer, 2022/06/26
- [elpa] externals/denote f33f8a7040 053/355: Rewrite README as a manual, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 251b35d8f5 003/355: Add GPL, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 2aed386b84 006/355: Add denote-org-capture (WORK-IN-PROGRESS), ELPA Syncer, 2022/06/26
- [elpa] externals/denote 0e2cc10fe6 009/355: Improve integration with org-capture-templates, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 1079beb858 017/355: Add todo about file deletion post org-capture, ELPA Syncer, 2022/06/26
- [elpa] externals/denote 27642bee14 026/355: Clarify 'denote' doc string, ELPA Syncer, 2022/06/26
- [elpa] externals/denote ec3847607b 028/355: Remove to-do about file name format, ELPA Syncer, 2022/06/26