X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.el;h=4509d2d9b263de5c817af0d1e670659c504946ff;hp=939b8ee7102ee218574b0fac89f6616c3ec2177f;hb=16eda27ba08102b87ab38dd0f52b0b09976beae7;hpb=2e9a984b86534dc777b8099e628620afdc44f2a3 diff --git a/org-ref.el b/org-ref.el index 939b8ee..4509d2d 100644 --- a/org-ref.el +++ b/org-ref.el @@ -504,7 +504,8 @@ Format according to the type in `org-ref-bibliography-entry-format'." (loop for file in org-ref-bibliography-files do (if (org-ref-key-in-file-p key (file-truename file)) (throw 'result file) - (message "%s not found in %s" key (file-truename file)))))) + (message "%s not found in %s" + key (file-truename file)))))) (with-temp-buffer (insert-file-contents file) @@ -748,11 +749,26 @@ Format according to the type in `org-ref-bibliography-entry-format'." ;; write out the latex bibliography command (format "\\bibliographystyle{%s}" keyword))))) + +(defun org-bibliographystyle-complete-link (&optional arg) + "Completion function for bibliographystyle link. +ARG does nothing." + (format "bibliographystyle:%s" (ido-completing-read + "style: " + '("unsrt" "plain" "alpha" + ;; natbib + ;; https://www.sharelatex.com/learn/Natbib_bibliography_styles + "dinat" "humannat" "plainnat" + "abbrnat" "unsrtnat" "rusnat" + "ksfhnat")))) + + (defun org-bibliography-complete-link (&optional arg) "Completion function for bibliography link. ARG does nothing." (format "bibliography:%s" (read-file-name "enter file: " nil nil t))) + (defun org-ref-insert-bibliography-link () "Insert a bibliography with completion." (interactive) @@ -900,6 +916,8 @@ ARG does nothing." ((eq format 'latex) (format "\\listoftables"))))) + +;; ** label link (defun org-ref-count-labels (label) "Counts number of matches for LABEL in the document." (+ (count-matches (format "label:%s\\b[^-:]" label) (point-min) (point-max)) @@ -916,7 +934,6 @@ ARG does nothing." (setq custom-id-count (+ 1 custom-id-count))))) custom-id-count))) -;; ** label link (org-add-link-type "label" (lambda (label) @@ -951,21 +968,21 @@ ARG does nothing." :type "ref" :link (concat "ref:" (org-element-property :name object)))) -;; it turns out this does not work. you can already store a link to a heading with a CUSTOM_ID ;; store link on heading with custom_id -; (when (and (equal (org-element-type object) 'headline) -; (org-entry-get (point) "CUSTOM_ID")) -; (org-store-link-props -; :type "ref" -; :link (concat "ref:" (org-entry-get (point) "CUSTOM_ID")))) + ;; this is not a ref link, but it is still what you want + (when (and (equal (org-element-type object) 'headline) + (org-entry-get (point) "CUSTOM_ID")) + (org-store-link-props + :type "custom_id" + :link (format "[[#%s]]" (org-entry-get (point) "CUSTOM_ID")))) ;; and to #+label: lines + (when (and (equal (org-element-type object) 'paragraph) (org-element-property :name object)) (org-store-link-props :type "ref" - :link (concat "ref:" (org-element-property :name object)))) -)) + :link (concat "ref:" (org-element-property :name object)))))) (add-hook 'org-store-link-functions 'org-label-store-link) @@ -976,10 +993,8 @@ ARG does nothing." "on clicking goto the label. Navigate back with C-c &" (org-mark-ring-push) ;; next search from beginning of the buffer - ;; it is possible you would not find the label if narrowing is in effect (widen) - (unless (or ;; our label links @@ -995,20 +1010,15 @@ ARG does nothing." ;; #+label: name org-definition (progn (goto-char (point-min)) - (re-search-forward (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t)) + (re-search-forward + (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t)) ;; org tblname (progn (goto-char (point-min)) - (re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t)) - -;; Commented out because these ref links do not actually translate correctly in LaTeX. -;; you need [[#label]] links. - ;; CUSTOM_ID -; (progn -; (goto-char (point-min)) -; (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" label) nil t)) - ) + (re-search-forward + (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))) + ;; we did not find anything, so go back to where we came (org-mark-ring-goto) (error "%s not found" label)) @@ -1021,14 +1031,20 @@ ARG does nothing." ((eq format 'latex) (format "\\ref{%s}" keyword))))) + (defun org-ref-get-org-labels () "Return a list of #+LABEL: labels." (save-excursion (goto-char (point-min)) (let ((matches '())) (while (re-search-forward "^#\\+label:\\s-+\\(.*\\)\\b" (point-max) t) - (add-to-list 'matches (match-string-no-properties 1) t)) -matches))) + ;; do not do this for tables. We get those in `org-ref-get-tblnames'. + ;; who would have thought you have save match data here? Trust me. When + ;; I wrote this, you did. + (unless (save-match-data (equal (car (org-element-at-point)) 'table)) + (add-to-list 'matches (match-string-no-properties 1) t))) + matches))) + (defun org-ref-get-custom-ids () "Return a list of custom_id properties in the buffer." @@ -1038,7 +1054,8 @@ matches))) (let ((custom_id (org-entry-get (point) "CUSTOM_ID"))) (when (not (null custom_id)) (setq results (append results (list custom_id))))))) -results)) + results)) + (defun org-ref-get-latex-labels () "Return list of matchin LaTeX defined labels in buffer." @@ -1047,7 +1064,8 @@ results)) (let ((matches '())) (while (re-search-forward "\\\\label{\\([a-zA-z0-9:-]*\\)}" (point-max) t) (add-to-list 'matches (match-string-no-properties 1) t)) -matches))) + matches))) + (defun org-ref-get-tblnames () "Return list of table names in the buffer." @@ -1055,6 +1073,7 @@ matches))) (lambda (table) (org-element-property :name table)))) + (defun org-ref-get-labels () "Return a list of labels in the buffer that you can make a ref link to. This is used to complete ref links and in helm menus." @@ -1063,15 +1082,22 @@ This is used to complete ref links and in helm menus." (widen) (goto-char (point-min)) (let ((matches '())) - ;; these are the label:stuff kinds - (while (re-search-forward "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t) + ;; these are the org-ref label:stuff kinds + (while (re-search-forward + "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t) (add-to-list 'matches (match-string-no-properties 1) t)) + ;; now add all the other kinds of labels. (append matches + ;; #+label: (org-ref-get-org-labels) + ;; \label{} (org-ref-get-latex-labels) + ;; #+tblname: and actually #+label (org-ref-get-tblnames) + ;; CUSTOM_IDs (org-ref-get-custom-ids)))))) + (defun org-ref-helm-insert-label-link () "Insert a label link. helm just shows you what labels already exist. If you are on a label link, replace it." @@ -1083,7 +1109,8 @@ If you are on a label link, replace it." ;; default action is to open to the label (action . (lambda (label) ;; unfortunately I do not have markers here - (org-open-link-from-string (format "ref:%s" label)))) + (org-open-link-from-string + (format "ref:%s" label)))) ;; if you select a label, replace current one (action . (lambda (label) (switch-to-buffer ,cb) @@ -1145,6 +1172,7 @@ If you are on a label link, replace it." (or label helm-pattern)))))))))))) + (defun org-ref-complete-link (&optional arg) "Completion function for ref links. Optional argument ARG Does nothing." @@ -1152,11 +1180,13 @@ Optional argument ARG Does nothing." (setq label (completing-read "label: " (org-ref-get-labels))) (format "ref:%s" label))) + (defun org-ref-insert-ref-link () "Completion function for a ref link." (interactive) (insert (org-ref-complete-link))) + (defun org-ref-helm-insert-ref-link () "Helm menu to insert ref links to labels in the document. If you are on link, replace with newly selected label. @@ -1255,20 +1285,14 @@ Use C-u C-u to insert a [[#custom-id]] link" ;; #+label: name org-definition (progn (goto-char (point-min)) - (re-search-forward (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t)) + (re-search-forward + (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t)) ;; org tblname (progn (goto-char (point-min)) - (re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t)) - -;; Commented out because these ref links do not actually translate correctly in LaTeX. -;; you need [[#label]] links. - ;; CUSTOM_ID -; (progn -; (goto-char (point-min)) -; (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" label) nil t)) - ) + (re-search-forward + (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))) ;; we did not find anything, so go back to where we came (org-mark-ring-goto) (error "%s not found" label)) @@ -1280,6 +1304,7 @@ Use C-u C-u to insert a [[#custom-id]] link" ((eq format 'latex) (format "\\pageref{%s}" keyword))))) + (defun org-pageref-complete-link (&optional arg) "Completion function for ref links. Optional argument ARG Does nothing." @@ -1287,11 +1312,13 @@ Optional argument ARG Does nothing." (setq label (completing-read "label: " (org-ref-get-labels))) (format "ref:%s" label))) + (defun org-pageref-insert-ref-link () "Insert a pageref link with completion." (interactive) (insert (org-pageref-complete-link))) + ;; *** nameref link (org-add-link-type "nameref" @@ -1388,7 +1415,9 @@ keyword we clicked on. We also strip the text properties." (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match (setq key-beginning link-string-beginning))) ; no match found ;; save the key we clicked on. - (setq bibtex-key (org-ref-strip-string (buffer-substring key-beginning key-end))) + (setq bibtex-key + (org-ref-strip-string + (buffer-substring key-beginning key-end))) (set-text-properties 0 (length bibtex-key) nil bibtex-key) bibtex-key) ;; link with description. assume only one key @@ -2366,7 +2395,7 @@ Makes a new buffer with clickable links." (kill-buffer "*Missing citations*")) (message "No bad cite links found")))) -;; ** helm interface to bad citations, labels, refs in orgfile +;; ** helm interface to bad citations, labels, refs and files in orgfile (defun org-ref-bad-cite-candidates () "Return a list of conses (key . marker) where key does not exist in the known bibliography files, and marker points to the key." (let* ((cp (point)) ; save to return to later @@ -2436,7 +2465,6 @@ Makes a new buffer with clickable links." (while (re-search-forward (format "[^#+]label:%s\\s-" label) nil t) (push (cons label (point-marker)) multiple-labels)) - (goto-char (point-min)) (while (re-search-forward (format "\\label{%s}\\s-?" label) nil t) @@ -2454,6 +2482,29 @@ Makes a new buffer with clickable links." (goto-char cp))))) multiple-labels)) +(defun org-ref-bad-file-link-candidates () + "Return list of conses (link . marker) wehre the file in the link does not exist." + (let* ((bad-files '())) + (org-element-map (org-element-parse-buffer) 'link + (lambda (link) + (let ((type (org-element-property :type link))) + (when (or (string= "file" type) + (string= "attachfile" type)) + (unless (file-exists-p (org-element-property :path link)) + (add-to-list 'bad-files + (cons (org-element-property :path link) + (save-excursion + (goto-char + (org-element-property :begin link)) + (point-marker))))))))) + ;; Let us also check \attachfile{fname} + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "\\attachfile{\\(.*\\)}" nil t) + (unless (file-exists-p (match-string 1)) + (add-to-list 'bad-files (cons (match-string 1) (point-marker)))))) + bad-files)) + ;;;###autoload (defun org-ref () "Opens a helm interface to actions for org-ref. @@ -2462,7 +2513,8 @@ Shows bad citations, ref links and labels" (let ((cb (current-buffer)) (bad-citations (org-ref-bad-cite-candidates)) (bad-refs (org-ref-bad-ref-candidates)) - (bad-labels (org-ref-bad-label-candidates))) + (bad-labels (org-ref-bad-label-candidates)) + (bad-files (org-ref-bad-file-link-candidates))) (helm :sources `(((name . "Bad citations") (candidates . ,bad-citations) @@ -2482,6 +2534,12 @@ Shows bad citations, ref links and labels" (switch-to-buffer (marker-buffer marker)) (goto-char marker)))) ;; + ((name . "Bad file links") + (candidates . ,bad-files) + (lambda (marker) + (switch-to-buffer (marker-buffer marker)) + (goto-char marker))) + ;; ((name . "Utilities") (candidates . (("Check buffer again" . org-ref) ("Insert citation" . helm-bibtex) @@ -2506,8 +2564,7 @@ Shows bad citations, ref links and labels" )) (action . (lambda (x) (switch-to-buffer ,cb) - (funcall x)))) - )))) + (funcall x)))))))) ;; ** Find non-ascii charaters (defun org-ref-find-non-ascii-characters ()