diff --git a/functions.js b/functions.js index 89e3c2619..6ba37811e 100644 --- a/functions.js +++ b/functions.js @@ -64,6 +64,24 @@ function xmlhttp_ready(obj) { return obj.readyState == 4 || obj.readyState == 0 || !obj.readyState; } +function open_article_callback() { + if (xmlhttp_rpc.readyState == 4) { + try { + + if (xmlhttp_rpc.responseXML) { + var link = xmlhttp_rpc.responseXML.getElementsByTagName("link")[0]; + + if (link) { + window.open(link.firstChild.nodeValue, "_blank"); + } + } + + } catch (e) { + exception_error("open_article_callback", e); + } + } +} + function logout_callback() { var container = document.getElementById('notify'); if (xmlhttp.readyState == 4) { @@ -303,6 +321,12 @@ function hotkey_handler(e) { } } + if (keycode == 86) { // v + if (getActiveArticleId()) { + openArticleInNewWindow(getActiveArticleId()); + } + } + if (typeof localHotkeyHandler != 'undefined') { try { return localHotkeyHandler(e); @@ -1715,3 +1739,26 @@ function getRelativePostIds(id) { return false; } + +function openArticleInNewWindow(id) { + try { + + if (!xmlhttp_ready(xmlhttp_rpc)) { + printLockingError(); + return + } + + debug("openArticleInNewWindow: " + id); + + var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id; + + debug(query); + + xmlhttp_rpc.open("GET", query, true); + xmlhttp_rpc.onreadystatechange=open_article_callback; + xmlhttp_rpc.send(null); + + } catch (e) { + exception_error("openArticleInNewWindow", e); + } +} diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index e70b75524..868d46445 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -201,6 +201,21 @@ } + if ($subop == "getArticleLink") { + + $id = db_escape_string($_GET["id"]); + + $result = db_query($link, "SELECT link FROM ttrss_entries, ttrss_user_entries + WHERE id = '$id' AND id = ref_id AND owner_uid = '".$_SESSION['uid']."'"); + + if (db_num_rows($result) == 1) { + $link = strip_tags(db_fetch_result($result, 0, "link")); + print "$link"; + } else { + print "Article not found"; + } + } + if ($subop == "setArticleTags") { $id = db_escape_string($_GET["id"]); diff --git a/viewfeed.js b/viewfeed.js index 1d6a4a62b..4fd9db30f 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -909,3 +909,7 @@ function cache_invalidate(id) { exception_error("cache_invalidate", e); } } + +function getActiveArticleId() { + return active_post_id; +}