diff options
-rw-r--r-- | backend.php | 90 | ||||
-rw-r--r-- | feedlist.js | 54 | ||||
-rw-r--r-- | functions.php | 404 | ||||
-rw-r--r-- | viewfeed.js | 137 |
4 files changed, 314 insertions, 371 deletions
diff --git a/backend.php b/backend.php index 20186b08a..6fad38d2e 100644 --- a/backend.php +++ b/backend.php @@ -50,14 +50,9 @@ if ((!$op || $op == "rpc" || $op == "rss" || $op == "digestSend" || $op == "dlg" || - $op == "viewfeed" || $op == "publish" || $op == "globalUpdateFeeds") && !$_REQUEST["noxml"]) { header("Content-Type: application/xml; charset=utf-8"); - if (ENABLE_GZIP_OUTPUT) { - ob_start("ob_gzhandler"); - } - } else { if (!$_REQUEST["noxml"]) { header("Content-Type: text/html; charset=utf-8"); @@ -66,6 +61,10 @@ } } + if (ENABLE_GZIP_OUTPUT) { + ob_start("ob_gzhandler"); + } + if (SINGLE_USER_MODE) { authenticate_user($link, "admin", null); } @@ -246,10 +245,9 @@ case "viewfeed": - $print_exec_time = true; $timing_info = getmicrotime(); - print "<reply>"; + $reply = array(); if ($_REQUEST["debug"]) $timing_info = print_checkpoint("0", $timing_info); @@ -269,8 +267,26 @@ * when there's nothing to load - e.g. no stuff in fresh feed */ if ($feed == -5) { - generate_dashboard_feed($link); - print "</reply>"; + print json_encode(generate_dashboard_feed($link)); + return; + } + + $result = false; + + if ($feed < -10) { + $label_feed = -10-$feed; + $result = db_query($link, "SELECT id FROM ttrss_labels2 WHERE + id = '$label_feed' AND owner_uid = " . $_SESSION['uid']); + } else if (!$cat_view && $feed > 0) { + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE + id = '$feed' AND owner_uid = " . $_SESSION['uid']); + } else if ($cat_view) { + $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE + id = '$feed' AND owner_uid = " . $_SESSION['uid']); + } + + if ($result && db_num_rows($result) == 0) { + print json_encode(generate_error_feed($link, __("Feed not found."))); return; } @@ -290,11 +306,14 @@ WHERE id = '$feed' AND owner_uid = ".$_SESSION["uid"]); } - if (!$next_unread_feed) { - print "<headlines id=\"$feed\" is_cat=\"$cat_view\">"; - } else { - print "<headlines id=\"$next_unread_feed\" is_cat=\"$cat_view\">"; - } + $reply['headlines'] = array(); + + if (!$next_unread_feed) + $reply['headlines']['id'] = $feed; + else + $reply['headlines']['id'] = $next_unread_feed; + + $reply['headlines']['is_cat'] = (bool) $cat_view; $override_order = false; @@ -332,7 +351,7 @@ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("04", $timing_info); - $ret = outputHeadlinesList($link, $feed, $subop, + $ret = format_headlines_list($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgroup_last_feed, $override_order); @@ -342,64 +361,45 @@ $disable_cache = $ret[3]; $vgroup_last_feed = $ret[4]; - print "</headlines>"; + $reply['headlines']['content'] = $ret[5]; + $reply['headlines']['toolbar'] = $ret[6]; if ($_REQUEST["debug"]) $timing_info = print_checkpoint("05", $timing_info); - //print "<headlines-count value=\"$headlines_count\"/>"; - //print "<vgroup-last-feed value=\"$vgroup_last_feed\"/>"; - $headlines_unread = ccache_find($link, $returned_feed, $_SESSION["uid"], $cat_view, true); if ($headlines_unread == -1) { $headlines_unread = getFeedUnread($link, $returned_feed, $cat_view); - } - //print "<headlines-unread value=\"$headlines_unread\"/>"; - //printf("<disable-cache value=\"%d\"/>", $disable_cache); - - print "<headlines-info><![CDATA["; - - $info = array("count" => (int) $headlines_count, + $reply['headlines-info'] = array("count" => (int) $headlines_count, "vgroup_last_feed" => $vgroup_last_feed, "unread" => (int) $headlines_unread, "disable_cache" => (bool) $disable_cache); - print json_encode($info); - - print "]]></headlines-info>"; - - if ($_REQUEST["debug"]) $timing_info = print_checkpoint("10", $timing_info); - -/* if (is_array($topmost_article_ids) && !get_pref($link, 'COMBINED_DISPLAY_MODE') && !$_SESSION["bw_limit"]) { + if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info); + if (is_array($topmost_article_ids) && !get_pref($link, 'COMBINED_DISPLAY_MODE') && !$_SESSION["bw_limit"]) { $articles = array(); foreach ($topmost_article_ids as $id) { array_push($articles, format_article($link, $id, $feed, false)); } - print "<articles><![CDATA["; - print json_encode($articles); - print "]]></articles>"; - } */ - - if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info); + $reply['articles'] = $articles; + } - //if (get_pref($link, 'COMBINED_DISPLAY_MODE') || $subop) { if ($subop) { - print "<counters><![CDATA["; - print json_encode(getAllCounters($link, $omode, $feed)); - print "]]></counters>"; + $reply['counters'] = getAllCounters($link, $omode, $feed); } if ($_REQUEST["debug"]) $timing_info = print_checkpoint("30", $timing_info); - print_runtime_info($link); + $reply['runtime-info'] = make_runtime_info($link); + + print json_encode($reply); - print "</reply>"; break; // viewfeed case "pref-feeds": diff --git a/feedlist.js b/feedlist.js index b8dc473df..954a67c16 100644 --- a/feedlist.js +++ b/feedlist.js @@ -44,7 +44,7 @@ function viewfeed(feed, subop, is_cat, offset) { /* if (getInitParam("theme") == "" || getInitParam("theme") == "compact") { if (getInitParam("hide_feedlist") == 1) { Element.hide("feeds-holder"); - } + } } */ dijit.byId("content-tabs").selectChild( @@ -79,7 +79,7 @@ function viewfeed(feed, subop, is_cat, offset) { return; } - _infscroll_request_sent = timestamp; + _infscroll_request_sent = timestamp; } hideAuxDlg(); @@ -141,7 +141,7 @@ function viewfeed(feed, subop, is_cat, offset) { console.log(query); /* var unread_ctr = -1; - + if (!is_cat) unread_ctr = getFeedUnread(feed); var cache_check = false; @@ -149,7 +149,7 @@ function viewfeed(feed, subop, is_cat, offset) { if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) { var cache_prefix = ""; - + if (is_cat) { cache_prefix = "C:"; } else { @@ -163,8 +163,8 @@ function viewfeed(feed, subop, is_cat, offset) { if (cache_check) { setActiveFeedId(feed, is_cat); - - $("headlines-frame").innerHTML = cache_find_param(cache_prefix + feed, + + $("headlines-frame").innerHTML = cache_find_param(cache_prefix + feed, unread_ctr); request_counters(); @@ -181,34 +181,30 @@ function viewfeed(feed, subop, is_cat, offset) { new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { + onComplete: function(transport) { setFeedExpandoIcon(feed, is_cat, 'images/blank_icon.gif'); - headlines_callback2(transport, page_offset); + headlines_callback2(transport, page_offset); } }); // } } catch (e) { exception_error("viewfeed", e); - } + } } 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); if (!getActiveFeedId()) { - if (getInitParam("cdm_auto_catchup") != 1) { - setTimeout("viewfeed(-3)", 100); - } else { - setTimeout("viewfeed(-5)", 100); - } - } + setTimeout("viewfeed(-3)", 100); + } - console.log("T:" + + console.log("T:" + getInitParam("cdm_auto_catchup") + " " + getFeedUnread(-3)); hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); @@ -230,7 +226,7 @@ function request_counters_real() { new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { + onComplete: function(transport) { try { handle_rpc_json(transport); } catch (e) { @@ -316,7 +312,7 @@ function parse_counters(elems, scheduled_call) { // TODO: enable new content notification for categories - if (!activeFeedIsCat() && id == getActiveFeedId() + if (!activeFeedIsCat() && id == getActiveFeedId() && ctr > getFeedUnread(id) && scheduled_call) { displayNewContentPrompt(id); } @@ -329,7 +325,7 @@ function parse_counters(elems, scheduled_call) { if (id > 0) { if (has_img) { - setFeedIcon(id, false, + setFeedIcon(id, false, getInitParam("icons_url") + "/" + id + ".ico"); } else { setFeedIcon(id, false, 'images/blank_icon.gif'); @@ -337,7 +333,7 @@ function parse_counters(elems, scheduled_call) { } } } - + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); } catch (e) { @@ -349,7 +345,7 @@ function getFeedUnread(feed, is_cat) { try { var tree = dijit.byId("feedTree"); - if (tree && tree.model) + if (tree && tree.model) return tree.model.getFeedUnread(feed, is_cat); } catch (e) { @@ -370,20 +366,20 @@ function hideOrShowFeeds(hide) { return tree.hideRead(hide, getInitParam("hide_read_shows_special")); } -function getFeedName(feed, is_cat) { +function getFeedName(feed, is_cat) { var tree = dijit.byId("feedTree"); - if (tree && tree.model) + if (tree && tree.model) return tree.model.getFeedValue(feed, is_cat, 'name'); } -function getFeedValue(feed, is_cat, key) { +function getFeedValue(feed, is_cat, key) { try { var tree = dijit.byId("feedTree"); - if (tree && tree.model) + if (tree && tree.model) return tree.model.getFeedValue(feed, is_cat, key); - + } catch (e) { // } @@ -394,7 +390,7 @@ function setFeedUnread(feed, is_cat, unread) { try { var tree = dijit.byId("feedTree"); - if (tree && tree.model) + if (tree && tree.model) return tree.model.setFeedUnread(feed, is_cat, unread); } catch (e) { @@ -406,7 +402,7 @@ function setFeedValue(feed, is_cat, key, value) { try { var tree = dijit.byId("feedTree"); - if (tree && tree.model) + if (tree && tree.model) return tree.model.setFeedValue(feed, is_cat, key, value); } catch (e) { diff --git a/functions.php b/functions.php index 3f1d72f97..b0c768ff8 100644 --- a/functions.php +++ b/functions.php @@ -4019,135 +4019,136 @@ mb_strtolower(strip_tags($title), 'utf-8')); } - function print_headline_subtoolbar($link, $feed_site_url, $feed_title, + function format_headline_subtoolbar($link, $feed_site_url, $feed_title, $feed_id, $is_cat, $search, $match_on, $search_mode, $view_mode, $error) { - $page_prev_link = "viewFeedGoPage(-1)"; - $page_next_link = "viewFeedGoPage(1)"; - $page_first_link = "viewFeedGoPage(0)"; + $page_prev_link = "viewFeedGoPage(-1)"; + $page_next_link = "viewFeedGoPage(1)"; + $page_first_link = "viewFeedGoPage(0)"; - $catchup_page_link = "catchupPage()"; - $catchup_feed_link = "catchupCurrentFeed()"; - $catchup_sel_link = "catchupSelection()"; + $catchup_page_link = "catchupPage()"; + $catchup_feed_link = "catchupCurrentFeed()"; + $catchup_sel_link = "catchupSelection()"; - $archive_sel_link = "archiveSelection()"; - $delete_sel_link = "deleteSelection()"; + $archive_sel_link = "archiveSelection()"; + $delete_sel_link = "deleteSelection()"; - $sel_all_link = "selectArticles('all')"; - $sel_unread_link = "selectArticles('unread')"; - $sel_none_link = "selectArticles('none')"; - $sel_inv_link = "selectArticles('invert')"; + $sel_all_link = "selectArticles('all')"; + $sel_unread_link = "selectArticles('unread')"; + $sel_none_link = "selectArticles('none')"; + $sel_inv_link = "selectArticles('invert')"; - $tog_unread_link = "selectionToggleUnread()"; - $tog_marked_link = "selectionToggleMarked()"; - $tog_published_link = "selectionTogglePublished()"; + $tog_unread_link = "selectionToggleUnread()"; + $tog_marked_link = "selectionToggleMarked()"; + $tog_published_link = "selectionTogglePublished()"; - print "<div id=\"subtoolbar_main\">"; + $reply = "<div id=\"subtoolbar_main\">"; - print __('Select:')." - <a href=\"#\" onclick=\"$sel_all_link\">".__('All')."</a>, - <a href=\"#\" onclick=\"$sel_unread_link\">".__('Unread')."</a>, - <a href=\"#\" onclick=\"$sel_inv_link\">".__('Invert')."</a>, - <a href=\"#\" onclick=\"$sel_none_link\">".__('None')."</a></li>"; + $reply .= __('Select:')." + <a href=\"#\" onclick=\"$sel_all_link\">".__('All')."</a>, + <a href=\"#\" onclick=\"$sel_unread_link\">".__('Unread')."</a>, + <a href=\"#\" onclick=\"$sel_inv_link\">".__('Invert')."</a>, + <a href=\"#\" onclick=\"$sel_none_link\">".__('None')."</a></li>"; - print " "; + $reply .= " "; - print "<select dojoType=\"dijit.form.Select\" - onchange=\"headlineActionsChange(this)\">"; - print "<option value=\"false\">".__('Actions...')."</option>"; + $reply .= "<select dojoType=\"dijit.form.Select\" + onchange=\"headlineActionsChange(this)\">"; + $reply .= "<option value=\"false\">".__('Actions...')."</option>"; - print "<option value=\"0\" disabled=\"1\">".__('Selection toggle:')."</option>"; + $reply .= "<option value=\"0\" disabled=\"1\">".__('Selection toggle:')."</option>"; - print "<option value=\"$tog_unread_link\">".__('Unread')."</option> - <option value=\"$tog_marked_link\">".__('Starred')."</option> - <option value=\"$tog_published_link\">".__('Published')."</option>"; + $reply .= "<option value=\"$tog_unread_link\">".__('Unread')."</option> + <option value=\"$tog_marked_link\">".__('Starred')."</option> + <option value=\"$tog_published_link\">".__('Published')."</option>"; - print "<option value=\"0\" disabled=\"1\">".__('Selection:')."</option>"; + $reply .= "<option value=\"0\" disabled=\"1\">".__('Selection:')."</option>"; - print "<option value=\"$catchup_sel_link\">".__('Mark as read')."</option>"; + $reply .= "<option value=\"$catchup_sel_link\">".__('Mark as read')."</option>"; - if ($feed_id != "0") { - print "<option value=\"$archive_sel_link\">".__('Archive')."</option>"; - } else { - print "<option value=\"$archive_sel_link\">".__('Move back')."</option>"; - print "<option value=\"$delete_sel_link\">".__('Delete')."</option>"; - - } + if ($feed_id != "0") { + $reply .= "<option value=\"$archive_sel_link\">".__('Archive')."</option>"; + } else { + $reply .= "<option value=\"$archive_sel_link\">".__('Move back')."</option>"; + $reply .= "<option value=\"$delete_sel_link\">".__('Delete')."</option>"; - print "<option value=\"emailArticle(false)\">".__('Forward by email'). - "</option>"; + } - $rss_link = htmlspecialchars(get_self_url_prefix() . - "/backend.php?op=rss&id=$feed_id&is_cat=$is_cat&view_mode=$view_mode$search_q"); + $reply .= "<option value=\"emailArticle(false)\">".__('Forward by email'). + "</option>"; - print "<option value=\"0\" disabled=\"1\">".__('Feed:')."</option>"; + $rss_link = htmlspecialchars(get_self_url_prefix() . + "/backend.php?op=rss&id=$feed_id&is_cat=$is_cat&view_mode=$view_mode$search_q"); - print "<option value=\"catchupPage()\">".__('Mark as read')."</option>"; + $reply .= "<option value=\"0\" disabled=\"1\">".__('Feed:')."</option>"; - print "<option value=\"displayDlg('generatedFeed', '$feed_id:$is_cat:$rss_link')\">".__('View as RSS')."</option>"; + $reply .= "<option value=\"catchupPage()\">".__('Mark as read')."</option>"; - print "</select>"; + $reply .= "<option value=\"displayDlg('generatedFeed', '$feed_id:$is_cat:$rss_link')\">".__('View as RSS')."</option>"; - print "</div>"; + $reply .= "</select>"; - print "<div id=\"subtoolbar_ftitle\">"; + $reply .= "</div>"; - if ($feed_site_url) { - $target = "target=\"_blank\""; - print "<a title=\"".__("Visit the website")."\" $target href=\"$feed_site_url\">". - truncate_string($feed_title,30)."</a>"; + $reply .= "<div id=\"subtoolbar_ftitle\">"; - if ($error) { - print " (<span class=\"error\" title=\"$error\">Error</span>)"; - } + if ($feed_site_url) { + $target = "target=\"_blank\""; + $reply .= "<a title=\"".__("Visit the website")."\" $target href=\"$feed_site_url\">". + truncate_string($feed_title,30)."</a>"; - } else { - if ($feed_id < -10) { - $label_id = -11-$feed_id; + if ($error) { + $reply .= " (<span class=\"error\" title=\"$error\">Error</span>)"; + } - $result = db_query($link, "SELECT fg_color, bg_color - FROM ttrss_labels2 WHERE id = '$label_id' AND owner_uid = " . - $_SESSION["uid"]); + } else { + if ($feed_id < -10) { + $label_id = -11-$feed_id; - if (db_num_rows($result) != 0) { - $fg_color = db_fetch_result($result, 0, "fg_color"); - $bg_color = db_fetch_result($result, 0, "bg_color"); + $result = db_query($link, "SELECT fg_color, bg_color + FROM ttrss_labels2 WHERE id = '$label_id' AND owner_uid = " . + $_SESSION["uid"]); - print "<span style='background : $bg_color; color : $fg_color'>"; - print $feed_title; - print "</span>"; - } else { - print $feed_title; - } + if (db_num_rows($result) != 0) { + $fg_color = db_fetch_result($result, 0, "fg_color"); + $bg_color = db_fetch_result($result, 0, "bg_color"); + $reply .= "<span style='background : $bg_color; color : $fg_color'>"; + $reply .= $feed_title; + $reply .= "</span>"; } else { - print $feed_title; + $reply .= $feed_title; } - } - if ($search) { - $search_q = "&q=$search&m=$match_on&smode=$search_mode"; } else { - $search_q = ""; + $reply .= $feed_title; } + } - // Adaptive doesn't really make any sense for generated feeds - // All Articles is the default, so no need to insert it either - if ($view_mode == "adaptive" || $view_mode == "all_articles") - $view_mode = ""; - else - $view_mode = "&view-mode=$view_mode"; + if ($search) { + $search_q = "&q=$search&m=$match_on&smode=$search_mode"; + } else { + $search_q = ""; + } - print " - <a href=\"#\" - title=\"".__("View as RSS feed")."\" - onclick=\"displayDlg('generatedFeed', '$feed_id:$is_cat:$rss_link')\"> - <img class=\"noborder\" style=\"vertical-align : middle\" src=\"images/feed-icon-12x12.png\"></a>"; + // Adaptive doesn't really make any sense for generated feeds + // All Articles is the default, so no need to insert it either + if ($view_mode == "adaptive" || $view_mode == "all_articles") + $view_mode = ""; + else + $view_mode = "&view-mode=$view_mode"; - print "</div>"; + $reply .= " + <a href=\"#\" + title=\"".__("View as RSS feed")."\" + onclick=\"displayDlg('generatedFeed', '$feed_id:$is_cat:$rss_link')\"> + <img class=\"noborder\" style=\"vertical-align : middle\" src=\"images/feed-icon-12x12.png\"></a>"; - } + $reply .= "</div>"; + + return $reply; + } function outputFeedList($link, $special = true) { @@ -4730,12 +4731,14 @@ } - function outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view, + function format_headlines_list($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgr_last_feed = false, $override_order = false) { $disable_cache = false; + $reply = array(); + $timing_info = getmicrotime(); $topmost_article_ids = array(); @@ -4780,8 +4783,7 @@ "SELECT id FROM ttrss_feeds WHERE id = '$feed' LIMIT 1"); if (db_num_rows($result) == 0) { - print "<div align='center'>".__('Feed not found.')."</div>"; - return; + $reply['content'] = "<div align='center'>".__('Feed not found.')."</div>"; } } @@ -4837,34 +4839,17 @@ $vgroup_last_feed = $vgr_last_feed; -/* if ($feed == -2) { - $feed_site_url = article_publish_url($link); - } */ - /// STOP ////////////////////////////////////////////////////////////////////////////////// - print "<toolbar><![CDATA["; - if (!$offset) { -// print "<div id=\"headlinesContainer\" $rtl_tag>"; - - if (!$result) { - print "<div align='center'>".__("Could not display feed (query failed). Please check label match syntax or local configuration.")."</div>"; - return; - } if (db_num_rows($result) > 0) { - print_headline_subtoolbar($link, $feed_site_url, $feed_title, + $reply['toolbar'] = format_headline_subtoolbar($link, $feed_site_url, $feed_title, $feed, $cat_view, $search, $match_on, $search_mode, $view_mode, $last_error); - -// print "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">"; - } } - print "]]></toolbar><content><![CDATA["; - $headlines_count = db_num_rows($result); if (db_num_rows($result) > 0) { @@ -5006,7 +4991,7 @@ $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup($feed_id);' href='#'>".__('mark as read')."</a>)"; - print "<div class='cdmFeedTitle'>". + $reply['content'] .= "<div class='cdmFeedTitle'>". "<div style=\"float : right\">$feed_icon_img</div>". "<a href=\"#\" onclick=\"viewfeed($feed_id)\">". $line["feed_title"]."</a> $vf_catchup_link</div>"; @@ -5017,36 +5002,36 @@ $mouseover_attrs = "onmouseover='postMouseIn($id)' onmouseout='postMouseOut($id)'"; - print "<div class='$class' id='RROW-$id' $mouseover_attrs>"; + $reply['content'] .= "<div class='$class' id='RROW-$id' $mouseover_attrs>"; - print "<div class='hlUpdPic'>$update_pic</div>"; + $reply['content'] .= "<div class='hlUpdPic'>$update_pic</div>"; - print "<div class='hlLeft'>"; + $reply['content'] .= "<div class='hlLeft'>"; - print "<input type=\"checkbox\" onclick=\"tSR(this)\" + $reply['content'] .= "<input type=\"checkbox\" onclick=\"tSR(this)\" id=\"RCHK-$id\">"; - print "$marked_pic"; - print "$published_pic"; + $reply['content'] .= "$marked_pic"; + $reply['content'] .= "$published_pic"; - print "</div>"; + $reply['content'] .= "</div>"; - print "<div onclick='return hlClicked(event, $id)' + $reply['content'] .= "<div onclick='return hlClicked(event, $id)' class=\"hlTitle\"><span class='hlContent$hlc_suffix'>"; - print "<a id=\"RTITLE-$id\" + $reply['content'] .= "<a id=\"RTITLE-$id\" href=\"" . htmlspecialchars($line["link"]) . "\" onclick=\"return false;\">" . $line["title"]; if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) { if ($content_preview) { - print "<span class=\"contentPreview\"> - $content_preview</span>"; + $reply['content'] .= "<span class=\"contentPreview\"> - $content_preview</span>"; } } - print "</a></span>"; + $reply['content'] .= "</a></span>"; - print $labels_str; + $reply['content'] .= $labels_str; /* if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) { if (@$line["feed_title"]) { @@ -5057,23 +5042,21 @@ } } */ - print "</div>"; - - + $reply['content'] .= "</div>"; - print "<div class=\"hlRight\">"; - print "<span class=\"hlUpdated\">$updated_fmt</span>"; - print $score_pic; + $reply['content'] .= "<div class=\"hlRight\">"; + $reply['content'] .= "<span class=\"hlUpdated\">$updated_fmt</span>"; + $reply['content'] .= $score_pic; if ($line["feed_title"] && !get_pref($link, 'VFEED_GROUP_BY_FEED')) { - print "<span onclick=\"viewfeed($feed_id)\" + $reply['content'] .= "<span onclick=\"viewfeed($feed_id)\" title=\"".htmlspecialchars($line['feed_title'])."\"> $feed_icon_img<span>"; } - print "</div>"; - print "</div>"; + $reply['content'] .= "</div>"; + $reply['content'] .= "</div>"; } else { @@ -5095,7 +5078,7 @@ //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">"; } - print "<div class='cdmFeedTitle'>". + $reply['content'] .= "<div class='cdmFeedTitle'>". "<div style=\"float : right\">$feed_icon_img</div>". "<a href=\"#\" onclick=\"viewfeed($feed_id)\">". $line["feed_title"]."</a> $vf_catchup_link</div>"; @@ -5107,31 +5090,31 @@ $mouseover_attrs = "onmouseover='postMouseIn($id)' onmouseout='postMouseOut($id)'"; - print "<div class=\"$class\" + $reply['content'] .= "<div class=\"$class\" id=\"RROW-$id\" $mouseover_attrs'>"; - print "<div class=\"cdmHeader\">"; + $reply['content'] .= "<div class=\"cdmHeader\">"; - print "<div style='float : right'>"; - print "<span class='updated'>$updated_fmt</span>"; - print "$score_pic"; + $reply['content'] .= "<div style='float : right'>"; + $reply['content'] .= "<span class='updated'>$updated_fmt</span>"; + $reply['content'] .= "$score_pic"; if (!get_pref($link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) { - print "<span style=\"cursor : pointer\" + $reply['content'] .= "<span style=\"cursor : pointer\" title=\"".htmlspecialchars($line["feed_title"])."\" onclick=\"viewfeed($feed_id)\">$feed_icon_img</span>"; } - print "<div class=\"updPic\">$update_pic</div>"; + $reply['content'] .= "<div class=\"updPic\">$update_pic</div>"; - print "</div>"; + $reply['content'] .= "</div>"; - print "<input type=\"checkbox\" onclick=\"toggleSelectRowById(this, + $reply['content'] .= "<input type=\"checkbox\" onclick=\"toggleSelectRowById(this, 'RROW-$id')\" id=\"RCHK-$id\"/>"; - print "$marked_pic"; - print "$published_pic"; + $reply['content'] .= "$marked_pic"; + $reply['content'] .= "$published_pic"; - print "<span id=\"RTITLE-$id\" + $reply['content'] .= "<span id=\"RTITLE-$id\" onclick=\"return cdmClicked(event, $id);\" class=\"titleWrap$hlc_suffix\"> <a class=\"title\" @@ -5141,25 +5124,25 @@ truncate_string($line["title"], 100) . " $entry_author</a>"; - print $labels_str; + $reply['content'] .= $labels_str; if (!$expand_cdm) $content_hidden = "style=\"display : none\""; else $excerpt_hidden = "style=\"display : none\""; - print "<span $excerpt_hidden + $reply['content'] .= "<span $excerpt_hidden id=\"CEXC-$id\" class=\"cdmExcerpt\"> - $content_preview</span>"; - print "</span>"; + $reply['content'] .= "</span>"; - print "</div>"; + $reply['content'] .= "</div>"; - print "<div class=\"cdmContent\" $content_hidden + $reply['content'] .= "<div class=\"cdmContent\" $content_hidden onclick=\"return cdmClicked(event, $id);\" id=\"CICD-$id\">"; - print "<div class=\"cdmContentInner\">"; + $reply['content'] .= "<div class=\"cdmContentInner\">"; if ($line["orig_feed_id"]) { @@ -5168,23 +5151,23 @@ if (db_num_rows($tmp_result) != 0) { - print "<div clear='both'>"; - print __("Originally from:"); + $reply['content'] .= "<div clear='both'>"; + $reply['content'] .= __("Originally from:"); - print " "; + $reply['content'] .= " "; $tmp_line = db_fetch_assoc($tmp_result); - print "<a target='_blank' + $reply['content'] .= "<a target='_blank' href=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>"; - print " "; + $reply['content'] .= " "; - print "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>"; - print "<img title='".__('Feed URL')."'class='tinyFeedIcon' src='images/pub_set.gif'></a>"; + $reply['content'] .= "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>"; + $reply['content'] .= "<img title='".__('Feed URL')."'class='tinyFeedIcon' src='images/pub_set.gif'></a>"; - print "</div>"; + $reply['content'] .= "</div>"; } } @@ -5210,13 +5193,13 @@ $article_content = ''; } - print "<div id=\"POSTNOTE-$id\">"; + $reply['content'] .= "<div id=\"POSTNOTE-$id\">"; if ($line['note']) { - print format_article_note($id, $line['note']); + $reply['content'] .= format_article_note($id, $line['note']); } - print "</div>"; + $reply['content'] .= "</div>"; - print "<span id=\"CWRAP-$id\">$article_content</span>"; + $reply['content'] .= "<span id=\"CWRAP-$id\">$article_content</span>"; $tmp_result = db_query($link, "SELECT always_display_enclosures FROM ttrss_feeds WHERE id = ". @@ -5226,24 +5209,24 @@ $always_display_enclosures = sql_bool_to_bool(db_fetch_result($tmp_result, 0, "always_display_enclosures")); - print format_article_enclosures($link, $id, $always_display_enclosures, + $reply['content'] .= format_article_enclosures($link, $id, $always_display_enclosures, $article_content); - print "</div>"; + $reply['content'] .= "</div>"; - print "<div class=\"cdmFooter\">"; + $reply['content'] .= "<div class=\"cdmFooter\">"; $tags_str = format_tags_string(get_article_tags($link, $id), $id); - print "<img src='".theme_image($link, + $reply['content'] .= "<img src='".theme_image($link, 'images/tag.png')."' alt='Tags' title='Tags'> <span id=\"ATSTR-$id\">$tags_str</span> <a title=\"".__('Edit tags for this article')."\" href=\"#\" onclick=\"editArticleTags($id, $feed_id, true)\">(+)</a>"; - print "<div style=\"float : right\">"; + $reply['content'] .= "<div style=\"float : right\">"; - print "<img src=\"images/art-zoom.png\" + $reply['content'] .= "<img src=\"images/art-zoom.png\" onclick=\"zoomToArticle(event, $id)\" style=\"cursor : pointer\" alt='Zoom' @@ -5251,36 +5234,36 @@ //$note_escaped = htmlspecialchars($line['note'], ENT_QUOTES); - print "<img src=\"images/art-pub-note.png\" + $reply['content'] .= "<img src=\"images/art-pub-note.png\" style=\"cursor : pointer\" style=\"cursor : pointer\" onclick=\"editArticleNote($id)\" alt='PubNote' title='".__('Edit article note')."'>"; if (DIGEST_ENABLE) { - print "<img src=\"".theme_image($link, 'images/art-email.png')."\" + $reply['content'] .= "<img src=\"".theme_image($link, 'images/art-email.png')."\" style=\"cursor : pointer\" onclick=\"emailArticle($id)\" alt='Zoom' title='".__('Forward by email')."'>"; } if (ENABLE_TWEET_BUTTON) { - print "<img src=\"".theme_image($link, 'images/art-tweet.png')."\" + $reply['content'] .= "<img src=\"".theme_image($link, 'images/art-tweet.png')."\" class='tagsPic' style=\"cursor : pointer\" onclick=\"tweetArticle($id)\" alt='Zoom' title='".__('Share on Twitter')."'>"; } - print "<img src=\"images/digest_checkbox.png\" + $reply['content'] .= "<img src=\"images/digest_checkbox.png\" style=\"cursor : pointer\" style=\"cursor : pointer\" onclick=\"dismissArticle($id)\" alt='Dismiss' title='".__('Dismiss article')."'>"; - print "</div>"; - print "</div>"; + $reply['content'] .= "</div>"; + $reply['content'] .= "</div>"; - print "</div>"; + $reply['content'] .= "</div>"; - print "</div>"; + $reply['content'] .= "</div>"; } @@ -5309,9 +5292,9 @@ } if (!$offset && $message) { - print "<div class='whiteBox'>$message"; + $reply['content'] .= "<div class='whiteBox'>$message"; - print "<p class=\"small\"><span class=\"insensitive\">"; + $reply['content'] .= "<p class=\"small\"><span class=\"insensitive\">"; $result = db_query($link, "SELECT ".SUBSTRING_FOR_DATE."(MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds WHERE owner_uid = " . $_SESSION['uid']); @@ -5319,7 +5302,7 @@ $last_updated = db_fetch_result($result, 0, "last_updated"); $last_updated = make_local_datetime($link, $last_updated, false); - printf(__("Feeds last updated at %s"), $last_updated); + $reply['content'] .= sprintf(__("Feeds last updated at %s"), $last_updated); $result = db_query($link, "SELECT COUNT(id) AS num_errors FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]); @@ -5327,11 +5310,11 @@ $num_errors = db_fetch_result($result, 0, "num_errors"); if ($num_errors > 0) { - print "<br/>"; - print "<a class=\"insensitive\" href=\"#\" onclick=\"showFeedsWithErrors()\">". + $reply['content'] .= "<br/>"; + $reply['content'] .= "<a class=\"insensitive\" href=\"#\" onclick=\"showFeedsWithErrors()\">". __('Some feeds have update errors (click for details)')."</a>"; } - print "</span></p></div>"; + $reply['content'] .= "</span></p></div>"; } } @@ -5340,9 +5323,10 @@ # print "</div>"; # } - print "]]></content>"; + #print "]]></content>"; - return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $vgroup_last_feed); + return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, + $vgroup_last_feed, $reply['content'], $reply['toolbar']); } // from here: http://www.roscripts.com/Create_tag_cloud-71.html @@ -6608,16 +6592,34 @@ return $headlines; } - function generate_dashboard_feed($link) { - print "<headlines id=\"-5\" is_cat=\"\">"; + function generate_error_feed($link, $error) { + $reply = array(); + + $reply['headlines']['id'] = -6; + $reply['headlines']['is_cat'] = false; + + $reply['headlines']['toolbar'] = ''; + $reply['headlines']['content'] = "<div class='whiteBox'>". $error . "</div>"; + + $reply['headlines-info'] = array("count" => 0, + "vgroup_last_feed" => '', + "unread" => 0, + "disable_cache" => true); + + return $reply; + } - print "<toolbar><![CDATA[]]></toolbar>"; - print '<content><![CDATA['; + function generate_dashboard_feed($link) { + $reply = array(); + + $reply['headlines']['id'] = -5; + $reply['headlines']['is_cat'] = false; - print "<div class='whiteBox'>".__('No feed selected.'); + $reply['headlines']['toolbar'] = ''; + $reply['headlines']['content'] = "<div class='whiteBox'>".__('No feed selected.'); - print "<p class=\"small\"><span class=\"insensitive\">"; + $reply['headlines']['content'] .= "<p class=\"small\"><span class=\"insensitive\">"; $result = db_query($link, "SELECT ".SUBSTRING_FOR_DATE."(MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds WHERE owner_uid = " . $_SESSION['uid']); @@ -6625,7 +6627,7 @@ $last_updated = db_fetch_result($result, 0, "last_updated"); $last_updated = make_local_datetime($link, $last_updated, false); - printf(__("Feeds last updated at %s"), $last_updated); + $reply['headlines']['content'] .= sprintf(__("Feeds last updated at %s"), $last_updated); $result = db_query($link, "SELECT COUNT(id) AS num_errors FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]); @@ -6633,26 +6635,18 @@ $num_errors = db_fetch_result($result, 0, "num_errors"); if ($num_errors > 0) { - print "<br/>"; - print "<a class=\"insensitive\" href=\"#\" onclick=\"showFeedsWithErrors()\">". + $reply['headlines']['content'] .= "<br/>"; + $reply['headlines']['content'] .= "<a class=\"insensitive\" href=\"#\" onclick=\"showFeedsWithErrors()\">". __('Some feeds have update errors (click for details)')."</a>"; } - print "</span></p>"; - - print "]]></content>"; - print "</headlines>"; + $reply['headlines']['content'] .= "</span></p>"; - print "<headlines-info><![CDATA["; - - $info = array("count" => 0, + $reply['headlines-info'] = array("count" => 0, "vgroup_last_feed" => '', "unread" => 0, "disable_cache" => true); - print json_encode($info); - - print "]]></headlines-info>"; - + return $reply; } function save_email_address($link, $email) { diff --git a/viewfeed.js b/viewfeed.js index 6e220bb4e..0e11a6080 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -25,47 +25,35 @@ function headlines_callback2(transport, feed_cur_page) { var is_cat = false; var feed_id = false; - if (transport.responseXML) { - var headlines = transport.responseXML.getElementsByTagName("headlines")[0]; - if (headlines) { - is_cat = headlines.getAttribute("is_cat"); - feed_id = headlines.getAttribute("id"); - setActiveFeedId(feed_id, is_cat); - } - } - - var update_btn = document.forms["main_toolbar_form"].update; - - update_btn.disabled = !(feed_id >= 0 && !is_cat); + var reply; try { - if (feed_cur_page == 0) { - $("headlines-frame").scrollTop = 0; - } - } catch (e) { }; + reply = JSON.parse(transport.responseText); + } catch (e) { + console.error(e); + } - if (transport.responseXML) { - var response = transport.responseXML; + if (reply) { - var headlines = response.getElementsByTagName("headlines")[0]; + is_cat = reply['headlines']['is_cat']; + feed_id = reply['headlines']['id']; - var headlines_content = headlines.getElementsByTagName("content")[0]; - var headlines_toolbar = headlines.getElementsByTagName("toolbar")[0]; + setActiveFeedId(feed_id, is_cat); - var headlines_info = response.getElementsByTagName("headlines-info")[0]; + var update_btn = document.forms["main_toolbar_form"].update; - if (headlines_info) - headlines_info = JSON.parse(headlines_info.firstChild.nodeValue); - else { - console.error("didn't find headlines-info object in response"); - return; - } + update_btn.disabled = !(feed_id >= 0 && !is_cat); + + try { + if (feed_cur_page == 0) { + $("headlines-frame").scrollTop = 0; + } + } catch (e) { }; - var headlines_count = headlines_info.count; - var headlines_unread = headlines_info.unread; - var disable_cache = headlines_info.disable_cache; + var headlines_count = reply['headlines-info']['count']; + var headlines_unread = reply['headlines-info']['unread']; - vgroup_last_feed = headlines_info.vgroup_last_feed; + vgroup_last_feed = reply['headlines-info']['vgroup_last_feed']; if (parseInt(headlines_count) < getInitParam("default_article_limit")) { _infscroll_disable = 1; @@ -73,82 +61,49 @@ function headlines_callback2(transport, feed_cur_page) { _infscroll_disable = 0; } - var counters = response.getElementsByTagName("counters")[0]; - var articles = response.getElementsByTagName("article"); - var runtime_info = response.getElementsByTagName("runtime-info"); + var counters = reply['counters']; + var articles = reply['articles']; + var runtime_info = reply['runtime-info']; if (feed_cur_page == 0) { - if (headlines) { - dijit.byId("headlines-frame").attr('content', - headlines_content.firstChild.nodeValue); - - dijit.byId("headlines-toolbar").attr('content', - headlines_toolbar.firstChild.nodeValue); - - initHeadlinesMenu(); + dijit.byId("headlines-frame").attr('content', + reply['headlines']['content']); -/* var cache_prefix = ""; + dijit.byId("headlines-toolbar").attr('content', + reply['headlines']['toolbar']); - if (is_cat) { - cache_prefix = "C:"; - } else { - cache_prefix = "F:"; - } - - cache_invalidate(cache_prefix + feed_id); + initHeadlinesMenu(); - if (!disable_cache) { - cache_inject(cache_prefix + feed_id, - $("headlines-frame").innerHTML, headlines_unread); - } */ - - } else { - console.warn("headlines_callback: returned no data"); - dijit.byId("headlines-frame").attr('content', - "<div class='whiteBox'>" + - __('Could not update headlines (missing XML data)') + "</div>"); - - } } else { - if (headlines) { - if (headlines_count > 0) { - console.log("adding some more headlines..."); + if (headlines_count > 0) { + console.log("adding some more headlines..."); - var c = dijit.byId("headlines-frame"); - var ids = getSelectedArticleIds2(); + var c = dijit.byId("headlines-frame"); + var ids = getSelectedArticleIds2(); - //c.attr('content', c.attr('content') + - // headlines_content.firstChild.nodeValue); + $("headlines-tmp").innerHTML = reply['headlines']['content']; - $("headlines-tmp").innerHTML = headlines_content.firstChild.nodeValue; - - $$("#headlines-tmp > div").each(function(row) { - c.domNode.appendChild(row); - }); + $$("#headlines-tmp > div").each(function(row) { + c.domNode.appendChild(row); + }); - console.log("restore selected ids: " + ids); + console.log("restore selected ids: " + ids); - for (var i = 0; i < ids.length; i++) { - markHeadline(ids[i]); - } + for (var i = 0; i < ids.length; i++) { + markHeadline(ids[i]); + } - initHeadlinesMenu(); + initHeadlinesMenu(); - } else { - console.log("no new headlines received"); - } } else { - console.warn("headlines_callback: returned no data"); - notify_error("Error while trying to load more headlines"); + console.log("no new headlines received"); } - } if (articles) { for (var i = 0; i < articles.length; i++) { - var a_id = articles[i].getAttribute("id"); - //console.log("found id: " + a_id); - cache_inject(a_id, articles[i].firstChild.nodeValue); + var a_id = articles[i]['id']; + cache_inject(a_id, articles[i]['content']); } } else { console.log("no cached articles received"); @@ -162,11 +117,9 @@ function headlines_callback2(transport, feed_cur_page) { } else { console.warn("headlines_callback: returned no XML object"); dijit.byId("headlines-frame").attr('content', "<div class='whiteBox'>" + - __('Could not update headlines (missing XML object)') + "</div>"); + __('Could not update headlines (invalid object received)') + "</div>"); } - - _feed_cur_page = feed_cur_page; _infscroll_request_sent = 0; |