# HG changeset patch # User Stefan Monnier # Date 1086132660 0 # Node ID 1b2cb608f18ebdaaeb39588b33ec2f8d7c61532c # Parent 7fd80a9c338d408923c168e220093d5fb709ac63 (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. diff -r 7fd80a9c338d -r 1b2cb608f18e lisp/textmodes/bibtex.el --- 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))