|
@@ -310,67 +310,68 @@ This variable is relevant only if `org-bibtex-export-tags-as-keywords' is t."
|
|
|
|
|
|
(defun org-bibtex-headline ()
|
|
|
"Return a bibtex entry of the given headline as a string."
|
|
|
- (letrec ((val (lambda (key lst) (cdr (assoc key lst))))
|
|
|
- (to (lambda (string) (intern (concat ":" string))))
|
|
|
- (from (lambda (key) (substring (symbol-name key) 1)))
|
|
|
- (flatten (lambda (&rest lsts)
|
|
|
- (apply #'append (mapcar
|
|
|
- (lambda (e)
|
|
|
- (if (listp e) (apply flatten e) (list e)))
|
|
|
- lsts))))
|
|
|
- (notes (buffer-string))
|
|
|
- (id (org-bibtex-get org-bibtex-key-property))
|
|
|
- (type (org-bibtex-get org-bibtex-type-property-name))
|
|
|
- (tags (when org-bibtex-tags-are-keywords
|
|
|
- (delq nil
|
|
|
- (mapcar
|
|
|
- (lambda (tag)
|
|
|
- (unless (member tag
|
|
|
- (append org-bibtex-tags
|
|
|
- org-bibtex-no-export-tags))
|
|
|
- tag))
|
|
|
- (org-get-local-tags-at))))))
|
|
|
- (when type
|
|
|
- (let ((entry (format
|
|
|
- "@%s{%s,\n%s\n}\n" type id
|
|
|
- (mapconcat
|
|
|
- (lambda (pair)
|
|
|
- (format " %s={%s}" (car pair) (cdr pair)))
|
|
|
- (remove nil
|
|
|
- (if (and org-bibtex-export-arbitrary-fields
|
|
|
- org-bibtex-prefix)
|
|
|
+ (org-labels
|
|
|
+ ((val (key lst) (cdr (assoc key lst)))
|
|
|
+ (to (string) (intern (concat ":" string)))
|
|
|
+ (from (key) (substring (symbol-name key) 1))
|
|
|
+ (flatten (&rest lsts)
|
|
|
+ (apply #'append (mapcar
|
|
|
+ (lambda (e)
|
|
|
+ (if (listp e) (apply #'flatten e) (list e)))
|
|
|
+ lsts))))
|
|
|
+ (let ((notes (buffer-string))
|
|
|
+ (id (org-bibtex-get org-bibtex-key-property))
|
|
|
+ (type (org-bibtex-get org-bibtex-type-property-name))
|
|
|
+ (tags (when org-bibtex-tags-are-keywords
|
|
|
+ (delq nil
|
|
|
+ (mapcar
|
|
|
+ (lambda (tag)
|
|
|
+ (unless (member tag
|
|
|
+ (append org-bibtex-tags
|
|
|
+ org-bibtex-no-export-tags))
|
|
|
+ tag))
|
|
|
+ (org-get-local-tags-at))))))
|
|
|
+ (when type
|
|
|
+ (let ((entry (format
|
|
|
+ "@%s{%s,\n%s\n}\n" type id
|
|
|
+ (mapconcat
|
|
|
+ (lambda (pair)
|
|
|
+ (format " %s={%s}" (car pair) (cdr pair)))
|
|
|
+ (remove nil
|
|
|
+ (if (and org-bibtex-export-arbitrary-fields
|
|
|
+ org-bibtex-prefix)
|
|
|
+ (mapcar
|
|
|
+ (lambda (kv)
|
|
|
+ (let ((key (car kv)) (val (cdr kv)))
|
|
|
+ (when (and
|
|
|
+ (string-match org-bibtex-prefix key)
|
|
|
+ (not (string=
|
|
|
+ (downcase (concat org-bibtex-prefix
|
|
|
+ org-bibtex-type-property-name))
|
|
|
+ (downcase key))))
|
|
|
+ (cons (downcase (replace-regexp-in-string
|
|
|
+ org-bibtex-prefix "" key))
|
|
|
+ val))))
|
|
|
+ (org-entry-properties nil 'standard))
|
|
|
(mapcar
|
|
|
- (lambda (kv)
|
|
|
- (let ((key (car kv)) (val (cdr kv)))
|
|
|
- (when (and
|
|
|
- (string-match org-bibtex-prefix key)
|
|
|
- (not (string=
|
|
|
- (downcase (concat org-bibtex-prefix
|
|
|
- org-bibtex-type-property-name))
|
|
|
- (downcase key))))
|
|
|
- (cons (downcase (replace-regexp-in-string
|
|
|
- org-bibtex-prefix "" key))
|
|
|
- val))))
|
|
|
- (org-entry-properties nil 'standard))
|
|
|
- (mapcar
|
|
|
- (lambda (field)
|
|
|
- (let ((value (or (org-bibtex-get (funcall from field))
|
|
|
- (and (equal :title field)
|
|
|
- (nth 4 (org-heading-components))))))
|
|
|
- (when value (cons (funcall from field) value))))
|
|
|
- (funcall flatten
|
|
|
- (funcall val :required (funcall val (funcall to type) org-bibtex-types))
|
|
|
- (funcall val :optional (funcall val (funcall to type) org-bibtex-types))))))
|
|
|
- ",\n"))))
|
|
|
- (with-temp-buffer
|
|
|
- (insert entry)
|
|
|
- (when tags
|
|
|
- (bibtex-beginning-of-entry)
|
|
|
- (if (re-search-forward "keywords.*=.*{\\(.*\\)}" nil t)
|
|
|
- (progn (goto-char (match-end 1)) (insert ", "))
|
|
|
- (bibtex-make-field "keywords" t t))
|
|
|
- (insert (mapconcat #'identity tags ", ")))
|
|
|
- (buffer-string))))))
|
|
|
+ (lambda (field)
|
|
|
+ (let ((value (or (org-bibtex-get (from field))
|
|
|
+ (and (equal :title field)
|
|
|
+ (nth 4 (org-heading-components))))))
|
|
|
+ (when value (cons (from field) value))))
|
|
|
+ (flatten
|
|
|
+ (val :required (val (to type) org-bibtex-types))
|
|
|
+ (val :optional (val (to type) org-bibtex-types))))))
|
|
|
+ ",\n"))))
|
|
|
+ (with-temp-buffer
|
|
|
+ (insert entry)
|
|
|
+ (when tags
|
|
|
+ (bibtex-beginning-of-entry)
|
|
|
+ (if (re-search-forward "keywords.*=.*{\\(.*\\)}" nil t)
|
|
|
+ (progn (goto-char (match-end 1)) (insert ", "))
|
|
|
+ (bibtex-make-field "keywords" t t))
|
|
|
+ (insert (mapconcat #'identity tags ", ")))
|
|
|
+ (buffer-string)))))))
|
|
|
|
|
|
(defun org-bibtex-ask (field)
|
|
|
(unless (assoc field org-bibtex-fields)
|