function setScore()
 {
     $ids = db_escape_string($_REQUEST['id']);
     $score = (int) db_escape_string($_REQUEST['score']);
     db_query($this->link, "UPDATE ttrss_user_entries SET\n\t\t\tscore = '{$score}' WHERE ref_id IN ({$ids}) AND owner_uid = " . $_SESSION["uid"]);
     print json_encode(array("id" => $id, "score_pic" => theme_image($link, get_score_pic($score))));
 }
Exemple #2
0
 private function format_headlines_list($feed, $method, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgr_last_feed = false, $override_order = false, $include_children = false)
 {
     $disable_cache = false;
     $reply = array();
     $timing_info = getmicrotime();
     $topmost_article_ids = array();
     if (!$offset) {
         $offset = 0;
     }
     if ($method == "undefined") {
         $method = "";
     }
     $method_split = explode(":", $method);
     if ($method == "ForceUpdate" && $feed && is_numeric($feed) > 0) {
         include "rssfuncs.php";
         update_rss_feed($this->link, $feed, true);
     }
     if ($method_split[0] == "MarkAllReadGR") {
         catchup_feed($this->link, $method_split[1], false);
     }
     // FIXME: might break tag display?
     if (is_numeric($feed) && $feed > 0 && !$cat_view) {
         $result = db_query($this->link, "SELECT id FROM ttrss_feeds WHERE id = '{$feed}' LIMIT 1");
         if (db_num_rows($result) == 0) {
             $reply['content'] = "<div align='center'>" . __('Feed not found.') . "</div>";
         }
     }
     if (is_numeric($feed) && $feed > 0) {
         $result = db_query($this->link, "SELECT rtl_content FROM ttrss_feeds\r\n\t\t\t\tWHERE id = '{$feed}' AND owner_uid = " . $_SESSION["uid"]);
         if (db_num_rows($result) == 1) {
             $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
         } else {
             $rtl_content = false;
         }
         if ($rtl_content) {
             $rtl_tag = "dir=\"RTL\"";
         } else {
             $rtl_tag = "";
         }
     } else {
         $rtl_tag = "";
         $rtl_content = false;
     }
     @($search = db_escape_string($_REQUEST["query"]));
     if ($search) {
         $disable_cache = true;
     }
     @($search_mode = db_escape_string($_REQUEST["search_mode"]));
     @($match_on = db_escape_string($_REQUEST["match_on"]));
     if (!$match_on) {
         $match_on = "both";
     }
     if ($_REQUEST["debug"]) {
         $timing_info = print_checkpoint("H0", $timing_info);
     }
     //		error_log("format_headlines_list: [" . $feed . "] method [" . $method . "]");
     if ($search_mode == '' && $method != '') {
         $search_mode = $method;
     }
     //		error_log("search_mode: " . $search_mode);
     $qfh_ret = queryFeedHeadlines($this->link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order, $offset, 0, false, 0, $include_children);
     if ($_REQUEST["debug"]) {
         $timing_info = print_checkpoint("H1", $timing_info);
     }
     $result = $qfh_ret[0];
     $feed_title = $qfh_ret[1];
     $feed_site_url = $qfh_ret[2];
     $last_error = $qfh_ret[3];
     $vgroup_last_feed = $vgr_last_feed;
     //		if (!$offset) {
     if (db_num_rows($result) > 0) {
         $reply['toolbar'] = $this->format_headline_subtoolbar($feed_site_url, $feed_title, $feed, $cat_view, $search, $match_on, $search_mode, $view_mode, $last_error);
     }
     //		}
     $headlines_count = db_num_rows($result);
     if (get_pref($this->link, 'COMBINED_DISPLAY_MODE')) {
         $button_plugins = array();
         foreach (explode(",", ARTICLE_BUTTON_PLUGINS) as $p) {
             $pclass = trim("button_{$p}");
             if (class_exists($pclass)) {
                 $plugin = new $pclass($link);
                 array_push($button_plugins, $plugin);
             }
         }
     }
     if (db_num_rows($result) > 0) {
         $lnum = $offset;
         $num_unread = 0;
         $cur_feed_title = '';
         $fresh_intl = get_pref($this->link, "FRESH_ARTICLE_MAX_AGE") * 60 * 60;
         if ($_REQUEST["debug"]) {
             $timing_info = print_checkpoint("PS", $timing_info);
         }
         while ($line = db_fetch_assoc($result)) {
             $class = $lnum % 2 ? "even" : "odd";
             $id = $line["id"];
             $feed_id = $line["feed_id"];
             $label_cache = $line["label_cache"];
             $labels = false;
             if ($label_cache) {
                 $label_cache = json_decode($label_cache, true);
                 if ($label_cache) {
                     if ($label_cache["no-labels"] == 1) {
                         $labels = array();
                     } else {
                         $labels = $label_cache;
                     }
                 }
             }
             if (!is_array($labels)) {
                 $labels = get_article_labels($this->link, $id);
             }
             $labels_str = "<span id=\"HLLCTR-{$id}\">";
             $labels_str .= format_article_labels($labels, $id);
             $labels_str .= "</span>";
             if (count($topmost_article_ids) < 3) {
                 array_push($topmost_article_ids, $id);
             }
             if ($line["last_read"] == "" && !sql_bool_to_bool($line["unread"])) {
                 $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($this->link, 'images/updated.png') . "\"\r\n\t\t\t\t\t\talt=\"Updated\">";
             } else {
                 $update_pic = "<img id='FUPDPIC-{$id}' src=\"images/blank_icon.gif\"\r\n\t\t\t\t\t\talt=\"Updated\">";
             }
             if (sql_bool_to_bool($line["unread"]) && time() - strtotime($line["updated_noms"]) < $fresh_intl) {
                 $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($this->link, 'images/fresh_sign.png') . "\" alt=\"Fresh\">";
             }
             if ($line["unread"] == "t" || $line["unread"] == "1") {
                 $class .= " Unread";
                 ++$num_unread;
                 $is_unread = true;
             } else {
                 $is_unread = false;
             }
             if ($line["marked"] == "t" || $line["marked"] == "1") {
                 $marked_pic = "<img id=\"FMPIC-{$id}\"\r\n\t\t\t\t\t\tsrc=\"" . theme_image($this->link, 'images/mark_set.png') . "\"\r\n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Unstar article\"\r\n\t\t\t\t\t\tonclick='javascript:toggleMark({$id})'>";
             } else {
                 $marked_pic = "<img id=\"FMPIC-{$id}\"\r\n\t\t\t\t\t\tsrc=\"" . theme_image($this->link, 'images/mark_unset.png') . "\"\r\n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Star article\"\r\n\t\t\t\t\t\tonclick='javascript:toggleMark({$id})'>";
             }
             if ($line["published"] == "t" || $line["published"] == "1") {
                 $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($this->link, 'images/pub_set.png') . "\"\r\n\t\t\t\t\t\tclass=\"markedPic\"\r\n\t\t\t\t\t\talt=\"Unpublish article\" onclick='javascript:togglePub({$id})'>";
             } else {
                 $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($this->link, 'images/pub_unset.png') . "\"\r\n\t\t\t\t\t\tclass=\"markedPic\"\r\n\t\t\t\t\t\talt=\"Publish article\" onclick='javascript:togglePub({$id})'>";
             }
             #				$content_link = "<a target=\"_blank\" href=\"".$line["link"]."\">" .
             #					$line["title"] . "</a>";
             #				$content_link = "<a
             #					href=\"" . htmlspecialchars($line["link"]) . "\"
             #					onclick=\"view($id,$feed_id);\">" .
             #					$line["title"] . "</a>";
             #				$content_link = "<a href=\"javascript:viewContentUrl('".$line["link"]."');\">" .
             #					$line["title"] . "</a>";
             $updated_fmt = make_local_datetime($this->link, $line["updated_noms"], false);
             if (get_pref($this->link, 'SHOW_CONTENT_PREVIEW')) {
                 $content_preview = truncate_string(strip_tags($line["content_preview"]), 100);
             }
             $score = $line["score"];
             $score_pic = theme_image($this->link, "images/" . get_score_pic($score));
             /*				$score_title = __("(Click to change)");
             				$score_pic = "<img class='hlScorePic' src=\"images/$score_pic\"
             					onclick=\"adjustArticleScore($id, $score)\" title=\"$score $score_title\">"; */
             $score_pic = "<img class='hlScorePic' src=\"{$score_pic}\"\r\n\t\t\t\t\ttitle=\"{$score}\">";
             if ($score > 500) {
                 $hlc_suffix = "H";
             } else {
                 if ($score < -100) {
                     $hlc_suffix = "L";
                 } else {
                     $hlc_suffix = "";
                 }
             }
             $entry_author = $line["author"];
             if ($entry_author) {
                 $entry_author = " - {$entry_author}";
             }
             $has_feed_icon = feed_has_icon($feed_id);
             if ($has_feed_icon) {
                 $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
             } else {
                 $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/feed-icon-12x12.png\" alt=\"\">";
             }
             if (!get_pref($this->link, 'COMBINED_DISPLAY_MODE')) {
                 if (get_pref($this->link, 'VFEED_GROUP_BY_FEED')) {
                     if ($feed_id != $vgroup_last_feed && $line["feed_title"]) {
                         $cur_feed_title = $line["feed_title"];
                         $vgroup_last_feed = $feed_id;
                         $cur_feed_title = htmlspecialchars($cur_feed_title);
                         $vf_catchup_link = "(<a onclick='catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)";
                         $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>";
                     }
                 }
                 $mouseover_attrs = "onmouseover='postMouseIn({$id})'\r\n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                 $reply['content'] .= "<div class='{$class}' id='RROW-{$id}' {$mouseover_attrs}>";
                 $reply['content'] .= "<div class='hlUpdPic'>{$update_pic}</div>";
                 $reply['content'] .= "<div class='hlLeft'>";
                 $reply['content'] .= "<input type=\"checkbox\" onclick=\"tSR(this)\"\r\n\t\t\t\t\t\t\tid=\"RCHK-{$id}\">";
                 $reply['content'] .= "{$marked_pic}";
                 $reply['content'] .= "{$published_pic}";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div onclick='return hlClicked(event, {$id})'\r\n\t\t\t\t\t\tclass=\"hlTitle\"><span class='hlContent{$hlc_suffix}'>";
                 $reply['content'] .= "<a id=\"RTITLE-{$id}\"\r\n\t\t\t\t\t\thref=\"" . htmlspecialchars($line["link"]) . "\"\r\n\t\t\t\t\t\tonclick=\"\">" . truncate_string($line["title"], 200);
                 if (get_pref($this->link, 'SHOW_CONTENT_PREVIEW')) {
                     if ($content_preview) {
                         $reply['content'] .= "<span class=\"contentPreview\"> - {$content_preview}</span>";
                     }
                 }
                 $reply['content'] .= "</a></span>";
                 $reply['content'] .= $labels_str;
                 if (!get_pref($this->link, 'VFEED_GROUP_BY_FEED') && defined('_SHOW_FEED_TITLE_IN_VFEEDS')) {
                     if (@$line["feed_title"]) {
                         $reply['content'] .= "<span class=\"hlFeed\">\r\n\t\t\t\t\t\t\t\t(<a href=\"#\" onclick=\"viewfeed({$feed_id})\">" . $line["feed_title"] . "</a>)\r\n\t\t\t\t\t\t\t</span>";
                     }
                 }
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<span class=\"hlUpdated\">{$updated_fmt}</span>";
                 $reply['content'] .= "<div class=\"hlRight\">";
                 $reply['content'] .= $score_pic;
                 if ($line["feed_title"] && !get_pref($this->link, 'VFEED_GROUP_BY_FEED')) {
                     $reply['content'] .= "<span onclick=\"viewfeed({$feed_id})\"\r\n\t\t\t\t\t\t\tstyle=\"cursor : pointer\"\r\n\t\t\t\t\t\t\ttitle=\"" . htmlspecialchars($line['feed_title']) . "\">\r\n\t\t\t\t\t\t\t{$feed_icon_img}<span>";
                 }
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
             } else {
                 if (get_pref($this->link, 'VFEED_GROUP_BY_FEED') && $line["feed_title"]) {
                     if ($feed_id != $vgroup_last_feed) {
                         $cur_feed_title = $line["feed_title"];
                         $vgroup_last_feed = $feed_id;
                         $cur_feed_title = htmlspecialchars($cur_feed_title);
                         $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)";
                         $has_feed_icon = feed_has_icon($feed_id);
                         if ($has_feed_icon) {
                             $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
                         } else {
                             //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">";
                         }
                         $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>";
                     }
                 }
                 $expand_cdm = get_pref($this->link, 'CDM_EXPANDED');
                 $mouseover_attrs = "onmouseover='postMouseIn({$id})'\r\n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                 $reply['content'] .= "<div class=\"{$class}\"\r\n\t\t\t\t\t\tid=\"RROW-{$id}\" {$mouseover_attrs}'>";
                 $reply['content'] .= "<div class=\"cdmHeader\">";
                 $reply['content'] .= "<div>";
                 $reply['content'] .= "<input type=\"checkbox\" onclick=\"toggleSelectRowById(this,\r\n\t\t\t\t\t\t\t'RROW-{$id}')\" id=\"RCHK-{$id}\"/>";
                 $reply['content'] .= "{$marked_pic}";
                 $reply['content'] .= "{$published_pic}";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div id=\"PTITLE-FULL-{$id}\" style=\"display : none\">" . strip_tags($line['title']) . "</div>";
                 $reply['content'] .= "<span id=\"RTITLE-{$id}\"\r\n\t\t\t\t\t\tonclick=\"return cdmClicked(event, {$id});\"\r\n\t\t\t\t\t\tclass=\"titleWrap{$hlc_suffix}\">\r\n\t\t\t\t\t\t<a class=\"title\"\r\n\t\t\t\t\t\ttitle=\"" . htmlspecialchars($line['title']) . "\"\r\n\t\t\t\t\t\ttarget=\"_blank\" href=\"" . htmlspecialchars($line["link"]) . "\">" . truncate_string($line["title"], 100) . " {$entry_author}</a>";
                 $reply['content'] .= $labels_str;
                 if (!get_pref($this->link, 'VFEED_GROUP_BY_FEED') && defined('_SHOW_FEED_TITLE_IN_VFEEDS')) {
                     if (@$line["feed_title"]) {
                         $reply['content'] .= "<span class=\"hlFeed\">\r\n\t\t\t\t\t\t\t\t(<a href=\"#\" onclick=\"viewfeed({$feed_id})\">" . $line["feed_title"] . "</a>)\r\n\t\t\t\t\t\t\t</span>";
                     }
                 }
                 if (!$expand_cdm) {
                     $content_hidden = "style=\"display : none\"";
                 } else {
                     $excerpt_hidden = "style=\"display : none\"";
                 }
                 $reply['content'] .= "<span {$excerpt_hidden}\r\n\t\t\t\t\t\tid=\"CEXC-{$id}\" class=\"cdmExcerpt\"> - {$content_preview}</span>";
                 $reply['content'] .= "</span>";
                 $reply['content'] .= "<div>";
                 $reply['content'] .= "<span class='updated'>{$updated_fmt}</span>";
                 $reply['content'] .= "{$score_pic}";
                 if (!get_pref($this->link, "VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
                     $reply['content'] .= "<span style=\"cursor : pointer\"\r\n\t\t\t\t\t\t\ttitle=\"" . htmlspecialchars($line["feed_title"]) . "\"\r\n\t\t\t\t\t\t\tonclick=\"viewfeed({$feed_id})\">{$feed_icon_img}</span>";
                 }
                 $reply['content'] .= "<div class=\"updPic\">{$update_pic}</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div class=\"cdmContent\" {$content_hidden}\r\n\t\t\t\t\t\tonclick=\"return cdmClicked(event, {$id});\"\r\n\t\t\t\t\t\tid=\"CICD-{$id}\">";
                 $reply['content'] .= "<div class=\"cdmContentInner\">";
                 if ($line["orig_feed_id"]) {
                     $tmp_result = db_query($this->link, "SELECT * FROM ttrss_archived_feeds\r\n\t\t\t\t\tWHERE id = " . $line["orig_feed_id"]);
                     if (db_num_rows($tmp_result) != 0) {
                         $reply['content'] .= "<div clear='both'>";
                         $reply['content'] .= __("Originally from:");
                         $reply['content'] .= "&nbsp;";
                         $tmp_line = db_fetch_assoc($tmp_result);
                         $reply['content'] .= "<a target='_blank'\r\n\t\t\t\t\t\t\t\thref=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>";
                         $reply['content'] .= "&nbsp;";
                         $reply['content'] .= "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>";
                         $reply['content'] .= "<img title='" . __('Feed URL') . "'class='tinyFeedIcon' src='images/pub_set.png'></a>";
                         $reply['content'] .= "</div>";
                     }
                 }
                 $feed_site_url = $line["site_url"];
                 $article_content = sanitize($this->link, $line["content_preview"], false, false, $feed_site_url);
                 $reply['content'] .= "<div id=\"POSTNOTE-{$id}\">";
                 if ($line['note']) {
                     $reply['content'] .= format_article_note($id, $line['note']);
                 }
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<span id=\"CWRAP-{$id}\">";
                 $reply['content'] .= $expand_cdm ? $article_content : '';
                 $reply['content'] .= "</span>";
                 /*					$tmp_result = db_query($this->link, "SELECT always_display_enclosures FROM
                 						ttrss_feeds WHERE id = ".
                 						(($line['feed_id'] == null) ? $line['orig_feed_id'] :
                 							$line['feed_id'])." AND owner_uid = ".$_SESSION["uid"]);
                 
                 					$always_display_enclosures = sql_bool_to_bool(db_fetch_result($tmp_result,
                 						0, "always_display_enclosures")); */
                 $always_display_enclosures = sql_bool_to_bool($line["always_display_enclosures"]);
                 $reply['content'] .= format_article_enclosures($this->link, $id, $always_display_enclosures, $article_content);
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div class=\"cdmFooter\">";
                 $tag_cache = $line["tag_cache"];
                 $tags_str = format_tags_string(get_article_tags($this->link, $id, $_SESSION["uid"], $tag_cache), $id);
                 $reply['content'] .= "<img src='" . theme_image($this->link, 'images/tag.png') . "' alt='Tags' title='Tags'>\r\n\t\t\t\t\t\t<span id=\"ATSTR-{$id}\">{$tags_str}</span>\r\n\t\t\t\t\t\t<a title=\"" . __('Edit tags for this article') . "\"\r\n\t\t\t\t\t\thref=\"#\" onclick=\"editArticleTags({$id}, {$feed_id}, true)\">(+)</a>";
                 $num_comments = $line["num_comments"];
                 $entry_comments = "";
                 if ($num_comments > 0) {
                     if ($line["comments"]) {
                         $comments_url = $line["comments"];
                     } else {
                         $comments_url = $line["link"];
                     }
                     $entry_comments = "<a target='_blank' href=\"{$comments_url}\">{$num_comments} comments</a>";
                 } else {
                     if ($line["comments"] && $line["link"] != $line["comments"]) {
                         $entry_comments = "<a target='_blank' href=\"" . $line["comments"] . "\">comments</a>";
                     }
                 }
                 if ($entry_comments) {
                     $reply['content'] .= "&nbsp;({$entry_comments})";
                 }
                 $reply['content'] .= "<div style=\"float : right\">";
                 $reply['content'] .= "<img src=\"images/art-zoom.png\"\r\n\t\t\t\t\t\tonclick=\"zoomToArticle(event, {$id})\"\r\n\t\t\t\t\t\tstyle=\"cursor : pointer\"\r\n\t\t\t\t\t\talt='Zoom'\r\n\t\t\t\t\t\ttitle='" . __('Open article in new tab') . "'>";
                 //$note_escaped = htmlspecialchars($line['note'], ENT_QUOTES);
                 foreach ($button_plugins as $p) {
                     $reply['content'] .= $p->render($id, $line);
                 }
                 $reply['content'] .= "<img src=\"images/digest_checkbox.png\"\r\n\t\t\t\t\t\tstyle=\"cursor : pointer\" style=\"cursor : pointer\"\r\n\t\t\t\t\t\tonclick=\"dismissArticle({$id})\"\r\n\t\t\t\t\t\ttitle='" . __('Close article') . "'>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
             }
             ++$lnum;
         }
         if ($_REQUEST["debug"]) {
             $timing_info = print_checkpoint("PE", $timing_info);
         }
     } else {
         $message = "";
         switch ($view_mode) {
             case "unread":
                 $message = __("No unread articles found to display.");
                 break;
             case "updated":
                 $message = __("No updated articles found to display.");
                 break;
             case "marked":
                 $message = __("No starred articles found to display.");
                 break;
             default:
                 if ($feed < -10) {
                     $message = __("No articles found to display. You can assign articles to labels manually (see the Actions menu above) or use a filter.");
                 } else {
                     $message = __("No articles found to display.");
                 }
         }
         if (!$offset && $message) {
             $reply['content'] .= "<div class='whiteBox'>{$message}";
             $reply['content'] .= "<p class=\"small\"><span class=\"insensitive\">";
             $result = db_query($this->link, "SELECT " . SUBSTRING_FOR_DATE . "(MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds\r\n\t\t\t\t\tWHERE owner_uid = " . $_SESSION['uid']);
             $last_updated = db_fetch_result($result, 0, "last_updated");
             $last_updated = make_local_datetime($this->link, $last_updated, false);
             $reply['content'] .= sprintf(__("Feeds last updated at %s"), $last_updated);
             $result = db_query($this->link, "SELECT COUNT(id) AS num_errors\r\n\t\t\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]);
             $num_errors = db_fetch_result($result, 0, "num_errors");
             if ($num_errors > 0) {
                 $reply['content'] .= "<br/>";
                 $reply['content'] .= "<a class=\"insensitive\" href=\"#\" onclick=\"showFeedsWithErrors()\">" . __('Some feeds have update errors (click for details)') . "</a>";
             }
             $reply['content'] .= "</span></p></div>";
         }
     }
     if ($_REQUEST["debug"]) {
         $timing_info = print_checkpoint("H2", $timing_info);
     }
     return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $vgroup_last_feed, $reply);
 }
