Function: org-cite-basic--parse-json
org-cite-basic--parse-json is a byte-compiled function defined in
oc-basic.el.gz.
Signature
(org-cite-basic--parse-json)
Documentation
Parse JSON entries in the current buffer.
Return a hash table with citation references as keys and fields alist as values.
Source Code
;; Defined in /usr/src/emacs/lisp/org/oc-basic.el.gz
;;; Internal functions
(defun org-cite-basic--parse-json ()
"Parse JSON entries in the current buffer.
Return a hash table with citation references as keys and fields alist as values."
(let ((entries (make-hash-table :test #'equal)))
(let ((json-array-type 'list)
(json-key-type 'symbol))
(dolist (item (json-read))
(puthash (cdr (assq 'id item))
(mapcar (pcase-lambda (`(,field . ,value))
(pcase field
((or 'author 'editor)
;; Author and editors are arrays of
;; objects, each of them designing a
;; person. These objects may contain
;; multiple properties, but for this
;; basic processor, we'll focus on
;; `given' and `family'.
;;
;; For compatibility with BibTeX, add
;; "and" between authors and editors.
(cons field
(mapconcat
(lambda (alist)
(concat (alist-get 'family alist)
" "
(alist-get 'given alist)))
value
" and ")))
('issued
;; Date are expressed as an array
;; (`date-parts') or a "string (`raw'
;; or `literal'). In both cases,
;; extract the year and associate it
;; to `year' field, for compatibility
;; with BibTeX format.
(let ((date (or (alist-get 'date-parts value)
(alist-get 'literal value)
(alist-get 'raw value))))
(cons 'year
(cond
((consp date)
(let ((year (caar date)))
(cond
((numberp year) (number-to-string year))
((stringp year) year)
(t
(error
"First element of CSL-JSON date-parts should be a number or string, got %s: %S"
(type-of year) year)))))
((stringp date)
(replace-regexp-in-string
(rx
(minimal-match (zero-or-more anything))
(group-n 1 (repeat 4 digit))
(zero-or-more anything))
(rx (backref 1))
date))
(t
(error "Unknown CSL-JSON date format: %S"
value))))))
(_
(cons field value))))
item)
entries))
entries)))