1

I have this function:

(defvar biblio-publishers-info-list
  '(("Cambridge University Press" . "Cambridge, U.K."))
  "DOCSTRING")

(defun biblio-publishers-info-complete ()
  "DOCSTRING. E.g.:
Cambridge University Press (2013)
-->
Cambridge University Press, Cambridge, U.K. (2013)"
  (interactive)
  (save-excursion
    (goto-char (point-max))
    (let* ((replace-regexp-lax-whitespace "\\(?:\n?[~\s\t]+\\|\n\\)")
           (case-fold-search t)
           (case-replace nil))
      (delete-trailing-whitespace)
      (dolist (COUPLE biblio-publishers-info-list)
        (let* ((PUBLISHER (car COUPLE))
               (ADDRESS (cdr COUPLE)))
          (with-syntax-table (copy-syntax-table latex-mode-syntax-table)
            (modify-syntax-entry '126 "-" )
            (query-replace-regexp (format "\\(%s\\),? (?\\([12][0-9]\\{3\\}\\))?"
                                          (downcase PUBLISHER))
                                  (format "%s, %s (\\2)" PUBLISHER ADDRESS)
                                  nil (point-min) (point-max))))))))

It works on:

Cambridge University Press (2013)

Cambridge University Press,  2013

CAMBRIDGE UNIVERSITY PRESS 2013

cambridge university Press (2013)

cambridge
university Press (2013)

but not on:

Cambridge University~Press, 2013

Is it possible to make query-replace-regexp interpret the ~ character as a whitespace? I tried do modify the syntax table but it didn't work.

I need to use this function on LaTeX documents so the major mode is latex-mode.

Drew
  • 75,699
  • 9
  • 109
  • 225
Gabriele Nicolardi
  • 1,199
  • 8
  • 17

1 Answers1

1

I found a solution. I need to redefine (let-binding) both replace-regexp-lax-whitespace and search-whitespace-regexp:

(defvar biblio-publishers-info-list
  '(("Cambridge University Press" . "Cambridge, U.K."))
  "DOCSTRING")

(defun biblio-publishers-info-complete ()
  "DOCSTRING. E.g.:
Cambridge University Press (2013)
-->
Cambridge University Press, Cambridge, U.K. (2013)"
  (interactive)
  (save-excursion
    (goto-char (point-max))
    (let* ((replace-regexp-lax-whitespace "\\(?:\n?[~\s\t]+\\|\n\\)")
           (search-whitespace-regexp replace-regexp-lax-whitespace)
           (case-fold-search t)
           (case-replace nil))
      (delete-trailing-whitespace)
      (dolist (COUPLE biblio-publishers-info-list)
        (let* ((PUBLISHER (car COUPLE))
               (ADDRESS (cdr COUPLE)))
          
            (query-replace-regexp (format "\\(%s\\),? (?\\([12][0-9]\\{3\\}\\))?"
                                          (downcase PUBLISHER))
                                  (format "%s, %s (\\2)" PUBLISHER ADDRESS)
                                  nil (point-min) (point-max)))))))
Gabriele Nicolardi
  • 1,199
  • 8
  • 17