Exemple #3
0
 private function format_headlines_list($feed, $method, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgr_last_feed = false, $override_order = false, $include_children = false)
 {
     if (isset($_REQUEST["DevForceUpdate"])) {
         header("Content-Type: text/plain; charset=utf-8");
     }
     $disable_cache = false;
     $reply = array();
     $rgba_cache = array();
     $timing_info = microtime(true);
     $topmost_article_ids = array();
     if (!$offset) {
         $offset = 0;
     }
     if ($method == "undefined") {
         $method = "";
     }
     $method_split = explode(":", $method);
     if ($method == "ForceUpdate" && $feed > 0 && is_numeric($feed)) {
         // Update the feed if required with some basic flood control
         $result = $this->dbh->query("SELECT cache_images," . SUBSTRING_FOR_DATE . "(last_updated,1,19) AS last_updated\n\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed}'");
         if ($this->dbh->num_rows($result) != 0) {
             $last_updated = strtotime($this->dbh->fetch_result($result, 0, "last_updated"));
             $cache_images = sql_bool_to_bool($this->dbh->fetch_result($result, 0, "cache_images"));
             if (!$cache_images && time() - $last_updated > 120 || isset($_REQUEST['DevForceUpdate'])) {
                 include "rssfuncs.php";
                 update_rss_feed($feed, true, true);
             } else {
                 $this->dbh->query("UPDATE ttrss_feeds SET last_updated = '1970-01-01', last_update_started = '1970-01-01'\n\t\t\t\t\t\t\tWHERE id = '{$feed}'");
             }
         }
     }
     if ($method_split[0] == "MarkAllReadGR") {
         catchup_feed($method_split[1], false);
     }
     // FIXME: might break tag display?
     if (is_numeric($feed) && $feed > 0 && !$cat_view) {
         $result = $this->dbh->query("SELECT id FROM ttrss_feeds WHERE id = '{$feed}' LIMIT 1");
         if ($this->dbh->num_rows($result) == 0) {
             $reply['content'] = "<div align='center'>" . __('Feed not found.') . "</div>";
         }
     }
     @($search = $this->dbh->escape_string($_REQUEST["query"]));
     if ($search) {
         $disable_cache = true;
     }
     @($search_mode = $this->dbh->escape_string($_REQUEST["search_mode"]));
     if ($_REQUEST["debug"]) {
         $timing_info = print_checkpoint("H0", $timing_info);
     }
     //		error_log("format_headlines_list: [" . $feed . "] method [" . $method . "]");
     if ($search_mode == '' && $method != '') {
         $search_mode = $method;
     }
     //		error_log("search_mode: " . $search_mode);
     if (!$cat_view && is_numeric($feed) && $feed < PLUGIN_FEED_BASE_INDEX && $feed > LABEL_BASE_INDEX) {
         $handler = PluginHost::getInstance()->get_feed_handler(PluginHost::feed_to_pfeed_id($feed));
         //	function queryFeedHeadlines($feed, $limit, $view_mode, $cat_view, $search, $search_mode, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, $ignore_vfeed_group = false) {
         if ($handler) {
             $options = array("limit" => $limit, "view_mode" => $view_mode, "cat_view" => $cat_view, "search" => $search, "search_mode" => $search_mode, "override_order" => $override_order, "offset" => $offset, "owner_uid" => $_SESSION["uid"], "filter" => false, "since_id" => 0, "include_children" => $include_children);
             $qfh_ret = $handler->get_headlines(PluginHost::feed_to_pfeed_id($feed), $options);
         }
     } else {
         $qfh_ret = queryFeedHeadlines($feed, $limit, $view_mode, $cat_view, $search, $search_mode, $override_order, $offset, 0, false, 0, $include_children);
     }
     $vfeed_group_enabled = get_pref("VFEED_GROUP_BY_FEED") && $feed != -6;
     if ($_REQUEST["debug"]) {
         $timing_info = print_checkpoint("H1", $timing_info);
     }
     $result = $qfh_ret[0];
     $feed_title = $qfh_ret[1];
     $feed_site_url = $qfh_ret[2];
     $last_error = $qfh_ret[3];
     $last_updated = strpos($qfh_ret[4], '1970-') === FALSE ? make_local_datetime($qfh_ret[4], false) : __("Never");
     $highlight_words = $qfh_ret[5];
     $vgroup_last_feed = $vgr_last_feed;
     $reply['toolbar'] = $this->format_headline_subtoolbar($feed_site_url, $feed_title, $feed, $cat_view, $search, $search_mode, $view_mode, $last_error, $last_updated);
     $headlines_count = $this->dbh->num_rows($result);
     /* if (get_pref('COMBINED_DISPLAY_MODE')) {
     			$button_plugins = array();
     			foreach (explode(",", ARTICLE_BUTTON_PLUGINS) as $p) {
     				$pclass = "button_" . trim($p);
     
     				if (class_exists($pclass)) {
     					$plugin = new $pclass();
     					array_push($button_plugins, $plugin);
     				}
     			}
     		} */
     if ($offset == 0) {
         foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_HEADLINES_BEFORE) as $p) {
             $reply['content'] .= $p->hook_headlines_before($feed, $cat_view, $qfh_ret);
         }
     }
     if ($this->dbh->num_rows($result) > 0) {
         $lnum = $offset;
         $num_unread = 0;
         $cur_feed_title = '';
         if ($_REQUEST["debug"]) {
             $timing_info = print_checkpoint("PS", $timing_info);
         }
         $expand_cdm = get_pref('CDM_EXPANDED');
         while ($line = $this->dbh->fetch_assoc($result)) {
             $line["content_preview"] = "&mdash; " . truncate_string(strip_tags($line["content"]), 250);
             foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) {
                 $line = $p->hook_query_headlines($line, 250, false);
             }
             if (get_pref('SHOW_CONTENT_PREVIEW')) {
                 $content_preview = $line["content_preview"];
             }
             $id = $line["id"];
             $feed_id = $line["feed_id"];
             $label_cache = $line["label_cache"];
             $labels = false;
             if ($label_cache) {
                 $label_cache = json_decode($label_cache, true);
                 if ($label_cache) {
                     if ($label_cache["no-labels"] == 1) {
                         $labels = array();
                     } else {
                         $labels = $label_cache;
                     }
                 }
             }
             if (!is_array($labels)) {
                 $labels = get_article_labels($id);
             }
             $labels_str = "<span class=\"HLLCTR-{$id}\">";
             $labels_str .= format_article_labels($labels, $id);
             $labels_str .= "</span>";
             if (count($topmost_article_ids) < 3) {
                 array_push($topmost_article_ids, $id);
             }
             $class = "";
             if (sql_bool_to_bool($line["unread"])) {
                 $class .= " Unread";
                 ++$num_unread;
             }
             if (sql_bool_to_bool($line["marked"])) {
                 $marked_pic = "<img\n\t\t\t\t\t\tsrc=\"images/mark_set.png\"\n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Unstar article\"\n\t\t\t\t\t\tonclick='toggleMark({$id})'>";
                 $class .= " marked";
             } else {
                 $marked_pic = "<img\n\t\t\t\t\t\tsrc=\"images/mark_unset.png\"\n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Star article\"\n\t\t\t\t\t\tonclick='toggleMark({$id})'>";
             }
             if (sql_bool_to_bool($line["published"])) {
                 $published_pic = "<img src=\"images/pub_set.png\"\n\t\t\t\t\t\tclass=\"pubPic\"\n\t\t\t\t\t\t\talt=\"Unpublish article\" onclick='togglePub({$id})'>";
                 $class .= " published";
             } else {
                 $published_pic = "<img src=\"images/pub_unset.png\"\n\t\t\t\t\t\tclass=\"pubPic\"\n\t\t\t\t\t\talt=\"Publish article\" onclick='togglePub({$id})'>";
             }
             #				$content_link = "<a target=\"_blank\" href=\"".$line["link"]."\">" .
             #					$line["title"] . "</a>";
             #				$content_link = "<a
             #					href=\"" . htmlspecialchars($line["link"]) . "\"
             #					onclick=\"view($id,$feed_id);\">" .
             #					$line["title"] . "</a>";
             #				$content_link = "<a href=\"javascript:viewContentUrl('".$line["link"]."');\">" .
             #					$line["title"] . "</a>";
             $updated_fmt = make_local_datetime($line["updated"], false);
             $date_entered_fmt = T_sprintf("Imported at %s", make_local_datetime($line["date_entered"], false));
             $score = $line["score"];
             $score_pic = "images/" . get_score_pic($score);
             /*				$score_title = __("(Click to change)");
             				$score_pic = "<img class='hlScorePic' src=\"images/$score_pic\"
             					onclick=\"adjustArticleScore($id, $score)\" title=\"$score $score_title\">"; */
             $score_pic = "<img class='hlScorePic' score='{$score}' onclick='changeScore({$id}, this)' src=\"{$score_pic}\"\n\t\t\t\t\ttitle=\"{$score}\">";
             if ($score > 500) {
                 $hlc_suffix = "high";
             } else {
                 if ($score < -100) {
                     $hlc_suffix = "low";
                 } else {
                     $hlc_suffix = "";
                 }
             }
             $entry_author = $line["author"];
             if ($entry_author) {
                 $entry_author = " &mdash; {$entry_author}";
             }
             $has_feed_icon = feed_has_icon($feed_id);
             if ($has_feed_icon) {
                 $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
             } else {
                 $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/pub_set.png\" alt=\"\">";
             }
             $entry_site_url = $line["site_url"];
             //setting feed headline background color, needs to change text color based on dark/light
             $fav_color = $line['favicon_avg_color'];
             require_once "colors.php";
             if ($fav_color && $fav_color != 'fail') {
                 if (!isset($rgba_cache[$feed_id])) {
                     $rgba_cache[$feed_id] = join(",", _color_unpack($fav_color));
                 }
             }
             if (!get_pref('COMBINED_DISPLAY_MODE')) {
                 if ($vfeed_group_enabled) {
                     if ($feed_id != $vgroup_last_feed && $line["feed_title"]) {
                         $cur_feed_title = $line["feed_title"];
                         $vgroup_last_feed = $feed_id;
                         $cur_feed_title = htmlspecialchars($cur_feed_title);
                         $vf_catchup_link = "<a class='catchup' onclick='catchupFeedInGroup({$feed_id});' href='#'>" . __('mark feed as read') . "</a>";
                         $reply['content'] .= "<div id='FTITLE-{$feed_id}' class='cdmFeedTitle'>" . "<div style='float : right'>{$feed_icon_img}</div>" . "<a class='title' href=\"#\" onclick=\"viewfeed({$feed_id})\">" . $line["feed_title"] . "</a>\n\t\t\t\t\t\t\t\t{$vf_catchup_link}</div>";
                     }
                 }
                 $mouseover_attrs = "onmouseover='postMouseIn(event, {$id})'\n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                 $reply['content'] .= "<div class='hl {$class}' orig-feed-id='{$feed_id}' id='RROW-{$id}' {$mouseover_attrs}>";
                 $reply['content'] .= "<div class='hlLeft'>";
                 $reply['content'] .= "<input dojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\t\t\ttype=\"checkbox\" onclick=\"toggleSelectRow2(this)\"\n\t\t\t\t\t\t\tclass='rchk'>";
                 $reply['content'] .= "{$marked_pic}";
                 $reply['content'] .= "{$published_pic}";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div onclick='return hlClicked(event, {$id})'\n\t\t\t\t\t\tclass=\"hlTitle\"><span class='hlContent {$hlc_suffix}'>";
                 $reply['content'] .= "<a id=\"RTITLE-{$id}\" class=\"title {$hlc_suffix}\"\n\t\t\t\t\t\thref=\"" . htmlspecialchars($line["link"]) . "\"\n\t\t\t\t\t\tonclick=\"\">" . truncate_string($line["title"], 200);
                 if (get_pref('SHOW_CONTENT_PREVIEW')) {
                     $reply['content'] .= "<span class=\"contentPreview\">" . $line["content_preview"] . "</span>";
                 }
                 $reply['content'] .= "</a></span>";
                 $reply['content'] .= $labels_str;
                 $reply['content'] .= "</div>";
                 if (!$vfeed_group_enabled) {
                     if (@$line["feed_title"]) {
                         $rgba = @$rgba_cache[$feed_id];
                         $reply['content'] .= "<span class=\"hlFeed\"><a style=\"background : rgba({$rgba}, 0.3)\" href=\"#\" onclick=\"viewfeed({$feed_id})\">" . truncate_string($line["feed_title"], 30) . "</a></span>";
                     }
                 }
                 $reply['content'] .= "<span class=\"hlUpdated\">";
                 $reply['content'] .= "<div title='{$date_entered_fmt}'>{$updated_fmt}</div>\n\t\t\t\t\t\t</span>";
                 $reply['content'] .= "<div class=\"hlRight\">";
                 $reply['content'] .= $score_pic;
                 if ($line["feed_title"] && !$vfeed_group_enabled) {
                     $reply['content'] .= "<span onclick=\"viewfeed({$feed_id})\"\n\t\t\t\t\t\t\tstyle=\"cursor : pointer\"\n\t\t\t\t\t\t\ttitle=\"" . htmlspecialchars($line['feed_title']) . "\">\n\t\t\t\t\t\t\t{$feed_icon_img}</span>";
                 }
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
             } else {
                 if ($line["tag_cache"]) {
                     $tags = explode(",", $line["tag_cache"]);
                 } else {
                     $tags = false;
                 }
                 $line["content"] = sanitize($line["content"], sql_bool_to_bool($line['hide_images']), false, $entry_site_url, $highlight_words, $line["id"]);
                 foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_CDM) as $p) {
                     $line = $p->hook_render_article_cdm($line);
                 }
                 if ($vfeed_group_enabled && $line["feed_title"]) {
                     if ($feed_id != $vgroup_last_feed) {
                         $cur_feed_title = $line["feed_title"];
                         $vgroup_last_feed = $feed_id;
                         $cur_feed_title = htmlspecialchars($cur_feed_title);
                         $vf_catchup_link = "<a class='catchup' onclick='catchupFeedInGroup({$feed_id});' href='#'>" . __('mark feed as read') . "</a>";
                         $has_feed_icon = feed_has_icon($feed_id);
                         if ($has_feed_icon) {
                             $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
                         } else {
                             //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">";
                         }
                         $reply['content'] .= "<div id='FTITLE-{$feed_id}' class='cdmFeedTitle'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"#\" class='title' onclick=\"viewfeed({$feed_id})\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</div>";
                     }
                 }
                 $mouseover_attrs = "onmouseover='postMouseIn(event, {$id})'\n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                 $expanded_class = $expand_cdm ? "expanded" : "expandable";
                 $reply['content'] .= "<div class=\"cdm {$hlc_suffix} {$expanded_class} {$class}\"\n\t\t\t\t\t\tid=\"RROW-{$id}\" orig-feed-id='{$feed_id}' {$mouseover_attrs}>";
                 $reply['content'] .= "<div class=\"cdmHeader\">";
                 $reply['content'] .= "<div style=\"vertical-align : middle\">";
                 $reply['content'] .= "<input dojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\t\t\ttype=\"checkbox\" onclick=\"toggleSelectRow2(this, false, true)\"\n\t\t\t\t\t\t\tclass='rchk'>";
                 $reply['content'] .= "{$marked_pic}";
                 $reply['content'] .= "{$published_pic}";
                 $reply['content'] .= "</div>";
                 if ($highlight_words && count($highlight_words > 0)) {
                     foreach ($highlight_words as $word) {
                         $line["title"] = preg_replace("/(\\Q{$word}\\E)/i", "<span class=\"highlight\">\$1</span>", $line["title"]);
                     }
                 }
                 $reply['content'] .= "<span id=\"RTITLE-{$id}\"\n\t\t\t\t\t\tonclick=\"return cdmClicked(event, {$id});\"\n\t\t\t\t\t\tclass=\"titleWrap {$hlc_suffix}\">\n\t\t\t\t\t\t<a class=\"title {$hlc_suffix}\"\n\t\t\t\t\t\ttarget=\"_blank\" href=\"" . htmlspecialchars($line["link"]) . "\">" . $line["title"] . "</a> <span class=\"author\">{$entry_author}</span>";
                 $reply['content'] .= $labels_str;
                 $reply['content'] .= "<span class='collapseBtn' style='display : none'>\n\t\t\t\t\t\t<img src=\"images/collapse.png\" onclick=\"cdmCollapseArticle(event, {$id})\"\n\t\t\t\t\t\ttitle=\"" . __("Collapse article") . "\"/></span>";
                 if (!$expand_cdm) {
                     $content_hidden = "style=\"display : none\"";
                 } else {
                     $excerpt_hidden = "style=\"display : none\"";
                 }
                 $reply['content'] .= "<span {$excerpt_hidden} id=\"CEXC-{$id}\" class=\"cdmExcerpt\">" . $content_preview . "</span>";
                 $reply['content'] .= "</span>";
                 if (!$vfeed_group_enabled) {
                     if (@$line["feed_title"]) {
                         $rgba = @$rgba_cache[$feed_id];
                         $reply['content'] .= "<div class=\"hlFeed\">\n\t\t\t\t\t\t\t\t<a href=\"#\" style=\"background-color: rgba({$rgba},0.3)\"\n\t\t\t\t\t\t\t\tonclick=\"viewfeed({$feed_id})\">" . truncate_string($line["feed_title"], 30) . "</a>\n\t\t\t\t\t\t\t</div>";
                     }
                 }
                 $reply['content'] .= "<span class='updated' title='{$date_entered_fmt}'>\n\t\t\t\t\t\t{$updated_fmt}</span>";
                 $reply['content'] .= "<div class='scoreWrap' style=\"vertical-align : middle\">";
                 $reply['content'] .= "{$score_pic}";
                 if (!get_pref("VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
                     $reply['content'] .= "<span style=\"cursor : pointer\"\n\t\t\t\t\t\t\ttitle=\"" . htmlspecialchars($line["feed_title"]) . "\"\n\t\t\t\t\t\t\tonclick=\"viewfeed({$feed_id})\">{$feed_icon_img}</span>";
                 }
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div class=\"cdmContent\" {$content_hidden}\n\t\t\t\t\t\tonclick=\"return cdmClicked(event, {$id});\"\n\t\t\t\t\t\tid=\"CICD-{$id}\">";
                 $reply['content'] .= "<div id=\"POSTNOTE-{$id}\">";
                 if ($line['note']) {
                     $reply['content'] .= format_article_note($id, $line['note']);
                 }
                 $reply['content'] .= "</div>";
                 if (!$line['lang']) {
                     $line['lang'] = 'en';
                 }
                 $reply['content'] .= "<div class=\"cdmContentInner\" lang=\"" . $line['lang'] . "\">";
                 if ($line["orig_feed_id"]) {
                     $tmp_result = $this->dbh->query("SELECT * FROM ttrss_archived_feeds\n\t\t\t\t\tWHERE id = " . $line["orig_feed_id"]);
                     if ($this->dbh->num_rows($tmp_result) != 0) {
                         $reply['content'] .= "<div clear='both'>";
                         $reply['content'] .= __("Originally from:");
                         $reply['content'] .= "&nbsp;";
                         $tmp_line = $this->dbh->fetch_assoc($tmp_result);
                         $reply['content'] .= "<a target='_blank'\n\t\t\t\t\t\t\t\thref=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>";
                         $reply['content'] .= "&nbsp;";
                         $reply['content'] .= "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>";
                         $reply['content'] .= "<img title='" . __('Feed URL') . "'class='tinyFeedIcon' src='images/pub_unset.png'></a>";
                         $reply['content'] .= "</div>";
                     }
                 }
                 $reply['content'] .= "<span id=\"CWRAP-{$id}\">";
                 //					if (!$expand_cdm) {
                 $reply['content'] .= "<span id=\"CENCW-{$id}\" style=\"display : none\">";
                 $reply['content'] .= htmlspecialchars($line["content"]);
                 $reply['content'] .= "</span.";
                 //					} else {
                 //						$reply['content'] .= $line["content"];
                 //					}
                 $reply['content'] .= "</span>";
                 $always_display_enclosures = sql_bool_to_bool($line["always_display_enclosures"]);
                 $reply['content'] .= format_article_enclosures($id, $always_display_enclosures, $line["content"], sql_bool_to_bool($line["hide_images"]));
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "<div class=\"cdmFooter\">";
                 foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_ARTICLE_LEFT_BUTTON) as $p) {
                     $reply['content'] .= $p->hook_article_left_button($line);
                 }
                 $tags_str = format_tags_string($tags, $id);
                 $reply['content'] .= "<img src='images/tag.png' alt='Tags' title='Tags'>\n\t\t\t\t\t\t<span id=\"ATSTR-{$id}\">{$tags_str}</span>\n\t\t\t\t\t\t<a title=\"" . __('Edit tags for this article') . "\"\n\t\t\t\t\t\thref=\"#\" onclick=\"editArticleTags({$id})\">(+)</a>";
                 $num_comments = $line["num_comments"];
                 $entry_comments = "";
                 if ($num_comments > 0) {
                     if ($line["comments"]) {
                         $comments_url = htmlspecialchars($line["comments"]);
                     } else {
                         $comments_url = htmlspecialchars($line["link"]);
                     }
                     $entry_comments = "<a class=\"postComments\"\n\t\t\t\t\t\t\ttarget='_blank' href=\"{$comments_url}\">{$num_comments} " . _ngettext("comment", "comments", $num_comments) . "</a>";
                 } else {
                     if ($line["comments"] && $line["link"] != $line["comments"]) {
                         $entry_comments = "<a class=\"postComments\" target='_blank' href=\"" . htmlspecialchars($line["comments"]) . "\">" . __("comments") . "</a>";
                     }
                 }
                 if ($entry_comments) {
                     $reply['content'] .= "&nbsp;({$entry_comments})";
                 }
                 $reply['content'] .= "<div style=\"float : right\">";
                 //					$reply['content'] .= "$marked_pic";
                 //					$reply['content'] .= "$published_pic";
                 foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_ARTICLE_BUTTON) as $p) {
                     $reply['content'] .= $p->hook_article_button($line);
                 }
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
                 $reply['content'] .= "</div>";
             }
             ++$lnum;
         }
         if ($_REQUEST["debug"]) {
             $timing_info = print_checkpoint("PE", $timing_info);
         }
     } else {
         $message = "";
         switch ($view_mode) {
             case "unread":
                 $message = __("No unread articles found to display.");
                 break;
             case "updated":
                 $message = __("No updated articles found to display.");
                 break;
             case "marked":
                 $message = __("No starred articles found to display.");
                 break;
             default:
                 if ($feed < LABEL_BASE_INDEX) {
                     $message = __("No articles found to display. You can assign articles to labels manually from article header context menu (applies to all selected articles) or use a filter.");
                 } else {
                     $message = __("No articles found to display.");
                 }
         }
         if (!$offset && $message) {
             $reply['content'] .= "<div class='whiteBox'>{$message}";
             $reply['content'] .= "<p><span class=\"insensitive\">";
             $result = $this->dbh->query("SELECT " . SUBSTRING_FOR_DATE . "(MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds\n\t\t\t\t\tWHERE owner_uid = " . $_SESSION['uid']);
             $last_updated = $this->dbh->fetch_result($result, 0, "last_updated");
             $last_updated = make_local_datetime($last_updated, false);
             $reply['content'] .= sprintf(__("Feeds last updated at %s"), $last_updated);
             $result = $this->dbh->query("SELECT COUNT(id) AS num_errors\n\t\t\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]);
             $num_errors = $this->dbh->fetch_result($result, 0, "num_errors");
             if ($num_errors > 0) {
                 $reply['content'] .= "<br/>";
                 $reply['content'] .= "<a class=\"insensitive\" href=\"#\" onclick=\"showFeedsWithErrors()\">" . __('Some feeds have update errors (click for details)') . "</a>";
             }
             $reply['content'] .= "</span></p></div>";
         }
     }
     if ($_REQUEST["debug"]) {
         $timing_info = print_checkpoint("H2", $timing_info);
     }
     return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $vgroup_last_feed, $reply);
 }
