upgrade to new stable 0.8
15
scripts/upgrade
Normal file → Executable file
|
@ -1,12 +1,17 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Copy files to the right place
|
|
||||||
|
#backup data folder
|
||||||
final_path=/var/www/freshrss
|
final_path=/var/www/freshrss
|
||||||
|
sudo cp -a $final_path/data /tmp/freshrss-data.bak
|
||||||
|
#delete old folder
|
||||||
|
sudo rm $final_path
|
||||||
|
# Copy files to the right place
|
||||||
sudo mkdir -p $final_path
|
sudo mkdir -p $final_path
|
||||||
sudo cp -a ../sources/* $final_path
|
sudo cp -a ../sources/* $final_path
|
||||||
|
#remove data folder
|
||||||
# Delete install directive
|
sudo rm -r $final_path/data
|
||||||
sudo rm $final_path/data/do-install.txt
|
#copy back data folder
|
||||||
|
sudo mv /tmp/freshrss-data.bak $final_path/data
|
||||||
# Set permissions to freshrss directory
|
# Set permissions to freshrss directory
|
||||||
sudo chown -R www-data: $final_path
|
sudo chown -R www-data: $final_path
|
||||||
|
|
|
@ -1,6 +1,28 @@
|
||||||
# Journal des modifications
|
# Journal des modifications
|
||||||
|
|
||||||
## 2014-08-xx FreshRSS 0.7.4
|
## 2014-09-26 FreshRSS 0.8.0 / 0.9.0 (beta)
|
||||||
|
|
||||||
|
* UI
|
||||||
|
* New interface for statistics
|
||||||
|
* Fix filter buttons
|
||||||
|
* Number of articles divided by 2 in reading view
|
||||||
|
* Redesign of bigMarkAsRead
|
||||||
|
* Features
|
||||||
|
* New automatic update system
|
||||||
|
* New reset auth system
|
||||||
|
* Security
|
||||||
|
* "Mark as read" requires POST requests for several articles
|
||||||
|
* Test HTTP REFERER in install.php
|
||||||
|
* Configuration
|
||||||
|
* New "Show all articles" / "Show only unread" / "Adjust viewing" option
|
||||||
|
* New notification timeout option
|
||||||
|
* Misc.
|
||||||
|
* Improve coding style + comments
|
||||||
|
* Fix SQLite bug "ON DELETE CASCADE"
|
||||||
|
* Improve performance when importing articles
|
||||||
|
|
||||||
|
|
||||||
|
## 2014-08-24 FreshRSS 0.7.4
|
||||||
|
|
||||||
* UI
|
* UI
|
||||||
* Hide categories/feeds with unread articles when showing only unread articles
|
* Hide categories/feeds with unread articles when showing only unread articles
|
||||||
|
|
|
@ -10,8 +10,8 @@ Il permet de gérer plusieurs utilisateurs, et dispose d’un mode de lecture an
|
||||||
* Site officiel : http://freshrss.org
|
* Site officiel : http://freshrss.org
|
||||||
* Démo : http://demo.freshrss.org/
|
* Démo : http://demo.freshrss.org/
|
||||||
* Développeur : Marien Fressinaud <dev@marienfressinaud.fr>
|
* Développeur : Marien Fressinaud <dev@marienfressinaud.fr>
|
||||||
* Version actuelle : 0.7.4
|
* Version actuelle : 0.8.0
|
||||||
* Date de publication 2014-08-24
|
* Date de publication 2014-09-26
|
||||||
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
|
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
|
||||||
|
|
||||||
![Logo de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
|
![Logo de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
|
||||||
|
|
|
@ -10,8 +10,8 @@ It is a multi-user application with an anonymous reading mode.
|
||||||
* Official website: http://freshrss.org
|
* Official website: http://freshrss.org
|
||||||
* Demo: http://demo.freshrss.org/
|
* Demo: http://demo.freshrss.org/
|
||||||
* Developer: Marien Fressinaud <dev@marienfressinaud.fr>
|
* Developer: Marien Fressinaud <dev@marienfressinaud.fr>
|
||||||
* Current version: 0.7.4
|
* Current version: 0.8.0
|
||||||
* Publication date: 2014-08-24
|
* Publication date: 2014-09-26
|
||||||
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
|
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
|
||||||
|
|
||||||
![FreshRSS logo](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
|
![FreshRSS logo](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
|
||||||
|
|
|
@ -1,11 +1,22 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller to handle every configuration options.
|
||||||
|
*/
|
||||||
class FreshRSS_configure_Controller extends Minz_ActionController {
|
class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
|
/**
|
||||||
|
* This action is called before every other action in that class. It is
|
||||||
|
* the common boiler plate for every action. It is triggered by the
|
||||||
|
* underlying framework.
|
||||||
|
*
|
||||||
|
* @todo see if the category default configuration is needed here or if
|
||||||
|
* we can move it to the categorize action
|
||||||
|
*/
|
||||||
public function firstAction() {
|
public function firstAction() {
|
||||||
if (!$this->view->loginOk) {
|
if (!$this->view->loginOk) {
|
||||||
Minz_Error::error(
|
Minz_Error::error(
|
||||||
403,
|
403,
|
||||||
array('error' => array(Minz_Translate::t('access_denied')))
|
array('error' => array(_t('access_denied')))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +24,18 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
$catDAO->checkDefault();
|
$catDAO->checkDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the category configuration page
|
||||||
|
*
|
||||||
|
* It displays the category configuration page.
|
||||||
|
* If this action is reached through a POST request, it loops through
|
||||||
|
* every category to check for modification then add a new category if
|
||||||
|
* needed then sends a notification to the user.
|
||||||
|
* If a category name is emptied, the category is deleted and all
|
||||||
|
* related feeds are moved to the default category. Related user queries
|
||||||
|
* are deleted too.
|
||||||
|
* If a category name is changed, it is updated.
|
||||||
|
*/
|
||||||
public function categorizeAction() {
|
public function categorizeAction() {
|
||||||
$feedDAO = FreshRSS_Factory::createFeedDao();
|
$feedDAO = FreshRSS_Factory::createFeedDao();
|
||||||
$catDAO = new FreshRSS_CategoryDAO();
|
$catDAO = new FreshRSS_CategoryDAO();
|
||||||
|
@ -34,6 +57,10 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
} elseif ($ids[$key] != $defaultId) {
|
} elseif ($ids[$key] != $defaultId) {
|
||||||
$feedDAO->changeCategory($ids[$key], $defaultId);
|
$feedDAO->changeCategory($ids[$key], $defaultId);
|
||||||
$catDAO->deleteCategory($ids[$key]);
|
$catDAO->deleteCategory($ids[$key]);
|
||||||
|
|
||||||
|
// Remove related queries.
|
||||||
|
$this->view->conf->remove_query_by_get('c_' . $ids[$key]);
|
||||||
|
$this->view->conf->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,22 +77,37 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
}
|
}
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('categories_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'categorize'));
|
||||||
'content' => Minz_Translate::t('categories_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'categorize'), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->view->categories = $catDAO->listCategories(false);
|
$this->view->categories = $catDAO->listCategories(false);
|
||||||
$this->view->defaultCategory = $catDAO->getDefault();
|
$this->view->defaultCategory = $catDAO->getDefault();
|
||||||
$this->view->feeds = $feedDAO->listFeeds();
|
$this->view->feeds = $feedDAO->listFeeds();
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('categories_management') . ' · ');
|
Minz_View::prependTitle(_t('categories_management') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the feed configuration page.
|
||||||
|
*
|
||||||
|
* It displays the feed configuration page.
|
||||||
|
* If this action is reached through a POST request, it stores all new
|
||||||
|
* configuraiton values then sends a notification to the user.
|
||||||
|
*
|
||||||
|
* The options available on the page are:
|
||||||
|
* - name
|
||||||
|
* - description
|
||||||
|
* - website URL
|
||||||
|
* - feed URL
|
||||||
|
* - category id (default: default category id)
|
||||||
|
* - CSS path to article on website
|
||||||
|
* - display in main stream (default: 0)
|
||||||
|
* - HTTP authentication
|
||||||
|
* - number of article to retain (default: -2)
|
||||||
|
* - refresh frequency (default: -2)
|
||||||
|
* Default values are empty strings unless specified.
|
||||||
|
*/
|
||||||
public function feedAction() {
|
public function feedAction() {
|
||||||
$catDAO = new FreshRSS_CategoryDAO();
|
$catDAO = new FreshRSS_CategoryDAO();
|
||||||
$this->view->categories = $catDAO->listCategories(false);
|
$this->view->categories = $catDAO->listCategories(false);
|
||||||
|
@ -85,7 +127,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
if (!$this->view->flux) {
|
if (!$this->view->flux) {
|
||||||
Minz_Error::error(
|
Minz_Error::error(
|
||||||
404,
|
404,
|
||||||
array('error' => array(Minz_Translate::t('page_not_found')))
|
array('error' => array(_t('page_not_found')))
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if (Minz_Request::isPost() && $this->view->flux) {
|
if (Minz_Request::isPost() && $this->view->flux) {
|
||||||
|
@ -117,12 +159,12 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
$this->view->flux->faviconPrepare();
|
$this->view->flux->faviconPrepare();
|
||||||
$notif = array(
|
$notif = array(
|
||||||
'type' => 'good',
|
'type' => 'good',
|
||||||
'content' => Minz_Translate::t('feed_updated')
|
'content' => _t('feed_updated')
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$notif = array(
|
$notif = array(
|
||||||
'type' => 'bad',
|
'type' => 'bad',
|
||||||
'content' => Minz_Translate::t('error_occurred_update')
|
'content' => _t('error_occurred_update')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
@ -131,21 +173,41 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'feed', 'params' => array('id' => $id)), true);
|
Minz_Request::forward(array('c' => 'configure', 'a' => 'feed', 'params' => array('id' => $id)), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('rss_feed_management') . ' — ' . $this->view->flux->name() . ' · ');
|
Minz_View::prependTitle(_t('rss_feed_management') . ' — ' . $this->view->flux->name() . ' · ');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Minz_View::prependTitle(Minz_Translate::t('rss_feed_management') . ' · ');
|
Minz_View::prependTitle(_t('rss_feed_management') . ' · ');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the display configuration page.
|
||||||
|
*
|
||||||
|
* It displays the display configuration page.
|
||||||
|
* If this action is reached through a POST request, it stores all new
|
||||||
|
* configuration values then sends a notification to the user.
|
||||||
|
*
|
||||||
|
* The options available on the page are:
|
||||||
|
* - language (default: en)
|
||||||
|
* - theme (default: Origin)
|
||||||
|
* - content width (default: thin)
|
||||||
|
* - display of read action in header
|
||||||
|
* - display of favorite action in header
|
||||||
|
* - display of date in header
|
||||||
|
* - display of open action in header
|
||||||
|
* - display of read action in footer
|
||||||
|
* - display of favorite action in footer
|
||||||
|
* - display of sharing action in footer
|
||||||
|
* - display of tags in footer
|
||||||
|
* - display of date in footer
|
||||||
|
* - display of open action in footer
|
||||||
|
* - html5 notification timeout (default: 0)
|
||||||
|
* Default values are false unless specified.
|
||||||
|
*/
|
||||||
public function displayAction() {
|
public function displayAction() {
|
||||||
if (Minz_Request::isPost()) {
|
if (Minz_Request::isPost()) {
|
||||||
$this->view->conf->_language(Minz_Request::param('language', 'en'));
|
$this->view->conf->_language(Minz_Request::param('language', 'en'));
|
||||||
$themeId = Minz_Request::param('theme', '');
|
$this->view->conf->_theme(Minz_Request::param('theme', FreshRSS_Themes::$defaultTheme));
|
||||||
if ($themeId == '') {
|
|
||||||
$themeId = FreshRSS_Themes::defaultTheme;
|
|
||||||
}
|
|
||||||
$this->view->conf->_theme($themeId);
|
|
||||||
$this->view->conf->_content_width(Minz_Request::param('content_width', 'thin'));
|
$this->view->conf->_content_width(Minz_Request::param('content_width', 'thin'));
|
||||||
$this->view->conf->_topline_read(Minz_Request::param('topline_read', false));
|
$this->view->conf->_topline_read(Minz_Request::param('topline_read', false));
|
||||||
$this->view->conf->_topline_favorite(Minz_Request::param('topline_favorite', false));
|
$this->view->conf->_topline_favorite(Minz_Request::param('topline_favorite', false));
|
||||||
|
@ -157,26 +219,49 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
$this->view->conf->_bottomline_tags(Minz_Request::param('bottomline_tags', false));
|
$this->view->conf->_bottomline_tags(Minz_Request::param('bottomline_tags', false));
|
||||||
$this->view->conf->_bottomline_date(Minz_Request::param('bottomline_date', false));
|
$this->view->conf->_bottomline_date(Minz_Request::param('bottomline_date', false));
|
||||||
$this->view->conf->_bottomline_link(Minz_Request::param('bottomline_link', false));
|
$this->view->conf->_bottomline_link(Minz_Request::param('bottomline_link', false));
|
||||||
|
$this->view->conf->_html5_notif_timeout(Minz_Request::param('html5_notif_timeout', 0));
|
||||||
$this->view->conf->save();
|
$this->view->conf->save();
|
||||||
|
|
||||||
Minz_Session::_param('language', $this->view->conf->language);
|
Minz_Session::_param('language', $this->view->conf->language);
|
||||||
Minz_Translate::reset();
|
Minz_Translate::reset();
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('configuration_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'display'));
|
||||||
'content' => Minz_Translate::t('configuration_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'display'), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->view->themes = FreshRSS_Themes::get();
|
$this->view->themes = FreshRSS_Themes::get();
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('display_configuration') . ' · ');
|
Minz_View::prependTitle(_t('display_configuration') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the reading configuration page.
|
||||||
|
*
|
||||||
|
* It displays the reading configuration page.
|
||||||
|
* If this action is reached through a POST request, it stores all new
|
||||||
|
* configuration values then sends a notification to the user.
|
||||||
|
*
|
||||||
|
* The options available on the page are:
|
||||||
|
* - number of posts per page (default: 10)
|
||||||
|
* - view mode (default: normal)
|
||||||
|
* - default article view (default: all)
|
||||||
|
* - load automatically articles
|
||||||
|
* - display expanded articles
|
||||||
|
* - display expanded categories
|
||||||
|
* - hide categories and feeds without unread articles
|
||||||
|
* - jump on next category or feed when marked as read
|
||||||
|
* - image lazy loading
|
||||||
|
* - stick open articles to the top
|
||||||
|
* - display a confirmation when reading all articles
|
||||||
|
* - article order (default: DESC)
|
||||||
|
* - mark articles as read when:
|
||||||
|
* - displayed
|
||||||
|
* - opened on site
|
||||||
|
* - scrolled
|
||||||
|
* - received
|
||||||
|
* Default values are false unless specified.
|
||||||
|
*/
|
||||||
public function readingAction() {
|
public function readingAction() {
|
||||||
if (Minz_Request::isPost()) {
|
if (Minz_Request::isPost()) {
|
||||||
$this->view->conf->_posts_per_page(Minz_Request::param('posts_per_page', 10));
|
$this->view->conf->_posts_per_page(Minz_Request::param('posts_per_page', 10));
|
||||||
|
@ -203,18 +288,20 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
Minz_Translate::reset();
|
Minz_Translate::reset();
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('configuration_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'reading'));
|
||||||
'content' => Minz_Translate::t('configuration_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'reading'), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('reading_configuration') . ' · ');
|
Minz_View::prependTitle(_t('reading_configuration') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the sharing configuration page.
|
||||||
|
*
|
||||||
|
* It displays the sharing configuration page.
|
||||||
|
* If this action is reached through a POST request, it stores all
|
||||||
|
* configuration values then sends a notification to the user.
|
||||||
|
*/
|
||||||
public function sharingAction() {
|
public function sharingAction() {
|
||||||
if (Minz_Request::isPost()) {
|
if (Minz_Request::isPost()) {
|
||||||
$params = Minz_Request::params();
|
$params = Minz_Request::params();
|
||||||
|
@ -222,25 +309,31 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
$this->view->conf->save();
|
$this->view->conf->save();
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('configuration_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'sharing'));
|
||||||
'content' => Minz_Translate::t('configuration_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'sharing'), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('sharing') . ' · ');
|
Minz_View::prependTitle(_t('sharing') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the shortcut configuration page.
|
||||||
|
*
|
||||||
|
* It displays the shortcut configuration page.
|
||||||
|
* If this action is reached through a POST request, it stores all new
|
||||||
|
* configuration values then sends a notification to the user.
|
||||||
|
*
|
||||||
|
* The authorized values for shortcuts are letters (a to z), numbers (0
|
||||||
|
* to 9), function keys (f1 to f12), backspace, delete, down, end, enter,
|
||||||
|
* escape, home, insert, left, page down, page up, return, right, space,
|
||||||
|
* tab and up.
|
||||||
|
*/
|
||||||
public function shortcutAction() {
|
public function shortcutAction() {
|
||||||
$list_keys = array('a', 'b', 'backspace', 'c', 'd', 'delete', 'down', 'e', 'end', 'enter',
|
$list_keys = array('a', 'b', 'backspace', 'c', 'd', 'delete', 'down', 'e', 'end', 'enter',
|
||||||
'escape', 'f', 'g', 'h', 'home', 'i', 'insert', 'j', 'k', 'l', 'left',
|
'escape', 'f', 'g', 'h', 'home', 'i', 'insert', 'j', 'k', 'l', 'left',
|
||||||
'm', 'n', 'o', 'p', 'page_down', 'page_up', 'q', 'r', 'return', 'right',
|
'm', 'n', 'o', 'p', 'page_down', 'page_up', 'q', 'r', 'return', 'right',
|
||||||
's', 'space', 't', 'tab', 'u', 'up', 'v', 'w', 'x', 'y',
|
's', 'space', 't', 'tab', 'u', 'up', 'v', 'w', 'x', 'y',
|
||||||
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
|
'z', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
|
||||||
'9', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
|
|
||||||
'f10', 'f11', 'f12');
|
'f10', 'f11', 'f12');
|
||||||
$this->view->list_keys = $list_keys;
|
$this->view->list_keys = $list_keys;
|
||||||
|
|
||||||
|
@ -258,44 +351,50 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
$this->view->conf->save();
|
$this->view->conf->save();
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('shortcuts_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'shortcut'));
|
||||||
'content' => Minz_Translate::t('shortcuts_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'shortcut'), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('shortcuts') . ' · ');
|
Minz_View::prependTitle(_t('shortcuts') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action display the user configuration page
|
||||||
|
*
|
||||||
|
* @todo move that action in the user controller
|
||||||
|
*/
|
||||||
public function usersAction() {
|
public function usersAction() {
|
||||||
Minz_View::prependTitle(Minz_Translate::t('users') . ' · ');
|
Minz_View::prependTitle(_t('users') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the archive configuration page.
|
||||||
|
*
|
||||||
|
* It displays the archive configuration page.
|
||||||
|
* If this action is reached through a POST request, it stores all new
|
||||||
|
* configuration values then sends a notification to the user.
|
||||||
|
*
|
||||||
|
* The options available on that page are:
|
||||||
|
* - duration to retain old article (default: 3)
|
||||||
|
* - number of article to retain per feed (default: 0)
|
||||||
|
* - refresh frequency (default: -2)
|
||||||
|
*
|
||||||
|
* @todo explain why the default value is -2 but this value does not
|
||||||
|
* exist in the drop-down list
|
||||||
|
*/
|
||||||
public function archivingAction() {
|
public function archivingAction() {
|
||||||
if (Minz_Request::isPost()) {
|
if (Minz_Request::isPost()) {
|
||||||
$old = Minz_Request::param('old_entries', 3);
|
$this->view->conf->_old_entries(Minz_Request::param('old_entries', 3));
|
||||||
$keepHistoryDefault = Minz_Request::param('keep_history_default', 0);
|
$this->view->conf->_keep_history_default(Minz_Request::param('keep_history_default', 0));
|
||||||
$ttlDefault = Minz_Request::param('ttl_default', -2);
|
$this->view->conf->_ttl_default(Minz_Request::param('ttl_default', -2));
|
||||||
|
|
||||||
$this->view->conf->_old_entries($old);
|
|
||||||
$this->view->conf->_keep_history_default($keepHistoryDefault);
|
|
||||||
$this->view->conf->_ttl_default($ttlDefault);
|
|
||||||
$this->view->conf->save();
|
$this->view->conf->save();
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('configuration_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'archiving'));
|
||||||
'content' => Minz_Translate::t('configuration_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'archiving'), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('archiving_configuration') . ' · ');
|
Minz_View::prependTitle(_t('archiving_configuration') . ' · ');
|
||||||
|
|
||||||
$entryDAO = FreshRSS_Factory::createEntryDao();
|
$entryDAO = FreshRSS_Factory::createEntryDao();
|
||||||
$this->view->nb_total = $entryDAO->count();
|
$this->view->nb_total = $entryDAO->count();
|
||||||
|
@ -306,27 +405,34 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the user queries configuration page.
|
||||||
|
*
|
||||||
|
* If this action is reached through a POST request, it stores all new
|
||||||
|
* configuration values then sends a notification to the user then
|
||||||
|
* redirect to the same page.
|
||||||
|
* If this action is not reached through a POST request, it displays the
|
||||||
|
* configuration page and verifies that every user query is runable by
|
||||||
|
* checking if categories and feeds are still in use.
|
||||||
|
*/
|
||||||
public function queriesAction() {
|
public function queriesAction() {
|
||||||
if (Minz_Request::isPost()) {
|
if (Minz_Request::isPost()) {
|
||||||
$queries = Minz_Request::param('queries', array());
|
$queries = Minz_Request::param('queries', array());
|
||||||
|
|
||||||
foreach ($queries as $key => $query) {
|
foreach ($queries as $key => $query) {
|
||||||
if (!$query['name']) {
|
if (!$query['name']) {
|
||||||
$query['name'] = Minz_Translate::t('query_number', $key + 1);
|
$query['name'] = _t('query_number', $key + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->view->conf->_queries($queries);
|
$this->view->conf->_queries($queries);
|
||||||
$this->view->conf->save();
|
$this->view->conf->save();
|
||||||
|
|
||||||
$notif = array(
|
Minz_Request::good(_t('configuration_updated'),
|
||||||
'type' => 'good',
|
array('c' => 'configure', 'a' => 'queries'));
|
||||||
'content' => Minz_Translate::t('configuration_updated')
|
|
||||||
);
|
|
||||||
Minz_Session::_param('notification', $notif);
|
|
||||||
|
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'queries'), true);
|
|
||||||
} else {
|
} else {
|
||||||
$this->view->query_get = array();
|
$this->view->query_get = array();
|
||||||
|
$cat_dao = new FreshRSS_CategoryDAO();
|
||||||
|
$feed_dao = FreshRSS_Factory::createFeedDao();
|
||||||
foreach ($this->view->conf->queries as $key => $query) {
|
foreach ($this->view->conf->queries as $key => $query) {
|
||||||
if (!isset($query['get'])) {
|
if (!isset($query['get'])) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -334,51 +440,83 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
|
||||||
|
|
||||||
switch ($query['get'][0]) {
|
switch ($query['get'][0]) {
|
||||||
case 'c':
|
case 'c':
|
||||||
$dao = new FreshRSS_CategoryDAO();
|
$category = $cat_dao->searchById(substr($query['get'], 2));
|
||||||
$category = $dao->searchById(substr($query['get'], 2));
|
|
||||||
|
$deprecated = true;
|
||||||
|
$cat_name = '';
|
||||||
|
if ($category) {
|
||||||
|
$cat_name = $category->name();
|
||||||
|
$deprecated = false;
|
||||||
|
}
|
||||||
|
|
||||||
$this->view->query_get[$key] = array(
|
$this->view->query_get[$key] = array(
|
||||||
'type' => 'category',
|
'type' => 'category',
|
||||||
'name' => $category->name(),
|
'name' => $cat_name,
|
||||||
|
'deprecated' => $deprecated,
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
$dao = FreshRSS_Factory::createFeedDao();
|
$feed = $feed_dao->searchById(substr($query['get'], 2));
|
||||||
$feed = $dao->searchById(substr($query['get'], 2));
|
|
||||||
|
$deprecated = true;
|
||||||
|
$feed_name = '';
|
||||||
|
if ($feed) {
|
||||||
|
$feed_name = $feed->name();
|
||||||
|
$deprecated = false;
|
||||||
|
}
|
||||||
|
|
||||||
$this->view->query_get[$key] = array(
|
$this->view->query_get[$key] = array(
|
||||||
'type' => 'feed',
|
'type' => 'feed',
|
||||||
'name' => $feed->name(),
|
'name' => $feed_name,
|
||||||
|
'deprecated' => $deprecated,
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
$this->view->query_get[$key] = array(
|
$this->view->query_get[$key] = array(
|
||||||
'type' => 'favorite',
|
'type' => 'favorite',
|
||||||
'name' => 'favorite',
|
'name' => 'favorite',
|
||||||
|
'deprecated' => false,
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
$this->view->query_get[$key] = array(
|
$this->view->query_get[$key] = array(
|
||||||
'type' => 'all',
|
'type' => 'all',
|
||||||
'name' => 'all',
|
'name' => 'all',
|
||||||
|
'deprecated' => false,
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Minz_View::prependTitle(Minz_Translate::t('queries') . ' · ');
|
Minz_View::prependTitle(_t('queries') . ' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the creation of a user query.
|
||||||
|
*
|
||||||
|
* It gets the GET parameters and stores them in the configuration query
|
||||||
|
* storage. Before it is saved, the unwanted parameters are unset to keep
|
||||||
|
* lean data.
|
||||||
|
*/
|
||||||
public function addQueryAction() {
|
public function addQueryAction() {
|
||||||
|
$whitelist = array('get', 'order', 'name', 'search', 'state');
|
||||||
$queries = $this->view->conf->queries;
|
$queries = $this->view->conf->queries;
|
||||||
$query = Minz_Request::params();
|
$query = Minz_Request::params();
|
||||||
$query['name'] = Minz_Translate::t('query_number', count($queries) + 1);
|
$query['name'] = _t('query_number', count($queries) + 1);
|
||||||
unset($query['output']);
|
foreach ($query as $key => $value) {
|
||||||
unset($query['token']);
|
if (!in_array($key, $whitelist)) {
|
||||||
|
unset($query[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($query['state']) && $query['state'] & FreshRSS_Entry::STATE_STRICT) {
|
||||||
|
$query['state'] -= FreshRSS_Entry::STATE_STRICT;
|
||||||
|
}
|
||||||
$queries[] = $query;
|
$queries[] = $query;
|
||||||
$this->view->conf->_queries($queries);
|
$this->view->conf->_queries($queries);
|
||||||
$this->view->conf->save();
|
$this->view->conf->save();
|
||||||
|
|
||||||
// Minz_Request::forward(array('params' => $query), true);
|
Minz_Request::good(_t('query_created', $query['name']),
|
||||||
Minz_Request::forward(array('c' => 'configure', 'a' => 'queries'), true);
|
array('c' => 'configure', 'a' => 'queries'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,10 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
|
||||||
|
|
||||||
$entryDAO = FreshRSS_Factory::createEntryDao();
|
$entryDAO = FreshRSS_Factory::createEntryDao();
|
||||||
if ($id == false) {
|
if ($id == false) {
|
||||||
|
if (!Minz_Request::isPost()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$get) {
|
if (!$get) {
|
||||||
$entryDAO->markReadEntries ($idMax);
|
$entryDAO->markReadEntries ($idMax);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -383,7 +383,16 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
||||||
|
|
||||||
$feedDAO = FreshRSS_Factory::createFeedDao();
|
$feedDAO = FreshRSS_Factory::createFeedDao();
|
||||||
if ($type == 'category') {
|
if ($type == 'category') {
|
||||||
|
// List feeds to remove then related user queries.
|
||||||
|
$feeds = $feedDAO->listByCategory($id);
|
||||||
|
|
||||||
if ($feedDAO->deleteFeedByCategory ($id)) {
|
if ($feedDAO->deleteFeedByCategory ($id)) {
|
||||||
|
// Remove related queries
|
||||||
|
foreach ($feeds as $feed) {
|
||||||
|
$this->view->conf->remove_query_by_get('f_' . $feed->id());
|
||||||
|
}
|
||||||
|
$this->view->conf->save();
|
||||||
|
|
||||||
$notif = array (
|
$notif = array (
|
||||||
'type' => 'good',
|
'type' => 'good',
|
||||||
'content' => Minz_Translate::t ('category_emptied')
|
'content' => Minz_Translate::t ('category_emptied')
|
||||||
|
@ -397,6 +406,10 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($feedDAO->deleteFeed ($id)) {
|
if ($feedDAO->deleteFeed ($id)) {
|
||||||
|
// Remove related queries
|
||||||
|
$this->view->conf->remove_query_by_get('f_' . $id);
|
||||||
|
$this->view->conf->save();
|
||||||
|
|
||||||
$notif = array (
|
$notif = array (
|
||||||
'type' => 'good',
|
'type' => 'good',
|
||||||
'content' => Minz_Translate::t ('feed_deleted')
|
'content' => Minz_Translate::t ('feed_deleted')
|
||||||
|
@ -412,7 +425,10 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
||||||
|
|
||||||
Minz_Session::_param ('notification', $notif);
|
Minz_Session::_param ('notification', $notif);
|
||||||
|
|
||||||
if ($type == 'category') {
|
$redirect_url = Minz_Request::param('r', false, true);
|
||||||
|
if ($redirect_url) {
|
||||||
|
Minz_Request::forward($redirect_url);
|
||||||
|
} elseif ($type == 'category') {
|
||||||
Minz_Request::forward(array ('c' => 'configure', 'a' => 'categorize'), true);
|
Minz_Request::forward(array ('c' => 'configure', 'a' => 'categorize'), true);
|
||||||
} else {
|
} else {
|
||||||
Minz_Request::forward(array ('c' => 'configure', 'a' => 'feed'), true);
|
Minz_Request::forward(array ('c' => 'configure', 'a' => 'feed'), true);
|
||||||
|
|
|
@ -109,7 +109,6 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
|
||||||
// A *very* basic guess file type function. Only based on filename
|
// A *very* basic guess file type function. Only based on filename
|
||||||
// That's could be improved but should be enough, at least for a first
|
// That's could be improved but should be enough, at least for a first
|
||||||
// implementation.
|
// implementation.
|
||||||
// TODO: improve this function?
|
|
||||||
|
|
||||||
if (substr_compare($filename, '.zip', -4) === 0) {
|
if (substr_compare($filename, '.zip', -4) === 0) {
|
||||||
return 'zip';
|
return 'zip';
|
||||||
|
@ -119,8 +118,7 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
|
||||||
} elseif (substr_compare($filename, '.json', -5) === 0 &&
|
} elseif (substr_compare($filename, '.json', -5) === 0 &&
|
||||||
strpos($filename, 'starred') !== false) {
|
strpos($filename, 'starred') !== false) {
|
||||||
return 'json_starred';
|
return 'json_starred';
|
||||||
} elseif (substr_compare($filename, '.json', -5) === 0 &&
|
} elseif (substr_compare($filename, '.json', -5) === 0) {
|
||||||
strpos($filename, 'feed_') === 0) {
|
|
||||||
return 'json_feed';
|
return 'json_feed';
|
||||||
} else {
|
} else {
|
||||||
return 'unknown';
|
return 'unknown';
|
||||||
|
@ -239,13 +237,27 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
|
||||||
);
|
);
|
||||||
|
|
||||||
$error = false;
|
$error = false;
|
||||||
|
$article_to_feed = array();
|
||||||
|
|
||||||
|
// First, we check feeds of articles are in DB (and add them if needed).
|
||||||
foreach ($article_object['items'] as $item) {
|
foreach ($article_object['items'] as $item) {
|
||||||
$feed = $this->addFeedArticles($item['origin'], $google_compliant);
|
$feed = $this->addFeedArticles($item['origin'], $google_compliant);
|
||||||
if (is_null($feed)) {
|
if (is_null($feed)) {
|
||||||
$error = true;
|
$error = true;
|
||||||
|
} else {
|
||||||
|
$article_to_feed[$item['id']] = $feed->id();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then, articles are imported.
|
||||||
|
$prepared_statement = $this->entryDAO->addEntryPrepare();
|
||||||
|
$this->entryDAO->beginTransaction();
|
||||||
|
foreach ($article_object['items'] as $item) {
|
||||||
|
if (!isset($article_to_feed[$item['id']])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$feed_id = $article_to_feed[$item['id']];
|
||||||
$author = isset($item['author']) ? $item['author'] : '';
|
$author = isset($item['author']) ? $item['author'] : '';
|
||||||
$key_content = ($google_compliant && !isset($item['content'])) ?
|
$key_content = ($google_compliant && !isset($item['content'])) ?
|
||||||
'summary' : 'content';
|
'summary' : 'content';
|
||||||
|
@ -257,21 +269,21 @@ class FreshRSS_importExport_Controller extends Minz_ActionController {
|
||||||
}
|
}
|
||||||
|
|
||||||
$entry = new FreshRSS_Entry(
|
$entry = new FreshRSS_Entry(
|
||||||
$feed->id(), $item['id'], $item['title'], $author,
|
$feed_id, $item['id'], $item['title'], $author,
|
||||||
$item[$key_content]['content'], $item['alternate'][0]['href'],
|
$item[$key_content]['content'], $item['alternate'][0]['href'],
|
||||||
$item['published'], $is_read, $starred
|
$item['published'], $is_read, $starred
|
||||||
);
|
);
|
||||||
|
$entry->_id(min(time(), $entry->date(true)) . uSecString());
|
||||||
$entry->_tags($tags);
|
$entry->_tags($tags);
|
||||||
|
|
||||||
//FIME: Use entryDAO->addEntryPrepare(). Do not call entryDAO->listLastGuidsByFeed() for each entry. Consider using a transaction.
|
$values = $entry->toArray();
|
||||||
$id = $this->entryDAO->addEntryObject(
|
$id = $this->entryDAO->addEntry($values, $prepared_statement);
|
||||||
$entry, $this->view->conf, $feed->keepHistory()
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!$error && ($id === false)) {
|
if (!$error && ($id === false)) {
|
||||||
$error = true;
|
$error = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$this->entryDAO->commit();
|
||||||
|
|
||||||
return $error;
|
return $error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,11 @@ class FreshRSS_index_Controller extends Minz_ActionController {
|
||||||
$nb = Minz_Request::param ('nb', $this->view->conf->posts_per_page);
|
$nb = Minz_Request::param ('nb', $this->view->conf->posts_per_page);
|
||||||
$first = Minz_Request::param ('next', '');
|
$first = Minz_Request::param ('next', '');
|
||||||
|
|
||||||
|
$ajax_request = Minz_Request::param('ajax', false);
|
||||||
|
if ($output === 'reader') {
|
||||||
|
$nb = max(1, round($nb / 2));
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->view->state === FreshRSS_Entry::STATE_NOT_READ) { //Any unread article in this category at all?
|
if ($this->view->state === FreshRSS_Entry::STATE_NOT_READ) { //Any unread article in this category at all?
|
||||||
switch ($getType) {
|
switch ($getType) {
|
||||||
case 'a':
|
case 'a':
|
||||||
|
@ -332,6 +337,10 @@ class FreshRSS_index_Controller extends Minz_ActionController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function formLoginAction () {
|
public function formLoginAction () {
|
||||||
|
if ($this->view->loginOk) {
|
||||||
|
Minz_Request::forward(array('c' => 'index', 'a' => 'index'), true);
|
||||||
|
}
|
||||||
|
|
||||||
if (Minz_Request::isPost()) {
|
if (Minz_Request::isPost()) {
|
||||||
$ok = false;
|
$ok = false;
|
||||||
$nonce = Minz_Session::param('nonce');
|
$nonce = Minz_Session::param('nonce');
|
||||||
|
@ -415,4 +424,75 @@ class FreshRSS_index_Controller extends Minz_ActionController {
|
||||||
self::deleteLongTermCookie();
|
self::deleteLongTermCookie();
|
||||||
Minz_Request::forward(array('c' => 'index', 'a' => 'index'), true);
|
Minz_Request::forward(array('c' => 'index', 'a' => 'index'), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function resetAuthAction() {
|
||||||
|
Minz_View::prependTitle(_t('auth_reset') . ' · ');
|
||||||
|
Minz_View::appendScript(Minz_Url::display(
|
||||||
|
'/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js')
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->view->no_form = false;
|
||||||
|
// Enable changement of auth only if Persona!
|
||||||
|
if (Minz_Configuration::authType() != 'persona') {
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'bad',
|
||||||
|
'title' => _t('damn'),
|
||||||
|
'body' => _t('auth_not_persona')
|
||||||
|
);
|
||||||
|
$this->view->no_form = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$conf = new FreshRSS_Configuration(Minz_Configuration::defaultUser());
|
||||||
|
// Admin user must have set its master password.
|
||||||
|
if (!$conf->passwordHash) {
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'bad',
|
||||||
|
'title' => _t('damn'),
|
||||||
|
'body' => _t('auth_no_password_set')
|
||||||
|
);
|
||||||
|
$this->view->no_form = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invalidateHttpCache();
|
||||||
|
|
||||||
|
if (Minz_Request::isPost()) {
|
||||||
|
$nonce = Minz_Session::param('nonce');
|
||||||
|
$username = Minz_Request::param('username', '');
|
||||||
|
$c = Minz_Request::param('challenge', '');
|
||||||
|
if (!(ctype_alnum($username) && ctype_graph($c) && ctype_alnum($nonce))) {
|
||||||
|
Minz_Log::debug('Invalid credential parameters:' .
|
||||||
|
' user=' . $username .
|
||||||
|
' challenge=' . $c .
|
||||||
|
' nonce=' . $nonce);
|
||||||
|
Minz_Request::bad(_t('invalid_login'),
|
||||||
|
array('c' => 'index', 'a' => 'resetAuth'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('password_verify')) {
|
||||||
|
include_once(LIB_PATH . '/password_compat.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$s = $conf->passwordHash;
|
||||||
|
$ok = password_verify($nonce . $s, $c);
|
||||||
|
if ($ok) {
|
||||||
|
Minz_Configuration::_authType('form');
|
||||||
|
$ok = Minz_Configuration::writeFile();
|
||||||
|
|
||||||
|
if ($ok) {
|
||||||
|
Minz_Request::good(_t('auth_form_set'));
|
||||||
|
} else {
|
||||||
|
Minz_Request::bad(_t('auth_form_not_set'),
|
||||||
|
array('c' => 'index', 'a' => 'resetAuth'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Minz_Log::debug('Password mismatch for user ' . $username .
|
||||||
|
', nonce=' . $nonce . ', c=' . $c);
|
||||||
|
|
||||||
|
Minz_Request::bad(_t('invalid_login'),
|
||||||
|
array('c' => 'index', 'a' => 'resetAuth'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,21 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller to handle application statistics.
|
||||||
|
*/
|
||||||
class FreshRSS_stats_Controller extends Minz_ActionController {
|
class FreshRSS_stats_Controller extends Minz_ActionController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the statistic main page.
|
||||||
|
*
|
||||||
|
* It displays the statistic main page.
|
||||||
|
* The values computed to display the page are:
|
||||||
|
* - repartition of read/unread/favorite/not favorite
|
||||||
|
* - number of article per day
|
||||||
|
* - number of feed by category
|
||||||
|
* - number of article by category
|
||||||
|
* - list of most prolific feed
|
||||||
|
*/
|
||||||
public function indexAction() {
|
public function indexAction() {
|
||||||
$statsDAO = FreshRSS_Factory::createStatsDAO();
|
$statsDAO = FreshRSS_Factory::createStatsDAO();
|
||||||
Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js')));
|
Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js')));
|
||||||
|
@ -12,6 +26,17 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
|
||||||
$this->view->topFeed = $statsDAO->calculateTopFeed();
|
$this->view->topFeed = $statsDAO->calculateTopFeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the idle feed statistic page.
|
||||||
|
*
|
||||||
|
* It displays the list of idle feed for different period. The supported
|
||||||
|
* periods are:
|
||||||
|
* - last year
|
||||||
|
* - last 6 months
|
||||||
|
* - last 3 months
|
||||||
|
* - last month
|
||||||
|
* - last week
|
||||||
|
*/
|
||||||
public function idleAction() {
|
public function idleAction() {
|
||||||
$statsDAO = FreshRSS_Factory::createStatsDAO();
|
$statsDAO = FreshRSS_Factory::createStatsDAO();
|
||||||
$feeds = $statsDAO->calculateFeedLastDate();
|
$feeds = $statsDAO->calculateFeedLastDate();
|
||||||
|
@ -56,6 +81,18 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
|
||||||
$this->view->idleFeeds = $idleFeeds;
|
$this->view->idleFeeds = $idleFeeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action handles the article repartition statistic page.
|
||||||
|
*
|
||||||
|
* It displays the number of article and the average of article for the
|
||||||
|
* following periods:
|
||||||
|
* - hour of the day
|
||||||
|
* - day of the week
|
||||||
|
* - month
|
||||||
|
*
|
||||||
|
* @todo verify that the metrics used here make some sense. Especially
|
||||||
|
* for the average.
|
||||||
|
*/
|
||||||
public function repartitionAction() {
|
public function repartitionAction() {
|
||||||
$statsDAO = FreshRSS_Factory::createStatsDAO();
|
$statsDAO = FreshRSS_Factory::createStatsDAO();
|
||||||
$categoryDAO = new FreshRSS_CategoryDAO();
|
$categoryDAO = new FreshRSS_CategoryDAO();
|
||||||
|
@ -67,10 +104,18 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
|
||||||
$this->view->days = $statsDAO->getDays();
|
$this->view->days = $statsDAO->getDays();
|
||||||
$this->view->months = $statsDAO->getMonths();
|
$this->view->months = $statsDAO->getMonths();
|
||||||
$this->view->repartitionHour = $statsDAO->calculateEntryRepartitionPerFeedPerHour($id);
|
$this->view->repartitionHour = $statsDAO->calculateEntryRepartitionPerFeedPerHour($id);
|
||||||
|
$this->view->averageHour = $statsDAO->calculateEntryAveragePerFeedPerHour($id);
|
||||||
$this->view->repartitionDayOfWeek = $statsDAO->calculateEntryRepartitionPerFeedPerDayOfWeek($id);
|
$this->view->repartitionDayOfWeek = $statsDAO->calculateEntryRepartitionPerFeedPerDayOfWeek($id);
|
||||||
|
$this->view->averageDayOfWeek = $statsDAO->calculateEntryAveragePerFeedPerDayOfWeek($id);
|
||||||
$this->view->repartitionMonth = $statsDAO->calculateEntryRepartitionPerFeedPerMonth($id);
|
$this->view->repartitionMonth = $statsDAO->calculateEntryRepartitionPerFeedPerMonth($id);
|
||||||
|
$this->view->averageMonth = $statsDAO->calculateEntryAveragePerFeedPerMonth($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action is called before every other action in that class. It is
|
||||||
|
* the common boiler plate for every action. It is triggered by the
|
||||||
|
* underlying framework.
|
||||||
|
*/
|
||||||
public function firstAction() {
|
public function firstAction() {
|
||||||
if (!$this->view->loginOk) {
|
if (!$this->view->loginOk) {
|
||||||
Minz_Error::error(
|
Minz_Error::error(
|
||||||
|
|
129
sources/app/Controllers/updateController.php
Executable file
|
@ -0,0 +1,129 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class FreshRSS_update_Controller extends Minz_ActionController {
|
||||||
|
public function firstAction() {
|
||||||
|
$current_user = Minz_Session::param('currentUser', '');
|
||||||
|
if (!$this->view->loginOk && Minz_Configuration::isAdmin($current_user)) {
|
||||||
|
Minz_Error::error(
|
||||||
|
403,
|
||||||
|
array('error' => array(_t('access_denied')))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
invalidateHttpCache();
|
||||||
|
|
||||||
|
Minz_View::prependTitle(_t('update_system') . ' · ');
|
||||||
|
$this->view->update_to_apply = false;
|
||||||
|
$this->view->last_update_time = 'unknown';
|
||||||
|
$this->view->check_last_hour = false;
|
||||||
|
$timestamp = (int)@file_get_contents(DATA_PATH . '/last_update.txt');
|
||||||
|
if (is_numeric($timestamp) && $timestamp > 0) {
|
||||||
|
$this->view->last_update_time = timestamptodate($timestamp);
|
||||||
|
$this->view->check_last_hour = (time() - 3600) <= $timestamp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function indexAction() {
|
||||||
|
if (file_exists(UPDATE_FILENAME) && !is_writable(FRESHRSS_PATH)) {
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'bad',
|
||||||
|
'title' => _t('damn'),
|
||||||
|
'body' => _t('file_is_nok', FRESHRSS_PATH)
|
||||||
|
);
|
||||||
|
} elseif (file_exists(UPDATE_FILENAME)) {
|
||||||
|
// There is an update file to apply!
|
||||||
|
$this->view->update_to_apply = true;
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'good',
|
||||||
|
'title' => _t('ok'),
|
||||||
|
'body' => _t('update_can_apply')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function checkAction() {
|
||||||
|
$this->view->change_view('update', 'index');
|
||||||
|
|
||||||
|
if (file_exists(UPDATE_FILENAME) || $this->view->check_last_hour) {
|
||||||
|
// There is already an update file to apply: we don't need to check
|
||||||
|
// the webserver!
|
||||||
|
// Or if already check during the last hour, do nothing.
|
||||||
|
Minz_Request::forward(array('c' => 'update'));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c = curl_init(FRESHRSS_UPDATE_WEBSITE);
|
||||||
|
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, true);
|
||||||
|
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2);
|
||||||
|
$result = curl_exec($c);
|
||||||
|
$c_status = curl_getinfo($c, CURLINFO_HTTP_CODE);
|
||||||
|
$c_error = curl_error($c);
|
||||||
|
curl_close($c);
|
||||||
|
|
||||||
|
if ($c_status !== 200) {
|
||||||
|
Minz_Log::error(
|
||||||
|
'Error during update (HTTP code ' . $c_status . '): ' . $c_error
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'bad',
|
||||||
|
'title' => _t('damn'),
|
||||||
|
'body' => _t('update_server_not_found', FRESHRSS_UPDATE_WEBSITE)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$res_array = explode("\n", $result, 2);
|
||||||
|
$status = $res_array[0];
|
||||||
|
if (strpos($status, 'UPDATE') !== 0) {
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'bad',
|
||||||
|
'title' => _t('damn'),
|
||||||
|
'body' => _t('no_update')
|
||||||
|
);
|
||||||
|
|
||||||
|
@file_put_contents(DATA_PATH . '/last_update.txt', time());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$script = $res_array[1];
|
||||||
|
if (file_put_contents(UPDATE_FILENAME, $script) !== false) {
|
||||||
|
Minz_Request::forward(array('c' => 'update'));
|
||||||
|
} else {
|
||||||
|
$this->view->message = array(
|
||||||
|
'status' => 'bad',
|
||||||
|
'title' => _t('damn'),
|
||||||
|
'body' => _t('update_problem', 'Cannot save the update script')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function applyAction() {
|
||||||
|
if (!file_exists(UPDATE_FILENAME) || !is_writable(FRESHRSS_PATH)) {
|
||||||
|
Minz_Request::forward(array('c' => 'update'), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
require(UPDATE_FILENAME);
|
||||||
|
|
||||||
|
if (Minz_Request::isPost()) {
|
||||||
|
save_info_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!need_info_update()) {
|
||||||
|
$res = apply_update();
|
||||||
|
|
||||||
|
if ($res === true) {
|
||||||
|
@unlink(UPDATE_FILENAME);
|
||||||
|
@file_put_contents(DATA_PATH . '/last_update.txt', time());
|
||||||
|
|
||||||
|
Minz_Request::good(_t('update_finished'));
|
||||||
|
} else {
|
||||||
|
Minz_Request::bad(_t('update_problem', $res),
|
||||||
|
array('c' => 'update', 'a' => 'index'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,8 +6,7 @@ class FreshRSS extends Minz_FrontController {
|
||||||
}
|
}
|
||||||
$loginOk = $this->accessControl(Minz_Session::param('currentUser', ''));
|
$loginOk = $this->accessControl(Minz_Session::param('currentUser', ''));
|
||||||
$this->loadParamsView();
|
$this->loadParamsView();
|
||||||
if (Minz_Request::isPost() && (empty($_SERVER['HTTP_REFERER']) ||
|
if (Minz_Request::isPost() && !is_referer_from_same_domain()) {
|
||||||
Minz_Request::getDomainName() !== parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST))) {
|
|
||||||
$loginOk = false; //Basic protection against XSRF attacks
|
$loginOk = false; //Basic protection against XSRF attacks
|
||||||
Minz_Error::error(
|
Minz_Error::error(
|
||||||
403,
|
403,
|
||||||
|
@ -144,7 +143,17 @@ class FreshRSS extends Minz_FrontController {
|
||||||
$theme = FreshRSS_Themes::load($this->conf->theme);
|
$theme = FreshRSS_Themes::load($this->conf->theme);
|
||||||
if ($theme) {
|
if ($theme) {
|
||||||
foreach($theme['files'] as $file) {
|
foreach($theme['files'] as $file) {
|
||||||
Minz_View::appendStyle (Minz_Url::display ('/themes/' . $theme['id'] . '/' . $file . '?' . @filemtime(PUBLIC_PATH . '/themes/' . $theme['id'] . '/' . $file)));
|
if ($file[0] === '_') {
|
||||||
|
$theme_id = 'base-theme';
|
||||||
|
$filename = substr($file, 1);
|
||||||
|
} else {
|
||||||
|
$theme_id = $theme['id'];
|
||||||
|
$filename = $file;
|
||||||
|
}
|
||||||
|
$filetime = @filemtime(PUBLIC_PATH . '/themes/' . $theme_id . '/' . $filename);
|
||||||
|
Minz_View::appendStyle(Minz_Url::display(
|
||||||
|
'/themes/' . $theme_id . '/' . $filename . '?' . $filetime
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,8 @@ class FreshRSS_Configuration {
|
||||||
'load_more' => 'm',
|
'load_more' => 'm',
|
||||||
'auto_share' => 's',
|
'auto_share' => 's',
|
||||||
'focus_search' => 'a',
|
'focus_search' => 'a',
|
||||||
|
'user_filter' => 'u',
|
||||||
|
'help' => 'f1',
|
||||||
),
|
),
|
||||||
'topline_read' => true,
|
'topline_read' => true,
|
||||||
'topline_favorite' => true,
|
'topline_favorite' => true,
|
||||||
|
@ -58,6 +60,7 @@ class FreshRSS_Configuration {
|
||||||
'bottomline_link' => true,
|
'bottomline_link' => true,
|
||||||
'sharing' => array(),
|
'sharing' => array(),
|
||||||
'queries' => array(),
|
'queries' => array(),
|
||||||
|
'html5_notif_timeout' => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
private $available_languages = array(
|
private $available_languages = array(
|
||||||
|
@ -120,6 +123,16 @@ class FreshRSS_Configuration {
|
||||||
return $this->available_languages;
|
return $this->available_languages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function remove_query_by_get($get) {
|
||||||
|
$final_queries = array();
|
||||||
|
foreach ($this->queries as $key => $query) {
|
||||||
|
if (empty($query['get']) || $query['get'] !== $get) {
|
||||||
|
$final_queries[$key] = $query;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->_queries($final_queries);
|
||||||
|
}
|
||||||
|
|
||||||
public function _language($value) {
|
public function _language($value) {
|
||||||
if (!isset($this->available_languages[$value])) {
|
if (!isset($this->available_languages[$value])) {
|
||||||
$value = 'en';
|
$value = 'en';
|
||||||
|
@ -138,7 +151,18 @@ class FreshRSS_Configuration {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public function _default_view ($value) {
|
public function _default_view ($value) {
|
||||||
$this->data['default_view'] = $value === FreshRSS_Entry::STATE_ALL ? FreshRSS_Entry::STATE_ALL : FreshRSS_Entry::STATE_NOT_READ;
|
switch ($value) {
|
||||||
|
case FreshRSS_Entry::STATE_ALL:
|
||||||
|
// left blank on purpose
|
||||||
|
case FreshRSS_Entry::STATE_NOT_READ:
|
||||||
|
// left blank on purpose
|
||||||
|
case FreshRSS_Entry::STATE_STRICT + FreshRSS_Entry::STATE_NOT_READ:
|
||||||
|
$this->data['default_view'] = $value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->data['default_view'] = FreshRSS_Entry::STATE_ALL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public function _display_posts ($value) {
|
public function _display_posts ($value) {
|
||||||
$this->data['display_posts'] = ((bool)$value) && $value !== 'no';
|
$this->data['display_posts'] = ((bool)$value) && $value !== 'no';
|
||||||
|
@ -209,6 +233,7 @@ class FreshRSS_Configuration {
|
||||||
}
|
}
|
||||||
public function _sharing ($values) {
|
public function _sharing ($values) {
|
||||||
$this->data['sharing'] = array();
|
$this->data['sharing'] = array();
|
||||||
|
$unique = array();
|
||||||
foreach ($values as $value) {
|
foreach ($values as $value) {
|
||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -234,9 +259,13 @@ class FreshRSS_Configuration {
|
||||||
$value['name'] = $value['type'];
|
$value['name'] = $value['type'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$json_value = json_encode($value);
|
||||||
|
if (!in_array($json_value, $unique)) {
|
||||||
|
$unique[] = $json_value;
|
||||||
$this->data['sharing'][] = $value;
|
$this->data['sharing'][] = $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public function _queries ($values) {
|
public function _queries ($values) {
|
||||||
$this->data['queries'] = array();
|
$this->data['queries'] = array();
|
||||||
foreach ($values as $value) {
|
foreach ($values as $value) {
|
||||||
|
@ -261,6 +290,12 @@ class FreshRSS_Configuration {
|
||||||
$this->data['content_width'] = 'thin';
|
$this->data['content_width'] = 'thin';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function _html5_notif_timeout ($value) {
|
||||||
|
$value = intval($value);
|
||||||
|
$this->data['html5_notif_timeout'] = $value >= 0 ? $value : 0;
|
||||||
|
}
|
||||||
|
|
||||||
public function _token($value) {
|
public function _token($value) {
|
||||||
$this->data['token'] = $value;
|
$this->data['token'] = $value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ class FreshRSS_Entry extends Minz_Model {
|
||||||
const STATE_NOT_READ = 2;
|
const STATE_NOT_READ = 2;
|
||||||
const STATE_FAVORITE = 4;
|
const STATE_FAVORITE = 4;
|
||||||
const STATE_NOT_FAVORITE = 8;
|
const STATE_NOT_FAVORITE = 8;
|
||||||
|
const STATE_STRICT = 16;
|
||||||
|
|
||||||
private $id = 0;
|
private $id = 0;
|
||||||
private $guid;
|
private $guid;
|
||||||
|
|
|
@ -333,6 +333,8 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo {
|
||||||
if ($state & FreshRSS_Entry::STATE_NOT_READ) {
|
if ($state & FreshRSS_Entry::STATE_NOT_READ) {
|
||||||
if (!($state & FreshRSS_Entry::STATE_READ)) {
|
if (!($state & FreshRSS_Entry::STATE_READ)) {
|
||||||
$where .= 'AND e1.is_read=0 ';
|
$where .= 'AND e1.is_read=0 ';
|
||||||
|
} elseif ($state & FreshRSS_Entry::STATE_STRICT) {
|
||||||
|
$where .= 'AND e1.is_read=0 ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ($state & FreshRSS_Entry::STATE_READ) {
|
elseif ($state & FreshRSS_Entry::STATE_READ) {
|
||||||
|
|
|
@ -331,7 +331,7 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo {
|
||||||
$id_max = intval($date_min) . '000000';
|
$id_max = intval($date_min) . '000000';
|
||||||
|
|
||||||
$stm->bindParam(':id_feed', $id, PDO::PARAM_INT);
|
$stm->bindParam(':id_feed', $id, PDO::PARAM_INT);
|
||||||
$stm->bindParam(':id_max', $id_max, PDO::PARAM_INT);
|
$stm->bindParam(':id_max', $id_max, PDO::PARAM_STR);
|
||||||
$stm->bindParam(':keep', $keep, PDO::PARAM_INT);
|
$stm->bindParam(':keep', $keep, PDO::PARAM_INT);
|
||||||
|
|
||||||
if ($stm && $stm->execute()) {
|
if ($stm && $stm->execute()) {
|
||||||
|
|
|
@ -151,6 +151,74 @@ SQL;
|
||||||
return $this->convertToSerie($repartition);
|
return $this->convertToSerie($repartition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the average number of article per hour per feed
|
||||||
|
*
|
||||||
|
* @param integer $feed id
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function calculateEntryAveragePerFeedPerHour($feed = null) {
|
||||||
|
return $this->calculateEntryAveragePerFeedPerPeriod(1/24, $feed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the average number of article per day of week per feed
|
||||||
|
*
|
||||||
|
* @param integer $feed id
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function calculateEntryAveragePerFeedPerDayOfWeek($feed = null) {
|
||||||
|
return $this->calculateEntryAveragePerFeedPerPeriod(7, $feed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the average number of article per month per feed
|
||||||
|
*
|
||||||
|
* @param integer $feed id
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function calculateEntryAveragePerFeedPerMonth($feed = null) {
|
||||||
|
return $this->calculateEntryAveragePerFeedPerPeriod(30, $feed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the average number of article per feed
|
||||||
|
*
|
||||||
|
* @param float $period number used to divide the number of day in the period
|
||||||
|
* @param integer $feed id
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
protected function calculateEntryAveragePerFeedPerPeriod($period, $feed = null) {
|
||||||
|
if ($feed) {
|
||||||
|
$restrict = "WHERE e.id_feed = {$feed}";
|
||||||
|
} else {
|
||||||
|
$restrict = '';
|
||||||
|
}
|
||||||
|
$sql = <<<SQL
|
||||||
|
SELECT COUNT(1) AS count
|
||||||
|
, MIN(date) AS date_min
|
||||||
|
, MAX(date) AS date_max
|
||||||
|
FROM {$this->prefix}entry AS e
|
||||||
|
{$restrict}
|
||||||
|
SQL;
|
||||||
|
$stm = $this->bd->prepare($sql);
|
||||||
|
$stm->execute();
|
||||||
|
$res = $stm->fetch(PDO::FETCH_NAMED);
|
||||||
|
$date_min = new \DateTime();
|
||||||
|
$date_min->setTimestamp($res['date_min']);
|
||||||
|
$date_max = new \DateTime();
|
||||||
|
$date_max->setTimestamp($res['date_max']);
|
||||||
|
$interval = $date_max->diff($date_min, true);
|
||||||
|
$interval_in_days = $interval->format('%a');
|
||||||
|
if ($interval_in_days <= 0) {
|
||||||
|
// Surely only one article.
|
||||||
|
// We will return count / (period/period) == count.
|
||||||
|
$interval_in_days = $period;
|
||||||
|
}
|
||||||
|
|
||||||
|
return round($res['count'] / ($interval_in_days / $period), 2);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize an array for statistics depending on a range
|
* Initialize an array for statistics depending on a range
|
||||||
*
|
*
|
||||||
|
@ -247,6 +315,7 @@ SQL;
|
||||||
SELECT MAX(f.id) as id
|
SELECT MAX(f.id) as id
|
||||||
, MAX(f.name) AS name
|
, MAX(f.name) AS name
|
||||||
, MAX(date) AS last_date
|
, MAX(date) AS last_date
|
||||||
|
, COUNT(*) AS nb_articles
|
||||||
FROM {$this->prefix}feed AS f,
|
FROM {$this->prefix}feed AS f,
|
||||||
{$this->prefix}entry AS e
|
{$this->prefix}entry AS e
|
||||||
WHERE f.id = e.id_feed
|
WHERE f.id = e.id_feed
|
||||||
|
|
|
@ -53,6 +53,7 @@ SQL;
|
||||||
$stm->execute();
|
$stm->execute();
|
||||||
$res = $stm->fetchAll(PDO::FETCH_NAMED);
|
$res = $stm->fetchAll(PDO::FETCH_NAMED);
|
||||||
|
|
||||||
|
$repartition = array();
|
||||||
foreach ($res as $value) {
|
foreach ($res as $value) {
|
||||||
$repartition[(int) $value['period']] = (int) $value['count'];
|
$repartition[(int) $value['period']] = (int) $value['count'];
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,7 @@ class FreshRSS_Themes extends Minz_Model {
|
||||||
'search' => '🔍',
|
'search' => '🔍',
|
||||||
'share' => '♺',
|
'share' => '♺',
|
||||||
'starred' => '★',
|
'starred' => '★',
|
||||||
|
'stats' => '%',
|
||||||
'tag' => '⚐',
|
'tag' => '⚐',
|
||||||
'up' => '△',
|
'up' => '△',
|
||||||
'view-normal' => '☰',
|
'view-normal' => '☰',
|
||||||
|
|
|
@ -5,6 +5,7 @@ return array (
|
||||||
'login' => 'Login',
|
'login' => 'Login',
|
||||||
'keep_logged_in' => 'Keep me logged in <small>(1 month)</small>',
|
'keep_logged_in' => 'Keep me logged in <small>(1 month)</small>',
|
||||||
'login_with_persona' => 'Login with Persona',
|
'login_with_persona' => 'Login with Persona',
|
||||||
|
'login_persona_problem' => 'Connection problem with Persona?',
|
||||||
'logout' => 'Logout',
|
'logout' => 'Logout',
|
||||||
'search' => 'Search words or #tags',
|
'search' => 'Search words or #tags',
|
||||||
'search_short' => 'Search',
|
'search_short' => 'Search',
|
||||||
|
@ -42,9 +43,11 @@ return array (
|
||||||
'query_state_15' => 'Display all articles',
|
'query_state_15' => 'Display all articles',
|
||||||
'query_number' => 'Query n°%d',
|
'query_number' => 'Query n°%d',
|
||||||
'add_query' => 'Add a query',
|
'add_query' => 'Add a query',
|
||||||
|
'query_created' => 'Query "%s" has been created.',
|
||||||
'no_query' => 'You haven’t created any user query yet.',
|
'no_query' => 'You haven’t created any user query yet.',
|
||||||
'query_filter' => 'Filter applied:',
|
'query_filter' => 'Filter applied:',
|
||||||
'no_query_filter' => 'No filter',
|
'no_query_filter' => 'No filter',
|
||||||
|
'query_deprecated' => 'This query is no longer valid. The referenced category or feed has been deleted.',
|
||||||
'about' => 'About',
|
'about' => 'About',
|
||||||
'stats' => 'Statistics',
|
'stats' => 'Statistics',
|
||||||
'stats_idle' => 'Idle feeds',
|
'stats_idle' => 'Idle feeds',
|
||||||
|
@ -92,6 +95,7 @@ return array (
|
||||||
'rss_view' => 'RSS feed',
|
'rss_view' => 'RSS feed',
|
||||||
'show_all_articles' => 'Show all articles',
|
'show_all_articles' => 'Show all articles',
|
||||||
'show_not_reads' => 'Show only unread',
|
'show_not_reads' => 'Show only unread',
|
||||||
|
'show_adaptive' => 'Adjust showing',
|
||||||
'show_read' => 'Show only read',
|
'show_read' => 'Show only read',
|
||||||
'show_favorite' => 'Show only favorites',
|
'show_favorite' => 'Show only favorites',
|
||||||
'show_not_favorite' => 'Show all but favorites',
|
'show_not_favorite' => 'Show all but favorites',
|
||||||
|
@ -152,10 +156,13 @@ return array (
|
||||||
'public' => 'Public',
|
'public' => 'Public',
|
||||||
'invalid_login' => 'Login is invalid',
|
'invalid_login' => 'Login is invalid',
|
||||||
|
|
||||||
|
'file_is_nok' => 'Check permissions on <em>%s</em> directory. HTTP server must have rights to write into.',
|
||||||
|
|
||||||
// VIEWS
|
// VIEWS
|
||||||
'save' => 'Save',
|
'save' => 'Save',
|
||||||
'delete' => 'Delete',
|
'delete' => 'Delete',
|
||||||
'cancel' => 'Cancel',
|
'cancel' => 'Cancel',
|
||||||
|
'submit' => 'Submit',
|
||||||
|
|
||||||
'back_to_rss_feeds' => '← Go back to your RSS feeds',
|
'back_to_rss_feeds' => '← Go back to your RSS feeds',
|
||||||
'feeds_moved_category_deleted' => 'When you delete a category, their feeds are automatically classified under <em>%s</em>.',
|
'feeds_moved_category_deleted' => 'When you delete a category, their feeds are automatically classified under <em>%s</em>.',
|
||||||
|
@ -180,6 +187,9 @@ return array (
|
||||||
'auto_share' => 'Share',
|
'auto_share' => 'Share',
|
||||||
'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.',
|
'auto_share_help' => 'If there is only one sharing mode, it is used. Else modes are accessible by their number.',
|
||||||
'focus_search' => 'Access search box',
|
'focus_search' => 'Access search box',
|
||||||
|
'user_filter' => 'Access user filters',
|
||||||
|
'user_filter_help' => 'If there is only one user filter, it is used. Else filters are accessible by their number.',
|
||||||
|
'help' => 'Display documentation',
|
||||||
|
|
||||||
'file_to_import' => 'File to import<br />(OPML, Json or Zip)',
|
'file_to_import' => 'File to import<br />(OPML, Json or Zip)',
|
||||||
'file_to_import_no_zip' => 'File to import<br />(OPML or Json)',
|
'file_to_import_no_zip' => 'File to import<br />(OPML or Json)',
|
||||||
|
@ -197,13 +207,15 @@ return array (
|
||||||
|
|
||||||
'informations' => 'Information',
|
'informations' => 'Information',
|
||||||
'damn' => 'Damn!',
|
'damn' => 'Damn!',
|
||||||
|
'ok' => 'Ok!',
|
||||||
|
'attention' => 'Be careful!',
|
||||||
'feed_in_error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.',
|
'feed_in_error' => 'This feed has encountered a problem. Please verify that it is always reachable then actualize it.',
|
||||||
'feed_empty' => 'This feed is empty. Please verify that it is still maintained.',
|
'feed_empty' => 'This feed is empty. Please verify that it is still maintained.',
|
||||||
'feed_description' => 'Description',
|
'feed_description' => 'Description',
|
||||||
'website_url' => 'Website URL',
|
'website_url' => 'Website URL',
|
||||||
'feed_url' => 'Feed URL',
|
'feed_url' => 'Feed URL',
|
||||||
'articles' => 'articles',
|
'articles' => 'articles',
|
||||||
'number_articles' => 'Number of articles',
|
'number_articles' => '%d articles',
|
||||||
'by_feed' => 'by feed',
|
'by_feed' => 'by feed',
|
||||||
'by_default' => 'By default',
|
'by_default' => 'By default',
|
||||||
'keep_history' => 'Minimum number of articles to keep',
|
'keep_history' => 'Minimum number of articles to keep',
|
||||||
|
@ -225,7 +237,7 @@ return array (
|
||||||
'not_yet_implemented' => 'Not yet implemented',
|
'not_yet_implemented' => 'Not yet implemented',
|
||||||
'access_protected_feeds' => 'Connection allows to access HTTP protected RSS feeds',
|
'access_protected_feeds' => 'Connection allows to access HTTP protected RSS feeds',
|
||||||
'no_selected_feed' => 'No feed selected.',
|
'no_selected_feed' => 'No feed selected.',
|
||||||
'think_to_add' => '<a href="./?c=configure&a=feed">You may add some feeds</a>.',
|
'think_to_add' => 'You may add some feeds.',
|
||||||
|
|
||||||
'current_user' => 'Current user',
|
'current_user' => 'Current user',
|
||||||
'default_user' => 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>',
|
'default_user' => 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>',
|
||||||
|
@ -237,7 +249,7 @@ return array (
|
||||||
'unsafe_autologin' => 'Allow unsafe automatic login using the format: ',
|
'unsafe_autologin' => 'Allow unsafe automatic login using the format: ',
|
||||||
'api_enabled' => 'Allow <abbr>API</abbr> access <small>(required for mobile apps)</small>',
|
'api_enabled' => 'Allow <abbr>API</abbr> access <small>(required for mobile apps)</small>',
|
||||||
'auth_token' => 'Authentication token',
|
'auth_token' => 'Authentication token',
|
||||||
'explain_token' => 'Allows to access RSS output of the default user without authentication.<br /><kbd>%s?output=rss&token=%s</kbd>',
|
'explain_token' => 'Allows to access RSS output of the default user without authentication.<br /><kbd>%s?output=rss&token=%s</kbd>',
|
||||||
'login_configuration' => 'Login',
|
'login_configuration' => 'Login',
|
||||||
'is_admin' => 'is administrator',
|
'is_admin' => 'is administrator',
|
||||||
'auth_type' => 'Authentication method',
|
'auth_type' => 'Authentication method',
|
||||||
|
@ -248,6 +260,7 @@ return array (
|
||||||
'users_list' => 'List of users',
|
'users_list' => 'List of users',
|
||||||
'create_user' => 'Create new user',
|
'create_user' => 'Create new user',
|
||||||
'username' => 'Username',
|
'username' => 'Username',
|
||||||
|
'username_admin' => 'Administrator username',
|
||||||
'password' => 'Password',
|
'password' => 'Password',
|
||||||
'create' => 'Create',
|
'create' => 'Create',
|
||||||
'user_created' => 'User %s has been created',
|
'user_created' => 'User %s has been created',
|
||||||
|
@ -263,24 +276,28 @@ return array (
|
||||||
'reading_configuration' => 'Reading',
|
'reading_configuration' => 'Reading',
|
||||||
'display_configuration' => 'Display',
|
'display_configuration' => 'Display',
|
||||||
'articles_per_page' => 'Number of articles per page',
|
'articles_per_page' => 'Number of articles per page',
|
||||||
|
'number_divided_when_reader' => 'Divided by 2 in the reading view.',
|
||||||
'default_view' => 'Default view',
|
'default_view' => 'Default view',
|
||||||
|
'articles_to_display' => 'Articles to display',
|
||||||
'sort_order' => 'Sort order',
|
'sort_order' => 'Sort order',
|
||||||
'auto_load_more' => 'Load next articles at the page bottom',
|
'auto_load_more' => 'Load next articles at the page bottom',
|
||||||
'display_articles_unfolded' => 'Show articles unfolded by default',
|
'display_articles_unfolded' => 'Show articles unfolded by default',
|
||||||
'display_categories_unfolded' => 'Show categories folded by default',
|
'display_categories_unfolded' => 'Show categories folded by default',
|
||||||
'hide_read_feeds' => 'Hide categories & feeds with no unread article (only in “unread articles” display mode)',
|
'hide_read_feeds' => 'Hide categories & feeds with no unread article (does not work with “Show all articles” configuration)',
|
||||||
'after_onread' => 'After “mark all as read”,',
|
'after_onread' => 'After “mark all as read”,',
|
||||||
'jump_next' => 'jump to next unread sibling (feed or category)',
|
'jump_next' => 'jump to next unread sibling (feed or category)',
|
||||||
'article_icons' => 'Article icons',
|
'article_icons' => 'Article icons',
|
||||||
'top_line' => 'Top line',
|
'top_line' => 'Top line',
|
||||||
'bottom_line' => 'Bottom line',
|
'bottom_line' => 'Bottom line',
|
||||||
|
'html5_notif_timeout' => 'HTML5 notification timeout',
|
||||||
|
'seconds_(0_means_no_timeout)' => 'seconds (0 means no timeout)',
|
||||||
'img_with_lazyload' => 'Use "lazy load" mode to load pictures',
|
'img_with_lazyload' => 'Use "lazy load" mode to load pictures',
|
||||||
'sticky_post' => 'Stick the article to the top when opened',
|
'sticky_post' => 'Stick the article to the top when opened',
|
||||||
'reading_confirm' => 'Display a confirmation dialog on “mark all as read” actions',
|
'reading_confirm' => 'Display a confirmation dialog on “mark all as read” actions',
|
||||||
'auto_read_when' => 'Mark article as read…',
|
'auto_read_when' => 'Mark article as read…',
|
||||||
'article_viewed' => 'when article is viewed',
|
'article_viewed' => 'when article is viewed',
|
||||||
'article_open_on_website' => 'when article is opened on its original website',
|
'article_open_on_website' => 'when article is opened on its original website',
|
||||||
'scroll' => 'during page scrolls',
|
'scroll' => 'while scrolling',
|
||||||
'upon_reception' => 'upon reception of the article',
|
'upon_reception' => 'upon reception of the article',
|
||||||
'your_shaarli' => 'Your Shaarli',
|
'your_shaarli' => 'Your Shaarli',
|
||||||
'your_wallabag' => 'Your wallabag',
|
'your_wallabag' => 'Your wallabag',
|
||||||
|
@ -340,7 +357,7 @@ return array (
|
||||||
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
|
'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
|
||||||
'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="http://projet.idleman.fr/leed/">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.',
|
'freshrss_description' => 'FreshRSS is a RSS feeds aggregator to self-host like <a href="http://tontof.net/kriss/feed/">Kriss Feed</a> or <a href="http://projet.idleman.fr/leed/">Leed</a>. It is light and easy to take in hand while being powerful and configurable tool.',
|
||||||
'credits' => 'Credits',
|
'credits' => 'Credits',
|
||||||
'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police used has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.',
|
'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn’t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.',
|
||||||
'version' => 'Version',
|
'version' => 'Version',
|
||||||
|
|
||||||
'logs' => 'Logs',
|
'logs' => 'Logs',
|
||||||
|
@ -351,6 +368,7 @@ return array (
|
||||||
'login_required' => 'Login required:',
|
'login_required' => 'Login required:',
|
||||||
|
|
||||||
'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!',
|
'confirm_action' => 'Are you sure you want to perform this action? It cannot be cancelled!',
|
||||||
|
'confirm_action_feed_cat' => 'Are you sure you want to perform this action? You may lost related favorites and user queries. It cannot be cancelled!',
|
||||||
'notif_title_new_articles' => 'FreshRSS: new articles!',
|
'notif_title_new_articles' => 'FreshRSS: new articles!',
|
||||||
'notif_body_new_articles' => 'There are \d new articles to read on FreshRSS.',
|
'notif_body_new_articles' => 'There are \d new articles to read on FreshRSS.',
|
||||||
|
|
||||||
|
@ -414,4 +432,23 @@ return array (
|
||||||
'stats_entry_per_category' => 'Entries per category',
|
'stats_entry_per_category' => 'Entries per category',
|
||||||
'stats_top_feed' => 'Top ten feeds',
|
'stats_top_feed' => 'Top ten feeds',
|
||||||
'stats_entry_count' => 'Entry count',
|
'stats_entry_count' => 'Entry count',
|
||||||
|
'stats_no_idle' => 'There is no idle feed!',
|
||||||
|
|
||||||
|
'update' => 'Update',
|
||||||
|
'update_system' => 'Update system',
|
||||||
|
'update_check' => 'Check for new updates',
|
||||||
|
'update_last' => 'Last verification: %s',
|
||||||
|
'update_can_apply' => 'An update is available.',
|
||||||
|
'update_apply' => 'Apply',
|
||||||
|
'update_server_not_found' => 'Update server cannot be found. [%s]',
|
||||||
|
'no_update' => 'No update to apply',
|
||||||
|
'update_problem' => 'The update process has encountered an error: %s',
|
||||||
|
'update_finished' => 'Update completed!',
|
||||||
|
|
||||||
|
'auth_reset' => 'Authentication reset',
|
||||||
|
'auth_will_reset' => 'Authentication system will be reset: a form will be used instead of Persona.',
|
||||||
|
'auth_not_persona' => 'Only Persona system can be reset.',
|
||||||
|
'auth_no_password_set' => 'Administrator password hasn’t been set. This feature isn’t available.',
|
||||||
|
'auth_form_set' => 'Form is now your default authentication system.',
|
||||||
|
'auth_form_not_set' => 'A problem occured during authentication system configuration. Please retry later.',
|
||||||
);
|
);
|
||||||
|
|
|
@ -5,6 +5,7 @@ return array (
|
||||||
'login' => 'Connexion',
|
'login' => 'Connexion',
|
||||||
'keep_logged_in' => 'Rester connecté <small>(1 mois)</small>',
|
'keep_logged_in' => 'Rester connecté <small>(1 mois)</small>',
|
||||||
'login_with_persona' => 'Connexion avec Persona',
|
'login_with_persona' => 'Connexion avec Persona',
|
||||||
|
'login_persona_problem' => 'Problème de connexion à Persona ?',
|
||||||
'logout' => 'Déconnexion',
|
'logout' => 'Déconnexion',
|
||||||
'search' => 'Rechercher des mots ou des #tags',
|
'search' => 'Rechercher des mots ou des #tags',
|
||||||
'search_short' => 'Rechercher',
|
'search_short' => 'Rechercher',
|
||||||
|
@ -42,9 +43,11 @@ return array (
|
||||||
'query_state_15' => 'Afficher tous les articles',
|
'query_state_15' => 'Afficher tous les articles',
|
||||||
'query_number' => 'Filtre n°%d',
|
'query_number' => 'Filtre n°%d',
|
||||||
'add_query' => 'Créer un filtre',
|
'add_query' => 'Créer un filtre',
|
||||||
|
'query_created' => 'Le filtre "%s" a bien été créé.',
|
||||||
'no_query' => 'Vous n’avez pas encore créé de filtre.',
|
'no_query' => 'Vous n’avez pas encore créé de filtre.',
|
||||||
'query_filter' => 'Filtres appliqués :',
|
'query_filter' => 'Filtres appliqués :',
|
||||||
'no_query_filter' => 'Aucun filtre appliqué',
|
'no_query_filter' => 'Aucun filtre appliqué',
|
||||||
|
'query_deprecated' => 'Ce filtre n’est plus valide. La catégorie ou le flux concerné a été supprimé.',
|
||||||
'about' => 'À propos',
|
'about' => 'À propos',
|
||||||
'stats' => 'Statistiques',
|
'stats' => 'Statistiques',
|
||||||
'stats_idle' => 'Flux inactifs',
|
'stats_idle' => 'Flux inactifs',
|
||||||
|
@ -54,11 +57,11 @@ return array (
|
||||||
'stats_entry_per_day_of_week' => 'Par jour de la semaine',
|
'stats_entry_per_day_of_week' => 'Par jour de la semaine',
|
||||||
'stats_entry_per_month' => 'Par mois',
|
'stats_entry_per_month' => 'Par mois',
|
||||||
|
|
||||||
'last_week' => 'La dernière semaine',
|
'last_week' => 'Depuis la semaine dernière',
|
||||||
'last_month' => 'Le dernier mois',
|
'last_month' => 'Depuis le mois dernier',
|
||||||
'last_3_month' => 'Les derniers trois mois',
|
'last_3_month' => 'Depuis les trois derniers mois',
|
||||||
'last_6_month' => 'Les derniers six mois',
|
'last_6_month' => 'Depuis les six derniers mois',
|
||||||
'last_year' => 'La dernière année',
|
'last_year' => 'Depuis l’année dernière',
|
||||||
|
|
||||||
'your_rss_feeds' => 'Vos flux RSS',
|
'your_rss_feeds' => 'Vos flux RSS',
|
||||||
'add_rss_feed' => 'Ajouter un flux RSS',
|
'add_rss_feed' => 'Ajouter un flux RSS',
|
||||||
|
@ -92,6 +95,7 @@ return array (
|
||||||
'rss_view' => 'Flux RSS',
|
'rss_view' => 'Flux RSS',
|
||||||
'show_all_articles' => 'Afficher tous les articles',
|
'show_all_articles' => 'Afficher tous les articles',
|
||||||
'show_not_reads' => 'Afficher les non lus',
|
'show_not_reads' => 'Afficher les non lus',
|
||||||
|
'show_adaptive' => 'Adapter l’affichage',
|
||||||
'show_read' => 'Afficher les lus',
|
'show_read' => 'Afficher les lus',
|
||||||
'show_favorite' => 'Afficher les favoris',
|
'show_favorite' => 'Afficher les favoris',
|
||||||
'show_not_favorite' => 'Afficher tout sauf les favoris',
|
'show_not_favorite' => 'Afficher tout sauf les favoris',
|
||||||
|
@ -152,10 +156,13 @@ return array (
|
||||||
'public' => 'Public',
|
'public' => 'Public',
|
||||||
'invalid_login' => 'L’identifiant est invalide !',
|
'invalid_login' => 'L’identifiant est invalide !',
|
||||||
|
|
||||||
|
'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire <em>%s</em>. Le serveur HTTP doit être capable d’écrire dedans.',
|
||||||
|
|
||||||
// VIEWS
|
// VIEWS
|
||||||
'save' => 'Enregistrer',
|
'save' => 'Enregistrer',
|
||||||
'delete' => 'Supprimer',
|
'delete' => 'Supprimer',
|
||||||
'cancel' => 'Annuler',
|
'cancel' => 'Annuler',
|
||||||
|
'submit' => 'Valider',
|
||||||
|
|
||||||
'back_to_rss_feeds' => '← Retour à vos flux RSS',
|
'back_to_rss_feeds' => '← Retour à vos flux RSS',
|
||||||
'feeds_moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans <em>%s</em>.',
|
'feeds_moved_category_deleted' => 'Lors de la suppression d’une catégorie, ses flux seront automatiquement classés dans <em>%s</em>.',
|
||||||
|
@ -180,6 +187,9 @@ return array (
|
||||||
'auto_share' => 'Partager',
|
'auto_share' => 'Partager',
|
||||||
'auto_share_help' => 'S’il n’y a qu’un mode de partage, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.',
|
'auto_share_help' => 'S’il n’y a qu’un mode de partage, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.',
|
||||||
'focus_search' => 'Accéder à la recherche',
|
'focus_search' => 'Accéder à la recherche',
|
||||||
|
'user_filter' => 'Accéder aux filtres utilisateur',
|
||||||
|
'user_filter_help' => 'S’il n’y a qu’un filtre utilisateur, celui ci est utilisé automatiquement. Sinon ils sont accessibles par leur numéro.',
|
||||||
|
'help' => 'Afficher la documentation',
|
||||||
|
|
||||||
'file_to_import' => 'Fichier à importer<br />(OPML, Json ou Zip)',
|
'file_to_import' => 'Fichier à importer<br />(OPML, Json ou Zip)',
|
||||||
'file_to_import_no_zip' => 'Fichier à importer<br />(OPML ou Json)',
|
'file_to_import_no_zip' => 'Fichier à importer<br />(OPML ou Json)',
|
||||||
|
@ -197,13 +207,15 @@ return array (
|
||||||
|
|
||||||
'informations' => 'Informations',
|
'informations' => 'Informations',
|
||||||
'damn' => 'Arf !',
|
'damn' => 'Arf !',
|
||||||
|
'ok' => 'Ok !',
|
||||||
|
'attention' => 'Attention !',
|
||||||
'feed_in_error' => 'Ce flux a rencontré un problème. Veuillez vérifier qu’il est toujours accessible puis actualisez-le.',
|
'feed_in_error' => 'Ce flux a rencontré un problème. Veuillez vérifier qu’il est toujours accessible puis actualisez-le.',
|
||||||
'feed_empty' => 'Ce flux est vide. Veuillez vérifier qu’il est toujours maintenu.',
|
'feed_empty' => 'Ce flux est vide. Veuillez vérifier qu’il est toujours maintenu.',
|
||||||
'feed_description' => 'Description',
|
'feed_description' => 'Description',
|
||||||
'website_url' => 'URL du site',
|
'website_url' => 'URL du site',
|
||||||
'feed_url' => 'URL du flux',
|
'feed_url' => 'URL du flux',
|
||||||
'articles' => 'articles',
|
'articles' => 'articles',
|
||||||
'number_articles' => 'Nombre d’articles',
|
'number_articles' => '%d articles',
|
||||||
'by_feed' => 'par flux',
|
'by_feed' => 'par flux',
|
||||||
'by_default' => 'Par défaut',
|
'by_default' => 'Par défaut',
|
||||||
'keep_history' => 'Nombre minimum d’articles à conserver',
|
'keep_history' => 'Nombre minimum d’articles à conserver',
|
||||||
|
@ -225,7 +237,7 @@ return array (
|
||||||
'not_yet_implemented' => 'Pas encore implémenté',
|
'not_yet_implemented' => 'Pas encore implémenté',
|
||||||
'access_protected_feeds' => 'La connexion permet d’accéder aux flux protégés par une authentification HTTP.',
|
'access_protected_feeds' => 'La connexion permet d’accéder aux flux protégés par une authentification HTTP.',
|
||||||
'no_selected_feed' => 'Aucun flux sélectionné.',
|
'no_selected_feed' => 'Aucun flux sélectionné.',
|
||||||
'think_to_add' => '<a href="./?c=configure&a=feed">Vous pouvez ajouter des flux</a>.',
|
'think_to_add' => 'Vous pouvez ajouter des flux.',
|
||||||
|
|
||||||
'current_user' => 'Utilisateur actuel',
|
'current_user' => 'Utilisateur actuel',
|
||||||
'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>',
|
'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>',
|
||||||
|
@ -237,7 +249,7 @@ return array (
|
||||||
'unsafe_autologin' => 'Autoriser les connexions automatiques non-sûres au format : ',
|
'unsafe_autologin' => 'Autoriser les connexions automatiques non-sûres au format : ',
|
||||||
'api_enabled' => 'Autoriser l’accès par <abbr>API</abbr> <small>(nécessaire pour les applis mobiles)</small>',
|
'api_enabled' => 'Autoriser l’accès par <abbr>API</abbr> <small>(nécessaire pour les applis mobiles)</small>',
|
||||||
'auth_token' => 'Jeton d’identification',
|
'auth_token' => 'Jeton d’identification',
|
||||||
'explain_token' => 'Permet d’accéder à la sortie RSS de l’utilisateur par défaut sans besoin de s’authentifier.<br /><kbd>%s?output=rss&token=%s</kbd>',
|
'explain_token' => 'Permet d’accéder à la sortie RSS de l’utilisateur par défaut sans besoin de s’authentifier.<br /><kbd>%s?output=rss&token=%s</kbd>',
|
||||||
'login_configuration' => 'Identification',
|
'login_configuration' => 'Identification',
|
||||||
'is_admin' => 'est administrateur',
|
'is_admin' => 'est administrateur',
|
||||||
'auth_type' => 'Méthode d’authentification',
|
'auth_type' => 'Méthode d’authentification',
|
||||||
|
@ -248,6 +260,7 @@ return array (
|
||||||
'users_list' => 'Liste des utilisateurs',
|
'users_list' => 'Liste des utilisateurs',
|
||||||
'create_user' => 'Créer un nouvel utilisateur',
|
'create_user' => 'Créer un nouvel utilisateur',
|
||||||
'username' => 'Nom d’utilisateur',
|
'username' => 'Nom d’utilisateur',
|
||||||
|
'username_admin' => 'Nom d’utilisateur administrateur',
|
||||||
'password' => 'Mot de passe',
|
'password' => 'Mot de passe',
|
||||||
'create' => 'Créer',
|
'create' => 'Créer',
|
||||||
'user_created' => 'L’utilisateur %s a été créé.',
|
'user_created' => 'L’utilisateur %s a été créé.',
|
||||||
|
@ -263,17 +276,21 @@ return array (
|
||||||
'reading_configuration' => 'Lecture',
|
'reading_configuration' => 'Lecture',
|
||||||
'display_configuration' => 'Affichage',
|
'display_configuration' => 'Affichage',
|
||||||
'articles_per_page' => 'Nombre d’articles par page',
|
'articles_per_page' => 'Nombre d’articles par page',
|
||||||
|
'number_divided_when_reader' => 'Divisé par 2 dans la vue de lecture.',
|
||||||
'default_view' => 'Vue par défaut',
|
'default_view' => 'Vue par défaut',
|
||||||
|
'articles_to_display' => 'Articles à afficher',
|
||||||
'sort_order' => 'Ordre de tri',
|
'sort_order' => 'Ordre de tri',
|
||||||
'auto_load_more' => 'Charger les articles suivants en bas de page',
|
'auto_load_more' => 'Charger les articles suivants en bas de page',
|
||||||
'display_articles_unfolded' => 'Afficher les articles dépliés par défaut',
|
'display_articles_unfolded' => 'Afficher les articles dépliés par défaut',
|
||||||
'display_categories_unfolded' => 'Afficher les catégories pliées par défaut',
|
'display_categories_unfolded' => 'Afficher les catégories pliées par défaut',
|
||||||
'hide_read_feeds' => 'Cacher les catégories & flux sans article non-lu (uniquement en affichage “articles non lus”)',
|
'hide_read_feeds' => 'Cacher les catégories & flux sans article non-lu (ne fonctionne pas avec la configuration “Afficher tous les articles”)',
|
||||||
'after_onread' => 'Après “marquer tout comme lu”,',
|
'after_onread' => 'Après “marquer tout comme lu”,',
|
||||||
'jump_next' => 'sauter au prochain voisin non lu (flux ou catégorie)',
|
'jump_next' => 'sauter au prochain voisin non lu (flux ou catégorie)',
|
||||||
'article_icons' => 'Icônes d’article',
|
'article_icons' => 'Icônes d’article',
|
||||||
'top_line' => 'Ligne du haut',
|
'top_line' => 'Ligne du haut',
|
||||||
'bottom_line' => 'Ligne du bas',
|
'bottom_line' => 'Ligne du bas',
|
||||||
|
'html5_notif_timeout' => 'Temps d’affichage de la notification HTML5',
|
||||||
|
'seconds_(0_means_no_timeout)' => 'secondes (0 signifie aucun timeout ) ',
|
||||||
'img_with_lazyload' => 'Utiliser le mode “chargement différé” pour les images',
|
'img_with_lazyload' => 'Utiliser le mode “chargement différé” pour les images',
|
||||||
'sticky_post' => 'Aligner l’article en haut quand il est ouvert',
|
'sticky_post' => 'Aligner l’article en haut quand il est ouvert',
|
||||||
'reading_confirm' => 'Afficher une confirmation lors des actions “marquer tout comme lu”',
|
'reading_confirm' => 'Afficher une confirmation lors des actions “marquer tout comme lu”',
|
||||||
|
@ -351,6 +368,7 @@ return array (
|
||||||
'login_required' => 'Accès protégé par mot de passe :',
|
'login_required' => 'Accès protégé par mot de passe :',
|
||||||
|
|
||||||
'confirm_action' => 'Êtes-vous sûr(e) de vouloir continuer ? Cette action ne peut être annulée !',
|
'confirm_action' => 'Êtes-vous sûr(e) de vouloir continuer ? Cette action ne peut être annulée !',
|
||||||
|
'confirm_action_feed_cat' => 'Êtes-vous sûr(e) de vouloir continuer ? Vous pourriez perdre les favoris et les filtres associés. Cette action ne peut être annulée !',
|
||||||
'notif_title_new_articles' => 'FreshRSS : nouveaux articles !',
|
'notif_title_new_articles' => 'FreshRSS : nouveaux articles !',
|
||||||
'notif_body_new_articles' => 'Il y a \d nouveaux articles à lire sur FreshRSS.',
|
'notif_body_new_articles' => 'Il y a \d nouveaux articles à lire sur FreshRSS.',
|
||||||
|
|
||||||
|
@ -414,4 +432,23 @@ return array (
|
||||||
'stats_entry_per_category' => 'Articles par catégorie',
|
'stats_entry_per_category' => 'Articles par catégorie',
|
||||||
'stats_top_feed' => 'Les dix plus gros flux',
|
'stats_top_feed' => 'Les dix plus gros flux',
|
||||||
'stats_entry_count' => 'Nombre d’articles',
|
'stats_entry_count' => 'Nombre d’articles',
|
||||||
|
'stats_no_idle' => 'Il n’y a aucun flux inactif !',
|
||||||
|
|
||||||
|
'update' => 'Mise à jour',
|
||||||
|
'update_system' => 'Système de mise à jour',
|
||||||
|
'update_check' => 'Vérifier les mises à jour',
|
||||||
|
'update_last' => 'Dernière vérification : %s',
|
||||||
|
'update_can_apply' => 'Une mise à jour est disponible.',
|
||||||
|
'update_apply' => 'Appliquer la mise à jour',
|
||||||
|
'update_server_not_found' => 'Le serveur de mise à jour n’a pas été trouvé. [%s]',
|
||||||
|
'no_update' => 'Aucune mise à jour à appliquer',
|
||||||
|
'update_problem' => 'La mise à jour a rencontré un problème : %s',
|
||||||
|
'update_finished' => 'La mise à jour est terminée !',
|
||||||
|
|
||||||
|
'auth_reset' => 'Réinitialisation de l’authentification',
|
||||||
|
'auth_will_reset' => 'Le système d’authentification va être réinitialisé : un formulaire sera utilisé à la place de Persona.',
|
||||||
|
'auth_not_persona' => 'Seul le système d’authentification Persona peut être réinitialisé.',
|
||||||
|
'auth_no_password_set' => 'Aucun mot de passe administrateur n’a été précisé. Cette fonctionnalité n’est pas disponible.',
|
||||||
|
'auth_form_set' => 'Le formulaire est désormais votre système d’authentification.',
|
||||||
|
'auth_form_not_set' => 'Un problème est survenu lors de la configuration de votre système d’authentification. Veuillez réessayer plus tard.',
|
||||||
);
|
);
|
||||||
|
|
|
@ -42,6 +42,8 @@ return array (
|
||||||
'data_is_ok' => 'Permissions on data directory are good',
|
'data_is_ok' => 'Permissions on data directory are good',
|
||||||
'persona_is_ok' => 'Permissions on Mozilla Persona directory are good',
|
'persona_is_ok' => 'Permissions on Mozilla Persona directory are good',
|
||||||
'file_is_nok' => 'Check permissions on <em>%s</em> directory. HTTP server must have rights to write into',
|
'file_is_nok' => 'Check permissions on <em>%s</em> directory. HTTP server must have rights to write into',
|
||||||
|
'http_referer_is_ok' => 'Your HTTP REFERER is known and corresponds to your server.',
|
||||||
|
'http_referer_is_nok' => 'Please check that you are not altering your HTTP REFERER.',
|
||||||
'fix_errors_before' => 'Fix errors before skip to the next step.',
|
'fix_errors_before' => 'Fix errors before skip to the next step.',
|
||||||
|
|
||||||
'general_conf_is_ok' => 'General configuration has been saved.',
|
'general_conf_is_ok' => 'General configuration has been saved.',
|
||||||
|
|
|
@ -42,6 +42,8 @@ return array (
|
||||||
'data_is_ok' => 'Les droits sur le répertoire de data sont bons',
|
'data_is_ok' => 'Les droits sur le répertoire de data sont bons',
|
||||||
'persona_is_ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons',
|
'persona_is_ok' => 'Les droits sur le répertoire de Mozilla Persona sont bons',
|
||||||
'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire <em>%s</em>. Le serveur HTTP doit être capable d’écrire dedans',
|
'file_is_nok' => 'Veuillez vérifier les droits sur le répertoire <em>%s</em>. Le serveur HTTP doit être capable d’écrire dedans',
|
||||||
|
'http_referer_is_ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.',
|
||||||
|
'http_referer_is_nok' => 'Veuillez vérifier que vous ne modifiez pas votre HTTP REFERER.',
|
||||||
'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.',
|
'fix_errors_before' => 'Veuillez corriger les erreurs avant de passer à l’étape suivante.',
|
||||||
|
|
||||||
'general_conf_is_ok' => 'La configuration générale a été enregistrée.',
|
'general_conf_is_ok' => 'La configuration générale a été enregistrée.',
|
||||||
|
|
|
@ -12,7 +12,7 @@ session_start();
|
||||||
if (isset($_GET['step'])) {
|
if (isset($_GET['step'])) {
|
||||||
define('STEP',(int)$_GET['step']);
|
define('STEP',(int)$_GET['step']);
|
||||||
} else {
|
} else {
|
||||||
define ('STEP', 1);
|
define('STEP', 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
define('SQL_CREATE_DB', 'CREATE DATABASE IF NOT EXISTS %1$s DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;');
|
define('SQL_CREATE_DB', 'CREATE DATABASE IF NOT EXISTS %1$s DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;');
|
||||||
|
@ -32,74 +32,14 @@ if (isset($_SESSION['bd_type'])) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//<updates>
|
function param($key, $default = false) {
|
||||||
define('SQL_BACKUP006', 'RENAME TABLE `%1$scategory` TO `%1$scategory006`, `%1$sfeed` TO `%1$sfeed006`, `%1$sentry` TO `%1$sentry006`;');
|
if (isset($_POST[$key])) {
|
||||||
|
return $_POST[$key];
|
||||||
|
} else {
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
define('SQL_SHOW_COLUMNS_UPDATEv006', 'SHOW columns FROM `%1$sentry006` LIKE "id2";');
|
|
||||||
|
|
||||||
define('SQL_UPDATEv006', '
|
|
||||||
ALTER TABLE `%1$scategory006` ADD id2 SMALLINT;
|
|
||||||
|
|
||||||
SET @i = 0;
|
|
||||||
UPDATE `%1$scategory006` SET id2=(@i:=@i+1) ORDER BY id;
|
|
||||||
|
|
||||||
ALTER TABLE `%1$sfeed006` ADD id2 SMALLINT, ADD category2 SMALLINT;
|
|
||||||
|
|
||||||
SET @i = 0;
|
|
||||||
UPDATE `%1$sfeed006` SET id2=(@i:=@i+1) ORDER BY name;
|
|
||||||
|
|
||||||
UPDATE `%1$sfeed006` f
|
|
||||||
INNER JOIN `%1$scategory006` c ON f.category = c.id
|
|
||||||
SET f.category2 = c.id2;
|
|
||||||
|
|
||||||
INSERT IGNORE INTO `%2$scategory` (name)
|
|
||||||
SELECT name
|
|
||||||
FROM `%1$scategory006`
|
|
||||||
ORDER BY id2;
|
|
||||||
|
|
||||||
INSERT IGNORE INTO `%2$sfeed` (url, category, name, website, description, priority, pathEntries, httpAuth, keep_history)
|
|
||||||
SELECT url, category2, name, website, description, priority, pathEntries, httpAuth, IF(keep_history = 1, -1, -2)
|
|
||||||
FROM `%1$sfeed006`
|
|
||||||
ORDER BY id2;
|
|
||||||
|
|
||||||
ALTER TABLE `%1$sentry006` ADD id2 bigint;
|
|
||||||
|
|
||||||
UPDATE `%1$sentry006` SET id2 = ((date * 1000000) + (rand() * 100000000));
|
|
||||||
|
|
||||||
INSERT IGNORE INTO `%2$sentry` (id, guid, title, author, link, date, is_read, is_favorite, id_feed, tags)
|
|
||||||
SELECT e0.id2, e0.guid, e0.title, e0.author, e0.link, e0.date, e0.is_read, e0.is_favorite, f0.id2, e0.tags
|
|
||||||
FROM `%1$sentry006` e0
|
|
||||||
INNER JOIN `%1$sfeed006` f0 ON e0.id_feed = f0.id;
|
|
||||||
');
|
|
||||||
|
|
||||||
define('SQL_CONVERT_SELECTv006', '
|
|
||||||
SELECT e0.id2, e0.content
|
|
||||||
FROM `%1$sentry006` e0
|
|
||||||
INNER JOIN `%2$sentry` e1 ON e0.id2 = e1.id
|
|
||||||
WHERE e1.content_bin IS NULL');
|
|
||||||
|
|
||||||
define('SQL_CONVERT_UPDATEv006', 'UPDATE `%1$sentry` SET '
|
|
||||||
. (isset($_SESSION['bd_type']) && $_SESSION['bd_type'] === 'mysql' ? 'content_bin=COMPRESS(?)' : 'content=?')
|
|
||||||
. ' WHERE id=?;');
|
|
||||||
|
|
||||||
define('SQL_DROP_BACKUPv006', 'DROP TABLE IF EXISTS `%1$sentry006`, `%1$sfeed006`, `%1$scategory006`;');
|
|
||||||
|
|
||||||
define('SQL_UPDATE_CACHED_VALUES', '
|
|
||||||
UPDATE `%1$sfeed` f
|
|
||||||
INNER JOIN (
|
|
||||||
SELECT e.id_feed,
|
|
||||||
COUNT(CASE WHEN e.is_read = 0 THEN 1 END) AS nbUnreads,
|
|
||||||
COUNT(e.id) AS nbEntries
|
|
||||||
FROM `%1$sentry` e
|
|
||||||
GROUP BY e.id_feed
|
|
||||||
) x ON x.id_feed=f.id
|
|
||||||
SET f.cache_nbEntries=x.nbEntries, f.cache_nbUnreads=x.nbUnreads
|
|
||||||
');
|
|
||||||
|
|
||||||
define('SQL_UPDATE_HISTORYv007b', 'UPDATE `%1$sfeed` SET keep_history = CASE WHEN keep_history = 0 THEN -2 WHEN keep_history = 1 THEN -1 ELSE keep_history END;');
|
|
||||||
|
|
||||||
define('SQL_GET_FEEDS', 'SELECT id, url, website FROM `%1$sfeed`;');
|
|
||||||
//</updates>
|
|
||||||
|
|
||||||
// gestion internationalisation
|
// gestion internationalisation
|
||||||
$translates = array();
|
$translates = array();
|
||||||
|
@ -132,12 +72,14 @@ function getBetterLanguage ($fallback) {
|
||||||
return $fallback;
|
return $fallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function availableLanguages() {
|
function availableLanguages() {
|
||||||
return array(
|
return array(
|
||||||
'en' => 'English',
|
'en' => 'English',
|
||||||
'fr' => 'Français'
|
'fr' => 'Français'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _t($key) {
|
function _t($key) {
|
||||||
global $translates;
|
global $translates;
|
||||||
$translate = $key;
|
$translate = $key;
|
||||||
|
@ -151,6 +93,7 @@ function _t ($key) {
|
||||||
return vsprintf($translate, $args);
|
return vsprintf($translate, $args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*** SAUVEGARDES ***/
|
/*** SAUVEGARDES ***/
|
||||||
function saveLanguage() {
|
function saveLanguage() {
|
||||||
if (!empty($_POST)) {
|
if (!empty($_POST)) {
|
||||||
|
@ -163,32 +106,41 @@ function saveLanguage () {
|
||||||
header('Location: index.php?step=1');
|
header('Location: index.php?step=1');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveStep2() {
|
function saveStep2() {
|
||||||
if (!empty($_POST)) {
|
if (!empty($_POST)) {
|
||||||
if (empty ($_POST['title']) ||
|
$_SESSION['title'] = substr(trim(param('title', _t('freshrss'))), 0, 25);
|
||||||
empty ($_POST['old_entries']) ||
|
$_SESSION['old_entries'] = param('old_entries', 3);
|
||||||
empty ($_POST['auth_type']) ||
|
$_SESSION['auth_type'] = param('auth_type', 'form');
|
||||||
empty ($_POST['default_user'])) {
|
$_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', param('default_user', '')), 0, 16);
|
||||||
|
$_SESSION['mail_login'] = filter_var(param('mail_login', ''), FILTER_VALIDATE_EMAIL);
|
||||||
|
|
||||||
|
$password_plain = param('passwordPlain', false);
|
||||||
|
if ($password_plain !== false) {
|
||||||
|
if (!function_exists('password_hash')) {
|
||||||
|
include_once(LIB_PATH . '/password_compat.php');
|
||||||
|
}
|
||||||
|
$passwordHash = password_hash($password_plain, PASSWORD_BCRYPT, array('cost' => BCRYPT_COST));
|
||||||
|
$passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash); //Compatibility with bcrypt.js
|
||||||
|
$_SESSION['passwordHash'] = $passwordHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($_SESSION['title']) ||
|
||||||
|
empty($_SESSION['old_entries']) ||
|
||||||
|
empty($_SESSION['auth_type']) ||
|
||||||
|
empty($_SESSION['default_user'])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($_SESSION['auth_type'] === 'form' && empty($_SESSION['passwordHash'])) ||
|
||||||
|
($_SESSION['auth_type'] === 'persona' && empty($_SESSION['mail_login']))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$_SESSION['salt'] = sha1(uniqid(mt_rand(), true).implode('', stat(__FILE__)));
|
$_SESSION['salt'] = sha1(uniqid(mt_rand(), true).implode('', stat(__FILE__)));
|
||||||
$_SESSION['title'] = substr(trim($_POST['title']), 0, 25);
|
|
||||||
$_SESSION['old_entries'] = $_POST['old_entries'];
|
|
||||||
if ((!ctype_digit($_SESSION['old_entries'])) ||($_SESSION['old_entries'] < 1)) {
|
if ((!ctype_digit($_SESSION['old_entries'])) ||($_SESSION['old_entries'] < 1)) {
|
||||||
$_SESSION['old_entries'] = 3;
|
$_SESSION['old_entries'] = 3;
|
||||||
}
|
}
|
||||||
$_SESSION['mail_login'] = filter_var($_POST['mail_login'], FILTER_VALIDATE_EMAIL);
|
|
||||||
$_SESSION['default_user'] = substr(preg_replace('/[^a-zA-Z0-9]/', '', $_POST['default_user']), 0, 16);
|
|
||||||
$_SESSION['auth_type'] = $_POST['auth_type'];
|
|
||||||
if (!empty($_POST['passwordPlain'])) {
|
|
||||||
if (!function_exists('password_hash')) {
|
|
||||||
include_once(LIB_PATH . '/password_compat.php');
|
|
||||||
}
|
|
||||||
$passwordHash = password_hash($_POST['passwordPlain'], PASSWORD_BCRYPT, array('cost' => BCRYPT_COST));
|
|
||||||
$passwordHash = preg_replace('/^\$2[xy]\$/', '\$2a\$', $passwordHash); //Compatibility with bcrypt.js
|
|
||||||
$_SESSION['passwordHash'] = $passwordHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
$token = '';
|
$token = '';
|
||||||
if ($_SESSION['mail_login']) {
|
if ($_SESSION['mail_login']) {
|
||||||
|
@ -197,7 +149,7 @@ function saveStep2 () {
|
||||||
|
|
||||||
$config_array = array(
|
$config_array = array(
|
||||||
'language' => $_SESSION['language'],
|
'language' => $_SESSION['language'],
|
||||||
'theme' => $_SESSION['theme'],
|
'theme' => 'Origine',
|
||||||
'old_entries' => $_SESSION['old_entries'],
|
'old_entries' => $_SESSION['old_entries'],
|
||||||
'mail_login' => $_SESSION['mail_login'],
|
'mail_login' => $_SESSION['mail_login'],
|
||||||
'passwordHash' => $_SESSION['passwordHash'],
|
'passwordHash' => $_SESSION['passwordHash'],
|
||||||
|
@ -268,10 +220,6 @@ function saveStep3 () {
|
||||||
@unlink(DATA_PATH . '/config.php'); //To avoid access-rights problems
|
@unlink(DATA_PATH . '/config.php'); //To avoid access-rights problems
|
||||||
file_put_contents(DATA_PATH . '/config.php', "<?php\n return " . var_export($ini_array, true) . ';');
|
file_put_contents(DATA_PATH . '/config.php', "<?php\n return " . var_export($ini_array, true) . ';');
|
||||||
|
|
||||||
if (file_exists(DATA_PATH . '/config.php') && file_exists(DATA_PATH . '/application.ini')) {
|
|
||||||
@unlink(DATA_PATH . '/application.ini'); //v0.6
|
|
||||||
}
|
|
||||||
|
|
||||||
$res = checkBD();
|
$res = checkBD();
|
||||||
|
|
||||||
if ($res) {
|
if ($res) {
|
||||||
|
@ -284,80 +232,6 @@ function saveStep3 () {
|
||||||
invalidateHttpCache();
|
invalidateHttpCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateDatabase($perform = false) {
|
|
||||||
$needs = array('bd_type', 'bd_host', 'bd_base', 'bd_user', 'bd_password', 'bd_prefix', 'bd_prefix_user');
|
|
||||||
foreach ($needs as $need) {
|
|
||||||
if (!isset($_SESSION[$need])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$str = '';
|
|
||||||
switch ($_SESSION['bd_type']) {
|
|
||||||
case 'mysql':
|
|
||||||
$str = 'mysql:host=' . $_SESSION['bd_host'] . ';dbname=' . $_SESSION['bd_base'];
|
|
||||||
$driver_options = array(
|
|
||||||
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
case 'sqlite':
|
|
||||||
return false; //No update for SQLite needed so far
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
|
|
||||||
|
|
||||||
$stm = $c->prepare(SQL_SHOW_TABLES);
|
|
||||||
$stm->execute();
|
|
||||||
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
|
|
||||||
if (!in_array($_SESSION['bd_prefix'] . 'entry006', $res)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = sprintf(SQL_SHOW_COLUMNS_UPDATEv006, $_SESSION['bd_prefix']);
|
|
||||||
$stm = $c->prepare($sql);
|
|
||||||
$stm->execute();
|
|
||||||
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
|
|
||||||
if (!in_array('id2', $res)) {
|
|
||||||
if (!$perform) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
$sql = sprintf(SQL_UPDATEv006, $_SESSION['bd_prefix'], $_SESSION['bd_prefix_user']);
|
|
||||||
$stm = $c->prepare($sql, array(PDO::ATTR_EMULATE_PREPARES => true));
|
|
||||||
$stm->execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = sprintf(SQL_CONVERT_SELECTv006, $_SESSION['bd_prefix'], $_SESSION['bd_prefix_user']);
|
|
||||||
if (!$perform) {
|
|
||||||
$sql .= ' LIMIT 1';
|
|
||||||
}
|
|
||||||
$stm = $c->prepare($sql);
|
|
||||||
$stm->execute();
|
|
||||||
if (!$perform) {
|
|
||||||
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
|
|
||||||
return count($res) > 0;
|
|
||||||
} else {
|
|
||||||
@set_time_limit(300);
|
|
||||||
}
|
|
||||||
|
|
||||||
$c2 = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
|
|
||||||
$sql = sprintf(SQL_CONVERT_UPDATEv006, $_SESSION['bd_prefix_user']);
|
|
||||||
$stm2 = $c2->prepare($sql);
|
|
||||||
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
|
|
||||||
$id = $row['id2'];
|
|
||||||
$content = unserialize(gzinflate(base64_decode($row['content'])));
|
|
||||||
$stm2->execute(array($content, $id));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function newPdo() {
|
function newPdo() {
|
||||||
switch ($_SESSION['bd_type']) {
|
switch ($_SESSION['bd_type']) {
|
||||||
case 'mysql':
|
case 'mysql':
|
||||||
|
@ -378,94 +252,16 @@ function newPdo() {
|
||||||
return new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
|
return new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
function postUpdate() {
|
|
||||||
$c = newPdo();
|
|
||||||
|
|
||||||
if ($_SESSION['bd_type'] !== 'sqlite') { //No update for SQLite needed yet
|
|
||||||
$sql = sprintf(SQL_UPDATE_HISTORYv007b, $_SESSION['bd_prefix_user']);
|
|
||||||
$stm = $c->prepare($sql);
|
|
||||||
$stm->execute();
|
|
||||||
|
|
||||||
$sql = sprintf(SQL_UPDATE_CACHED_VALUES, $_SESSION['bd_prefix_user']);
|
|
||||||
$stm = $c->prepare($sql);
|
|
||||||
$stm->execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
//<favicons>
|
|
||||||
$sql = sprintf(SQL_GET_FEEDS, $_SESSION['bd_prefix_user']);
|
|
||||||
$stm = $c->prepare($sql);
|
|
||||||
$stm->execute();
|
|
||||||
$res = $stm->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
foreach ($res as $feed) {
|
|
||||||
if (empty($feed['url'])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$hash = hash('crc32b', $_SESSION['salt'] . $feed['url']);
|
|
||||||
@file_put_contents(DATA_PATH . '/favicons/' . $hash . '.txt',
|
|
||||||
empty($feed['website']) ? $feed['url'] : $feed['website']);
|
|
||||||
}
|
|
||||||
//</favicons>
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteInstall() {
|
function deleteInstall() {
|
||||||
$res = unlink(DATA_PATH . '/do-install.txt');
|
$res = unlink(DATA_PATH . '/do-install.txt');
|
||||||
if ($res) {
|
|
||||||
|
if (!$res) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
header('Location: index.php');
|
header('Location: index.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
$needs = array('bd_type', 'bd_host', 'bd_base', 'bd_user', 'bd_password', 'bd_prefix');
|
|
||||||
foreach ($needs as $need) {
|
|
||||||
if (!isset($_SESSION[$need])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$c = newPdo();
|
|
||||||
$sql = sprintf(SQL_DROP_BACKUPv006, $_SESSION['bd_prefix']);
|
|
||||||
$stm = $c->prepare($sql);
|
|
||||||
$stm->execute();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function moveOldFiles() {
|
|
||||||
$mvs = array(
|
|
||||||
'/app/configuration/application.ini' => '/data/application.ini', //v0.6
|
|
||||||
'/public/data/Configuration.array.php' => '/data/Configuration.array.php', //v0.6
|
|
||||||
);
|
|
||||||
$ok = true;
|
|
||||||
foreach ($mvs as $fFrom => $fTo) {
|
|
||||||
if (file_exists(FRESHRSS_PATH . $fFrom)) {
|
|
||||||
if (copy(FRESHRSS_PATH . $fFrom, FRESHRSS_PATH . $fTo)) {
|
|
||||||
@unlink(FRESHRSS_PATH . $fFrom);
|
|
||||||
} else {
|
|
||||||
$ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
function delTree($dir) { //http://php.net/rmdir#110489
|
|
||||||
if (!is_dir($dir)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
$files = array_diff(scandir($dir), array('.', '..'));
|
|
||||||
foreach ($files as $file) {
|
|
||||||
$f = $dir . '/' . $file;
|
|
||||||
if (is_dir($f)) {
|
|
||||||
@chmod($f, 0777);
|
|
||||||
delTree($f);
|
|
||||||
}
|
|
||||||
else unlink($f);
|
|
||||||
}
|
|
||||||
return rmdir($dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** VÉRIFICATIONS ***/
|
/*** VÉRIFICATIONS ***/
|
||||||
function checkStep() {
|
function checkStep() {
|
||||||
|
@ -484,86 +280,12 @@ function checkStep () {
|
||||||
}
|
}
|
||||||
$_SESSION['actualize_feeds'] = true;
|
$_SESSION['actualize_feeds'] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkStep0() {
|
function checkStep0() {
|
||||||
moveOldFiles();
|
|
||||||
|
|
||||||
if (file_exists(DATA_PATH . '/config.php')) {
|
|
||||||
$ini_array = include(DATA_PATH . '/config.php');
|
|
||||||
} elseif (file_exists(DATA_PATH . '/application.ini')) { //v0.6
|
|
||||||
$ini_array = parse_ini_file(DATA_PATH . '/application.ini', true);
|
|
||||||
$ini_array['general']['title'] = empty($ini_array['general']['title']) ? '' : stripslashes($ini_array['general']['title']);
|
|
||||||
} else {
|
|
||||||
$ini_array = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ini_array) {
|
|
||||||
$ini_general = isset($ini_array['general']) ? $ini_array['general'] : null;
|
|
||||||
if ($ini_general) {
|
|
||||||
$keys = array('environment', 'salt', 'title', 'default_user', 'allow_anonymous', 'allow_anonymous_refresh', 'auth_type', 'api_enabled', 'unsafe_autologin_enabled');
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
if ((empty($_SESSION[$key])) && isset($ini_general[$key])) {
|
|
||||||
$_SESSION[$key] = $ini_general[$key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$ini_db = isset($ini_array['db']) ? $ini_array['db'] : null;
|
|
||||||
if ($ini_db) {
|
|
||||||
$keys = array('type', 'host', 'user', 'password', 'base', 'prefix');
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
if ((!isset($_SESSION['bd_' . $key])) && isset($ini_db[$key])) {
|
|
||||||
$_SESSION['bd_' . $key] = $ini_db[$key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_SESSION['default_user']) && file_exists(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php')) {
|
|
||||||
$userConfig = include(DATA_PATH . '/' . $_SESSION['default_user'] . '_user.php');
|
|
||||||
} elseif (file_exists(DATA_PATH . '/Configuration.array.php')) {
|
|
||||||
$userConfig = include(DATA_PATH . '/Configuration.array.php'); //v0.6
|
|
||||||
if (empty($_SESSION['auth_type'])) {
|
|
||||||
$_SESSION['auth_type'] = empty($userConfig['mail_login']) ? 'none' : 'persona';
|
|
||||||
}
|
|
||||||
if (!isset($_SESSION['allow_anonymous'])) {
|
|
||||||
$_SESSION['allow_anonymous'] = empty($userConfig['anon_access']) ? false : ($userConfig['anon_access'] === 'yes');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$userConfig = array();
|
|
||||||
}
|
|
||||||
if (empty($_SESSION['auth_type'])) { //v0.7b
|
|
||||||
$_SESSION['auth_type'] = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$keys = array('language', 'theme', 'old_entries', 'mail_login', 'passwordHash');
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
if ((!isset($_SESSION[$key])) && isset($userConfig[$key])) {
|
|
||||||
$_SESSION[$key] = $userConfig[$key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$languages = availableLanguages();
|
$languages = availableLanguages();
|
||||||
$language = isset($_SESSION['language']) &&
|
$language = isset($_SESSION['language']) &&
|
||||||
isset($languages[$_SESSION['language']]);
|
isset($languages[$_SESSION['language']]);
|
||||||
|
|
||||||
if (empty($_SESSION['passwordHash'])) { //v0.7b
|
|
||||||
$_SESSION['passwordHash'] = '';
|
|
||||||
}
|
|
||||||
if (empty($_SESSION['theme'])) {
|
|
||||||
$_SESSION['theme'] = 'Origine';
|
|
||||||
} else {
|
|
||||||
switch (strtolower($_SESSION['theme'])) {
|
|
||||||
case 'default': //v0.7b
|
|
||||||
$_SESSION['theme'] = 'Origine';
|
|
||||||
break;
|
|
||||||
case 'flat-design': //v0.7b
|
|
||||||
$_SESSION['theme'] = 'Flat';
|
|
||||||
break;
|
|
||||||
case 'default_dark': //v0.7b
|
|
||||||
$_SESSION['theme'] = 'Dark';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'language' => $language ? 'ok' : 'ko',
|
'language' => $language ? 'ok' : 'ko',
|
||||||
'all' => $language ? 'ok' : 'ko'
|
'all' => $language ? 'ok' : 'ko'
|
||||||
|
@ -585,6 +307,7 @@ function checkStep1 () {
|
||||||
$log = LOG_PATH && is_writable(LOG_PATH);
|
$log = LOG_PATH && is_writable(LOG_PATH);
|
||||||
$favicons = is_writable(DATA_PATH . '/favicons');
|
$favicons = is_writable(DATA_PATH . '/favicons');
|
||||||
$persona = is_writable(DATA_PATH . '/persona');
|
$persona = is_writable(DATA_PATH . '/persona');
|
||||||
|
$http_referer = is_referer_from_same_domain();
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'php' => $php ? 'ok' : 'ko',
|
'php' => $php ? 'ok' : 'ko',
|
||||||
|
@ -601,31 +324,44 @@ function checkStep1 () {
|
||||||
'log' => $log ? 'ok' : 'ko',
|
'log' => $log ? 'ok' : 'ko',
|
||||||
'favicons' => $favicons ? 'ok' : 'ko',
|
'favicons' => $favicons ? 'ok' : 'ko',
|
||||||
'persona' => $persona ? 'ok' : 'ko',
|
'persona' => $persona ? 'ok' : 'ko',
|
||||||
'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom && $data && $cache && $log && $favicons && $persona ? 'ok' : 'ko'
|
'http_referer' => $http_referer ? 'ok' : 'ko',
|
||||||
|
'all' => $php && $minz && $curl && $pdo && $pcre && $ctype && $dom &&
|
||||||
|
$data && $cache && $log && $favicons && $persona && $http_referer ?
|
||||||
|
'ok' : 'ko'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkStep2() {
|
function checkStep2() {
|
||||||
$conf = !empty($_SESSION['salt']) &&
|
$conf = !empty($_SESSION['title']) &&
|
||||||
!empty($_SESSION['title']) &&
|
|
||||||
!empty($_SESSION['old_entries']) &&
|
!empty($_SESSION['old_entries']) &&
|
||||||
isset($_SESSION['mail_login']) &&
|
isset($_SESSION['mail_login']) &&
|
||||||
!empty($_SESSION['default_user']);
|
!empty($_SESSION['default_user']);
|
||||||
|
|
||||||
|
$form = (
|
||||||
|
isset($_SESSION['auth_type']) &&
|
||||||
|
($_SESSION['auth_type'] != 'form' || !empty($_SESSION['passwordHash']))
|
||||||
|
);
|
||||||
|
|
||||||
|
$persona = (
|
||||||
|
isset($_SESSION['auth_type']) &&
|
||||||
|
($_SESSION['auth_type'] != 'persona' || !empty($_SESSION['mail_login']))
|
||||||
|
);
|
||||||
|
|
||||||
$defaultUser = empty($_POST['default_user']) ? null : $_POST['default_user'];
|
$defaultUser = empty($_POST['default_user']) ? null : $_POST['default_user'];
|
||||||
if ($defaultUser === null) {
|
if ($defaultUser === null) {
|
||||||
$defaultUser = empty($_SESSION['default_user']) ? '' : $_SESSION['default_user'];
|
$defaultUser = empty($_SESSION['default_user']) ? '' : $_SESSION['default_user'];
|
||||||
}
|
}
|
||||||
$data = is_writable(DATA_PATH . '/' . $defaultUser . '_user.php');
|
$data = is_writable(DATA_PATH . '/' . $defaultUser . '_user.php');
|
||||||
if ($data) {
|
|
||||||
@unlink(DATA_PATH . '/Configuration.array.php'); //v0.6
|
|
||||||
}
|
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'conf' => $conf ? 'ok' : 'ko',
|
'conf' => $conf ? 'ok' : 'ko',
|
||||||
|
'form' => $form ? 'ok' : 'ko',
|
||||||
|
'persona' => $persona ? 'ok' : 'ko',
|
||||||
'data' => $data ? 'ok' : 'ko',
|
'data' => $data ? 'ok' : 'ko',
|
||||||
'all' => $conf && $data ? 'ok' : 'ko'
|
'all' => $conf && $form && $persona && $data ? 'ok' : 'ko'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkStep3() {
|
function checkStep3() {
|
||||||
$conf = is_writable(DATA_PATH . '/config.php');
|
$conf = is_writable(DATA_PATH . '/config.php');
|
||||||
|
|
||||||
|
@ -681,16 +417,6 @@ function checkBD () {
|
||||||
|
|
||||||
$c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
|
$c = new PDO($str, $_SESSION['bd_user'], $_SESSION['bd_password'], $driver_options);
|
||||||
|
|
||||||
if ($_SESSION['bd_type'] !== 'sqlite') { //No SQL backup for SQLite
|
|
||||||
$stm = $c->prepare(SQL_SHOW_TABLES);
|
|
||||||
$stm->execute();
|
|
||||||
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
|
|
||||||
if (in_array($_SESSION['bd_prefix'] . 'entry', $res) && !in_array($_SESSION['bd_prefix'] . 'entry006', $res)) {
|
|
||||||
$sql = sprintf(SQL_BACKUP006, $_SESSION['bd_prefix']); //v0.6
|
|
||||||
$res = $c->query($sql); //Backup tables
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined('SQL_CREATE_TABLES')) {
|
if (defined('SQL_CREATE_TABLES')) {
|
||||||
$sql = sprintf(SQL_CREATE_TABLES, $_SESSION['bd_prefix_user'], _t('default_category'));
|
$sql = sprintf(SQL_CREATE_TABLES, $_SESSION['bd_prefix_user'], _t('default_category'));
|
||||||
$stm = $c->prepare($sql);
|
$stm = $c->prepare($sql);
|
||||||
|
@ -831,6 +557,12 @@ function printStep1 () {
|
||||||
<p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', DATA_PATH . '/persona'); ?></p>
|
<p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('file_is_nok', DATA_PATH . '/persona'); ?></p>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php if ($res['http_referer'] == 'ok') { ?>
|
||||||
|
<p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('http_referer_is_ok'); ?></p>
|
||||||
|
<?php } else { ?>
|
||||||
|
<p class="alert alert-error"><span class="alert-head"><?php echo _t('damn'); ?></span> <?php echo _t('http_referer_is_nok'); ?></p>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
<?php if ($res['all'] == 'ok') { ?>
|
<?php if ($res['all'] == 'ok') { ?>
|
||||||
<a class="btn btn-important next-step" href="?step=2"><?php echo _t('next_step'); ?></a>
|
<a class="btn btn-important next-step" href="?step=2"><?php echo _t('next_step'); ?></a>
|
||||||
<?php } else { ?>
|
<?php } else { ?>
|
||||||
|
@ -843,6 +575,8 @@ function printStep2 () {
|
||||||
?>
|
?>
|
||||||
<?php $s2 = checkStep2(); if ($s2['all'] == 'ok') { ?>
|
<?php $s2 = checkStep2(); if ($s2['all'] == 'ok') { ?>
|
||||||
<p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('general_conf_is_ok'); ?></p>
|
<p class="alert alert-success"><span class="alert-head"><?php echo _t('ok'); ?></span> <?php echo _t('general_conf_is_ok'); ?></p>
|
||||||
|
<?php } elseif (!empty($_POST)) { ?>
|
||||||
|
<p class="alert alert-error"><?php echo _t('fix_errors_before'); ?></p>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<form action="index.php?step=2" method="post">
|
<form action="index.php?step=2" method="post">
|
||||||
|
@ -872,14 +606,17 @@ function printStep2 () {
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="group-name" for="auth_type"><?php echo _t('auth_type'); ?></label>
|
<label class="group-name" for="auth_type"><?php echo _t('auth_type'); ?></label>
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<select id="auth_type" name="auth_type" required="required">
|
<select id="auth_type" name="auth_type" required="required" onchange="auth_type_change(true)">
|
||||||
<?php if (!in_array($_SESSION['auth_type'], array('form', 'persona', 'http_auth', 'none'))) { ?>
|
<?php
|
||||||
<option selected="selected"></option>
|
function no_auth($auth_type) {
|
||||||
<?php } ?>
|
return !in_array($auth_type, array('form', 'persona', 'http_auth', 'none'));
|
||||||
<option value="form"<?php echo $_SESSION['auth_type'] === 'form' ? ' selected="selected"' : '', cryptAvailable() ? '' : ' disabled="disabled"'; ?>><?php echo _t('auth_form'); ?></option>
|
}
|
||||||
<option value="persona"<?php echo $_SESSION['auth_type'] === 'persona' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_persona'); ?></option>
|
$auth_type = isset($_SESSION['auth_type']) ? $_SESSION['auth_type'] : '';
|
||||||
<option value="http_auth"<?php echo $_SESSION['auth_type'] === 'http_auth' ? ' selected="selected"' : '', httpAuthUser() == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('http_auth'); ?> (REMOTE_USER = '<?php echo httpAuthUser(); ?>')</option>
|
?>
|
||||||
<option value="none"<?php echo $_SESSION['auth_type'] === 'none' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_none'); ?></option>
|
<option value="form"<?php echo $auth_type === 'form' || no_auth($auth_type) ? ' selected="selected"' : '', cryptAvailable() ? '' : ' disabled="disabled"'; ?>><?php echo _t('auth_form'); ?></option>
|
||||||
|
<option value="persona"<?php echo $auth_type === 'persona' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_persona'); ?></option>
|
||||||
|
<option value="http_auth"<?php echo $auth_type === 'http_auth' ? ' selected="selected"' : '', httpAuthUser() == '' ? ' disabled="disabled"' : ''; ?>><?php echo _t('http_auth'); ?>(REMOTE_USER = '<?php echo httpAuthUser(); ?>')</option>
|
||||||
|
<option value="none"<?php echo $auth_type === 'none' ? ' selected="selected"' : ''; ?>><?php echo _t('auth_none'); ?></option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -887,7 +624,10 @@ function printStep2 () {
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="group-name" for="passwordPlain"><?php echo _t('password_form'); ?></label>
|
<label class="group-name" for="passwordPlain"><?php echo _t('password_form'); ?></label>
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<input type="password" id="passwordPlain" name="passwordPlain" pattern=".{7,}" autocomplete="off" />
|
<div class="stick">
|
||||||
|
<input type="password" id="passwordPlain" name="passwordPlain" pattern=".{7,}" autocomplete="off" <?php echo $auth_type === 'form' ? ' required="required"' : ''; ?> />
|
||||||
|
<a class="btn toggle-password" data-toggle="passwordPlain"><?php echo FreshRSS_Themes::icon('key'); ?></a>
|
||||||
|
</div>
|
||||||
<noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript>
|
<noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -895,11 +635,56 @@ function printStep2 () {
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="group-name" for="mail_login"><?php echo _t('persona_connection_email'); ?></label>
|
<label class="group-name" for="mail_login"><?php echo _t('persona_connection_email'); ?></label>
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<input type="email" id="mail_login" name="mail_login" value="<?php echo isset ($_SESSION['mail_login']) ? $_SESSION['mail_login'] : ''; ?>" placeholder="alice@example.net" />
|
<input type="email" id="mail_login" name="mail_login" value="<?php echo isset($_SESSION['mail_login']) ? $_SESSION['mail_login'] : ''; ?>" placeholder="alice@example.net" <?php echo $auth_type === 'persona' ? ' required="required"' : ''; ?> />
|
||||||
<noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript>
|
<noscript><b><?php echo _t('javascript_should_be_activated'); ?></b></noscript>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function toggle_password() {
|
||||||
|
var button = this;
|
||||||
|
var passwordField = document.getElementById(button.getAttribute('data-toggle'));
|
||||||
|
|
||||||
|
passwordField.setAttribute('type', 'text');
|
||||||
|
button.className += ' active';
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
passwordField.setAttribute('type', 'password');
|
||||||
|
button.className = button.className.replace(/(?:^|\s)active(?!\S)/g , '');
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
toggles = document.getElementsByClassName('toggle-password');
|
||||||
|
for (var i = 0 ; i < toggles.length ; i++) {
|
||||||
|
toggles[i].addEventListener('click', toggle_password);
|
||||||
|
}
|
||||||
|
|
||||||
|
function auth_type_change(focus) {
|
||||||
|
var auth_value = document.getElementById('auth_type').value,
|
||||||
|
password_input = document.getElementById('passwordPlain'),
|
||||||
|
mail_input = document.getElementById('mail_login');
|
||||||
|
|
||||||
|
if (auth_value === 'form') {
|
||||||
|
password_input.required = true;
|
||||||
|
mail_input.required = false;
|
||||||
|
if (focus) {
|
||||||
|
password_input.focus();
|
||||||
|
}
|
||||||
|
} else if (auth_value === 'persona') {
|
||||||
|
password_input.required = false;
|
||||||
|
mail_input.required = true;
|
||||||
|
if (focus) {
|
||||||
|
mail_input.focus();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
password_input.required = false;
|
||||||
|
mail_input.required = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
auth_type_change(false);
|
||||||
|
</script>
|
||||||
|
|
||||||
<div class="form-group form-actions">
|
<div class="form-group form-actions">
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button>
|
<button type="submit" class="btn btn-important"><?php echo _t('save'); ?></button>
|
||||||
|
@ -1001,40 +786,12 @@ function printStep3 () {
|
||||||
|
|
||||||
function printStep4() {
|
function printStep4() {
|
||||||
?>
|
?>
|
||||||
<form action="index.php?step=4" method="post">
|
<p class="alert alert-success"><span class="alert-head"><?php echo _t('congratulations'); ?></span> <?php echo _t('installation_is_ok'); ?></p>
|
||||||
<legend><?php echo _t ('version_update'); ?></legend>
|
<a class="btn btn-important next-step" href="?step=5"><?php echo _t('finish_installation'); ?></a>
|
||||||
|
|
||||||
<?php if (updateDatabase(false)) { ?>
|
|
||||||
<p class="alert alert-warn"><?php echo _t ('update_long'); ?></p>
|
|
||||||
|
|
||||||
<div class="form-group form-actions">
|
|
||||||
<div class="group-controls">
|
|
||||||
<input type="hidden" name="updateDatabase" value="1" />
|
|
||||||
<button type="submit" class="btn btn-important"><?php echo _t ('update_start'); ?></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php } else { ?>
|
|
||||||
<p class="alert alert-warn"><?php echo _t ('update_end'); ?></p>
|
|
||||||
|
|
||||||
<div class="form-group form-actions">
|
|
||||||
<div class="group-controls">
|
|
||||||
<a class="btn btn-important next-step" href="?step=5"><?php echo _t ('next_step'); ?></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
|
||||||
function printStep5() {
|
function printStep5() {
|
||||||
?>
|
|
||||||
<p class="alert alert-success"><span class="alert-head"><?php echo _t ('congratulations'); ?></span> <?php echo _t ('installation_is_ok'); ?></p>
|
|
||||||
<a class="btn btn-important next-step" href="?step=6"><?php echo _t ('finish_installation'); ?></a>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
function printStep6 () {
|
|
||||||
?>
|
?>
|
||||||
<p class="alert alert-error"><span class="alert-head"><?php echo _t('oops'); ?></span> <?php echo _t('install_not_deleted', DATA_PATH . '/do-install.txt'); ?></p>
|
<p class="alert alert-error"><span class="alert-head"><?php echo _t('oops'); ?></span> <?php echo _t('install_not_deleted', DATA_PATH . '/do-install.txt'); ?></p>
|
||||||
<?php
|
<?php
|
||||||
|
@ -1058,14 +815,8 @@ case 3:
|
||||||
saveStep3();
|
saveStep3();
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (!empty($_POST['updateDatabase'])) {
|
|
||||||
updateDatabase(true);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
postUpdate();
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
deleteInstall();
|
deleteInstall();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1076,7 +827,7 @@ case 6:
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="initial-scale=1.0">
|
<meta name="viewport" content="initial-scale=1.0">
|
||||||
<title><?php echo _t('freshrss_installation'); ?></title>
|
<title><?php echo _t('freshrss_installation'); ?></title>
|
||||||
<link rel="stylesheet" type="text/css" media="all" href="../themes/Origine/template.css" />
|
<link rel="stylesheet" type="text/css" media="all" href="../themes/base-theme/template.css" />
|
||||||
<link rel="stylesheet" type="text/css" media="all" href="../themes/Origine/origine.css" />
|
<link rel="stylesheet" type="text/css" media="all" href="../themes/Origine/origine.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -1095,8 +846,7 @@ case 6:
|
||||||
<li class="item<?php echo STEP == 1 ? ' active' : ''; ?>"><a href="?step=1"><?php echo _t('checks'); ?></a></li>
|
<li class="item<?php echo STEP == 1 ? ' active' : ''; ?>"><a href="?step=1"><?php echo _t('checks'); ?></a></li>
|
||||||
<li class="item<?php echo STEP == 2 ? ' active' : ''; ?>"><a href="?step=2"><?php echo _t('general_configuration'); ?></a></li>
|
<li class="item<?php echo STEP == 2 ? ' active' : ''; ?>"><a href="?step=2"><?php echo _t('general_configuration'); ?></a></li>
|
||||||
<li class="item<?php echo STEP == 3 ? ' active' : ''; ?>"><a href="?step=3"><?php echo _t('bdd_configuration'); ?></a></li>
|
<li class="item<?php echo STEP == 3 ? ' active' : ''; ?>"><a href="?step=3"><?php echo _t('bdd_configuration'); ?></a></li>
|
||||||
<li class="item<?php echo STEP == 4 ? ' active' : ''; ?>"><a href="?step=4"><?php echo _t ('version_update'); ?></a></li>
|
<li class="item<?php echo STEP == 4 ? ' active' : ''; ?>"><a href="?step=5"><?php echo _t('this_is_the_end'); ?></a></li>
|
||||||
<li class="item<?php echo STEP == 5 ? ' active' : ''; ?>"><a href="?step=5"><?php echo _t ('this_is_the_end'); ?></a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div class="post">
|
<div class="post">
|
||||||
|
@ -1121,9 +871,6 @@ case 6:
|
||||||
case 5:
|
case 5:
|
||||||
printStep5();
|
printStep5();
|
||||||
break;
|
break;
|
||||||
case 6:
|
|
||||||
printStep6 ();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,25 +1,33 @@
|
||||||
<ul class="nav nav-list aside">
|
<ul class="nav nav-list aside">
|
||||||
<li class="nav-header"><?php echo Minz_Translate::t ('configuration'); ?></li>
|
<li class="nav-header"><?php echo _t('configuration'); ?></li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'display' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'display' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'display'); ?>"><?php echo Minz_Translate::t ('display_configuration'); ?></a>
|
<a href="<?php echo _url('configure', 'display'); ?>"><?php echo _t('display_configuration'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'reading' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'reading' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'reading'); ?>"><?php echo Minz_Translate::t ('reading_configuration'); ?></a>
|
<a href="<?php echo _url('configure', 'reading'); ?>"><?php echo _t('reading_configuration'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'archiving' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'archiving' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'archiving'); ?>"><?php echo Minz_Translate::t ('archiving_configuration'); ?></a>
|
<a href="<?php echo _url('configure', 'archiving'); ?>"><?php echo _t('archiving_configuration'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'sharing' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'sharing' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'sharing'); ?>"><?php echo Minz_Translate::t ('sharing'); ?></a>
|
<a href="<?php echo _url('configure', 'sharing'); ?>"><?php echo _t('sharing'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'shortcut' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'shortcut' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'shortcut'); ?>"><?php echo Minz_Translate::t ('shortcuts'); ?></a>
|
<a href="<?php echo _url('configure', 'shortcut'); ?>"><?php echo _t('shortcuts'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'queries' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'queries' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'queries'); ?>"><?php echo Minz_Translate::t ('queries'); ?></a>
|
<a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('queries'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="separator"></li>
|
<li class="separator"></li>
|
||||||
<li class="item<?php echo Minz_Request::actionName () == 'users' ? ' active' : ''; ?>">
|
<li class="item<?php echo Minz_Request::actionName() === 'users' ? ' active' : ''; ?>">
|
||||||
<a href="<?php echo _url ('configure', 'users'); ?>"><?php echo Minz_Translate::t ('users'); ?></a>
|
<a href="<?php echo _url('configure', 'users'); ?>"><?php echo _t('users'); ?></a>
|
||||||
</li>
|
</li>
|
||||||
|
<?php
|
||||||
|
$current_user = Minz_Session::param('currentUser', '');
|
||||||
|
if (Minz_Configuration::isAdmin($current_user)) {
|
||||||
|
?>
|
||||||
|
<li class="item<?php echo Minz_Request::controllerName() === 'update' ? ' active' : ''; ?>">
|
||||||
|
<a href="<?php echo _url('update', 'index'); ?>"><?php echo _t('update'); ?></a>
|
||||||
|
</li>
|
||||||
|
<?php } ?>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
<div class="aside aside_flux<?php if ($this->conf->hide_read_feeds && ($this->state & FreshRSS_Entry::STATE_NOT_READ) && !($this->state & FreshRSS_Entry::STATE_READ)) echo ' state_unread'; ?>" id="aside_flux">
|
<div class="aside aside_flux<?php if ($this->conf->hide_read_feeds && ($this->state & FreshRSS_Entry::STATE_NOT_READ) && !($this->state & FreshRSS_Entry::STATE_READ)) echo ' state_unread'; ?>" id="aside_flux">
|
||||||
<a class="toggle_aside" href="#close"><?php echo FreshRSS_Themes::icon('close'); ?></a>
|
<a class="toggle_aside" href="#close"><?php echo _i('close'); ?></a>
|
||||||
|
|
||||||
<ul class="categories">
|
<ul class="categories">
|
||||||
<?php if ($this->loginOk) { ?>
|
<?php if ($this->loginOk) { ?>
|
||||||
|
<form id="mark-read-aside" method="post" style="display: none"></form>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<div class="stick">
|
<div class="stick configure-feeds">
|
||||||
<a class="btn btn-important" href="<?php echo _url ('configure', 'feed'); ?>"><?php echo Minz_Translate::t ('subscription_management'); ?></a>
|
<a class="btn btn-important" href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('subscription_management'); ?></a>
|
||||||
<a class="btn btn-important" href="<?php echo _url ('configure', 'categorize'); ?>" title="<?php echo Minz_Translate::t ('categories_management'); ?>"><?php echo FreshRSS_Themes::icon('category-white'); ?></a>
|
<a class="btn btn-important" href="<?php echo _url('configure', 'categorize'); ?>" title="<?php echo _t('categories_management'); ?>"><?php echo _i('category-white'); ?></a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<?php } elseif (Minz_Configuration::needsLogin()) { ?>
|
<?php } elseif (Minz_Configuration::needsLogin()) { ?>
|
||||||
<li><a href="<?php echo _url ('index', 'about'); ?>"><?php echo Minz_Translate::t ('about_freshrss'); ?></a></li>
|
<li><a href="<?php echo _url('index', 'about'); ?>"><?php echo _t('about_freshrss'); ?></a></li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
@ -22,8 +24,8 @@
|
||||||
<li>
|
<li>
|
||||||
<div class="category all<?php echo $this->get_c == 'a' ? ' active' : ''; ?>">
|
<div class="category all<?php echo $this->get_c == 'a' ? ' active' : ''; ?>">
|
||||||
<a data-unread="<?php echo formatNumber($this->nb_not_read); ?>" class="btn<?php echo $this->get_c == 'a' ? ' active' : ''; ?>" href="<?php echo Minz_Url::display($arUrl); ?>">
|
<a data-unread="<?php echo formatNumber($this->nb_not_read); ?>" class="btn<?php echo $this->get_c == 'a' ? ' active' : ''; ?>" href="<?php echo Minz_Url::display($arUrl); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('all'); ?>
|
<?php echo _i('all'); ?>
|
||||||
<?php echo Minz_Translate::t ('main_stream'); ?>
|
<?php echo _t('main_stream'); ?>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
@ -31,8 +33,8 @@
|
||||||
<li>
|
<li>
|
||||||
<div class="category favorites<?php echo $this->get_c == 's' ? ' active' : ''; ?>">
|
<div class="category favorites<?php echo $this->get_c == 's' ? ' active' : ''; ?>">
|
||||||
<a data-unread="<?php echo formatNumber($this->nb_favorites['unread']); ?>" class="btn<?php echo $this->get_c == 's' ? ' active' : ''; ?>" href="<?php $arUrl['params']['get'] = 's'; echo Minz_Url::display($arUrl); ?>">
|
<a data-unread="<?php echo formatNumber($this->nb_favorites['unread']); ?>" class="btn<?php echo $this->get_c == 's' ? ' active' : ''; ?>" href="<?php $arUrl['params']['get'] = 's'; echo Minz_Url::display($arUrl); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('bookmark'); ?>
|
<?php echo _i('bookmark'); ?>
|
||||||
<?php echo Minz_Translate::t('favorite_feeds', formatNumber($this->nb_favorites['all'])); ?>
|
<?php echo _t('favorite_feeds', formatNumber($this->nb_favorites['all'])); ?>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
@ -42,21 +44,19 @@
|
||||||
$feeds = $cat->feeds();
|
$feeds = $cat->feeds();
|
||||||
if (!empty($feeds)) {
|
if (!empty($feeds)) {
|
||||||
$c_active = false;
|
$c_active = false;
|
||||||
if ($this->conf->display_categories) {
|
$c_show = false;
|
||||||
if ($this->get_c == $cat->id () && $this->get_f) {
|
|
||||||
$c_active = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($this->get_c == $cat->id()) {
|
if ($this->get_c == $cat->id()) {
|
||||||
$c_active = true;
|
$c_active = true;
|
||||||
|
if (!$this->conf->display_categories || $this->get_f) {
|
||||||
|
$c_show = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?><li data-unread="<?php echo $cat->nbNotRead(); ?>"<?php if ($c_active) echo ' class="active"'; ?>><?php
|
?><li data-unread="<?php echo $cat->nbNotRead(); ?>"<?php if ($c_active) echo ' class="active"'; ?>><?php
|
||||||
?><div class="category stick<?php echo $c_active ? ' active' : ''; ?>"><?php
|
?><div class="category stick<?php echo $c_active ? ' active' : ''; ?>"><?php
|
||||||
?><a data-unread="<?php echo formatNumber($cat->nbNotRead()); ?>" class="btn<?php echo $c_active ? ' active' : ''; ?>" href="<?php $arUrl['params']['get'] = 'c_' . $cat->id(); echo Minz_Url::display($arUrl); ?>"><?php echo $cat->name(); ?></a><?php
|
?><a data-unread="<?php echo formatNumber($cat->nbNotRead()); ?>" class="btn<?php echo $c_active ? ' active' : ''; ?>" href="<?php $arUrl['params']['get'] = 'c_' . $cat->id(); echo Minz_Url::display($arUrl); ?>"><?php echo $cat->name(); ?></a><?php
|
||||||
?><a class="btn dropdown-toggle" href="#"><?php echo FreshRSS_Themes::icon($c_active ? 'up' : 'down'); ?></a><?php
|
?><a class="btn dropdown-toggle" href="#"><?php echo _i($c_show ? 'up' : 'down'); ?></a><?php
|
||||||
?></div><?php
|
?></div><?php
|
||||||
?><ul class="feeds<?php echo $c_active ? ' active' : ''; ?>"><?php
|
?><ul class="feeds<?php echo $c_show ? ' active' : ''; ?>"><?php
|
||||||
foreach ($feeds as $feed) {
|
foreach ($feeds as $feed) {
|
||||||
$feed_id = $feed->id();
|
$feed_id = $feed->id();
|
||||||
$nbEntries = $feed->nbEntries();
|
$nbEntries = $feed->nbEntries();
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
?><li id="f_<?php echo $feed_id; ?>" class="item<?php echo $f_active ? ' active' : ''; ?><?php echo $feed->inError() ? ' error' : ''; ?><?php echo $nbEntries == 0 ? ' empty' : ''; ?>" data-unread="<?php echo $feed->nbNotRead(); ?>"><?php
|
?><li id="f_<?php echo $feed_id; ?>" class="item<?php echo $f_active ? ' active' : ''; ?><?php echo $feed->inError() ? ' error' : ''; ?><?php echo $nbEntries == 0 ? ' empty' : ''; ?>" data-unread="<?php echo $feed->nbNotRead(); ?>"><?php
|
||||||
?><div class="dropdown"><?php
|
?><div class="dropdown"><?php
|
||||||
?><div class="dropdown-target"></div><?php
|
?><div class="dropdown-target"></div><?php
|
||||||
?><a class="dropdown-toggle" data-fweb="<?php echo $feed->website (); ?>"><?php echo FreshRSS_Themes::icon('configure'); ?></a><?php
|
?><a class="dropdown-toggle" data-fweb="<?php echo $feed->website(); ?>"><?php echo _i('configure'); ?></a><?php
|
||||||
/* feed_config_template */
|
/* feed_config_template */
|
||||||
?></div><?php
|
?></div><?php
|
||||||
?> <img class="favicon" src="<?php echo $feed->favicon(); ?>" alt="✇" /> <?php
|
?> <img class="favicon" src="<?php echo $feed->favicon(); ?>" alt="✇" /> <?php
|
||||||
|
@ -82,14 +82,22 @@
|
||||||
<script id="feed_config_template" type="text/html">
|
<script id="feed_config_template" type="text/html">
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li class="dropdown-close"><a href="#close">❌</a></li>
|
<li class="dropdown-close"><a href="#close">❌</a></li>
|
||||||
<li class="item"><a href="<?php echo _url ('index', 'index', 'get', 'f_!!!!!!'); ?>"><?php echo Minz_Translate::t ('filter'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('index', 'index', 'get', 'f_!!!!!!'); ?>"><?php echo _t('filter'); ?></a></li>
|
||||||
<li class="item"><a href="<?php echo _url ('stats', 'repartition', 'id', '!!!!!!'); ?>"><?php echo Minz_Translate::t ('stats'); ?></a></li>
|
<?php if ($this->loginOk) { ?>
|
||||||
<li class="item"><a target="_blank" href="http://example.net/"><?php echo Minz_Translate::t ('see_website'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('stats', 'repartition', 'id', '!!!!!!'); ?>"><?php echo _t('stats'); ?></a></li>
|
||||||
|
<?php } ?>
|
||||||
|
<li class="item"><a target="_blank" href="http://example.net/"><?php echo _t('see_website'); ?></a></li>
|
||||||
<?php if ($this->loginOk) { ?>
|
<?php if ($this->loginOk) { ?>
|
||||||
<li class="separator"></li>
|
<li class="separator"></li>
|
||||||
<li class="item"><a href="<?php echo _url ('configure', 'feed', 'id', '!!!!!!'); ?>"><?php echo Minz_Translate::t ('administration'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('configure', 'feed', 'id', '!!!!!!'); ?>"><?php echo _t('administration'); ?></a></li>
|
||||||
<li class="item"><a href="<?php echo _url ('feed', 'actualize', 'id', '!!!!!!'); ?>"><?php echo Minz_Translate::t ('actualize'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('feed', 'actualize', 'id', '!!!!!!'); ?>"><?php echo _t('actualize'); ?></a></li>
|
||||||
<li class="item"><a href="<?php echo _url ('entry', 'read', 'get', 'f_!!!!!!'); ?>"><?php echo Minz_Translate::t ('mark_read'); ?></a></li>
|
<li class="item">
|
||||||
|
<?php $confirm = $this->conf->reading_confirm ? 'confirm' : ''; ?>
|
||||||
|
<button class="read_all as-link <?php echo $confirm; ?>"
|
||||||
|
form="mark-read-aside"
|
||||||
|
formaction="<?php echo _url('entry', 'read', 'get', 'f_!!!!!!'); ?>"
|
||||||
|
type="submit"><?php echo _t('mark_read'); ?></button>
|
||||||
|
</li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</ul>
|
</ul>
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -75,6 +75,12 @@ if (Minz_Configuration::canLogIn()) {
|
||||||
<li class="item"><a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('queries'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('configure', 'queries'); ?>"><?php echo _t('queries'); ?></a></li>
|
||||||
<li class="separator"></li>
|
<li class="separator"></li>
|
||||||
<li class="item"><a href="<?php echo _url('configure', 'users'); ?>"><?php echo _t('users'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('configure', 'users'); ?>"><?php echo _t('users'); ?></a></li>
|
||||||
|
<?php
|
||||||
|
$current_user = Minz_Session::param('currentUser', '');
|
||||||
|
if (Minz_Configuration::isAdmin($current_user)) {
|
||||||
|
?>
|
||||||
|
<li class="item"><a href="<?php echo _url('update', 'index'); ?>"><?php echo _t('update'); ?></a></li>
|
||||||
|
<?php } ?>
|
||||||
<li class="separator"></li>
|
<li class="separator"></li>
|
||||||
<li class="item"><a href="<?php echo _url('stats', 'index'); ?>"><?php echo _t('stats'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('stats', 'index'); ?>"><?php echo _t('stats'); ?></a></li>
|
||||||
<li class="item"><a href="<?php echo _url('index', 'logs'); ?>"><?php echo _t('logs'); ?></a></li>
|
<li class="item"><a href="<?php echo _url('index', 'logs'); ?>"><?php echo _t('logs'); ?></a></li>
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
if (!empty($this->nextId)) {
|
if (!empty($this->nextId)) {
|
||||||
$params = Minz_Request::params();
|
$params = Minz_Request::params();
|
||||||
$params['next'] = $this->nextId;
|
$params['next'] = $this->nextId;
|
||||||
|
$params['ajax'] = 1;
|
||||||
?>
|
?>
|
||||||
<link id="prefetch" rel="next prefetch" href="<?php echo Minz_Url::display(array('c' => Minz_Request::controllerName(), 'a' => Minz_Request::actionName(), 'params' => $params)); ?>" />
|
<link id="prefetch" rel="next prefetch" href="<?php echo Minz_Url::display(array('c' => Minz_Request::controllerName(), 'a' => Minz_Request::actionName(), 'params' => $params)); ?>" />
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
?>
|
?>
|
||||||
<div class="nav_menu">
|
<div class="nav_menu">
|
||||||
<?php if ($actual_view === 'normal') { ?>
|
<?php if ($actual_view === 'normal') { ?>
|
||||||
<a class="btn toggle_aside" href="#aside_flux"><?php echo FreshRSS_Themes::icon('category'); ?></a>
|
<a class="btn toggle_aside" href="#aside_flux"><?php echo _i('category'); ?></a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php if ($this->loginOk) { ?>
|
<?php if ($this->loginOk) { ?>
|
||||||
<div class="stick">
|
<div id="nav_menu_actions" class="stick">
|
||||||
<?php
|
<?php
|
||||||
$url_state = $this->url;
|
$url_state = $this->url;
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@
|
||||||
class="btn <?php echo $class; ?>"
|
class="btn <?php echo $class; ?>"
|
||||||
aria-checked="<?php echo $checked; ?>"
|
aria-checked="<?php echo $checked; ?>"
|
||||||
href="<?php echo Minz_Url::display($url_state); ?>"
|
href="<?php echo Minz_Url::display($url_state); ?>"
|
||||||
title="<?php echo Minz_Translate::t ('show_read'); ?>">
|
title="<?php echo _t('show_read'); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('read'); ?>
|
<?php echo _i('read'); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
@ -44,12 +44,12 @@
|
||||||
class="btn <?php echo $class; ?>"
|
class="btn <?php echo $class; ?>"
|
||||||
aria-checked="<?php echo $checked; ?>"
|
aria-checked="<?php echo $checked; ?>"
|
||||||
href="<?php echo Minz_Url::display($url_state); ?>"
|
href="<?php echo Minz_Url::display($url_state); ?>"
|
||||||
title="<?php echo Minz_Translate::t ('show_not_reads'); ?>">
|
title="<?php echo _t('show_not_reads'); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('unread'); ?>
|
<?php echo _i('unread'); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
if ($this->state & FreshRSS_Entry::STATE_FAVORITE) {
|
if ($this->state & FreshRSS_Entry::STATE_FAVORITE || $this->get_c == 's') {
|
||||||
$url_state['params']['state'] = $this->state & ~FreshRSS_Entry::STATE_FAVORITE;
|
$url_state['params']['state'] = $this->state & ~FreshRSS_Entry::STATE_FAVORITE;
|
||||||
$checked = 'true';
|
$checked = 'true';
|
||||||
$class = 'active';
|
$class = 'active';
|
||||||
|
@ -63,8 +63,8 @@
|
||||||
class="btn <?php echo $class; ?>"
|
class="btn <?php echo $class; ?>"
|
||||||
aria-checked="<?php echo $checked; ?>"
|
aria-checked="<?php echo $checked; ?>"
|
||||||
href="<?php echo Minz_Url::display($url_state); ?>"
|
href="<?php echo Minz_Url::display($url_state); ?>"
|
||||||
title="<?php echo Minz_Translate::t ('show_favorite'); ?>">
|
title="<?php echo _t('show_favorite'); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('starred'); ?>
|
<?php echo _i('starred'); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
@ -82,21 +82,24 @@
|
||||||
class="btn <?php echo $class; ?>"
|
class="btn <?php echo $class; ?>"
|
||||||
aria-checked="<?php echo $checked; ?>"
|
aria-checked="<?php echo $checked; ?>"
|
||||||
href="<?php echo Minz_Url::display($url_state); ?>"
|
href="<?php echo Minz_Url::display($url_state); ?>"
|
||||||
title="<?php echo Minz_Translate::t ('show_not_favorite'); ?>">
|
title="<?php echo _t('show_not_favorite'); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('non-starred'); ?>
|
<?php echo _i('non-starred'); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<div id="dropdown-query" class="dropdown-target"></div>
|
<div id="dropdown-query" class="dropdown-target"></div>
|
||||||
|
|
||||||
<a class="dropdown-toggle btn" href="#dropdown-query"><?php echo FreshRSS_Themes::icon('down'); ?></a>
|
<a class="dropdown-toggle btn" href="#dropdown-query"><?php echo _i('down'); ?></a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li class="dropdown-close"><a href="#close">❌</a></li>
|
<li class="dropdown-close"><a href="#close">❌</a></li>
|
||||||
|
|
||||||
<li class="dropdown-header"><?php echo Minz_Translate::t('queries'); ?> <a class="no-mobile" href="<?php echo _url('configure', 'queries'); ?>"><?php echo FreshRSS_Themes::icon('configure'); ?></a></li>
|
<li class="dropdown-header">
|
||||||
|
<?php echo _t('queries'); ?>
|
||||||
|
<a class="no-mobile" href="<?php echo _url('configure', 'queries'); ?>"><?php echo _i('configure'); ?></a>
|
||||||
|
</li>
|
||||||
|
|
||||||
<?php foreach ($this->conf->queries as $query) { ?>
|
<?php foreach ($this->conf->queries as $query) { ?>
|
||||||
<li class="item">
|
<li class="item query">
|
||||||
<a href="<?php echo $query['url']; ?>"><?php echo $query['name']; ?></a>
|
<a href="<?php echo $query['url']; ?>"><?php echo $query['name']; ?></a>
|
||||||
</li>
|
</li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
@ -110,26 +113,26 @@
|
||||||
$url_query['c'] = 'configure';
|
$url_query['c'] = 'configure';
|
||||||
$url_query['a'] = 'addQuery';
|
$url_query['a'] = 'addQuery';
|
||||||
?>
|
?>
|
||||||
<li class="item no-mobile"><a href="<?php echo Minz_Url::display($url_query); ?>"><?php echo FreshRSS_Themes::icon('bookmark-add'); ?> <?php echo Minz_Translate::t('add_query'); ?></a></li>
|
<li class="item no-mobile"><a href="<?php echo Minz_Url::display($url_query); ?>"><?php echo _i('bookmark-add'); ?> <?php echo _t('add_query'); ?></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
$get = false;
|
$get = false;
|
||||||
$string_mark = Minz_Translate::t ('mark_all_read');
|
$string_mark = _t('mark_all_read');
|
||||||
if ($this->get_f) {
|
if ($this->get_f) {
|
||||||
$get = 'f_' . $this->get_f;
|
$get = 'f_' . $this->get_f;
|
||||||
$string_mark = Minz_Translate::t ('mark_feed_read');
|
$string_mark = _t('mark_feed_read');
|
||||||
} elseif ($this->get_c && $this->get_c != 'a') {
|
} elseif ($this->get_c && $this->get_c != 'a') {
|
||||||
if ($this->get_c === 's') {
|
if ($this->get_c === 's') {
|
||||||
$get = 's';
|
$get = 's';
|
||||||
} else {
|
} else {
|
||||||
$get = 'c_' . $this->get_c;
|
$get = 'c_' . $this->get_c;
|
||||||
}
|
}
|
||||||
$string_mark = Minz_Translate::t ('mark_cat_read');
|
$string_mark = _t('mark_cat_read');
|
||||||
}
|
}
|
||||||
$nextGet = $get;
|
$nextGet = $get;
|
||||||
if ($this->conf->onread_jump_next && (strlen ($get) > 2)) {
|
if ($this->conf->onread_jump_next && strlen($get) > 2) {
|
||||||
$anotherUnreadId = '';
|
$anotherUnreadId = '';
|
||||||
$foundCurrent = false;
|
$foundCurrent = false;
|
||||||
switch ($get[0]) {
|
switch ($get[0]) {
|
||||||
|
@ -177,30 +180,54 @@
|
||||||
|
|
||||||
$arUrl = array('c' => 'entry', 'a' => 'read', 'params' => array('get' => $get, 'nextGet' => $nextGet, 'idMax' => $idMax));
|
$arUrl = array('c' => 'entry', 'a' => 'read', 'params' => array('get' => $get, 'nextGet' => $nextGet, 'idMax' => $idMax));
|
||||||
$output = Minz_Request::param('output', '');
|
$output = Minz_Request::param('output', '');
|
||||||
if (($output != '') && ($this->conf->view_mode !== $output)) {
|
if ($output != '' && $this->conf->view_mode !== $output) {
|
||||||
$arUrl['params']['output'] = $output;
|
$arUrl['params']['output'] = $output;
|
||||||
}
|
}
|
||||||
$markReadUrl = Minz_Url::display($arUrl);
|
$markReadUrl = Minz_Url::display($arUrl);
|
||||||
Minz_Session::_param('markReadUrl', $markReadUrl);
|
Minz_Session::_param('markReadUrl', $markReadUrl);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<form id="mark-read-menu" method="post" style="display: none"></form>
|
||||||
|
|
||||||
<div class="stick" id="nav_menu_read_all">
|
<div class="stick" id="nav_menu_read_all">
|
||||||
<a class="read_all btn<?php if ($this->conf->reading_confirm) {echo ' confirm';} ?>" href="<?php echo $markReadUrl; ?>"><?php echo Minz_Translate::t ('mark_read'); ?></a>
|
<?php $confirm = $this->conf->reading_confirm ? 'confirm' : ''; ?>
|
||||||
|
<button class="read_all btn <?php echo $confirm; ?>"
|
||||||
|
form="mark-read-menu"
|
||||||
|
formaction="<?php echo $markReadUrl; ?>"
|
||||||
|
type="submit"><?php echo _t('mark_read'); ?></button>
|
||||||
|
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<div id="dropdown-read" class="dropdown-target"></div>
|
<div id="dropdown-read" class="dropdown-target"></div>
|
||||||
|
|
||||||
<a class="dropdown-toggle btn" href="#dropdown-read"><?php echo FreshRSS_Themes::icon('down'); ?></a>
|
<a class="dropdown-toggle btn" href="#dropdown-read"><?php echo _i('down'); ?></a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li class="dropdown-close"><a href="#close">❌</a></li>
|
<li class="dropdown-close"><a href="#close">❌</a></li>
|
||||||
|
|
||||||
<li class="item"><a href="<?php echo $markReadUrl; ?>"><?php echo $string_mark; ?></a></li>
|
<li class="item">
|
||||||
|
<button class="as-link <?php echo $confirm; ?>"
|
||||||
|
form="mark-read-menu"
|
||||||
|
formaction="<?php echo $markReadUrl; ?>"
|
||||||
|
type="submit"><?php echo $string_mark; ?></button>
|
||||||
|
</li>
|
||||||
<li class="separator"></li>
|
<li class="separator"></li>
|
||||||
<?php
|
<?php
|
||||||
$today = $this->today;
|
$mark_before_today = $arUrl;
|
||||||
$one_week = $today - 604800;
|
$mark_before_today['params']['idMax'] = $this->today . '000000';
|
||||||
|
$mark_before_one_week = $arUrl;
|
||||||
|
$mark_before_one_week['params']['idMax'] = ($this->today - 604800) . '000000';
|
||||||
?>
|
?>
|
||||||
<li class="item"><a href="<?php echo _url ('entry', 'read', 'is_read', 1, 'get', $get, 'idMax', $today . '000000'); ?>"><?php echo Minz_Translate::t ('before_one_day'); ?></a></li>
|
<li class="item">
|
||||||
<li class="item"><a href="<?php echo _url ('entry', 'read', 'is_read', 1, 'get', $get, 'idMax', $one_week . '000000'); ?>"><?php echo Minz_Translate::t ('before_one_week'); ?></a></li>
|
<button class="as-link <?php echo $confirm; ?>"
|
||||||
|
form="mark-read-menu"
|
||||||
|
formaction="<?php echo Minz_Url::display($mark_before_today); ?>"
|
||||||
|
type="submit"><?php echo _t('before_one_day'); ?></button>
|
||||||
|
</li>
|
||||||
|
<li class="item">
|
||||||
|
<button class="as-link <?php echo $confirm; ?>"
|
||||||
|
form="mark-read-menu"
|
||||||
|
formaction="<?php echo Minz_Url::display($mark_before_one_week); ?>"
|
||||||
|
type="submit"><?php echo _t('before_one_week'); ?></button>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -209,18 +236,18 @@
|
||||||
<?php $url_output = $this->url; ?>
|
<?php $url_output = $this->url; ?>
|
||||||
<div class="stick" id="nav_menu_views">
|
<div class="stick" id="nav_menu_views">
|
||||||
<?php $url_output['params']['output'] = 'normal'; ?>
|
<?php $url_output['params']['output'] = 'normal'; ?>
|
||||||
<a class="view_normal btn <?php echo $actual_view == 'normal'? 'active' : ''; ?>" title="<?php echo Minz_Translate::t('normal_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
<a class="view_normal btn <?php echo $actual_view == 'normal'? 'active' : ''; ?>" title="<?php echo _t('normal_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon("view-normal"); ?>
|
<?php echo _i("view-normal"); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php $url_output['params']['output'] = 'global'; ?>
|
<?php $url_output['params']['output'] = 'global'; ?>
|
||||||
<a class="view_global btn <?php echo $actual_view == 'global'? 'active' : ''; ?>" title="<?php echo Minz_Translate::t('global_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
<a class="view_global btn <?php echo $actual_view == 'global'? 'active' : ''; ?>" title="<?php echo _t('global_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon("view-global"); ?>
|
<?php echo _i("view-global"); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php $url_output['params']['output'] = 'reader'; ?>
|
<?php $url_output['params']['output'] = 'reader'; ?>
|
||||||
<a class="view_reader btn <?php echo $actual_view == 'reader'? 'active' : ''; ?>" title="<?php echo Minz_Translate::t('reader_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
<a class="view_reader btn <?php echo $actual_view == 'reader'? 'active' : ''; ?>" title="<?php echo _t('reader_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon("view-reader"); ?>
|
<?php echo _i("view-reader"); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
@ -229,15 +256,15 @@
|
||||||
$url_output['params']['token'] = $this->conf->token;
|
$url_output['params']['token'] = $this->conf->token;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<a class="view_rss btn" target="_blank" title="<?php echo Minz_Translate::t ('rss_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
<a class="view_rss btn" target="_blank" title="<?php echo _t('rss_view'); ?>" href="<?php echo Minz_Url::display($url_output); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('rss'); ?>
|
<?php echo _i('rss'); ?>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="item search">
|
<div class="item search">
|
||||||
<form action="<?php echo _url('index', 'index'); ?>" method="get">
|
<form action="<?php echo _url('index', 'index'); ?>" method="get">
|
||||||
<?php $search = Minz_Request::param('search', ''); ?>
|
<?php $search = Minz_Request::param('search', ''); ?>
|
||||||
<input type="search" name="search" class="extend" value="<?php echo $search; ?>" placeholder="<?php echo Minz_Translate::t ('search_short'); ?>" />
|
<input type="search" name="search" class="extend" value="<?php echo $search; ?>" placeholder="<?php echo _t('search_short'); ?>" />
|
||||||
|
|
||||||
<?php $get = Minz_Request::param('get', ''); ?>
|
<?php $get = Minz_Request::param('get', ''); ?>
|
||||||
<?php if($get != '') { ?>
|
<?php if($get != '') { ?>
|
||||||
|
@ -269,11 +296,11 @@
|
||||||
$url_order = $this->url;
|
$url_order = $this->url;
|
||||||
$url_order['params']['order'] = $order;
|
$url_order['params']['order'] = $order;
|
||||||
?>
|
?>
|
||||||
<a class="btn" href="<?php echo Minz_Url::display ($url_order); ?>" title="<?php echo Minz_Translate::t ($title); ?>">
|
<a id="toggle-order" class="btn" href="<?php echo Minz_Url::display($url_order); ?>" title="<?php echo _t($title); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon($icon); ?>
|
<?php echo _i($icon); ?>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<?php if ($this->loginOk || Minz_Configuration::allowAnonymousRefresh()) { ?>
|
<?php if ($this->loginOk || Minz_Configuration::allowAnonymousRefresh()) { ?>
|
||||||
<a id="actualize" class="btn" href="<?php echo _url ('feed', 'actualize'); ?>"><?php echo FreshRSS_Themes::icon('refresh'); ?></a>
|
<a id="actualize" class="btn" href="<?php echo _url('feed', 'actualize'); ?>"><?php echo _i('refresh'); ?></a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -18,7 +18,13 @@
|
||||||
<input type="text" id="cat_<?php echo $cat->id (); ?>" name="categories[]" value="<?php echo $cat->name (); ?>" />
|
<input type="text" id="cat_<?php echo $cat->id (); ?>" name="categories[]" value="<?php echo $cat->name (); ?>" />
|
||||||
|
|
||||||
<?php if ($cat->nbFeed () > 0) { ?>
|
<?php if ($cat->nbFeed () > 0) { ?>
|
||||||
<button type="submit" class="btn btn-attention confirm" formaction="<?php echo _url ('feed', 'delete', 'id', $cat->id (), 'type', 'category'); ?>"><?php echo Minz_Translate::t ('ask_empty'); ?></button>
|
<a class="btn" href="<?php echo _url('index', 'index', 'get', 'c_' . $cat->id ()); ?>">
|
||||||
|
<?php echo _i('link'); ?>
|
||||||
|
</a>
|
||||||
|
<button formaction="<?php echo _url('feed', 'delete', 'id', $cat->id (), 'type', 'category'); ?>"
|
||||||
|
class="btn btn-attention confirm"
|
||||||
|
data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>"
|
||||||
|
type="submit"><?php echo _t('ask_empty'); ?></button>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
(<?php echo Minz_Translate::t ('number_feeds', $cat->nbFeed ()); ?>)
|
(<?php echo Minz_Translate::t ('number_feeds', $cat->nbFeed ()); ?>)
|
||||||
|
|
|
@ -92,6 +92,13 @@
|
||||||
</table><br />
|
</table><br />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="group-name" for="posts_per_page"><?php echo Minz_Translate::t ('html5_notif_timeout'); ?></label>
|
||||||
|
<div class="group-controls">
|
||||||
|
<input type="number" id="html5_notif_timeout" name="html5_notif_timeout" value="<?php echo $this->conf->html5_notif_timeout; ?>" /> <?php echo Minz_Translate::t ('seconds_(0_means_no_timeout)'); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group form-actions">
|
<div class="form-group form-actions">
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<button type="submit" class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
|
<button type="submit" class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
|
||||||
|
|
|
@ -70,28 +70,34 @@
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="group-controls">
|
||||||
|
<a href="<?php echo _url('stats', 'repartition', 'id', $this->flux->id()); ?>">
|
||||||
|
<?php echo _i('stats'); ?> <?php echo _t('stats'); ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group form-actions">
|
<div class="form-group form-actions">
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<button class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
|
<button class="btn btn-important"><?php echo _t('save'); ?></button>
|
||||||
<button class="btn btn-attention confirm" formmethod="post" formaction="<?php echo Minz_Url::display (array ('c' => 'feed', 'a' => 'delete', 'params' => array ('id' => $this->flux->id ()))); ?>"><?php echo Minz_Translate::t ('delete'); ?></button>
|
<button class="btn btn-attention confirm"
|
||||||
|
data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>"
|
||||||
|
formaction="<?php echo _url('feed', 'delete', 'id', $this->flux->id ()); ?>"
|
||||||
|
formmethod="post"><?php echo _t('delete'); ?></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<legend><?php echo Minz_Translate::t ('archiving_configuration'); ?></legend>
|
<legend><?php echo Minz_Translate::t ('archiving_configuration'); ?></legend>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="group-name"></label>
|
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
|
<div class="stick">
|
||||||
|
<input type="text" value="<?php echo _t('number_articles', $nbEntries); ?>" disabled="disabled" />
|
||||||
<a class="btn" href="<?php echo _url('feed', 'actualize', 'id', $this->flux->id ()); ?>">
|
<a class="btn" href="<?php echo _url('feed', 'actualize', 'id', $this->flux->id ()); ?>">
|
||||||
<?php echo FreshRSS_Themes::icon('refresh'); ?> <?php echo Minz_Translate::t('actualize'); ?>
|
<?php echo _i('refresh'); ?> <?php echo _t('actualize'); ?>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label class="group-name"><?php echo Minz_Translate::t ('number_articles'); ?></label>
|
|
||||||
<div class="group-controls">
|
|
||||||
<span class="control"><?php echo $nbEntries; ?></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="group-name" for="keep_history"><?php echo Minz_Translate::t ('keep_history'); ?></label>
|
<label class="group-name" for="keep_history"><?php echo Minz_Translate::t ('keep_history'); ?></label>
|
||||||
|
|
|
@ -42,30 +42,37 @@
|
||||||
+ (isset($query['get']) ? 1 : 0);
|
+ (isset($query['get']) ? 1 : 0);
|
||||||
// If the only filter is "all" articles, we consider there is no filter
|
// If the only filter is "all" articles, we consider there is no filter
|
||||||
$exist = ($exist === 1 && isset($query['get']) && $query['get'] === 'a') ? 0 : $exist;
|
$exist = ($exist === 1 && isset($query['get']) && $query['get'] === 'a') ? 0 : $exist;
|
||||||
|
|
||||||
|
$deprecated = (isset($this->query_get[$key]) &&
|
||||||
|
$this->query_get[$key]['deprecated']);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?php if ($exist === 0) { ?>
|
<?php if ($exist === 0) { ?>
|
||||||
<div class="alert alert-warn">
|
<div class="alert alert-warn">
|
||||||
<div class="alert-head"><?php echo _t('no_query_filter'); ?></div>
|
<div class="alert-head"><?php echo _t('no_query_filter'); ?></div>
|
||||||
</div>
|
</div>
|
||||||
|
<?php } elseif ($deprecated) { ?>
|
||||||
|
<div class="alert alert-error">
|
||||||
|
<div class="alert-head"><?php echo _t('query_deprecated'); ?></div>
|
||||||
|
</div>
|
||||||
<?php } else { ?>
|
<?php } else { ?>
|
||||||
<div class="alert alert-success">
|
<div class="alert alert-success">
|
||||||
<div class="alert-head"><?php echo _t('query_filter'); ?></div>
|
<div class="alert-head"><?php echo _t('query_filter'); ?></div>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<?php if (isset($query['search'])) { $exist = true; ?>
|
<?php if (isset($query['search'])) { ?>
|
||||||
<li class="item"><?php echo _t('query_search', $query['search']); ?></li>
|
<li class="item"><?php echo _t('query_search', $query['search']); ?></li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php if (isset($query['state'])) { $exist = true; ?>
|
<?php if (isset($query['state'])) { ?>
|
||||||
<li class="item"><?php echo _t('query_state_' . $query['state']); ?></li>
|
<li class="item"><?php echo _t('query_state_' . $query['state']); ?></li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php if (isset($query['order'])) { $exist = true; ?>
|
<?php if (isset($query['order'])) { ?>
|
||||||
<li class="item"><?php echo _t('query_order_' . strtolower($query['order'])); ?></li>
|
<li class="item"><?php echo _t('query_order_' . strtolower($query['order'])); ?></li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php if (isset($query['get'])) { $exist = true; ?>
|
<?php if (isset($query['get'])) { ?>
|
||||||
<li class="item"><?php echo _t('query_get_' . $this->query_get[$key]['type'], $this->query_get[$key]['name']); ?></li>
|
<li class="item"><?php echo _t('query_get_' . $this->query_get[$key]['type'], $this->query_get[$key]['name']); ?></li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<label class="group-name" for="posts_per_page"><?php echo Minz_Translate::t ('articles_per_page'); ?></label>
|
<label class="group-name" for="posts_per_page"><?php echo Minz_Translate::t ('articles_per_page'); ?></label>
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<input type="number" id="posts_per_page" name="posts_per_page" value="<?php echo $this->conf->posts_per_page; ?>" min="5" max="50" />
|
<input type="number" id="posts_per_page" name="posts_per_page" value="<?php echo $this->conf->posts_per_page; ?>" min="5" max="50" />
|
||||||
|
<?php echo _i('help'); ?> <?php echo _t('number_divided_when_reader'); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -31,14 +32,17 @@
|
||||||
<option value="reader"<?php echo $this->conf->view_mode === 'reader' ? ' selected="selected"' : ''; ?>><?php echo Minz_Translate::t ('reader_view'); ?></option>
|
<option value="reader"<?php echo $this->conf->view_mode === 'reader' ? ' selected="selected"' : ''; ?>><?php echo Minz_Translate::t ('reader_view'); ?></option>
|
||||||
<option value="global"<?php echo $this->conf->view_mode === 'global' ? ' selected="selected"' : ''; ?>><?php echo Minz_Translate::t ('global_view'); ?></option>
|
<option value="global"<?php echo $this->conf->view_mode === 'global' ? ' selected="selected"' : ''; ?>><?php echo Minz_Translate::t ('global_view'); ?></option>
|
||||||
</select>
|
</select>
|
||||||
<label class="radio" for="radio_all">
|
</div>
|
||||||
<input type="radio" name="default_view" id="radio_all" value="<?php echo FreshRSS_Entry::STATE_ALL; ?>"<?php echo $this->conf->default_view === FreshRSS_Entry::STATE_ALL ? ' checked="checked"' : ''; ?> />
|
</div>
|
||||||
<?php echo Minz_Translate::t ('show_all_articles'); ?>
|
|
||||||
</label>
|
<div class="form-group">
|
||||||
<label class="radio" for="radio_not_read">
|
<label class="group-name" for="view_mode"><?php echo _t('articles_to_display'); ?></label>
|
||||||
<input type="radio" name="default_view" id="radio_not_read" value="<?php echo FreshRSS_Entry::STATE_NOT_READ; ?>"<?php echo $this->conf->default_view === FreshRSS_Entry::STATE_NOT_READ ? ' checked="checked"' : ''; ?> />
|
<div class="group-controls">
|
||||||
<?php echo Minz_Translate::t ('show_not_reads'); ?>
|
<select name="default_view" id="default_view">
|
||||||
</label>
|
<option value="<?php echo FreshRSS_Entry::STATE_NOT_READ; ?>"<?php echo $this->conf->default_view === FreshRSS_Entry::STATE_NOT_READ ? ' selected="selected"' : ''; ?>><?php echo _t('show_adaptive'); ?></option>
|
||||||
|
<option value="<?php echo FreshRSS_Entry::STATE_ALL; ?>"<?php echo $this->conf->default_view === FreshRSS_Entry::STATE_ALL ? ' selected="selected"' : ''; ?>><?php echo _t('show_all_articles'); ?></option>
|
||||||
|
<option value="<?php echo FreshRSS_Entry::STATE_STRICT + FreshRSS_Entry::STATE_NOT_READ; ?>"<?php echo $this->conf->default_view === FreshRSS_Entry::STATE_STRICT + FreshRSS_Entry::STATE_NOT_READ ? ' selected="selected"' : ''; ?>><?php echo _t('show_not_reads'); ?></option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,21 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="group-name" for="user_filter_shortcut"><?php echo Minz_Translate::t ('user_filter'); ?></label>
|
||||||
|
<div class="group-controls">
|
||||||
|
<input type="text" id="user_filter_shortcut" name="shortcuts[user_filter]" list="keys" value="<?php echo $s['user_filter']; ?>" />
|
||||||
|
<?php echo Minz_Translate::t ('user_filter_help'); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="group-name" for="help_shortcut"><?php echo Minz_Translate::t ('help'); ?></label>
|
||||||
|
<div class="group-controls">
|
||||||
|
<input type="text" id="help_shortcut" name="shortcuts[help]" list="keys" value="<?php echo $s['help']; ?>" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group form-actions">
|
<div class="form-group form-actions">
|
||||||
<div class="group-controls">
|
<div class="group-controls">
|
||||||
<button type="submit" class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
|
<button type="submit" class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
|
||||||
|
|
|
@ -4,7 +4,8 @@ echo '"use strict";', "\n";
|
||||||
|
|
||||||
$mark = $this->conf->mark_when;
|
$mark = $this->conf->mark_when;
|
||||||
echo 'var ',
|
echo 'var ',
|
||||||
'hide_posts=', ($this->conf->display_posts || Minz_Request::param('output') === 'reader') ? 'false' : 'true',
|
'help_url="', FRESHRSS_WIKI, '"',
|
||||||
|
',hide_posts=', ($this->conf->display_posts || Minz_Request::param('output') === 'reader') ? 'false' : 'true',
|
||||||
',display_order="', Minz_Request::param('order', $this->conf->sort_order), '"',
|
',display_order="', Minz_Request::param('order', $this->conf->sort_order), '"',
|
||||||
',auto_mark_article=', $mark['article'] ? 'true' : 'false',
|
',auto_mark_article=', $mark['article'] ? 'true' : 'false',
|
||||||
',auto_mark_site=', $mark['site'] ? 'true' : 'false',
|
',auto_mark_site=', $mark['site'] ? 'true' : 'false',
|
||||||
|
@ -25,7 +26,9 @@ echo ',shortcuts={',
|
||||||
'collapse_entry:"', $s['collapse_entry'], '",',
|
'collapse_entry:"', $s['collapse_entry'], '",',
|
||||||
'load_more:"', $s['load_more'], '",',
|
'load_more:"', $s['load_more'], '",',
|
||||||
'auto_share:"', $s['auto_share'], '",',
|
'auto_share:"', $s['auto_share'], '",',
|
||||||
'focus_search:"', $s['focus_search'], '"',
|
'focus_search:"', $s['focus_search'], '",',
|
||||||
|
'user_filter:"', $s['user_filter'], '",',
|
||||||
|
'help:"', $s['help'], '"',
|
||||||
"},\n";
|
"},\n";
|
||||||
|
|
||||||
if (Minz_Request::param ('output') === 'global') {
|
if (Minz_Request::param ('output') === 'global') {
|
||||||
|
@ -48,9 +51,11 @@ echo 'authType="', $authType, '",',
|
||||||
'url_login="', _url ('index', 'login'), '",',
|
'url_login="', _url ('index', 'login'), '",',
|
||||||
'url_logout="', _url ('index', 'logout'), '",';
|
'url_logout="', _url ('index', 'logout'), '",';
|
||||||
|
|
||||||
echo 'str_confirmation="', Minz_Translate::t('confirm_action'), '"', ",\n";
|
echo 'str_confirmation_default="', Minz_Translate::t('confirm_action'), '"', ",\n";
|
||||||
echo 'str_notif_title_articles="', Minz_Translate::t('notif_title_new_articles'), '"', ",\n";
|
echo 'str_notif_title_articles="', Minz_Translate::t('notif_title_new_articles'), '"', ",\n";
|
||||||
echo 'str_notif_body_articles="', Minz_Translate::t('notif_body_new_articles'), '"', ",\n";
|
echo 'str_notif_body_articles="', Minz_Translate::t('notif_body_new_articles'), '"', ",\n";
|
||||||
|
echo 'html5_notif_timeout=', $this->conf->html5_notif_timeout,",\n";
|
||||||
|
|
||||||
|
|
||||||
$autoActualise = Minz_Session::param('actualize_feeds', false);
|
$autoActualise = Minz_Session::param('actualize_feeds', false);
|
||||||
echo 'auto_actualize_feeds=', $autoActualise ? 'true' : 'false', ";\n";
|
echo 'auto_actualize_feeds=', $autoActualise ? 'true' : 'false', ";\n";
|
||||||
|
|
|
@ -6,20 +6,31 @@
|
||||||
Minz_Session::_param('markReadUrl', false);
|
Minz_Session::_param('markReadUrl', false);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<form id="mark-read-pagination" method="post" style="display: none"></form>
|
||||||
|
|
||||||
<ul class="pagination">
|
<ul class="pagination">
|
||||||
<li class="item pager-next">
|
<li class="item pager-next">
|
||||||
<?php if (!empty($this->nextId)) { ?>
|
<?php if (!empty($this->nextId)) { ?>
|
||||||
<?php $params['next'] = $this->nextId; ?>
|
<?php
|
||||||
<a id="load_more" href="<?php echo Minz_Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo Minz_Translate::t ('load_more'); ?></a>
|
$params['next'] = $this->nextId;
|
||||||
<?php } elseif ($markReadUrl) { ?>
|
$params['ajax'] = 1;
|
||||||
<a id="bigMarkAsRead" href="<?php echo $markReadUrl; ?>"<?php if ($this->conf->reading_confirm) { echo ' class="confirm"';} ?>>
|
?>
|
||||||
<?php echo Minz_Translate::t ('nothing_to_load'); ?><br />
|
<a id="load_more" href="<?php echo Minz_Url::display(array('c' => $c, 'a' => $a, 'params' => $params)); ?>">
|
||||||
<span class="bigTick">✓</span><br />
|
<?php echo _t('load_more'); ?>
|
||||||
<?php echo Minz_Translate::t ('mark_all_read'); ?>
|
|
||||||
</a>
|
</a>
|
||||||
|
<?php } elseif ($markReadUrl) { ?>
|
||||||
|
<button id="bigMarkAsRead"
|
||||||
|
class="as-link <?php echo $this->conf->reading_confirm ? 'confirm' : ''; ?>"
|
||||||
|
form="mark-read-pagination"
|
||||||
|
formaction="<?php echo $markReadUrl; ?>"
|
||||||
|
type="submit">
|
||||||
|
<?php echo _t('nothing_to_load'); ?><br />
|
||||||
|
<span class="bigTick">✓</span><br />
|
||||||
|
<?php echo _t('mark_all_read'); ?>
|
||||||
|
</button>
|
||||||
<?php } else { ?>
|
<?php } else { ?>
|
||||||
<a id="bigMarkAsRead" href=".">
|
<a id="bigMarkAsRead" href=".">
|
||||||
<?php echo Minz_Translate::t ('nothing_to_load'); ?><br />
|
<?php echo _t('nothing_to_load'); ?><br />
|
||||||
</a>
|
</a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?php $this->partial ('nav_menu'); ?>
|
<?php $this->partial ('nav_menu'); ?>
|
||||||
|
|
||||||
|
<?php if (!empty($this->entries)) { ?>
|
||||||
<div id="stream" class="global categories">
|
<div id="stream" class="global categories">
|
||||||
<?php
|
<?php
|
||||||
$arUrl = array('c' => 'index', 'a' => 'index', 'params' => array());
|
$arUrl = array('c' => 'index', 'a' => 'index', 'params' => array());
|
||||||
|
@ -43,3 +44,10 @@
|
||||||
<div id="panel"<?php echo $this->conf->display_posts ? '' : ' class="hide_posts"'; ?>>
|
<div id="panel"<?php echo $this->conf->display_posts ? '' : ' class="hide_posts"'; ?>>
|
||||||
<a class="close" href="#"><?php echo FreshRSS_Themes::icon('close'); ?></a>
|
<a class="close" href="#"><?php echo FreshRSS_Themes::icon('close'); ?></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php } else { ?>
|
||||||
|
<div id="stream" class="prompt alert alert-warn global">
|
||||||
|
<h2><?php echo _t('no_feed_to_display'); ?></h2>
|
||||||
|
<a href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
|
@ -183,8 +183,8 @@ if (!empty($this->entries)) {
|
||||||
<?php $this->partial ('nav_entries'); ?>
|
<?php $this->partial ('nav_entries'); ?>
|
||||||
|
|
||||||
<?php } else { ?>
|
<?php } else { ?>
|
||||||
<div id="stream" class="alert alert-warn normal">
|
<div id="stream" class="prompt alert alert-warn normal">
|
||||||
<span class="alert-head"><?php echo Minz_Translate::t ('no_feed_to_display'); ?></span>
|
<h2><?php echo _t('no_feed_to_display'); ?></h2>
|
||||||
<?php echo Minz_Translate::t ('think_to_add'); ?>
|
<a href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
|
@ -37,8 +37,8 @@ if (!empty($this->entries)) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php } else { ?>
|
<?php } else { ?>
|
||||||
<div id="stream" class="alert alert-warn reader">
|
<div id="stream" class="prompt alert alert-warn reader">
|
||||||
<span class="alert-head"><?php echo Minz_Translate::t ('no_feed_to_display'); ?></span>
|
<h2><?php echo _t('no_feed_to_display'); ?></h2>
|
||||||
<?php echo Minz_Translate::t ('think_to_add'); ?>
|
<a href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
switch (Minz_Configuration::authType()) {
|
switch (Minz_Configuration::authType()) {
|
||||||
case 'form':
|
case 'form':
|
||||||
?><form id="loginForm" method="post" action="<?php echo _url('index', 'formLogin'); ?>">
|
?><form id="crypto-form" method="post" action="<?php echo _url('index', 'formLogin'); ?>">
|
||||||
<div>
|
<div>
|
||||||
<label for="username"><?php echo _t('username'); ?></label>
|
<label for="username"><?php echo _t('username'); ?></label>
|
||||||
<input type="text" id="username" name="username" size="16" required="required" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" autofocus="autofocus" />
|
<input type="text" id="username" name="username" size="16" required="required" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" autofocus="autofocus" />
|
||||||
|
@ -29,8 +29,15 @@
|
||||||
|
|
||||||
case 'persona':
|
case 'persona':
|
||||||
?><p>
|
?><p>
|
||||||
|
<a class="signin btn btn-important" href="#">
|
||||||
<?php echo _i('login'); ?>
|
<?php echo _i('login'); ?>
|
||||||
<a class="signin" href="#"><?php echo _t('login_with_persona'); ?></a>
|
<?php echo _t('login_with_persona'); ?>
|
||||||
|
</a><br /><br />
|
||||||
|
|
||||||
|
<?php echo _i('help'); ?>
|
||||||
|
<small>
|
||||||
|
<a href="<?php echo _url('index', 'resetAuth'); ?>"><?php echo _t('login_persona_problem'); ?></a>
|
||||||
|
</small>
|
||||||
</p><?php
|
</p><?php
|
||||||
break;
|
break;
|
||||||
} ?>
|
} ?>
|
||||||
|
|
33
sources/app/views/index/resetAuth.phtml
Executable file
|
@ -0,0 +1,33 @@
|
||||||
|
<div class="prompt">
|
||||||
|
<h1><?php echo _t('auth_reset'); ?></h1>
|
||||||
|
|
||||||
|
<?php if (!empty($this->message)) { ?>
|
||||||
|
<p class="alert <?php echo $this->message['status'] === 'bad' ? 'alert-error' : 'alert-warn'; ?>">
|
||||||
|
<span class="alert-head"><?php echo $this->message['title']; ?></span><br />
|
||||||
|
<?php echo $this->message['body']; ?>
|
||||||
|
</p>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php if (!$this->no_form) { ?>
|
||||||
|
<form id="crypto-form" method="post" action="<?php echo _url('index', 'resetAuth'); ?>">
|
||||||
|
<p class="alert alert-warn">
|
||||||
|
<span class="alert-head"><?php echo _t('attention'); ?></span><br />
|
||||||
|
<?php echo _t('auth_will_reset'); ?>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="username"><?php echo _t('username_admin'); ?></label>
|
||||||
|
<input type="text" id="username" name="username" size="16" required="required" maxlength="16" pattern="[0-9a-zA-Z]{1,16}" autofocus="autofocus" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="passwordPlain"><?php echo _t('password'); ?></label>
|
||||||
|
<input type="password" id="passwordPlain" required="required" />
|
||||||
|
<input type="hidden" id="challenge" name="challenge" /><br />
|
||||||
|
<noscript><strong><?php echo _t('javascript_should_be_activated'); ?></strong></noscript>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button id="loginButton" type="submit" class="btn btn-important"><?php echo _t('submit'); ?></button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<?php } ?>
|
||||||
|
</div>
|
|
@ -1,25 +1,48 @@
|
||||||
<?php $this->partial('aside_stats'); ?>
|
<?php $this->partial('aside_stats'); ?>
|
||||||
|
|
||||||
<div class="post content">
|
<div class="post">
|
||||||
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
|
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
|
||||||
|
|
||||||
<h1><?php echo _t('stats_idle'); ?></h1>
|
<h1><?php echo _t('stats_idle'); ?></h1>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
$current_url = urlencode(Minz_Url::display(
|
||||||
|
array('c' => 'stats', 'a' => 'idle'),
|
||||||
|
'php', true
|
||||||
|
));
|
||||||
|
$nothing = true;
|
||||||
foreach ($this->idleFeeds as $period => $feeds) {
|
foreach ($this->idleFeeds as $period => $feeds) {
|
||||||
if (!empty($feeds)) {
|
if (!empty($feeds)) {
|
||||||
|
$nothing = false;
|
||||||
?>
|
?>
|
||||||
<div class="stat">
|
<div class="stat">
|
||||||
<h2><?php echo _t($period); ?></h2>
|
<h2><?php echo _t($period); ?></h2>
|
||||||
|
|
||||||
<ul>
|
<form id="form-delete" method="post" style="display: none"></form>
|
||||||
|
|
||||||
<?php foreach ($feeds as $feed) { ?>
|
<?php foreach ($feeds as $feed) { ?>
|
||||||
<li><a href="<?php echo _url('configure', 'feed', 'id', $feed['id']); ?>" title="<?php echo date('Y-m-d', $feed['last_date']); ?>"><?php echo $feed['name']; ?></a></li>
|
<ul class="horizontal-list">
|
||||||
<?php } ?>
|
<li class="item">
|
||||||
|
<div class="stick">
|
||||||
|
<a class="btn" href="<?php echo _url('index', 'index', 'get', 'f_' . $feed['id']); ?>"><?php echo _i('link'); ?> <?php echo _t('filter'); ?></a>
|
||||||
|
<a class="btn" href="<?php echo _url('configure', 'feed', 'id', $feed['id']); ?>"><?php echo _i('configure'); ?> <?php echo _t('administration'); ?></a>
|
||||||
|
<button class="btn btn-attention confirm" form="form-delete" formaction="<?php echo _url('feed', 'delete', 'id', $feed['id'], 'r', $current_url); ?>"><?php echo _t('delete'); ?></button>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="item">
|
||||||
|
<span title="<?php echo timestamptodate($feed['last_date'], false); ?>"><?php echo $feed['name']; ?> (<?php echo _t('number_articles', $feed['nb_articles']); ?>)</span>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($nothing) {
|
||||||
?>
|
?>
|
||||||
|
<p class="alert alert-warn">
|
||||||
|
<span class="alert-head"><?php echo _t('stats_no_idle'); ?></span>
|
||||||
|
</p>
|
||||||
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
<?php $this->partial('aside_stats'); ?>
|
<?php $this->partial('aside_stats'); ?>
|
||||||
|
|
||||||
<div class="post content">
|
<div class="post">
|
||||||
<a href="<?php echo _url ('index', 'index'); ?>"><?php echo _t ('back_to_rss_feeds'); ?></a>
|
<a href="<?php echo _url ('index', 'index'); ?>"><?php echo _t ('back_to_rss_feeds'); ?></a>
|
||||||
|
|
||||||
<h1><?php echo _t ('stats_main'); ?></h1>
|
<h1><?php echo _t ('stats_main'); ?></h1>
|
||||||
|
|
||||||
<div class="stat">
|
<div class="stat half">
|
||||||
<h2><?php echo _t ('stats_entry_repartition'); ?></h2>
|
<h2><?php echo _t ('stats_entry_repartition'); ?></h2>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -38,26 +38,9 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div><!--
|
||||||
|
|
||||||
<div class="stat">
|
--><div class="stat half">
|
||||||
<h2><?php echo _t ('stats_entry_per_day'); ?></h2>
|
|
||||||
<div id="statsEntryPerDay" style="height: 300px"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="stat">
|
|
||||||
<h2><?php echo _t ('stats_feed_per_category'); ?></h2>
|
|
||||||
<div id="statsFeedPerCategory" style="height: 300px"></div>
|
|
||||||
<div id="statsFeedPerCategoryLegend"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="stat">
|
|
||||||
<h2><?php echo _t ('stats_entry_per_category'); ?></h2>
|
|
||||||
<div id="statsEntryPerCategory" style="height: 300px"></div>
|
|
||||||
<div id="statsEntryPerCategoryLegend"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="stat">
|
|
||||||
<h2><?php echo _t ('stats_top_feed'); ?></h2>
|
<h2><?php echo _t ('stats_top_feed'); ?></h2>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -70,7 +53,7 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($this->topFeed as $feed): ?>
|
<?php foreach ($this->topFeed as $feed): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td><?php echo $feed['name']; ?></td>
|
<td><a href="<?php echo _url('stats', 'repartition', 'id', $feed['id']); ?>"><?php echo $feed['name']; ?></a></td>
|
||||||
<td><?php echo $feed['category']; ?></td>
|
<td><?php echo $feed['category']; ?></td>
|
||||||
<td class="numeric"><?php echo formatNumber($feed['count']); ?></td>
|
<td class="numeric"><?php echo formatNumber($feed['count']); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -78,6 +61,23 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="stat">
|
||||||
|
<h2><?php echo _t ('stats_entry_per_day'); ?></h2>
|
||||||
|
<div id="statsEntryPerDay" style="height: 300px"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="stat half">
|
||||||
|
<h2><?php echo _t ('stats_feed_per_category'); ?></h2>
|
||||||
|
<div id="statsFeedPerCategory" style="height: 300px"></div>
|
||||||
|
<div id="statsFeedPerCategoryLegend"></div>
|
||||||
|
</div><!--
|
||||||
|
|
||||||
|
--><div class="stat half">
|
||||||
|
<h2><?php echo _t ('stats_entry_per_category'); ?></h2>
|
||||||
|
<div id="statsEntryPerCategory" style="height: 300px"></div>
|
||||||
|
<div id="statsEntryPerCategoryLegend"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php $this->partial('aside_stats'); ?>
|
<?php $this->partial('aside_stats'); ?>
|
||||||
|
|
||||||
<div class="post content">
|
<div class="post ">
|
||||||
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
|
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
|
||||||
|
|
||||||
<h1><?php echo _t('stats_repartition'); ?></h1>
|
<h1><?php echo _t('stats_repartition'); ?></h1>
|
||||||
|
@ -10,10 +10,10 @@
|
||||||
<?php foreach ($this->categories as $category) {
|
<?php foreach ($this->categories as $category) {
|
||||||
$feeds = $category->feeds();
|
$feeds = $category->feeds();
|
||||||
if (!empty($feeds)) {
|
if (!empty($feeds)) {
|
||||||
echo '<optgroup label=', $category->name(), '>';
|
echo '<optgroup label="', $category->name(), '">';
|
||||||
foreach ($feeds as $feed) {
|
foreach ($feeds as $feed) {
|
||||||
if ($this->feed && $feed->id() == $this->feed->id()){
|
if ($this->feed && $feed->id() == $this->feed->id()){
|
||||||
echo '<option value ="', $feed->id(), '" selected data-url="', _url('stats', 'repartition', 'id', $feed->id()), '">', $feed->name(), '</option>';
|
echo '<option value="', $feed->id(), '" selected="selected" data-url="', _url('stats', 'repartition', 'id', $feed->id()), '">', $feed->name(), '</option>';
|
||||||
} else {
|
} else {
|
||||||
echo '<option value="', $feed->id(), '" data-url="', _url('stats', 'repartition', 'id', $feed->id()), '">', $feed->name(), '</option>';
|
echo '<option value="', $feed->id(), '" data-url="', _url('stats', 'repartition', 'id', $feed->id()), '">', $feed->name(), '</option>';
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,8 @@
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<?php if ($this->feed) {?>
|
<?php if ($this->feed) {?>
|
||||||
<a href="<?php echo _url('configure', 'feed', 'id', $this->feed->id()); ?>">
|
<a class="btn" href="<?php echo _url('configure', 'feed', 'id', $this->feed->id()); ?>">
|
||||||
<?php echo _t('administration'); ?>
|
<?php echo _i('configure'); ?> <?php echo _t('administration'); ?>
|
||||||
</a>
|
</a>
|
||||||
<?php }?>
|
<?php }?>
|
||||||
|
|
||||||
|
@ -34,12 +34,12 @@
|
||||||
<div id="statsEntryPerHour" style="height: 300px"></div>
|
<div id="statsEntryPerHour" style="height: 300px"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="stat">
|
<div class="stat half">
|
||||||
<h2><?php echo _t('stats_entry_per_day_of_week'); ?></h2>
|
<h2><?php echo _t('stats_entry_per_day_of_week'); ?></h2>
|
||||||
<div id="statsEntryPerDayOfWeek" style="height: 300px"></div>
|
<div id="statsEntryPerDayOfWeek" style="height: 300px"></div>
|
||||||
</div>
|
</div><!--
|
||||||
|
|
||||||
<div class="stat">
|
--><div class="stat half">
|
||||||
<h2><?php echo _t('stats_entry_per_month'); ?></h2>
|
<h2><?php echo _t('stats_entry_per_month'); ?></h2>
|
||||||
<div id="statsEntryPerMonth" style="height: 300px"></div>
|
<div id="statsEntryPerMonth" style="height: 300px"></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -56,11 +56,22 @@ function initStats() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Entry per hour
|
// Entry per hour
|
||||||
|
var avg_h = [];
|
||||||
|
for (var i = -1; i <= 24; i++) {
|
||||||
|
avg_h.push([i, <?php echo $this->averageHour?>]);
|
||||||
|
}
|
||||||
Flotr.draw(document.getElementById('statsEntryPerHour'),
|
Flotr.draw(document.getElementById('statsEntryPerHour'),
|
||||||
[<?php echo $this->repartitionHour ?>],
|
[{
|
||||||
|
data: <?php echo $this->repartitionHour ?>,
|
||||||
|
bars: {horizontal: false, show: true}
|
||||||
|
}, {
|
||||||
|
data: avg_h,
|
||||||
|
lines: {show: true},
|
||||||
|
label: <?php echo $this->averageHour?>,
|
||||||
|
yaxis: 2
|
||||||
|
}],
|
||||||
{
|
{
|
||||||
grid: {verticalLines: false},
|
grid: {verticalLines: false},
|
||||||
bars: {horizontal: false, show: true},
|
|
||||||
xaxis: {noTicks: 23,
|
xaxis: {noTicks: 23,
|
||||||
tickFormatter: function(x) {
|
tickFormatter: function(x) {
|
||||||
var x = parseInt(x);
|
var x = parseInt(x);
|
||||||
|
@ -70,14 +81,26 @@ function initStats() {
|
||||||
max: 23.9,
|
max: 23.9,
|
||||||
tickDecimals: 0},
|
tickDecimals: 0},
|
||||||
yaxis: {min: 0},
|
yaxis: {min: 0},
|
||||||
|
y2axis: {showLabels: false},
|
||||||
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
|
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
|
||||||
});
|
});
|
||||||
// Entry per day of week
|
// Entry per day of week
|
||||||
|
var avg_dow = [];
|
||||||
|
for (var i = -1; i <= 7; i++) {
|
||||||
|
avg_dow.push([i, <?php echo $this->averageDayOfWeek?>]);
|
||||||
|
}
|
||||||
Flotr.draw(document.getElementById('statsEntryPerDayOfWeek'),
|
Flotr.draw(document.getElementById('statsEntryPerDayOfWeek'),
|
||||||
[<?php echo $this->repartitionDayOfWeek ?>],
|
[{
|
||||||
|
data: <?php echo $this->repartitionDayOfWeek ?>,
|
||||||
|
bars: {horizontal: false, show: true}
|
||||||
|
}, {
|
||||||
|
data: avg_dow,
|
||||||
|
lines: {show: true},
|
||||||
|
label: <?php echo $this->averageDayOfWeek?>,
|
||||||
|
yaxis: 2
|
||||||
|
}],
|
||||||
{
|
{
|
||||||
grid: {verticalLines: false},
|
grid: {verticalLines: false},
|
||||||
bars: {horizontal: false, show: true},
|
|
||||||
xaxis: {noTicks: 6,
|
xaxis: {noTicks: 6,
|
||||||
tickFormatter: function(x) {
|
tickFormatter: function(x) {
|
||||||
var x = parseInt(x),
|
var x = parseInt(x),
|
||||||
|
@ -88,14 +111,26 @@ function initStats() {
|
||||||
max: 6.9,
|
max: 6.9,
|
||||||
tickDecimals: 0},
|
tickDecimals: 0},
|
||||||
yaxis: {min: 0},
|
yaxis: {min: 0},
|
||||||
|
y2axis: {showLabels: false},
|
||||||
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
|
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
|
||||||
});
|
});
|
||||||
// Entry per month
|
// Entry per month
|
||||||
|
var avg_m = [];
|
||||||
|
for (var i = 0; i <= 13; i++) {
|
||||||
|
avg_m.push([i, <?php echo $this->averageMonth?>]);
|
||||||
|
}
|
||||||
Flotr.draw(document.getElementById('statsEntryPerMonth'),
|
Flotr.draw(document.getElementById('statsEntryPerMonth'),
|
||||||
[<?php echo $this->repartitionMonth ?>],
|
[{
|
||||||
|
data: <?php echo $this->repartitionMonth ?>,
|
||||||
|
bars: {horizontal: false, show: true}
|
||||||
|
}, {
|
||||||
|
data: avg_m,
|
||||||
|
lines: {show: true},
|
||||||
|
label: <?php echo $this->averageMonth?>,
|
||||||
|
yaxis: 2
|
||||||
|
}],
|
||||||
{
|
{
|
||||||
grid: {verticalLines: false},
|
grid: {verticalLines: false},
|
||||||
bars: {horizontal: false, show: true},
|
|
||||||
xaxis: {noTicks: 12,
|
xaxis: {noTicks: 12,
|
||||||
tickFormatter: function(x) {
|
tickFormatter: function(x) {
|
||||||
var x = parseInt(x),
|
var x = parseInt(x),
|
||||||
|
@ -106,6 +141,7 @@ function initStats() {
|
||||||
max: 12.9,
|
max: 12.9,
|
||||||
tickDecimals: 0},
|
tickDecimals: 0},
|
||||||
yaxis: {min: 0},
|
yaxis: {min: 0},
|
||||||
|
y2axis: {showLabels: false},
|
||||||
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
|
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
9
sources/app/views/update/apply.phtml
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
<?php $this->partial('aside_configure'); ?>
|
||||||
|
|
||||||
|
<div class="post">
|
||||||
|
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
|
||||||
|
|
||||||
|
<h1><?php echo _t('update_system'); ?></h1>
|
||||||
|
|
||||||
|
<?php ask_info_update(); ?>
|
||||||
|
</div>
|
36
sources/app/views/update/index.phtml
Executable file
|
@ -0,0 +1,36 @@
|
||||||
|
<?php $this->partial('aside_configure'); ?>
|
||||||
|
|
||||||
|
<div class="post">
|
||||||
|
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
|
||||||
|
|
||||||
|
<h1><?php echo _t('update_system'); ?></h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<?php echo _i('help'); ?> <?php echo _t('update_last', $this->last_update_time); ?>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<?php if (!empty($this->message)) { ?>
|
||||||
|
<p class="alert <?php echo $this->message['status'] === 'bad' ? 'alert-error' : 'alert-warn'; ?>">
|
||||||
|
<span class="alert-head"><?php echo $this->message['title']; ?></span>
|
||||||
|
<?php echo $this->message['body']; ?>
|
||||||
|
</p>
|
||||||
|
<?php } elseif ($this->check_last_hour) { ?>
|
||||||
|
<p class="alert alert-warn">
|
||||||
|
<span class="alert-head"><?php echo _t('damn'); ?></span>
|
||||||
|
<?php echo _t('no_update'); ?>
|
||||||
|
</p>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (!$this->check_last_hour &&
|
||||||
|
(empty($this->message) || $this->message['status'] !== 'good')) {
|
||||||
|
?>
|
||||||
|
<p>
|
||||||
|
<a href="<?php echo _url('update', 'check'); ?>" class="btn"><?php echo _t('update_check'); ?></a>
|
||||||
|
</p>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php if ($this->update_to_apply) { ?>
|
||||||
|
<a class="btn btn-important" href="<?php echo _url('update', 'apply'); ?>"><?php echo _t('update_apply'); ?></a>
|
||||||
|
<?php } ?>
|
||||||
|
</div>
|
|
@ -1,6 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
define('FRESHRSS_VERSION', '0.7.4');
|
define('FRESHRSS_VERSION', '0.8.0');
|
||||||
define('FRESHRSS_WEBSITE', 'http://freshrss.org');
|
define('FRESHRSS_WEBSITE', 'http://freshrss.org');
|
||||||
|
define('FRESHRSS_UPDATE_WEBSITE', 'https://update.freshrss.org?v=' . FRESHRSS_VERSION);
|
||||||
|
define('FRESHRSS_WIKI', 'http://doc.freshrss.org');
|
||||||
|
|
||||||
// PHP text output compression http://php.net/ob_gzhandler (better to do it at Web server level)
|
// PHP text output compression http://php.net/ob_gzhandler (better to do it at Web server level)
|
||||||
define('PHP_COMPRESSION', false);
|
define('PHP_COMPRESSION', false);
|
||||||
|
@ -13,6 +15,7 @@ define('FRESHRSS_PATH', dirname(__FILE__));
|
||||||
define('PUBLIC_RELATIVE', '..');
|
define('PUBLIC_RELATIVE', '..');
|
||||||
|
|
||||||
define('DATA_PATH', FRESHRSS_PATH . '/data');
|
define('DATA_PATH', FRESHRSS_PATH . '/data');
|
||||||
|
define('UPDATE_FILENAME', DATA_PATH . '/update.php');
|
||||||
define('LOG_PATH', DATA_PATH . '/log');
|
define('LOG_PATH', DATA_PATH . '/log');
|
||||||
define('CACHE_PATH', DATA_PATH . '/cache');
|
define('CACHE_PATH', DATA_PATH . '/cache');
|
||||||
|
|
||||||
|
|
2
sources/data/.gitignore
vendored
|
@ -6,3 +6,5 @@ touch.txt
|
||||||
no-cache.txt
|
no-cache.txt
|
||||||
*.bak.php
|
*.bak.php
|
||||||
*.lock.txt
|
*.lock.txt
|
||||||
|
last_update.txt
|
||||||
|
update.php
|
||||||
|
|
|
@ -77,6 +77,9 @@ class Minz_ModelPdo {
|
||||||
$db['password'],
|
$db['password'],
|
||||||
$driver_options
|
$driver_options
|
||||||
);
|
);
|
||||||
|
if ($type === 'sqlite') {
|
||||||
|
$this->bd->exec('PRAGMA foreign_keys = ON;');
|
||||||
|
}
|
||||||
self::$sharedBd = $this->bd;
|
self::$sharedBd = $this->bd;
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
throw new Minz_PDOConnectionException(
|
throw new Minz_PDOConnectionException(
|
||||||
|
|
|
@ -124,6 +124,11 @@ class Minz_Request {
|
||||||
* > sinon, le dispatcher recharge en interne
|
* > sinon, le dispatcher recharge en interne
|
||||||
*/
|
*/
|
||||||
public static function forward($url = array(), $redirect = false) {
|
public static function forward($url = array(), $redirect = false) {
|
||||||
|
if (!is_array($url)) {
|
||||||
|
header('Location: ' . $url);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
$url = Minz_Url::checkUrl($url);
|
$url = Minz_Url::checkUrl($url);
|
||||||
|
|
||||||
if ($redirect) {
|
if ($redirect) {
|
||||||
|
|
|
@ -26,12 +26,19 @@ class Minz_View {
|
||||||
* Détermine si on utilise un layout ou non
|
* Détermine si on utilise un layout ou non
|
||||||
*/
|
*/
|
||||||
public function __construct () {
|
public function __construct () {
|
||||||
|
$this->change_view(Minz_Request::controllerName(),
|
||||||
|
Minz_Request::actionName());
|
||||||
|
self::$title = Minz_Configuration::title ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change le fichier de vue en fonction d'un controller / action
|
||||||
|
*/
|
||||||
|
public function change_view($controller_name, $action_name) {
|
||||||
$this->view_filename = APP_PATH
|
$this->view_filename = APP_PATH
|
||||||
. self::VIEWS_PATH_NAME . '/'
|
. self::VIEWS_PATH_NAME . '/'
|
||||||
. Minz_Request::controllerName () . '/'
|
. $controller_name . '/'
|
||||||
. Minz_Request::actionName () . '.phtml';
|
. $action_name . '.phtml';
|
||||||
|
|
||||||
self::$title = Minz_Configuration::title ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -142,7 +142,7 @@ class SimplePie_Parser
|
||||||
$dom = new DOMDocument();
|
$dom = new DOMDocument();
|
||||||
$dom->recover = true;
|
$dom->recover = true;
|
||||||
$dom->strictErrorChecking = false;
|
$dom->strictErrorChecking = false;
|
||||||
$dom->loadXML($data);
|
@$dom->loadXML($data);
|
||||||
$this->encoding = $encoding = $dom->encoding = 'UTF-8';
|
$this->encoding = $encoding = $dom->encoding = 'UTF-8';
|
||||||
$data2 = $dom->saveXML();
|
$data2 = $dom->saveXML();
|
||||||
if (function_exists('mb_convert_encoding'))
|
if (function_exists('mb_convert_encoding'))
|
||||||
|
|
|
@ -230,3 +230,17 @@ function cryptAvailable() {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function is_referer_from_same_domain() {
|
||||||
|
if (empty($_SERVER['HTTP_REFERER'])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$host = parse_url(((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https://' : 'http://') .
|
||||||
|
(empty($_SERVER['HTTP_HOST']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST']));
|
||||||
|
$referer = parse_url($_SERVER['HTTP_REFERER']);
|
||||||
|
if (empty($host['scheme']) || empty($referer['scheme']) || $host['scheme'] !== $referer['scheme'] ||
|
||||||
|
empty($host['host']) || empty($referer['host']) || $host['host'] !== $referer['host']) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return (isset($host['port']) ? $host['port'] : 0) === (isset($referer['port']) ? $referer['port'] : 0);
|
||||||
|
}
|
||||||
|
|
|
@ -251,9 +251,14 @@ function toggleContent(new_active, old_active) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sticky_post) {
|
if (sticky_post) {
|
||||||
var new_pos = new_active.position().top - new_active.children('.flux_header').outerHeight(),
|
var prev_article = new_active.prevAll('.flux'),
|
||||||
|
new_pos = new_active.position().top,
|
||||||
old_scroll = $(box_to_move).scrollTop();
|
old_scroll = $(box_to_move).scrollTop();
|
||||||
|
|
||||||
|
if (prev_article.length > 0 && new_pos - prev_article.position().top <= 150) {
|
||||||
|
new_pos = prev_article.position().top;
|
||||||
|
}
|
||||||
|
|
||||||
if (hide_posts) {
|
if (hide_posts) {
|
||||||
if (relative_move) {
|
if (relative_move) {
|
||||||
new_pos += old_scroll;
|
new_pos += old_scroll;
|
||||||
|
@ -297,7 +302,7 @@ function next_entry() {
|
||||||
function prev_feed() {
|
function prev_feed() {
|
||||||
var active_feed = $("#aside_flux .feeds li.active");
|
var active_feed = $("#aside_flux .feeds li.active");
|
||||||
if (active_feed.length > 0) {
|
if (active_feed.length > 0) {
|
||||||
active_feed.prev().find('a.feed').each(function(){this.click();});
|
active_feed.prevAll(':visible:first').find('a.feed').each(function(){this.click();});
|
||||||
} else {
|
} else {
|
||||||
last_feed();
|
last_feed();
|
||||||
}
|
}
|
||||||
|
@ -306,21 +311,21 @@ function prev_feed() {
|
||||||
function next_feed() {
|
function next_feed() {
|
||||||
var active_feed = $("#aside_flux .feeds li.active");
|
var active_feed = $("#aside_flux .feeds li.active");
|
||||||
if (active_feed.length > 0) {
|
if (active_feed.length > 0) {
|
||||||
active_feed.next().find('a.feed').each(function(){this.click();});
|
active_feed.nextAll(':visible:first').find('a.feed').each(function(){this.click();});
|
||||||
} else {
|
} else {
|
||||||
first_feed();
|
first_feed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function first_feed() {
|
function first_feed() {
|
||||||
var feed = $("#aside_flux .feeds.active li:first");
|
var feed = $("#aside_flux .feeds.active li:visible:first");
|
||||||
if (feed.length > 0) {
|
if (feed.length > 0) {
|
||||||
feed.find('a')[1].click();
|
feed.find('a')[1].click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function last_feed() {
|
function last_feed() {
|
||||||
var feed = $("#aside_flux .feeds.active li:last");
|
var feed = $("#aside_flux .feeds.active li:visible:last");
|
||||||
if (feed.length > 0) {
|
if (feed.length > 0) {
|
||||||
feed.find('a')[1].click();
|
feed.find('a')[1].click();
|
||||||
}
|
}
|
||||||
|
@ -330,7 +335,7 @@ function prev_category() {
|
||||||
var active_cat = $("#aside_flux .category.stick.active");
|
var active_cat = $("#aside_flux .category.stick.active");
|
||||||
|
|
||||||
if (active_cat.length > 0) {
|
if (active_cat.length > 0) {
|
||||||
var prev_cat = active_cat.parent('li').prev().find('.category.stick a.btn');
|
var prev_cat = active_cat.parent('li').prevAll(':visible:first').find('.category.stick a.btn');
|
||||||
if (prev_cat.length > 0) {
|
if (prev_cat.length > 0) {
|
||||||
prev_cat[0].click();
|
prev_cat[0].click();
|
||||||
}
|
}
|
||||||
|
@ -344,7 +349,7 @@ function next_category() {
|
||||||
var active_cat = $("#aside_flux .category.stick.active");
|
var active_cat = $("#aside_flux .category.stick.active");
|
||||||
|
|
||||||
if (active_cat.length > 0) {
|
if (active_cat.length > 0) {
|
||||||
var next_cat = active_cat.parent('li').next().find('.category.stick a.btn');
|
var next_cat = active_cat.parent('li').nextAll(':visible:first').find('.category.stick a.btn');
|
||||||
if (next_cat.length > 0) {
|
if (next_cat.length > 0) {
|
||||||
next_cat[0].click();
|
next_cat[0].click();
|
||||||
}
|
}
|
||||||
|
@ -355,14 +360,14 @@ function next_category() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function first_category() {
|
function first_category() {
|
||||||
var cat = $("#aside_flux .category.stick:first");
|
var cat = $("#aside_flux .category.stick:visible:first");
|
||||||
if (cat.length > 0) {
|
if (cat.length > 0) {
|
||||||
cat.find('a.btn')[0].click();
|
cat.find('a.btn')[0].click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function last_category() {
|
function last_category() {
|
||||||
var cat = $("#aside_flux .category.stick:last");
|
var cat = $("#aside_flux .category.stick:visible:last");
|
||||||
if (cat.length > 0) {
|
if (cat.length > 0) {
|
||||||
cat.find('a.btn')[0].click();
|
cat.find('a.btn')[0].click();
|
||||||
}
|
}
|
||||||
|
@ -373,11 +378,41 @@ function collapse_entry() {
|
||||||
|
|
||||||
var flux_current = $(".flux.current");
|
var flux_current = $(".flux.current");
|
||||||
flux_current.toggleClass("active");
|
flux_current.toggleClass("active");
|
||||||
if (isCollapsed) {
|
if (isCollapsed && auto_mark_article) {
|
||||||
mark_read(flux_current, true);
|
mark_read(flux_current, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function user_filter(key) {
|
||||||
|
console.log('user filter');
|
||||||
|
console.warn(key);
|
||||||
|
var filter = $('#dropdown-query');
|
||||||
|
var filters = filter.siblings('.dropdown-menu').find('.item.query a');
|
||||||
|
if (typeof key === "undefined") {
|
||||||
|
if (!filter.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Display the filter div
|
||||||
|
window.location.hash = filter.attr('id');
|
||||||
|
// Force scrolling to the filter div
|
||||||
|
var scroll = needsScroll($('.header'));
|
||||||
|
if (scroll !== 0) {
|
||||||
|
$('html,body').scrollTop(scroll);
|
||||||
|
}
|
||||||
|
// Force the key value if there is only one action, so we can trigger it automatically
|
||||||
|
if (filters.length === 1) {
|
||||||
|
key = 1;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Trigger selected share action
|
||||||
|
key = parseInt(key);
|
||||||
|
if (key <= filters.length) {
|
||||||
|
filters[key - 1].click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function auto_share(key) {
|
function auto_share(key) {
|
||||||
var share = $(".flux.current.active").find('.dropdown-target[id^="dropdown-share"]');
|
var share = $(".flux.current.active").find('.dropdown-target[id^="dropdown-share"]');
|
||||||
var shares = share.siblings('.dropdown-menu').find('.item a');
|
var shares = share.siblings('.dropdown-menu').find('.item a');
|
||||||
|
@ -503,13 +538,13 @@ function init_shortcuts() {
|
||||||
});
|
});
|
||||||
shortcut.add("shift+" + shortcuts.mark_read, function () {
|
shortcut.add("shift+" + shortcuts.mark_read, function () {
|
||||||
// on marque tout comme lu
|
// on marque tout comme lu
|
||||||
var url = $(".nav_menu a.read_all").attr("href");
|
var btn = $(".nav_menu .read_all");
|
||||||
if ($(".nav_menu a.read_all").hasClass('confirm')) {
|
if (btn.hasClass('confirm')) {
|
||||||
if (confirm(str_confirmation)) {
|
if (confirm(str_confirmation)) {
|
||||||
redirect(url, false);
|
btn.click();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
redirect(url, false);
|
btn.click();
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
'disable_in_input': true
|
'disable_in_input': true
|
||||||
|
@ -531,9 +566,19 @@ function init_shortcuts() {
|
||||||
}, {
|
}, {
|
||||||
'disable_in_input': true
|
'disable_in_input': true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
shortcut.add(shortcuts.user_filter, function () {
|
||||||
|
user_filter();
|
||||||
|
}, {
|
||||||
|
'disable_in_input': true
|
||||||
|
});
|
||||||
for(var i = 1; i < 10; i++){
|
for(var i = 1; i < 10; i++){
|
||||||
shortcut.add(i.toString(), function (e) {
|
shortcut.add(i.toString(), function (e) {
|
||||||
|
if ($('#dropdown-query').siblings('.dropdown-menu').is(':visible')) {
|
||||||
|
user_filter(String.fromCharCode(e.keyCode));
|
||||||
|
} else {
|
||||||
auto_share(String.fromCharCode(e.keyCode));
|
auto_share(String.fromCharCode(e.keyCode));
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
'disable_in_input': true
|
'disable_in_input': true
|
||||||
});
|
});
|
||||||
|
@ -618,6 +663,13 @@ function init_shortcuts() {
|
||||||
}, {
|
}, {
|
||||||
'disable_in_input': true
|
'disable_in_input': true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
shortcut.add(shortcuts.help, function () {
|
||||||
|
redirect(help_url, true);
|
||||||
|
}, {
|
||||||
|
'disable_in_input': true
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_stream(divStream) {
|
function init_stream(divStream) {
|
||||||
|
@ -650,11 +702,25 @@ function init_stream(divStream) {
|
||||||
});
|
});
|
||||||
|
|
||||||
divStream.on('click', '.item.title > a', function (e) {
|
divStream.on('click', '.item.title > a', function (e) {
|
||||||
|
// Allow default control-click behaviour such as open in backround-tab.
|
||||||
|
return e.ctrlKey;
|
||||||
|
});
|
||||||
|
divStream.on('mouseup', '.item.title > a', function (e) {
|
||||||
|
// Mouseup enables us to catch middle click.
|
||||||
if (e.ctrlKey) {
|
if (e.ctrlKey) {
|
||||||
return true; //Allow default control-click behaviour such as open in backround-tab
|
// CTRL+click, it will be manage by previous rule.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.which == 2) {
|
||||||
|
// If middle click, we want same behaviour as CTRL+click.
|
||||||
|
var e = jQuery.Event("click");
|
||||||
|
e.ctrlKey = true;
|
||||||
|
$(this).trigger(e);
|
||||||
|
} else if(e.which == 1) {
|
||||||
|
// Normal click, just toggle article.
|
||||||
|
$(this).parent().click();
|
||||||
}
|
}
|
||||||
$(this).parent().click(); //Will perform toggle flux_content
|
|
||||||
return false;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
divStream.on('click', '.flux .content a', function () {
|
divStream.on('click', '.flux .content a', function () {
|
||||||
|
@ -662,7 +728,13 @@ function init_stream(divStream) {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (auto_mark_site) {
|
if (auto_mark_site) {
|
||||||
divStream.on('click', '.flux .link > a', function () {
|
// catch mouseup instead of click so we can have the correct behaviour
|
||||||
|
// with middle button click (scroll button).
|
||||||
|
divStream.on('mouseup', '.flux .link > a', function (e) {
|
||||||
|
if (e.which == 3) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mark_read($(this).parents(".flux"), true);
|
mark_read($(this).parents(".flux"), true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -740,7 +812,7 @@ function openNotification(msg, status) {
|
||||||
notification.find(".msg").html(msg);
|
notification.find(".msg").html(msg);
|
||||||
notification.fadeIn(300);
|
notification.fadeIn(300);
|
||||||
|
|
||||||
notification_interval = window.setInterval(closeNotification, 4000);
|
notification_interval = window.setTimeout(closeNotification, 4000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeNotification() {
|
function closeNotification() {
|
||||||
|
@ -763,7 +835,7 @@ function init_notifications() {
|
||||||
|
|
||||||
if (notification.find(".msg").html().length > 0) {
|
if (notification.find(".msg").html().length > 0) {
|
||||||
notification_working = true;
|
notification_working = true;
|
||||||
notification_interval = window.setInterval(closeNotification, 4000);
|
notification_interval = window.setTimeout(closeNotification, 4000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// </notification>
|
// </notification>
|
||||||
|
@ -788,12 +860,19 @@ function notifs_html5_show(nb) {
|
||||||
|
|
||||||
var notification = new window.Notification(str_notif_title_articles, {
|
var notification = new window.Notification(str_notif_title_articles, {
|
||||||
icon: "../themes/icons/favicon-256.png",
|
icon: "../themes/icons/favicon-256.png",
|
||||||
body: str_notif_body_articles.replace("\d", nb)
|
body: str_notif_body_articles.replace("\d", nb),
|
||||||
|
tag: "freshRssNewArticles"
|
||||||
});
|
});
|
||||||
|
|
||||||
notification.onclick = function() {
|
notification.onclick = function() {
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (html5_notif_timeout !== 0){
|
||||||
|
setTimeout(function() {
|
||||||
|
notification.close();
|
||||||
|
}, html5_notif_timeout * 1000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_notifs_html5() {
|
function init_notifs_html5() {
|
||||||
|
@ -847,9 +926,13 @@ function load_more_posts() {
|
||||||
box_load_more.children('.flux:last').after($('#stream', data).children('.flux, .day'));
|
box_load_more.children('.flux:last').after($('#stream', data).children('.flux, .day'));
|
||||||
$('.pagination').replaceWith($('.pagination', data));
|
$('.pagination').replaceWith($('.pagination', data));
|
||||||
if (display_order === 'ASC') {
|
if (display_order === 'ASC') {
|
||||||
$('#nav_menu_read_all>a').attr('href', $('#bigMarkAsRead').attr('href'));
|
$('#nav_menu_read_all > .read_all').attr(
|
||||||
|
'formaction', $('#bigMarkAsRead').attr('formaction')
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
$('#bigMarkAsRead').attr('href', $('#nav_menu_read_all>a').attr('href'));
|
$('#bigMarkAsRead').attr(
|
||||||
|
'formaction', $('#nav_menu_read_all > .read_all').attr('formaction')
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$('[id^=day_]').each(function (i) {
|
$('[id^=day_]').each(function (i) {
|
||||||
|
@ -901,7 +984,7 @@ function init_load_more(box) {
|
||||||
}
|
}
|
||||||
//</endless_mode>
|
//</endless_mode>
|
||||||
|
|
||||||
//<Web login form>
|
//<crypto form (Web login)>
|
||||||
function poormanSalt() { //If crypto.getRandomValues is not available
|
function poormanSalt() { //If crypto.getRandomValues is not available
|
||||||
var text = '$2a$04$',
|
var text = '$2a$04$',
|
||||||
base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789/abcdefghijklmnopqrstuvwxyz';
|
base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789/abcdefghijklmnopqrstuvwxyz';
|
||||||
|
@ -911,20 +994,24 @@ function poormanSalt() { //If crypto.getRandomValues is not available
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_loginForm() {
|
function init_crypto_form() {
|
||||||
var $loginForm = $('#loginForm');
|
var $crypto_form = $('#crypto-form');
|
||||||
if ($loginForm.length === 0) {
|
if ($crypto_form.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(window.dcodeIO)) {
|
if (!(window.dcodeIO)) {
|
||||||
if (window.console) {
|
if (window.console) {
|
||||||
console.log('FreshRSS waiting for bcrypt.js…');
|
console.log('FreshRSS waiting for bcrypt.js…');
|
||||||
}
|
}
|
||||||
window.setTimeout(init_loginForm, 100);
|
window.setTimeout(init_crypto_form, 100);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$loginForm.on('submit', function() {
|
|
||||||
$('#loginButton').attr('disabled', '');
|
$crypto_form.on('submit', function() {
|
||||||
|
var $submit_button = $(this).find('button[type="submit"]');
|
||||||
|
$submit_button.attr('disabled', '');
|
||||||
|
|
||||||
var success = false;
|
var success = false;
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: './?c=javascript&a=nonce&user=' + $('#username').val(),
|
url: './?c=javascript&a=nonce&user=' + $('#username').val(),
|
||||||
|
@ -932,7 +1019,7 @@ function init_loginForm() {
|
||||||
async: false
|
async: false
|
||||||
}).done(function (data) {
|
}).done(function (data) {
|
||||||
if (data.salt1 == '' || data.nonce == '') {
|
if (data.salt1 == '' || data.nonce == '') {
|
||||||
alert('Invalid user!');
|
openNotification('Invalid user!', 'bad');
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
var strong = window.Uint32Array && window.crypto && (typeof window.crypto.getRandomValues === 'function'),
|
var strong = window.Uint32Array && window.crypto && (typeof window.crypto.getRandomValues === 'function'),
|
||||||
|
@ -940,22 +1027,23 @@ function init_loginForm() {
|
||||||
c = dcodeIO.bcrypt.hashSync(data.nonce + s, strong ? 4 : poormanSalt());
|
c = dcodeIO.bcrypt.hashSync(data.nonce + s, strong ? 4 : poormanSalt());
|
||||||
$('#challenge').val(c);
|
$('#challenge').val(c);
|
||||||
if (s == '' || c == '') {
|
if (s == '' || c == '') {
|
||||||
alert('Crypto error!');
|
openNotification('Crypto error!', 'bad');
|
||||||
} else {
|
} else {
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
alert('Crypto exception! ' + e);
|
openNotification('Crypto exception! ' + e, 'bad');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).fail(function() {
|
}).fail(function() {
|
||||||
alert('Communication error!');
|
openNotification('Communication error!', 'bad');
|
||||||
});
|
});
|
||||||
$('#loginButton').removeAttr('disabled');
|
|
||||||
|
$submit_button.removeAttr('disabled');
|
||||||
return success;
|
return success;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//</Web login form>
|
//</crypto form (Web login)>
|
||||||
|
|
||||||
//<persona>
|
//<persona>
|
||||||
function init_persona() {
|
function init_persona() {
|
||||||
|
@ -1021,6 +1109,11 @@ function init_persona() {
|
||||||
|
|
||||||
function init_confirm_action() {
|
function init_confirm_action() {
|
||||||
$('body').on('click', '.confirm', function () {
|
$('body').on('click', '.confirm', function () {
|
||||||
|
var str_confirmation = $(this).attr('data-str-confirm');
|
||||||
|
if (!str_confirmation) {
|
||||||
|
str_confirmation = str_confirmation_default;
|
||||||
|
}
|
||||||
|
|
||||||
return confirm(str_confirmation);
|
return confirm(str_confirmation);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1157,9 +1250,6 @@ function init_all() {
|
||||||
}
|
}
|
||||||
init_notifications();
|
init_notifications();
|
||||||
switch (authType) {
|
switch (authType) {
|
||||||
case 'form':
|
|
||||||
init_loginForm();
|
|
||||||
break;
|
|
||||||
case 'persona':
|
case 'persona':
|
||||||
init_persona();
|
init_persona();
|
||||||
break;
|
break;
|
||||||
|
@ -1179,6 +1269,7 @@ function init_all() {
|
||||||
init_notifs_html5();
|
init_notifs_html5();
|
||||||
window.setInterval(refreshUnreads, 120000);
|
window.setInterval(refreshUnreads, 120000);
|
||||||
} else {
|
} else {
|
||||||
|
init_crypto_form();
|
||||||
init_share_observers();
|
init_share_observers();
|
||||||
init_remove_observers();
|
init_remove_observers();
|
||||||
init_feed_observers();
|
init_feed_observers();
|
||||||
|
|
|
@ -16,9 +16,9 @@ html, body {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== Links */
|
/*=== Links */
|
||||||
a {
|
a, button.as-link {
|
||||||
outline: none;
|
|
||||||
color: #6986B2;
|
color: #6986B2;
|
||||||
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== Images */
|
/*=== Images */
|
||||||
|
@ -338,8 +338,9 @@ a.btn {
|
||||||
padding: 0 25px;
|
padding: 0 25px;
|
||||||
line-height: 2.5em;
|
line-height: 2.5em;
|
||||||
}
|
}
|
||||||
.dropdown-menu > .item > span {
|
.dropdown-menu > .item > span,
|
||||||
padding: 0 25px;
|
.dropdown-menu > .item > .as-link {
|
||||||
|
padding: 0 22px;
|
||||||
line-height: 2em;
|
line-height: 2em;
|
||||||
}
|
}
|
||||||
.dropdown-menu > .item:hover {
|
.dropdown-menu > .item:hover {
|
||||||
|
@ -871,7 +872,18 @@ a.btn {
|
||||||
.stat > table td,
|
.stat > table td,
|
||||||
.stat > table th {
|
.stat > table th {
|
||||||
border-bottom: 1px solid #333;
|
border-bottom: 1px solid #333;
|
||||||
text-align: center;
|
}
|
||||||
|
|
||||||
|
.stat > .horizontal-list {
|
||||||
|
margin: 0 0 5px;
|
||||||
|
}
|
||||||
|
.stat > .horizontal-list .item {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.stat > .horizontal-list .item:first-child {
|
||||||
|
width: 270px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== LOGS */
|
/*=== LOGS */
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
"author": "AD",
|
"author": "AD",
|
||||||
"description": "Le coté obscur du thème “Origine”",
|
"description": "Le coté obscur du thème “Origine”",
|
||||||
"version": 0.2,
|
"version": 0.2,
|
||||||
"files": ["template.css", "dark.css"]
|
"files": ["_template.css", "dark.css"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,698 +0,0 @@
|
||||||
@charset "UTF-8";
|
|
||||||
|
|
||||||
/*=== GENERAL */
|
|
||||||
/*============*/
|
|
||||||
html, body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
font-size: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Links */
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Lists */
|
|
||||||
ul, ol, dd {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Titles */
|
|
||||||
h1 {
|
|
||||||
margin: 0.6em 0 0.3em;
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
margin: 0.5em 0 0.25em;
|
|
||||||
font-size: 1.3em;
|
|
||||||
line-height: 2em;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
margin: 0.5em 0 0.25em;
|
|
||||||
font-size: 1.1em;
|
|
||||||
line-height: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Paragraphs */
|
|
||||||
p {
|
|
||||||
margin: 1em 0 0.5em;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Images */
|
|
||||||
img {
|
|
||||||
height: auto;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
img.favicon {
|
|
||||||
height: 16px;
|
|
||||||
width: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Videos */
|
|
||||||
iframe, embed, object, video {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Forms */
|
|
||||||
legend {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
label {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
width: 180px;
|
|
||||||
}
|
|
||||||
textarea {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
input, select, textarea {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
width: 15px !important;
|
|
||||||
min-height: 15px !important;
|
|
||||||
}
|
|
||||||
input.extend:focus {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== COMPONENTS */
|
|
||||||
/*===============*/
|
|
||||||
/*=== Forms */
|
|
||||||
.form-group:after {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.form-group.form-actions {
|
|
||||||
min-width: 250px;
|
|
||||||
}
|
|
||||||
.form-group .group-name {
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
.form-group .group-controls {
|
|
||||||
min-width: 250px;
|
|
||||||
margin: 0 0 0 220px;
|
|
||||||
}
|
|
||||||
.form-group .group-controls .control {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Buttons */
|
|
||||||
.stick {
|
|
||||||
display: inline-block;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.btn,
|
|
||||||
a.btn {
|
|
||||||
display: inline-block;
|
|
||||||
cursor: pointer;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.btn-important {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Navigation */
|
|
||||||
.nav-list .nav-header,
|
|
||||||
.nav-list .item {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-list .item,
|
|
||||||
.nav-list .item > a {
|
|
||||||
display: block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.nav-head {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-head .item {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Horizontal-list */
|
|
||||||
.horizontal-list {
|
|
||||||
display: table;
|
|
||||||
table-layout: fixed;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.horizontal-list .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Dropdown */
|
|
||||||
.dropdown {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.dropdown-target {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.dropdown-menu {
|
|
||||||
display: none;
|
|
||||||
min-width: 200px;
|
|
||||||
margin: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
.dropdown-header {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item > a,
|
|
||||||
.dropdown-menu > .item > span {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item[aria-checked="true"] > a:before {
|
|
||||||
content: '✓';
|
|
||||||
}
|
|
||||||
.dropdown-menu .input {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu .input select,
|
|
||||||
.dropdown-menu .input input {
|
|
||||||
display: block;
|
|
||||||
max-width: 95%;
|
|
||||||
}
|
|
||||||
.dropdown-target:target ~ .dropdown-menu {
|
|
||||||
display: block;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
.dropdown-close {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
.dropdown-close a {
|
|
||||||
font-size: 0;
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
display: block;
|
|
||||||
z-index: -10;
|
|
||||||
}
|
|
||||||
.separator {
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Alerts */
|
|
||||||
.alert {
|
|
||||||
display: block;
|
|
||||||
width: 90%;
|
|
||||||
}
|
|
||||||
.group-controls .alert {
|
|
||||||
width: 100%
|
|
||||||
}
|
|
||||||
.alert-head {
|
|
||||||
margin: 0;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.alert ul {
|
|
||||||
margin: 5px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Icons */
|
|
||||||
.icon {
|
|
||||||
display: inline-block;
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
line-height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Pagination */
|
|
||||||
.pagination {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.pagination .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
.pagination .pager-first,
|
|
||||||
.pagination .pager-previous,
|
|
||||||
.pagination .pager-next,
|
|
||||||
.pagination .pager-last {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== STRUCTURE */
|
|
||||||
/*===============*/
|
|
||||||
/*=== Header */
|
|
||||||
.header {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.header > .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
.header > .item.title {
|
|
||||||
width: 250px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.header > .item.title h1 {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.header > .item.title .logo {
|
|
||||||
display: inline-block;
|
|
||||||
height: 32px;
|
|
||||||
width: 32px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.header > .item.configure {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Body */
|
|
||||||
#global {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.aside {
|
|
||||||
display: table-cell;
|
|
||||||
height: 100%;
|
|
||||||
width: 250px;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.aside.aside_flux {
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Aside main page (categories) */
|
|
||||||
.categories {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.state_unread li:not(.active)[data-unread="0"] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.category {
|
|
||||||
display: block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.category .btn:not([data-unread="0"]):after {
|
|
||||||
content: attr(data-unread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Aside main page (feeds) */
|
|
||||||
.categories .feeds {
|
|
||||||
width: 100%;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
.categories .feeds:not(.active) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.categories .feeds .feed {
|
|
||||||
display: inline-block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.categories .feeds .feed:not([data-unread="0"]):before {
|
|
||||||
content: "(" attr(data-unread) ") ";
|
|
||||||
}
|
|
||||||
.categories .feeds .dropdown-menu {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
.categories .feeds .item .dropdown-toggle > .icon {
|
|
||||||
visibility: hidden;
|
|
||||||
cursor: pointer;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.categories .feeds .item .dropdown-target:target ~ .dropdown-toggle > .icon,
|
|
||||||
.categories .feeds .item:hover .dropdown-toggle > .icon,
|
|
||||||
.categories .feeds .item.active .dropdown-toggle > .icon {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== New article notification */
|
|
||||||
#new-article {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#new-article > a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Day indication */
|
|
||||||
.day .name {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
width: 50%;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Feed article header and footer */
|
|
||||||
.flux_header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.flux .item {
|
|
||||||
line-height: 40px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.flux .item.manage,
|
|
||||||
.flux .item.link {
|
|
||||||
width: 40px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.flux .item.website {
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
.flux.not_read .item.title,
|
|
||||||
.flux.current .item.title {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.flux:not(.current):hover .item.title {
|
|
||||||
position: absolute;
|
|
||||||
max-width: calc(100% - 320px);
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
.flux .item.title a {
|
|
||||||
color: #000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.flux .item.date {
|
|
||||||
width: 145px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.flux .item > a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.flux .item > a {
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.flux .item.share > a {
|
|
||||||
display: list-item;
|
|
||||||
list-style-position: inside;
|
|
||||||
list-style-type: decimal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Feed article content */
|
|
||||||
.hide_posts > .flux:not(.active) > .flux_content {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.content {
|
|
||||||
min-height: 20em;
|
|
||||||
margin: auto;
|
|
||||||
line-height: 1.7em;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
.content.large {
|
|
||||||
max-width: 1000px;
|
|
||||||
}
|
|
||||||
.content.medium {
|
|
||||||
max-width: 800px;
|
|
||||||
}
|
|
||||||
.content.thin {
|
|
||||||
max-width: 550px;
|
|
||||||
}
|
|
||||||
.content ul,
|
|
||||||
.content ol,
|
|
||||||
.content dd {
|
|
||||||
margin: 0 0 0 15px;
|
|
||||||
padding: 0 0 5px 15px;
|
|
||||||
}
|
|
||||||
.content pre {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Notification and actualize notification */
|
|
||||||
.notification {
|
|
||||||
position: absolute;
|
|
||||||
top: 1em;
|
|
||||||
left: 25%; right: 25%;
|
|
||||||
z-index: 10;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
.notification.closed {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.notification a.close {
|
|
||||||
position: absolute;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#actualizeProgress {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
#actualizeProgress progress {
|
|
||||||
max-width: 100%;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
#actualizeProgress .progress {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Navigation menu (for articles) */
|
|
||||||
#nav_entries {
|
|
||||||
position: fixed;
|
|
||||||
bottom: 0; left: 0;
|
|
||||||
display: table;
|
|
||||||
width: 250px;
|
|
||||||
background: #fff;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
#nav_entries .item {
|
|
||||||
display: table-cell;
|
|
||||||
width: 30%;
|
|
||||||
}
|
|
||||||
#nav_entries a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== "Load more" part */
|
|
||||||
#load_more {
|
|
||||||
min-height: 40px;
|
|
||||||
}
|
|
||||||
.loading {
|
|
||||||
background: url("loader.gif") center center no-repeat;
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
#bigMarkAsRead {
|
|
||||||
display: block;
|
|
||||||
padding: 3em 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.bigTick {
|
|
||||||
font-size: 7em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Statistiques */
|
|
||||||
.stat > table {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== GLOBAL VIEW */
|
|
||||||
/*================*/
|
|
||||||
/*=== Category boxes */
|
|
||||||
#stream.global .box-category {
|
|
||||||
display: inline-block;
|
|
||||||
width: 19em;
|
|
||||||
max-width: 95%;
|
|
||||||
margin: 20px 10px;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
#stream.global .category {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
#stream.global .btn {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#stream.global .box-category .feeds {
|
|
||||||
display: block;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
#stream.global .box-category .feed {
|
|
||||||
width: 19em;
|
|
||||||
max-width: 90%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Panel */
|
|
||||||
#overlay {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
background: rgba(0, 0, 0, 0.9);
|
|
||||||
}
|
|
||||||
#panel {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 1em; bottom: 1em;
|
|
||||||
left: 2em; right: 2em;
|
|
||||||
overflow: auto;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
#panel .close {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#panel .close img {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== DIVERS */
|
|
||||||
/*===========*/
|
|
||||||
.nav-login,
|
|
||||||
.nav_menu .search,
|
|
||||||
.nav_menu .toggle_aside {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aside .toggle_aside {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
display: none;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
line-height: 30px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== MOBILE */
|
|
||||||
/*===========*/
|
|
||||||
@media(max-width: 840px) {
|
|
||||||
.header,
|
|
||||||
.aside .btn-important,
|
|
||||||
.aside .feeds .dropdown,
|
|
||||||
.flux_header .item.website span,
|
|
||||||
.item.date, .day .date,
|
|
||||||
.dropdown-menu > .no-mobile,
|
|
||||||
.no-mobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.nav-login {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav_menu .toggle_aside,
|
|
||||||
.aside .toggle_aside,
|
|
||||||
.nav_menu .search,
|
|
||||||
#panel .close img {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aside {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
z-index: 100;
|
|
||||||
}
|
|
||||||
.aside:target {
|
|
||||||
width: 90%;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
.aside .categories {
|
|
||||||
margin: 10px 0 75px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flux_header .item.website {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flux:not(.current):hover .item.title {
|
|
||||||
position: relative;
|
|
||||||
width: auto;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav_entries {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#stream.global .box-category {
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#panel {
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
}
|
|
||||||
#panel .close {
|
|
||||||
top: 0; right: 0;
|
|
||||||
left: auto; bottom: auto;
|
|
||||||
display: inline-block;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== PRINTER */
|
|
||||||
/*============*/
|
|
||||||
@media print {
|
|
||||||
.header, .aside,
|
|
||||||
.nav_menu, .day,
|
|
||||||
.flux_header,
|
|
||||||
.flux_content .bottom,
|
|
||||||
.pagination,
|
|
||||||
#nav_entries {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
background: #fff;
|
|
||||||
color: #000;
|
|
||||||
font-family: Serif;
|
|
||||||
}
|
|
||||||
#global,
|
|
||||||
.flux_content {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
.flux_content .content {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.flux_content .content a {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
.flux_content .content a:after {
|
|
||||||
content: " [" attr(href) "] ";
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -15,7 +15,7 @@ html, body {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== Links */
|
/*=== Links */
|
||||||
a {
|
a, button.as-link {
|
||||||
color: #2980b9;
|
color: #2980b9;
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ input, select, textarea {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border: none;
|
border: none;
|
||||||
border-bottom: 3px solid #ddd;
|
border-bottom: 3px solid #ddd;
|
||||||
|
border-left-color: #ddd;
|
||||||
color: #666;
|
color: #666;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
|
@ -155,10 +156,17 @@ form th {
|
||||||
.stick .btn + .dropdown > .btn {
|
.stick .btn + .dropdown > .btn {
|
||||||
border-radius: 0 5px 5px 0;
|
border-radius: 0 5px 5px 0;
|
||||||
}
|
}
|
||||||
|
.stick .btn + .btn,
|
||||||
.stick .btn + input,
|
.stick .btn + input,
|
||||||
|
.stick .btn + .dropdown > .btn,
|
||||||
|
.stick input + .btn,
|
||||||
.stick input + input,
|
.stick input + input,
|
||||||
.stick .dropdown + input {
|
.stick input + .dropdown > .btn,
|
||||||
border-left: 1px solid #ddd;
|
.stick .dropdown + .btn,
|
||||||
|
.stick .dropdown + input,
|
||||||
|
.stick .dropdown + .dropdown > .btn {
|
||||||
|
border-left-width: 1px;
|
||||||
|
border-left-style: solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
|
@ -175,6 +183,7 @@ form th {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
border: none;
|
border: none;
|
||||||
border-bottom: 3px solid #2980b9;
|
border-bottom: 3px solid #2980b9;
|
||||||
|
border-left-color: #2980b9;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
a.btn {
|
a.btn {
|
||||||
|
@ -196,6 +205,7 @@ a.btn {
|
||||||
background: #e67e22;
|
background: #e67e22;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-bottom: 3px solid #d35400;
|
border-bottom: 3px solid #d35400;
|
||||||
|
border-left-color: #d35400;
|
||||||
}
|
}
|
||||||
.btn-important:hover,
|
.btn-important:hover,
|
||||||
.btn-important:active {
|
.btn-important:active {
|
||||||
|
@ -206,6 +216,7 @@ a.btn {
|
||||||
background: #e74c3c;
|
background: #e74c3c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-bottom: 3px solid #c0392b;
|
border-bottom: 3px solid #c0392b;
|
||||||
|
border-left-color: #c0392b;
|
||||||
}
|
}
|
||||||
.btn-attention:hover,
|
.btn-attention:hover,
|
||||||
.btn-attention:active {
|
.btn-attention:active {
|
||||||
|
@ -327,17 +338,21 @@ a.btn {
|
||||||
padding: 0 25px;
|
padding: 0 25px;
|
||||||
line-height: 2.5em;
|
line-height: 2.5em;
|
||||||
}
|
}
|
||||||
.dropdown-menu > .item > span {
|
.dropdown-menu > .item > span,
|
||||||
padding: 0 25px;
|
.dropdown-menu > .item > .as-link {
|
||||||
|
padding: 0 22px;
|
||||||
line-height: 2em;
|
line-height: 2em;
|
||||||
}
|
}
|
||||||
|
.dropdown-menu > .item:hover {
|
||||||
|
background: #2980b9;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
.dropdown-menu > .item[aria-checked="true"] > a:before {
|
.dropdown-menu > .item[aria-checked="true"] > a:before {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin: 0 0 0 -14px;
|
margin: 0 0 0 -14px;
|
||||||
}
|
}
|
||||||
.dropdown-menu > .item:hover > a {
|
.dropdown-menu > .item:hover > a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background: #2980b9;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.dropdown-menu .input select,
|
.dropdown-menu .input select,
|
||||||
|
@ -844,7 +859,18 @@ a.btn {
|
||||||
.stat > table td,
|
.stat > table td,
|
||||||
.stat > table th {
|
.stat > table th {
|
||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
text-align: center;
|
}
|
||||||
|
|
||||||
|
.stat > .horizontal-list {
|
||||||
|
margin: 0 0 5px;
|
||||||
|
}
|
||||||
|
.stat > .horizontal-list .item {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.stat > .horizontal-list .item:first-child {
|
||||||
|
width: 270px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== LOGS */
|
/*=== LOGS */
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
"author": "Marien Fressinaud",
|
"author": "Marien Fressinaud",
|
||||||
"description": "Thème plat pour FreshRSS",
|
"description": "Thème plat pour FreshRSS",
|
||||||
"version": 0.2,
|
"version": 0.2,
|
||||||
"files": ["template.css", "flat.css"]
|
"files": ["_template.css", "flat.css"]
|
||||||
}
|
}
|
|
@ -1,698 +0,0 @@
|
||||||
@charset "UTF-8";
|
|
||||||
|
|
||||||
/*=== GENERAL */
|
|
||||||
/*============*/
|
|
||||||
html, body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
font-size: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Links */
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Lists */
|
|
||||||
ul, ol, dd {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Titles */
|
|
||||||
h1 {
|
|
||||||
margin: 0.6em 0 0.3em;
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
margin: 0.5em 0 0.25em;
|
|
||||||
font-size: 1.3em;
|
|
||||||
line-height: 2em;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
margin: 0.5em 0 0.25em;
|
|
||||||
font-size: 1.1em;
|
|
||||||
line-height: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Paragraphs */
|
|
||||||
p {
|
|
||||||
margin: 1em 0 0.5em;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Images */
|
|
||||||
img {
|
|
||||||
height: auto;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
img.favicon {
|
|
||||||
height: 16px;
|
|
||||||
width: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Videos */
|
|
||||||
iframe, embed, object, video {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Forms */
|
|
||||||
legend {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
label {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
width: 180px;
|
|
||||||
}
|
|
||||||
textarea {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
input, select, textarea {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
width: 15px !important;
|
|
||||||
min-height: 15px !important;
|
|
||||||
}
|
|
||||||
input.extend:focus {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== COMPONENTS */
|
|
||||||
/*===============*/
|
|
||||||
/*=== Forms */
|
|
||||||
.form-group:after {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.form-group.form-actions {
|
|
||||||
min-width: 250px;
|
|
||||||
}
|
|
||||||
.form-group .group-name {
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
.form-group .group-controls {
|
|
||||||
min-width: 250px;
|
|
||||||
margin: 0 0 0 220px;
|
|
||||||
}
|
|
||||||
.form-group .group-controls .control {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Buttons */
|
|
||||||
.stick {
|
|
||||||
display: inline-block;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.btn,
|
|
||||||
a.btn {
|
|
||||||
display: inline-block;
|
|
||||||
cursor: pointer;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.btn-important {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Navigation */
|
|
||||||
.nav-list .nav-header,
|
|
||||||
.nav-list .item {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-list .item,
|
|
||||||
.nav-list .item > a {
|
|
||||||
display: block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.nav-head {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-head .item {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Horizontal-list */
|
|
||||||
.horizontal-list {
|
|
||||||
display: table;
|
|
||||||
table-layout: fixed;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.horizontal-list .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Dropdown */
|
|
||||||
.dropdown {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.dropdown-target {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.dropdown-menu {
|
|
||||||
display: none;
|
|
||||||
min-width: 200px;
|
|
||||||
margin: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
.dropdown-header {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item > a,
|
|
||||||
.dropdown-menu > .item > span {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item[aria-checked="true"] > a:before {
|
|
||||||
content: '✓';
|
|
||||||
}
|
|
||||||
.dropdown-menu .input {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu .input select,
|
|
||||||
.dropdown-menu .input input {
|
|
||||||
display: block;
|
|
||||||
max-width: 95%;
|
|
||||||
}
|
|
||||||
.dropdown-target:target ~ .dropdown-menu {
|
|
||||||
display: block;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
.dropdown-close {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
.dropdown-close a {
|
|
||||||
font-size: 0;
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
display: block;
|
|
||||||
z-index: -10;
|
|
||||||
}
|
|
||||||
.separator {
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Alerts */
|
|
||||||
.alert {
|
|
||||||
display: block;
|
|
||||||
width: 90%;
|
|
||||||
}
|
|
||||||
.group-controls .alert {
|
|
||||||
width: 100%
|
|
||||||
}
|
|
||||||
.alert-head {
|
|
||||||
margin: 0;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.alert ul {
|
|
||||||
margin: 5px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Icons */
|
|
||||||
.icon {
|
|
||||||
display: inline-block;
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
line-height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Pagination */
|
|
||||||
.pagination {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.pagination .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
.pagination .pager-first,
|
|
||||||
.pagination .pager-previous,
|
|
||||||
.pagination .pager-next,
|
|
||||||
.pagination .pager-last {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== STRUCTURE */
|
|
||||||
/*===============*/
|
|
||||||
/*=== Header */
|
|
||||||
.header {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.header > .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
.header > .item.title {
|
|
||||||
width: 250px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.header > .item.title h1 {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.header > .item.title .logo {
|
|
||||||
display: inline-block;
|
|
||||||
height: 32px;
|
|
||||||
width: 32px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.header > .item.configure {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Body */
|
|
||||||
#global {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.aside {
|
|
||||||
display: table-cell;
|
|
||||||
height: 100%;
|
|
||||||
width: 250px;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.aside.aside_flux {
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Aside main page (categories) */
|
|
||||||
.categories {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.state_unread li:not(.active)[data-unread="0"] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.category {
|
|
||||||
display: block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.category .btn:not([data-unread="0"]):after {
|
|
||||||
content: attr(data-unread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Aside main page (feeds) */
|
|
||||||
.categories .feeds {
|
|
||||||
width: 100%;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
.categories .feeds:not(.active) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.categories .feeds .feed {
|
|
||||||
display: inline-block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.categories .feeds .feed:not([data-unread="0"]):before {
|
|
||||||
content: "(" attr(data-unread) ") ";
|
|
||||||
}
|
|
||||||
.categories .feeds .dropdown-menu {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
.categories .feeds .item .dropdown-toggle > .icon {
|
|
||||||
visibility: hidden;
|
|
||||||
cursor: pointer;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.categories .feeds .item .dropdown-target:target ~ .dropdown-toggle > .icon,
|
|
||||||
.categories .feeds .item:hover .dropdown-toggle > .icon,
|
|
||||||
.categories .feeds .item.active .dropdown-toggle > .icon {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== New article notification */
|
|
||||||
#new-article {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#new-article > a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Day indication */
|
|
||||||
.day .name {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
width: 50%;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Feed article header and footer */
|
|
||||||
.flux_header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.flux .item {
|
|
||||||
line-height: 40px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.flux .item.manage,
|
|
||||||
.flux .item.link {
|
|
||||||
width: 40px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.flux .item.website {
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
.flux.not_read .item.title,
|
|
||||||
.flux.current .item.title {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.flux:not(.current):hover .item.title {
|
|
||||||
position: absolute;
|
|
||||||
max-width: calc(100% - 320px);
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
.flux .item.title a {
|
|
||||||
color: #000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.flux .item.date {
|
|
||||||
width: 145px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.flux .item > a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.flux .item > a {
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.flux .item.share > a {
|
|
||||||
display: list-item;
|
|
||||||
list-style-position: inside;
|
|
||||||
list-style-type: decimal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Feed article content */
|
|
||||||
.hide_posts > .flux:not(.active) > .flux_content {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.content {
|
|
||||||
min-height: 20em;
|
|
||||||
margin: auto;
|
|
||||||
line-height: 1.7em;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
.content.large {
|
|
||||||
max-width: 1000px;
|
|
||||||
}
|
|
||||||
.content.medium {
|
|
||||||
max-width: 800px;
|
|
||||||
}
|
|
||||||
.content.thin {
|
|
||||||
max-width: 550px;
|
|
||||||
}
|
|
||||||
.content ul,
|
|
||||||
.content ol,
|
|
||||||
.content dd {
|
|
||||||
margin: 0 0 0 15px;
|
|
||||||
padding: 0 0 5px 15px;
|
|
||||||
}
|
|
||||||
.content pre {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Notification and actualize notification */
|
|
||||||
.notification {
|
|
||||||
position: absolute;
|
|
||||||
top: 1em;
|
|
||||||
left: 25%; right: 25%;
|
|
||||||
z-index: 10;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
.notification.closed {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.notification a.close {
|
|
||||||
position: absolute;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#actualizeProgress {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
#actualizeProgress progress {
|
|
||||||
max-width: 100%;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
#actualizeProgress .progress {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Navigation menu (for articles) */
|
|
||||||
#nav_entries {
|
|
||||||
position: fixed;
|
|
||||||
bottom: 0; left: 0;
|
|
||||||
display: table;
|
|
||||||
width: 250px;
|
|
||||||
background: #fff;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
#nav_entries .item {
|
|
||||||
display: table-cell;
|
|
||||||
width: 30%;
|
|
||||||
}
|
|
||||||
#nav_entries a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== "Load more" part */
|
|
||||||
#load_more {
|
|
||||||
min-height: 40px;
|
|
||||||
}
|
|
||||||
.loading {
|
|
||||||
background: url("loader.gif") center center no-repeat;
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
#bigMarkAsRead {
|
|
||||||
display: block;
|
|
||||||
padding: 3em 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.bigTick {
|
|
||||||
font-size: 7em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Statistiques */
|
|
||||||
.stat > table {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== GLOBAL VIEW */
|
|
||||||
/*================*/
|
|
||||||
/*=== Category boxes */
|
|
||||||
#stream.global .box-category {
|
|
||||||
display: inline-block;
|
|
||||||
width: 19em;
|
|
||||||
max-width: 95%;
|
|
||||||
margin: 20px 10px;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
#stream.global .category {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
#stream.global .btn {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#stream.global .box-category .feeds {
|
|
||||||
display: block;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
#stream.global .box-category .feed {
|
|
||||||
width: 19em;
|
|
||||||
max-width: 90%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Panel */
|
|
||||||
#overlay {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
background: rgba(0, 0, 0, 0.9);
|
|
||||||
}
|
|
||||||
#panel {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 1em; bottom: 1em;
|
|
||||||
left: 2em; right: 2em;
|
|
||||||
overflow: auto;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
#panel .close {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#panel .close img {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== DIVERS */
|
|
||||||
/*===========*/
|
|
||||||
.nav-login,
|
|
||||||
.nav_menu .search,
|
|
||||||
.nav_menu .toggle_aside {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aside .toggle_aside {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
display: none;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
line-height: 30px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== MOBILE */
|
|
||||||
/*===========*/
|
|
||||||
@media(max-width: 840px) {
|
|
||||||
.header,
|
|
||||||
.aside .btn-important,
|
|
||||||
.aside .feeds .dropdown,
|
|
||||||
.flux_header .item.website span,
|
|
||||||
.item.date, .day .date,
|
|
||||||
.dropdown-menu > .no-mobile,
|
|
||||||
.no-mobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.nav-login {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav_menu .toggle_aside,
|
|
||||||
.aside .toggle_aside,
|
|
||||||
.nav_menu .search,
|
|
||||||
#panel .close img {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aside {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
z-index: 100;
|
|
||||||
}
|
|
||||||
.aside:target {
|
|
||||||
width: 90%;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
.aside .categories {
|
|
||||||
margin: 10px 0 75px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flux_header .item.website {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flux:not(.current):hover .item.title {
|
|
||||||
position: relative;
|
|
||||||
width: auto;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav_entries {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#stream.global .box-category {
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#panel {
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
}
|
|
||||||
#panel .close {
|
|
||||||
top: 0; right: 0;
|
|
||||||
left: auto; bottom: auto;
|
|
||||||
display: inline-block;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== PRINTER */
|
|
||||||
/*============*/
|
|
||||||
@media print {
|
|
||||||
.header, .aside,
|
|
||||||
.nav_menu, .day,
|
|
||||||
.flux_header,
|
|
||||||
.flux_content .bottom,
|
|
||||||
.pagination,
|
|
||||||
#nav_entries {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
background: #fff;
|
|
||||||
color: #000;
|
|
||||||
font-family: Serif;
|
|
||||||
}
|
|
||||||
#global,
|
|
||||||
.flux_content {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
.flux_content .content {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.flux_content .content a {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
.flux_content .content a:after {
|
|
||||||
content: " [" attr(href) "] ";
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,5 +3,5 @@
|
||||||
"author": "Marien Fressinaud",
|
"author": "Marien Fressinaud",
|
||||||
"description": "Le thème par défaut pour FreshRSS",
|
"description": "Le thème par défaut pour FreshRSS",
|
||||||
"version": 0.2,
|
"version": 0.2,
|
||||||
"files": ["template.css", "origine.css"]
|
"files": ["_template.css", "origine.css"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ html, body {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== Links */
|
/*=== Links */
|
||||||
a {
|
a, button.as-link {
|
||||||
color: #0062be;
|
color: #0062be;
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
@ -364,8 +364,9 @@ a.btn {
|
||||||
padding: 0 25px;
|
padding: 0 25px;
|
||||||
line-height: 2.5em;
|
line-height: 2.5em;
|
||||||
}
|
}
|
||||||
.dropdown-menu > .item > span {
|
.dropdown-menu > .item > span,
|
||||||
padding: 0 25px;
|
.dropdown-menu > .item > .as-link {
|
||||||
|
padding: 0 22px;
|
||||||
line-height: 2em;
|
line-height: 2em;
|
||||||
}
|
}
|
||||||
.dropdown-menu > .item:hover {
|
.dropdown-menu > .item:hover {
|
||||||
|
@ -807,16 +808,12 @@ a.btn {
|
||||||
background: #fafafa;
|
background: #fafafa;
|
||||||
}
|
}
|
||||||
#bigMarkAsRead:hover {
|
#bigMarkAsRead:hover {
|
||||||
color: #000;
|
color: #0062be;
|
||||||
background: #ccc;
|
background: #fff;
|
||||||
background: radial-gradient(circle at 50% -25% , #ccc 0%, #fafafa 50%);
|
box-shadow: 0 -5px 10px #eee inset;
|
||||||
background: -moz-radial-gradient(circle at 50% -25% , #ccc 0%, #fafafa 50%);
|
|
||||||
background: -webkit-radial-gradient(circle at 50% -25% , #ccc 0%, #fafafa 50%);
|
|
||||||
background: -o-radial-gradient(circle at 50% -25% , #ccc 0%, #fafafa 50%);
|
|
||||||
background: -ms-radial-gradient(circle at 50% -25% , #ccc 0%, #fafafa 50%);
|
|
||||||
}
|
}
|
||||||
#bigMarkAsRead:hover .bigTick {
|
#bigMarkAsRead:hover .bigTick {
|
||||||
text-shadow: 0 0 10px #666;
|
text-shadow: 0 0 5px #0062be;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== Navigation menu (for articles) */
|
/*=== Navigation menu (for articles) */
|
||||||
|
@ -916,7 +913,18 @@ a.btn {
|
||||||
.stat > table td,
|
.stat > table td,
|
||||||
.stat > table th {
|
.stat > table th {
|
||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
text-align: center;
|
}
|
||||||
|
|
||||||
|
.stat > .horizontal-list {
|
||||||
|
margin: 0 0 5px;
|
||||||
|
}
|
||||||
|
.stat > .horizontal-list .item {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.stat > .horizontal-list .item:first-child {
|
||||||
|
width: 270px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=== LOGS */
|
/*=== LOGS */
|
||||||
|
|
|
@ -1,698 +0,0 @@
|
||||||
@charset "UTF-8";
|
|
||||||
|
|
||||||
/*=== GENERAL */
|
|
||||||
/*============*/
|
|
||||||
html, body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
font-size: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Links */
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Lists */
|
|
||||||
ul, ol, dd {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Titles */
|
|
||||||
h1 {
|
|
||||||
margin: 0.6em 0 0.3em;
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
margin: 0.5em 0 0.25em;
|
|
||||||
font-size: 1.3em;
|
|
||||||
line-height: 2em;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
margin: 0.5em 0 0.25em;
|
|
||||||
font-size: 1.1em;
|
|
||||||
line-height: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Paragraphs */
|
|
||||||
p {
|
|
||||||
margin: 1em 0 0.5em;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Images */
|
|
||||||
img {
|
|
||||||
height: auto;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
img.favicon {
|
|
||||||
height: 16px;
|
|
||||||
width: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Videos */
|
|
||||||
iframe, embed, object, video {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Forms */
|
|
||||||
legend {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
label {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
width: 180px;
|
|
||||||
}
|
|
||||||
textarea {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
input, select, textarea {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
width: 15px !important;
|
|
||||||
min-height: 15px !important;
|
|
||||||
}
|
|
||||||
input.extend:focus {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== COMPONENTS */
|
|
||||||
/*===============*/
|
|
||||||
/*=== Forms */
|
|
||||||
.form-group:after {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.form-group.form-actions {
|
|
||||||
min-width: 250px;
|
|
||||||
}
|
|
||||||
.form-group .group-name {
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
.form-group .group-controls {
|
|
||||||
min-width: 250px;
|
|
||||||
margin: 0 0 0 220px;
|
|
||||||
}
|
|
||||||
.form-group .group-controls .control {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Buttons */
|
|
||||||
.stick {
|
|
||||||
display: inline-block;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.btn,
|
|
||||||
a.btn {
|
|
||||||
display: inline-block;
|
|
||||||
cursor: pointer;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.btn-important {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Navigation */
|
|
||||||
.nav-list .nav-header,
|
|
||||||
.nav-list .item {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-list .item,
|
|
||||||
.nav-list .item > a {
|
|
||||||
display: block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.nav-head {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-head .item {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Horizontal-list */
|
|
||||||
.horizontal-list {
|
|
||||||
display: table;
|
|
||||||
table-layout: fixed;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.horizontal-list .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Dropdown */
|
|
||||||
.dropdown {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.dropdown-target {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.dropdown-menu {
|
|
||||||
display: none;
|
|
||||||
min-width: 200px;
|
|
||||||
margin: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
.dropdown-header {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item > a,
|
|
||||||
.dropdown-menu > .item > span {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu > .item[aria-checked="true"] > a:before {
|
|
||||||
content: '✓';
|
|
||||||
}
|
|
||||||
.dropdown-menu .input {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.dropdown-menu .input select,
|
|
||||||
.dropdown-menu .input input {
|
|
||||||
display: block;
|
|
||||||
max-width: 95%;
|
|
||||||
}
|
|
||||||
.dropdown-target:target ~ .dropdown-menu {
|
|
||||||
display: block;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
.dropdown-close {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
.dropdown-close a {
|
|
||||||
font-size: 0;
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
display: block;
|
|
||||||
z-index: -10;
|
|
||||||
}
|
|
||||||
.separator {
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Alerts */
|
|
||||||
.alert {
|
|
||||||
display: block;
|
|
||||||
width: 90%;
|
|
||||||
}
|
|
||||||
.group-controls .alert {
|
|
||||||
width: 100%
|
|
||||||
}
|
|
||||||
.alert-head {
|
|
||||||
margin: 0;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.alert ul {
|
|
||||||
margin: 5px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Icons */
|
|
||||||
.icon {
|
|
||||||
display: inline-block;
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
line-height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Pagination */
|
|
||||||
.pagination {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.pagination .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
.pagination .pager-first,
|
|
||||||
.pagination .pager-previous,
|
|
||||||
.pagination .pager-next,
|
|
||||||
.pagination .pager-last {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== STRUCTURE */
|
|
||||||
/*===============*/
|
|
||||||
/*=== Header */
|
|
||||||
.header {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.header > .item {
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
.header > .item.title {
|
|
||||||
width: 250px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.header > .item.title h1 {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.header > .item.title .logo {
|
|
||||||
display: inline-block;
|
|
||||||
height: 32px;
|
|
||||||
width: 32px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.header > .item.configure {
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Body */
|
|
||||||
#global {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
.aside {
|
|
||||||
display: table-cell;
|
|
||||||
height: 100%;
|
|
||||||
width: 250px;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.aside.aside_flux {
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Aside main page (categories) */
|
|
||||||
.categories {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.state_unread li:not(.active)[data-unread="0"] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.category {
|
|
||||||
display: block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
.category .btn:not([data-unread="0"]):after {
|
|
||||||
content: attr(data-unread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Aside main page (feeds) */
|
|
||||||
.categories .feeds {
|
|
||||||
width: 100%;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
.categories .feeds:not(.active) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.categories .feeds .feed {
|
|
||||||
display: inline-block;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.categories .feeds .feed:not([data-unread="0"]):before {
|
|
||||||
content: "(" attr(data-unread) ") ";
|
|
||||||
}
|
|
||||||
.categories .feeds .dropdown-menu {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
.categories .feeds .item .dropdown-toggle > .icon {
|
|
||||||
visibility: hidden;
|
|
||||||
cursor: pointer;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.categories .feeds .item .dropdown-target:target ~ .dropdown-toggle > .icon,
|
|
||||||
.categories .feeds .item:hover .dropdown-toggle > .icon,
|
|
||||||
.categories .feeds .item.active .dropdown-toggle > .icon {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== New article notification */
|
|
||||||
#new-article {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#new-article > a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Day indication */
|
|
||||||
.day .name {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
width: 50%;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Feed article header and footer */
|
|
||||||
.flux_header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.flux .item {
|
|
||||||
line-height: 40px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.flux .item.manage,
|
|
||||||
.flux .item.link {
|
|
||||||
width: 40px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.flux .item.website {
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
.flux.not_read .item.title,
|
|
||||||
.flux.current .item.title {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.flux:not(.current):hover .item.title {
|
|
||||||
position: absolute;
|
|
||||||
max-width: calc(100% - 320px);
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
.flux .item.title a {
|
|
||||||
color: #000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.flux .item.date {
|
|
||||||
width: 145px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.flux .item > a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.flux .item > a {
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.flux .item.share > a {
|
|
||||||
display: list-item;
|
|
||||||
list-style-position: inside;
|
|
||||||
list-style-type: decimal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Feed article content */
|
|
||||||
.hide_posts > .flux:not(.active) > .flux_content {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.content {
|
|
||||||
min-height: 20em;
|
|
||||||
margin: auto;
|
|
||||||
line-height: 1.7em;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
.content.large {
|
|
||||||
max-width: 1000px;
|
|
||||||
}
|
|
||||||
.content.medium {
|
|
||||||
max-width: 800px;
|
|
||||||
}
|
|
||||||
.content.thin {
|
|
||||||
max-width: 550px;
|
|
||||||
}
|
|
||||||
.content ul,
|
|
||||||
.content ol,
|
|
||||||
.content dd {
|
|
||||||
margin: 0 0 0 15px;
|
|
||||||
padding: 0 0 5px 15px;
|
|
||||||
}
|
|
||||||
.content pre {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Notification and actualize notification */
|
|
||||||
.notification {
|
|
||||||
position: absolute;
|
|
||||||
top: 1em;
|
|
||||||
left: 25%; right: 25%;
|
|
||||||
z-index: 10;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
.notification.closed {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.notification a.close {
|
|
||||||
position: absolute;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#actualizeProgress {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
#actualizeProgress progress {
|
|
||||||
max-width: 100%;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
#actualizeProgress .progress {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Navigation menu (for articles) */
|
|
||||||
#nav_entries {
|
|
||||||
position: fixed;
|
|
||||||
bottom: 0; left: 0;
|
|
||||||
display: table;
|
|
||||||
width: 250px;
|
|
||||||
background: #fff;
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
#nav_entries .item {
|
|
||||||
display: table-cell;
|
|
||||||
width: 30%;
|
|
||||||
}
|
|
||||||
#nav_entries a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== "Load more" part */
|
|
||||||
#load_more {
|
|
||||||
min-height: 40px;
|
|
||||||
}
|
|
||||||
.loading {
|
|
||||||
background: url("loader.gif") center center no-repeat;
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
#bigMarkAsRead {
|
|
||||||
display: block;
|
|
||||||
padding: 3em 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.bigTick {
|
|
||||||
font-size: 7em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Statistiques */
|
|
||||||
.stat > table {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== GLOBAL VIEW */
|
|
||||||
/*================*/
|
|
||||||
/*=== Category boxes */
|
|
||||||
#stream.global .box-category {
|
|
||||||
display: inline-block;
|
|
||||||
width: 19em;
|
|
||||||
max-width: 95%;
|
|
||||||
margin: 20px 10px;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
#stream.global .category {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
#stream.global .btn {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#stream.global .box-category .feeds {
|
|
||||||
display: block;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
#stream.global .box-category .feed {
|
|
||||||
width: 19em;
|
|
||||||
max-width: 90%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== Panel */
|
|
||||||
#overlay {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
background: rgba(0, 0, 0, 0.9);
|
|
||||||
}
|
|
||||||
#panel {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 1em; bottom: 1em;
|
|
||||||
left: 2em; right: 2em;
|
|
||||||
overflow: auto;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
#panel .close {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#panel .close img {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== DIVERS */
|
|
||||||
/*===========*/
|
|
||||||
.nav-login,
|
|
||||||
.nav_menu .search,
|
|
||||||
.nav_menu .toggle_aside {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aside .toggle_aside {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
display: none;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
line-height: 30px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== MOBILE */
|
|
||||||
/*===========*/
|
|
||||||
@media(max-width: 840px) {
|
|
||||||
.header,
|
|
||||||
.aside .btn-important,
|
|
||||||
.aside .feeds .dropdown,
|
|
||||||
.flux_header .item.website span,
|
|
||||||
.item.date, .day .date,
|
|
||||||
.dropdown-menu > .no-mobile,
|
|
||||||
.no-mobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.nav-login {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav_menu .toggle_aside,
|
|
||||||
.aside .toggle_aside,
|
|
||||||
.nav_menu .search,
|
|
||||||
#panel .close img {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aside {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
z-index: 100;
|
|
||||||
}
|
|
||||||
.aside:target {
|
|
||||||
width: 90%;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
.aside .categories {
|
|
||||||
margin: 10px 0 75px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flux_header .item.website {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flux:not(.current):hover .item.title {
|
|
||||||
position: relative;
|
|
||||||
width: auto;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav_entries {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#stream.global .box-category {
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#panel {
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
left: 0; right: 0;
|
|
||||||
}
|
|
||||||
#panel .close {
|
|
||||||
top: 0; right: 0;
|
|
||||||
left: auto; bottom: auto;
|
|
||||||
display: inline-block;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*=== PRINTER */
|
|
||||||
/*============*/
|
|
||||||
@media print {
|
|
||||||
.header, .aside,
|
|
||||||
.nav_menu, .day,
|
|
||||||
.flux_header,
|
|
||||||
.flux_content .bottom,
|
|
||||||
.pagination,
|
|
||||||
#nav_entries {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
background: #fff;
|
|
||||||
color: #000;
|
|
||||||
font-family: Serif;
|
|
||||||
}
|
|
||||||
#global,
|
|
||||||
.flux_content {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
.flux_content .content {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.flux_content .content a {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
.flux_content .content a:after {
|
|
||||||
content: " [" attr(href) "] ";
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
}
|
|
4
sources/p/themes/Pafat/README.md
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
Pafat
|
||||||
|
=====
|
||||||
|
|
||||||
|
Thème Pafat pour FreshRSS
|
7
sources/p/themes/Pafat/icons/all.svg
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-40.0002,-746)" fill="#FFF">
|
||||||
|
<rect style="color:#FFF;" height="2.0002" width="9.9996" y="749" x="43"/>
|
||||||
|
<rect style="color:#FFF;" height="2.0002" width="9.9996" y="753" x="43"/>
|
||||||
|
<rect style="color:#FFF;" height="2.0002" width="9.9996" y="757" x="43"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 350 B |
5
sources/p/themes/Pafat/icons/bookmark.svg
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-41.000202,-397)">
|
||||||
|
<path style="enable-background:accumulate;color:#000000;" d="m530.95,186.71c-0.77941,0.55189-3.1576-1.906-4.1125-1.9179-0.95532-0.0119-3.3949,2.3858-4.161,1.8149-0.76573-0.57072,0.83698-3.592,0.55319-4.5039-0.2839-0.91223-3.3182-2.4915-3.0119-3.3965,0.30617-0.90461,3.6749-0.31399,4.4544-0.86567,0.77986-0.5519,1.3442-3.9257,2.2995-3.914,0.95494,0.0116,1.4342,3.398,2.1998,3.9689,0.76588,0.57114,4.1489,0.0653,4.4331,0.97746,0.28402,0.9118-2.7885,2.414-3.0949,3.3186-0.30652,0.90489,1.22,3.966,0.44027,4.5182z" fill-rule="nonzero" transform="matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)" fill="#FFF"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 747 B |
|
@ -1,5 +1,5 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<g transform="translate(-181.0002,-747)">
|
<g transform="translate(-181.0002,-747)">
|
||||||
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m195.03,751,0,1c-0.00091,0.0111,0.00059,0.021-0.00009,0.0312-0.0112,0.25496-0.12835,0.50994-0.31251,0.6875l-5.7188,6.2977-5.7188-6.2977c-0.18821-0.1881-0.28121-0.45346-0.28122-0.71875v-1h1c0.26531,0.00007,0.53059,0.0931,0.71873,0.28131l4.2812,4.829,4.2813-4.829c0.19464-0.21073,0.46925-0.30315,0.74998-0.2813z" fill-rule="nonzero" fill="#bebebe"/>
|
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m195.03,751,0,1c-0.00091,0.0111,0.00059,0.021-0.00009,0.0312-0.0112,0.25496-0.12835,0.50994-0.31251,0.6875l-5.7188,6.2977-5.7188-6.2977c-0.18821-0.1881-0.28121-0.45346-0.28122-0.71875v-1h1c0.26531,0.00007,0.53059,0.0931,0.71873,0.28131l4.2812,4.829,4.2813-4.829c0.19464-0.21073,0.46925-0.30315,0.74998-0.2813z" fill-rule="nonzero" fill="#666"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 602 B |
|
@ -1,7 +1,7 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
|
||||||
<title>Logo FreshRSS</title>
|
<title>Logo FreshRSS</title>
|
||||||
<circle fill="#0062BE" cx="128" cy="128" r="33"/>
|
<circle fill="#C5C6CA" cx="128" cy="128" r="33"/>
|
||||||
<g fill="none" stroke="#0062BE" stroke-width="24">
|
<g fill="none" stroke="#C5C6CA" stroke-width="24">
|
||||||
<g stroke-opacity="0.3">
|
<g stroke-opacity="0.3">
|
||||||
<path d="M12,128 A116,116 0 1,1 128,244"/>
|
<path d="M12,128 A116,116 0 1,1 128,244"/>
|
||||||
<path d="M54,128 A74,74 0 1,1 128,202"/>
|
<path d="M54,128 A74,74 0 1,1 128,202"/>
|
Before Width: | Height: | Size: 421 B After Width: | Height: | Size: 421 B |
7
sources/p/themes/Pafat/icons/link.svg
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16.004" width="16">
|
||||||
|
<g fill="#666" transform="translate(-183,-529)">
|
||||||
|
<path style="enable-background:accumulate;color:#000000;" d="m191,533.85,0,10.38-2.344-2.2882-1.3394,2.7346c-0.32808,0.73962-2.0337,0.14492-1.5487-0.84412l1.3255-2.8393h-2.9579l6.8645-7.1436z" fill-rule="nonzero" display="block"/>
|
||||||
|
<path d="m190.16,530.06c-3.8266,0.46006-6.5788,3.9578-6.0938,7.7812,0.13127,1.0347,0.29377,1.3818,0.29377,1.3818l1.675-1.6318c-0.33104-2.7534,1.6216-5.2315,4.375-5.5625,2.7534-0.33104,5.2315,1.6216,5.5625,4.375,0.31355,2.608-1.3913,5.0249-3.9688,5.5312l0.0312,2s0.52086-0.1059,0.62354-0.13097c3.4156-0.83385,5.7063-4.1273,5.2827-7.6503-0.46006-3.8266-3.9547-6.5538-7.7812-6.0938z" style="baseline-shift:baseline;block-progression:tb;color:#666;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;"/>
|
||||||
|
<path opacity="0.3" style="enable-background:accumulate;color:#666;" d="m187.11,536.81,0-0.20574-0.19826,0.0186c0.0165-0.13095,0.0329-0.26167,0.0496-0.3926h-0.11578l-0.11556,0.14959-0.11578,0.0559-0.1653-0.0932-0.0165-0.20575,0.0331-0.22438,0.24798-0.18688h0.19826l0.0329-0.11229,0.24786,0.0559,0.18183,0.2246,0.0331-0.37419,0.31401-0.26167,0.11567-0.28055,0.23133-0.0934,0.1322-0.18688,0.29738-0.0564,0.14885-0.22415h-0.44623l0.28094-0.13095h0.19814l0.28106-0.0937,0.0331-0.11186-0.0992-0.0937-0.11567-0.0375,0.0331-0.11208-0.0826-0.16822-0.19837,0.0746,0.0331-0.14947-0.23134-0.13096-0.18171,0.3177,0.0165,0.11229-0.18171,0.075-0.11578,0.24302-0.0495-0.22438-0.31402-0.13095-0.0496-0.16822,0.41315-0.24325,0.18182-0.16822,0.0165-0.20563-0.0991-0.0562-0.13219-0.0188-0.0826,0.20575s-0.1382,0.0271-0.17373,0.0358c-0.45378,0.41804-1.3707,1.3204-1.5837,3.024,0.008,0.0395,0.15441,0.26854,0.15441,0.26854l0.347,0.20552,0.347,0.0937m3.9661-4.3003-0.4298-0.16833-0.49552,0.0561-0.61161,0.16822-0.11567,0.11229,0.38008,0.26167,0,0.14959-0.14875,0.14959,0.19846,0.39294,0.13188-0.075,0.16561-0.26168c0.2553-0.0789,0.4842-0.16833,0.72686-0.28053l0.19846-0.5048m2.5292,0.34192-0.375,0.0937-0.21875,0.15625,0,0.125-0.375,0.25,0.0937,0.34375,0.21875-0.15625,0.125,0.15625,0.15625,0.0937,0.0937-0.28125-0.0625-0.15625,0.0625-0.0937,0.21875-0.1875,0.0937,0-0.0937,0.21875,0,0.1875c0.0892-0.0242,0.1588-0.051,0.25-0.0625l-0.25,0.1875v0.125l-0.3125,0.21875-0.28125-0.0625v-0.15625l-0.125,0.0625,0.0625,0.15625h-0.21875l-0.125,0.21875-0.15625,0.15625-0.0937,0.0312v0.1875l0.0312,0.15625h-0.0312v0.53125l0.0625-0.0312,0.0937-0.21875,0.1875-0.125,0.0312-0.0937,0.28125-0.0625,0.15625,0.1875,0.1875,0.0937-0.0937,0.1875,0.15625-0.0312,0.0625-0.21875-0.1875-0.21875h0.0625l0.21875,0.15625,0.0312,0.21875,0.15625,0.21875,0.0625-0.3125,0.0937-0.0312c0.0959,0.0996,0.1692,0.23163,0.25,0.34375h0.28125l0.1875,0.125-0.0937,0.0937-0.15625,0.15625h-0.25l-0.34375-0.0937h-0.1875l-0.125,0.15625-0.34375-0.375-0.25-0.0625-0.375,0.0625-0.15625,0.0937v2.4062l0.0312,0.0312,0.25-0.15625,0.0937,0.0937h0.28125l0.125,0.15625-0.0937,0.3125,0.1875,0.1875v0.375l0.125,0.25-0.0937,0.25c-0.009,0.16159,0,0.30714,0,0.46875,0.0795,0.21894,0.14355,0.43575,0.21875,0.65625l0.0625,0.34375v0.1875h0.125l0.21875-0.125h0.25l0.375-0.4375-0.0312-0.15625,0.25-0.21875-0.1875-0.1875,0.21875-0.1875,0.21875-0.125,0.0937-0.125-0.0625-0.25v-0.59375l0.1875-0.375,0.1875-0.25,0.25-0.5625v-0.15625c-0.11654,0.0146-0.22972,0.0231-0.34375,0.0312-0.0722,0.005-0.14446,0-0.21875,0-0.12359-0.25961-0.2183-0.50966-0.3125-0.78125l-0.15625-0.1875-0.0937-0.3125,0.0625-0.0625,0.21875,0.25,0.25,0.5625,0.15625,0.15625-0.0625,0.21875,0.15625,0.15625,0.25-0.25,0.3125-0.21875,0.15625-0.1875v-0.21875c-0.0389-0.0732-0.0547-0.14545-0.0937-0.21875l-0.15625,0.1875-0.125-0.15625-0.1875-0.125v-0.28125l0.21875,0.21875,0.21875-0.0312c0.10166,0.0923,0.19205,0.20751,0.28125,0.3125l0.15625-0.1875c0-0.17463-0.19976-1.0204-0.625-1.75-0.42526-0.72932-1.1562-1.4062-1.1562-1.4062l-0.0625,0.0937-0.21875,0.21875-0.25-0.25h0.25l0.125-0.125-0.46875-0.0937-0.25-0.0937z" fill-rule="nonzero"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
|
@ -1,6 +1,6 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<g transform="translate(-181.0002,-237)" fill="#bebebe">
|
<g transform="translate(-181.0002,-237)" fill="#666">
|
||||||
<path style="color:#bebebe;" d="m184,244c-0.554,0-1,0.446-1,1v0.53125,5.4688h12v-5.4688-0.53c0-0.554-0.446-1-1-1h-10z" fill-rule="nonzero"/>
|
<path style="color:#666;" d="m184,244c-0.554,0-1,0.446-1,1v0.53125,5.4688h12v-5.4688-0.53c0-0.554-0.446-1-1-1h-10z" fill-rule="nonzero"/>
|
||||||
<path style="baseline-shift:baseline;block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m188,238c-1.6447,0-3,1.3553-3,3v7c0,1.6447,1.3553,3,3,3h2c1.6447,0,3-1.3553,3-3v-7c0-1.6447-1.3553-3-3-3h-2zm0,2,2,0c0.5713,0,1,0.4287,1,1v7c0,0.5713-0.4287,1-1,1h-2c-0.5713,0-1-0.4287-1-1v-7c0-0.5713,0.4287-1,1-1z"/>
|
<path style="baseline-shift:baseline;block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m188,238c-1.6447,0-3,1.3553-3,3v7c0,1.6447,1.3553,3,3,3h2c1.6447,0,3-1.3553,3-3v-7c0-1.6447-1.3553-3-3-3h-2zm0,2,2,0c0.5713,0,1,0.4287,1,1v7c0,0.5713-0.4287,1-1,1h-2c-0.5713,0-1-0.4287-1-1v-7c0-0.5713,0.4287-1,1-1z"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 662 B After Width: | Height: | Size: 656 B |
|
@ -1,6 +1,6 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<g transform="translate(-201.0002,-237)" fill="#bebebe">
|
<g transform="translate(-201.0002,-237)" fill="#666">
|
||||||
<path style="color:#bebebe;" d="m204,246c-0.554,0-1,0.446-1,1v0.53125,5.4688h12v-5.4688-0.53c0-0.554-0.446-1-1-1h-10z" fill-rule="nonzero"/>
|
<path style="color:#666;" d="m204,246c-0.554,0-1,0.446-1,1v0.53125,5.4688h12v-5.4688-0.53c0-0.554-0.446-1-1-1h-10z" fill-rule="nonzero"/>
|
||||||
<path style="baseline-shift:baseline;block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m208,237c-1.6447,0-3,1.3553-3,3v3h2v-3c0-0.57129,0.42873-1,1-1h2c0.57127,0,1,0.42871,1,1v7h2v-7c0-1.6447-1.3553-3-3-3h-2z"/>
|
<path style="baseline-shift:baseline;block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m208,237c-1.6447,0-3,1.3553-3,3v3h2v-3c0-0.57129,0.42873-1,1-1h2c0.57127,0,1,0.42871,1,1v7h2v-7c0-1.6447-1.3553-3-3-3h-2z"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 569 B After Width: | Height: | Size: 563 B |
|
@ -1,5 +1,5 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<g transform="translate(-121.0002,-747)">
|
<g transform="translate(-121.0002,-747)">
|
||||||
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m125,749,1,0c0.0104-0.00012,0.0208-0.00046,0.0313,0,0.25495,0.0112,0.50987,0.12858,0.6875,0.3125l6.2977,5.7188-6.2977,5.7188c-0.18816,0.18819-0.45346,0.28125-0.71875,0.28125h-1v-1c0-0.26529,0.0931-0.53058,0.28125-0.71875l4.829-4.2812-4.829-4.2812c-0.21074-0.19463-0.30316-0.46925-0.28125-0.75z" fill-rule="nonzero" fill="#bebebe"/>
|
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m125,749,1,0c0.0104-0.00012,0.0208-0.00046,0.0313,0,0.25495,0.0112,0.50987,0.12858,0.6875,0.3125l6.2977,5.7188-6.2977,5.7188c-0.18816,0.18819-0.45346,0.28125-0.71875,0.28125h-1v-1c0-0.26529,0.0931-0.53058,0.28125-0.71875l4.829-4.2812-4.829-4.2812c-0.21074-0.19463-0.30316-0.46925-0.28125-0.75z" fill-rule="nonzero" fill="#666"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 589 B After Width: | Height: | Size: 586 B |
5
sources/p/themes/Pafat/icons/non-starred.svg
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-61.000202,-397)">
|
||||||
|
<path style="baseline-shift:baseline;block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" fill="#666" d="m69.003,398.01c-0.2659-0.00099-0.49859,0.1006-0.6647,0.2393-0.16611,0.13869-0.27742,0.32137-0.38968,0.50028-0.22453,0.35782-0.39269,0.76873-0.56546,1.2036-0.17277,0.43483-0.34713,0.88766-0.5046,1.2323-0.15747,0.34465-0.3456,0.57871-0.35862,0.58776-0.01287,0.009-0.30722,0.117-0.69576,0.15181-0.38855,0.0348-0.88122,0.0492-1.3632,0.0694-0.48202,0.0202-0.9703,0.0362-1.393,0.12817-0.21138,0.046-0.4154,0.10148-0.60434,0.20956s-0.36689,0.28631-0.45004,0.53002-0.04901,0.50627,0.03636,0.70157c0.08537,0.19531,0.22656,0.36514,0.3682,0.52344,0.2833,0.31663,0.6327,0.60557,1.0079,0.89849s0.77671,0.55926,1.0678,0.81027c0.29104,0.25101,0.45422,0.50796,0.45912,0.52271,0.0048,0.0146,0.03119,0.33498-0.05456,0.70231-0.08575,0.36732-0.2238,0.81174-0.35282,1.2603-0.12902,0.44861-0.25176,0.90196-0.2917,1.3184-0.01997,0.20819-0.04285,0.40729,0.0053,0.61409,0.04814,0.20679,0.1845,0.43007,0.39902,0.58168,0.21451,0.15161,0.44936,0.1881,0.66823,0.1701s0.43535-0.0703,0.63515-0.15132c0.39961-0.16214,0.80177-0.42851,1.2064-0.68231,0.40465-0.2538,0.80822-0.52155,1.1456-0.71107,0.33734-0.18952,0.6484-0.2686,0.66445-0.26854,0.01586,0.00006,0.30338,0.0951,0.63894,0.28732,0.33556,0.19221,0.72532,0.46503,1.1276,0.72205,0.40229,0.25702,0.81996,0.49752,1.218,0.66284,0.19903,0.0827,0.38893,0.15086,0.60762,0.17059,0.2187,0.0197,0.47978-0.031,0.69551-0.18105,0.21572-0.15001,0.33928-0.35235,0.38918-0.55877s0.04291-0.43517,0.02476-0.64358c-0.03632-0.41683-0.15899-0.86394-0.2841-1.3137-0.12511-0.44978-0.26165-0.88661-0.34421-1.2548-0.08256-0.36813-0.07169-0.68662-0.06666-0.70133,0.005-0.0145,0.18746-0.25247,0.4806-0.50101,0.29313-0.24854,0.67599-0.53755,1.0536-0.82731,0.37764-0.28976,0.76716-0.57158,1.0531-0.88579,0.14298-0.1571,0.2418-0.33444,0.32882-0.52904s0.136-0.42874,0.05481-0.67306-0.27108-0.41314-0.45912-0.52272-0.36679-0.18158-0.57782-0.22931c-0.42206-0.0955-0.91359-0.14009-1.3956-0.16426-0.48198-0.0242-0.94584-0.039-1.3342-0.077s-0.71565-0.13122-0.72859-0.14037c-0.01279-0.009-0.18402-0.23636-0.3384-0.58217s-0.32658-0.78819-0.49548-1.2243c-0.1689-0.4361-0.33477-0.86429-0.55609-1.2238-0.11067-0.17977-0.23335-0.35397-0.39826-0.49396s-0.40309-0.25684-0.66899-0.25783zm0.0086,0.99424c0.0422,0.0358,0.10671,0.13602,0.1841,0.26173,0.15477,0.25141,0.33068,0.6272,0.49397,1.0488,0.16329,0.42163,0.31905,0.88645,0.49598,1.2828,0.17693,0.39633,0.31456,0.73379,0.6753,0.98889,0.36072,0.25509,0.77019,0.29763,1.2152,0.34118,0.44506,0.0435,0.92882,0.0532,1.3948,0.0765,0.46599,0.0234,0.91824,0.0697,1.2135,0.13647,0.14763,0.0334,0.25558,0.0572,0.30381,0.0853-0.02227,0.0498-0.07958,0.15478-0.17956,0.26464-0.19997,0.21973-0.53749,0.48746-0.90261,0.7676-0.36511,0.28015-0.77804,0.57219-1.114,0.85704-0.33595,0.28485-0.63992,0.53221-0.77987,0.94209-0.13995,0.40986-0.05396,0.77681,0.04065,1.1987s0.25406,0.87813,0.37502,1.313c0.12096,0.43486,0.22688,0.84692,0.25228,1.1385,0.01156,0.13264-0.01699,0.23485-0.02778,0.29267-0.05993-0.008-0.1764-0.0324-0.30381-0.0853-0.27836-0.11561-0.64649-0.32808-1.0354-0.57657-0.38894-0.24849-0.8039-0.53053-1.1885-0.75081-0.38457-0.22028-0.70791-0.39837-1.1551-0.40015-0.44722-0.002-0.79205,0.17245-1.1786,0.38965-0.38659,0.21719-0.78438,0.49517-1.1756,0.74055-0.39123,0.24538-0.77636,0.4507-1.0559,0.56412-0.13977,0.0567-0.24616,0.0856-0.3023,0.0902-0.01026-0.0578-0.01522-0.16008-0.0025-0.29243,0.02793-0.29118,0.13818-0.70893,0.26291-1.1426,0.12473-0.43372,0.25404-0.89785,0.35232-1.3188,0.09828-0.42099,0.18672-0.78846,0.05027-1.1994-0.13644-0.41097-0.43218-0.64202-0.76571-0.92967-0.33353-0.28766-0.70551-0.58555-1.0683-0.86876-0.36275-0.2832-0.7178-0.56075-0.91597-0.78224-0.09908-0.11075-0.16221-0.21163-0.1841-0.26173,0.04834-0.0276,0.15448-0.058,0.3023-0.0902,0.29562-0.0643,0.74518-0.10714,1.2112-0.1267,0.46603-0.0196,0.94824-0.0298,1.3935-0.0697,0.44531-0.0399,0.84679-0.0499,1.2097-0.30216,0.36289-0.25221,0.5383-0.60511,0.71876-1.0001,0.18046-0.39497,0.33731-0.84115,0.50435-1.2616,0.16704-0.42041,0.31848-0.83556,0.47556-1.0859,0.07853-0.12515,0.16751-0.20007,0.21012-0.23565z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
5
sources/p/themes/Pafat/icons/prev.svg
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-301.0002,-747)">
|
||||||
|
<path style="block-progression:tb;color:#666;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m313.01,749-1,0c-0.0104-0.00012-0.0208-0.00046-0.0313,0-0.25495,0.0112-0.50987,0.12858-0.6875,0.3125l-6.2977,5.7188,6.2977,5.7188c0.18816,0.18819,0.45346,0.28125,0.71875,0.28125h1v-1c0-0.26529-0.0931-0.53058-0.28125-0.71875l-4.829-4.2812,4.829-4.2812c0.21074-0.19463,0.30316-0.46925,0.28125-0.75z" fill-rule="nonzero" fill="#666"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 586 B |
5
sources/p/themes/Pafat/icons/read.svg
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16.001" width="16">
|
||||||
|
<g transform="translate(-60.99995,-296.9989)">
|
||||||
|
<path opacity="1" style="baseline-shift:baseline;block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" fill="#666" d="m68.875,297a1.0001,1.0001,0,0,0,-0.5,0.25l-4.9062,4a1.0001,1.0001,0,0,0,-0.0625,0.0312s-0.32587,0.29728-0.65625,0.75c-0.22334,0.30605-0.3527,0.8316-0.5,1.3125a1.0001,1.0001,0,0,0,-0.03125,0.0312,1.0001,1.0001,0,0,0,-0.21875,0.5625c-0.00051,0.0118,0.00036,0.0195,0,0.0312a1.0001,1.0001,0,0,0,0,0.0312,1.0001,1.0001,0,0,0,0,0.15625v7.8438a1.0001,1.0001,0,0,0,1,1h12a1.0001,1.0001,0,0,0,1,-1v-7.8438a1.0001,1.0001,0,0,0,0,-0.15625,1.0001,1.0001,0,0,0,-0.21875,-0.65625,1.0001,1.0001,0,0,0,-0.03125,-0.0312c-0.32774-1.1879-1.125-2-1.125-2a1.0001,1.0001,0,0,0,-0.0312,-0.0312l-4.969-4.02a1.0001,1.0001,0,0,0,-0.65625,-0.25,1.0001,1.0001,0,0,0,-0.0937,0zm0.125,2.2812,4.3125,3.5312,0.0312,0.0312c0.021,0.0255,0.18032,0.24952,0.34375,0.5l-4.6874,3.5312-4.6875-3.5312c0.0259-0.0394,0.0349-0.0872,0.0625-0.125,0.1908-0.26146,0.31874-0.41421,0.34375-0.4375l0.03125-0.0312,4.25-3.4688zm-5,5.0938,4.6875,3.5312,0.3125,0.21875,0.3125-0.21875,4.6875-3.5312,0,6.625-10,0,0-6.625z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -1,5 +1,5 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<g fill="#bebebe" transform="translate(-581.0002,-196)">
|
<g fill="#666" transform="translate(-581.0002,-196)">
|
||||||
<path style="enable-background:new;color:#000000;" d="m291,178.03c0,1.0873-0.88144,1.9688-1.9688,1.9688-1.0873,0-1.9688-0.88144-1.9688-1.9688,0-1.0873,0.88144-1.9688,1.9688-1.9688,1.0873,0,1.9688,0.88144,1.9688,1.9688z" fill-rule="nonzero" transform="matrix(1.5079365,0,0,1.5079365,148.15963,-64.49107)"/>
|
<path style="enable-background:new;color:#000000;" d="m291,178.03c0,1.0873-0.88144,1.9688-1.9688,1.9688-1.0873,0-1.9688-0.88144-1.9688-1.9688,0-1.0873,0.88144-1.9688,1.9688-1.9688,1.0873,0,1.9688,0.88144,1.9688,1.9688z" fill-rule="nonzero" transform="matrix(1.5079365,0,0,1.5079365,148.15963,-64.49107)"/>
|
||||||
<path style="enable-background:new;color:#000000;" d="m291,178.03c0,1.0873-0.88144,1.9688-1.9688,1.9688-1.0873,0-1.9688-0.88144-1.9688-1.9688,0-1.0873,0.88144-1.9688,1.9688-1.9688,1.0873,0,1.9688,0.88144,1.9688,1.9688z" fill-rule="nonzero" transform="matrix(1.5079365,0,0,1.5079365,158.12818,-59.49107)"/>
|
<path style="enable-background:new;color:#000000;" d="m291,178.03c0,1.0873-0.88144,1.9688-1.9688,1.9688-1.0873,0-1.9688-0.88144-1.9688-1.9688,0-1.0873,0.88144-1.9688,1.9688-1.9688,1.0873,0,1.9688,0.88144,1.9688,1.9688z" fill-rule="nonzero" transform="matrix(1.5079365,0,0,1.5079365,158.12818,-59.49107)"/>
|
||||||
<path style="enable-background:new;color:#000000;" d="m291,178.03c0,1.0873-0.88144,1.9688-1.9688,1.9688-1.0873,0-1.9688-0.88144-1.9688-1.9688,0-1.0873,0.88144-1.9688,1.9688-1.9688,1.0873,0,1.9688,0.88144,1.9688,1.9688z" fill-rule="nonzero" transform="matrix(1.5079365,0,0,1.5079365,158.12818,-69.49107)"/>
|
<path style="enable-background:new;color:#000000;" d="m291,178.03c0,1.0873-0.88144,1.9688-1.9688,1.9688-1.0873,0-1.9688-0.88144-1.9688-1.9688,0-1.0873,0.88144-1.9688,1.9688-1.9688,1.0873,0,1.9688,0.88144,1.9688,1.9688z" fill-rule="nonzero" transform="matrix(1.5079365,0,0,1.5079365,158.12818,-69.49107)"/>
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
5
sources/p/themes/Pafat/icons/starred.svg
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-41.000202,-397)">
|
||||||
|
<path style="enable-background:accumulate;color:#000000;" d="m530.95,186.71c-0.77941,0.55189-3.1576-1.906-4.1125-1.9179-0.95532-0.0119-3.3949,2.3858-4.161,1.8149-0.76573-0.57072,0.83698-3.592,0.55319-4.5039-0.2839-0.91223-3.3182-2.4915-3.0119-3.3965,0.30617-0.90461,3.6749-0.31399,4.4544-0.86567,0.77986-0.5519,1.3442-3.9257,2.2995-3.914,0.95494,0.0116,1.4342,3.398,2.1998,3.9689,0.76588,0.57114,4.1489,0.0653,4.4331,0.97746,0.28402,0.9118-2.7885,2.414-3.0949,3.3186-0.30652,0.90489,1.22,3.966,0.44027,4.5182z" fill-rule="nonzero" transform="matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)" fill="#666"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 747 B |
|
@ -1,5 +1,5 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<g transform="translate(-141.0002,-807)">
|
<g transform="translate(-141.0002,-807)">
|
||||||
<path d="m149,809,0,13,4-4,4,4c0.0525-6.8494-0.0285-10.584,0-13z" fill="#bebebe"/>
|
<path d="m149,809,0,13,4-4,4,4c0.0525-6.8494-0.0285-10.584,0-13z" fill="#666"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 200 B After Width: | Height: | Size: 197 B |
6
sources/p/themes/Pafat/icons/unread.svg
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-40.99995,-297)" fill="#666">
|
||||||
|
<path style="block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m43.781,301a1.0001,1.0001,0,0,0,-0.40625,1.7812l5,4,0.625,0.5,0.625-0.5,5-4a1.0005,1.0005,0,1,0,-1.25,-1.5625l-4.375,3.5-4.375-3.5a1.0001,1.0001,0,0,0,-0.844,-0.22z"/>
|
||||||
|
<path style="block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="M42.906,300a1.0001,1.0001,0,0,0,-0.906,1v9a1.0001,1.0001,0,0,0,1,1h12a1.0001,1.0001,0,0,0,1,-1v-9a1.0001,1.0001,0,0,0,-1,-1h-12a1.0001,1.0001,0,0,0,-0.09375,0zm1.094,2h10v7h-10v-7z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 775 B |
5
sources/p/themes/Pafat/icons/up.svg
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
|
<g transform="translate(-201.0002,-747)">
|
||||||
|
<path style="block-progression:tb;color:#666;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m215.03,759,0-1c-0.00091-0.0111,0.00059-0.021-0.00009-0.0312-0.0112-0.25496-0.12835-0.50994-0.31251-0.6875l-5.7188-6.2977-5.7188,6.2977c-0.18821,0.1881-0.28121,0.45346-0.28122,0.71875v1h1c0.26531-0.00007,0.53059-0.0931,0.71873-0.28131l4.2812-4.829,4.2813,4.829c0.19464,0.21073,0.46925,0.30315,0.74998,0.2813z" fill-rule="nonzero" fill="#666"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 598 B |
BIN
sources/p/themes/Pafat/loader.gif
Executable file
After Width: | Height: | Size: 2.5 KiB |
7
sources/p/themes/Pafat/metadata.json
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"name": "Pafat",
|
||||||
|
"author": "Plopoyop",
|
||||||
|
"description": "Un thème pour FreshRSS",
|
||||||
|
"version": 0.2,
|
||||||
|
"files": ["_template.css", "pafat.css"]
|
||||||
|
}
|
1084
sources/p/themes/Pafat/pafat.css
Executable file
|
@ -1,5 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-60.0002,-726)">
|
|
||||||
<path style="color:#666666;" fill="#666" d="m67,729,0,4-4,0,0,2,4,0,0,4,2,0,0-4,4,0,0-2-4,0,0-4-2,0z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 220 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-40.0002,-746)" fill="#bebebe">
|
|
||||||
<rect style="color:#bebebe;" height="2.0002" width="9.9996" y="749" x="43"/>
|
|
||||||
<rect style="color:#bebebe;" height="2.0002" width="9.9996" y="753" x="43"/>
|
|
||||||
<rect style="color:#bebebe;" height="2.0002" width="9.9996" y="757" x="43"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 362 B |
Before Width: | Height: | Size: 5.5 KiB |
|
@ -1,6 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-141.0002,-807)" fill="#bebebe">
|
|
||||||
<path d="m143,807,0,13,4-4,4,4,0-4,0-1-2,0,0-4,2,0,0-4z"/>
|
|
||||||
<path d="m152,810,0,2-2,0,0,2,2,0,0,2,2,0,0-2,2,0,0-2-2,0,0-2-2,0z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 261 B |
|
@ -1,60 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
||||||
<svg
|
<g transform="translate(-41.000202,-397)">
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
<path style="color:#000000;enable-background:accumulate;" d="m530.95,186.71c-0.77941,0.55189-3.1576-1.906-4.1125-1.9179-0.95532-0.0119-3.3949,2.3858-4.161,1.8149-0.76573-0.57072,0.83698-3.592,0.55319-4.5039-0.2839-0.91223-3.3182-2.4915-3.0119-3.3965,0.30617-0.90461,3.6749-0.31399,4.4544-0.86567,0.77986-0.5519,1.3442-3.9257,2.2995-3.914,0.95494,0.0116,1.4342,3.398,2.1998,3.9689,0.76588,0.57114,4.1489,0.0653,4.4331,0.97746,0.28402,0.9118-2.7885,2.414-3.0949,3.3186-0.30652,0.90489,1.22,3.966,0.44027,4.5182z" fill-rule="nonzero" transform="matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)" fill="#d18104"/>
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
height="16"
|
|
||||||
width="16"
|
|
||||||
id="svg2"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.4 r9939"
|
|
||||||
sodipodi:docname="bookmark.svg">
|
|
||||||
<metadata
|
|
||||||
id="metadata12">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs10" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1366"
|
|
||||||
inkscape:window-height="745"
|
|
||||||
id="namedview8"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="14.75"
|
|
||||||
inkscape:cx="-2.2033898"
|
|
||||||
inkscape:cy="8"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="svg2" />
|
|
||||||
<g
|
|
||||||
transform="translate(-41.000202,-397)"
|
|
||||||
id="g4">
|
|
||||||
<path
|
|
||||||
style="enable-background:accumulate;color:#000000;fill:#d18104;fill-opacity:1"
|
|
||||||
d="m530.95,186.71c-0.77941,0.55189-3.1576-1.906-4.1125-1.9179-0.95532-0.0119-3.3949,2.3858-4.161,1.8149-0.76573-0.57072,0.83698-3.592,0.55319-4.5039-0.2839-0.91223-3.3182-2.4915-3.0119-3.3965,0.30617-0.90461,3.6749-0.31399,4.4544-0.86567,0.77986-0.5519,1.3442-3.9257,2.2995-3.914,0.95494,0.0116,1.4342,3.398,2.1998,3.9689,0.76588,0.57114,4.1489,0.0653,4.4331,0.97746,0.28402,0.9118-2.7885,2.414-3.0949,3.3186-0.30652,0.90489,1.22,3.966,0.44027,4.5182z"
|
|
||||||
fill-rule="nonzero"
|
|
||||||
transform="matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)"
|
|
||||||
fill="#f1c40f"
|
|
||||||
id="path6" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 750 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-442,-176)">
|
|
||||||
<g transform="translate(234.0002,-820)">
|
|
||||||
<path d="m208.53,997c-0.28913,0-0.53125,0.24212-0.53125,0.53125v13.938c0,0.2985,0.23264,0.5312,0.53125,0.5312h14.938c0.2986,0,0.53125-0.2326,0.53125-0.5312v-8.9376c0-0.2891-0.24212-0.5312-0.53125-0.5312h-12.469v7.5c0,0.277-0.223,0.5-0.5,0.5s-0.5-0.223-0.5-0.5v-8c0-0.277,0.223-0.5,0.5-0.5h2.9688,8.5312v-1.4062c0-0.3272-0.26666-0.5938-0.59375-0.5938h-7.4062v-1.4688c0-0.39-0.24-0.63-0.53-0.63z" fill="#FFF"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 567 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-442,-176)">
|
|
||||||
<g transform="translate(234.0002,-820)">
|
|
||||||
<path d="m208.53,997c-0.28913,0-0.53125,0.24212-0.53125,0.53125v13.938c0,0.2985,0.23264,0.5312,0.53125,0.5312h14.938c0.2986,0,0.53125-0.2326,0.53125-0.5312v-8.9376c0-0.2891-0.24212-0.5312-0.53125-0.5312h-12.469v7.5c0,0.277-0.223,0.5-0.5,0.5s-0.5-0.223-0.5-0.5v-8c0-0.277,0.223-0.5,0.5-0.5h2.9688,8.5312v-1.4062c0-0.3272-0.26666-0.5938-0.59375-0.5938h-7.4062v-1.4688c0-0.39-0.24-0.63-0.53-0.63z" fill="#666"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 567 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-60,-518)">
|
|
||||||
<g transform="translate(19,-242)">
|
|
||||||
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m45,764,1,0c0.01037-0.00012,0.02079-0.00046,0.03125,0,0.25495,0.0112,0.50987,0.12858,0.6875,0.3125l2.282,2.28,2.312-2.28c0.266-0.23,0.447-0.3,0.688-0.31h1v1c0,0.28647-0.03434,0.55065-0.25,0.75l-2.2812,2.2812,2.25,2.25c0.188,0.19,0.281,0.45,0.281,0.72v1h-1c-0.2653-0.00001-0.53059-0.0931-0.71875-0.28125l-2.281-2.28-2.281,2.28c-0.188,0.19-0.454,0.28-0.719,0.28h-1v-1c-0.000003-0.26529,0.09306-0.53058,0.28125-0.71875l2.2812-2.25-2.281-2.28c-0.21-0.19-0.303-0.47-0.281-0.75v-1z" fill-rule="nonzero" fill="#bebebe"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 805 B |
|
@ -1,5 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-441.0002,-400.99999)">
|
|
||||||
<path style="color:#666666;enable-background:accumulate;" d="m449,402c-0.22065,0-0.44081,0.0113-0.65625,0.0312l-0.40625,2.0938c-0.33446,0.0733-0.66305,0.17589-0.96875,0.3125l-1.5312-1.4688c-0.38863,0.23011-0.72695,0.51408-1.0625,0.8125l0.90625,1.9062c-0.22242,0.24899-0.42425,0.5225-0.59375,0.8125l-2.0938-0.28125c-0.17772,0.40877-0.30872,0.83637-0.40625,1.2812l1.8438,1c-0.0171,0.16809-0.0312,0.3274-0.0312,0.5s0.0142,0.33191,0.0312,0.5l-1.8438,1c0.0975,0.44488,0.22853,0.87248,0.40625,1.2812l2.0938-0.28125c0.1695,0.29,0.37133,0.56351,0.59375,0.8125l-0.90625,1.9062c0.33555,0.29842,0.67387,0.58239,1.0625,0.8125l1.5312-1.4688c0.3057,0.13661,0.63429,0.23916,0.96875,0.3125l0.40625,2.0938c0.21544,0.02,0.4356,0.0312,0.65625,0.0312s0.44081-0.0113,0.65625-0.0312l0.40625-2.0938c0.33446-0.0733,0.66305-0.17589,0.96875-0.3125l1.5312,1.4688c0.38863-0.23011,0.72695-0.51408,1.0625-0.8125l-0.90625-1.9062c0.22242-0.24899,0.42425-0.5225,0.59375-0.8125l2.0938,0.28125c0.17772-0.40877,0.30872-0.83637,0.40625-1.2812l-1.8438-1c0.0171-0.16809,0.0312-0.3274,0.0312-0.5s-0.0142-0.33191-0.0312-0.5l1.8438-1c-0.0975-0.44488-0.22853-0.87248-0.40625-1.2812l-2.0938,0.28125c-0.1695-0.29-0.37133-0.56351-0.59375-0.8125l0.90625-1.9062c-0.33555-0.29842-0.67387-0.58239-1.0625-0.8125l-1.5312,1.4688c-0.3057-0.13661-0.63429-0.23916-0.96875-0.3125l-0.40625-2.0938c-0.21544-0.02-0.4356-0.0312-0.65625-0.0312zm0,4c1.6568,0,3,1.3432,3,3s-1.3432,3-3,3-3-1.3432-3-3,1.3432-3,3-3z" fill-rule="nonzero" fill="#666"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 17 KiB |
|
@ -1,13 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
|
|
||||||
<title>Logo FreshRSS</title>
|
|
||||||
<circle fill="#FFF" cx="128" cy="128" r="128"/>
|
|
||||||
<circle fill="#0062BE" cx="128" cy="128" r="33"/>
|
|
||||||
<g fill="none" stroke="#0062BE" stroke-width="24">
|
|
||||||
<g stroke-opacity="0.3">
|
|
||||||
<path d="M12,128 A116,116 0 1,1 128,244"/>
|
|
||||||
<path d="M54,128 A74,74 0 1,1 128,202"/>
|
|
||||||
</g>
|
|
||||||
<path d="M128,12 A116,116 0 0,1 244,128"/>
|
|
||||||
<path d="M128,54 A74,74 0 0,1 202,128"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 470 B |
Before Width: | Height: | Size: 56 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
|
|
||||||
<g transform="translate(-182,-490)" fill="#bebebe">
|
|
||||||
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m190,490c-4.4147,0-8,3.5853-8,8s3.5853,8,8,8,8-3.5853,8-8-3.5853-8-8-8zm0,2c3.3413,0,6,2.6587,6,6s-2.6587,6-6,6-6-2.6587-6-6,2.6587-6,6-6z"/>
|
|
||||||
<path style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="M189.34,495c-1.28,0-2.34,1.06-2.34,2.34v1.3125c0,1.2861,1.0576,2.3438,2.3438,2.3438h1.3125c1.29,0.01,2.35-1.05,2.35-2.33v-1.3125c0-1.29-1.06-2.35-2.34-2.35h-1.3125zm0,1,1.3125,0c0.74942,0,1.3438,0.59433,1.3438,1.3438v1.3125c0.01,0.76-0.58,1.35-1.33,1.35h-1.3125c-0.76,0-1.35-0.59-1.35-1.34v-1.3125c0-0.76,0.59-1.35,1.34-1.35z"/>
|
|
||||||
<path d="m186.72,491.44c-1.5103,0.6073-2.6811,1.7985-3.2812,3.3125l3.75,1.875c0.25196-0.64029,0.74249-1.1706,1.375-1.4375l-1.8438-3.75zm6.5625,0-1.8438,3.75c0.63251,0.26694,1.123,0.79721,1.375,1.4375l3.75-1.875c-0.60015-1.514-1.7709-2.7052-3.2812-3.3125zm-6.0938,8-3.75,1.875c0.60709,1.4886,1.789,2.65,3.2812,3.25l1.875-3.75c-0.62682-0.25556-1.1433-0.75203-1.4062-1.375zm5.625,0c-0.26291,0.62297-0.77943,1.1194-1.4062,1.375l1.875,3.75c1.4923-0.60005,2.6742-1.7614,3.2812-3.25l-3.75-1.875z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g transform="translate(-340.99994,-257)" fill="#666666">
|
|
||||||
<path style="block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m346,260c-2.7496,0-5,2.2504-5,5s2.2504,5,5,5c1.5862,0,2.9034-0.84459,3.8125-2h4.8438,0.75l0.21875-0.75,1.0312-4,0.3125-1.25h-1.2812-5.875c-0.90914-1.1554-2.2263-2-3.8125-2zm0,2c1.1158,0,2.0379,0.59507,2.5625,1.5l0.3125,0.5h0.5625,4.9688l-0.53125,2h-4.4375-0.5625l-0.3125,0.5c-0.52462,0.90493-1.4466,1.5-2.5625,1.5-1.6687,0-3-1.3313-3-3s1.3313-3,3-3z"/>
|
|
||||||
<path opacity="0.35" style="enable-background:accumulate;color:#000000;" d="M355.5,265,350,265,349.44,267,355,267z" fill-rule="nonzero"/>
|
|
||||||
<path style="enable-background:accumulate;color:#000000;" d="m346,265c0,0.55228-0.44772,1-1,1s-1-0.44772-1-1,0.44772-1,1-1,1,0.44772,1,1z" fill-rule="nonzero"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 910 B |
|
@ -1,7 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16.004" width="16">
|
|
||||||
<g fill="#bebebe" transform="translate(-183,-529)">
|
|
||||||
<path style="enable-background:accumulate;color:#000000;" d="m191,533.85,0,10.38-2.344-2.2882-1.3394,2.7346c-0.32808,0.73962-2.0337,0.14492-1.5487-0.84412l1.3255-2.8393h-2.9579l6.8645-7.1436z" fill-rule="nonzero" display="block"/>
|
|
||||||
<path d="m190.16,530.06c-3.8266,0.46006-6.5788,3.9578-6.0938,7.7812,0.13127,1.0347,0.29377,1.3818,0.29377,1.3818l1.675-1.6318c-0.33104-2.7534,1.6216-5.2315,4.375-5.5625,2.7534-0.33104,5.2315,1.6216,5.5625,4.375,0.31355,2.608-1.3913,5.0249-3.9688,5.5312l0.0312,2s0.52086-0.1059,0.62354-0.13097c3.4156-0.83385,5.7063-4.1273,5.2827-7.6503-0.46006-3.8266-3.9547-6.5538-7.7812-6.0938z" style="baseline-shift:baseline;block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;"/>
|
|
||||||
<path opacity="0.3" style="enable-background:accumulate;color:#000000;" d="m187.11,536.81,0-0.20574-0.19826,0.0186c0.0165-0.13095,0.0329-0.26167,0.0496-0.3926h-0.11578l-0.11556,0.14959-0.11578,0.0559-0.1653-0.0932-0.0165-0.20575,0.0331-0.22438,0.24798-0.18688h0.19826l0.0329-0.11229,0.24786,0.0559,0.18183,0.2246,0.0331-0.37419,0.31401-0.26167,0.11567-0.28055,0.23133-0.0934,0.1322-0.18688,0.29738-0.0564,0.14885-0.22415h-0.44623l0.28094-0.13095h0.19814l0.28106-0.0937,0.0331-0.11186-0.0992-0.0937-0.11567-0.0375,0.0331-0.11208-0.0826-0.16822-0.19837,0.0746,0.0331-0.14947-0.23134-0.13096-0.18171,0.3177,0.0165,0.11229-0.18171,0.075-0.11578,0.24302-0.0495-0.22438-0.31402-0.13095-0.0496-0.16822,0.41315-0.24325,0.18182-0.16822,0.0165-0.20563-0.0991-0.0562-0.13219-0.0188-0.0826,0.20575s-0.1382,0.0271-0.17373,0.0358c-0.45378,0.41804-1.3707,1.3204-1.5837,3.024,0.008,0.0395,0.15441,0.26854,0.15441,0.26854l0.347,0.20552,0.347,0.0937m3.9661-4.3003-0.4298-0.16833-0.49552,0.0561-0.61161,0.16822-0.11567,0.11229,0.38008,0.26167,0,0.14959-0.14875,0.14959,0.19846,0.39294,0.13188-0.075,0.16561-0.26168c0.2553-0.0789,0.4842-0.16833,0.72686-0.28053l0.19846-0.5048m2.5292,0.34192-0.375,0.0937-0.21875,0.15625,0,0.125-0.375,0.25,0.0937,0.34375,0.21875-0.15625,0.125,0.15625,0.15625,0.0937,0.0937-0.28125-0.0625-0.15625,0.0625-0.0937,0.21875-0.1875,0.0937,0-0.0937,0.21875,0,0.1875c0.0892-0.0242,0.1588-0.051,0.25-0.0625l-0.25,0.1875v0.125l-0.3125,0.21875-0.28125-0.0625v-0.15625l-0.125,0.0625,0.0625,0.15625h-0.21875l-0.125,0.21875-0.15625,0.15625-0.0937,0.0312v0.1875l0.0312,0.15625h-0.0312v0.53125l0.0625-0.0312,0.0937-0.21875,0.1875-0.125,0.0312-0.0937,0.28125-0.0625,0.15625,0.1875,0.1875,0.0937-0.0937,0.1875,0.15625-0.0312,0.0625-0.21875-0.1875-0.21875h0.0625l0.21875,0.15625,0.0312,0.21875,0.15625,0.21875,0.0625-0.3125,0.0937-0.0312c0.0959,0.0996,0.1692,0.23163,0.25,0.34375h0.28125l0.1875,0.125-0.0937,0.0937-0.15625,0.15625h-0.25l-0.34375-0.0937h-0.1875l-0.125,0.15625-0.34375-0.375-0.25-0.0625-0.375,0.0625-0.15625,0.0937v2.4062l0.0312,0.0312,0.25-0.15625,0.0937,0.0937h0.28125l0.125,0.15625-0.0937,0.3125,0.1875,0.1875v0.375l0.125,0.25-0.0937,0.25c-0.009,0.16159,0,0.30714,0,0.46875,0.0795,0.21894,0.14355,0.43575,0.21875,0.65625l0.0625,0.34375v0.1875h0.125l0.21875-0.125h0.25l0.375-0.4375-0.0312-0.15625,0.25-0.21875-0.1875-0.1875,0.21875-0.1875,0.21875-0.125,0.0937-0.125-0.0625-0.25v-0.59375l0.1875-0.375,0.1875-0.25,0.25-0.5625v-0.15625c-0.11654,0.0146-0.22972,0.0231-0.34375,0.0312-0.0722,0.005-0.14446,0-0.21875,0-0.12359-0.25961-0.2183-0.50966-0.3125-0.78125l-0.15625-0.1875-0.0937-0.3125,0.0625-0.0625,0.21875,0.25,0.25,0.5625,0.15625,0.15625-0.0625,0.21875,0.15625,0.15625,0.25-0.25,0.3125-0.21875,0.15625-0.1875v-0.21875c-0.0389-0.0732-0.0547-0.14545-0.0937-0.21875l-0.15625,0.1875-0.125-0.15625-0.1875-0.125v-0.28125l0.21875,0.21875,0.21875-0.0312c0.10166,0.0923,0.19205,0.20751,0.28125,0.3125l0.15625-0.1875c0-0.17463-0.19976-1.0204-0.625-1.75-0.42526-0.72932-1.1562-1.4062-1.1562-1.4062l-0.0625,0.0937-0.21875,0.21875-0.25-0.25h0.25l0.125-0.125-0.46875-0.0937-0.25-0.0937z" fill-rule="nonzero"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.9 KiB |