Commit 7e2f4fbd authored by Sebastian Reichel's avatar Sebastian Reichel

Imported Upstream version 1.8+dfsg

parent d475e8fd
......@@ -2,6 +2,7 @@
*~
*.DS_Store
#*
lib/floIcon.php
.idea/*
config.php
feed-icons/*
......
......@@ -9,7 +9,7 @@
<html>
<head>
<title><xsl:value-of select="atom:title"/></title>
<link rel="stylesheet" type="text/css" href="utility.css"/>
<link rel="stylesheet" type="text/css" href="css/utility.css"/>
<script language="javascript" src="lib/xsl_mop-up.js"></script>
</head>
......
......@@ -2,7 +2,7 @@
class API extends Handler {
const API_LEVEL = 6;
const API_LEVEL = 7;
const STATUS_OK = 0;
const STATUS_ERR = 1;
......@@ -197,7 +197,8 @@ class API extends Handler {
$include_attachments = sql_bool_to_bool($_REQUEST["include_attachments"]);
$since_id = (int)$this->dbh->escape_string($_REQUEST["since_id"]);
$include_nested = sql_bool_to_bool($_REQUEST["include_nested"]);
$sanitize_content = true;
$sanitize_content = !isset($_REQUEST["sanitize"]) ||
sql_bool_to_bool($_REQUEST["sanitize"]);
$override_order = false;
switch ($_REQUEST["order_by"]) {
......@@ -306,54 +307,58 @@ class API extends Handler {
$article_id = join(",", array_filter(explode(",", $this->dbh->escape_string($_REQUEST["article_id"])), is_numeric));
$query = "SELECT id,title,link,content,cached_content,feed_id,comments,int_id,
marked,unread,published,score,
".SUBSTRING_FOR_DATE."(updated,1,16) as updated,
author,(SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title
FROM ttrss_entries,ttrss_user_entries
WHERE id IN ($article_id) AND ref_id = id AND owner_uid = " .
$_SESSION["uid"] ;
if ($article_id) {
$result = $this->dbh->query($query);
$query = "SELECT id,title,link,content,cached_content,feed_id,comments,int_id,
marked,unread,published,score,
".SUBSTRING_FOR_DATE."(updated,1,16) as updated,
author,(SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title
FROM ttrss_entries,ttrss_user_entries
WHERE id IN ($article_id) AND ref_id = id AND owner_uid = " .
$_SESSION["uid"] ;
$articles = array();
$result = $this->dbh->query($query);
if ($this->dbh->num_rows($result) != 0) {
$articles = array();
while ($line = $this->dbh->fetch_assoc($result)) {
$attachments = get_article_enclosures($line['id']);
$article = array(
"id" => $line["id"],
"title" => $line["title"],
"link" => $line["link"],
"labels" => get_article_labels($line['id']),
"unread" => sql_bool_to_bool($line["unread"]),
"marked" => sql_bool_to_bool($line["marked"]),
"published" => sql_bool_to_bool($line["published"]),
"comments" => $line["comments"],
"author" => $line["author"],
"updated" => (int) strtotime($line["updated"]),
"content" => $line["cached_content"] != "" ? $line["cached_content"] : $line["content"],
"feed_id" => $line["feed_id"],
"attachments" => $attachments,
"score" => (int)$line["score"],
"feed_title" => $line["feed_title"]
);
if ($this->dbh->num_rows($result) != 0) {
foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) {
$article = $p->hook_render_article_api(array("article" => $article));
}
while ($line = $this->dbh->fetch_assoc($result)) {
$attachments = get_article_enclosures($line['id']);
$article = array(
"id" => $line["id"],
"title" => $line["title"],
"link" => $line["link"],
"labels" => get_article_labels($line['id']),
"unread" => sql_bool_to_bool($line["unread"]),
"marked" => sql_bool_to_bool($line["marked"]),
"published" => sql_bool_to_bool($line["published"]),
"comments" => $line["comments"],
"author" => $line["author"],
"updated" => (int) strtotime($line["updated"]),
"content" => $line["cached_content"] != "" ? $line["cached_content"] : $line["content"],
"feed_id" => $line["feed_id"],
"attachments" => $attachments,
"score" => (int)$line["score"],
"feed_title" => $line["feed_title"]
);
foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) {
$article = $p->hook_render_article_api(array("article" => $article));
}
array_push($articles, $article);
}
}
array_push($articles, $article);
$this->wrap(self::STATUS_OK, $articles);
}
}
$this->wrap(self::STATUS_OK, $articles);
} else {
$this->wrap(self::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
function getConfig() {
......
......@@ -44,7 +44,7 @@ class Article extends Handler_Protected {
} else if ($mode == "raw") {
if ($_REQUEST['html']) {
header("Content-Type: text/html");
print '<link rel="stylesheet" type="text/css" href="tt-rss.css"/>';
print '<link rel="stylesheet" type="text/css" href="css/tt-rss.css"/>';
}
$article = format_article($id, false);
......
......@@ -13,7 +13,7 @@ class Db_Mysqli implements IDb {
return $this->link;
} else {
die("Unable to connect to database (as $user to $host, database $db): " . mysqli_error());
die("Unable to connect to database (as $user to $host, database $db): " . mysqli_connect_error());
}
}
......
......@@ -105,7 +105,7 @@ class Db_Prefs {
return $this->convert($value, $type_name);
} else {
user_error("Fatal error, unknown preferences key: $pref_name", $die_on_error ? E_USER_ERROR : E_USER_WARNING);
user_error("Fatal error, unknown preferences key: $pref_name (owner: $user_id)", $die_on_error ? E_USER_ERROR : E_USER_WARNING);
return null;
}
}
......
......@@ -16,14 +16,29 @@ class FeedItem_Atom extends FeedItem_Common {
if ($updated) {
return strtotime($updated->nodeValue);
}
$published = $this->elem->getElementsByTagName("published")->item(0);
if ($published) {
return strtotime($published->nodeValue);
}
$date = $this->xpath->query("dc:date", $this->elem)->item(0);
if ($date) {
return strtotime($date->nodeValue);
}
}
function get_link() {
$links = $this->elem->getElementsByTagName("link");
foreach ($links as $link) {
if ($link && $link->hasAttribute("href") && (!$link->hasAttribute("rel")
|| $link->getAttribute("rel") == "alternate")) {
if ($link && $link->hasAttribute("href") &&
(!$link->hasAttribute("rel")
|| $link->getAttribute("rel") == "alternate"
|| $link->getAttribute("rel") == "standout")) {
return $link->getAttribute("href");
}
}
......@@ -41,16 +56,29 @@ class FeedItem_Atom extends FeedItem_Common {
$content = $this->elem->getElementsByTagName("content")->item(0);
if ($content) {
if ($content->hasAttribute('type')) {
if ($content->getAttribute('type') == 'xhtml') {
return $this->doc->saveXML($content->firstChild->nextSibling);
}
}
return $content->nodeValue;
}
}
function get_description() {
$summary = $this->elem->getElementsByTagName("summary")->item(0);
$content = $this->elem->getElementsByTagName("summary")->item(0);
if ($content) {
if ($content->hasAttribute('type')) {
if ($content->getAttribute('type') == 'xhtml') {
return $this->doc->saveXML($content->firstChild->nextSibling);
}
}
if ($summary) {
return $summary->nodeValue;
return $content->nodeValue;
}
}
function get_categories() {
......
......@@ -16,9 +16,33 @@ class FeedItem_RSS extends FeedItem_Common {
if ($pubDate) {
return strtotime($pubDate->nodeValue);
}
$date = $this->xpath->query("dc:date", $this->elem)->item(0);
if ($date) {
return strtotime($date->nodeValue);
}
}
function get_link() {
$links = $this->xpath->query("atom:link", $this->elem);
foreach ($links as $link) {
if ($link && $link->hasAttribute("href") &&
(!$link->hasAttribute("rel")
|| $link->getAttribute("rel") == "alternate"
|| $link->getAttribute("rel") == "standout")) {
return $link->getAttribute("href");
}
}
$link = $this->elem->getElementsByTagName("guid")->item(0);
if ($link && $link->hasAttributes() && $link->getAttribute("isPermaLink") == "true") {
return $link->nodeValue;
}
$link = $this->elem->getElementsByTagName("link")->item(0);
if ($link) {
......
......@@ -17,7 +17,22 @@ class FeedParser {
libxml_clear_errors();
$this->doc = new DOMDocument();
$this->doc->loadXML($data);
$this->error = $this->format_error(libxml_get_last_error());
$error = libxml_get_last_error();
if ($error && $error->code == 9) {
libxml_clear_errors();
// we might want to try guessing input encoding here too
$data = iconv("UTF-8", "UTF-8//IGNORE", $data);
$this->doc = new DOMDocument();
$this->doc->loadXML($data);
$error = libxml_get_last_error();
}
$this->error = $this->format_error($error);
libxml_clear_errors();
$this->items = array();
......@@ -27,6 +42,7 @@ class FeedParser {
$root = $this->doc->firstChild;
$xpath = new DOMXPath($this->doc);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
$xpath->registerNamespace('atom03', 'http://purl.org/atom/ns#');
$xpath->registerNamespace('media', 'http://search.yahoo.com/mrss/');
$xpath->registerNamespace('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
......@@ -35,7 +51,7 @@ class FeedParser {
$this->xpath = $xpath;
$root = $xpath->query("(//atom:feed|//channel|//rdf:rdf|//rdf:RDF)")->item(0);
$root = $xpath->query("(//atom03:feed|//atom:feed|//channel|//rdf:rdf|//rdf:RDF)")->item(0);
if ($root) {
switch (mb_strtolower($root->tagName)) {
......@@ -49,7 +65,9 @@ class FeedParser {
$this->type = $this::FEED_ATOM;
break;
default:
$this->error = "Unknown/unsupported feed type";
if( !isset($this->error) ){
$this->error = "Unknown/unsupported feed type";
}
return;
}
......@@ -58,25 +76,35 @@ class FeedParser {
$title = $xpath->query("//atom:feed/atom:title")->item(0);
if (!$title)
$title = $xpath->query("//atom03:feed/atom03:title")->item(0);
if ($title) {
$this->title = $title->nodeValue;
}
$link = $xpath->query("//atom:feed/atom:link[not(@rel)]")->item(0);
if (!$link)
$link = $xpath->query("//atom03:feed/atom03:link[not(@rel)]")->item(0);
if ($link && $link->hasAttributes()) {
$this->link = $link->getAttribute("href");
}
$articles = $xpath->query("//atom:entry");
if (!$articles || $articles->length == 0)
$articles = $xpath->query("//atom03:entry");
foreach ($articles as $article) {
array_push($this->items, new FeedItem_Atom($article, $this->doc, $this->xpath));
}
break;
case $this::FEED_RSS:
$title = $xpath->query("//channel/title")->item(0);
if ($title) {
......@@ -85,8 +113,11 @@ class FeedParser {
$link = $xpath->query("//channel/link")->item(0);
if ($link && $link->hasAttributes()) {
$this->link = $link->getAttribute("href");
if ($link) {
if ($link->getAttribute("href"))
$this->link = $link->getAttribute("href");
else if ($link->nodeValue)
$this->link = $link->nodeValue;
}
$articles = $xpath->query("//channel/item");
......@@ -121,7 +152,9 @@ class FeedParser {
}
} else {
$this->error = "Unknown/unsupported feed type";
if( !isset($this->error) ){
$this->error = "Unknown/unsupported feed type";
}
return;
}
}
......@@ -166,7 +199,8 @@ class FeedParser {
}
break;
case $this::FEED_RSS:
$links = $this->xpath->query("//channel/link");
$links = $this->xpath->query("//atom:link");
foreach ($links as $link) {
if (!$rel || $link->hasAttribute('rel') && $link->getAttribute('rel') == $rel) {
array_push($rv, $link->getAttribute('href'));
......
......@@ -561,7 +561,7 @@ class Feeds extends Handler_Protected {
target=\"_blank\" href=\"".
htmlspecialchars($line["link"])."\">".
$line["title"] .
" <span class=\"author\">$entry_author</span></a>";
"</a> <span class=\"author\">$entry_author</span>";
$reply['content'] .= $labels_str;
......@@ -593,7 +593,7 @@ class Feeds extends Handler_Protected {
$reply['content'] .= "<span class='updated' title='$date_entered_fmt'>
$updated_fmt</span>";
$reply['content'] .= "<div style=\"vertical-align : middle\">";
$reply['content'] .= "<div class='scoreWrap' style=\"vertical-align : middle\">";
$reply['content'] .= "$score_pic";
if (!get_pref("VFEED_GROUP_BY_FEED") && $line["feed_title"]) {
......
......@@ -3,7 +3,7 @@ class Handler_Public extends Handler {
private function generate_syndicated_feed($owner_uid, $feed, $is_cat,
$limit, $offset, $search, $search_mode,
$view_mode = false, $format = 'atom') {
$view_mode = false, $format = 'atom', $order = false) {
require_once "lib/MiniTemplator.class.php";
......@@ -21,6 +21,18 @@ class Handler_Public extends Handler {
else if ($feed == -1)
$date_sort_field = "last_marked DESC";
switch ($order) {
case "title":
$date_sort_field = "ttrss_entries.title";
break;
case "date_reverse":
$date_sort_field = "date_entered, updated";
break;
case "feed_dates":
$date_sort_field = "updated DESC";
break;
}
$qfh_ret = queryFeedHeadlines($feed,
1, $view_mode, $is_cat, $search, $search_mode,
$date_sort_field, $offset, $owner_uid,
......@@ -337,6 +349,7 @@ class Handler_Public extends Handler {
$search = $this->dbh->escape_string($_REQUEST["q"]);
$search_mode = $this->dbh->escape_string($_REQUEST["smode"]);
$view_mode = $this->dbh->escape_string($_REQUEST["view-mode"]);
$order = $this->dbh->escape_string($_REQUEST["order"]);
$format = $this->dbh->escape_string($_REQUEST['format']);
......@@ -358,7 +371,7 @@ class Handler_Public extends Handler {
if ($owner_id) {
$this->generate_syndicated_feed($owner_id, $feed, $is_cat, $limit,
$offset, $search, $search_mode, $view_mode, $format);
$offset, $search, $search_mode, $view_mode, $format, $order);
} else {
header('HTTP/1.1 403 Forbidden');
}
......@@ -382,7 +395,7 @@ class Handler_Public extends Handler {
header('Content-Type: text/html; charset=utf-8');
print "<html><head><title>Tiny Tiny RSS</title>";
stylesheet_tag("utility.css");
stylesheet_tag("css/utility.css");
javascript_tag("lib/prototype.js");
javascript_tag("lib/scriptaculous/scriptaculous.js?load=effects,dragdrop,controls");
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
......@@ -553,7 +566,7 @@ class Handler_Public extends Handler {
print "<html>
<head>
<title>Tiny Tiny RSS</title>
<link rel=\"stylesheet\" type=\"text/css\" href=\"utility.css\">
<link rel=\"stylesheet\" type=\"text/css\" href=\"css/utility.css\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
</head>
<body>
......@@ -732,10 +745,12 @@ class Handler_Public extends Handler {
}
function forgotpass() {
startup_gettext();
header('Content-Type: text/html; charset=utf-8');
print "<html><head><title>Tiny Tiny RSS</title>";
stylesheet_tag("utility.css");
stylesheet_tag("css/utility.css");
javascript_tag("lib/prototype.js");
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
......@@ -825,6 +840,8 @@ class Handler_Public extends Handler {
}
function dbupdate() {
startup_gettext();
if (!SINGLE_USER_MODE && $_SESSION["access_level"] < 10) {
$_SESSION["login_error_msg"] = __("Your access level is insufficient to run this script.");
render_login_form();
......@@ -835,7 +852,7 @@ class Handler_Public extends Handler {
<head>
<title>Database Updater</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="utility.css"/>
<link rel="stylesheet" type="text/css" href="css/utility.css"/>
</head>
<style type="text/css">
span.ok { color : #009000; font-weight : bold; }
......
......@@ -24,7 +24,7 @@ class Opml extends Handler_Protected {
print "<html>
<head>
<link rel=\"stylesheet\" href=\"utility.css\" type=\"text/css\">
<link rel=\"stylesheet\" href=\"css/utility.css\" type=\"text/css\">
<title>".__("OPML Utility")."</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
</head>
......@@ -165,7 +165,7 @@ class Opml extends Handler_Protected {
WHERE owner_uid = ".$_SESSION["uid"]." ORDER BY id");
while ($line = $this->dbh->fetch_assoc($result)) {
foreach (array('enabled', 'match_any_rule') as $b) {
foreach (array('enabled', 'match_any_rule', 'inverse') as $b) {
$line[$b] = sql_bool_to_bool($line[$b]);
}
......@@ -325,11 +325,14 @@ class Opml extends Handler_Protected {
if ($filter) {
$match_any_rule = bool_to_sql_bool($filter["match_any_rule"]);
$enabled = bool_to_sql_bool($filter["enabled"]);
$inverse = bool_to_sql_bool($filter["inverse"]);
$title = db_escape_string($filter["title"]);
$this->dbh->query("BEGIN");
$this->dbh->query("INSERT INTO ttrss_filters2 (match_any_rule,enabled,owner_uid)
VALUES ($match_any_rule, $enabled,".$_SESSION["uid"].")");
$this->dbh->query("INSERT INTO ttrss_filters2 (match_any_rule,enabled,inverse,title,owner_uid)
VALUES ($match_any_rule, $enabled, $inverse, '$title',
".$_SESSION["uid"].")");
$result = $this->dbh->query("SELECT MAX(id) AS id FROM ttrss_filters2 WHERE
owner_uid = ".$_SESSION["uid"]);
......
......@@ -36,6 +36,7 @@ class PluginHost {
const HOOK_ARTICLE_LEFT_BUTTON = 19;
const HOOK_PREFS_EDIT_FEED = 20;
const HOOK_PREFS_SAVE_FEED = 21;
const HOOK_FETCH_FEED = 22;
const KIND_ALL = 1;
const KIND_SYSTEM = 2;
......@@ -273,7 +274,8 @@ class PluginHost {
if (!isset($this->storage[$plugin]))
$this->storage[$plugin] = array();
$content = $this->dbh->escape_string(serialize($this->storage[$plugin]));
$content = $this->dbh->escape_string(serialize($this->storage[$plugin]),
false);
if ($this->dbh->num_rows($result) != 0) {
$this->dbh->query("UPDATE ttrss_plugin_storage SET content = '$content'
......
......@@ -54,12 +54,14 @@ class Pref_Feeds extends Handler_Protected {
$cat['type'] = 'category';
$cat['unread'] = 0;
$cat['child_unread'] = 0;
$cat['auxcounter'] = 0;
$cat['items'] = $this->get_category_items($line['id']);
$cat['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', count($cat['items'])), count($cat['items']));
$num_children = $this->calculate_children_count($cat);
$cat['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', $num_children), $num_children);
if (count($cat['items']) > 0 || $show_empty_cats)
if ($num_children > 0 || $show_empty_cats)
array_push($items, $cat);
}
......@@ -74,6 +76,7 @@ class Pref_Feeds extends Handler_Protected {
$feed = array();
$feed['id'] = 'FEED:' . $feed_line['id'];
$feed['bare_id'] = (int)$feed_line['id'];
$feed['auxcounter'] = 0;
$feed['name'] = $feed_line['title'];
$feed['checkbox'] = false;
$feed['unread'] = 0;
......@@ -132,6 +135,7 @@ class Pref_Feeds extends Handler_Protected {
$item = array();
$item['id'] = 'FEED:' . $feed_id;
$item['bare_id'] = (int)$feed_id;
$item['auxcounter'] = 0;
$item['name'] = $feed['title'];
$item['checkbox'] = false;
$item['error'] = '';
......@@ -193,6 +197,7 @@ class Pref_Feeds extends Handler_Protected {
$cat = array();
$cat['id'] = 'CAT:' . $line['id'];
$cat['bare_id'] = (int)$line['id'];
$cat['auxcounter'] = 0;
$cat['name'] = $line['title'];
$cat['items'] = array();
$cat['checkbox'] = false;
......@@ -202,9 +207,10 @@ class Pref_Feeds extends Handler_Protected {
$cat['items'] = $this->get_category_items($line['id']);
$cat['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', count($cat['items'])), count($cat['items']));
$num_children = $this->calculate_children_count($cat);
$cat['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', $num_children), $num_children);
if (count($cat['items']) > 0 || $show_empty_cats)
if ($num_children > 0 || $show_empty_cats)
array_push($root['items'], $cat);
$root['param'] += count($cat['items']);
......@@ -215,6 +221,7 @@ class Pref_Feeds extends Handler_Protected {
$cat = array();
$cat['id'] = 'CAT:0';
$cat['bare_id'] = 0;
$cat['auxcounter'] = 0;
$cat['name'] = __("Uncategorized");
$cat['items'] = array();
$cat['type'] = 'category';
......@@ -232,6 +239,7 @@ class Pref_Feeds extends Handler_Protected {
$feed = array();
$feed['id'] = 'FEED:' . $feed_line['id'];
$feed['bare_id'] = (int)$feed_line['id'];
$feed['auxcounter'] = 0;
$feed['name'] = $feed_line['title'];
$feed['checkbox'] = false;
$feed['error'] = $feed_line['last_error'];
......@@ -249,8 +257,8 @@ class Pref_Feeds extends Handler_Protected {
if (count($cat['items']) > 0 || $show_empty_cats)
array_push($root['items'], $cat);
$root['param'] += count($cat['items']);
$root['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', count($cat['items'])), count($cat['items']));
$num_children = $this->calculate_children_count($root);
$root['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', $num_children), $num_children);
} else {
$feed_result = $this->dbh->query("SELECT id, title, last_error,
......@@ -263,6 +271,7 @@ class Pref_Feeds extends Handler_Protected {
$feed = array();
$feed['id'] = 'FEED:' . $feed_line['id'];
$feed['bare_id'] = (int)$feed_line['id'];
$feed['auxcounter'] = 0;
$feed['name'] = $feed_line['title'];
$feed['checkbox'] = false;
$feed['error'] = $feed_line['last_error'];
......@@ -1541,6 +1550,7 @@ class Pref_Feeds extends Handler_Protected {
$obj['updated'] = $updated;
$obj['icon'] = getFeedIcon($feed_id);
$obj['bare_id'] = $feed_id;
$obj['auxcounter'] = 0;
return $obj;
}
......@@ -1929,6 +1939,19 @@ class Pref_Feeds extends Handler_Protected {
owner_uid = " . $_SESSION["uid"]);
}
private function calculate_children_count($cat) {
$c = 0;
foreach ($cat['items'] as $child) {
if ($child['type'] == 'category') {
$c += $this->calculate_children_count($child);
} else {
$c += 1;
}
}
return $c;
}
}
?>
......@@ -40,7 +40,7 @@ class Pref_Prefs extends Handler_Protected {
"FRESH_ARTICLE_MAX_AGE" => array(__("Maximum age of fresh articles (in hours)"), ""),
"HIDE_READ_FEEDS" => array(__("Hide feeds with no unread articles"), ""),
"HIDE_READ_SHOWS_SPECIAL" => array(__("Show special feeds when hiding read feeds"), ""),
"LONG_DATE_FORMAT" => array(__("Long date format"), ""),
"LONG_DATE_FORMAT" => array(__("Long date format"), __("The syntax used is identical to the PHP <a href='http://php.net/manual/function.date.php'>date()</a> function.")),
"ON_CATCHUP_SHOW_NEXT_FEED" => array(__("On catchup show next feed"), __("Automatically open next feed with unread articles after marking one as read")),
"PURGE_OLD_DAYS" => array(__("Purge articles after this number of days (0 - disables)"), ""),
"PURGE_UNREAD_ARTICLES" => array(__("Purge unread articles"), ""),
......@@ -962,7 +962,7 @@ class Pref_Prefs extends Handler_Protected {
$value = str_replace("<br/>", "\n", $value);
print_notice(T_sprintf("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here. <a target=\"_blank\" class=\"visibleLink\" href=\"%s\">This file</a> can be used as a baseline.", "tt-rss.css"));
print_notice(T_sprintf("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here. <a target=\"_blank\" class=\"visibleLink\" href=\"%s\">This file</a> can be used as a baseline.", "css/tt-rss.css"));
print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"setpref\">";
......
......@@ -12,7 +12,7 @@ class Pref_Users extends Handler_Protected {
}