diff --git a/Controllers/kagiSummarizerController.php b/Controllers/kagiSummarizerController.php index 4a262f6..dafae46 100644 --- a/Controllers/kagiSummarizerController.php +++ b/Controllers/kagiSummarizerController.php @@ -15,6 +15,7 @@ class FreshExtension_kagiSummarizer_Controller extends Minz_ActionController { $this->view->_layout(false); $kagi_token = FreshRSS_Context::$user_conf->kagi_token; + $kagi_language = FreshRSS_Context::$user_conf->kagi_language; if ($kagi_token === null || trim($kagi_token) === '') { echo json_encode(array( @@ -35,7 +36,10 @@ class FreshExtension_kagiSummarizer_Controller extends Minz_ActionController { } $entry_link = urlencode($entry->link()); - $url = 'https://kagi.com/mother/summary_labs?summary_type=summary&url=' . $entry_link; + $url = 'https://kagi.com/mother/summary_labs' + . '?summary_type=' . Minz_Request::param('type') + . '&target_language=' . $kagi_language + . '&url=' . $entry_link; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); diff --git a/configure.phtml b/configure.phtml index ca3eee3..883bd76 100644 --- a/configure.phtml +++ b/configure.phtml @@ -1,14 +1,57 @@ kagi_token; + $kagi_language = FreshRSS_Context::$user_conf->kagi_language; + function printLanguageOption($lang, $selected) { + echo ''; + } ?>
-

+

+
+
+
+ +
+
diff --git a/extension.php b/extension.php index 227c306..f4fe56e 100644 --- a/extension.php +++ b/extension.php @@ -5,6 +5,7 @@ class KagiSummarizerExtension extends Minz_Extension { $this->registerTranslates(); $this->registerHook('entry_before_display', [$this, 'addSummarizeButton']); Minz_View::appendScript($this->getFileUrl('script.js', 'js'), false, false, false); + Minz_View::appendStyle($this->getFileUrl('style.css', 'css')); Minz_View::appendScript(_url('kagiSummarizer', 'kagiStrings'), false, true, false); $this->registerViews(); $this->registerController('kagiSummarizer'); @@ -18,21 +19,34 @@ class KagiSummarizerExtension extends Minz_Extension { $kagi_token = substr($kagi_token, strlen($prefix)); } FreshRSS_Context::$user_conf->kagi_token = $kagi_token; + FreshRSS_Context::$user_conf->kagi_language = Minz_Request::param('kagi_language', ''); FreshRSS_Context::$user_conf->save(); } } public function addSummarizeButton(FreshRSS_Entry $entry): FreshRSS_Entry { $this->registerTranslates(); - $url = Minz_Url::display(array( + $url_summary = Minz_Url::display(array( 'c' => 'kagiSummarizer', 'a' => 'summarize', 'params' => array( - 'id' => $entry->id() - ))); + 'id' => $entry->id(), + 'type' => 'summary', + ))); + $url_key_moments = Minz_Url::display(array( + 'c' => 'kagiSummarizer', + 'a' => 'summarize', + 'params' => array( + 'id' => $entry->id(), + 'type' => 'takeaway', + ))); $entry->_content( - '

' - . _t('ext.kagiSummarizer.ui.summarize_button') . '

' + '' . $entry->content()); return $entry; } diff --git a/i18n/en/ext.php b/i18n/en/ext.php index b3577fc..b701df8 100644 --- a/i18n/en/ext.php +++ b/i18n/en/ext.php @@ -4,10 +4,44 @@ return array( 'kagiSummarizer' => array( 'configure' => array( 'kagi_token' => 'Kagi Token', - 'kagi_token_help' => 'Copy and paste the "Session Link" from your Kagi Account settings.' + 'kagi_token_help' => 'Copy and paste the "Session Link" from your Kagi Account settings.', + 'kagi_language' => 'Output Language', + 'lang' => array( + 'default' => 'Default', + 'bg' => 'Bulgarian', + 'cs' => 'Czech', + 'da' => 'Danish', + 'de' => 'German', + 'el' => 'Greek', + 'en' => 'English', + 'es' => 'Spanish', + 'et' => 'Estonian', + 'fi' => 'Finnish', + 'fr' => 'French', + 'hu' => 'Hungarian', + 'id' => 'Indonesian', + 'it' => 'Italian', + 'ja' => 'Japanese', + 'ko' => 'Korean', + 'lt' => 'Lithuanian', + 'lv' => 'Latvian', + 'nb' => 'Norwegian', + 'nl' => 'Dutch', + 'pl' => 'Polish', + 'pt' => 'Portuguese', + 'ro' => 'Romanian', + 'ru' => 'Russian', + 'sk' => 'Slovak', + 'sl' => 'Slovenian', + 'sv' => 'Swedish', + 'tr' => 'Turkish', + 'uk' => 'Ukrainian', + 'zh' => 'Chinese (simplified)', + ), ), 'ui' => array( 'summarize_button' => 'Summarize', + 'key_moments_button' => 'Key Moments', 'loading_summary' => 'Loading summary...', 'error' => 'Error retrieving summary.', 'no_token_configured' => 'No Kagi token configured.' diff --git a/metadata.json b/metadata.json index 4fc8603..36516d6 100644 --- a/metadata.json +++ b/metadata.json @@ -1,8 +1,8 @@ { "name": "Kagi Summarizer", "author": "Rudis Muiznieks", - "description": "Add a button to summarize articles with the Kagi Universal Summarizer.", - "version": 0.1, + "description": "Add buttons to summarize articles with the Kagi Universal Summarizer.", + "version": 0.2, "entrypoint": "KagiSummarizer", "type": "user" } diff --git a/static/script.js b/static/script.js index 851b36f..ad2f885 100644 --- a/static/script.js +++ b/static/script.js @@ -19,14 +19,51 @@ function configureSummarizeButtons() { }, false); } +function setKagiState(container, statusType, statusMsg, summaryText) { + var kstatus = container.querySelector('.kagi-status'); + var content = container.querySelector('.kagi-content'); + + switch(statusType) { + case 0: + container.classList.remove('kagi-loading'); + kstatus.classList.remove('alert-warn'); + kstatus.classList.remove('alert-error'); + kstatus.classList.add('hidden'); + kstatus.innerHTML = ''; + break; + case 1: + container.classList.add('kagi-loading'); + kstatus.classList.remove('alert-error'); + kstatus.classList.add('alert-warn'); + kstatus.innerHTML = statusMsg; + kstatus.classList.remove('hidden'); + break; + case 2: + container.classList.remove('kagi-loading'); + kstatus.classList.remove('alert-warn'); + kstatus.classList.add('alert-error'); + kstatus.innerHTML = statusMsg; + break; + } + + if (summaryText) { + content.innerHTML = summaryText.replace(/(?:\r\n|\r|\n)/g, '
'); + content.classList.remove('hidden'); + } else { + content.classList.add('hidden'); + content.innerHTML = ''; + } +} + function summarizeButtonClick(button) { - var url = button.href; var container = button.parentNode; + if (container.classList.contains('kagi-loading')) { + return; + } - container.classList.add('alert'); - container.classList.add('alert-warn'); - container.innerHTML = kagi_strings.loading_summary; + setKagiState(container, 1, kagi_strings.loading_summary, null); + var url = button.href; var request = new XMLHttpRequest(); request.open('POST', url, true); request.responseType = 'json'; @@ -36,31 +73,25 @@ function summarizeButtonClick(button) { return request.onerror(e); } - var response = xmlHttpRequestJson(this); - if (!response) { + var xresp = xmlHttpRequestJson(this); + if (!xresp) { return request.onerror(e); } - if (response.status !== 200 || !response.response || !response.response.output_text) { + if (xresp.status !== 200 || !xresp.response || !xresp.response.output_text) { return request.onerror(e); } - if (response.response.error) { - container.classList.remove('alert-warn'); - container.classList.add('alert-error'); + if (xresp.response.error) { + setKagiState(container, 2, xresp.response.output_text, null); } else { - container.classList.remove('alert-warn'); - container.classList.add('alert-success'); + setKagiState(container, 0, null, xresp.response.output_text); } - - container.innerHTML = response.response.output_text; } request.onerror = function(e) { badAjax(this.status == 403); - container.classList.remove('alert-warn'); - container.classList.add('alert-error'); - container.innerHTML = kagi_strings.error; + setKagiState(container, 2, kagi_strings.error, null); } request.setRequestHeader('Content-Type', 'application/json'); diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..0b50c0f --- /dev/null +++ b/static/style.css @@ -0,0 +1,7 @@ +div.kagi-summary { margin-top: 1em; } +div.kagi-summary blockquote { margin-top: 1em; } +div.kagi-summary a { font-size: 0.8em; } +div.kagi-summary.kagi-loading a { opacity: 0.5; } +div.kagi-summary.kagi-loading a:hover { color: inherit; background-color: inherit; } +div.kagi-summary.kagi-loading a:active { color: inherit; background-color: inherit; } +div.kagi-summary .hidden { display: none; }