changeset 55880:1b2cb608f18e

(bibtex-format-entry): Fix regexps. (bibtex-parse-strings): Bugfix, use assoc instead of assoc-string. (bibtex-entry-update): Handle alternatives and optional fields. (bibtex-parse-entry): Bugfix, handle empty key.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 01 Jun 2004 23:31:00 +0000
parents 7fd80a9c338d
children 79a700a71463
files lisp/textmodes/bibtex.el
diffstat 1 files changed, 13 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/bibtex.el	Tue Jun 01 23:21:55 2004 +0000
+++ b/lisp/textmodes/bibtex.el	Tue Jun 01 23:31:00 2004 +0000
@@ -1793,7 +1793,7 @@
         (goto-char (point-min))
         (let* ((fields-alist (bibtex-parse-entry))
                (case-fold-search t)
-               (field (bibtex-assoc-regexp "\\(OPT\\)?crossref\\>"
+               (field (bibtex-assoc-regexp "\\`\\(OPT\\)?crossref\\'"
                                            fields-alist)))
           (setq crossref-key (and field
                                   (not (string-match bibtex-empty-field-re
@@ -1807,7 +1807,7 @@
             (when (nth 3 rfield) ; we should have an alternative
               (setq alternatives-there t
                     field (bibtex-assoc-regexp
-                           (concat "\\(ALT\\)?" (car rfield) "\\>")
+                           (concat "\\`\\(ALT\\)?" (car rfield) "\\'")
                            fields-alist))
               (if (and field
                        (not (string-match bibtex-empty-field-re
@@ -2317,7 +2317,7 @@
                 ;; user has aborted by typing a key --> return `aborted'
                 (throw 'userkey 'aborted))
             (setq key (bibtex-reference-key-in-string bounds))
-            (if (not (assoc-string key strings t))
+            (if (not (assoc key strings))
                 (push (cons key (bibtex-text-in-string bounds t))
                       strings))
             (goto-char (bibtex-end-of-text-in-string bounds)))
@@ -2722,24 +2722,27 @@
     (let* ((fields-alist (bibtex-parse-entry))
            (field-list (bibtex-field-list
                         (substring (cdr (assoc "=type=" fields-alist))
-                                   1)))) ; don't want @
+                                   1))) ; don't want @
+           (case-fold-search t))
       (dolist (field (car field-list))
-        (unless (assoc-string (car field) fields-alist t)
+        (unless (bibtex-assoc-regexp (concat "\\`\\(ALT\\)?" (car field) "\\'")
+                                     fields-alist)
           (bibtex-make-field field)))
       (dolist (field (cdr field-list))
-        (unless (assoc-string (car field) fields-alist t)
+        (unless (bibtex-assoc-regexp (concat "\\`\\(OPT\\)?" (car field) "\\'")
+                                     fields-alist)
           (bibtex-make-optional-field field))))))
 
 (defun bibtex-parse-entry ()
   "Parse entry at point, return an alist.
 The alist elements have the form (FIELD . TEXT), where FIELD can also be
-the special strings \"=type=\" and \"=key=\".
-Move point to the end of the last field."
+the special strings \"=type=\" and \"=key=\". For the FIELD \"=key=\"
+TEXT may be nil. Move point to the end of the last field."
   (let (alist bounds)
-    (when (looking-at bibtex-entry-head)
+    (when (looking-at bibtex-entry-maybe-empty-head)
       (push (cons "=type=" (match-string bibtex-type-in-head)) alist)
       (push (cons "=key=" (match-string bibtex-key-in-head)) alist)
-      (goto-char (match-end bibtex-key-in-head))
+      (goto-char (match-end 0))
       (while (setq bounds (bibtex-parse-field bibtex-field-name))
 	(push (cons (bibtex-name-in-field bounds)
 		    (bibtex-text-in-field-bounds bounds))