diff options
Diffstat (limited to 'lisp/org/oc-basic.el')
-rw-r--r-- | lisp/org/oc-basic.el | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/lisp/org/oc-basic.el b/lisp/org/oc-basic.el index c51c7d301e4..7b09db5f8b4 100644 --- a/lisp/org/oc-basic.el +++ b/lisp/org/oc-basic.el @@ -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)))) |