From d34bae16376de34f14fca8824556104e8147a99d Mon Sep 17 00:00:00 2001 From: luhuaei Date: Fri, 3 Apr 2020 23:20:43 +0800 Subject: [PATCH 01/32] eaf-interleave: add find-buffer base url function --- app/interleave/eaf-interleave.el | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index da68f89..7283015 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -547,5 +547,19 @@ SORT-ORDER is either 'asc or 'desc." #'>)) ('user-error nil))) +;; utils +(defun eaf-interleave--find-buffer (url) + "find EAF buffer base url" + (let (current-buffer) + (catch 'find-buffer + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (and + (derived-mode-p 'eaf-mode) + (equal eaf--buffer-url url)) + (setq current-buffer buffer) + (throw 'find-buffer t))))) + current-buffer)) + (provide 'eaf-interleave) ;;; interleave.el ends here From 923e25af0a63b90c33587de2592334221af93eee Mon Sep 17 00:00:00 2001 From: luhuaei Date: Fri, 3 Apr 2020 23:29:47 +0800 Subject: [PATCH 02/32] eaf-interleave: remove eaf-interleave-pdf-buffer variable --- app/interleave/eaf-interleave.el | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 7283015..e58ec97 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -141,10 +141,9 @@ split horizontally." (setq eaf-interleave--window-configuration nil) (setq eaf-interleave-org-buffer nil) (setq eaf-interleave--current-pdf-file nil) - (with-current-buffer eaf-interleave-pdf-buffer + (with-current-buffer (eaf-interleave--find-buffer eaf-interleave--current-pdf-file) (eaf-interleave-pdf-mode -1) (eaf-interleave-pdf-kill-buffer)) - (setq eaf-interleave-pdf-buffer nil) )) ;;; Interleave PDF Mode @@ -160,16 +159,12 @@ split horizontally." (when eaf-interleave-pdf-mode ;; if derived mode is eaf. (unless eaf-interleave--current-pdf-file - (setq eaf-interleave--current-pdf-file eaf--buffer-url)) - (setq eaf-interleave-pdf-buffer (get-buffer (file-name-nondirectory eaf-interleave--current-pdf-file))))) + (setq eaf-interleave--current-pdf-file eaf--buffer-url)))) ;; variables (defvar eaf-interleave-org-buffer nil "Org notes buffer name.") -(defvar eaf-interleave-pdf-buffer nil - "Name of PDF buffer associated with `eaf-interleave-org-buffer'.") - (defvar eaf-interleave--window-configuration nil "Variable to store the window configuration before interleave mode was enabled.") @@ -301,17 +296,17 @@ It (possibly) narrows the subtree when found." (defun eaf-interleave-pdf-kill-buffer () "Kill the current converter process and buffer." (interactive) - (when eaf-interleave-pdf-buffer - (kill-buffer eaf-interleave-pdf-buffer))) + (when (eaf-interleave--find-buffer eaf-interleave--current-pdf-file) + (kill-buffer (eaf-interleave--find-buffer eaf-interleave--current-pdf-file)))) (defun eaf-interleave--pdf-viewer-current-page () "get current page index." - (let ((id (buffer-local-value 'eaf--buffer-id eaf-interleave-pdf-buffer))) + (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer eaf-interleave--current-pdf-file)))) (string-to-number (eaf-call "call_function" id "current_page")))) (defun eaf-interleave--pdf-viewer-goto-page (page) "goto page" - (let ((id (buffer-local-value 'eaf--buffer-id eaf-interleave-pdf-buffer))) + (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer eaf-interleave--current-pdf-file)))) (eaf-call "handle_input_message" id "jump_page" page))) (defun eaf-interleave-sync-pdf-page-previous () @@ -461,7 +456,7 @@ buffer." (let ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop)))) (when (and (integerp pdf-page) (> pdf-page 0)) ; The page number needs to be a positive integer (eaf-interleave--narrow-to-subtree) - (with-current-buffer eaf-interleave-pdf-buffer + (with-current-buffer (eaf-interleave--find-buffer eaf-interleave--current-pdf-file) (eaf-interleave--pdf-viewer-goto-page pdf-page)) ))) From 7b146158dae8ca5dbf981c67d10242fec78eed6c Mon Sep 17 00:00:00 2001 From: luhuaei Date: Fri, 3 Apr 2020 23:47:10 +0800 Subject: [PATCH 03/32] eaf-interleave: add eaf--buffer-url as property --- app/interleave/eaf-interleave.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index e58ec97..e81512e 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -424,7 +424,7 @@ Return the position of the newly inserted heading." (funcall change-level))) (point)) -(defun eaf-interleave--create-new-note (page) +(defun eaf-interleave--create-new-note (url page) "Create a new headline for the page PAGE." (let (new-note-position) (with-current-buffer eaf-interleave-org-buffer @@ -433,6 +433,7 @@ Return the position of the newly inserted heading." (let ((position (eaf-interleave--goto-insert-position))) (setq new-note-position (eaf-interleave--insert-heading-respect-content position))) (insert (format "Notes for page %d" page)) + (org-set-property eaf-interleave--pdf-prop url) (org-set-property eaf-interleave--page-note-prop (number-to-string page)) (eaf-interleave--narrow-to-subtree) (org-cycle-hide-drawers t))) @@ -448,7 +449,8 @@ buffer." (position (eaf-interleave--go-to-page-note page))) (if position (eaf-interleave--switch-to-org-buffer t position) - (eaf-interleave--create-new-note page)))) + (eaf-interleave--create-new-note eaf--buffer-url page))) + ) (defun eaf-interleave-sync-pdf-page-current () "Open PDF page for currently visible notes." From 865df75f21dde2f5d5618ff07db8e883bb70d392 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Fri, 3 Apr 2020 23:47:48 +0800 Subject: [PATCH 04/32] eaf-interleave: refactor eaf-interleave-add-note --- app/interleave/eaf-interleave.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index e81512e..8f36493 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -440,11 +440,17 @@ Return the position of the newly inserted heading." (eaf-interleave--switch-to-org-buffer t new-note-position))) (defun eaf-interleave-add-note () - "Add note for the current page. + "Add note for the EAF buffer. -If there are already notes for this page, jump to the notes +If there are already notes for this url, jump to the notes buffer." (interactive) + (cond ((and (derived-mode-p 'eaf-mode) + (equal eaf--buffer-app-name "pdf-viewer")) + (eaf-interleave-pdf-add-note)))) + +(defun eaf-interleave-pdf-add-note () + "EAF pdf-viewer-mode add note" (let* ((page (eaf-interleave--pdf-viewer-current-page)) (position (eaf-interleave--go-to-page-note page))) (if position From c2a8fc055c909012d9abc16a55caae0453682a5f Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 00:06:19 +0800 Subject: [PATCH 05/32] eaf-interleave: remove eaf-interleave--pdf-current-file variable --- app/interleave/eaf-interleave.el | 41 ++++++++++---------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 8f36493..8e9a08b 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -140,12 +140,10 @@ split horizontally." (set-window-configuration eaf-interleave--window-configuration) (setq eaf-interleave--window-configuration nil) (setq eaf-interleave-org-buffer nil) - (setq eaf-interleave--current-pdf-file nil) - (with-current-buffer (eaf-interleave--find-buffer eaf-interleave--current-pdf-file) - (eaf-interleave-pdf-mode -1) - (eaf-interleave-pdf-kill-buffer)) )) +(defun eaf-interleave--close-all ()) + ;;; Interleave PDF Mode ;; Minor mode for the pdf file buffer associated with the notes (defvar eaf-interleave-pdf-mode-map (make-sparse-keymap) @@ -155,11 +153,7 @@ split horizontally." ;;;###autoload (define-minor-mode eaf-interleave-pdf-mode "Interleave view for the pdf." - :keymap eaf-interleave-pdf-mode-map - (when eaf-interleave-pdf-mode - ;; if derived mode is eaf. - (unless eaf-interleave--current-pdf-file - (setq eaf-interleave--current-pdf-file eaf--buffer-url)))) + :keymap eaf-interleave-pdf-mode-map) ;; variables (defvar eaf-interleave-org-buffer nil @@ -168,8 +162,6 @@ split horizontally." (defvar eaf-interleave--window-configuration nil "Variable to store the window configuration before interleave mode was enabled.") -(defvar eaf-interleave--current-pdf-file nil) - (defvar-local eaf-interleave-multi-pdf-notes-file nil "Indicates if the current Org notes file is a multi-pdf notes file.") @@ -189,7 +181,6 @@ SPLIT-WINDOW is a function that actually splits the window, so it must be either (or (eaf-interleave--headline-pdf-path eaf-interleave-org-buffer) (eaf-interleave--find-pdf-path eaf-interleave-org-buffer) (eaf-interleave--handle-parse-pdf-file-name)))) - (setq eaf-interleave--current-pdf-file pdf-file-name) (eaf-interleave--select-split-function) (eaf-interleave--eaf-open-pdf pdf-file-name) pdf-file-name)) @@ -293,20 +284,14 @@ It (possibly) narrows the subtree when found." (recenter))) point))) -(defun eaf-interleave-pdf-kill-buffer () - "Kill the current converter process and buffer." - (interactive) - (when (eaf-interleave--find-buffer eaf-interleave--current-pdf-file) - (kill-buffer (eaf-interleave--find-buffer eaf-interleave--current-pdf-file)))) - -(defun eaf-interleave--pdf-viewer-current-page () +(defun eaf-interleave--pdf-viewer-current-page (url) "get current page index." - (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer eaf-interleave--current-pdf-file)))) + (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) (string-to-number (eaf-call "call_function" id "current_page")))) -(defun eaf-interleave--pdf-viewer-goto-page (page) +(defun eaf-interleave--pdf-viewer-goto-page (url page) "goto page" - (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer eaf-interleave--current-pdf-file)))) + (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) (eaf-call "handle_input_message" id "jump_page" page))) (defun eaf-interleave-sync-pdf-page-previous () @@ -451,7 +436,7 @@ buffer." (defun eaf-interleave-pdf-add-note () "EAF pdf-viewer-mode add note" - (let* ((page (eaf-interleave--pdf-viewer-current-page)) + (let* ((page (eaf-interleave--pdf-viewer-current-page eaf--buffer-url)) (position (eaf-interleave--go-to-page-note page))) (if position (eaf-interleave--switch-to-org-buffer t position) @@ -461,11 +446,12 @@ buffer." (defun eaf-interleave-sync-pdf-page-current () "Open PDF page for currently visible notes." (interactive) - (let ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop)))) + (let ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop))) + (pdf-url (org-entry-get-with-inheritance eaf-interleave--pdf-prop))) (when (and (integerp pdf-page) (> pdf-page 0)) ; The page number needs to be a positive integer (eaf-interleave--narrow-to-subtree) - (with-current-buffer (eaf-interleave--find-buffer eaf-interleave--current-pdf-file) - (eaf-interleave--pdf-viewer-goto-page pdf-page)) + (with-current-buffer (eaf-interleave--find-buffer pdf-url) + (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)) ))) ;;;###autoload @@ -528,8 +514,7 @@ of .pdf)." (when (eaf-interleave--headlines-available-p) (eaf-interleave--sort-notes eaf-interleave-sort-order) (org-overview)) - (eaf-interleave-mode 0)) - (eaf-interleave-pdf-kill-buffer)) + (eaf-interleave-mode 0))) (defun eaf-interleave--headlines-available-p () "True if there are headings in the notes buffer." From 3c7274c8a1234712b291d893031afe494b27aade Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 00:06:46 +0800 Subject: [PATCH 06/32] eaf-interleave: add eaf-interleave--kill-buffer function --- app/interleave/eaf-interleave.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 8e9a08b..6b6ed54 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -549,5 +549,11 @@ SORT-ORDER is either 'asc or 'desc." (throw 'find-buffer t))))) current-buffer)) +(defun eaf-interleave--kill-buffer (url) + "Kill the current converter process and buffer." + (interactive) + (let ((buffer (eaf-interleave--find-buffer url))) + (kill-buffer buffer))) + (provide 'eaf-interleave) ;;; interleave.el ends here From f9cdc2d9cc7439251b882767d79dafd6d4ef2aee Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 00:18:51 +0800 Subject: [PATCH 07/32] eaf-interleave: remove multi pdf file concept --- app/interleave/eaf-interleave.el | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 6b6ed54..0301f8d 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -130,9 +130,6 @@ split horizontally." (when eaf-interleave-disable-narrowing (with-current-buffer eaf-interleave-org-buffer (eaf-interleave--goto-search-position) - (if eaf-interleave-multi-pdf-notes-file - (org-show-subtree) - (show-all)) (org-cycle-hide-drawers 'all))) (eaf-interleave--go-to-page-note 1) (message "EAF Interleave enabled")) @@ -162,9 +159,6 @@ split horizontally." (defvar eaf-interleave--window-configuration nil "Variable to store the window configuration before interleave mode was enabled.") -(defvar-local eaf-interleave-multi-pdf-notes-file nil - "Indicates if the current Org notes file is a multi-pdf notes file.") - (defconst eaf-interleave--page-note-prop "interleave_page_note" "The page note property string.") @@ -209,7 +203,6 @@ SPLIT-WINDOW is a function that actually splits the window, so it must be either (let ((headline (org-element-at-point))) (when (and (equal (org-element-type headline) 'headline) (org-entry-get nil eaf-interleave--pdf-prop)) - (setq eaf-interleave-multi-pdf-notes-file t) (org-entry-get nil eaf-interleave--pdf-prop)))))) (defun eaf-interleave--find-pdf-path (buffer) @@ -244,9 +237,7 @@ based on a combination of `current-prefix-arg' and For multi-pdf notes this is the outermost parent headline. For everything else this is the beginning of the buffer." - (if eaf-interleave-multi-pdf-notes-file - (eaf-interleave--goto-parent-headline eaf-interleave--pdf-prop) - (goto-char (point-min)))) + (goto-char (point-min))) (defun eaf-interleave--go-to-page-note (page) "Look up the notes for the current pdf PAGE. @@ -263,9 +254,6 @@ It (possibly) narrows the subtree when found." (save-excursion (widen) (eaf-interleave--goto-search-position) - (when eaf-interleave-multi-pdf-notes-file - ;; only search the current subtree for notes. See. Issue #16 - (eaf-interleave--narrow-to-subtree t)) (when (re-search-forward (format "^\[ \t\r\]*\:interleave_page_note\: %d$" page) nil t) ;; widen the buffer again for the case it is narrowed from ;; multi-pdf notes search. Kinda ugly I know. Maybe a macro helps? @@ -319,8 +307,6 @@ This shows the next notes and synchronizes the PDF to the right page number." ;; for page. (if (eaf-interleave--goto-parent-headline eaf-interleave--page-note-prop) (org-forward-heading-same-level 1) - (when eaf-interleave-multi-pdf-notes-file - (org-show-subtree)) (outline-next-visible-heading 1)) (eaf-interleave--narrow-to-subtree) (org-show-subtree) @@ -383,11 +369,7 @@ If POSITION is non-nil move point to it." For multi-pdf notes this is the end of the subtree. For everything else this is the end of the buffer" - (if (not eaf-interleave-multi-pdf-notes-file) - (goto-char (point-max)) - (prog1 - (eaf-interleave--goto-parent-headline eaf-interleave--pdf-prop) - (org-end-of-subtree)))) + (goto-char (point-max))) (defun eaf-interleave--insert-heading-respect-content (parent-headline) "Create a new heading in the notes buffer. @@ -397,9 +379,7 @@ PARENT-HEADLINE. Return the position of the newly inserted heading." (org-insert-heading-respect-content) - (let* ((parent-level (if eaf-interleave-multi-pdf-notes-file - (org-element-property :level parent-headline) - 0)) + (let* ((parent-level 0 ) (change-level (if (> (org-element-property :level (org-element-at-point)) (1+ parent-level)) #'org-promote From ed7283b28eb9dd99eee6ab01f90f2348c14a881a Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 00:21:04 +0800 Subject: [PATCH 08/32] eaf-interleave: refactor eaf-interleave--pdf-prop --- app/interleave/eaf-interleave.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 0301f8d..b7ee1b9 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -162,7 +162,7 @@ split horizontally." (defconst eaf-interleave--page-note-prop "interleave_page_note" "The page note property string.") -(defconst eaf-interleave--pdf-prop "interleave_pdf" +(defconst eaf-interleave--url-prop "interleave_url" "The pdf property string.") ;; functions @@ -202,8 +202,8 @@ SPLIT-WINDOW is a function that actually splits the window, so it must be either (save-excursion (let ((headline (org-element-at-point))) (when (and (equal (org-element-type headline) 'headline) - (org-entry-get nil eaf-interleave--pdf-prop)) - (org-entry-get nil eaf-interleave--pdf-prop)))))) + (org-entry-get nil eaf-interleave--url-prop)) + (org-entry-get nil eaf-interleave--url-prop)))))) (defun eaf-interleave--find-pdf-path (buffer) "Search the `interleave_pdf' property in BUFFER and extracts it when found." @@ -398,7 +398,7 @@ Return the position of the newly inserted heading." (let ((position (eaf-interleave--goto-insert-position))) (setq new-note-position (eaf-interleave--insert-heading-respect-content position))) (insert (format "Notes for page %d" page)) - (org-set-property eaf-interleave--pdf-prop url) + (org-set-property eaf-interleave--url-prop url) (org-set-property eaf-interleave--page-note-prop (number-to-string page)) (eaf-interleave--narrow-to-subtree) (org-cycle-hide-drawers t))) @@ -427,7 +427,7 @@ buffer." "Open PDF page for currently visible notes." (interactive) (let ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop))) - (pdf-url (org-entry-get-with-inheritance eaf-interleave--pdf-prop))) + (pdf-url (org-entry-get-with-inheritance eaf-interleave--url-prop))) (when (and (integerp pdf-page) (> pdf-page 0)) ; The page number needs to be a positive integer (eaf-interleave--narrow-to-subtree) (with-current-buffer (eaf-interleave--find-buffer pdf-url) From e2654c3256ed266dd7466da7a50cb5856811f78f Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 00:27:11 +0800 Subject: [PATCH 09/32] eaf-interleave: remove eaf-interleave--goto-insert-position --- app/interleave/eaf-interleave.el | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index b7ee1b9..11dad01 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -355,7 +355,7 @@ If POSITION is non-nil move point to it." (save-restriction (when eaf-interleave-disable-narrowing (eaf-interleave--narrow-to-subtree t)) - (eaf-interleave--goto-insert-position)) + (goto-char (point-max))) ;; Expand again. Sometimes the new content is outside the narrowed ;; region. (org-show-subtree) @@ -364,13 +364,6 @@ If POSITION is non-nil move point to it." (when (not (looking-back "^ *" (line-beginning-position))) (org-return)))) -(defun eaf-interleave--goto-insert-position () - "Move the point to the right insert postion. - -For multi-pdf notes this is the end of the subtree. For everything else -this is the end of the buffer" - (goto-char (point-max))) - (defun eaf-interleave--insert-heading-respect-content (parent-headline) "Create a new heading in the notes buffer. @@ -395,7 +388,7 @@ Return the position of the newly inserted heading." (with-current-buffer eaf-interleave-org-buffer (save-excursion (widen) - (let ((position (eaf-interleave--goto-insert-position))) + (let ((position (goto-char (point-max)))) (setq new-note-position (eaf-interleave--insert-heading-respect-content position))) (insert (format "Notes for page %d" page)) (org-set-property eaf-interleave--url-prop url) From 526f7612936be7cbff238144f25bb6c8cdf3e57d Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 00:54:17 +0800 Subject: [PATCH 10/32] eaf-interleave: support multi pdf file --- app/interleave/eaf-interleave.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 11dad01..d535bda 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -172,9 +172,10 @@ split horizontally." SPLIT-WINDOW is a function that actually splits the window, so it must be either `split-window-right' or `split-window-below'." (let ((pdf-file-name - (or (eaf-interleave--headline-pdf-path eaf-interleave-org-buffer) - (eaf-interleave--find-pdf-path eaf-interleave-org-buffer) - (eaf-interleave--handle-parse-pdf-file-name)))) + (or (org-entry-get-with-inheritance eaf-interleave--url-prop) + (eaf-interleave--headline-pdf-path eaf-interleave-org-buffer) + (eaf-interleave--find-pdf-path eaf-interleave-org-buffer) + (eaf-interleave--handle-parse-pdf-file-name)))) (eaf-interleave--select-split-function) (eaf-interleave--eaf-open-pdf pdf-file-name) pdf-file-name)) @@ -419,12 +420,16 @@ buffer." (defun eaf-interleave-sync-pdf-page-current () "Open PDF page for currently visible notes." (interactive) - (let ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop))) - (pdf-url (org-entry-get-with-inheritance eaf-interleave--url-prop))) - (when (and (integerp pdf-page) (> pdf-page 0)) ; The page number needs to be a positive integer - (eaf-interleave--narrow-to-subtree) - (with-current-buffer (eaf-interleave--find-buffer pdf-url) - (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)) + (let* ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop))) + (pdf-url (org-entry-get-with-inheritance eaf-interleave--url-prop)) + (buffer (eaf-interleave--find-buffer pdf-url))) + (if buffer + (when (and (integerp pdf-page) (> pdf-page 0)) ; The page number needs to be a positive integer + (eaf-interleave--narrow-to-subtree) + (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-pdf-mode"))) + (with-current-buffer buffer + (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page))) + (eaf-interleave--open-file) ))) ;;;###autoload From ba9ffb3a68969d6cc21f37480495280583776f82 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 01:11:43 +0800 Subject: [PATCH 11/32] eaf-interleave: refactor eaf-interleave-sync-* function --- app/interleave/eaf-interleave.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index d535bda..0d9cc36 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -283,7 +283,7 @@ It (possibly) narrows the subtree when found." (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) (eaf-call "handle_input_message" id "jump_page" page))) -(defun eaf-interleave-sync-pdf-page-previous () +(defun eaf-interleave-sync-previous-note () "Move to the previous set of notes. This show the previous notes and synchronizes the PDF to the right page number." (interactive) @@ -294,9 +294,9 @@ This show the previous notes and synchronizes the PDF to the right page number." (eaf-interleave--narrow-to-subtree) (org-show-subtree) (org-cycle-hide-drawers t) - (eaf-interleave-sync-pdf-page-current)) + (eaf-interleave-sync-current-note)) -(defun eaf-interleave-sync-pdf-page-next () +(defun eaf-interleave-sync-next-note () "Move to the next set of notes. This shows the next notes and synchronizes the PDF to the right page number." (interactive) @@ -312,7 +312,7 @@ This shows the next notes and synchronizes the PDF to the right page number." (eaf-interleave--narrow-to-subtree) (org-show-subtree) (org-cycle-hide-drawers t) - (eaf-interleave-sync-pdf-page-current)) + (eaf-interleave-sync-current-note)) (defun eaf-interleave--goto-parent-headline (property) "Traverse the tree until the parent headline. @@ -417,6 +417,13 @@ buffer." (eaf-interleave--create-new-note eaf--buffer-url page))) ) +(defun eaf-interleave-sync-current-note () + "Sync EAF buffer on current note" + (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop))) + (cond ((and (string-prefix-p "/" url) (string-suffix-p "pdf" url t)) + (eaf-interleave-sync-pdf-page-current)))) + ) + (defun eaf-interleave-sync-pdf-page-current () "Open PDF page for currently visible notes." (interactive) From f9bc7e463527604fa53c25c14b5cbd26f40d08ab Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 01:16:30 +0800 Subject: [PATCH 12/32] eaf-interleave: tidy code --- app/interleave/eaf-interleave.el | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 0d9cc36..459c51b 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -192,11 +192,6 @@ SPLIT-WINDOW is a function that actually splits the window, so it must be either (insert "#+INTERLEAVE_PDF: " pdf-file-name))) pdf-file-name)) -(defun eaf-interleave--eaf-open-pdf (pdf-file-name) - "Use EAF PdfViewer open this pdf-file-name document." - (eaf-open pdf-file-name) - (add-hook 'eaf-pdf-viewer-hook 'eaf-interleave-pdf-mode)) - (defun eaf-interleave--headline-pdf-path (buffer) "Return the INTERLEAVE_PDF property of the current headline in BUFFER." (with-current-buffer buffer @@ -273,16 +268,6 @@ It (possibly) narrows the subtree when found." (recenter))) point))) -(defun eaf-interleave--pdf-viewer-current-page (url) - "get current page index." - (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) - (string-to-number (eaf-call "call_function" id "current_page")))) - -(defun eaf-interleave--pdf-viewer-goto-page (url page) - "goto page" - (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) - (eaf-call "handle_input_message" id "jump_page" page))) - (defun eaf-interleave-sync-previous-note () "Move to the previous set of notes. This show the previous notes and synchronizes the PDF to the right page number." @@ -521,6 +506,11 @@ SORT-ORDER is either 'asc or 'desc." ('user-error nil))) ;; utils +(defun eaf-interleave--eaf-open-pdf (pdf-file-name) + "Use EAF PdfViewer open this pdf-file-name document." + (eaf-open pdf-file-name) + (add-hook 'eaf-pdf-viewer-hook 'eaf-interleave-pdf-mode)) + (defun eaf-interleave--find-buffer (url) "find EAF buffer base url" (let (current-buffer) @@ -540,5 +530,15 @@ SORT-ORDER is either 'asc or 'desc." (let ((buffer (eaf-interleave--find-buffer url))) (kill-buffer buffer))) +(defun eaf-interleave--pdf-viewer-current-page (url) + "get current page index." + (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) + (string-to-number (eaf-call "call_function" id "current_page")))) + +(defun eaf-interleave--pdf-viewer-goto-page (url page) + "goto page" + (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) + (eaf-call "handle_input_message" id "jump_page" page))) + (provide 'eaf-interleave) ;;; interleave.el ends here From e32e546ba81eac50b427a263b099cb3229754aaa Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 08:57:01 +0800 Subject: [PATCH 13/32] eaf-interleave: remove eaf-interleave-sort-order --- app/interleave/eaf-interleave.el | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 459c51b..e72ae90 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -64,13 +64,6 @@ as \"/pdf/file/dir/\", \"./notes\" is interpreted as \"/pdf/file/dir/notes/\"." :type '(repeat directory)) -(defcustom eaf-interleave-sort-order 'asc - "Specifiy the notes' sort order in the notes buffer. - -The possible values are 'asc for ascending and 'desc for descending." - :type '(choice (const asc) - (const desc))) - (defcustom eaf-interleave-split-direction 'vertical "Specify how to split the notes buffer." :type '(choice (const vertical) @@ -482,7 +475,6 @@ of .pdf)." (widen) (eaf-interleave--goto-search-position) (when (eaf-interleave--headlines-available-p) - (eaf-interleave--sort-notes eaf-interleave-sort-order) (org-overview)) (eaf-interleave-mode 0))) @@ -491,20 +483,6 @@ of .pdf)." (save-excursion (re-search-forward "^\* .*" nil t))) -(defun eaf-interleave--sort-notes (sort-order) - "Sort notes by interleave_page_property. - -SORT-ORDER is either 'asc or 'desc." - (condition-case nil - (org-sort-entries nil ?f - (lambda () - (let ((page-note (org-entry-get nil "interleave_page_note"))) - (if page-note (string-to-number page-note) -1))) - (if (eq sort-order 'asc) - #'< - #'>)) - ('user-error nil))) - ;; utils (defun eaf-interleave--eaf-open-pdf (pdf-file-name) "Use EAF PdfViewer open this pdf-file-name document." From c0b49ab72fc1eeed28bd99f97003d37d1cc8c1f2 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 08:59:51 +0800 Subject: [PATCH 14/32] eaf-interleave: remove eaf-interleave--goto-search-position --- app/interleave/eaf-interleave.el | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index e72ae90..ccfddd6 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -122,7 +122,7 @@ split horizontally." ;; expand/show all headlines if narrowing is disabled (when eaf-interleave-disable-narrowing (with-current-buffer eaf-interleave-org-buffer - (eaf-interleave--goto-search-position) + (goto-char (point-min)) (org-cycle-hide-drawers 'all))) (eaf-interleave--go-to-page-note 1) (message "EAF Interleave enabled")) @@ -221,13 +221,6 @@ based on a combination of `current-prefix-arg' and (enlarge-window-horizontally eaf-interleave-split-lines))) )) -(defun eaf-interleave--goto-search-position () - "Move point to the search start position. - -For multi-pdf notes this is the outermost parent headline. For everything else -this is the beginning of the buffer." - (goto-char (point-min))) - (defun eaf-interleave--go-to-page-note (page) "Look up the notes for the current pdf PAGE. @@ -242,7 +235,7 @@ It (possibly) narrows the subtree when found." (let (point (window (get-buffer-window (current-buffer) 'visible))) (save-excursion (widen) - (eaf-interleave--goto-search-position) + (goto-char (point-min)) (when (re-search-forward (format "^\[ \t\r\]*\:interleave_page_note\: %d$" page) nil t) ;; widen the buffer again for the case it is narrowed from ;; multi-pdf notes search. Kinda ugly I know. Maybe a macro helps? @@ -473,7 +466,7 @@ of .pdf)." (interactive) (with-current-buffer eaf-interleave-org-buffer (widen) - (eaf-interleave--goto-search-position) + (goto-char (point-min)) (when (eaf-interleave--headlines-available-p) (org-overview)) (eaf-interleave-mode 0))) From 142fffee81383f39a894b793e8d2f93d7341e36f Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 09:02:23 +0800 Subject: [PATCH 15/32] eaf-interleave: rename eaf-interleave--open-pdf --- app/interleave/eaf-interleave.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index ccfddd6..5bbf70f 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -170,7 +170,7 @@ SPLIT-WINDOW is a function that actually splits the window, so it must be either (eaf-interleave--find-pdf-path eaf-interleave-org-buffer) (eaf-interleave--handle-parse-pdf-file-name)))) (eaf-interleave--select-split-function) - (eaf-interleave--eaf-open-pdf pdf-file-name) + (eaf-interleave--open-pdf pdf-file-name) pdf-file-name)) (defun eaf-interleave--handle-parse-pdf-file-name () @@ -477,7 +477,7 @@ of .pdf)." (re-search-forward "^\* .*" nil t))) ;; utils -(defun eaf-interleave--eaf-open-pdf (pdf-file-name) +(defun eaf-interleave--open-pdf (pdf-file-name) "Use EAF PdfViewer open this pdf-file-name document." (eaf-open pdf-file-name) (add-hook 'eaf-pdf-viewer-hook 'eaf-interleave-pdf-mode)) From 27c10a1cbb4aa8b3fff6fefa94f9284c41fe4080 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 09:19:44 +0800 Subject: [PATCH 16/32] eaf-interleave: refactor eaf-interleave-sync-next-note --- app/interleave/eaf-interleave.el | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 5bbf70f..ed66996 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -273,13 +273,7 @@ This shows the next notes and synchronizes the PDF to the right page number." (interactive) (eaf-interleave--switch-to-org-buffer) (widen) - ;; go to the first notes heading if we're not at an headline or if - ;; we're on multi-pdf heading. This is useful to quickly jump to the - ;; notes if they start at page 96 or so. Image you need to skip page - ;; for page. - (if (eaf-interleave--goto-parent-headline eaf-interleave--page-note-prop) - (org-forward-heading-same-level 1) - (outline-next-visible-heading 1)) + (org-forward-heading-same-level 1) (eaf-interleave--narrow-to-subtree) (org-show-subtree) (org-cycle-hide-drawers t) From 448d959f82ec01f827a8ac9eeb9ea6eb1e1fc160 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 09:32:34 +0800 Subject: [PATCH 17/32] eaf-interleave: default don't open file when init mode --- app/interleave/eaf-interleave.el | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index ed66996..bf3df8d 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -117,15 +117,7 @@ split horizontally." (if eaf-interleave-mode (progn (setq eaf-interleave-org-buffer (current-buffer)) - (setq eaf-interleave--window-configuration (current-window-configuration)) - (eaf-interleave--open-file) - ;; expand/show all headlines if narrowing is disabled - (when eaf-interleave-disable-narrowing - (with-current-buffer eaf-interleave-org-buffer - (goto-char (point-min)) - (org-cycle-hide-drawers 'all))) - (eaf-interleave--go-to-page-note 1) - (message "EAF Interleave enabled")) + (setq eaf-interleave--window-configuration (current-window-configuration))) ;; Disable the corresponding minor mode in the PDF file too. (set-window-configuration eaf-interleave--window-configuration) (setq eaf-interleave--window-configuration nil) @@ -384,6 +376,7 @@ buffer." (defun eaf-interleave-sync-current-note () "Sync EAF buffer on current note" + (interactive) (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop))) (cond ((and (string-prefix-p "/" url) (string-suffix-p "pdf" url t)) (eaf-interleave-sync-pdf-page-current)))) @@ -401,7 +394,8 @@ buffer." (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-pdf-mode"))) (with-current-buffer buffer (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page))) - (eaf-interleave--open-file) + (eaf-interleave--select-split-function) + (eaf-interleave--open-pdf pdf-url) ))) ;;;###autoload From 702cc865f11e98b1b6fb98a7992b1127e72565c7 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 09:36:29 +0800 Subject: [PATCH 18/32] eaf-interleave: remove unused function --- app/interleave/eaf-interleave.el | 33 -------------------------------- 1 file changed, 33 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index bf3df8d..0a23ef5 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -151,20 +151,6 @@ split horizontally." "The pdf property string.") ;; functions -(defun eaf-interleave--open-file () - "Opens the pdf file in besides the notes buffer. - -SPLIT-WINDOW is a function that actually splits the window, so it must be either -`split-window-right' or `split-window-below'." - (let ((pdf-file-name - (or (org-entry-get-with-inheritance eaf-interleave--url-prop) - (eaf-interleave--headline-pdf-path eaf-interleave-org-buffer) - (eaf-interleave--find-pdf-path eaf-interleave-org-buffer) - (eaf-interleave--handle-parse-pdf-file-name)))) - (eaf-interleave--select-split-function) - (eaf-interleave--open-pdf pdf-file-name) - pdf-file-name)) - (defun eaf-interleave--handle-parse-pdf-file-name () "When don't parse responsive pdf file on current org file." (let ((pdf-file-name (read-file-name "No INTERLEAVE_PDF property found. Please specify path: " nil nil t))) @@ -177,25 +163,6 @@ SPLIT-WINDOW is a function that actually splits the window, so it must be either (insert "#+INTERLEAVE_PDF: " pdf-file-name))) pdf-file-name)) -(defun eaf-interleave--headline-pdf-path (buffer) - "Return the INTERLEAVE_PDF property of the current headline in BUFFER." - (with-current-buffer buffer - (save-excursion - (let ((headline (org-element-at-point))) - (when (and (equal (org-element-type headline) 'headline) - (org-entry-get nil eaf-interleave--url-prop)) - (org-entry-get nil eaf-interleave--url-prop)))))) - -(defun eaf-interleave--find-pdf-path (buffer) - "Search the `interleave_pdf' property in BUFFER and extracts it when found." - (with-current-buffer buffer - (save-restriction - (widen) - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^#\\+interleave_pdf: \\(.*\\)" nil :noerror) - (match-string 1)))))) - (defun eaf-interleave--select-split-function () "Determine which split function to use. From 666fd197f7fadaa266ab5ff0b7242a4626fda434 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 09:50:27 +0800 Subject: [PATCH 19/32] eaf-interleave: add eaf-interleave-add-file-url support add new url on note if property is none. else modify current url. --- app/interleave/eaf-interleave.el | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 0a23ef5..e15fab5 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -151,17 +151,11 @@ split horizontally." "The pdf property string.") ;; functions -(defun eaf-interleave--handle-parse-pdf-file-name () - "When don't parse responsive pdf file on current org file." - (let ((pdf-file-name (read-file-name "No INTERLEAVE_PDF property found. Please specify path: " nil nil t))) - ;; Check whether we have any entry at point with `org-entry-properties' before - ;; prompting if the user wants multi-pdf. - (if (and (org-entry-properties) (y-or-n-p "Is this multi-pdf? ")) - (org-entry-put (point) "INTERLEAVE_PDF" pdf-file-name) - (save-excursion - (goto-char (point-min)) - (insert "#+INTERLEAVE_PDF: " pdf-file-name))) - pdf-file-name)) +(defun eaf-interleave-add-file-url () + "Add new url on note if property is none. else modify current url" + (interactive) + (let ((url (read-file-name "Please specify path: " nil nil t))) + (org-entry-put (point) eaf-interleave--url-prop url))) (defun eaf-interleave--select-split-function () "Determine which split function to use. From 49e4b0e16133b2d7f9e6d2b46f250acff2debc52 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 10:05:53 +0800 Subject: [PATCH 20/32] eaf-interleave: tidy code --- app/interleave/eaf-interleave.el | 154 +++++++++++++++---------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index e15fab5..58d6dfc 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -85,7 +85,19 @@ taken as columns." "Disable narrowing in notes/org buffer." :type 'boolean) -;;; Interleave +;; variables +(defvar eaf-interleave-org-buffer nil + "Org notes buffer name.") + +(defvar eaf-interleave--window-configuration nil + "Variable to store the window configuration before interleave mode was enabled.") + +(defconst eaf-interleave--page-note-prop "interleave_page_note" + "The page note property string.") + +(defconst eaf-interleave--url-prop "interleave_url" + "The pdf property string.") + ;; Minor mode for the org file buffer containing notes (defvar eaf-interleave-mode-map (make-sparse-keymap) "Keymap while command `eaf-interleave-mode' is active in the org file buffer.") @@ -124,8 +136,6 @@ split horizontally." (setq eaf-interleave-org-buffer nil) )) -(defun eaf-interleave--close-all ()) - ;;; Interleave PDF Mode ;; Minor mode for the pdf file buffer associated with the notes (defvar eaf-interleave-pdf-mode-map (make-sparse-keymap) @@ -137,26 +147,9 @@ split horizontally." "Interleave view for the pdf." :keymap eaf-interleave-pdf-mode-map) -;; variables -(defvar eaf-interleave-org-buffer nil - "Org notes buffer name.") - -(defvar eaf-interleave--window-configuration nil - "Variable to store the window configuration before interleave mode was enabled.") - -(defconst eaf-interleave--page-note-prop "interleave_page_note" - "The page note property string.") - -(defconst eaf-interleave--url-prop "interleave_url" - "The pdf property string.") - -;; functions -(defun eaf-interleave-add-file-url () - "Add new url on note if property is none. else modify current url" - (interactive) - (let ((url (read-file-name "Please specify path: " nil nil t))) - (org-entry-put (point) eaf-interleave--url-prop url))) +;;; functions +;; interleave mode (defun eaf-interleave--select-split-function () "Determine which split function to use. @@ -207,44 +200,12 @@ It (possibly) narrows the subtree when found." (recenter))) point))) -(defun eaf-interleave-sync-previous-note () - "Move to the previous set of notes. -This show the previous notes and synchronizes the PDF to the right page number." - (interactive) - (eaf-interleave--switch-to-org-buffer) - (widen) - (eaf-interleave--goto-parent-headline eaf-interleave--page-note-prop) - (org-backward-heading-same-level 1) - (eaf-interleave--narrow-to-subtree) - (org-show-subtree) - (org-cycle-hide-drawers t) - (eaf-interleave-sync-current-note)) - -(defun eaf-interleave-sync-next-note () - "Move to the next set of notes. -This shows the next notes and synchronizes the PDF to the right page number." +(defun eaf-interleave-add-file-url () + "Add new url on note if property is none. else modify current url" (interactive) - (eaf-interleave--switch-to-org-buffer) - (widen) - (org-forward-heading-same-level 1) - (eaf-interleave--narrow-to-subtree) - (org-show-subtree) - (org-cycle-hide-drawers t) - (eaf-interleave-sync-current-note)) - -(defun eaf-interleave--goto-parent-headline (property) - "Traverse the tree until the parent headline. + (let ((url (read-file-name "Please specify path: " nil nil t))) + (org-entry-put (point) eaf-interleave--url-prop url))) -Consider a headline with property PROPERTY as parent headline." - (catch 'done - (if (and (eql (org-element-type (org-element-at-point)) 'headline) - (org-entry-get (point) property)) - (org-element-at-point) - (condition-case nil - (org-up-element) - ('error - (throw 'done nil))) - (eaf-interleave--goto-parent-headline property)))) (defun eaf-interleave--narrow-to-subtree (&optional force) "Narrow buffer to the current subtree. @@ -316,25 +277,6 @@ Return the position of the newly inserted heading." (org-cycle-hide-drawers t))) (eaf-interleave--switch-to-org-buffer t new-note-position))) -(defun eaf-interleave-add-note () - "Add note for the EAF buffer. - -If there are already notes for this url, jump to the notes -buffer." - (interactive) - (cond ((and (derived-mode-p 'eaf-mode) - (equal eaf--buffer-app-name "pdf-viewer")) - (eaf-interleave-pdf-add-note)))) - -(defun eaf-interleave-pdf-add-note () - "EAF pdf-viewer-mode add note" - (let* ((page (eaf-interleave--pdf-viewer-current-page eaf--buffer-url)) - (position (eaf-interleave--go-to-page-note page))) - (if position - (eaf-interleave--switch-to-org-buffer t position) - (eaf-interleave--create-new-note eaf--buffer-url page))) - ) - (defun eaf-interleave-sync-current-note () "Sync EAF buffer on current note" (interactive) @@ -359,6 +301,64 @@ buffer." (eaf-interleave--open-pdf pdf-url) ))) +(defun eaf-interleave-sync-previous-note () + "Move to the previous set of notes. +This show the previous notes and synchronizes the PDF to the right page number." + (interactive) + (eaf-interleave--switch-to-org-buffer) + (widen) + (eaf-interleave--goto-parent-headline eaf-interleave--page-note-prop) + (org-backward-heading-same-level 1) + (eaf-interleave--narrow-to-subtree) + (org-show-subtree) + (org-cycle-hide-drawers t) + (eaf-interleave-sync-current-note)) + +(defun eaf-interleave--goto-parent-headline (property) + "Traverse the tree until the parent headline. + +Consider a headline with property PROPERTY as parent headline." + (catch 'done + (if (and (eql (org-element-type (org-element-at-point)) 'headline) + (org-entry-get (point) property)) + (org-element-at-point) + (condition-case nil + (org-up-element) + ('error + (throw 'done nil))) + (eaf-interleave--goto-parent-headline property)))) + +(defun eaf-interleave-sync-next-note () + "Move to the next set of notes. +This shows the next notes and synchronizes the PDF to the right page number." + (interactive) + (eaf-interleave--switch-to-org-buffer) + (widen) + (org-forward-heading-same-level 1) + (eaf-interleave--narrow-to-subtree) + (org-show-subtree) + (org-cycle-hide-drawers t) + (eaf-interleave-sync-current-note)) + +(defun eaf-interleave-add-note () + "Add note for the EAF buffer. + +If there are already notes for this url, jump to the notes +buffer." + (interactive) + (cond ((and (derived-mode-p 'eaf-mode) + (equal eaf--buffer-app-name "pdf-viewer")) + (eaf-interleave-pdf-add-note)))) + +(defun eaf-interleave-pdf-add-note () + "EAF pdf-viewer-mode add note" + (let* ((page (eaf-interleave--pdf-viewer-current-page eaf--buffer-url)) + (position (eaf-interleave--go-to-page-note page))) + (if position + (eaf-interleave--switch-to-org-buffer t position) + (eaf-interleave--create-new-note eaf--buffer-url page))) + ) + ;;;###autoload (defun eaf-interleave-open-notes-file-for-pdf () "Open the notes org file for the current pdf file if it exists. From 1ac2d1f0c1fc36cbccf318605b09600ab5399c81 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 10:14:45 +0800 Subject: [PATCH 21/32] eaf-interleave: add new pdf url, default page is 1 --- app/interleave/eaf-interleave.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 58d6dfc..67f8a64 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -204,7 +204,8 @@ It (possibly) narrows the subtree when found." "Add new url on note if property is none. else modify current url" (interactive) (let ((url (read-file-name "Please specify path: " nil nil t))) - (org-entry-put (point) eaf-interleave--url-prop url))) + (org-entry-put (point) eaf-interleave--url-prop url) + (org-entry-put (point) eaf-interleave--page-note-prop "1"))) (defun eaf-interleave--narrow-to-subtree (&optional force) From 93a734a8f7ac92dad9c2e89f31852df4aa42197e Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 10:25:34 +0800 Subject: [PATCH 22/32] eaf-interleave: remove default page on pdf, because has cache on pdfViewer --- app/interleave/eaf-interleave.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 67f8a64..39399cd 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -204,8 +204,7 @@ It (possibly) narrows the subtree when found." "Add new url on note if property is none. else modify current url" (interactive) (let ((url (read-file-name "Please specify path: " nil nil t))) - (org-entry-put (point) eaf-interleave--url-prop url) - (org-entry-put (point) eaf-interleave--page-note-prop "1"))) + (org-entry-put (point) eaf-interleave--url-prop url))) (defun eaf-interleave--narrow-to-subtree (&optional force) @@ -289,15 +288,16 @@ Return the position of the newly inserted heading." (defun eaf-interleave-sync-pdf-page-current () "Open PDF page for currently visible notes." (interactive) - (let* ((pdf-page (string-to-number (org-entry-get-with-inheritance eaf-interleave--page-note-prop))) + (let* ((pdf-page (org-entry-get-with-inheritance eaf-interleave--page-note-prop)) (pdf-url (org-entry-get-with-inheritance eaf-interleave--url-prop)) (buffer (eaf-interleave--find-buffer pdf-url))) (if buffer - (when (and (integerp pdf-page) (> pdf-page 0)) ; The page number needs to be a positive integer + (progn (eaf-interleave--narrow-to-subtree) (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-pdf-mode"))) - (with-current-buffer buffer - (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page))) + (when pdf-page + (with-current-buffer buffer + (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)))) (eaf-interleave--select-split-function) (eaf-interleave--open-pdf pdf-url) ))) From 2c8a295908d55473bedabb6e9b4371491114f08f Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 10:53:08 +0800 Subject: [PATCH 23/32] eaf-interleave: add eaf-interleave--ensure-buffer-window --- app/interleave/eaf-interleave.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 39399cd..439e8c5 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -295,9 +295,10 @@ Return the position of the newly inserted heading." (progn (eaf-interleave--narrow-to-subtree) (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-pdf-mode"))) + (eaf-interleave--ensure-buffer-window buffer) (when pdf-page (with-current-buffer buffer - (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)))) + (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)))) (eaf-interleave--select-split-function) (eaf-interleave--open-pdf pdf-url) ))) @@ -461,5 +462,12 @@ of .pdf)." (let ((id (buffer-local-value 'eaf--buffer-id (eaf-interleave--find-buffer url)))) (eaf-call "handle_input_message" id "jump_page" page))) +(defun eaf-interleave--ensure-buffer-window (buffer) + "If BUFFER don't display, will use other window display" + (if (get-buffer-window buffer) + nil + (eaf-interleave--select-split-function) + (switch-to-buffer buffer))) + (provide 'eaf-interleave) ;;; interleave.el ends here From abfb7ebf13e60ffde334e280df2bf02fc056d133 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 11:12:29 +0800 Subject: [PATCH 24/32] eaf-interleave: rename eaf-interleave--pdf-add-note --- app/interleave/eaf-interleave.el | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 439e8c5..af7ae2e 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -348,11 +348,14 @@ This shows the next notes and synchronizes the PDF to the right page number." If there are already notes for this url, jump to the notes buffer." (interactive) - (cond ((and (derived-mode-p 'eaf-mode) - (equal eaf--buffer-app-name "pdf-viewer")) - (eaf-interleave-pdf-add-note)))) + (if (derived-mode-p 'eaf-mode) + (cond ((equal eaf--buffer-app-name "pdf-viewer") + (eaf-interleave--pdf-add-note)) + ((equal eaf--buffer-app-name "browser") + (eaf-interleave--browser-add-note))) + )) -(defun eaf-interleave-pdf-add-note () +(defun eaf-interleave--pdf-add-note () "EAF pdf-viewer-mode add note" (let* ((page (eaf-interleave--pdf-viewer-current-page eaf--buffer-url)) (position (eaf-interleave--go-to-page-note page))) From 9c6f29ba74a2720b1950294f6eba687d44af1656 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 11:34:45 +0800 Subject: [PATCH 25/32] eaf-interleave: try add browser mode --- app/interleave/eaf-interleave.el | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index af7ae2e..1c4582a 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -136,17 +136,14 @@ split horizontally." (setq eaf-interleave-org-buffer nil) )) -;;; Interleave PDF Mode -;; Minor mode for the pdf file buffer associated with the notes -(defvar eaf-interleave-pdf-mode-map (make-sparse-keymap) - "Keymap while command `eaf-interleave-pdf-mode' is active in the pdf file buffer." +(defvar eaf-interleave-app-mode-map (make-sparse-keymap) + "Keymap while command `eaf-interleave-app-mode' is active." ) ;;;###autoload -(define-minor-mode eaf-interleave-pdf-mode - "Interleave view for the pdf." - :keymap eaf-interleave-pdf-mode-map) - +(define-minor-mode eaf-interleave-app-mode + "Interleave view for the EAF app." + :keymap eaf-interleave-app-mode-map) ;;; functions ;; interleave mode @@ -262,17 +259,19 @@ Return the position of the newly inserted heading." (funcall change-level))) (point)) -(defun eaf-interleave--create-new-note (url page) - "Create a new headline for the page PAGE." +(defun eaf-interleave--create-new-note (url &optional title page) + "Create a new headline for current EAF url." (let (new-note-position) (with-current-buffer eaf-interleave-org-buffer (save-excursion (widen) (let ((position (goto-char (point-max)))) (setq new-note-position (eaf-interleave--insert-heading-respect-content position))) - (insert (format "Notes for page %d" page)) (org-set-property eaf-interleave--url-prop url) - (org-set-property eaf-interleave--page-note-prop (number-to-string page)) + (when title + (insert (format "Notes for %s" title))) + (when page + (org-set-property eaf-interleave--page-note-prop (number-to-string page))) (eaf-interleave--narrow-to-subtree) (org-cycle-hide-drawers t))) (eaf-interleave--switch-to-org-buffer t new-note-position))) @@ -361,9 +360,13 @@ buffer." (position (eaf-interleave--go-to-page-note page))) (if position (eaf-interleave--switch-to-org-buffer t position) - (eaf-interleave--create-new-note eaf--buffer-url page))) + (eaf-interleave--create-new-note eaf--buffer-url eaf--buffer-app-name page))) ) +(defun eaf-interleave--browser-add-note () + "EAF browser add note" + (eaf-interleave--create-new-note eaf--buffer-url eaf--buffer-app-name)) + ;;;###autoload (defun eaf-interleave-open-notes-file-for-pdf () "Open the notes org file for the current pdf file if it exists. From 6567359923f2ec7b8f7cc2ec70aa432eb5d5c7d3 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 11:52:25 +0800 Subject: [PATCH 26/32] eaf-interleave: support browser mode --- app/interleave/eaf-interleave.el | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 1c4582a..275b35a 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -281,9 +281,20 @@ Return the position of the newly inserted heading." (interactive) (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop))) (cond ((and (string-prefix-p "/" url) (string-suffix-p "pdf" url t)) - (eaf-interleave-sync-pdf-page-current)))) + (eaf-interleave-sync-pdf-page-current)) + ((string-prefix-p "http" url) + (eaf-interleave-sync-browser-url-current)))) ) +(defun eaf-interleave-sync-browser-url-current () + "Sync current note url for browser" + (let* ((web-url (org-entry-get-with-inheritance eaf-interleave--url-prop)) + (buffer (eaf-interleave--find-buffer web-url))) + (if buffer + (eaf-interleave--display-buffer buffer) + (eaf-interleave--select-split-function) + (eaf-interleave--open-web-url web-url)))) + (defun eaf-interleave-sync-pdf-page-current () "Open PDF page for currently visible notes." (interactive) @@ -292,9 +303,7 @@ Return the position of the newly inserted heading." (buffer (eaf-interleave--find-buffer pdf-url))) (if buffer (progn - (eaf-interleave--narrow-to-subtree) - (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-pdf-mode"))) - (eaf-interleave--ensure-buffer-window buffer) + (eaf-interleave--display-buffer buffer) (when pdf-page (with-current-buffer buffer (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)))) @@ -302,6 +311,12 @@ Return the position of the newly inserted heading." (eaf-interleave--open-pdf pdf-url) ))) +(defun eaf-interleave--display-buffer (buffer) + "Use already used window display buffer" + (eaf-interleave--narrow-to-subtree) + (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-app-mode"))) + (eaf-interleave--ensure-buffer-window buffer)) + (defun eaf-interleave-sync-previous-note () "Move to the previous set of notes. This show the previous notes and synchronizes the PDF to the right page number." @@ -437,7 +452,12 @@ of .pdf)." (defun eaf-interleave--open-pdf (pdf-file-name) "Use EAF PdfViewer open this pdf-file-name document." (eaf-open pdf-file-name) - (add-hook 'eaf-pdf-viewer-hook 'eaf-interleave-pdf-mode)) + (add-hook 'eaf-pdf-viewer-hook 'eaf-interleave-app-mode)) + +(defun eaf-interleave--open-web-url (url) + "Use EAF Browser open current note web address" + (eaf-open-browser url) + (add-hook 'eaf-browser-hook 'eaf-interleave-app-mode)) (defun eaf-interleave--find-buffer (url) "find EAF buffer base url" From 4995c0e8bbee4fa69267154033de9e6ce55002b9 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 11:59:41 +0800 Subject: [PATCH 27/32] eaf-interleave: tidy code --- app/interleave/eaf-interleave.el | 267 +++++++++++++++---------------- 1 file changed, 133 insertions(+), 134 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 275b35a..0e6f687 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -146,7 +146,139 @@ split horizontally." :keymap eaf-interleave-app-mode-map) ;;; functions -;; interleave mode +;; interactive +(defun eaf-interleave-sync-current-note () + "Sync EAF buffer on current note" + (interactive) + (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop))) + (cond ((and (string-prefix-p "/" url) (string-suffix-p "pdf" url t)) + (eaf-interleave-sync-pdf-page-current)) + ((string-prefix-p "http" url) + (eaf-interleave-sync-browser-url-current)))) + ) + +(defun eaf-interleave-sync-pdf-page-current () + "Open PDF page for currently visible notes." + (interactive) + (let* ((pdf-page (org-entry-get-with-inheritance eaf-interleave--page-note-prop)) + (pdf-url (org-entry-get-with-inheritance eaf-interleave--url-prop)) + (buffer (eaf-interleave--find-buffer pdf-url))) + (if buffer + (progn + (eaf-interleave--display-buffer buffer) + (when pdf-page + (with-current-buffer buffer + (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)))) + (eaf-interleave--select-split-function) + (eaf-interleave--open-pdf pdf-url) + ))) + +(defun eaf-interleave-sync-next-note () + "Move to the next set of notes. +This shows the next notes and synchronizes the PDF to the right page number." + (interactive) + (eaf-interleave--switch-to-org-buffer) + (widen) + (org-forward-heading-same-level 1) + (eaf-interleave--narrow-to-subtree) + (org-show-subtree) + (org-cycle-hide-drawers t) + (eaf-interleave-sync-current-note)) + +(defun eaf-interleave-add-note () + "Add note for the EAF buffer. + +If there are already notes for this url, jump to the notes +buffer." + (interactive) + (if (derived-mode-p 'eaf-mode) + (cond ((equal eaf--buffer-app-name "pdf-viewer") + (eaf-interleave--pdf-add-note)) + ((equal eaf--buffer-app-name "browser") + (eaf-interleave--browser-add-note))) + )) + +(defun eaf-interleave-add-file-url () + "Add new url on note if property is none. else modify current url" + (interactive) + (let ((url (read-file-name "Please specify path: " nil nil t))) + (org-entry-put (point) eaf-interleave--url-prop url))) + +(defun eaf-interleave-sync-previous-note () + "Move to the previous set of notes. +This show the previous notes and synchronizes the PDF to the right page number." + (interactive) + (eaf-interleave--switch-to-org-buffer) + (widen) + (eaf-interleave--goto-parent-headline eaf-interleave--page-note-prop) + (org-backward-heading-same-level 1) + (eaf-interleave--narrow-to-subtree) + (org-show-subtree) + (org-cycle-hide-drawers t) + (eaf-interleave-sync-current-note)) + +;;;###autoload +(defun eaf-interleave-open-notes-file-for-pdf () + "Open the notes org file for the current pdf file if it exists. +Else create it. + +It is assumed that the notes org file will have the exact same base name +as the pdf file (just that the notes file will have a .org extension instead +of .pdf)." + (interactive) + (when (derived-mode-p 'eaf-mode) + (let* ((pdf-file-name (eaf-get-path-or-url)) + (org-file-name-sans-directory (concat (file-name-base pdf-file-name) ".org")) + org-file-create-dir + (cnt 0) + try-org-file-name + (org-file-name (catch 'break + (dolist (dir eaf-interleave-org-notes-dir-list) + ;; If dir is "." or begins with "./", replace + ;; the "." or "./" with the pdf dir name + (setq dir (replace-regexp-in-string + "^\\(\\.$\\|\\./\\).*" + (file-name-directory pdf-file-name) + dir nil nil 1)) + (when (= cnt 0) + ;; In the event the org file is needed to be + ;; created, it will be created in the directory + ;; listed as the first element in + ;; `eaf-interleave-org-notes-dir-list' + (setq org-file-create-dir dir)) + (setq cnt (1+ cnt)) + (setq try-org-file-name (locate-file + org-file-name-sans-directory + (list dir))) + (when try-org-file-name + ;; return the first match + (throw 'break try-org-file-name)))))) + ;; Create the notes org file if it does not exist + (when (null org-file-name) + (setq org-file-name (if (null eaf-interleave-org-notes-dir-list) + (read-file-name "Path: " "~/") + (progn + (when (null (file-exists-p org-file-create-dir)) + (make-directory org-file-create-dir)) + (expand-file-name org-file-name-sans-directory + org-file-create-dir)))) + (with-temp-file org-file-name + (insert "#+INTERLEAVE_PDF: " pdf-file-name))) + ;; Open the notes org file and enable `eaf-interleave-mode' + (find-file org-file-name) + (eaf-interleave-mode)))) + +(defun eaf-interleave-quit () + "Quit interleave mode." + (interactive) + (with-current-buffer eaf-interleave-org-buffer + (widen) + (goto-char (point-min)) + (when (eaf-interleave--headlines-available-p) + (org-overview)) + (eaf-interleave-mode 0))) + +;; (defun eaf-interleave--select-split-function () "Determine which split function to use. @@ -197,13 +329,6 @@ It (possibly) narrows the subtree when found." (recenter))) point))) -(defun eaf-interleave-add-file-url () - "Add new url on note if property is none. else modify current url" - (interactive) - (let ((url (read-file-name "Please specify path: " nil nil t))) - (org-entry-put (point) eaf-interleave--url-prop url))) - - (defun eaf-interleave--narrow-to-subtree (&optional force) "Narrow buffer to the current subtree. @@ -276,16 +401,6 @@ Return the position of the newly inserted heading." (org-cycle-hide-drawers t))) (eaf-interleave--switch-to-org-buffer t new-note-position))) -(defun eaf-interleave-sync-current-note () - "Sync EAF buffer on current note" - (interactive) - (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop))) - (cond ((and (string-prefix-p "/" url) (string-suffix-p "pdf" url t)) - (eaf-interleave-sync-pdf-page-current)) - ((string-prefix-p "http" url) - (eaf-interleave-sync-browser-url-current)))) - ) - (defun eaf-interleave-sync-browser-url-current () "Sync current note url for browser" (let* ((web-url (org-entry-get-with-inheritance eaf-interleave--url-prop)) @@ -295,41 +410,12 @@ Return the position of the newly inserted heading." (eaf-interleave--select-split-function) (eaf-interleave--open-web-url web-url)))) -(defun eaf-interleave-sync-pdf-page-current () - "Open PDF page for currently visible notes." - (interactive) - (let* ((pdf-page (org-entry-get-with-inheritance eaf-interleave--page-note-prop)) - (pdf-url (org-entry-get-with-inheritance eaf-interleave--url-prop)) - (buffer (eaf-interleave--find-buffer pdf-url))) - (if buffer - (progn - (eaf-interleave--display-buffer buffer) - (when pdf-page - (with-current-buffer buffer - (eaf-interleave--pdf-viewer-goto-page pdf-url pdf-page)))) - (eaf-interleave--select-split-function) - (eaf-interleave--open-pdf pdf-url) - ))) - (defun eaf-interleave--display-buffer (buffer) "Use already used window display buffer" (eaf-interleave--narrow-to-subtree) (display-buffer-reuse-mode-window buffer '(("mode" . "eaf-interleave-app-mode"))) (eaf-interleave--ensure-buffer-window buffer)) -(defun eaf-interleave-sync-previous-note () - "Move to the previous set of notes. -This show the previous notes and synchronizes the PDF to the right page number." - (interactive) - (eaf-interleave--switch-to-org-buffer) - (widen) - (eaf-interleave--goto-parent-headline eaf-interleave--page-note-prop) - (org-backward-heading-same-level 1) - (eaf-interleave--narrow-to-subtree) - (org-show-subtree) - (org-cycle-hide-drawers t) - (eaf-interleave-sync-current-note)) - (defun eaf-interleave--goto-parent-headline (property) "Traverse the tree until the parent headline. @@ -344,31 +430,6 @@ Consider a headline with property PROPERTY as parent headline." (throw 'done nil))) (eaf-interleave--goto-parent-headline property)))) -(defun eaf-interleave-sync-next-note () - "Move to the next set of notes. -This shows the next notes and synchronizes the PDF to the right page number." - (interactive) - (eaf-interleave--switch-to-org-buffer) - (widen) - (org-forward-heading-same-level 1) - (eaf-interleave--narrow-to-subtree) - (org-show-subtree) - (org-cycle-hide-drawers t) - (eaf-interleave-sync-current-note)) - -(defun eaf-interleave-add-note () - "Add note for the EAF buffer. - -If there are already notes for this url, jump to the notes -buffer." - (interactive) - (if (derived-mode-p 'eaf-mode) - (cond ((equal eaf--buffer-app-name "pdf-viewer") - (eaf-interleave--pdf-add-note)) - ((equal eaf--buffer-app-name "browser") - (eaf-interleave--browser-add-note))) - )) - (defun eaf-interleave--pdf-add-note () "EAF pdf-viewer-mode add note" (let* ((page (eaf-interleave--pdf-viewer-current-page eaf--buffer-url)) @@ -382,67 +443,6 @@ buffer." "EAF browser add note" (eaf-interleave--create-new-note eaf--buffer-url eaf--buffer-app-name)) -;;;###autoload -(defun eaf-interleave-open-notes-file-for-pdf () - "Open the notes org file for the current pdf file if it exists. -Else create it. - -It is assumed that the notes org file will have the exact same base name -as the pdf file (just that the notes file will have a .org extension instead -of .pdf)." - (interactive) - (when (derived-mode-p 'eaf-mode) - (let* ((pdf-file-name (eaf-get-path-or-url)) - (org-file-name-sans-directory (concat (file-name-base pdf-file-name) ".org")) - org-file-create-dir - (cnt 0) - try-org-file-name - (org-file-name (catch 'break - (dolist (dir eaf-interleave-org-notes-dir-list) - ;; If dir is "." or begins with "./", replace - ;; the "." or "./" with the pdf dir name - (setq dir (replace-regexp-in-string - "^\\(\\.$\\|\\./\\).*" - (file-name-directory pdf-file-name) - dir nil nil 1)) - (when (= cnt 0) - ;; In the event the org file is needed to be - ;; created, it will be created in the directory - ;; listed as the first element in - ;; `eaf-interleave-org-notes-dir-list' - (setq org-file-create-dir dir)) - (setq cnt (1+ cnt)) - (setq try-org-file-name (locate-file - org-file-name-sans-directory - (list dir))) - (when try-org-file-name - ;; return the first match - (throw 'break try-org-file-name)))))) - ;; Create the notes org file if it does not exist - (when (null org-file-name) - (setq org-file-name (if (null eaf-interleave-org-notes-dir-list) - (read-file-name "Path: " "~/") - (progn - (when (null (file-exists-p org-file-create-dir)) - (make-directory org-file-create-dir)) - (expand-file-name org-file-name-sans-directory - org-file-create-dir)))) - (with-temp-file org-file-name - (insert "#+INTERLEAVE_PDF: " pdf-file-name))) - ;; Open the notes org file and enable `eaf-interleave-mode' - (find-file org-file-name) - (eaf-interleave-mode)))) - -(defun eaf-interleave-quit () - "Quit interleave mode." - (interactive) - (with-current-buffer eaf-interleave-org-buffer - (widen) - (goto-char (point-min)) - (when (eaf-interleave--headlines-available-p) - (org-overview)) - (eaf-interleave-mode 0))) - (defun eaf-interleave--headlines-available-p () "True if there are headings in the notes buffer." (save-excursion @@ -474,7 +474,6 @@ of .pdf)." (defun eaf-interleave--kill-buffer (url) "Kill the current converter process and buffer." - (interactive) (let ((buffer (eaf-interleave--find-buffer url))) (kill-buffer buffer))) From f560df741a4335c5573073f82950c5626e8799e1 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 15:46:39 +0800 Subject: [PATCH 28/32] eaf-interleave: refactor eaf-interleave-open-notes-file --- app/interleave/eaf-interleave.el | 103 ++++++++++++++++++------------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 0e6f687..a33ef23 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -217,56 +217,43 @@ This show the previous notes and synchronizes the PDF to the right page number." (org-cycle-hide-drawers t) (eaf-interleave-sync-current-note)) +(defun eaf-interleave-open-notes-file () + "Find current EAF url corresponding note files if exists" + (interactive) + (if (derived-mode-p 'eaf-mode) + (cond ((equal eaf--buffer-app-name "pdf-viewer") + (eaf-interleave--open-notes-file-for-pdf)) + ((equal eaf--buffer-app-name "browser") + (eaf-interleave--open-notes-file-for-browser)))) + ) + ;;;###autoload -(defun eaf-interleave-open-notes-file-for-pdf () +(defun eaf-interleave--open-notes-file-for-pdf () "Open the notes org file for the current pdf file if it exists. Else create it. It is assumed that the notes org file will have the exact same base name as the pdf file (just that the notes file will have a .org extension instead of .pdf)." - (interactive) - (when (derived-mode-p 'eaf-mode) - (let* ((pdf-file-name (eaf-get-path-or-url)) - (org-file-name-sans-directory (concat (file-name-base pdf-file-name) ".org")) - org-file-create-dir - (cnt 0) - try-org-file-name - (org-file-name (catch 'break - (dolist (dir eaf-interleave-org-notes-dir-list) - ;; If dir is "." or begins with "./", replace - ;; the "." or "./" with the pdf dir name - (setq dir (replace-regexp-in-string - "^\\(\\.$\\|\\./\\).*" - (file-name-directory pdf-file-name) - dir nil nil 1)) - (when (= cnt 0) - ;; In the event the org file is needed to be - ;; created, it will be created in the directory - ;; listed as the first element in - ;; `eaf-interleave-org-notes-dir-list' - (setq org-file-create-dir dir)) - (setq cnt (1+ cnt)) - (setq try-org-file-name (locate-file - org-file-name-sans-directory - (list dir))) - (when try-org-file-name - ;; return the first match - (throw 'break try-org-file-name)))))) - ;; Create the notes org file if it does not exist - (when (null org-file-name) - (setq org-file-name (if (null eaf-interleave-org-notes-dir-list) - (read-file-name "Path: " "~/") - (progn - (when (null (file-exists-p org-file-create-dir)) - (make-directory org-file-create-dir)) - (expand-file-name org-file-name-sans-directory - org-file-create-dir)))) - (with-temp-file org-file-name - (insert "#+INTERLEAVE_PDF: " pdf-file-name))) - ;; Open the notes org file and enable `eaf-interleave-mode' - (find-file org-file-name) - (eaf-interleave-mode)))) + (let ((org-file (concat (file-name-base eaf--buffer-url) ".org")) + (default-dir (nth 0 eaf-interleave-org-notes-dir-list)) + (org-file-path (eaf-interleave--find-match-org eaf-interleave-org-notes-dir-list eaf--buffer-url)) + (buffer (eaf-interleave--find-buffer eaf--buffer-url))) + ;; Create the notes org file if it does not exist + (unless org-file-path + (setq org-file-path (eaf-interleave--ensure-org-file-exist eaf-interleave-org-notes-dir-list org-file))) + ;; Open the notes org file and enable `eaf-interleave-mode' + (find-file org-file-path) + (eaf-interleave-mode) + (eaf-interleave--select-split-function) + (switch-to-buffer buffer) + )) + +(defun eaf-interleave--open-notes-file-for-browser () + "Find current open interleave-mode org file, if exists, else will create new org file with URL." + (if eaf-interleave-org-buffer + nil + nil)) (defun eaf-interleave-quit () "Quit interleave mode." @@ -494,5 +481,35 @@ Consider a headline with property PROPERTY as parent headline." (eaf-interleave--select-split-function) (switch-to-buffer buffer))) +(defun eaf-interleave--parse-current-dir (dir url) + "If dir is '.' or begins with './', replace the '.' or './' with the current url name" + (replace-regexp-in-string + "^\\(\\.$\\|\\./\\).*" + (file-name-directory url) + dir nil nil 1)) + +(defun eaf-interleave--find-match-org (dir-list url) + "Find corresponding org file base url on dir list" + (let ((org-file (concat (file-name-base url) ".org")) + path) + (catch 'break + (dolist (dir dir-list) + (setq dir (eaf-interleave--parse-current-dir dir url)) + (setq path (locate-file org-file (list dir))) + (when path + ;; return the first match + (throw 'break path)))) + path)) + +(defun eaf-interleave--ensure-org-file-exist (dir-list file-name) + "If the org file directory exist return this path, else created directory." + (let ((default-dir (nth 0 dir-list))) + (if dir-list + (progn + (unless (file-exists-p default-dir) + (make-directory default-dir)) + (expand-file-name file-name default-dir)) + (read-file-name "Path for org file: " "~/")))) + (provide 'eaf-interleave) ;;; interleave.el ends here From 965aea3fea0441971de9e5d12791ecd3d9be3d02 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 16:28:32 +0800 Subject: [PATCH 29/32] eaf-interleave: add eaf-interleave--open-notes-file-for-app --- app/interleave/eaf-interleave.el | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index a33ef23..e69dd4a 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -137,8 +137,7 @@ split horizontally." )) (defvar eaf-interleave-app-mode-map (make-sparse-keymap) - "Keymap while command `eaf-interleave-app-mode' is active." - ) + "Keymap while command `eaf-interleave-app-mode' is active.") ;;;###autoload (define-minor-mode eaf-interleave-app-mode @@ -230,13 +229,25 @@ This show the previous notes and synchronizes the PDF to the right page number." ;;;###autoload (defun eaf-interleave--open-notes-file-for-pdf () "Open the notes org file for the current pdf file if it exists. -Else create it. +Else create it. It is assumed that the notes org file will have +the exact same base name as the pdf file (just that the notes +file will have a .org extension instead of .pdf)." + (let ((org-file (concat (file-name-base eaf--buffer-url) ".org"))) + (eaf-interleave--open-notes-file-for-app org-file))) -It is assumed that the notes org file will have the exact same base name -as the pdf file (just that the notes file will have a .org extension instead -of .pdf)." - (let ((org-file (concat (file-name-base eaf--buffer-url) ".org")) - (default-dir (nth 0 eaf-interleave-org-notes-dir-list)) +(defun eaf-interleave--open-notes-file-for-browser () + "Find current open interleave-mode org file, if exists, else +will create new org file with URL. It is assumed that the notes +org file will have the exact sam base name as the url domain." + (unless (buffer-live-p eaf-interleave-org-buffer) + (let* ((domain (url-domain (url-generic-parse-url eaf--buffer-url))) + (org-file (concat domain ".org"))) + (eaf-interleave--open-notes-file-for-app org-file)))) + +(defun eaf-interleave--open-notes-file-for-app (org-file) + "Open the notes org file for the current url if it exists. +Else create it." + (let ((default-dir (nth 0 eaf-interleave-org-notes-dir-list)) (org-file-path (eaf-interleave--find-match-org eaf-interleave-org-notes-dir-list eaf--buffer-url)) (buffer (eaf-interleave--find-buffer eaf--buffer-url))) ;; Create the notes org file if it does not exist @@ -249,12 +260,6 @@ of .pdf)." (switch-to-buffer buffer) )) -(defun eaf-interleave--open-notes-file-for-browser () - "Find current open interleave-mode org file, if exists, else will create new org file with URL." - (if eaf-interleave-org-buffer - nil - nil)) - (defun eaf-interleave-quit () "Quit interleave mode." (interactive) From efce2a4bfe91dc6202b8878097c51fb1e987077e Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 18:31:24 +0800 Subject: [PATCH 30/32] eaf-interleave: tidy code --- app/interleave/eaf-interleave.el | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index e69dd4a..682d0ea 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -226,6 +226,16 @@ This show the previous notes and synchronizes the PDF to the right page number." (eaf-interleave--open-notes-file-for-browser)))) ) +(defun eaf-interleave-quit () + "Quit interleave mode." + (interactive) + (with-current-buffer eaf-interleave-org-buffer + (widen) + (goto-char (point-min)) + (when (eaf-interleave--headlines-available-p) + (org-overview)) + (eaf-interleave-mode 0))) + ;;;###autoload (defun eaf-interleave--open-notes-file-for-pdf () "Open the notes org file for the current pdf file if it exists. @@ -260,17 +270,6 @@ Else create it." (switch-to-buffer buffer) )) -(defun eaf-interleave-quit () - "Quit interleave mode." - (interactive) - (with-current-buffer eaf-interleave-org-buffer - (widen) - (goto-char (point-min)) - (when (eaf-interleave--headlines-available-p) - (org-overview)) - (eaf-interleave-mode 0))) - -;; (defun eaf-interleave--select-split-function () "Determine which split function to use. From 0f7ec384869bd16033258fe5db3d56d12c4261ec Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 18:32:22 +0800 Subject: [PATCH 31/32] eaf-interleave: fix multi pdf with same page failed --- app/interleave/eaf-interleave.el | 41 +++++++++++++++----------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 682d0ea..356fca7 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -287,7 +287,7 @@ based on a combination of `current-prefix-arg' and (enlarge-window-horizontally eaf-interleave-split-lines))) )) -(defun eaf-interleave--go-to-page-note (page) +(defun eaf-interleave--go-to-page-note (url page) "Look up the notes for the current pdf PAGE. Effectively resolves the headline with the interleave_page_note @@ -298,26 +298,23 @@ re-centered to the page heading. It (possibly) narrows the subtree when found." (with-current-buffer eaf-interleave-org-buffer - (let (point (window (get-buffer-window (current-buffer) 'visible))) - (save-excursion - (widen) - (goto-char (point-min)) - (when (re-search-forward (format "^\[ \t\r\]*\:interleave_page_note\: %d$" page) nil t) - ;; widen the buffer again for the case it is narrowed from - ;; multi-pdf notes search. Kinda ugly I know. Maybe a macro helps? - (widen) - (org-back-to-heading t) - (eaf-interleave--narrow-to-subtree) - (org-show-subtree) - (org-cycle-hide-drawers t) - (setq point (point)))) - ;; When narrowing is disabled, and the notes/org buffer is - ;; visible recenter to the current headline. So even if not - ;; narrowed the notes buffer scrolls allong with the PDF. - (when (and eaf-interleave-disable-narrowing point window) - (with-selected-window window - (goto-char point) - (recenter))) + (let ((window (get-buffer-window (current-buffer) 'visible)) + (property-list (org-map-entries (lambda () + (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop)) + (page (org-entry-get-with-inheritance eaf-interleave--page-note-prop))) + (cons url page))))) + point) + (catch 'find-property + (dolist (property property-list) + (when (and (string= (car property) url) + (string= (cdr property) (number-to-string page))) + (widen) + (org-back-to-heading t) + (eaf-interleave--narrow-to-subtree) + (org-show-subtree) + (org-cycle-hide-drawers t) + (setq point (point)) + (throw 'find-property nil)))) point))) (defun eaf-interleave--narrow-to-subtree (&optional force) @@ -424,7 +421,7 @@ Consider a headline with property PROPERTY as parent headline." (defun eaf-interleave--pdf-add-note () "EAF pdf-viewer-mode add note" (let* ((page (eaf-interleave--pdf-viewer-current-page eaf--buffer-url)) - (position (eaf-interleave--go-to-page-note page))) + (position (eaf-interleave--go-to-page-note eaf--buffer-url page))) (if position (eaf-interleave--switch-to-org-buffer t position) (eaf-interleave--create-new-note eaf--buffer-url eaf--buffer-app-name page))) From 0a759cc4a1f8a2c9445f51ec5eb12a64a7d93d12 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 18:48:59 +0800 Subject: [PATCH 32/32] eaf-interleave: remove unused variable --- app/interleave/eaf-interleave.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/interleave/eaf-interleave.el b/app/interleave/eaf-interleave.el index 356fca7..531a3b8 100644 --- a/app/interleave/eaf-interleave.el +++ b/app/interleave/eaf-interleave.el @@ -127,14 +127,9 @@ e.g. if `eaf-interleave-split-direction' is 'vertical the buffer is split horizontally." :keymap eaf-interleave-mode-map (if eaf-interleave-mode - (progn - (setq eaf-interleave-org-buffer (current-buffer)) - (setq eaf-interleave--window-configuration (current-window-configuration))) + (setq eaf-interleave-org-buffer (current-buffer)) ;; Disable the corresponding minor mode in the PDF file too. - (set-window-configuration eaf-interleave--window-configuration) - (setq eaf-interleave--window-configuration nil) - (setq eaf-interleave-org-buffer nil) - )) + (setq eaf-interleave-org-buffer nil))) (defvar eaf-interleave-app-mode-map (make-sparse-keymap) "Keymap while command `eaf-interleave-app-mode' is active.")