1
0
Fork 0

Refactored language selection

Fallback to English if all else fails (invalid language given and an
invalid default language code).
This commit is contained in:
Bram Schoenmakers 2024-02-18 09:08:54 +01:00
parent 016e453238
commit 7d6f6f1cf1
Signed by: bram
GPG key ID: 0CCD19DFDC63258F
2 changed files with 28 additions and 17 deletions

View file

@ -254,7 +254,7 @@ https://www.example.com"
(describe "kagi-summarize"
:var ((kagi-summarizer-default-language))
(before-each
(setq kagi-summarizer-default-language "XY"))
(setq kagi-summarizer-default-language "NL"))
(it "returns a summary on minimal text input"
(expect (kagi-summarize just-enough-text-input) :to-equal dummy-output))
(it "makes exactly one API call"
@ -287,11 +287,16 @@ https://www.example.com"
(it "falls back to the default language for invalid language codes"
(expect (kagi-summarize just-enough-text-input "VL") :to-equal dummy-output)
(let ((args (car (spy-calls-args-for #'kagi--call-summarizer 0))))
(expect (map-elt args "target_language") :to-equal "XY")))
(expect (map-elt args "target_language") :to-equal "NL")))
(it "falls back to the default language for invalid language names"
(expect (kagi-summarize just-enough-text-input "Valyrian") :to-equal dummy-output)
(let ((args (car (spy-calls-args-for #'kagi--call-summarizer 0))))
(expect (map-elt args "target_language") :to-equal "XY")))
(expect (map-elt args "target_language") :to-equal "NL")))
(it "falls back to English if the default language is invalid"
(setq kagi-summarizer-default-language "XY")
(expect (kagi-summarize just-enough-text-input "Valyrian") :to-equal dummy-output)
(let ((args (car (spy-calls-args-for #'kagi--call-summarizer 0))))
(expect (map-elt args "target_language") :to-equal "EN")))
(it "returns a summary for an HTTPS URL"
(expect (kagi-summarize dummy-https-url) :to-equal dummy-output))
(it "returns a summary for an uppercase HTTPS URL"

34
kagi.el
View file

@ -513,25 +513,31 @@ no issues."
"Non-nil if string S is a URL."
(string-match-p (rx (seq bos "http" (? "s") "://" (+ (not space)) eos)) s))
(defun kagi--valid-language-name-p (language)
"Return non-nil if LANGUAGE is a valid language name."
(and (stringp language)
(map-elt kagi--summarizer-languages (capitalize language))))
(defun kagi--valid-language-code-p (language)
"Return t if LANGUAGE is a valid two letter language code for the summarizer."
(and (stringp language)
(seq-contains-p
(map-values kagi--summarizer-languages)
(upcase language))))
(defun kagi--summarizer-determine-language (hint)
"Determine the language for the summary given a language HINT.
The HINT may be a language code (e.g. `DE') or a language
name (e.g. `GERMAN'). If as invalid hint is given, it falls back
name (e.g. `German'). If as invalid hint is given, it falls back
to `kagi-summarizer-default-language'."
(if (stringp hint)
(or
;; check language code
(map-elt kagi--summarizer-languages (capitalize hint))
;; not a valid code, check it as a name
(and (seq-contains-p
(map-values kagi--summarizer-languages)
(upcase hint))
(upcase hint))
;; neither valid code or name, fallback
kagi-summarizer-default-language)
;; hint was nil or something else, fallback
kagi-summarizer-default-language))
(cond
((kagi--valid-language-code-p hint) (upcase hint))
((kagi--valid-language-name-p hint)
(map-elt kagi--summarizer-languages (capitalize hint)))
((kagi--valid-language-code-p kagi-summarizer-default-language)
kagi-summarizer-default-language)
(t "EN")))
(defun kagi-summarize (text-or-url &optional language engine format)
"Return the summary of the given TEXT-OR-URL.