(replace-regexp-in-string "\*" "\\\\*" x)
)
org-ref-cite-types "\\|") "\\)"
- ":\\([a-zA-Z0-9-_:]*,?\\)*"))
+ ":\\([a-zA-Z0-9-_:\\.]*,?\\)*"))
(setq org-ref-label-re
(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)
:type "custom_id"
:link (format "[[#%s]]" (org-entry-get (point) "CUSTOM_ID"))))
- ;; and to #+label: lines. In a table these are retrieved by :name
- ;; properties.
- (when (and (-contains? '(paragraph table src-block)
- (org-element-type object))
+ ;; and to #+label: lines
+
+ (when (and (equal (org-element-type object) 'paragraph)
(org-element-property :name object))
(org-store-link-props
:type "ref"
"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
;; #+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))
((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."
(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."
(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."
(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."
(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."
;; 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)
(or label
helm-pattern))))))))))))
+
(defun org-ref-complete-link (&optional arg)
"Completion function for ref links.
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.
;; #+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))
((eq format 'latex)
(format "\\pageref{%s}" keyword)))))
+
(defun org-pageref-complete-link (&optional arg)
"Completion function for ref links.
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"
(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
(interactive)
(doi-utils-crossref (org-ref-get-doi-at-point)))
-;; *** DEPRECATED Minibuffer menu
-;; See [[Helm bibtex setup]]
+;; *** Minibuffer menu
+
(defun org-ref-cite-onclick-minibuffer-menu (&optional link-string)
"Action when a cite link is clicked on.
Provides a menu of context sensitive actions. If the bibtex entry
(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
;; this is a multiply defined label.
(let ((cp (point)))
(goto-char (point-min))
+ (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)
(push (cons label (point-marker)) multiple-labels))
(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.
(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)
(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)
))
(action . (lambda (x)
(switch-to-buffer ,cb)
- (funcall x))))
- ))))
+ (funcall x))))))))
;; ** Find non-ascii charaters
(defun org-ref-find-non-ascii-characters ()