]> git.wh0rd.org - tt-rss.git/blobdiff - include/functions.php
experimentally rebase labels; make base index configurable
[tt-rss.git] / include / functions.php
index 56bc66b6cc5758c17ebd860a6ef09e09e79e9ce4..e926c03414637a2baa5431ab3c92b9e20e2849a1 100644 (file)
@@ -1,6 +1,8 @@
 <?php
        define('EXPECTED_CONFIG_VERSION', 26);
-       define('SCHEMA_VERSION', 106);
+       define('SCHEMA_VERSION', 108);
+
+       define('LABEL_BASE_INDEX', -1024);
 
        $fetch_last_error = false;
        $pluginhost = false;
@@ -54,7 +56,7 @@
                                        "ja_JP" => "日本語 (Japanese)",
                                        "lv_LV" => "Latviešu",
                                        "nb_NO" => "Norwegian bokmål",
-                                       "nl_NL" => "Dutch", 
+                                       "nl_NL" => "Dutch",
                                        "pl_PL" => "Polski",
                                        "ru_RU" => "Русский",
                                        "pt_BR" => "Portuguese/Brazil",
 
                        $data = @file_get_contents($url);
 
-                       $gzdecoded = gzdecode($data);
+                       @$gzdecoded = gzdecode($data);
                        if ($gzdecoded) $data = $gzdecoded;
 
                        if (!$data && function_exists('error_get_last')) {
                                                        AND $ref_check_qpart AND unread = true
                                                        AND owner_uid = $owner_uid");
 
-                               } else if ($feed < 0 && $feed > -10) { // special, like starred
+                               } else if ($feed < 0 && $feed > LABEL_BASE_INDEX) { // special, like starred
 
                                        if ($feed == -1) {
                                                db_query($link, "UPDATE ttrss_user_entries
                                                        owner_uid = $owner_uid");
                                        }
 
-                               } else if ($feed < -10) { // label
+                               } else if ($feed < LABEL_BASE_INDEX) { // label
 
-                                       $label_id = -$feed - 11;
+                                       $label_id = feed_to_label_id($feed);
 
                                        db_query($link, "UPDATE ttrss_user_entries, ttrss_user_labels2
                                                SET unread = false, last_read = NOW()
                                $match_part = "feed_id IS NULL";
                        }
 
-               } else if ($feed < -10) {
+               } else if ($feed < LABEL_BASE_INDEX) {
 
-                       $label_id = -$feed - 11;
+                       $label_id = feed_to_label_id($feed);
 
                        return getLabelUnread($link, $label_id, $owner_uid);
 
 
                while ($line = db_fetch_assoc($result)) {
 
-                       $id = -$line["id"] - 11;
+                       $id = label_to_feed_id($line["id"]);
 
                        $label_name = $line["caption"];
                        $count = $line["unread"];
         *                 5 - Couldn't download the URL content.
         */
        function subscribe_to_feed($link, $url, $cat_id = 0,
-                       $auth_login = '', $auth_pass = '', $need_auth = false) {
+                       $auth_login = '', $auth_pass = '') {
 
                global $fetch_last_error;
 
        function getFeedCatTitle($link, $id) {
                if ($id == -1) {
                        return __("Special");
-               } else if ($id < -10) {
+               } else if ($id < LABEL_BASE_INDEX) {
                        return __("Labels");
                } else if ($id > 0) {
                        $result = db_query($link, "SELECT ttrss_feed_categories.title
                        return "images/recently_read.png";
                        break;
                default:
-                       if ($id < -10) {
+                       if ($id < LABEL_BASE_INDEX) {
                                return "images/label.png";
                        } else {
                                if (file_exists(ICONS_DIR . "/$id.ico"))
                        return __("Archived articles");
                } else if ($id == -6) {
                        return __("Recently read");
-               } else if ($id < -10) {
-                       $label_id = -$id - 11;
+               } else if ($id < LABEL_BASE_INDEX) {
+                       $label_id = feed_to_label_id($id);
                        $result = db_query($link, "SELECT caption FROM ttrss_labels2 WHERE id = '$label_id'");
                        if (db_num_rows($result) == 1) {
                                return db_fetch_result($result, 0, "caption");
                $data['cdm_expanded'] = get_pref($link, 'CDM_EXPANDED');
 
                $data['dep_ts'] = calculate_dep_timestamp();
+               $data['reload_on_ts_change'] = !defined('_NO_RELOAD_ON_TS_CHANGE');
 
                if (file_exists(LOCK_DIRECTORY . "/update_daemon.lock")) {
 
                                if ($search) {
                                        $view_query_part = " ";
                                } else if ($feed != -1) {
+
                                        $unread = getFeedUnread($link, $feed, $cat_view);
 
                                        if ($cat_view && $feed > 0 && $include_children)
                                                $unread += getCategoryChildrenUnread($link, $feed);
 
-                                       if ($unread > 0) {
-                                               $view_query_part = " unread = true AND ";
-                                       }
+                                       if ($unread > 0)
+                               $view_query_part = " unread = true AND ";
+
                                }
                        }
 
                                $view_query_part = " published = true AND ";
                        }
 
-                       if ($view_mode == "unread") {
+                       if ($view_mode == "unread" && $feed != -6) {
                                $view_query_part = " unread = true AND ";
                        }
 
                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                $allow_archived = true;
 
-                               if (!$override_order) $override_order = "last_marked DESC, updated DESC";
+                               if (!$override_order) {
+                                       if (get_pref($link, 'REVERSE_HEADLINES', $owner_uid)) {
+                                               $override_order = "date_entered";
+                                       } else {
+                                               $override_order = "last_marked DESC, date_entered DESC";
+                                       }
+                               }
 
                        } else if ($feed == -2) { // published virtual feed OR labels category
 
                                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                        $allow_archived = true;
 
-                                       if (!$override_order) $override_order = "last_published DESC, updated DESC";
+                                       if (!$override_order) {
+                                               if (get_pref($link, 'REVERSE_HEADLINES', $owner_uid)) {
+                                                       $override_order = "date_entered";
+                                               } else {
+                                                       $override_order = "last_published DESC, date_entered DESC";
+                                               }
+                                       }
+
                                } else {
                                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
 
                        } else if ($feed == -4) { // all articles virtual feed
                                $query_strategy_part = "true";
                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
-                       } else if ($feed <= -10) { // labels
-                               $label_id = -$feed - 11;
+                       } else if ($feed <= LABEL_BASE_INDEX) { // labels
+                               $label_id = feed_to_label_id($feed);
 
                                $query_strategy_part = "label_id = '$label_id' AND
                                        ttrss_labels2.id = ttrss_user_labels2.label_id AND
                                $order_by = "score DESC, $order_by";
                        }
 
+                       if ($view_mode == "unread_first") {
+                               $order_by = "unread DESC, $order_by";
+                       }
+
                        if ($override_order) {
                                $order_by = $override_order;
                        }
                $entries = $doc->getElementsByTagName("*");
 
                $allowed_elements = array('a', 'address', 'audio', 'article',
-                       'b', 'big', 'blockquote', 'body', 'br', 'cite',
+                       'b', 'big', 'blockquote', 'body', 'br', 'cite', 'center',
                        'code', 'dd', 'del', 'details', 'div', 'dl', 'font',
                        'dt', 'em', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
                        'header', 'html', 'i', 'img', 'ins', 'kbd',
                        }
 
                        if ($entry->hasAttributes()) {
-                               foreach (iterator_to_array($entry->attributes) as $attr) {
+                               $attrs_to_remove = array();
+
+                               foreach ($entry->attributes as $attr) {
 
                                        if (strpos($attr->nodeName, 'on') === 0) {
-                                               $entry->removeAttributeNode($attr);
+                                               array_push($attrs_to_remove, $attr);
                                        }
 
                                        if (in_array($attr->nodeName, $disallowed_attributes)) {
-                                               $entry->removeAttributeNode($attr);
+                                               array_push($attrs_to_remove, $attr);
                                        }
                                }
+
+                               foreach ($attrs_to_remove as $attr) {
+                                       $entry->removeAttributeNode($attr);
+                               }
                        }
                }
 
                                                <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
                                                <title>Tiny Tiny RSS - ".$line["title"]."</title>
                                                <link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss.css\">
-                                       </head><body>";
+                                       </head><body id=\"ttrssZoom\">";
                        }
 
                        $rv['content'] .= "<div class=\"postReply\" id=\"POST-$id\">";
 
                if ($zoom_mode) {
                        $rv['content'] .= "
-                               <div style=\"text-align : center\">
+                               <div class='footer'>
                                <button onclick=\"return window.close()\">".
                                        __("Close this window")."</button></div>";
                        $rv['content'] .= "</body></html>";
                        $filter_id = $line["id"];
 
                        $result2 = db_query($link, "SELECT
-                               r.reg_exp, r.feed_id, r.cat_id, r.cat_filter, t.name AS type_name
+                               r.reg_exp, r.inverse, r.feed_id, r.cat_id, r.cat_filter, t.name AS type_name
                                FROM ttrss_filters2_rules AS r,
                                ttrss_filter_types AS t
                                WHERE
                                $rule = array();
                                $rule["reg_exp"] = $rule_line["reg_exp"];
                                $rule["type"] = $rule_line["type_name"];
+                               $rule["inverse"] = sql_bool_to_bool($rule_line["inverse"]);
 
                                array_push($rules, $rule);
                        }
 
                        $filter = array();
                        $filter["match_any_rule"] = sql_bool_to_bool($line["match_any_rule"]);
+                       $filter["inverse"] = sql_bool_to_bool($line["inverse"]);
                        $filter["rules"] = $rules;
                        $filter["actions"] = $actions;
 
 
                                $rule['reg_exp'] = db_escape_string($link, $rule['reg_exp']);
 
-                               switch ($rule["type"]) {
+                                       switch ($rule["type"]) {
                                        case "title":
                                                $qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
                                                        $rule['reg_exp'] . "')";
                                                break;
                                }
 
+                               if (isset($rule['inverse'])) $qpart = "NOT ($qpart)";
+
                                if (isset($rule["feed_id"]) && $rule["feed_id"] > 0) {
                                        $qpart .= " AND feed_id = " . db_escape_string($link, $rule["feed_id"]);
                                }
                }
 
                if (count($query) > 0) {
-                       return "(" . join($filter["match_any_rule"] ? "OR" : "AND", $query) . ")";
+                       $fullquery = "(" . join($filter["match_any_rule"] ? "OR" : "AND", $query) . ")";
                } else {
-                       return "(false)";
+                       $fullquery = "(false)";
                }
+
+               if ($filter['inverse']) $fullquery = "(NOT $fullquery)";
+
+               return $fullquery;
        }
 
        if (!function_exists('gzdecode')) {
                return $max_ts;
        }
 
-    function get_site_title() {
-        if (defined("_SITE_TITLE")) {
-            return _SITE_TITLE;
-        } else {
-               return "Tiny Tiny RSS";
-                 }
-    }
+       function T_js_decl($s1, $s2) {
+               if ($s1 && $s2) {
+                       $s1 = preg_replace("/\n/", "", $s1);
+                       $s2 = preg_replace("/\n/", "", $s2);
+
+                       $s1 = preg_replace("/\"/", "\\\"", $s1);
+                       $s2 = preg_replace("/\"/", "\\\"", $s2);
+
+                       return "T_messages[\"$s1\"] = \"$s2\";\n";
+               }
+       }
+
+       function init_js_translations() {
+
+       print 'var T_messages = new Object();
+
+               function __(msg) {
+                       if (T_messages[msg]) {
+                               return T_messages[msg];
+                       } else {
+                               return msg;
+                       }
+               }
+
+               function ngettext(msg1, msg2, n) {
+                       return (parseInt(n) > 1) ? msg2 : msg1;
+               }';
+
+               $l10n = _get_reader();
+
+               for ($i = 0; $i < $l10n->total; $i++) {
+                       $orig = $l10n->get_original_string($i);
+                       $translation = __($orig);
+
+                       print T_js_decl($orig, $translation);
+               }
+       }
+
+       function label_to_feed_id($label) {
+               return LABEL_BASE_INDEX - 1 - abs($label);
+       }
+
+       function feed_to_label_id($feed) {
+               return LABEL_BASE_INDEX - 1 + abs($feed);
+       }
+
 ?>