Exemple #4
0
function outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgr_last_feed = false, $override_order = false)
{
    $disable_cache = false;
    $timing_info = getmicrotime();
    $topmost_article_ids = array();
    if (!$offset) {
        $offset = 0;
    }
    if ($subop == "undefined") {
        $subop = "";
    }
    $subop_split = split(":", $subop);
    if ($subop == "CatchupSelected") {
        $ids = split(",", db_escape_string($_REQUEST["ids"]));
        $cmode = sprintf("%d", $_REQUEST["cmode"]);
        catchupArticlesById($link, $ids, $cmode);
    }
    if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
        update_generic_feed($link, $feed, $cat_view, true);
    }
    if ($subop == "MarkAllRead") {
        catchup_feed($link, $feed, $cat_view);
        if (get_pref($link, 'ON_CATCHUP_SHOW_NEXT_FEED')) {
            if ($next_unread_feed) {
                $feed = $next_unread_feed;
            }
        }
    }
    if ($subop_split[0] == "MarkAllReadGR") {
        catchup_feed($link, $subop_split[1], false);
    }
    if ($feed_id > 0) {
        $result = db_query($link, "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;
        }
    }
    if (preg_match("/^-?[0-9][0-9]*\$/", $feed) != false) {
        $result = db_query($link, "SELECT rtl_content FROM ttrss_feeds\n\t\t\t\tWHERE id = '{$feed}' AND owner_uid = " . $_SESSION["uid"]);
        if (db_num_rows($result) == 1) {
            $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
        } else {
            $rtl_content = false;
        }
        if ($rtl_content) {
            $rtl_tag = "dir=\"RTL\"";
        } else {
            $rtl_tag = "";
        }
    } else {
        $rtl_tag = "";
        $rtl_content = false;
    }
    $script_dt_add = get_script_dt_add();
    /// START /////////////////////////////////////////////////////////////////////////////////
    $search = db_escape_string($_REQUEST["query"]);
    if ($search) {
        $disable_cache = true;
    }
    $search_mode = db_escape_string($_REQUEST["search_mode"]);
    $match_on = db_escape_string($_REQUEST["match_on"]);
    if (!$match_on) {
        $match_on = "both";
    }
    $real_offset = $offset * $limit;
    if ($_REQUEST["debug"]) {
        $timing_info = print_checkpoint("H0", $timing_info);
    }
    $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order, $real_offset);
    if ($_REQUEST["debug"]) {
        $timing_info = print_checkpoint("H1", $timing_info);
    }
    $result = $qfh_ret[0];
    $feed_title = $qfh_ret[1];
    $feed_site_url = $qfh_ret[2];
    $last_error = $qfh_ret[3];
    $vgroup_last_feed = $vgr_last_feed;
    if ($feed == -2) {
        $feed_site_url = article_publish_url($link);
    }
    /// STOP //////////////////////////////////////////////////////////////////////////////////
    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;
        }
        print_headline_subtoolbar($link, $feed_site_url, $feed_title, $feed, $cat_view, $search, $match_on, $search_mode);
        print "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">";
    }
    $headlines_count = db_num_rows($result);
    if (db_num_rows($result) > 0) {
        #			print "\{$offset}";
        if (!get_pref($link, 'COMBINED_DISPLAY_MODE') && !$offset) {
            print "<table class=\"headlinesList\" id=\"headlinesList\" \n\t\t\t\t\tcellspacing=\"0\">";
        }
        $lnum = $limit * $offset;
        error_reporting(DEFAULT_ERROR_LEVEL);
        $num_unread = 0;
        $cur_feed_title = '';
        $fresh_intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE") * 60 * 60;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $id = $line["id"];
            $feed_id = $line["feed_id"];
            $labels = get_article_labels($link, $id);
            $labels_str = "<span id=\"HLLCTR-{$id}\">";
            $labels_str .= format_article_labels($labels, $id);
            $labels_str .= "</span>";
            if (count($topmost_article_ids) < 5) {
                array_push($topmost_article_ids, $id);
            }
            if ($line["last_read"] == "" && !sql_bool_to_bool($line["unread"])) {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($link, 'images/updated.png') . "\" \n\t\t\t\t\t\talt=\"Updated\">";
            } else {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"images/blank_icon.gif\" \n\t\t\t\t\t\talt=\"Updated\">";
            }
            if (sql_bool_to_bool($line["unread"]) && time() - strtotime($line["updated_noms"]) < $fresh_intl) {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($link, 'images/fresh_sign.png') . "\" alt=\"Fresh\">";
            }
            if ($line["unread"] == "t" || $line["unread"] == "1") {
                $class .= "Unread";
                ++$num_unread;
                $is_unread = true;
            } else {
                $is_unread = false;
            }
            if ($line["marked"] == "t" || $line["marked"] == "1") {
                $marked_pic = "<img id=\"FMPIC-{$id}\" \n\t\t\t\t\t\tsrc=\"" . theme_image($link, 'images/mark_set.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Unstar article\" \n\t\t\t\t\t\tonclick='javascript:tMark({$id})'>";
            } else {
                $marked_pic = "<img id=\"FMPIC-{$id}\" \n\t\t\t\t\t\tsrc=\"" . theme_image($link, 'images/mark_unset.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Star article\" \n\t\t\t\t\t\tonclick='javascript:tMark({$id})'>";
            }
            if ($line["published"] == "t" || $line["published"] == "1") {
                $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($link, 'images/pub_set.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\"\n\t\t\t\t\t\talt=\"Unpublish article\" onclick='javascript:tPub({$id})'>";
            } else {
                $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($link, 'images/pub_unset.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\"\n\t\t\t\t\t\talt=\"Publish article\" onclick='javascript:tPub({$id})'>";
            }
            #				$content_link = "<a target=\"_blank\" href=\"".$line["link"]."\">" .
            #					$line["title"] . "</a>";
            #				$content_link = "<a
            #					href=\"" . htmlspecialchars($line["link"]) . "\"
            #					onclick=\"view($id,$feed_id);\">" .
            #					$line["title"] . "</a>";
            #				$content_link = "<a href=\"javascript:viewContentUrl('".$line["link"]."');\">" .
            #					$line["title"] . "</a>";
            if (get_pref($link, 'HEADLINES_SMART_DATE')) {
                $updated_fmt = smart_date_time(strtotime($line["updated_noms"]));
            } else {
                $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
                $updated_fmt = date($short_date, strtotime($line["updated_noms"]));
            }
            if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
                $content_preview = truncate_string(strip_tags($line["content_preview"]), 100);
            }
            $score = $line["score"];
            $score_pic = theme_image($link, "images/" . get_score_pic($score));
            /*				$score_title = __("(Click to change)");
            				$score_pic = "<img class='hlScorePic' src=\"images/$score_pic\" 
            					onclick=\"adjustArticleScore($id, $score)\" title=\"$score $score_title\">"; */
            $score_pic = "<img class='hlScorePic' src=\"{$score_pic}\" \n\t\t\t\t\ttitle=\"{$score}\">";
            if ($score > 500) {
                $hlc_suffix = "H";
            } else {
                if ($score < -100) {
                    $hlc_suffix = "L";
                } else {
                    $hlc_suffix = "";
                }
            }
            $entry_author = $line["author"];
            if ($entry_author) {
                $entry_author = " - {$entry_author}";
            }
            $has_feed_icon = feed_has_icon($feed_id);
            if ($has_feed_icon) {
                $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
            } else {
                //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">";
                $feed_icon_img = "";
            }
            if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
                if (get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    if ($feed_id != $vgroup_last_feed && $line["feed_title"]) {
                        $cur_feed_title = $line["feed_title"];
                        $vgroup_last_feed = $feed_id;
                        $cur_feed_title = htmlspecialchars($cur_feed_title);
                        $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)";
                        print "<tr class='feedTitle'><td colspan='7'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</td></tr>";
                    }
                }
                $mouseover_attrs = "onmouseover='postMouseIn({$id})' \n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                print "<tr class='{$class}' id='RROW-{$id}' {$mouseover_attrs}>";
                print "<td class='hlUpdPic'>{$update_pic}</td>";
                print "<td class='hlSelectRow'>\n\t\t\t\t\t\t<input type=\"checkbox\" onclick=\"tSR(this)\"\n\t\t\t\t\t\t\tid=\"RCHK-{$id}\">\n\t\t\t\t\t\t</td>";
                print "<td class='hlMarkedPic'>{$marked_pic}</td>";
                print "<td class='hlMarkedPic'>{$published_pic}</td>";
                #					if ($line["feed_title"]) {
                #						print "<td class='hlContent'>$content_link</td>";
                #						print "<td class='hlFeed'>
                #							<a href=\"javascript:viewfeed($feed_id, '', false)\">".
                #								truncate_string($line["feed_title"],30)."</a>&nbsp;</td>";
                #					} else {
                print "<td onclick='view({$id})' class='hlContent{$hlc_suffix}' valign='middle' id='HLC-{$id}'>";
                print "<a id=\"RTITLE-{$id}\" \n\t\t\t\t\t\thref=\"" . htmlspecialchars($line["link"]) . "\"\n\t\t\t\t\t\tonclick=\"return false\">" . $line["title"];
                if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
                    if ($content_preview) {
                        print "<span class=\"contentPreview\"> - {$content_preview}</span>";
                    }
                }
                print "</a>";
                print $labels_str;
                #							<a href=\"javascript:viewfeed($feed_id, '', false)\">".
                #							$line["feed_title"]."</a>
                if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    if ($line["feed_title"]) {
                        print "<span class=\"hlFeed\">\n\t\t\t\t\t\t\t\t(<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a>)\n\t\t\t\t\t\t\t</span>";
                    }
                }
                //					print "<img id='HLL-$id' class='hlLoading'
                //						src='images/indicator_tiny.gif' style='display : none'>";
                print "</td>";
                #					}
                print "<td class=\"hlUpdated\" onclick='view({$id})'><nobr>{$updated_fmt}&nbsp;</nobr></td>";
                print "<td class='hlMarkedPic'>{$score_pic}</td>";
                if ($line["feed_title"] && !get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    print "<td onclick=\"viewfeed({$feed_id})\" class=\"hlFeedIcon\">{$feed_icon_img}</td>";
                }
                print "</tr>";
            } else {
                if (get_pref($link, 'VFEED_GROUP_BY_FEED') && $line["feed_title"]) {
                    if ($feed_id != $vgroup_last_feed) {
                        $cur_feed_title = $line["feed_title"];
                        $vgroup_last_feed = $feed_id;
                        $cur_feed_title = htmlspecialchars($cur_feed_title);
                        $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)";
                        $has_feed_icon = feed_has_icon($feed_id);
                        if ($has_feed_icon) {
                            $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
                        } else {
                            //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">";
                        }
                        print "<div class='cdmFeedTitle'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</div>";
                    }
                }
                if ($is_unread) {
                    $add_class = "Unread";
                } else {
                    $add_class = "";
                }
                $expand_cdm = get_pref($link, 'CDM_EXPANDED');
                $show_excerpt = false;
                if ($expand_cdm && $score >= -100) {
                    $cdm_cstyle = "";
                    $show_excerpt = false;
                } else {
                    $cdm_cstyle = "style=\"display : none\"";
                    $show_excerpt = true;
                }
                $mouseover_attrs = "onmouseover='postMouseIn({$id})' \n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                print "<div class=\"cdmArticle{$add_class}\" \n\t\t\t\t\t\tid=\"RROW-{$id}\"\t\t\t\t\t\t\n\t\t\t\t\t\t{$mouseover_attrs}'>";
                print "<div class=\"cdmHeader\">";
                if (!get_pref($link, "VFEED_GROUP_BY_FEED") || !$line["feed_title"]) {
                    $cdm_feed_icon = "<span style=\"cursor : pointer\" onclick=\"viewfeed({$feed_id})\">{$feed_icon_img}</span>";
                }
                print "<div class=\"articleUpdated\">{$updated_fmt} {$score_pic} {$cdm_feed_icon}\n\t\t\t\t\t\t</div>";
                print "<span id=\"RTITLE-{$id}\" class=\"titleWrap{$hlc_suffix}\"><a class=\"title\" \n\t\t\t\t\t\tonclick=\"javascript:toggleUnread({$id}, 0)\"\n\t\t\t\t\t\ttarget=\"_blank\" href=\"" . $line["link"] . "\">" . $line["title"] . "</a>\n\t\t\t\t\t\t";
                print $entry_author;
                /*					if (!$expand_cdm || $score < -100) {
                						print "&nbsp;<a id=\"CICH-$id\" 
                							href=\"javascript:cdmExpandArticle($id)\">
                							(".__('Show article').")</a>";
                					} */
                print $labels_str;
                if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    if ($line["feed_title"]) {
                        print "&nbsp;(<a href='javascript:viewfeed({$feed_id})'>" . $line["feed_title"] . "</a>)";
                    }
                }
                print "</span></div>";
                if ($show_excerpt) {
                    print "<div class=\"cdmExcerpt\" id=\"CEXC-{$id}\"\n\t\t\t\t\t\t\tonclick=\"cdmExpandArticle({$id})\"\n\t\t\t\t\t\t\ttitle=\"" . __('Click to expand article') . "\">";
                    $content_preview = trim(truncate_string(strip_tags($line["content_preview"]), 100));
                    if (strlen($content_preview) != 0) {
                        print $content_preview;
                    } else {
                        print __('Click to expand article');
                    }
                    print "</div>";
                }
                print "<div class=\"cdmContent\" \n\t\t\t\t\t\tonclick=\"cdmClicked({$id})\"\n\t\t\t\t\t\tid=\"CICD-{$id}\" {$cdm_cstyle}>";
                if ($line["orig_feed_id"]) {
                    $tmp_result = db_query($link, "SELECT * FROM ttrss_archived_feeds\n\t\t\t\t\t\tWHERE id = " . $line["orig_feed_id"]);
                    if (db_num_rows($tmp_result) != 0) {
                        print "<div clear='both'>";
                        print __("Originally from:");
                        print "&nbsp;";
                        $tmp_line = db_fetch_assoc($tmp_result);
                        print "<a target='_blank' \n\t\t\t\t\t\t\thref=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>";
                        print "&nbsp;";
                        print "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>";
                        print "<img title='" . __('Feed URL') . "'class='tinyFeedIcon' src='images/pub_set.gif'></a>";
                        print "</div>";
                    }
                }
                //					print "<div class=\"cdmInnerContent\" id=\"CICD-$id\" $cdm_cstyle>";
                print "<div id=\"POSTNOTE-{$id}\">";
                if ($line['note']) {
                    print format_article_note($id, $line['note']);
                }
                print "</div>";
                print sanitize_rss($link, $line["content_preview"]);
                $article_content = $line["content_preview"];
                $e_result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE\n\t\t\t\t\t\tpost_id = '{$id}' AND content_url != ''");
                if (db_num_rows($e_result) > 0) {
                    $entries_html = array();
                    $entries = array();
                    while ($e_line = db_fetch_assoc($e_result)) {
                        $url = $e_line["content_url"];
                        $ctype = $e_line["content_type"];
                        if (!$ctype) {
                            $ctype = __("unknown type");
                        }
                        $filename = substr($url, strrpos($url, "/") + 1);
                        $entry = format_inline_player($link, $url, $ctype);
                        $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . $filename . " (" . $ctype . ")" . "</a>";
                        array_push($entries_html, $entry);
                        $entry = array();
                        $entry["type"] = $ctype;
                        $entry["filename"] = $filename;
                        $entry["url"] = $url;
                        array_push($entries, $entry);
                    }
                    $tmp_result = db_query($link, "SELECT always_display_enclosures FROM\n\t\t\t\t\tttrss_feeds WHERE id = " . $line['feed_id'] . " AND owner_uid = " . $_SESSION["uid"]);
                    $always_display_enclosures = db_fetch_result($tmp_result, 0, "always_display_enclosures");
                    if (!get_pref($link, "STRIP_IMAGES")) {
                        if ($always_display_enclosures || !preg_match("/img/i", $article_content)) {
                            foreach ($entries as $entry) {
                                if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) {
                                    print "<p><img \n\t\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"></p>";
                                }
                            }
                        }
                    }
                    print "<div class=\"cdmEnclosures\">";
                    if (db_num_rows($e_result) == 1) {
                        print __("Attachment:") . " ";
                    } else {
                        print __("Attachments:") . " ";
                    }
                    print join(", ", $entries_html);
                    print "</div>";
                }
                print "<br clear='both'>";
                //					print "</div>";
                /*					if (!$expand_cdm) {
                						print "<a id=\"CICH-$id\" 
                							href=\"javascript:cdmExpandArticle($id)\">
                							Show article</a>";
                					} */
                print "</div>";
                print "<div class=\"cdmFooter\"><span class='s0'>";
                /* print "<div class=\"markedPic\">Star it: $marked_pic</div>"; */
                print __("Select:") . " <input type=\"checkbox\" onclick=\"toggleSelectRowById(this, \n\t\t\t\t\t\t\t'RROW-{$id}')\" class=\"feedCheckBox\" id=\"RCHK-{$id}\">";
                print "</span><span class='s1'>{$marked_pic}&nbsp;";
                print "{$published_pic}&nbsp;";
                print "<img src=\"images/art-zoom.png\" class='tagsPic' \n\t\t\t\t\t\tonclick=\"zoomToArticle({$id})\"\n\t\t\t\t\t\tstyle=\"cursor : pointer\"\n\t\t\t\t\t\talt='Zoom' \n\t\t\t\t\t\ttitle='" . __('Show article summary in new window') . "'>&nbsp;";
                $note_escaped = htmlspecialchars($line['note'], ENT_QUOTES);
                print "<img src=\"images/art-pub-note.png\" class='tagsPic' \n\t\t\t\t\t\tstyle=\"cursor : pointer\" style=\"cursor : pointer\"\n\t\t\t\t\t\tonclick=\"publishWithNote({$id}, '{$note_escaped}')\"\n\t\t\t\t\t\talt='PubNote' title='" . __('Publish article with a note') . "'>";
                print "</span>";
                $tags_str = format_tags_string(get_article_tags($link, $id), $id);
                print "<span class='s1'>\n\t\t\t\t\t\t<img class='tagsPic' src='" . theme_image($link, 'images/tag.png') . "' alt='Tags' title='Tags'>\n\t\t\t\t\t\t<span id=\"ATSTR-{$id}\">{$tags_str}</span>\n\t\t\t\t\t\t<a title=\"" . __('Edit tags for this article') . "\" \n\t\t\t\t\t\thref=\"javascript:editArticleTags({$id}, {$feed_id}, true)\">(+)</a>";
                print "</span>";
                print "<span class='s2'><a class=\"cdmToggleLink\"\n\t\t\t\t\t\t\thref=\"javascript:toggleUnread({$id})\">\n\t\t\t\t\t\t\t" . __('toggle unread') . "</a></span>";
                print "</div>";
                print "</div>";
            }
            ++$lnum;
        }
        if (!get_pref($link, 'COMBINED_DISPLAY_MODE') && !$offset) {
            print "</table>";
        }
    } else {
        $message = "";
        switch ($view_mode) {
            case "unread":
                $message = __("No unread articles found to display.");
                break;
            case "updated":
                $message = __("No updated articles found to display.");
                break;
            case "marked":
                $message = __("No starred articles found to display.");
                break;
            default:
                if ($feed < -10) {
                    $message = __("No articles found to display. You can assign articles to labels manually (see the Actions menu above) or use a filter.");
                } else {
                    $message = __("No articles found to display.");
                }
        }
        if (!$offset) {
            print "<div class='whiteBox'>{$message}</div>";
        }
    }
    if (!$offset) {
        print "</div>";
        print "</div>";
    }
    return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $vgroup_last_feed);
}
Exemple #5
0
 function getScore()
 {
     $id = $this->dbh->escape_string($_REQUEST['id']);
     $result = $this->dbh->query("SELECT score FROM ttrss_user_entries WHERE ref_id = {$id} AND owner_uid = " . $_SESSION["uid"]);
     $score = $this->dbh->fetch_result($result, 0, "score");
     print json_encode(array("id" => $id, "score" => (int) $score, "score_pic" => get_score_pic($score)));
 }
