diff --git a/kagi-test.el b/kagi-test.el index 3c61457..41959c3 100644 --- a/kagi-test.el +++ b/kagi-test.el @@ -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" diff --git a/kagi.el b/kagi.el index 026b88b..e150fd8 100644 --- a/kagi.el +++ b/kagi.el @@ -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.