From f560df741a4335c5573073f82950c5626e8799e1 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sat, 4 Apr 2020 15:46:39 +0800 Subject: [PATCH] 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