From 5b18c93622e97b9a251f3b85bdb088022fd5c0f3 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 18 Mar 2013 20:59:48 +0400 Subject: tweak hotkey map notation to allow stuff like shift-arrows --- js/tt-rss.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'js') diff --git a/js/tt-rss.js b/js/tt-rss.js index badfe8707..5ada64d31 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -556,7 +556,7 @@ function hotkey_handler(e) { if (keycode == 16) return; // ignore lone shift if (keycode == 17) return; // ignore lone ctrl - if (!shift_key) keychar = keychar.toLowerCase(); + keychar = keychar.toLowerCase(); var hotkeys = getInitParam("hotkeys"); @@ -577,7 +577,11 @@ function hotkey_handler(e) { Element.hide(cmdline); var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")"; + + // ensure ^*char notation + if (shift_key) hotkey = "*" + hotkey; if (ctrl_key) hotkey = "^" + hotkey; + hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey; hotkey_prefix = false; -- cgit v1.2.3-54-g00ecf From 4f7d69e1856a611025f53eef273e5af039d9aa16 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 12:49:55 +0400 Subject: detect whether browser supports iframe.sandbox and allow iframes accordingly; allow object and embed elements --- classes/rpc.php | 1 + include/functions.php | 4 +++- js/tt-rss.js | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) (limited to 'js') diff --git a/classes/rpc.php b/classes/rpc.php index 5d77b1ae8..b297bbade 100644 --- a/classes/rpc.php +++ b/classes/rpc.php @@ -285,6 +285,7 @@ class RPC extends Handler_Protected { function sanityCheck() { $_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true"; + $_SESSION["hasSandbox"] = $_REQUEST["hasSandbox"] === "true"; $reply = array(); diff --git a/include/functions.php b/include/functions.php index 0e5d15eaf..50bdc13ae 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2626,7 +2626,9 @@ $allowed_elements = array('p', 'br', 'div', 'table', 'tr', 'td', 'th', 'ul', 'ol', 'li', 'blockquote', 'span', 'html', 'body', 'a', 'img', - 'iframe', 'video', 'audio', 'source'); + 'video', 'audio', 'source', 'object', 'embed'); + + if ($_SESSION['hasSandbox']) array_push($allowed_elements, 'iframe'); $disallowed_attributes = array('id', 'style', 'class'); diff --git a/js/tt-rss.js b/js/tt-rss.js index 5ada64d31..5968f58eb 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -244,9 +244,11 @@ function init() { loading_set_progress(20); var hasAudio = !!((myAudioTag = document.createElement('audio')).canPlayType); + var hasSandbox = "sandbox" in document.createElement("iframe"); new Ajax.Request("backend.php", { - parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio}, + parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio, + hasSandbox: hasSandbox}, onComplete: function(transport) { backend_sanity_check_callback(transport); } }); -- cgit v1.2.3-54-g00ecf From 714b063f6bb08f94aef94620de5c883ef6322676 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 16:11:43 +0400 Subject: hideReadFeeds also hides labels --- js/FeedTree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js') diff --git a/js/FeedTree.js b/js/FeedTree.js index 2cb6346e4..0b75629f0 100644 --- a/js/FeedTree.js +++ b/js/FeedTree.js @@ -309,7 +309,7 @@ dojo.declare("fox.FeedTree", dijit.Tree, { var node = tree._itemNodesMap[id]; if (node) { - if (hide && unread == 0 && (bare_id > 0 || !show_special)) { + if (hide && unread == 0 && (bare_id > 0 || bare_id < -10 || !show_special)) { Effect.Fade(node[0].rowNode, {duration : 0.3, queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }}); } else { -- cgit v1.2.3-54-g00ecf From 4b746489098bc2d6bfc520715fb422b82259491c Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 16:46:27 +0400 Subject: remove two unnecessary hideOrShowFeeds calls --- js/feedlist.js | 1 - js/tt-rss.js | 2 -- 2 files changed, 3 deletions(-) (limited to 'js') diff --git a/js/feedlist.js b/js/feedlist.js index e227c9386..4dc8b503e 100644 --- a/js/feedlist.js +++ b/js/feedlist.js @@ -154,7 +154,6 @@ function feedlist_init() { try { console.log("in feedlist init"); - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); document.onkeydown = hotkey_handler; setTimeout("hotkey_prefix_timeout()", 5*1000); diff --git a/js/tt-rss.js b/js/tt-rss.js index 5968f58eb..357e07780 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -895,8 +895,6 @@ function handle_rpc_json(transport, scheduled_call) { if (runtime_info) parse_runtime_info(runtime_info); - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - Element.hide(dijit.byId("net-alert").domNode); } else { -- cgit v1.2.3-54-g00ecf From 1d5cf085a37e8e016242c9cfea631a90861ab306 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 18:32:49 +0400 Subject: implement mail plugin using mailto: links; deprecate mail plugin --- classes/feeds.php | 5 ++ js/tt-rss.js | 2 + plugins/mail/init.php | 9 ++-- plugins/mailto/init.js | 32 ++++++++++++ plugins/mailto/init.php | 93 +++++++++++++++++++++++++++++++++++ plugins/mailto/mail.png | Bin 0 -> 192 bytes templates/email_article_template.txt | 2 - 7 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 plugins/mailto/init.js create mode 100644 plugins/mailto/init.php create mode 100644 plugins/mailto/mail.png (limited to 'js') diff --git a/classes/feeds.php b/classes/feeds.php index 4857cca78..5fa51768c 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -126,6 +126,11 @@ class Feeds extends Handler_Protected { ""; } + if ($pluginhost->get_plugin("mailto")) { + $reply .= ""; + } + $reply .= ""; $reply .= ""; diff --git a/js/tt-rss.js b/js/tt-rss.js index 357e07780..a8552d173 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -670,6 +670,8 @@ function hotkey_handler(e) { case "email_article": if (typeof emailArticle != "undefined") { emailArticle(); + } else if (typeof mailtoArticle != "undefined") { + mailtoArticle(); } else { alert(__("Please enable mail plugin first.")); } diff --git a/plugins/mail/init.php b/plugins/mail/init.php index 2e972cf61..0c8bc40aa 100644 --- a/plugins/mail/init.php +++ b/plugins/mail/init.php @@ -6,7 +6,7 @@ class Mail extends Plugin { function about() { return array(1.0, - "Share article via email", + "Share article via email (deprecated)", "fox"); } @@ -59,10 +59,9 @@ class Mail extends Plugin { $tpl->readTemplateFromFile("templates/email_article_template.txt"); - $tpl->setVariable('USER_NAME', $_SESSION["name"]); - $tpl->setVariable('USER_EMAIL', $user_email); - $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"]); - + $tpl->setVariable('USER_NAME', $_SESSION["name"], true); + $tpl->setVariable('USER_EMAIL', $user_email, true); + $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"], true); $result = db_query($this->link, "SELECT link, content, title FROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND diff --git a/plugins/mailto/init.js b/plugins/mailto/init.js new file mode 100644 index 000000000..8f7656a07 --- /dev/null +++ b/plugins/mailto/init.js @@ -0,0 +1,32 @@ +function mailtoArticle(id) { + try { + if (!id) { + var ids = getSelectedArticleIds2(); + + if (ids.length == 0) { + alert(__("No articles are selected.")); + return; + } + + id = ids.toString(); + } + + if (dijit.byId("emailArticleDlg")) + dijit.byId("emailArticleDlg").destroyRecursive(); + + var query = "backend.php?op=pluginhandler&plugin=mailto&method=emailArticle¶m=" + param_escape(id); + + dialog = new dijit.Dialog({ + id: "emailArticleDlg", + title: __("Forward article by email"), + style: "width: 600px", + href: query}); + + dialog.show(); + + } catch (e) { + exception_error("emailArticle", e); + } +} + + diff --git a/plugins/mailto/init.php b/plugins/mailto/init.php new file mode 100644 index 000000000..bbc0dffa4 --- /dev/null +++ b/plugins/mailto/init.php @@ -0,0 +1,93 @@ +link = $host->get_link(); + $this->host = $host; + + $host->add_hook($host::HOOK_ARTICLE_BUTTON, $this); + } + + function get_js() { + return file_get_contents(dirname(__FILE__) . "/init.js"); + } + + function hook_article_button($line) { + return "Zoom"; + } + + function emailArticle() { + + $param = db_escape_string($_REQUEST['param']); + + require_once "lib/MiniTemplator.class.php"; + + $tpl = new MiniTemplator; + $tpl_t = new MiniTemplator; + + $tpl->readTemplateFromFile("templates/email_article_template.txt"); + + $tpl->setVariable('USER_NAME', $_SESSION["name"], true); + $tpl->setVariable('USER_EMAIL', $user_email, true); + $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"], true); + + + $result = db_query($this->link, "SELECT link, content, title + FROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND + id IN ($param) AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) > 1) { + $subject = __("[Forwarded]") . " " . __("Multiple articles"); + } + + while ($line = db_fetch_assoc($result)) { + + if (!$subject) + $subject = __("[Forwarded]") . " " . htmlspecialchars($line["title"]); + + $tpl->setVariable('ARTICLE_TITLE', strip_tags($line["title"])); + $tpl->setVariable('ARTICLE_URL', strip_tags($line["link"])); + + $tpl->addBlock('article'); + } + + $tpl->addBlock('email'); + + $content = ""; + $tpl->generateOutputToString($content); + + $mailto_link = htmlspecialchars("mailto: ?subject=".urlencode($subject). + "&body=".urlencode($content)); + + print __("Clicking the following link to invoke your mail client:"); + + print ""; + + print __("You should be able to edit the message before sending in your mail client."); + + print "

"; + + print "

"; + print ""; + print "
"; + + //return; + } + +} +?> diff --git a/plugins/mailto/mail.png b/plugins/mailto/mail.png new file mode 100644 index 000000000..4d3fe7751 Binary files /dev/null and b/plugins/mailto/mail.png differ diff --git a/templates/email_article_template.txt b/templates/email_article_template.txt index 0d151d18c..5cf2b2750 100644 --- a/templates/email_article_template.txt +++ b/templates/email_article_template.txt @@ -6,8 +6,6 @@ I've been reading this and thought it might interest you: * ${ARTICLE_TITLE} ${ARTICLE_URL} -Sincerely yours, - ${USER_NAME} <${USER_EMAIL}>. -- This message has been sent by Tiny Tiny RSS installation at ${TTRSS_HOST}. -- cgit v1.2.3-54-g00ecf From d2db81a5f67dfc13bab7cf379d1182f7aa794eb1 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 19:13:56 +0400 Subject: improve hotkey buffer scrolling speed; bind viewport scrolling to shift-arrows --- include/functions.php | 2 ++ js/tt-rss.js | 8 ++++++-- js/viewfeed.js | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) (limited to 'js') diff --git a/include/functions.php b/include/functions.php index d1743af7a..4eff1149e 100644 --- a/include/functions.php +++ b/include/functions.php @@ -1946,6 +1946,8 @@ "c n" => "catchup_above", "*n" => "article_scroll_down", "*p" => "article_scroll_up", + "*(38)|Shift+up" => "article_scroll_up", + "*(40)|Shift+down" => "article_scroll_down", "a *w" => "toggle_widescreen", "e" => "email_article", "a q" => "close_article", diff --git a/js/tt-rss.js b/js/tt-rss.js index a8552d173..e9bc9d412 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -659,10 +659,14 @@ function hotkey_handler(e) { catchupRelativeToArticle(0); return false; case "article_scroll_down": - scrollArticle(50); + var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame"); + + scrollArticle(ctr.offsetHeight/3); return false; case "article_scroll_up": - scrollArticle(-50); + var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame"); + + scrollArticle(-ctr.offsetHeight/3); return false; case "close_article": closeArticlePanel(); diff --git a/js/viewfeed.js b/js/viewfeed.js index 622a8109f..9a16befff 100644 --- a/js/viewfeed.js +++ b/js/viewfeed.js @@ -560,11 +560,11 @@ function moveToPost(mode, noscroll) { var ctr = $("headlines-frame"); if (!noscroll && article && article.offsetTop < ctr.scrollTop) { - scrollArticle(-ctr.offsetHeight/2); + scrollArticle(-ctr.offsetHeight/3); } else if (!noscroll && prev_article && prev_article.offsetTop < ctr.scrollTop) { cdmExpandArticle(prev_id); - scrollArticle(-ctr.offsetHeight/2); + scrollArticle(-ctr.offsetHeight/3); } else if (prev_id) { cdmExpandArticle(prev_id); cdmScrollToArticleId(prev_id, noscroll); -- cgit v1.2.3-54-g00ecf From 6cf60c881fbad073b26a236f5659cdae7767ae10 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 19 Mar 2013 20:29:20 +0400 Subject: add little loading indicator for feed categories --- js/FeedTree.js | 18 ++++++++++++++++-- js/feedlist.js | 10 ++++------ 2 files changed, 20 insertions(+), 8 deletions(-) (limited to 'js') diff --git a/js/FeedTree.js b/js/FeedTree.js index 0b75629f0..b02d8ad7c 100644 --- a/js/FeedTree.js +++ b/js/FeedTree.js @@ -162,6 +162,13 @@ dojo.declare("fox.FeedTree", dijit.Tree, { tnode._menu = menu; } + if (id.match("CAT:")) { + loading = dojo.doc.createElement('img'); + loading.className = 'loadingNode'; + dojo.place(loading, tnode.labelNode, 'after'); + tnode.loadingNode = loading; + } + if (id.match("CAT:") && bare_id == -1) { var menu = new dijit.Menu(); menu.row_id = bare_id; @@ -243,8 +250,15 @@ dojo.declare("fox.FeedTree", dijit.Tree, { if (treeNode) { treeNode = treeNode[0]; - treeNode.expandoNode.src = src; - return true; + if (is_cat) { + if (treeNode.loadingNode) { + treeNode.loadingNode.src = src; + return true; + } + } else { + treeNode.expandoNode.src = src; + return true; + } } return false; diff --git a/js/feedlist.js b/js/feedlist.js index 4dc8b503e..ae4c3a2fb 100644 --- a/js/feedlist.js +++ b/js/feedlist.js @@ -125,13 +125,11 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) { Form.enable("main_toolbar_form"); - if (!offset) - if (!is_cat) { - if (!setFeedExpandoIcon(feed, is_cat, 'images/indicator_white.gif')) - notify_progress("Loading, please wait...", true); - } else { + if (!offset) { + if (!setFeedExpandoIcon(feed, is_cat, + (is_cat) ? 'images/indicator_tiny.gif' : 'images/indicator_white.gif')) notify_progress("Loading, please wait...", true); - } + } } query += "&cat=" + is_cat; -- cgit v1.2.3-54-g00ecf