[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 29eff32 1/3: Add new user option bibtex-unify-case-convert
From: |
Lars Ingebrigtsen |
Subject: |
master 29eff32 1/3: Add new user option bibtex-unify-case-convert |
Date: |
Mon, 16 Nov 2020 17:16:48 -0500 (EST) |
branch: master
commit 29eff32307494eabed5c0160ad1713d832e65f74
Author: Francesco Potortì <pot@gnu.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Add new user option bibtex-unify-case-convert
* lisp/textmodes/bibtex.el (bibtex-unify-case-convert): New
variable (bug#44614).
(bibtex-format-entry): Use it (bug#44614).
---
etc/NEWS | 5 +++
lisp/textmodes/bibtex.el | 89 +++++++++++++++++++++++++++---------------------
2 files changed, 56 insertions(+), 38 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index 90e4d29..79c937b 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1307,6 +1307,11 @@ This new command (bound to 'C-c C-l') regenerates the
current hunk.
** Miscellaneous
+---
+*** New user option 'bibtex-unify-case-convert'.
+This new option allows the user to customize how case is converted
+when unifying entries.
+
+++
*** 'format-seconds' can now be used for sub-second times.
The new optional "," parameter has been added, and
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index fcf63ed..b69d715 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -88,6 +88,17 @@ If this is a function, call it to generate the initial field
text."
(const :tag "Default" t))
:risky t)
+(defcustom bibtex-unify-case-convert 'identity
+ "*Function called when unifying case on entry and field names.
+This variable is buffer-local."
+ :version "28.1"
+ :type '(choice (const :tag "Same case as in `bibtex-field-alist'" identity)
+ (const :tag "Downcase" downcase)
+ (const :tag "Capitalize" capitalize)
+ (const :tag "Upcase" upcase)
+ (function :tag "Conversion function")))
+(make-variable-buffer-local 'bibtex-unify-case-convert)
+
(defcustom bibtex-user-optional-fields
'(("annote" "Personal annotation (ignored)"))
"List of optional fields the user wants to have always present.
@@ -122,7 +133,8 @@ last-comma Add or delete comma on end of last
field in entry,
according to value of `bibtex-comma-after-last-field'.
delimiters Change delimiters according to variables
`bibtex-field-delimiters' and `bibtex-entry-delimiters'.
-unify-case Change case of entry types and field names.
+unify-case Change case of entry and field names according to
+ `bibtex-unify-case-convert'.
braces Enclose parts of field entries by braces according to
`bibtex-field-braces-alist'.
strings Replace parts of field entries by string constants
@@ -2346,7 +2358,7 @@ Formats current entry according to variable
`bibtex-entry-format'."
;; unify case of entry type
(when (memq 'unify-case format)
(delete-region beg-type end-type)
- (insert (car entry-list)))
+ (insert (funcall bibtex-unify-case-convert (car
entry-list))))
;; update left entry delimiter
(when (memq 'delimiters format)
@@ -2549,47 +2561,48 @@ Formats current entry according to variable
`bibtex-entry-format'."
(error "Mandatory field `%s' is empty" field-name))
;; unify case of field name
- (if (memq 'unify-case format)
- (let ((fname (car (assoc-string field-name
- default-field-list
t))))
- (if fname
- (progn
- (delete-region beg-name end-name)
- (goto-char beg-name)
- (insert fname))
- ;; there are no rules we could follow
- (downcase-region beg-name end-name))))
+ (when (memq 'unify-case format)
+ (let ((fname (car (assoc-string field-name
+ default-field-list t)))
+ (curname (buffer-substring beg-name end-name)))
+ (delete-region beg-name end-name)
+ (goto-char beg-name)
+ (insert (funcall bibtex-unify-case-convert
+ (or fname curname)))))
;; update point
(goto-char end-field))))
;; check whether all required fields are present
- (if (memq 'required-fields format)
- (let ((alt-expect (make-vector num-alt nil))
- (alt-found (make-vector num-alt 0)))
- (dolist (fname req-field-list)
- (cond ((setq idx (nth 3 fname))
- ;; t if field has alternative flag
- (bibtex-vec-push alt-expect idx (car fname))
- (if (member-ignore-case (car fname) field-list)
- (bibtex-vec-incr alt-found idx)))
- ((not (member-ignore-case (car fname) field-list))
- ;; If we use the crossref field, a required field
- ;; can have the OPT prefix. So if it was empty,
- ;; we have deleted by now. Nonetheless we can
- ;; move point on this empty field.
- (setq error-field-name (car fname))
- (error "Mandatory field `%s' is missing" (car
fname)))))
- (dotimes (idx num-alt)
- (cond ((= 0 (aref alt-found idx))
- (setq error-field-name (car (last (aref
alt-fields idx))))
- (error "Alternative mandatory field `%s' is
missing"
- (aref alt-expect idx)))
- ((< 1 (aref alt-found idx))
- (setq error-field-name (car (last (aref
alt-fields idx))))
- (error "Alternative fields `%s' are defined %s
times"
- (aref alt-expect idx)
- (length (aref alt-fields idx))))))))
+ (when (memq 'required-fields format)
+ (let ((alt-expect (make-vector num-alt nil))
+ (alt-found (make-vector num-alt 0)))
+ (dolist (fname req-field-list)
+ (cond ((setq idx (nth 3 fname))
+ ;; t if field has alternative flag
+ (bibtex-vec-push alt-expect idx (car fname))
+ (if (member-ignore-case (car fname) field-list)
+ (bibtex-vec-incr alt-found idx)))
+ ((not (member-ignore-case (car fname) field-list))
+ ;; If we use the crossref field, a required field
+ ;; can have the OPT prefix. So if it was empty,
+ ;; we have deleted by now. Nonetheless we can
+ ;; move point on this empty field.
+ (setq error-field-name (car fname))
+ (error "Mandatory field `%s' is missing"
+ (car fname)))))
+ (dotimes (idx num-alt)
+ (cond ((= 0 (aref alt-found idx))
+ (setq error-field-name
+ (car (last (aref alt-fields idx))))
+ (error "Alternative mandatory field `%s' is missing"
+ (aref alt-expect idx)))
+ ((< 1 (aref alt-found idx))
+ (setq error-field-name
+ (car (last (aref alt-fields idx))))
+ (error "Alternative fields `%s' are defined %s times"
+ (aref alt-expect idx)
+ (length (aref alt-fields idx))))))))
;; update comma after last field
(if (memq 'last-comma format)