Add textsec-restriction-level function

* lisp/international/textsec.el (textsec-restriction-level): New
function.
This commit is contained in:
Lars Ingebrigtsen 2022-01-17 16:24:17 +01:00
parent 523a96a99e
commit a1ffee1e82
2 changed files with 64 additions and 0 deletions

View file

@ -97,6 +97,58 @@ Not that a string may have several different minimal cover sets."
(setq set (seq-union set (seq-difference s set))))
(sort (delq 'common (delq 'inherited set)) #'string<)))
(defun textsec-restriction-level (string)
"Say what restriction level STRING qualifies for.
Levels are (in order of restrictiveness) `ascii-only',
`single-script', `highly-restrictive', `moderately-restrictive',
`minimally-restrictive' and `unrestricted'."
(let ((scripts (textsec-covering-scripts string)))
(cond
((string-match "\\`[[:ascii:]]+\\'" string)
'ascii-only)
((textsec-single-script-p string)
'single-script)
((or (null (seq-difference scripts '(latin han hiragana katakana)))
(null (seq-difference scripts '(latin han bopomofo)))
(null (seq-difference scripts '(latin han hangul))))
'highly-restrictive)
((and (= (length scripts) 2)
(memq 'latin scripts)
(seq-intersection scripts
'(arabic
armenian
bengali
bopomofo
devanagari
ethiopic
georgian
gujarati
gurmukhi
hangul
han
hebrew
hiragana
katakana
kannada
khmer
lao
malayalam
myanmar
oriya
sinhala
tamil
telugu
thaana
thai
tibetan)))
;; The string is covered by Latin and any one other Recommended
;; script, except Cyrillic, Greek.
'moderately-retrictive)
;; Fixme `minimally-restrictive' -- needs well-formedness criteria
;; and Identifier Profile.
(t
'unrestricted))))
(provide 'textsec)
;;; textsec.el ends here

View file

@ -69,4 +69,16 @@
(should (equal (textsec-covering-scripts "〆切")
'(han))))
(ert-deftest test-restriction-level ()
(should (eq (textsec-restriction-level "foo")
'ascii-only))
(should (eq (textsec-restriction-level "C𝗂𝗋𝖼𝗅𝖾")
'single-script))
(should (eq (textsec-restriction-level "切foo")
'highly-restrictive))
(should (eq (textsec-restriction-level "հfoo")
'moderately-retrictive))
(should (eq (textsec-restriction-level "Сirсlе")
'unrestricted)))
;;; textsec-tests.el ends here