Commit 19141a9b authored by Artur Malabarba's avatar Artur Malabarba

* lisp/character-fold.el: Also play nice with case-folding

(character-fold-to-regexp): Take `case-fold-search' into account.
parent 5c599700
...@@ -152,11 +152,13 @@ regexp) and other characters are `regexp-quote'd. ...@@ -152,11 +152,13 @@ regexp) and other characters are `regexp-quote'd.
FROM is for internal use. It specifies an index in the STRING FROM is for internal use. It specifies an index in the STRING
from which to start." from which to start."
(let ((spaces 0) (let* ((spaces 0)
(multi-char-table (char-table-extra-slot character-fold-table 0)) (multi-char-table (char-table-extra-slot character-fold-table 0))
(i (or from 0)) (lower-case-table (current-case-table))
(end (length string)) (upper-case-table (char-table-extra-slot lower-case-table 0))
(out nil)) (i (or from 0))
(end (length string))
(out nil))
;; When the user types a space, we want to match the table entry ;; When the user types a space, we want to match the table entry
;; for ?\s, which is generally a regexp like "[ ...]". However, ;; for ?\s, which is generally a regexp like "[ ...]". However,
;; the `search-spaces-regexp' variable doesn't "see" spaces inside ;; the `search-spaces-regexp' variable doesn't "see" spaces inside
...@@ -173,9 +175,21 @@ from which to start." ...@@ -173,9 +175,21 @@ from which to start."
(setq spaces 0)) (setq spaces 0))
(let ((regexp (or (aref character-fold-table c) (let ((regexp (or (aref character-fold-table c)
(regexp-quote (string c)))) (regexp-quote (string c))))
;; Long string. The regexp would probably be too long. (alist nil))
(alist (unless (> end 60) ;; Long string. The regexp would probably be too long.
(aref multi-char-table c)))) (unless (> end 50)
(setq alist (aref multi-char-table c))
(when case-fold-search
(let ((other-c (aref lower-case-table c)))
(when (or (not other-c)
(eq other-c c))
(setq other-c (aref upper-case-table c)))
(when other-c
(setq alist (append alist (aref multi-char-table other-c)))
(setq regexp (concat "\\(?:" regexp "\\|"
(or (aref character-fold-table other-c)
(regexp-quote (string other-c)))
"\\)"))))))
(push (let ((alist-out '("\\)"))) (push (let ((alist-out '("\\)")))
(pcase-dolist (`(,suffix . ,out-regexp) alist) (pcase-dolist (`(,suffix . ,out-regexp) alist)
(let ((len-suf (length suffix))) (let ((len-suf (length suffix)))
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
(ert-deftest character-fold--test-consistency () (ert-deftest character-fold--test-consistency ()
(dotimes (n 100) (dotimes (n 50)
(let ((w (character-fold--random-word n))) (let ((w (character-fold--random-word n)))
;; A folded string should always match the original string. ;; A folded string should always match the original string.
(character-fold--test-search-with-contents w w)))) (character-fold--test-search-with-contents w w))))
...@@ -57,7 +57,12 @@ ...@@ -57,7 +57,12 @@
(defun character-fold--test-match-exactly (string &rest strings-to-match) (defun character-fold--test-match-exactly (string &rest strings-to-match)
(let ((re (concat "\\`" (character-fold-to-regexp string) "\\'"))) (let ((re (concat "\\`" (character-fold-to-regexp string) "\\'")))
(dolist (it strings-to-match) (dolist (it strings-to-match)
(should (string-match re it))))) (should (string-match re it)))
;; Case folding
(let ((case-fold-search t))
(dolist (it strings-to-match)
(should (string-match (upcase re) (downcase it)))
(should (string-match (downcase re) (upcase it)))))))
(ert-deftest character-fold--test-some-defaults () (ert-deftest character-fold--test-some-defaults ()
(dolist (it '(("ffl" . "ffl") ("ffi" . "ffi") (dolist (it '(("ffl" . "ffl") ("ffi" . "ffi")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment