X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=functions.php;h=8b13bed987983f7d893f66d648744db09ab8a832;hb=6f5b1e042c62023f9341d01120828c01a10a502b;hp=a46061bda64bc10ebaf2235c0d73c9ee6ba0d882;hpb=aec3ce39de92ab044cbfb4eaa7f98a564a010510;p=tt-rss.git diff --git a/functions.php b/functions.php index a46061bd..8b13bed9 100644 --- a/functions.php +++ b/functions.php @@ -1,4 +1,4 @@ -]+rel="(?:shortcut )?icon"[^>]+?href="([^"]+?)"/si', $html, $matches)) { + // Attempt to grab a favicon link from their webpage url + $linkUrl = html_entity_decode($matches[1]); + + if (substr($linkUrl, 0, 1) == '/') { + $urlParts = parse_url($url); + $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].$linkUrl; + } else if (substr($linkUrl, 0, 7) == 'http://') { + $faviconURL = $linkUrl; + } else if (substr($url, -1, 1) == '/') { + $faviconURL = $url.$linkUrl; + } else { + $faviconURL = $url.'/'.$linkUrl; } - chmod($icon_file, 0644); + } else { + // If unsuccessful, attempt to "guess" the favicon location + $urlParts = parse_url($url); + $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].'/favicon.ico'; + } + } + + // Run a test to see if what we have attempted to get actually exists. + if(USE_CURL_FOR_ICONS || url_validate($faviconURL)) { + return $faviconURL; + } else { + return false; + } + } + + function url_validate($link) { + + $url_parts = @parse_url($link); + + if ( empty( $url_parts["host"] ) ) + return false; + + if ( !empty( $url_parts["path"] ) ) { + $documentpath = $url_parts["path"]; + } else { + $documentpath = "/"; + } + + if ( !empty( $url_parts["query"] ) ) + $documentpath .= "?" . $url_parts["query"]; + + $host = $url_parts["host"]; + $port = $url_parts["port"]; + + if ( empty($port) ) + $port = "80"; + + $socket = @fsockopen( $host, $port, $errno, $errstr, 30 ); + + if ( !$socket ) + return false; - error_reporting (DEFAULT_ERROR_LEVEL); + fwrite ($socket, "HEAD ".$documentpath." HTTP/1.0\r\nHost: $host\r\n\r\n"); + + $http_response = fgets( $socket, 22 ); - } + $responses = "/(200 OK)|(30[0-9] Moved)/"; + if ( preg_match($responses, $http_response) ) { + fclose($socket); + return true; + } else { + return false; } + + } + + function check_feed_favicon($site_url, $feed, $link) { + $favicon_url = get_favicon_url($site_url); + +# print "FAVICON [$site_url]: $favicon_url\n"; + + error_reporting(0); + + $icon_file = ICONS_DIR . "/$feed.ico"; + + if ($favicon_url && !file_exists($icon_file)) { + $contents = fetch_file_contents($favicon_url); + + $fp = fopen($icon_file, "w"); + + if ($fp) { + fwrite($fp, $contents); + fclose($fp); + chmod($icon_file, 0644); + } + } + + error_reporting(DEFAULT_ERROR_LEVEL); + } function update_rss_feed($link, $feed_url, $feed, $ignore_daemon = false) { @@ -312,8 +402,8 @@ $owner_uid = db_fetch_result($result, 0, "owner_uid"); - if (get_pref($link, 'ENABLE_FEED_ICONS', $owner_uid)) { - check_feed_favicon($feed_url, $feed, $link); + if (get_pref($link, 'ENABLE_FEED_ICONS', $owner_uid, false)) { + check_feed_favicon($rss->channel["link"], $feed, $link); } if (!$registered_title || $registered_title == "[Unknown]") { @@ -361,6 +451,7 @@ ttrss_filter_types.name AS name, ttrss_filter_actions.name AS action FROM ttrss_filters,ttrss_filter_types,ttrss_filter_actions WHERE + enabled = true AND owner_uid = $owner_uid AND ttrss_filter_types.id = filter_type AND ttrss_filter_actions.id = action_id AND @@ -400,7 +491,8 @@ if (!$entry_guid) $entry_guid = $item["guid"]; if (!$entry_guid) $entry_guid = $item["link"]; - + if (!$entry_guid) $entry_guid = make_guid_from_title($item["title"]); + if (!$entry_guid) continue; $entry_timestamp = ""; @@ -423,15 +515,17 @@ $entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp); - $entry_title = $item["title"]; + $entry_title = trim(strip_tags($item["title"])); // strange Magpie workaround $entry_link = $item["link_"]; if (!$entry_link) $entry_link = $item["link"]; if (!$entry_title) continue; - if (!$entry_link) continue; - +# if (!$entry_link) continue; + + $entry_link = strip_tags($entry_link); + $entry_content = $item["content:escaped"]; if (!$entry_content) $entry_content = $item["content:encoded"]; @@ -455,11 +549,10 @@ $entry_content_unescaped = $entry_content; $content_hash = "SHA1:" . sha1(strip_tags($entry_content)); - $entry_comments = $item["comments"]; - - $entry_author = db_escape_string($item['dc']['creator']); + $entry_comments = strip_tags($item["comments"]); - $entry_guid = db_escape_string($entry_guid); + $entry_author = db_escape_string(strip_tags($item['dc']['creator'])); + $entry_guid = db_escape_string(strip_tags($entry_guid)); $result = db_query($link, "SELECT id FROM ttrss_entries WHERE guid = '$entry_guid'"); @@ -472,70 +565,11 @@ $num_comments = db_escape_string($item["slash"]["comments"]); if (!$num_comments) $num_comments = 0; - - } else if (RSS_BACKEND_TYPE == "simplepie") { - - $entry_guid = $item->get_id(); - - if (!$entry_guid) { - $entry_guid = $item->get_permalink(); - } - - if (!$entry_guid) continue; - - $entry_timestamp = $item->get_date("U"); - - if ($entry_timestamp == "") { - $entry_timestamp = time(); - $no_orig_date = 'true'; - } else { - $no_orig_date = 'false'; - } - - $entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp); - - $entry_title = $item->get_title(); - $entry_link = $item->get_permalink(); - - if (!$entry_title) continue; - if (!$entry_link) continue; - - $entry_content = $item->get_description(); - -// print_r(htmlspecialchars($entry_content)); -// print "
"; - - $entry_content_unescaped = $entry_content; - $content_hash = "SHA1:" . sha1(strip_tags($entry_content)); - - $entry_comments = ""; # FIXME - - $entry_author = $item->get_author(0); - - $entry_author = db_escape_string($entry_author->name); - - $entry_guid = db_escape_string($entry_guid); - - $result = db_query($link, "SELECT id FROM ttrss_entries - WHERE guid = '$entry_guid'"); - - $entry_content = db_escape_string($entry_content); - $entry_title = db_escape_string($entry_title); - $entry_link = db_escape_string($entry_link); - $entry_comments = db_escape_string($entry_comments); - - $num_comments = 0; # FIXME - - if (!$num_comments) $num_comments = 0; - } # sanitize content $entry_content = sanitize_rss($entry_content); - $entry_title = sanitize_rss($entry_title); - $entry_link = sanitize_rss($entry_link); - $entry_comments = sanitize_rss($entry_comments); db_query($link, "BEGIN"); @@ -605,7 +639,7 @@ // check for user post link to main table // do we allow duplicate posts with same GUID in different feeds? - if (get_pref($link, "ALLOW_DUPLICATE_POSTS", $owner_uid)) { + if (get_pref($link, "ALLOW_DUPLICATE_POSTS", $owner_uid, false)) { $dupcheck_qpart = "AND feed_id = '$feed'"; } else { $dupcheck_qpart = ""; @@ -653,7 +687,7 @@ $post_needs_update = false; - if (get_pref($link, "UPDATE_POST_ON_CHECKSUM_CHANGE", $owner_uid) && + if (get_pref($link, "UPDATE_POST_ON_CHECKSUM_CHANGE", $owner_uid, false) && ($content_hash != $orig_content_hash)) { $post_needs_update = true; } @@ -683,7 +717,7 @@ num_comments = '$num_comments' WHERE id = '$ref_id'"); - if (get_pref($link, "MARK_UNREAD_ON_UPDATE")) { + if (get_pref($link, "MARK_UNREAD_ON_UPDATE", $owner_uid, false)) { db_query($link, "UPDATE ttrss_user_entries SET last_read = null, unread = true WHERE ref_id = '$ref_id'"); } else { @@ -859,7 +893,8 @@ $link_title = "Updated: $last_updated"; } - $feed = "$feed_title"; + $feed = "$feed_title"; print "
  • "; if (get_pref($link, 'ENABLE_FEED_ICONS')) { @@ -977,14 +1012,23 @@ return true; } - function authenticate_user($link, $login, $password) { + function authenticate_user($link, $login, $password, $force_auth = false) { if (!SINGLE_USER_MODE) { $pwd_hash = 'SHA1:' . sha1($password); - - $result = db_query($link, "SELECT id,login,access_level FROM ttrss_users WHERE - login = '$login' AND pwd_hash = '$pwd_hash'"); + + if ($force_auth && defined('_DEBUG_USER_SWITCH')) { + $query = "SELECT id,login,access_level + FROM ttrss_users WHERE + login = '$login'"; + } else { + $query = "SELECT id,login,access_level + FROM ttrss_users WHERE + login = '$login' AND pwd_hash = '$pwd_hash'"; + } + + $result = db_query($link, $query); if (db_num_rows($result) == 1) { $_SESSION["uid"] = db_fetch_result($result, 0, "id"); @@ -1111,6 +1155,14 @@ function login_sequence($link) { if (!SINGLE_USER_MODE) { + if (defined('_DEBUG_USER_SWITCH') && $_SESSION["uid"]) { + $swu = db_escape_string($_REQUEST["swu"]); + if ($swu) { + $_SESSION["prefs_cache"] = false; + return authenticate_user($link, $swu, null, true); + } + } + if (!validate_session($link)) { logout_user(); $redirect_uri = get_login_redirect(); @@ -1437,7 +1489,7 @@ FROM ttrss_user_entries WHERE feed_id = ttrss_feeds.id AND unread = true)) AS unread FROM ttrss_feeds WHERE - owner_uid = ".$_SESSION["uid"]." GROUP BY cat_id"); + hidden = false AND owner_uid = ".$_SESSION["uid"]." GROUP BY cat_id"); while ($line = db_fetch_assoc($result)) { $line["cat_id"] = sprintf("%d", $line["cat_id"]); @@ -1455,6 +1507,7 @@ } $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE $cat_query + AND hidden = false AND owner_uid = " . $_SESSION["uid"]); $cat_feeds = array(); @@ -1490,7 +1543,9 @@ $match_part = "marked = true"; } else if ($n_feed > 0) { - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE parent_feed = '$n_feed' + $result = db_query($link, "SELECT id FROM ttrss_feeds + WHERE parent_feed = '$n_feed' + AND hidden = false AND owner_uid = " . $_SESSION["uid"]); if (db_num_rows($result) > 0) { @@ -1499,12 +1554,15 @@ while ($line = db_fetch_assoc($result)) { array_push($linked_feeds, "feed_id = " . $line["id"]); } + + array_push($linked_feeds, "feed_id = $n_feed"); $match_part = implode(" OR ", $linked_feeds); $result = db_query($link, "SELECT COUNT(int_id) AS unread - FROM ttrss_user_entries - WHERE unread = true AND ($match_part) AND owner_uid = " . $_SESSION["uid"]); + FROM ttrss_user_entries + WHERE unread = true AND ($match_part) + AND owner_uid = " . $_SESSION["uid"]); $unread = 0; @@ -1519,6 +1577,7 @@ $match_part = "feed_id = '$n_feed'"; } } else if ($feed < -10) { + $label_id = -$feed - 11; $result = db_query($link, "SELECT sql_exp FROM ttrss_labels WHERE @@ -1533,6 +1592,7 @@ FROM ttrss_user_entries,ttrss_feeds,ttrss_entries WHERE ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND + ttrss_feeds.hidden = false AND unread = true AND ($match_part) AND ttrss_user_entries.owner_uid = " . $_SESSION["uid"]); } else { @@ -1544,16 +1604,24 @@ } $unread = db_fetch_result($result, 0, "unread"); + return $unread; } /* FIXME this needs reworking */ - function getGlobalUnread($link) { - $result = db_query($link, "SELECT count(id) as c_id FROM ttrss_entries,ttrss_user_entries + function getGlobalUnread($link, $user_id = false) { + + if (!$user_id) { + $user_id = $_SESSION["uid"]; + } + + $result = db_query($link, "SELECT count(ttrss_entries.id) as c_id FROM ttrss_entries,ttrss_user_entries,ttrss_feeds WHERE unread = true AND + ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND - owner_uid = " . $_SESSION["uid"]); + hidden = false AND + ttrss_user_entries.owner_uid = '$user_id'"); $c_id = db_fetch_result($result, 0, "c_id"); return $c_id; } @@ -1562,7 +1630,17 @@ if ($global_unread == -1) { $global_unread = getGlobalUnread($link); } - print ""; + print ""; + + $result = db_query($link, "SELECT COUNT(id) AS fn FROM + ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]); + + $subscribed_feeds = db_fetch_result($result, 0, "fn"); + + print ""; + } function getTagCounters($link, $smart_mode = SMART_RPC_COUNTERS) { @@ -1656,6 +1734,7 @@ $tmp_result = db_query($link, "SELECT count(ttrss_entries.id) as count FROM ttrss_user_entries,ttrss_entries,ttrss_feeds WHERE (" . $line["sql_exp"] . ") AND unread = true AND + ttrss_feeds.hidden = false AND ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND ttrss_user_entries.owner_uid = ".$_SESSION["uid"]); @@ -1802,7 +1881,11 @@ } function subscribe_to_feed($link, $feed_link, $cat_id = 0) { - + + $feed_link = trim(preg_replace("/^feed:/", "", $feed_link)); + + if ($feed_link == "") return; + if ($cat_id == "0" || !$cat_id) { $cat_qpart = "NULL"; } else { @@ -1970,6 +2053,9 @@ print ""; + print ""; + print ""; } @@ -2218,6 +2304,7 @@ $content_query_part = "content as content_preview,"; $query = "SELECT + guid, ttrss_entries.id,ttrss_entries.title, SUBSTRING(updated,1,16) as updated, unread,feed_id,marked,link,last_read, @@ -2228,6 +2315,7 @@ FROM ttrss_entries,ttrss_user_entries,ttrss_feeds WHERE + ttrss_feeds.hidden = false AND ttrss_user_entries.feed_id = ttrss_feeds.id AND ttrss_user_entries.ref_id = ttrss_entries.id AND ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND @@ -2246,6 +2334,7 @@ $feed_kind = "Tags"; $result = db_query($link, "SELECT + guid, ttrss_entries.id as id,title, SUBSTRING(updated,1,16) as updated, unread,feed_id, @@ -2289,6 +2378,7 @@ while ($line = db_fetch_assoc($result)) { print ""; + print "" . htmlspecialchars($line["guid"]) . ""; print "" . htmlspecialchars($line["link"]) . ""; $rfc822_date = date('r', strtotime($line["updated"])); @@ -2321,14 +2411,589 @@ } function sanitize_rss($str) { - $res = ""; + $res = $str; $res = preg_replace('//i', - "

    ", $str); + "

    Disabled script: ", $res); + + $res = preg_replace('/<\/script.*?>/i', "

    ", $res); + +/* $res = preg_replace('//i', "", $res); - $res = preg_replace('/<\/script>/i', - "

    ", $res); + $res = preg_replace('/.*?<\/object>/i', + "

    (Disabled html object + - flash or other embedded content)

    ", $res); */ return $res; } + + function send_headlines_digests($link, $limit = 100) { + + if (!DIGEST_ENABLE) return false; + + $user_limit = DIGEST_EMAIL_LIMIT; + $days = 1; + + print "Sending digests, batch of max $user_limit users, days = $days, headline limit = $limit\n\n"; + + if (DB_TYPE == "pgsql") { + $interval_query = "last_digest_sent < NOW() - INTERVAL '$days days'"; + } else if (DB_TYPE == "mysql") { + $interval_query = "last_digest_sent < DATE_SUB(NOW(), INTERVAL $days DAY)"; + } + + $result = db_query($link, "SELECT id,email FROM ttrss_users + WHERE email != '' AND (last_digest_sent IS NULL OR $interval_query)"); + + while ($line = db_fetch_assoc($result)) { + if (get_pref($link, 'DIGEST_ENABLE', $line['id'], false)) { + print "Sending digest for UID:" . $line['id'] . " - " . $line["email"] . " ... "; + + $tuple = prepare_headlines_digest($link, $line["id"], $days, $limit); + $digest = $tuple[0]; + $headlines_count = $tuple[1]; + + if ($headlines_count > 0) { + $rc = mail($line["login"] . " <" . $line["email"] . ">", + "[tt-rss] New headlines for last 24 hours", $digest, + "From: " . MAIL_FROM . "\n". + "Content-Type: text/plain; charset=\"utf-8\"\n". + "Content-Transfer-Encoding: 8bit\n"); + print "RC=$rc\n"; + db_query($link, "UPDATE ttrss_users SET last_digest_sent = NOW() + WHERE id = " . $line["id"]); + } else { + print "No headlines\n"; + } + } + } + +// $digest = prepare_headlines_digest($link, $user_id, $days, $limit); + + } + + function prepare_headlines_digest($link, $user_id, $days = 1, $limit = 100) { + $tmp = "New headlines for last 24 hours, as of " . date("Y/m/d H:m") . "\n"; + $tmp .= "=======================================================\n\n"; + + if (DB_TYPE == "pgsql") { + $interval_query = "ttrss_entries.date_entered > NOW() - INTERVAL '$days days'"; + } else if (DB_TYPE == "mysql") { + $interval_query = "ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL $days DAY)"; + } + + $result = db_query($link, "SELECT ttrss_entries.title, + ttrss_feeds.title AS feed_title, + date_entered, + link, + SUBSTRING(last_updated,1,19) AS last_updated + FROM + ttrss_user_entries,ttrss_entries,ttrss_feeds + WHERE + ref_id = ttrss_entries.id AND feed_id = ttrss_feeds.id + AND include_in_digest = true + AND $interval_query + AND ttrss_user_entries.owner_uid = $user_id + AND unread = true ORDER BY ttrss_feeds.title, date_entered DESC + LIMIT $limit"); + + $cur_feed_title = ""; + + $headlines_count = db_num_rows($result); + + while ($line = db_fetch_assoc($result)) { + $updated = smart_date_time(strtotime($line["last_updated"])); + $feed_title = $line["feed_title"]; + + if ($cur_feed_title != $feed_title) { + $cur_feed_title = $feed_title; + + $tmp .= "$feed_title\n\n"; + } + + $tmp .= " * " . trim($line["title"]) . " - $updated\n"; + $tmp .= " " . trim($line["link"]) . "\n"; + $tmp .= "\n"; + } + + $tmp .= "--- \n"; + $tmp .= "You have been sent this email because you have enabled daily digests in Tiny Tiny RSS at " . + DIGEST_HOSTNAME . "\n". + "To unsubscribe, visit your configuration options or contact instance owner.\n"; + + + return array($tmp, $headlines_count); + } + + function check_for_update($link) { + $releases_feed = "http://tt-rss.spb.ru/releases.rss"; + + if (!CHECK_FOR_NEW_VERSION || $_SESSION["access_level"] < 10) { + return; + } + + error_reporting(0); + $rss = fetch_rss($releases_feed); + error_reporting (DEFAULT_ERROR_LEVEL); + + if ($rss) { + + $items = $rss->items; + + if (!$items || !is_array($items)) $items = $rss->entries; + if (!$items || !is_array($items)) $items = $rss; + + if (!is_array($items) || count($items) == 0) { + return; + } + + $latest_item = $items[0]; + + $latest_version = trim(preg_replace("/(Milestone)|(completed)/", "", $latest_item["title"])); + + $release_url = sanitize_rss($latest_item["link"]); + $content = sanitize_rss($latest_item["description"]); + + if (version_compare(VERSION, $latest_version) == -1) { + return ""; + } + } + } + + function markArticlesById($link, $ids, $cmode) { + + $tmp_ids = array(); + + foreach ($ids as $id) { + array_push($tmp_ids, "ref_id = '$id'"); + } + + $ids_qpart = join(" OR ", $tmp_ids); + + if ($cmode == 0) { + db_query($link, "UPDATE ttrss_user_entries SET + marked = false,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else if ($cmode == 1) { + db_query($link, "UPDATE ttrss_user_entries SET + marked = true + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else { + db_query($link, "UPDATE ttrss_user_entries SET + marked = NOT marked,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } + } + + function catchupArticlesById($link, $ids, $cmode) { + + $tmp_ids = array(); + + foreach ($ids as $id) { + array_push($tmp_ids, "ref_id = '$id'"); + } + + $ids_qpart = join(" OR ", $tmp_ids); + + if ($cmode == 0) { + db_query($link, "UPDATE ttrss_user_entries SET + unread = false,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else if ($cmode == 1) { + db_query($link, "UPDATE ttrss_user_entries SET + unread = true + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } else { + db_query($link, "UPDATE ttrss_user_entries SET + unread = NOT unread,last_read = NOW() + WHERE ($ids_qpart) AND owner_uid = " . $_SESSION["uid"]); + } + } + + function escape_for_form($s) { + return htmlspecialchars(db_unescape_string($s)); + } + + function make_guid_from_title($title) { + return preg_replace("/[ \"\',.:;]/", "-", + mb_strtolower(strip_tags($title))); + } + + function print_headline_subtoolbar($link, $feed_site_url, $feed_title, + $bottom = false, $rtl_content = false, $feed_id = 0, + $is_cat = false, $search = false, $match_on = false, + $search_mode = false) { + + if (!$bottom) { + $class = "headlinesSubToolbar"; + $tid = "headlineActionsTop"; + } else { + $class = "headlinesSubToolbar"; + $tid = "headlineActionsBottom"; + } + + print ""; + + if ($rtl_content) { + $rtl_cpart = "RTL"; + } else { + $rtl_cpart = ""; + } + + if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) { + + print ""; + + if ($search && $feed_id > 0 && get_pref($link, 'ENABLE_LABELS') && GLOBAL_ENABLE_LABELS) { + print ""; + } + + } else { + + print ""; + + } + + print ""; + print "
    + Select: + All, + Unread, + None +    + Toggle: Unread, + Starred +    + Mark as read: + Page, + Feed"; + print " + + Convert this search to label + Select: + All, + Unread, + None +    + Toggle: Unread, + Starred"; + + print ""; + + if ($feed_site_url) { + if (!$bottom) { + $target = "target=\"_blank\""; + } + print "$feed_title"; + } else { + print $feed_title; + } + + if ($search) { + $search_q = "&q=$search&m=$match_on&smode=$search_mode"; + } + + if (!$bottom) { + print "  + + \"Generated + "; + } + + print "
    "; + + } + + function outputFeedList($link, $tags = false) { + + print "
      \n"; + + $owner_uid = $_SESSION["uid"]; + + if (!$tags) { + + /* virtual feeds */ + + if (get_pref($link, 'ENABLE_FEED_CATS')) { + print "
    • Special
    • "; + print "
      • "; + } + + $num_starred = getFeedUnread($link, -1); + + $class = "virt"; + + if ($num_starred > 0) $class .= "Unread"; + + printFeedEntry(-1, $class, "Starred articles", $num_starred, + "images/mark_set.png", $link); + + if (get_pref($link, 'ENABLE_FEED_CATS')) { + print "
      \n"; + } + + if (GLOBAL_ENABLE_LABELS && get_pref($link, 'ENABLE_LABELS')) { + + $result = db_query($link, "SELECT id,sql_exp,description FROM + ttrss_labels WHERE owner_uid = '$owner_uid' ORDER by description"); + + if (db_num_rows($result) > 0) { + if (get_pref($link, 'ENABLE_FEED_CATS')) { + print "
    • Labels
    • "; + print "
      • "; + } else { + print "

      • "; + } + } + + while ($line = db_fetch_assoc($result)) { + + error_reporting (0); + + $label_id = -$line['id'] - 11; + $count = getFeedUnread($link, $label_id); + + $class = "label"; + + if ($count > 0) { + $class .= "Unread"; + } + + error_reporting (DEFAULT_ERROR_LEVEL); + + printFeedEntry($label_id, + $class, db_unescape_string($line["description"]), + $count, "images/label.png", $link); + + } + + if (db_num_rows($result) > 0) { + if (get_pref($link, 'ENABLE_FEED_CATS')) { + print "
      "; + } + } + + } + + if (!get_pref($link, 'ENABLE_FEED_CATS')) { + print "

    • "; + } + + if (get_pref($link, 'ENABLE_FEED_CATS')) { + if (get_pref($link, "FEEDS_SORT_BY_UNREAD")) { + $order_by_qpart = "category,unread DESC,title"; + } else { + $order_by_qpart = "category,title"; + } + } else { + if (get_pref($link, "FEEDS_SORT_BY_UNREAD")) { + $order_by_qpart = "unread DESC,title"; + } else { + $order_by_qpart = "title"; + } + } + + $result = db_query($link, "SELECT ttrss_feeds.*, + SUBSTRING(last_updated,1,19) AS last_updated_noms, + (SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries + WHERE feed_id = ttrss_feeds.id AND unread = true + AND ttrss_user_entries.ref_id = ttrss_entries.id + AND owner_uid = '$owner_uid') as unread, + cat_id,last_error, + ttrss_feed_categories.title AS category, + ttrss_feed_categories.collapsed + FROM ttrss_feeds LEFT JOIN ttrss_feed_categories + ON (ttrss_feed_categories.id = cat_id) + WHERE + ttrss_feeds.hidden = false AND + ttrss_feeds.owner_uid = '$owner_uid' AND parent_feed IS NULL + ORDER BY $order_by_qpart"); + + $actid = $_GET["actid"]; + + /* real feeds */ + + $lnum = 0; + + $total_unread = 0; + + $category = ""; + + $short_date = get_pref($link, 'SHORT_DATE_FORMAT'); + + while ($line = db_fetch_assoc($result)) { + + $feed = db_unescape_string($line["title"]); + $feed_id = $line["id"]; + + $subop = $_GET["subop"]; + + $unread = $line["unread"]; + + if (get_pref($link, 'HEADLINES_SMART_DATE')) { + $last_updated = smart_date_time(strtotime($line["last_updated_noms"])); + } else { + $last_updated = date($short_date, strtotime($line["last_updated_noms"])); + } + + $rtl_content = sql_bool_to_bool($line["rtl_content"]); + + if ($rtl_content) { + $rtl_tag = "dir=\"RTL\""; + } else { + $rtl_tag = ""; + } + + $tmp_result = db_query($link, + "SELECT id,COUNT(unread) AS unread + FROM ttrss_feeds LEFT JOIN ttrss_user_entries + ON (ttrss_feeds.id = ttrss_user_entries.feed_id) + WHERE parent_feed = '$feed_id' AND unread = true + GROUP BY ttrss_feeds.id"); + + if (db_num_rows($tmp_result) > 0) { + while ($l = db_fetch_assoc($tmp_result)) { + $unread += $l["unread"]; + } + } + + $cat_id = $line["cat_id"]; + + $tmp_category = $line["category"]; + + if (!$tmp_category) { + $tmp_category = "Uncategorized"; + } + + // $class = ($lnum % 2) ? "even" : "odd"; + + if ($line["last_error"]) { + $class = "error"; + } else { + $class = "feed"; + } + + if ($unread > 0) $class .= "Unread"; + + if ($actid == $feed_id) { + $class .= "Selected"; + } + + $total_unread += $unread; + + if ($category != $tmp_category && get_pref($link, 'ENABLE_FEED_CATS')) { + + if ($category) { + print "
  • "; + } + + $category = $tmp_category; + + $collapsed = $line["collapsed"]; + + // workaround for NULL category + if ($category == "Uncategorized") { + if ($_COOKIE["ttrss_vf_uclps"] == 1) { + $collapsed = "t"; + } + } + + if ($collapsed == "t" || $collapsed == "1") { + $holder_class = "invisible"; + $ellipsis = "..."; + } else { + $holder_class = ""; + $ellipsis = ""; + } + + $cat_id = sprintf("%d", $cat_id); + + $cat_unread = getCategoryUnread($link, $cat_id); + + print "
  • + $tmp_category + + ($cat_unread unread)$ellipsis +
  • "; + + // !!! NO SPACE before keyboard navigation, etc. + print "
  • "; + + } + ?>