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; }