forked from mirrors/org-mode
Merge branch 'bugfix' into emacs-sync
This commit is contained in:
commit
9553ea907f
|
@ -7981,7 +7981,7 @@ patches. Then you would configure this option like this:
|
|||
|
||||
#+begin_src emacs-lisp
|
||||
(setq org-capture-templates-contexts
|
||||
'(("p" (in-mode . "message-mode"))))
|
||||
'(("p" ((in-mode . "message-mode")))))
|
||||
#+end_src
|
||||
|
||||
You can also tell that the command key {{{kbd(p)}}} should refer to
|
||||
|
@ -7989,7 +7989,7 @@ another template. In that case, add this command key like this:
|
|||
|
||||
#+begin_src emacs-lisp
|
||||
(setq org-capture-templates-contexts
|
||||
'(("p" "q" (in-mode . "message-mode"))))
|
||||
'(("p" "q" ((in-mode . "message-mode")))))
|
||||
#+end_src
|
||||
|
||||
See the docstring of the variable for more information.
|
||||
|
|
|
@ -325,15 +325,19 @@ This is used for disambiguation."
|
|||
((= n 27) (throw :complete (cons 0 (cons 0 result))))
|
||||
(t nil))))))))
|
||||
|
||||
(defun org-cite-basic--get-year (entry-or-key info)
|
||||
(defun org-cite-basic--get-year (entry-or-key info &optional no-suffix)
|
||||
"Return year associated to ENTRY-OR-KEY.
|
||||
|
||||
ENTRY-OR-KEY is either an association list, as returned by
|
||||
`org-cite-basic--get-entry', or a string representing a citation key. INFO is
|
||||
the export state, as a property list.
|
||||
`org-cite-basic--get-entry', or a string representing a citation
|
||||
key. INFO is the export state, as a property list.
|
||||
|
||||
Unlike `org-cite-basic--get-field', this function disambiguates author-year
|
||||
patterns."
|
||||
Year is obtained from the \"year\" field, if available, or from
|
||||
the \"date\" field if it starts with a year pattern.
|
||||
|
||||
Unlike `org-cite-basic--get-field', this function disambiguates
|
||||
author-year patterns by adding a letter suffix to the year when
|
||||
necessary, unless optional argument NO-SUFFIX is non-nil."
|
||||
;; The cache is an association list with the following structure:
|
||||
;;
|
||||
;; (AUTHOR-YEAR . KEY-SUFFIX-ALIST).
|
||||
|
@ -345,7 +349,16 @@ patterns."
|
|||
;; the cite key, as a string, and SUFFIX is the generated suffix
|
||||
;; string, or the empty string.
|
||||
(let* ((author (org-cite-basic--get-field 'author entry-or-key info 'raw))
|
||||
(year (org-cite-basic--get-field 'year entry-or-key info 'raw))
|
||||
(year
|
||||
(or (org-cite-basic--get-field 'year entry-or-key info 'raw)
|
||||
(let ((date
|
||||
(org-cite-basic--get-field 'date entry-or-key info t)))
|
||||
(and (stringp date)
|
||||
(string-match (rx string-start
|
||||
(group (= 4 digit))
|
||||
(or string-end (not digit)))
|
||||
date)
|
||||
(match-string 1 date)))))
|
||||
(cache-key (cons author year))
|
||||
(key
|
||||
(pcase entry-or-key
|
||||
|
@ -359,11 +372,13 @@ patterns."
|
|||
(plist-put info :cite-basic/author-date-cache (cons value cache))
|
||||
year))
|
||||
(`(,_ . ,alist)
|
||||
(concat year
|
||||
(or (cdr (assoc key alist))
|
||||
(let ((new (org-cite-basic--number-to-suffix (1- (length alist)))))
|
||||
(push (cons key new) alist)
|
||||
new)))))))
|
||||
(let ((suffix
|
||||
(or (cdr (assoc key alist))
|
||||
(let ((new (org-cite-basic--number-to-suffix
|
||||
(1- (length alist)))))
|
||||
(push (cons key new) alist)
|
||||
new))))
|
||||
(if no-suffix year (concat year suffix)))))))
|
||||
|
||||
(defun org-cite-basic--print-entry (entry style &optional info)
|
||||
"Format ENTRY according to STYLE string.
|
||||
|
@ -371,7 +386,6 @@ ENTRY is an alist, as returned by `org-cite-basic--get-entry'.
|
|||
Optional argument INFO is the export state, as a property list."
|
||||
(let ((author (org-cite-basic--get-field 'author entry info))
|
||||
(title (org-cite-basic--get-field 'title entry info))
|
||||
(year (org-cite-basic--get-field 'year entry info))
|
||||
(from
|
||||
(or (org-cite-basic--get-field 'publisher entry info)
|
||||
(org-cite-basic--get-field 'journal entry info)
|
||||
|
@ -379,10 +393,12 @@ Optional argument INFO is the export state, as a property list."
|
|||
(org-cite-basic--get-field 'school entry info))))
|
||||
(pcase style
|
||||
("plain"
|
||||
(org-cite-concat
|
||||
author ". " title (and from (list ", " from)) ", " year "."))
|
||||
(let ((year (org-cite-basic--get-year entry info 'no-suffix)))
|
||||
(org-cite-concat
|
||||
author ". " title (and from (list ", " from)) ", " year ".")))
|
||||
("numeric"
|
||||
(let ((n (org-cite-basic--key-number (cdr (assq 'id entry)) info)))
|
||||
(let ((n (org-cite-basic--key-number (cdr (assq 'id entry)) info))
|
||||
(year (org-cite-basic--get-year entry info 'no-suffix)))
|
||||
(org-cite-concat
|
||||
(format "[%d] " n) author ", "
|
||||
(org-cite-emphasize 'italic title)
|
||||
|
@ -603,15 +619,7 @@ export communication channel, as a property list."
|
|||
;; When using this style on citations with multiple references,
|
||||
;; use global affixes and ignore local ones.
|
||||
(`(,(or "numeric" "nb") . ,_)
|
||||
(let* ((references (org-cite-get-references citation))
|
||||
(prefix
|
||||
(or (org-element-property :prefix citation)
|
||||
(and (= 1 (length references))
|
||||
(org-element-property :prefix (car references)))))
|
||||
(suffix
|
||||
(or (org-element-property :suffix citation)
|
||||
(and (= 1 (length references))
|
||||
(org-element-property :suffix (car references))))))
|
||||
(pcase-let ((`(,prefix . ,suffix) (org-cite-main-affixes citation)))
|
||||
(org-export-data
|
||||
(org-cite-concat
|
||||
"(" prefix (org-cite-basic--citation-numbers citation info) suffix ")")
|
||||
|
@ -712,7 +720,7 @@ reference. Values are the cite key."
|
|||
org-cite-basic-author-column-end nil ?\s)
|
||||
(make-string org-cite-basic-author-column-end ?\s)))
|
||||
org-cite-basic-column-separator
|
||||
(let ((date (org-cite-basic--get-field 'year key nil t)))
|
||||
(let ((date (org-cite-basic--get-year key nil 'no-suffix)))
|
||||
(format "%4s" (or date "")))
|
||||
org-cite-basic-column-separator
|
||||
(org-cite-basic--get-field 'title key nil t))))
|
||||
|
|
|
@ -487,21 +487,25 @@ INFO is the export state, as a property list."
|
|||
(let ((global-prefix (org-element-property :prefix citation)))
|
||||
(when global-prefix
|
||||
(let* ((first (car cites))
|
||||
(prefix (org-element-property :prefix first)))
|
||||
(org-element-put-property
|
||||
first :prefix (org-cite-concat global-prefix prefix)))))
|
||||
(prefix-item (assq 'prefix first)))
|
||||
(setcdr prefix-item
|
||||
(concat (org-element-interpret-data global-prefix)
|
||||
" "
|
||||
(cdr prefix-item))))))
|
||||
;; Global suffix is appended to the suffix of the last reference.
|
||||
(let ((global-suffix (org-element-property :suffix citation)))
|
||||
(when global-suffix
|
||||
(let* ((last (org-last cites))
|
||||
(suffix (org-element-property :suffix last)))
|
||||
(org-element-put-property
|
||||
last :suffix (org-cite-concat suffix global-suffix)))))
|
||||
(suffix-item (assq 'suffix last)))
|
||||
(setcdr suffix-item
|
||||
(concat (cdr suffix-item)
|
||||
" "
|
||||
(org-element-interpret-data global-suffix))))))
|
||||
;; Check if CITATION needs wrapping, i.e., it should be wrapped in
|
||||
;; a footnote, but isn't yet.
|
||||
(when (and (not footnote) (org-cite-csl--note-style-p info))
|
||||
(org-cite-adjust-note citation info)
|
||||
(org-cite-wrap-citation citation info))
|
||||
(setq footnote (org-cite-wrap-citation citation info)))
|
||||
;; Return structure.
|
||||
(apply #'citeproc-citation-create
|
||||
`(:note-index
|
||||
|
|
|
@ -119,11 +119,7 @@ If \"natbib\" package is already required in the document, e.g., through
|
|||
(defun org-cite-natbib--build-optional-arguments (citation info)
|
||||
"Build optional arguments for citation command.
|
||||
CITATION is the citation object. INFO is the export state, as a property list."
|
||||
(let* ((origin (pcase (org-cite-get-references citation)
|
||||
(`(,reference) reference)
|
||||
(_ citation)))
|
||||
(suffix (org-element-property :suffix origin))
|
||||
(prefix (org-element-property :prefix origin)))
|
||||
(pcase-let ((`(,prefix . ,suffix) (org-cite-main-affixes citation)))
|
||||
(concat (and prefix (format "[%s]" (org-trim (org-export-data prefix info))))
|
||||
(cond
|
||||
(suffix (format "[%s]" (org-trim (org-export-data suffix info))))
|
||||
|
|
22
lisp/oc.el
22
lisp/oc.el
|
@ -638,6 +638,24 @@ in the current buffer. Positions include leading \"@\" character."
|
|||
(re-search-forward org-element-citation-key-re end t)
|
||||
(cons (match-beginning 0) (match-end 0)))))
|
||||
|
||||
(defun org-cite-main-affixes (citation)
|
||||
"Return main affixes for CITATION object.
|
||||
|
||||
Some export back-ends only support a single pair of affixes per
|
||||
citation, even if it contains multiple keys. This function
|
||||
decides what affixes are the most appropriate.
|
||||
|
||||
Return a pair (PREFIX . SUFFIX) where PREFIX and SUFFIX are
|
||||
parsed data."
|
||||
(let ((source
|
||||
;; When there are multiple references, use global affixes.
|
||||
;; Otherwise, local affixes have priority.
|
||||
(pcase (org-cite-get-references citation)
|
||||
(`(,reference) reference)
|
||||
(_ citation))))
|
||||
(cons (org-element-property :prefix source)
|
||||
(org-element-property :suffix source))))
|
||||
|
||||
(defun org-cite-supported-styles (&optional processors)
|
||||
"List of supported citation styles and variants.
|
||||
|
||||
|
@ -872,7 +890,9 @@ When non-nil, the return value if the footnote container."
|
|||
INFO is the export state, as a property list.
|
||||
|
||||
White space before the citation, if any, are removed. The parse tree is
|
||||
modified by side-effect."
|
||||
modified by side-effect.
|
||||
|
||||
Return newly created footnote object."
|
||||
(let ((footnote
|
||||
(list 'footnote-reference
|
||||
(list :label nil
|
||||
|
|
|
@ -173,7 +173,7 @@ a file, \"input-file\" and \"modification-time\"."
|
|||
modtime))))))))
|
||||
;; Install generic macros.
|
||||
'(("keyword" . (lambda (arg1 &rest _)
|
||||
(org-macro--find-keyword-value arg1)))
|
||||
(org-macro--find-keyword-value arg1 t)))
|
||||
("n" . (lambda (&optional arg1 arg2 &rest _)
|
||||
(org-macro--counter-increment arg1 arg2)))
|
||||
("property" . (lambda (arg1 &optional arg2 &rest _)
|
||||
|
|
|
@ -251,6 +251,45 @@
|
|||
(car boundaries)
|
||||
(cdr boundaries)))))))
|
||||
|
||||
(ert-deftest test-org-cite/main-affixes ()
|
||||
"Test `org-cite-main-affixes'."
|
||||
(should
|
||||
(equal '(nil . nil)
|
||||
(org-test-with-temp-text "[cite:@key]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(nil . nil)
|
||||
(org-test-with-temp-text "[cite:@key1;@key2]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(("pre ") . nil)
|
||||
(org-test-with-temp-text "[cite:pre @key]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(("pre ") . (" post"))
|
||||
(org-test-with-temp-text "[cite:pre @key post]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(("pre ") . nil)
|
||||
(org-test-with-temp-text "[cite:global pre;pre @key]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(nil . (" post"))
|
||||
(org-test-with-temp-text "[cite:@key post;global post]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(("global pre") . ("global post"))
|
||||
(org-test-with-temp-text "[cite:global pre;@key1;@key2;global post]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(("global pre") . nil)
|
||||
(org-test-with-temp-text "[cite:global pre;pre1 @key1;pre2 @key2]"
|
||||
(org-cite-main-affixes (org-element-context)))))
|
||||
(should
|
||||
(equal '(nil . ("global post"))
|
||||
(org-test-with-temp-text "[cite:@key1 post1;@key2 post2; global post]"
|
||||
(org-cite-main-affixes (org-element-context))))))
|
||||
|
||||
(ert-deftest test-org-cite/supported-styles ()
|
||||
"Test `org-cite-supported-styles'."
|
||||
;; Default behavior is to use export processors.
|
||||
|
|
Loading…
Reference in New Issue