Exemple #6
0
 function setScore()
 {
     $ids = $this->dbh->escape_string($_REQUEST['id']);
     $score = (int) $this->dbh->escape_string($_REQUEST['score']);
     $this->dbh->query("UPDATE ttrss_user_entries SET\n\t\t\tscore = '{$score}' WHERE ref_id IN ({$ids}) AND owner_uid = " . $_SESSION["uid"]);
     print json_encode(array("id" => $ids, "score_pic" => get_score_pic($score)));
 }
function module_pref_filters($link)
{
    $subop = $_REQUEST["subop"];
    $quiet = $_REQUEST["quiet"];
    if ($subop == "edit") {
        $filter_id = db_escape_string($_REQUEST["id"]);
        $result = db_query($link, "SELECT * FROM ttrss_filters WHERE id = '{$filter_id}' AND owner_uid = " . $_SESSION["uid"]);
        $reg_exp = htmlspecialchars(db_fetch_result($result, 0, "reg_exp"));
        $filter_type = db_fetch_result($result, 0, "filter_type");
        $feed_id = db_fetch_result($result, 0, "feed_id");
        $action_id = db_fetch_result($result, 0, "action_id");
        $action_param = db_fetch_result($result, 0, "action_param");
        $filter_param = db_fetch_result($result, 0, "filter_param");
        $enabled = sql_bool_to_bool(db_fetch_result($result, 0, "enabled"));
        $inverse = sql_bool_to_bool(db_fetch_result($result, 0, "inverse"));
        print "<div id=\"infoBoxTitle\">" . __('Filter Editor') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id=\"filter_edit_form\" onsubmit='return false'>";
        print "<input type=\"hidden\" name=\"op\" value=\"pref-filters\">";
        print "<input type=\"hidden\" name=\"id\" value=\"{$filter_id}\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
        $result = db_query($link, "SELECT id,description \n\t\t\t\tFROM ttrss_filter_types ORDER BY description");
        $filter_types = array();
        while ($line = db_fetch_assoc($result)) {
            //array_push($filter_types, $line["description"]);
            $filter_types[$line["id"]] = __($line["description"]);
        }
        print "<div class=\"dlgSec\">" . __("Match") . "</div>";
        print "<div class=\"dlgSecCont\">";
        if ($filter_type != 5) {
            $date_ops_invisible = 'style="display : none"';
        }
        print "<span id=\"filter_dlg_date_mod_box\" {$date_ops_invisible}>";
        print __("Date") . " ";
        $filter_params = array("before" => __("before"), "after" => __("after"));
        print_select_hash("filter_date_modifier", $filter_param, $filter_params);
        print "&nbsp;</span>";
        print "<input onkeypress=\"return filterCR(event, filterEditSave)\"\n\t\t\t\t\t name=\"reg_exp\" size=\"30\" value=\"{$reg_exp}\">";
        print "<span id=\"filter_dlg_date_chk_box\" {$date_ops_invisible}>";
        print "&nbsp;<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return filterDlgCheckDate()\" \n\t\t\t\tvalue=\"" . __('Check it') . "\">";
        print "</span>";
        print "<br/> " . __("on field") . " ";
        print_select_hash("filter_type", $filter_type, $filter_types, 'onchange="filterDlgCheckType(this)"');
        print "<br/>";
        print __("in") . " ";
        print_feed_select($link, "feed_id", $feed_id);
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Perform Action") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<select name=\"action_id\"\n\t\t\t\tonchange=\"filterDlgCheckAction(this)\">";
        $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions \n\t\t\t\tORDER BY name");
        while ($line = db_fetch_assoc($result)) {
            $is_sel = $line["id"] == $action_id ? "selected" : "";
            printf("<option value='%d' {$is_sel}>%s</option>", $line["id"], __($line["description"]));
        }
        print "</select>";
        $param_hidden = $action_id == 4 || $action_id == 6 || $action_id == 7 ? "" : "display : none";
        print "<span id=\"filter_dlg_param_box\" style=\"{$param_hidden}\">";
        print " " . __("with parameters:") . " ";
        $param_int_hidden = $action_id != 7 ? "" : "display : none";
        print "<input size=\"20\" style=\"{$param_int_hidden}\"\n\t\t\t\t\tonkeypress=\"return filterCR(event, filterEditSave)\"\t\t\n\t\t\t\t\tname=\"action_param\" value=\"{$action_param}\">";
        $param_int_hidden = $action_id == 7 ? "" : "display : none";
        print_label_select($link, "action_param_label", $action_param, $param_int_hidden);
        print "</span>";
        print "&nbsp;";
        // tiny layout hack
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Options") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<div style=\"line-height : 100%\">";
        if ($enabled) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        print "<input type=\"checkbox\" name=\"enabled\" id=\"enabled\" {$checked}>\n\t\t\t\t\t<label for=\"enabled\">" . __('Enabled') . "</label><br/>";
        if ($inverse) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        print "<input type=\"checkbox\" name=\"inverse\" id=\"inverse\" {$checked}>\n\t\t\t\t<label for=\"inverse\">" . __('Inverse match') . "</label>";
        print "</div>";
        print "</div>";
        print "<div class=\"dlgButtons\">";
        $reg_exp = htmlspecialchars($reg_exp, ENT_QUOTES);
        // second escaping seems to be needed for javascript
        print "<div style=\"float : left\">";
        print "<button onclick='return removeFilter({$filter_id}, \"{$reg_exp}\")'>" . __('Remove') . "</button>";
        print "</div>";
        print "<button onclick=\"return filterEditSave()\">" . __('Save') . "</button> ";
        print "<button onclick=\"return filterEditCancel()\">" . __('Cancel') . "</button>";
        print "</div>";
        return;
    }
    if ($subop == "editSave") {
        global $memcache;
        if ($memcache) {
            $memcache->flush();
        }
        $reg_exp = db_escape_string(trim($_REQUEST["reg_exp"]));
        $filter_type = db_escape_string(trim($_REQUEST["filter_type"]));
        $filter_id = db_escape_string($_REQUEST["id"]);
        $feed_id = db_escape_string($_REQUEST["feed_id"]);
        $action_id = db_escape_string($_REQUEST["action_id"]);
        $action_param = db_escape_string($_REQUEST["action_param"]);
        $action_param_label = db_escape_string($_REQUEST["action_param_label"]);
        $enabled = checkbox_to_sql_bool(db_escape_string($_REQUEST["enabled"]));
        $inverse = checkbox_to_sql_bool(db_escape_string($_REQUEST["inverse"]));
        # for the time being, no other filters use params anyway...
        $filter_param = db_escape_string($_REQUEST["filter_date_modifier"]);
        if (!$feed_id) {
            $feed_id = 'NULL';
        } else {
            $feed_id = sprintf("'%s'", db_escape_string($feed_id));
        }
        /* When processing 'assign label' filters, action_param_label dropbox
         * overrides action_param */
        if ($action_id == 7) {
            $action_param = $action_param_label;
        }
        $result = db_query($link, "UPDATE ttrss_filters SET \n\t\t\t\t\treg_exp = '{$reg_exp}', \n\t\t\t\t\tfeed_id = {$feed_id},\n\t\t\t\t\taction_id = '{$action_id}',\n\t\t\t\t\tfilter_type = '{$filter_type}',\n\t\t\t\t\tenabled = {$enabled},\n\t\t\t\t\tinverse = {$inverse},\n\t\t\t\t\taction_param = '{$action_param}',\n\t\t\t\t\tfilter_param = '{$filter_param}'\n\t\t\t\t\tWHERE id = '{$filter_id}' AND owner_uid = " . $_SESSION["uid"]);
        if (db_affected_rows($link, $result) != 0) {
            print_notice(T_sprintf("Saved filter <b>%s</b>", htmlspecialchars($reg_exp)));
        }
    }
    if ($subop == "remove") {
        if ($memcache) {
            $memcache->flush();
        }
        $ids = split(",", db_escape_string($_REQUEST["ids"]));
        foreach ($ids as $id) {
            db_query($link, "DELETE FROM ttrss_filters WHERE id = '{$id}' AND owner_uid = " . $_SESSION["uid"]);
        }
    }
    if ($subop == "add") {
        if ($memcache) {
            $memcache->flush();
        }
        $regexp = db_escape_string(trim($_REQUEST["reg_exp"]));
        $filter_type = db_escape_string(trim($_REQUEST["filter_type"]));
        $feed_id = db_escape_string($_REQUEST["feed_id"]);
        $action_id = db_escape_string($_REQUEST["action_id"]);
        $action_param = db_escape_string($_REQUEST["action_param"]);
        $action_param_label = db_escape_string($_REQUEST["action_param_label"]);
        $inverse = checkbox_to_sql_bool(db_escape_string($_REQUEST["inverse"]));
        # for the time being, no other filters use params anyway...
        $filter_param = db_escape_string($_REQUEST["filter_date_modifier"]);
        if (!$regexp) {
            return;
        }
        if (!$feed_id) {
            $feed_id = 'NULL';
        } else {
            $feed_id = sprintf("'%s'", db_escape_string($feed_id));
        }
        /* When processing 'assign label' filters, action_param_label dropbox
         * overrides action_param */
        if ($action_id == 7) {
            $action_param = $action_param_label;
        }
        $result = db_query($link, "INSERT INTO ttrss_filters (reg_exp,filter_type,owner_uid,feed_id,\n\t\t\t\t\taction_id, action_param, inverse, filter_param) \n\t\t\t\tVALUES \n\t\t\t\t\t('{$regexp}', '{$filter_type}','" . $_SESSION["uid"] . "', \n\t\t\t\t\t\t{$feed_id}, '{$action_id}', '{$action_param}', {$inverse}, '{$filter_param}')");
        if (db_affected_rows($link, $result) != 0) {
            print T_sprintf("Created filter <b>%s</b>", htmlspecialchars($regexp));
        }
        return;
    }
    if ($quiet) {
        return;
    }
    set_pref($link, "_PREFS_ACTIVE_TAB", "filterConfig");
    $sort = db_escape_string($_REQUEST["sort"]);
    if (!$sort || $sort == "undefined") {
        $sort = "reg_exp";
    }
    //		print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
    $result = db_query($link, "SELECT id,description \n\t\t\tFROM ttrss_filter_types ORDER BY description");
    $filter_types = array();
    while ($line = db_fetch_assoc($result)) {
        //array_push($filter_types, $line["description"]);
        $filter_types[$line["id"]] = $line["description"];
    }
    $filter_search = db_escape_string($_REQUEST["search"]);
    if (array_key_exists("search", $_REQUEST)) {
        $_SESSION["prefs_filter_search"] = $filter_search;
    } else {
        $filter_search = $_SESSION["prefs_filter_search"];
    }
    print "<div style='float : right'>\n\t\t\t<input id=\"filter_search\" size=\"20\" type=\"search\"\n\t\t\t\tonfocus=\"javascript:disableHotkeys();\" \n\t\t\t\tonblur=\"javascript:enableHotkeys();\"\n\t\t\t\tonchange=\"javascript:updateFilterList()\" value=\"{$filter_search}\">\n\t\t\t<button onclick=\"javascript:updateFilterList()\">" . __('Search') . "</button>\n\t\t\t&nbsp;\n\t\t\t<a class='helpLinkPic' href=\"javascript:displayHelpInfobox(2)\">\n\t\t\t<img style='vertical-align : top;' src='" . theme_image($link, "images/sign_quest.png") . "'></a>\n\t\t</div>";
    print "<button onclick=\"return quickAddFilter()\">" . __('Create filter') . "</button> ";
    print "<button onclick=\"return editSelectedFilter()\">" . __('Edit') . "</button> ";
    print "<button onclick=\"return removeSelectedFilters()\">" . __('Remove') . "</button> ";
    print "<button onclick=\"rescore_all_feeds()\">" . __('Rescore articles') . "</button> ";
    if ($filter_search) {
        $filter_search = split(' ', db_escape_string($filter_search));
        $tokens = array();
        foreach ($filter_search as $token) {
            $token = trim($token);
            array_push($tokens, "(\n\t\t\t\t\tUPPER(ttrss_filter_actions.description) LIKE UPPER('%{$token}%') OR \n\t\t\t\t\tUPPER(reg_exp) LIKE UPPER('%{$token}%') OR \n\t\t\t\t\tUPPER(action_param) LIKE UPPER('%{$token}%') OR \n\t\t\t\t\tUPPER(ttrss_feeds.title) LIKE UPPER('%{$token}%') OR\n\t\t\t\t\tUPPER(ttrss_filter_types.description) LIKE UPPER('%{$token}%'))");
        }
        $filter_search_query = "(" . join($tokens, " AND ") . ") AND ";
    } else {
        $filter_search_query = "";
    }
    $result = db_query($link, "SELECT \n\t\t\t\tttrss_filters.id AS id,reg_exp,\n\t\t\t\tttrss_filter_types.name AS filter_type_name,\n\t\t\t\tttrss_filter_types.description AS filter_type_descr,\n\t\t\t\tenabled,\n\t\t\t\tinverse,\n\t\t\t\tfeed_id,\n\t\t\t\tfilter_param,\n\t\t\t\tfilter_type,\n\t\t\t\tttrss_filter_actions.description AS action_description,\n\t\t\t\tttrss_feeds.title AS feed_title,\n\t\t\t\tttrss_filter_actions.name AS action_name,\n\t\t\t\tttrss_filters.action_param AS action_param\n\t\t\tFROM \n\t\t\t\tttrss_filter_types,ttrss_filter_actions,ttrss_filters LEFT JOIN\n\t\t\t\t\tttrss_feeds ON (ttrss_filters.feed_id = ttrss_feeds.id)\n\t\t\tWHERE\n\t\t\t\tfilter_type = ttrss_filter_types.id AND\n\t\t\t\t{$filter_search_query}\n\t\t\t\tttrss_filter_actions.id = action_id AND\n\t\t\t\tttrss_filters.owner_uid = " . $_SESSION["uid"] . "\n\t\t\tORDER by action_description, {$sort}");
    if (db_num_rows($result) != 0) {
        print "<p><table width=\"100%\" cellspacing=\"0\" class=\"prefFilterList\" \n\t\t\t\tid=\"prefFilterList\">";
        print "<tr><td class=\"selectPrompt\" colspan=\"8\">\n\t\t\t\t" . __('Select:') . " \n\t\t\t\t\t<a href=\"javascript:selectPrefRows('filter', true)\">" . __('All') . "</a>,\n\t\t\t\t\t<a href=\"javascript:selectPrefRows('filter', false)\">" . __('None') . "</a>\n\t\t\t\t</td</tr>";
        $lnum = 0;
        $cur_action_description = "";
        while ($line = db_fetch_assoc($result)) {
            $filter_id = $line["id"];
            $edit_filter_id = $_REQUEST["id"];
            $enabled = sql_bool_to_bool($line["enabled"]);
            $inverse = sql_bool_to_bool($line["inverse"]);
            $this_row_id = "id=\"FILRR-{$filter_id}\"";
            $line["filter_type_descr"] = __($line["filter_type_descr"]);
            $line["action_description"] = __($line["action_description"]);
            if ($line["action_description"] != $cur_action_description) {
                $cur_action_description = $line["action_description"];
                print "<tr><td class='filterEditCat' colspan='6'>{$cur_action_description}</td></tr>";
                print "<tr class=\"title\">\n\t\t\t\t\t\t<td align='center' width=\"5%\">&nbsp;</td>\n\t\t\t\t\t\t<td width=\"20%\"><a href=\"javascript:updateFilterList('reg_exp')\">" . __('Match') . "</a></td>\n\t\t\t\t\t\t<td width=\"\"><a href=\"javascript:updateFilterList('feed_title')\">" . __('Feed') . "</a></td>\n\t\t\t\t\t\t<td width=\"20%\"><a href=\"javascript:updateFilterList('filter_type')\">" . __('Field') . "</a></td>\n\t\t\t\t\t\t<td width=\"20%\"><a href=\"javascript:updateFilterList('action_param')\">" . __('Params') . "</a></td>";
                $lnum = 0;
            }
            $class = $lnum % 2 ? "even" : "odd";
            print "<tr class=\"{$class}\" {$this_row_id}>";
            $line["reg_exp"] = htmlspecialchars($line["reg_exp"]);
            if (!$line["feed_title"]) {
                $line["feed_title"] = __("All feeds");
            }
            if (!$line["action_param"]) {
                $line["action_param"] = "&mdash;";
            } else {
                if ($line["action_name"] == "score") {
                    $score_pic = theme_image($link, "images/" . get_score_pic($line["action_param"]));
                    $score_pic = "<img class='hlScorePic' src=\"{$score_pic}\">";
                    $line["action_param"] = "{$score_pic} " . $line["action_param"];
                }
            }
            $line["feed_title"] = htmlspecialchars($line["feed_title"]);
            print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"filter\");' \n\t\t\t\t\ttype=\"checkbox\" id=\"FICHK-" . $line["id"] . "\"></td>";
            $filter_params = array("before" => __("before"), "after" => __("after"));
            if ($line["action_name"] == 'label') {
                $tmp_result = db_query($link, "SELECT fg_color, bg_color\n\t\t\t\t\t\tFROM ttrss_labels2 WHERE caption = '" . db_escape_string($line["action_param"]) . "' AND\n\t\t\t\t\t\t\towner_uid = " . $_SESSION["uid"]);
                $fg_color = db_fetch_result($tmp_result, 0, "fg_color");
                $bg_color = db_fetch_result($tmp_result, 0, "bg_color");
                $tmp = "<div class='labelColorIndicator' id='LICID-{$id}' \n\t\t\t\t\t\tstyle='color : {$fg_color}; background-color : {$bg_color}'>\n\t\t\t\t\t\t&alpha;";
                $tmp .= "</div>";
                $line["action_param"] = "{$tmp} " . $line["action_param"];
            }
            if ($line["filter_type"] == 5) {
                if (!strtotime($line["reg_exp"])) {
                    $line["reg_exp"] = "<span class=\"filterDateError\">" . $line["reg_exp"] . "</span>";
                }
                $line["reg_exp"] = __("Date") . " " . $filter_params[$line['filter_param']] . " " . $line["reg_exp"];
            }
            if (!$enabled) {
                $line["reg_exp"] = "<span class=\"insensitive\">" . $line["reg_exp"] . " " . __("(Disabled)") . "</span>";
                $line["feed_title"] = "<span class=\"insensitive\">" . $line["feed_title"] . "</span>";
                $line["filter_type_descr"] = "<span class=\"insensitive\">" . $line["filter_type_descr"] . "</span>";
                $line["action_description"] = "<span class=\"insensitive\">" . $line["action_description"] . "</span>";
                $line["action_param"] = "<span class=\"insensitive\">" . $line["action_param"] . "</span>";
            }
            $onclick = "onclick='editFilter({$filter_id})' title='" . __('Click to edit') . "'";
            $inverse_label = "";
            if ($inverse) {
                $inverse_label = " <span class='insensitive'>" . __('(Inverse)') . "</span>";
            }
            print "<td {$onclick}>" . $line["reg_exp"] . "{$inverse_label}</td>";
            print "<td {$onclick}>" . $line["feed_title"] . "</td>";
            print "<td {$onclick}>" . $line["filter_type_descr"] . "</td>";
            print "<td {$onclick}>" . $line["action_param"] . "</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
    } else {
        print "<p>";
        if (!$filter_search) {
            print_warning(__('No filters defined.'));
        } else {
            print_warning(__('No matching filters found.'));
        }
        print "</p>";
    }
}