Просмотр исходного кода

Merge remote-tracking branch 'upstream/dev' into dev

plopoyop 11 лет назад
Родитель
Сommit
c446625c7f
71 измененных файлов с 546 добавлено и 634 удалено
  1. 228 91
      app/Controllers/configureController.php
  2. 19 3
      app/Controllers/feedController.php
  3. 5 1
      app/Controllers/indexController.php
  4. 42 0
      app/Controllers/statsController.php
  5. 11 1
      app/Models/Configuration.php
  6. 1 2
      app/Models/Entry.php
  7. 2 3
      app/Models/EntryDAO.php
  8. 8 1
      app/Models/StatsDAO.php
  9. 1 0
      app/Models/StatsDAOSQLite.php
  10. 1 0
      app/Models/Themes.php
  11. 64 64
      app/i18n/de.php
  12. 14 10
      app/i18n/en.php
  13. 18 14
      app/i18n/fr.php
  14. 9 1
      app/layout/aside_flux.phtml
  15. 10 7
      app/layout/nav_menu.phtml
  16. 4 1
      app/views/configure/categorize.phtml
  17. 18 12
      app/views/configure/feed.phtml
  18. 11 4
      app/views/configure/queries.phtml
  19. 2 4
      app/views/configure/reading.phtml
  20. 1 1
      app/views/helpers/javascript_vars.phtml
  21. 3 1
      app/views/helpers/pagination.phtml
  22. 8 0
      app/views/helpers/view/global_view.phtml
  23. 3 3
      app/views/helpers/view/normal_view.phtml
  24. 3 3
      app/views/helpers/view/reader_view.phtml
  25. 16 2
      app/views/stats/idle.phtml
  26. 1 1
      app/views/stats/index.phtml
  27. 2 2
      app/views/stats/repartition.phtml
  28. 5 0
      lib/Minz/Request.php
  29. 6 1
      p/scripts/main.js
  30. 1 1
      p/themes/Dark/dark.css
  31. 1 1
      p/themes/Flat/flat.css
  32. 1 1
      p/themes/Origine/origine.css
  33. 0 5
      p/themes/Screwdriver/icons/add.svg
  34. 0 7
      p/themes/Screwdriver/icons/all.svg
  35. BIN
      p/themes/Screwdriver/icons/apple-touch-icon.png
  36. 0 6
      p/themes/Screwdriver/icons/bookmark-add.svg
  37. 5 60
      p/themes/Screwdriver/icons/bookmark.svg
  38. 0 7
      p/themes/Screwdriver/icons/category-white.svg
  39. 0 7
      p/themes/Screwdriver/icons/category.svg
  40. 0 7
      p/themes/Screwdriver/icons/close.svg
  41. 0 5
      p/themes/Screwdriver/icons/configure.svg
  42. 0 5
      p/themes/Screwdriver/icons/down.svg
  43. BIN
      p/themes/Screwdriver/icons/favicon-16-32-48-64.ico
  44. BIN
      p/themes/Screwdriver/icons/favicon-256.png
  45. 0 13
      p/themes/Screwdriver/icons/favicon.svg
  46. BIN
      p/themes/Screwdriver/icons/grey.gif
  47. 0 7
      p/themes/Screwdriver/icons/help.svg
  48. 0 12
      p/themes/Screwdriver/icons/icon.svg
  49. 0 7
      p/themes/Screwdriver/icons/key.svg
  50. 0 4
      p/themes/Screwdriver/icons/link.svg
  51. 0 6
      p/themes/Screwdriver/icons/login.svg
  52. 0 6
      p/themes/Screwdriver/icons/logout.svg
  53. 0 5
      p/themes/Screwdriver/icons/next.svg
  54. 0 2
      p/themes/Screwdriver/icons/non-starred.svg
  55. 0 5
      p/themes/Screwdriver/icons/prev.svg
  56. 3 57
      p/themes/Screwdriver/icons/read.svg
  57. 0 5
      p/themes/Screwdriver/icons/refresh.svg
  58. 0 6
      p/themes/Screwdriver/icons/rss.svg
  59. 0 6
      p/themes/Screwdriver/icons/search.svg
  60. 0 8
      p/themes/Screwdriver/icons/share.svg
  61. 5 60
      p/themes/Screwdriver/icons/starred.svg
  62. 0 5
      p/themes/Screwdriver/icons/tag.svg
  63. 3 65
      p/themes/Screwdriver/icons/unread.svg
  64. 0 5
      p/themes/Screwdriver/icons/up.svg
  65. 0 1
      p/themes/Screwdriver/icons/view-global.svg
  66. 0 1
      p/themes/Screwdriver/icons/view-normal.svg
  67. 0 1
      p/themes/Screwdriver/icons/view-reader.svg
  68. 1 1
      p/themes/Screwdriver/screwdriver.css
  69. 1 1
      p/themes/base-theme/base.css
  70. 3 0
      p/themes/base-theme/template.css
  71. 6 0
      p/themes/icons/stats.svg

+ 228 - 91
app/Controllers/configureController.php

@@ -1,11 +1,22 @@
 <?php
 
+/**
+ * Controller to handle every configuration options.
+ */
 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() {
 		if (!$this->view->loginOk) {
 			Minz_Error::error(
 				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();
 	}
 
+	/**
+	 * 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() {
 		$feedDAO = FreshRSS_Factory::createFeedDao();
 		$catDAO = new FreshRSS_CategoryDAO();
@@ -34,6 +57,10 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 				} elseif ($ids[$key] != $defaultId) {
 					$feedDAO->changeCategory($ids[$key], $defaultId);
 					$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();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('categories_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'categorize'), true);
+			Minz_Request::good(_t('categories_updated'),
+			                   array('c' => 'configure', 'a' => 'categorize'));
 		}
 
 		$this->view->categories = $catDAO->listCategories(false);
 		$this->view->defaultCategory = $catDAO->getDefault();
 		$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() {
 		$catDAO = new FreshRSS_CategoryDAO();
 		$this->view->categories = $catDAO->listCategories(false);
@@ -85,7 +127,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 			if (!$this->view->flux) {
 				Minz_Error::error(
 					404,
-					array('error' => array(Minz_Translate::t('page_not_found')))
+					array('error' => array(_t('page_not_found')))
 				);
 			} else {
 				if (Minz_Request::isPost() && $this->view->flux) {
@@ -117,12 +159,12 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 						$this->view->flux->faviconPrepare();
 						$notif = array(
 							'type' => 'good',
-							'content' => Minz_Translate::t('feed_updated')
+							'content' => _t('feed_updated')
 						);
 					} else {
 						$notif = array(
 							'type' => 'bad',
-							'content' => Minz_Translate::t('error_occurred_update')
+							'content' => _t('error_occurred_update')
 						);
 					}
 					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_View::prependTitle(Minz_Translate::t('rss_feed_management') . ' — ' . $this->view->flux->name() . ' · ');
+				Minz_View::prependTitle(_t('rss_feed_management') . ' — ' . $this->view->flux->name() . ' · ');
 			}
 		} 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() {
 		if (Minz_Request::isPost()) {
 			$this->view->conf->_language(Minz_Request::param('language', 'en'));
-			$themeId = Minz_Request::param('theme', '');
-			if ($themeId == '') {
-				$themeId = FreshRSS_Themes::defaultTheme;
-			}
-			$this->view->conf->_theme($themeId);
+			$this->view->conf->_theme(Minz_Request::param('theme', FreshRSS_Themes::$defaultTheme));
 			$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_favorite(Minz_Request::param('topline_favorite', false));
@@ -164,20 +226,42 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 			Minz_Translate::reset();
 			invalidateHttpCache();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('configuration_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'display'), true);
+			Minz_Request::good(_t('configuration_updated'),
+			                   array('c' => 'configure', 'a' => 'display'));
 		}
 
 		$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() {
 		if (Minz_Request::isPost()) {
 			$this->view->conf->_posts_per_page(Minz_Request::param('posts_per_page', 10));
@@ -204,18 +288,20 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 			Minz_Translate::reset();
 			invalidateHttpCache();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('configuration_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'reading'), true);
+			Minz_Request::good(_t('configuration_updated'),
+			                   array('c' => 'configure', 'a' => 'reading'));
 		}
 
-		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() {
 		if (Minz_Request::isPost()) {
 			$params = Minz_Request::params();
@@ -223,25 +309,31 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 			$this->view->conf->save();
 			invalidateHttpCache();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('configuration_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'sharing'), true);
+			Minz_Request::good(_t('configuration_updated'),
+			                   array('c' => 'configure', 'a' => 'sharing'));
 		}
 
-		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() {
 		$list_keys = array('a', 'b', 'backspace', 'c', 'd', 'delete', 'down', 'e', 'end', 'enter',
 		                    'escape', 'f', 'g', 'h', 'home', 'i', 'insert', 'j', 'k', 'l', 'left',
 		                    'm', 'n', 'o', 'p', 'page_down', 'page_up', 'q', 'r', 'return', 'right',
 		                    's', 'space', 't', 'tab', 'u', 'up', 'v', 'w', 'x', 'y',
-		                    'z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
-		                    '9', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
+		                    'z', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
 		                    'f10', 'f11', 'f12');
 		$this->view->list_keys = $list_keys;
 
@@ -259,44 +351,50 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 			$this->view->conf->save();
 			invalidateHttpCache();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('shortcuts_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'shortcut'), true);
+			Minz_Request::good(_t('shortcuts_updated'),
+			                   array('c' => 'configure', 'a' => 'shortcut'));
 		}
 
-		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() {
-		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() {
 		if (Minz_Request::isPost()) {
-			$old = Minz_Request::param('old_entries', 3);
-			$keepHistoryDefault = Minz_Request::param('keep_history_default', 0);
-			$ttlDefault = 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->_old_entries(Minz_Request::param('old_entries', 3));
+			$this->view->conf->_keep_history_default(Minz_Request::param('keep_history_default', 0));
+			$this->view->conf->_ttl_default(Minz_Request::param('ttl_default', -2));
 			$this->view->conf->save();
 			invalidateHttpCache();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('configuration_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'archiving'), true);
+			Minz_Request::good(_t('configuration_updated'),
+			                   array('c' => 'configure', 'a' => 'archiving'));
 		}
 
-		Minz_View::prependTitle(Minz_Translate::t('archiving_configuration') . ' · ');
+		Minz_View::prependTitle(_t('archiving_configuration') . ' · ');
 
 		$entryDAO = FreshRSS_Factory::createEntryDao();
 		$this->view->nb_total = $entryDAO->count();
@@ -306,28 +404,35 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 			$this->view->size_total = $entryDAO->size(true);
 		}
 	}
-	
+
+	/**
+	 * 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() {
 		if (Minz_Request::isPost()) {
 			$queries = Minz_Request::param('queries', array());
 
 			foreach ($queries as $key => $query) {
 				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->save();
 
-			$notif = array(
-				'type' => 'good',
-				'content' => Minz_Translate::t('configuration_updated')
-			);
-			Minz_Session::_param('notification', $notif);
-
-			Minz_Request::forward(array('c' => 'configure', 'a' => 'queries'), true);
+			Minz_Request::good(_t('configuration_updated'),
+			                   array('c' => 'configure', 'a' => 'queries'));
 		} else {
 			$this->view->query_get = array();
+			$cat_dao = new FreshRSS_CategoryDAO();
+			$feed_dao = FreshRSS_Factory::createFeedDao();
 			foreach ($this->view->conf->queries as $key => $query) {
 				if (!isset($query['get'])) {
 					continue;
@@ -335,51 +440,83 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
 
 				switch ($query['get'][0]) {
 				case 'c':
-					$dao = new FreshRSS_CategoryDAO();
-					$category = $dao->searchById(substr($query['get'], 2));
+					$category = $cat_dao->searchById(substr($query['get'], 2));
+
+					$deprecated = true;
+					$cat_name = '';
+					if ($category) {
+						$cat_name = $category->name();
+						$deprecated = false;
+					}
+
 					$this->view->query_get[$key] = array(
 						'type' => 'category',
-						'name' => $category->name(),
+						'name' => $cat_name,
+						'deprecated' => $deprecated,
 					);
 					break;
 				case 'f':
-					$dao = FreshRSS_Factory::createFeedDao();
-					$feed = $dao->searchById(substr($query['get'], 2));
+					$feed = $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(
 						'type' => 'feed',
-						'name' => $feed->name(),
+						'name' => $feed_name,
+						'deprecated' => $deprecated,
 					);
 					break;
 				case 's':
 					$this->view->query_get[$key] = array(
 						'type' => 'favorite',
 						'name' => 'favorite',
+						'deprecated' => false,
 					);
 					break;
 				case 'a':
 					$this->view->query_get[$key] = array(
 						'type' => 'all',
 						'name' => 'all',
+						'deprecated' => false,
 					);
 					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() {
+		$whitelist = array('get', 'order', 'name', 'search', 'state');
 		$queries = $this->view->conf->queries;
 		$query = Minz_Request::params();
-		$query['name'] = Minz_Translate::t('query_number', count($queries) + 1);
-		unset($query['output']);
-		unset($query['token']);
+		$query['name'] = _t('query_number', count($queries) + 1);
+		foreach ($query as $key => $value) {
+			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;
 		$this->view->conf->_queries($queries);
 		$this->view->conf->save();
 
-		// Minz_Request::forward(array('params' => $query), true);
-		Minz_Request::forward(array('c' => 'configure', 'a' => 'queries'), true);
+		Minz_Request::good(_t('query_created', $query['name']),
+		                   array('c' => 'configure', 'a' => 'queries'));
 	}
 }

+ 19 - 3
app/Controllers/feedController.php

@@ -383,7 +383,16 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
 
 			$feedDAO = FreshRSS_Factory::createFeedDao();
 			if ($type == 'category') {
+				// List feeds to remove then related user queries.
+				$feeds = $feedDAO->listByCategory($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 (
 						'type' => 'good',
 						'content' => Minz_Translate::t ('category_emptied')
@@ -397,6 +406,10 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
 				}
 			} else {
 				if ($feedDAO->deleteFeed ($id)) {
+					// Remove related queries
+					$this->view->conf->remove_query_by_get('f_' . $id);
+					$this->view->conf->save();
+
 					$notif = array (
 						'type' => 'good',
 						'content' => Minz_Translate::t ('feed_deleted')
@@ -412,10 +425,13 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
 
 			Minz_Session::_param ('notification', $notif);
 
-			if ($type == 'category') {
-				Minz_Request::forward (array ('c' => 'configure', 'a' => 'categorize'), true);
+			$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);
 			} else {
-				Minz_Request::forward (array ('c' => 'configure', 'a' => 'feed'), true);
+				Minz_Request::forward(array ('c' => 'configure', 'a' => 'feed'), true);
 			}
 		}
 	}

+ 5 - 1
app/Controllers/indexController.php

@@ -84,7 +84,7 @@ class FreshRSS_index_Controller extends Minz_ActionController {
 		$first = Minz_Request::param ('next', '');
 
 		$ajax_request = Minz_Request::param('ajax', false);
-		if ($ajax_request == 1 && $this->view->conf->display_posts) {
+		if ($output === 'reader') {
 			$nb = max(1, round($nb / 2));
 		}
 
@@ -337,6 +337,10 @@ class FreshRSS_index_Controller extends Minz_ActionController {
 	}
 
 	public function formLoginAction () {
+		if ($this->view->loginOk) {
+			Minz_Request::forward(array('c' => 'index', 'a' => 'index'), true);
+		}
+
 		if (Minz_Request::isPost()) {
 			$ok = false;
 			$nonce = Minz_Session::param('nonce');

+ 42 - 0
app/Controllers/statsController.php

@@ -1,7 +1,21 @@
 <?php
 
+/**
+ * Controller to handle application statistics.
+ */
 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() {
 		$statsDAO = FreshRSS_Factory::createStatsDAO();
 		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 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() {
 		$statsDAO = FreshRSS_Factory::createStatsDAO();
 		$feeds = $statsDAO->calculateFeedLastDate();
@@ -56,6 +81,18 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
 		$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() {
 		$statsDAO = FreshRSS_Factory::createStatsDAO();
 		$categoryDAO = new FreshRSS_CategoryDAO();
@@ -74,6 +111,11 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
 		$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() {
 		if (!$this->view->loginOk) {
 			Minz_Error::error(

+ 11 - 1
app/Models/Configuration.php

@@ -124,6 +124,16 @@ class FreshRSS_Configuration {
 		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) {
 		if (!isset($this->available_languages[$value])) {
 			$value = 'en';
@@ -147,7 +157,7 @@ class FreshRSS_Configuration {
 			// left blank on purpose
 		case FreshRSS_Entry::STATE_NOT_READ:
 			// left blank on purpose
-		case FreshRSS_Entry::STATE_NOT_READ_STRICT:
+		case FreshRSS_Entry::STATE_STRICT + FreshRSS_Entry::STATE_NOT_READ:
 			$this->data['default_view'] = $value;
 			break;
 		default:

+ 1 - 2
app/Models/Entry.php

@@ -6,8 +6,7 @@ class FreshRSS_Entry extends Minz_Model {
 	const STATE_NOT_READ = 2;
 	const STATE_FAVORITE = 4;
 	const STATE_NOT_FAVORITE = 8;
-	const STATE_READ_STRICT = 16;
-	const STATE_NOT_READ_STRICT = 32;
+	const STATE_STRICT = 16;
 
 	private $id = 0;
 	private $guid;

+ 2 - 3
app/Models/EntryDAO.php

@@ -333,14 +333,13 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo {
 		if ($state & FreshRSS_Entry::STATE_NOT_READ) {
 			if (!($state & FreshRSS_Entry::STATE_READ)) {
 				$where .= 'AND e1.is_read=0 ';
+			} elseif ($state & FreshRSS_Entry::STATE_STRICT) {
+				$where .= 'AND e1.is_read=0 ';
 			}
 		}
 		elseif ($state & FreshRSS_Entry::STATE_READ) {
 			$where .= 'AND e1.is_read=1 ';
 		}
-		elseif ($state & FreshRSS_Entry::STATE_NOT_READ_STRICT) {
-			$where .= 'AND e1.is_read=0 ';
-		}
 		if ($state & FreshRSS_Entry::STATE_FAVORITE) {
 			if (!($state & FreshRSS_Entry::STATE_NOT_FAVORITE)) {
 				$where .= 'AND e1.is_favorite=1 ';

+ 8 - 1
app/Models/StatsDAO.php

@@ -209,8 +209,14 @@ SQL;
 		$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->format('%a') / ($period)), 2);
+		return round($res['count'] / ($interval_in_days / $period), 2);
 	}
 
 	/**
@@ -309,6 +315,7 @@ SQL;
 SELECT MAX(f.id) as id
 , MAX(f.name) AS name
 , MAX(date) AS last_date
+, COUNT(*) AS nb_articles
 FROM {$this->prefix}feed AS f,
 {$this->prefix}entry AS e
 WHERE f.id = e.id_feed

+ 1 - 0
app/Models/StatsDAOSQLite.php

@@ -53,6 +53,7 @@ SQL;
 		$stm->execute();
 		$res = $stm->fetchAll(PDO::FETCH_NAMED);
 
+		$repartition = array();
 		foreach ($res as $value) {
 			$repartition[(int) $value['period']] = (int) $value['count'];
 		}

+ 1 - 0
app/Models/Themes.php

@@ -96,6 +96,7 @@ class FreshRSS_Themes extends Minz_Model {
 			'search' => '🔍',
 			'share' => '♺',
 			'starred' => '★',
+			'stats' => '%',
 			'tag' => '⚐',
 			'up' => '△',
 			'view-normal' => '☰',

+ 64 - 64
app/i18n/de.php

@@ -15,16 +15,16 @@ return array (
 	'feed'				=> 'Feed',
 	'feeds'				=> 'Feeds',
 	'shortcuts'			=> 'Shortcuts',
-	'about'				=> '&Uuml;ber',
+	'about'				=> 'Über',
 	'stats'				=> 'Statistiken',
 
 	'your_rss_feeds'		=> 'Ihre RSS Feeds',
-	'add_rss_feed'			=> 'RSS-Feed hinzuf&uuml;gen',
+	'add_rss_feed'			=> 'RSS-Feed hinzufügen',
 	'no_rss_feed'			=> 'Kein RSS Feed',
 	'import_export_opml'		=> 'Import / Export (OPML)',
 
 	'subscription_management'	=> 'Abonnementsverwaltung',
-	'main_stream'			=> 'Haupt-Nachrichtenflu&szlig;',
+	'main_stream'			=> 'Haupt-Nachrichtenfluß',
 	'all_feeds'			=> 'Alle Feeds',
 	'favorite_feeds'		=> 'Favoriten (%d)',
 	'not_read'			=> '%d ungelesen',
@@ -42,22 +42,22 @@ return array (
 	'mark_cat_read'			=> 'Kategorie als gelesen markieren',
 	'before_one_day'		=> 'Vor einem Tag',
 	'before_one_week'		=> 'Vor einer Woche',
-	'display'			    => 'Anzeige',
+	'display'			=> 'Anzeige',
 	'normal_view'			=> 'Normale Anzeige',
 	'reader_view'			=> 'Leseanzeige-Modus',
 	'global_view'			=> 'Globale Anzeige',
-	'rss_view'			    => 'RSS-Feed',
+	'rss_view'			=> 'RSS-Feed',
 	'show_all_articles'		=> 'zeige alle Artikel',
 	'show_not_reads'		=> 'zeige nicht gelesene',
-	'show_read'			    => 'zeige nur gelesene',
+	'show_read'			=> 'zeige nur gelesene',
 	'show_favorite'			=> 'Favoriten anzeigen',
-	'older_first'			=> '&Auml;lteste zuerst',
+	'older_first'			=> 'Älteste zuerst',
 	'newer_first'			=> 'Neuere zuerst',
 
 	// Pagination
 	'first'				=> 'Erste',
 	'previous'			=> 'Vorherige',
-	'next'				=> 'N&auml;chste',
+	'next'				=> 'Nächste',
 	'last'				=> 'Letzte',
 
 	// CONTROLLERS
@@ -67,7 +67,7 @@ return array (
 	'access_denied'			=> 'Sie haben nicht die Berechtigung, diese Seite aufzurufen',
 	'page_not_found'		=> 'Sie suchen nach einer Seite, die es nicht gibt',
 	'error_occurred'		=> 'Es gab einen Fehler',
-	'error_occurred_update'	=> 'Es wurde nichts ge&auml;ndert',
+	'error_occurred_update'		=> 'Es wurde nichts geändert',
 
 	'default_category'		=> 'Unkategorisiert',
 	'categories_updated'		=> 'Kategorien wurden aktualisiert',
@@ -75,67 +75,67 @@ return array (
 	'feed_updated'			=> 'Der Feed wurde aktualisiert',
 	'rss_feed_management'		=> 'Verwaltung der RSS Feeds',
 	'configuration_updated'		=> 'Die Konfiguration wurde aktualisiert',
-	'sharing_management'		=> 'Verwaltung der Optionen f&uuml;r das Teilen',
-	'bad_opml_file'			=> 'Ihre OPML-Datei ist ung&uuml;ltig',
+	'sharing_management'		=> 'Verwaltung der Optionen für das Teilen',
+	'bad_opml_file'			=> 'Ihre OPML-Datei ist ungültig',
 	'shortcuts_updated'		=> 'Shortcuts wurden aktualisiert',
 	'shortcuts_management'		=> 'Verwaltung der Shortcuts',
 	'shortcuts_navigation'		=> 'Navigation',
-	'shortcuts_navigation_help'	=> 'Mit der "Shift" Taste gelten die Navigations-Shortcuts f&uuml;r Feeds.<br/>Mit der "Alt" Taste gelten die Navigations-Shortcuts f&uuml;r Kategorien.',
+	'shortcuts_navigation_help'	=> 'Mit der "Shift" Taste gelten die Navigations-Shortcuts für Feeds.<br/>Mit der "Alt" Taste gelten die Navigations-Shortcuts für Kategorien.',
 	'shortcuts_article_action'	=> 'Artikelaktionen',
 	'shortcuts_other_action'	=> 'Andere Aktionen',
 	'feeds_marked_read'		=> 'Die Feeds wurden als gelesen markiert',
-	'updated'			=> 'Die &Auml;nderungen wurden aktualisiert',
+	'updated'			=> 'Die Änderungen wurden aktualisiert',
 
 	'already_subscribed'		=> 'Sie haben bereits <em>%s</em> abonniert',
-	'feed_added'			=> 'Der RSS Feed <em>%s</em> wurde hinzugef&uuml;gt',
-	'feed_not_added'		=> '<em>%s</em> konnte nicht hinzugef&uuml;gt werden',
-	'internal_problem_feed'		=> 'Der RSS Feed konnte nicht hinzugef&uuml;gt werden. &uuml;berpr&uuml;fen Sie die Protokolldateien von FressRSS f&uuml;r weitere Informationen.',
-	'invalid_url'			=> 'URL <em>%s</em> ist ung&uuml;ltig',
+	'feed_added'			=> 'Der RSS Feed <em>%s</em> wurde hinzugefügt',
+	'feed_not_added'		=> '<em>%s</em> konnte nicht hinzugefügt werden',
+	'internal_problem_feed'		=> 'Der RSS Feed konnte nicht hinzugefügt werden. überprüfen Sie die Protokolldateien von FressRSS für weitere Informationen.',
+	'invalid_url'			=> 'URL <em>%s</em> ist ungültig',
 	'feed_actualized'		=> '<em>%s</em> wurde aktualisiert',
 	'n_feeds_actualized'		=> '%d Feeds wurden aktualisiert',
 	'feeds_actualized'		=> 'RSS Feeds wurden aktualisiert',
 	'no_feed_actualized'		=> 'Es wurden keine RSS Feeds aktualisiert',
-	'n_entries_deleted'		=> '%d Artikel wurden gel&ouml;scht',
+	'n_entries_deleted'		=> '%d Artikel wurden gelöscht',
 	'feeds_imported_with_errors'	=> 'Ihre Feeds wurden importiert, es gab aber einige Fehler',
 	'feeds_imported'		=> 'Ihre Feeds wurden importiert und werden jetzt aktualisiert',
 	'category_emptied'		=> 'Die Kategorie wurde geleert',
-	'feed_deleted'			=> 'Der Feed wurde gel&ouml;scht',
-	'feed_validator'		=> '&Üuml;berpr&uuml;fen Sie die G&uuml;ltigkeit des Feeds',
+	'feed_deleted'			=> 'Der Feed wurde gelöscht',
+	'feed_validator'		=> 'Überprüfen Sie die Gültigkeit des Feeds',
 
 	'optimization_complete'		=> 'Die Optimierung ist beendet',
 
 	'your_rss_feeds'		=> 'Ihre RSS Feeds',
 	'your_favorites'		=> 'Ihre Favoriten',
-	'public'			=> '&Ouml;ffentlich',
-	'invalid_login'			=> 'Das Login ist ung&uuml;ltig',
+	'public'			=> 'Öffentlich',
+	'invalid_login'			=> 'Das Login ist ungültig',
 
 	// VIEWS
 	'save'				=> 'Speichern',
-	'delete'			=> 'L&ouml;schen',
+	'delete'			=> 'Löschen',
 	'cancel'			=> 'Abbrechen',
 
-	'back_to_rss_feeds'		=> '← Zur&uuml;ck zu den RSS Feeds gehen',
-	'feeds_moved_category_deleted'	=> 'Wenn Sie eine Kategorie l&ouml;schen, werden deren Feeds automatisch in die Kategorie <em>%s</em> eingef&uuml;gt.',
+	'back_to_rss_feeds'		=> '← Zurück zu den RSS Feeds gehen',
+	'feeds_moved_category_deleted'	=> 'Wenn Sie eine Kategorie löschen, werden deren Feeds automatisch in die Kategorie <em>%s</em> eingefügt.',
 	'category_number'		=> 'Kategorie n°%d',
 	'ask_empty'			=> 'Leeren?',
 	'number_feeds'			=> '%d Feeds',
-	'can_not_be_deleted'		=> 'Kann nicht gel&ouml;scht werden',
-	'add_category'			=> 'F&uuml;ge eine Kategorie hinzu',
+	'can_not_be_deleted'		=> 'Kann nicht gelöscht werden',
+	'add_category'			=> 'Füge eine Kategorie hinzu',
 	'new_category'			=> 'Neue Kategorie',
 
-	'javascript_for_shortcuts'	=> 'JavaScript muss erm&ouml;glicht werden, wenn Shortcuts verwendet werden sollen',
-	'javascript_should_be_activated'=> 'JavaScript muss erm&ouml;glicht werden',
+	'javascript_for_shortcuts'	=> 'JavaScript muss ermöglicht werden, wenn Shortcuts verwendet werden sollen',
+	'javascript_should_be_activated'=> 'JavaScript muss ermöglicht werden',
 	'shift_for_all_read'		=> '+ <code>shift</code> um alle Artikel als gelesen zu markieren',
 	'see_on_website'		=> 'Auf der Originalwebseite anschauen',
-	'next_article'			=> 'Zum n&auml;chsten Artikel springen',
+	'next_article'			=> 'Zum nächsten Artikel springen',
 	'last_article'			=> 'Zum letzten Artikel springen',
 	'previous_article'		=> 'Zum vorherigen Artikel springen',
 	'first_article'			=> 'Zum ersten Artikel springen',
-	'next_page'			=> 'Zur n&auml;chsten Seite springen',
+	'next_page'			=> 'Zur nächsten Seite springen',
 	'previous_page'			=> 'Zur vorherigen Seite springen',
 	'collapse_article'		=> 'Zusammenfalten',
 	'auto_share'			=> 'Teilen',
-	'auto_share_help'		=> 'Wenn es nur eine Option zum Teilen gibt, wird die verwendet. Ansonsten werden die Optionen &uuml;ber die Nummer ausgew&auml;hlt.',
+	'auto_share_help'		=> 'Wenn es nur eine Option zum Teilen gibt, wird die verwendet. Ansonsten werden die Optionen über die Nummer ausgewählt.',
 
 	'file_to_import'		=> 'Datei zum importieren',
 	'import'			=> 'Import',
@@ -150,75 +150,75 @@ return array (
 	'website_url'			=> 'Webseiten-Adresse URL',
 	'feed_url'			=> 'Feed URL',
 	'articles'			=> 'Artikel',
-	'number_articles'		=> 'Anzahl der Artikel',
+	'number_articles'		=> '%d Artikel',
 	'by_feed'			=> 'per Feed',
 	'by_default'			=> 'Als Vorgabe',
 	'keep_history'			=> 'Kleinste Anzahl der Artikel, die behalten werden',
 	'categorize'			=> 'In einer Kategorie speichern',
-	'truncate'			=> 'Alle Artikel l&ouml;schen',
+	'truncate'			=> 'Alle Artikel löschen',
 	'advanced'			=> 'Erweitert',
 	'show_in_all_flux'		=> 'Im Hauptstrom anzeigen',
 	'yes'				=> 'Ja',
 	'no'				=> 'Nein',
 	'css_path_on_website'		=> 'Pfad zur CSS-Datei des Artikels auf der Original Webseite',
-	'retrieve_truncated_feeds'	=> 'Gek&uuml;rzte RSS Feeds abrufen (Achtung, ben&ouml;tigt mehr Zeit!)',
+	'retrieve_truncated_feeds'	=> 'Gekürzte RSS Feeds abrufen (Achtung, benötigt mehr Zeit!)',
 	'http_authentication'		=> 'HTTP Authentifizierung',
 	'http_username'			=> 'HTTP Nutzername',
 	'http_password'			=> 'HTTP Passwort',
 	'blank_to_disable'		=> 'Zum Ausschalten frei lassen',
 	'not_yet_implemented'		=> 'Noch nicht implementiert',
-	'access_protected_feeds'	=> 'Die Verbindung erlaubt Zugriff zu HTTP-gesch&uuml;tzten RSS Feeds',
-	'no_selected_feed'		=> 'Kein Feed ausgew&auml;hlt.',
-	'think_to_add'			=> '<a href="./?c=configure&amp;a=feed">Sie k&ouml;nnen Feeds hinzuf&uuml;gen</a>.',
+	'access_protected_feeds'	=> 'Die Verbindung erlaubt Zugriff zu HTTP-geschützten RSS Feeds',
+	'no_selected_feed'		=> 'Kein Feed ausgewählt.',
+	'think_to_add'			=> 'Sie können Feeds hinzufügen.',
 
 	'current_user'			=> 'Aktuelle Nutzung',
 	'default_user'			=> 'Nutzername des Standardnutzers <small>(maximal 16 Zeichen - alphanumerisch)</small>',
-	'password_form'			=> 'Passwort<br /><small>(f&uuml;r die Anmeldemethode per Webformular)</small>',
-	'persona_connection_email'	=> 'Login E-Mail Adresse<br /><small>(f&uuml;r <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>',
+	'password_form'			=> 'Passwort<br /><small>(für die Anmeldemethode per Webformular)</small>',
+	'persona_connection_email'	=> 'Login E-Mail Adresse<br /><small>(für <a href="https://persona.org/" rel="external">Mozilla Persona</a>)</small>',
 	'allow_anonymous'		=> 'Anonymes lesen der Artikel des Standardnutzers (%s) wird erlaubt',
 	'allow_anonymous_refresh'	=> 'Aktualisieren der Artikel wird anonymen Nutzern erlaubt',
 	'auth_token'			=> 'Authentifizierungs-Token',
-	'explain_token'			=> 'Erlaube den Zugriff auf die RSS-Ausgabe des Standardnutzers ohne Authentifizierung.<br /><kbd>%s?output=rss&token=%s</kbd>',
+	'explain_token'			=> 'Erlaube den Zugriff auf die RSS-Ausgabe des Standardnutzers ohne Authentifizierung.<br /><kbd>%s?output=rss&amp;token=%s</kbd>',
 	'login_configuration'		=> 'Login',
 	'is_admin'			=> 'ist Administrator',
 	'auth_type'			=> 'Authentifizierungsmethode',
-	'auth_none'			=> 'Keine (gef&auml;hrlich)',
-	'auth_form'			=> 'Webformular (traditionell, JavaScript wird ben&ouml;tigt)',
-	'http_auth'			=> 'HTTP (mit HTTPS f&uuml;r erfahrene Nutzer)',
-	'auth_persona'			=> 'Mozilla Persona (modern, JavaScript wird ben&ouml;tigt)',
+	'auth_none'			=> 'Keine (gefährlich)',
+	'auth_form'			=> 'Webformular (traditionell, JavaScript wird benötigt)',
+	'http_auth'			=> 'HTTP (mit HTTPS für erfahrene Nutzer)',
+	'auth_persona'			=> 'Mozilla Persona (modern, JavaScript wird benötigt)',
 	'users_list'			=> 'Liste der Nutzer',
 	'create_user'			=> 'Neuen Nutzer erstellen',
 	'username'			=> 'Nutzername',
 	'password'			=> 'Passwort',
 	'create'			=> 'Erstellen',
 	'user_created'			=> 'Nutzer %s wurde erstellt',
-	'user_deleted'			=> 'Nutzer %s wurde gel&ouml;scht',
+	'user_deleted'			=> 'Nutzer %s wurde gelöscht',
 
 	'language'			=> 'Sprache',
 	'month'				=> 'Monate',
 	'archiving_configuration'	=> 'Archivieren',
 	'delete_articles_every'	=> 'Entfernen von Artikeln nach',
 	'purge_now'			=> 'Jetzt bereinigen',
-	'purge_completed'		=> 'Die Bereinigung ist abgeschlossen (%d Artikel wurden gel&ouml;scht)',
-	'archiving_configuration_help'	=> 'Es gibt weitere Optionen bei den Einstellungen der individuellen Nachrichtenstr&ouml;me',
+	'purge_completed'		=> 'Die Bereinigung ist abgeschlossen (%d Artikel wurden gelöscht)',
+	'archiving_configuration_help'	=> 'Es gibt weitere Optionen bei den Einstellungen der individuellen Nachrichtenströme',
 	'reading_configuration'		=> 'Lesen',
 	'articles_per_page'		=> 'Anzahl der Artikel pro Seite',
 	'default_view'			=> 'Standard-Ansicht',
 	'sort_order'			=> 'Sortierreihenfolge',
-	'auto_load_more'		=> 'Die n&auml;chsten Artikel am Seitenende laden',
+	'auto_load_more'		=> 'Die nächsten Artikel am Seitenende laden',
 	'display_articles_unfolded'	=> 'Die Artikel als Standard zusammen gefaltet anzeigen',
 	'after_onread'			=> 'Nach “als gelesen markieren”',
-	'jump_next'			=> 'springe zum n&auml;chsten ungelesenen Geschwisterelement (Feed oder Kategorie)',
+	'jump_next'			=> 'springe zum nächsten ungelesenen Geschwisterelement (Feed oder Kategorie)',
 	'reading_icons'			=> 'Lese Symbol',
 	'top_line'			=> 'Kopfzeile',
 	'bottom_line'			=> 'Fusszeile',
 	'html5_notif_timeout'		=> 'HTML5 notification timeout',
 	'seconds_(0_means_no_timeout)'	=> 'seconds (0 means no timeout)',
-	'img_with_lazyload'		=> 'Verwende die "tr&auml;ge laden" Methode zum laden von Bildern',
+	'img_with_lazyload'		=> 'Verwende die "träge laden" Methode zum laden von Bildern',
 	'auto_read_when'		=> 'Artikel als gelesen markieren…',
-	'article_selected'		=> 'wenn der Artikel ausgew&auml;hlt ist',
-	'article_open_on_website'	=> 'wenn der Artikel auf der Originalwebseite ge&ouml;ffnet ist',
-	'scroll'			=> 'w&auml;hrend des Seiten-Scrollens',
+	'article_selected'		=> 'wenn der Artikel ausgewählt ist',
+	'article_open_on_website'	=> 'wenn der Artikel auf der Originalwebseite geöffnet ist',
+	'scroll'			=> 'während des Seiten-Scrollens',
 	'upon_reception'		=> 'beim Empfang des Artikels',
 	'your_shaarli'			=> 'Ihr Shaarli',
 	'your_wallabag'			=> 'Ihr wallabag',
@@ -227,7 +227,7 @@ return array (
 	'share'				=> 'teile',
 	'by_email'			=> 'Per E-Mail',
 	'optimize_bdd'			=> 'Datenbank optimieren',
-	'optimize_todo_sometimes'	=> 'Sollte gelegentlich gemacht werden, um die Gr&ouml;ße der Datenbank zu reduzieren',
+	'optimize_todo_sometimes'	=> 'Sollte gelegentlich gemacht werden, um die Größe der Datenbank zu reduzieren',
 	'theme'				=> 'Thema',
 	'more_information'		=> 'Weitere Informationen',
 	'activate_sharing'		=> 'Teilen aktivieren',
@@ -243,7 +243,7 @@ return array (
 	'article'			=> 'Artikel',
 	'title'				=> 'Titel',
 	'author'			=> 'Autor',
-	'publication_date'		=> 'Datum der Ver&ouml;ffentlichung',
+	'publication_date'		=> 'Datum der Veröffentlichung',
 	'by'				=> 'von',
 
 	'load_more'			=> 'Weitere Artikel laden',
@@ -262,7 +262,7 @@ return array (
 	'related_tags'			=> 'Verwandte tags',
 	'no_feed_to_display'		=> 'Es gibt keinen Artikel zum anzeigen.',
 
-	'about_freshrss'		=> '&Uuml;ber FreshRSS',
+	'about_freshrss'		=> 'Über FreshRSS',
 	'project_website'		=> 'Projekt Webseite',
 	'lead_developer'		=> 'Hauptentwickler',
 	'website'			=> 'Webseite',
@@ -280,14 +280,14 @@ return array (
 	'clear_logs'			=> 'Protokolldateien leeren',
 
 	'forbidden_access'		=> 'Der Zugriff ist verboten!',
-	'login_required'		=> 'Das Login ist n&ouml;tig:',
+	'login_required'		=> 'Das Login ist nötig:',
 
-	'confirm_action'		=> 'Sind Sie sicher, dass Sie diese Aktion durchf&uuml;hren wollen? Die Aktion kann nicht abgebrochen werden!',
+	'confirm_action'		=> 'Sind Sie sicher, dass Sie diese Aktion durchführen wollen? Die Aktion kann nicht abgebrochen werden!',
 
 	// DATE
 	'january'			=> 'januar',
 	'february'			=> 'februar',
-	'march'				=> 'm&auml;rz',
+	'march'				=> 'märz',
 	'april'				=> 'april',
 	'may'				=> 'mai',
 	'june'				=> 'juni',
@@ -319,10 +319,10 @@ return array (
 	'status_unread'			=> 'Ungelesen',
 	'status_total'			=> 'Gesamt',
 	
-	'stats_entry_repartition'	=> 'Verteilung der Eintr&auml;ge',
-	'stats_entry_per_day'		=> 'Eintr&auml;ge pro Tag (w&auml;hrend der letzten 30 Tage)',
+	'stats_entry_repartition'	=> 'Verteilung der Einträge',
+	'stats_entry_per_day'		=> 'Einträge pro Tag (während der letzten 30 Tage)',
 	'stats_feed_per_category'	=> 'Feeds pro Kategorie',
-	'stats_entry_per_category'	=> 'Eintr&auml;ge pro Kategorie',
+	'stats_entry_per_category'	=> 'Einträge pro Kategorie',
 	'stats_top_feed'		=> 'Top 10 Feeds',
-	'stats_entry_count'		=> 'Z&auml;hler f&uuml;r Eintr&auml;ge',
+	'stats_entry_count'		=> 'Zähler für Einträge',
 );

+ 14 - 10
app/i18n/en.php

@@ -5,7 +5,7 @@ return array (
 	'login'				=> 'Login',
 	'keep_logged_in'		=> 'Keep me logged in <small>(1 month)</small>',
 	'login_with_persona'		=> 'Login with Persona',
-	'login_persona_problem'		=> 'Problem of connection with Persona?',
+	'login_persona_problem'		=> 'Connection problem with Persona?',
 	'logout'			=> 'Logout',
 	'search'			=> 'Search words or #tags',
 	'search_short'			=> 'Search',
@@ -43,9 +43,11 @@ return array (
 	'query_state_15'		=> 'Display all articles',
 	'query_number'			=> 'Query n°%d',
 	'add_query'			=> 'Add a query',
+	'query_created'			=> 'Query "%s" has been created.',
 	'no_query'			=> 'You haven’t created any user query yet.',
 	'query_filter'			=> 'Filter applied:',
 	'no_query_filter'		=> 'No filter',
+	'query_deprecated'		=> 'This query is no longer valid. The referenced category or feed has been deleted.',
 	'about'				=> 'About',
 	'stats'				=> 'Statistics',
 	'stats_idle'			=> 'Idle feeds',
@@ -113,7 +115,7 @@ return array (
 	'access_denied'			=> 'You don’t have permission to access this page',
 	'page_not_found'		=> 'You are looking for a page which doesn’t exist',
 	'error_occurred'		=> 'An error occurred',
-	'error_occurred_update'	=> 'Nothing was changed',
+	'error_occurred_update'		=> 'Nothing was changed',
 
 	'default_category'		=> 'Uncategorized',
 	'categories_updated'		=> 'Categories have been updated',
@@ -213,7 +215,7 @@ return array (
 	'website_url'			=> 'Website URL',
 	'feed_url'			=> 'Feed URL',
 	'articles'			=> 'articles',
-	'number_articles'		=> 'Number of articles',
+	'number_articles'		=> '%d articles',
 	'by_feed'			=> 'by feed',
 	'by_default'			=> 'By default',
 	'keep_history'			=> 'Minimum number of articles to keep',
@@ -235,7 +237,7 @@ return array (
 	'not_yet_implemented'		=> 'Not yet implemented',
 	'access_protected_feeds'	=> 'Connection allows to access HTTP protected RSS feeds',
 	'no_selected_feed'		=> 'No feed selected.',
-	'think_to_add'			=> '<a href="./?c=configure&amp;a=feed">You may add some feeds</a>.',
+	'think_to_add'			=> 'You may add some feeds.',
 
 	'current_user'			=> 'Current user',
 	'default_user'			=> 'Username of the default user <small>(maximum 16 alphanumeric characters)</small>',
@@ -247,7 +249,7 @@ return array (
 	'unsafe_autologin'		=> 'Allow unsafe automatic login using the format: ',
 	'api_enabled'			=> 'Allow <abbr>API</abbr> access <small>(required for mobile apps)</small>',
 	'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&amp;token=%s</kbd>',
 	'login_configuration'		=> 'Login',
 	'is_admin'			=> 'is administrator',
 	'auth_type'			=> 'Authentication method',
@@ -267,21 +269,21 @@ return array (
 	'language'			=> 'Language',
 	'month'				=> 'months',
 	'archiving_configuration'	=> 'Archiving',
-	'delete_articles_every'	=> 'Remove articles after',
+	'delete_articles_every'		=> 'Remove articles after',
 	'purge_now'			=> 'Purge now',
 	'purge_completed'		=> 'Purge completed (%d articles deleted)',
 	'archiving_configuration_help'	=> 'More options are available in the individual stream settings',
 	'reading_configuration'		=> 'Reading',
 	'display_configuration'		=> 'Display',
 	'articles_per_page'		=> 'Number of articles per page',
-	'number_divided_when_unfolded'	=> 'Divided by 2 during loading of unfolded articles.',
+	'number_divided_when_reader'	=> 'Divided by 2 in the reading view.',
 	'default_view'			=> 'Default view',
 	'articles_to_display'		=> 'Articles to display',
 	'sort_order'			=> 'Sort order',
 	'auto_load_more'		=> 'Load next articles at the page bottom',
 	'display_articles_unfolded'	=> 'Show articles unfolded by default',
 	'display_categories_unfolded'	=> 'Show categories folded by default',
-	'hide_read_feeds'		=> 'Hide categories &amp; feeds with no unread article (only in “unread articles” display mode)',
+	'hide_read_feeds'		=> 'Hide categories &amp; feeds with no unread article (does not work with “Show all articles” configuration)',
 	'after_onread'			=> 'After “mark all as read”,',
 	'jump_next'			=> 'jump to next unread sibling (feed or category)',
 	'article_icons'			=> 'Article icons',
@@ -366,6 +368,7 @@ return array (
 	'login_required'		=> 'Login required:',
 
 	'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_body_new_articles'	=> 'There are \d new articles to read on FreshRSS.',
 
@@ -429,6 +432,7 @@ return array (
 	'stats_entry_per_category'	=> 'Entries per category',
 	'stats_top_feed'		=> 'Top ten feeds',
 	'stats_entry_count'		=> 'Entry count',
+	'stats_no_idle'			=> 'There is no idle feed!',
 
 	'update'			=> 'Update',
 	'update_system'			=> 'Update system',
@@ -442,8 +446,8 @@ return array (
 	'update_finished'		=> 'Update completed!',
 
 	'auth_reset'			=> 'Authentication reset',
-	'auth_will_reset'		=> 'Authentication system will be reseted: form will be used instead of Persona.',
-	'auth_not_persona'		=> 'Only Persona system can be reseted.',
+	'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.',

+ 18 - 14
app/i18n/fr.php

@@ -43,9 +43,11 @@ return array (
 	'query_state_15'		=> 'Afficher tous les articles',
 	'query_number'			=> 'Filtre n°%d',
 	'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.',
 	'query_filter'			=> 'Filtres appliqués :',
 	'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',
 	'stats'				=> 'Statistiques',
 	'stats_idle'			=> 'Flux inactifs',
@@ -55,11 +57,11 @@ return array (
 	'stats_entry_per_day_of_week'	=> 'Par jour de la semaine',
 	'stats_entry_per_month'		=> 'Par mois',
 
-	'last_week'			=> 'La dernière semaine',
-	'last_month'			=> 'Le dernier mois',
-	'last_3_month'			=> 'Les derniers trois mois',
-	'last_6_month'			=> 'Les derniers six mois',
-	'last_year'			=> 'La dernière année',
+	'last_week'			=> 'Depuis la semaine dernière',
+	'last_month'			=> 'Depuis le mois dernier',
+	'last_3_month'			=> 'Depuis les trois derniers mois',
+	'last_6_month'			=> 'Depuis les six derniers mois',
+	'last_year'			=> 'Depuis l’année dernière',
 
 	'your_rss_feeds'		=> 'Vos flux RSS',
 	'add_rss_feed'			=> 'Ajouter un flux RSS',
@@ -213,7 +215,7 @@ return array (
 	'website_url'			=> 'URL du site',
 	'feed_url'			=> 'URL du flux',
 	'articles'			=> 'articles',
-	'number_articles'		=> 'Nombre d’articles',
+	'number_articles'		=> '%d articles',
 	'by_feed'			=> 'par flux',
 	'by_default'			=> 'Par défaut',
 	'keep_history'			=> 'Nombre minimum d’articles à conserver',
@@ -235,7 +237,7 @@ return array (
 	'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.',
 	'no_selected_feed'		=> 'Aucun flux sélectionné.',
-	'think_to_add'			=> '<a href="./?c=configure&amp;a=feed">Vous pouvez ajouter des flux</a>.',
+	'think_to_add'			=> 'Vous pouvez ajouter des flux.',
 
 	'current_user'			=> 'Utilisateur actuel',
 	'password_form'			=> 'Mot de passe<br /><small>(pour connexion par formulaire)</small>',
@@ -247,7 +249,7 @@ return array (
 	'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>',
 	'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&amp;token=%s</kbd>',
 	'login_configuration'		=> 'Identification',
 	'is_admin'			=> 'est administrateur',
 	'auth_type'			=> 'Méthode d’authentification',
@@ -274,20 +276,20 @@ return array (
 	'reading_configuration'		=> 'Lecture',
 	'display_configuration'		=> 'Affichage',
 	'articles_per_page'		=> 'Nombre d’articles par page',
-	'number_divided_when_unfolded'	=> 'Divisé par 2 lors du chargement d’articles dépliés.',
+	'number_divided_when_reader'	=> 'Divisé par 2 dans la vue de lecture.',
 	'default_view'			=> 'Vue par défaut',
 	'articles_to_display'		=> 'Articles à afficher',
 	'sort_order'			=> 'Ordre de tri',
 	'auto_load_more'		=> 'Charger les articles suivants en bas de page',
 	'display_articles_unfolded'	=> 'Afficher les articles dépliés par défaut',
 	'display_categories_unfolded'	=> 'Afficher les catégories pliées par défaut',
-	'hide_read_feeds'		=> 'Cacher les catégories &amp; flux sans article non-lu (uniquement en affichage “articles non lus”)',
+	'hide_read_feeds'		=> 'Cacher les catégories &amp; flux sans article non-lu (ne fonctionne pas avec la configuration “Afficher tous les articles”)',
 	'after_onread'			=> 'Après “marquer tout comme lu”,',
 	'jump_next'			=> 'sauter au prochain voisin non lu (flux ou catégorie)',
 	'article_icons'			=> 'Icônes d’article',
 	'top_line'			=> 'Ligne du haut',
 	'bottom_line'			=> 'Ligne du bas',
-	'html5_notif_timeout'		=> 'Temps d\'affichage de la notification HTML5',
+	'html5_notif_timeout'		=> 'Temps daffichage 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',
 	'sticky_post'			=> 'Aligner l’article en haut quand il est ouvert',
@@ -366,6 +368,7 @@ return array (
 	'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_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_body_new_articles'	=> 'Il y a \d nouveaux articles à lire sur FreshRSS.',
 
@@ -429,6 +432,7 @@ return array (
 	'stats_entry_per_category'	=> 'Articles par catégorie',
 	'stats_top_feed'		=> 'Les dix plus gros flux',
 	'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',
@@ -441,9 +445,9 @@ return array (
 	'update_problem'		=> 'La mise à jour a rencontré un problème : %s',
 	'update_finished'		=> 'La mise à jour est terminée !',
 
-	'auth_reset'			=> 'Reset de l’authentification',
-	'auth_will_reset'		=> 'Le système d’authentification va être remis à zéro : le formulaire sera utilisé à la place de Persona.',
-	'auth_not_persona'		=> 'Seul le système d’authentification Persona peut être remis à zéro.',
+	'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.',

+ 9 - 1
app/layout/aside_flux.phtml

@@ -3,6 +3,8 @@
 
 	<ul class="categories">
 		<?php if ($this->loginOk) { ?>
+		<form id="mark-read-aside" method="post" style="display: none"></form>
+
 		<li>
 			<div class="stick configure-feeds">
 				<a class="btn btn-important" href="<?php echo _url ('configure', 'feed'); ?>"><?php echo Minz_Translate::t ('subscription_management'); ?></a>
@@ -87,7 +89,13 @@
 		<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 ('feed', 'actualize', 'id', '!!!!!!'); ?>"><?php echo Minz_Translate::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 } ?>
 	</ul>
 </script>

+ 10 - 7
app/layout/nav_menu.phtml

@@ -49,7 +49,7 @@
 		</a>
 
 		<?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;
 				$checked = 'true';
 				$class = 'active';
@@ -93,7 +93,10 @@
 			<ul class="dropdown-menu">
 				<li class="dropdown-close"><a href="#close">❌</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>
+				<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) { ?>
 				<li class="item query">
@@ -184,12 +187,12 @@
 		Minz_Session::_param('markReadUrl', $markReadUrl);
 	?>
 
-	<form id="mark-read" method="post" style="display: none"></form>
+	<form id="mark-read-menu" method="post" style="display: none"></form>
 
 	<div class="stick" id="nav_menu_read_all">
 		<?php $confirm = $this->conf->reading_confirm ? 'confirm' : ''; ?>
 		<button class="read_all btn <?php echo $confirm; ?>"
-		        form="mark-read"
+		        form="mark-read-menu"
 		        formaction="<?php echo $markReadUrl; ?>"
 		        type="submit"><?php echo _t('mark_read'); ?></button>
 
@@ -202,7 +205,7 @@
 
 				<li class="item">
 					<button class="as-link <?php echo $confirm; ?>"
-					        form="mark-read"
+					        form="mark-read-menu"
 					        formaction="<?php echo $markReadUrl; ?>"
 					        type="submit"><?php echo $string_mark; ?></button>
 				</li>
@@ -215,13 +218,13 @@
 ?>
 				<li class="item">
 					<button class="as-link <?php echo $confirm; ?>"
-					        form="mark-read"
+					        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"
+					        form="mark-read-menu"
 					        formaction="<?php echo Minz_Url::display($mark_before_one_week); ?>"
 					        type="submit"><?php echo _t('before_one_week'); ?></button>
 				</li>

+ 4 - 1
app/views/configure/categorize.phtml

@@ -21,7 +21,10 @@
 					<a class="btn" href="<?php echo _url('index', 'index', 'get', 'c_' . $cat->id ()); ?>">
 						<?php echo _i('link'); ?>
 					</a>
-					<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>
+					<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 } ?>
 				</div>
 				(<?php echo Minz_Translate::t ('number_feeds', $cat->nbFeed ()); ?>)

+ 18 - 12
app/views/configure/feed.phtml

@@ -70,27 +70,33 @@
 				</label>
 			</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="group-controls">
-				<button class="btn btn-important"><?php echo Minz_Translate::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-important"><?php echo _t('save'); ?></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>
 
 		<legend><?php echo Minz_Translate::t ('archiving_configuration'); ?></legend>
 
 		<div class="form-group">
-			<label class="group-name"></label>
 			<div class="group-controls">
-				<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'); ?>
-				</a>
-			</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 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 ()); ?>">
+						<?php echo _i('refresh'); ?> <?php echo _t('actualize'); ?>
+					</a>
+				</div>
 			</div>
 		</div>
 		<div class="form-group">

+ 11 - 4
app/views/configure/queries.phtml

@@ -42,30 +42,37 @@
 						   + (isset($query['get']) ? 1 : 0);
 					// If the only filter is "all" articles, we consider there is no filter
 					$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) { ?>
 				<div class="alert alert-warn">
 					<div class="alert-head"><?php echo _t('no_query_filter'); ?></div>
 				</div>
+				<?php } elseif ($deprecated) { ?>
+				<div class="alert alert-error">
+					<div class="alert-head"><?php echo _t('query_deprecated'); ?></div>
+				</div>
 				<?php } else { ?>
 				<div class="alert alert-success">
 					<div class="alert-head"><?php echo _t('query_filter'); ?></div>
 
 					<ul>
-						<?php if (isset($query['search'])) { $exist = true; ?>
+						<?php if (isset($query['search'])) { ?>
 						<li class="item"><?php echo _t('query_search', $query['search']); ?></li>
 						<?php } ?>
 
-						<?php if (isset($query['state'])) { $exist = true; ?>
+						<?php if (isset($query['state'])) { ?>
 						<li class="item"><?php echo _t('query_state_' . $query['state']); ?></li>
 						<?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>
 						<?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>
 						<?php } ?>
 					</ul>

+ 2 - 4
app/views/configure/reading.phtml

@@ -10,9 +10,7 @@
 			<label class="group-name" for="posts_per_page"><?php echo Minz_Translate::t ('articles_per_page'); ?></label>
 			<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" />
-				<?php if ($this->conf->display_posts) { ?>
-				<?php echo _i('help'); ?> <?php echo _t('number_divided_when_unfolded'); ?>
-				<?php } ?>
+				<?php echo _i('help'); ?> <?php echo _t('number_divided_when_reader'); ?>
 			</div>
 		</div>
 
@@ -43,7 +41,7 @@
 				<select name="default_view" id="default_view">
 					<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_NOT_READ_STRICT; ?>"<?php echo $this->conf->default_view === FreshRSS_Entry::STATE_NOT_READ_STRICT ? ' selected="selected"' : ''; ?>><?php echo _t('show_not_reads'); ?></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>

+ 1 - 1
app/views/helpers/javascript_vars.phtml

@@ -51,7 +51,7 @@ echo 'authType="', $authType, '",',
 	'url_login="', _url ('index', 'login'), '",',
 	'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_body_articles="', Minz_Translate::t('notif_body_new_articles'), '"', ",\n";
 echo 'html5_notif_timeout=', $this->conf->html5_notif_timeout,",\n";

+ 3 - 1
app/views/helpers/pagination.phtml

@@ -6,6 +6,8 @@
 	Minz_Session::_param('markReadUrl', false);
 ?>
 
+<form id="mark-read-pagination" method="post" style="display: none"></form>
+
 <ul class="pagination">
 	<li class="item pager-next">
 	<?php if (!empty($this->nextId)) { ?>
@@ -19,7 +21,7 @@
 	<?php } elseif ($markReadUrl) { ?>
 		<button id="bigMarkAsRead"
 		        class="as-link <?php echo $this->conf->reading_confirm ? 'confirm' : ''; ?>"
-		        form="mark-read"
+		        form="mark-read-pagination"
 		        formaction="<?php echo $markReadUrl; ?>"
 		        type="submit">
 			<?php echo _t('nothing_to_load'); ?><br />

+ 8 - 0
app/views/helpers/view/global_view.phtml

@@ -1,5 +1,6 @@
 <?php $this->partial ('nav_menu'); ?>
 
+<?php if (!empty($this->entries)) { ?>
 <div id="stream" class="global categories">
 <?php
 	$arUrl = array('c' => 'index', 'a' => 'index', 'params' => array());
@@ -43,3 +44,10 @@
 <div id="panel"<?php echo $this->conf->display_posts ? '' : ' class="hide_posts"'; ?>>
 	<a class="close" href="#"><?php echo FreshRSS_Themes::icon('close'); ?></a>
 </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 } ?>

+ 3 - 3
app/views/helpers/view/normal_view.phtml

@@ -183,8 +183,8 @@ if (!empty($this->entries)) {
 <?php $this->partial ('nav_entries'); ?>
 
 <?php } else { ?>
-<div id="stream" class="alert alert-warn normal">
-	<span class="alert-head"><?php echo Minz_Translate::t ('no_feed_to_display'); ?></span>
-	<?php echo Minz_Translate::t ('think_to_add'); ?>
+<div id="stream" class="prompt alert alert-warn normal">
+	<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 } ?>

+ 3 - 3
app/views/helpers/view/reader_view.phtml

@@ -37,8 +37,8 @@ if (!empty($this->entries)) {
 </div>
 
 <?php } else { ?>
-<div id="stream" class="alert alert-warn reader">
-	<span class="alert-head"><?php echo Minz_Translate::t ('no_feed_to_display'); ?></span>
-	<?php echo Minz_Translate::t ('think_to_add'); ?>
+<div id="stream" class="prompt alert alert-warn reader">
+	<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 } ?>

+ 16 - 2
app/views/stats/idle.phtml

@@ -6,8 +6,14 @@
 	<h1><?php echo _t('stats_idle'); ?></h1>
 
 	<?php
+		$current_url = urlencode(Minz_Url::display(
+			array('c' => 'stats', 'a' => 'idle'),
+			'php', true
+		));
+		$nothing = true;
 		foreach ($this->idleFeeds as $period => $feeds) {
 			if (!empty($feeds)) {
+				$nothing = false;
 	?>
 		<div class="stat">
 			<h2><?php echo _t($period); ?></h2>
@@ -20,15 +26,23 @@
 					<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']); ?>"><?php echo _t('delete'); ?></button>
+						<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']; ?></span></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>
 			<?php } ?>
 		</div>
 	<?php
 			}
 		}
+
+		if ($nothing) {
 	?>
+	<p class="alert alert-warn">
+		<span class="alert-head"><?php echo _t('stats_no_idle'); ?></span>
+	</p>
+	<?php } ?>
 </div>

+ 1 - 1
app/views/stats/index.phtml

@@ -53,7 +53,7 @@
 			<tbody>
 				<?php foreach ($this->topFeed as $feed): ?>
 					<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 class="numeric"><?php echo formatNumber($feed['count']); ?></td>
 					</tr>

+ 2 - 2
app/views/stats/repartition.phtml

@@ -24,8 +24,8 @@
 	</select>
 
 	<?php if ($this->feed) {?>
-		<a href="<?php echo _url('configure', 'feed', 'id', $this->feed->id()); ?>">
-			<?php echo _t('administration'); ?>
+		<a class="btn" href="<?php echo _url('configure', 'feed', 'id', $this->feed->id()); ?>">
+			<?php echo _i('configure'); ?> <?php echo _t('administration'); ?>
 		</a>
 	<?php }?>
 

+ 5 - 0
lib/Minz/Request.php

@@ -124,6 +124,11 @@ class Minz_Request {
 	 *                > sinon, le dispatcher recharge en interne
 	 */
 	public static function forward($url = array(), $redirect = false) {
+		if (!is_array($url)) {
+			header('Location: ' . $url);
+			exit();
+		}
+
 		$url = Minz_Url::checkUrl($url);
 
 		if ($redirect) {

+ 6 - 1
p/scripts/main.js

@@ -1109,6 +1109,11 @@ function init_persona() {
 
 function init_confirm_action() {
 	$('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);
 	});
 }
@@ -1250,7 +1255,6 @@ function init_all() {
 			break;
 	}
 	init_confirm_action();
-	init_crypto_form();
 	$stream = $('#stream');
 	if ($stream.length > 0) {
 		init_actualize();
@@ -1265,6 +1269,7 @@ function init_all() {
 		init_notifs_html5();
 		window.setInterval(refreshUnreads, 120000);
 	} else {
+		init_crypto_form();
 		init_share_observers();
 		init_remove_observers();
 		init_feed_observers();

+ 1 - 1
p/themes/Dark/dark.css

@@ -340,7 +340,7 @@ a.btn {
 }
 .dropdown-menu > .item > span,
 .dropdown-menu > .item > .as-link {
-	padding: 0 25px;
+	padding: 0 22px;
 	line-height: 2em;
 }
 .dropdown-menu > .item:hover {

+ 1 - 1
p/themes/Flat/flat.css

@@ -340,7 +340,7 @@ a.btn {
 }
 .dropdown-menu > .item > span,
 .dropdown-menu > .item > .as-link {
-	padding: 0 25px;
+	padding: 0 22px;
 	line-height: 2em;
 }
 .dropdown-menu > .item:hover {

+ 1 - 1
p/themes/Origine/origine.css

@@ -366,7 +366,7 @@ a.btn {
 }
 .dropdown-menu > .item > span,
 .dropdown-menu > .item > .as-link {
-	padding: 0 25px;
+	padding: 0 22px;
 	line-height: 2em;
 }
 .dropdown-menu > .item:hover {

+ 0 - 5
p/themes/Screwdriver/icons/add.svg

@@ -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>

+ 0 - 7
p/themes/Screwdriver/icons/all.svg

@@ -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>

BIN
p/themes/Screwdriver/icons/apple-touch-icon.png


+ 0 - 6
p/themes/Screwdriver/icons/bookmark-add.svg

@@ -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>

+ 5 - 60
p/themes/Screwdriver/icons/bookmark.svg

@@ -1,60 +1,5 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   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>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
+<g transform="translate(-41.000202,-397)">
+<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"/>
+</g>
+</svg>

+ 0 - 7
p/themes/Screwdriver/icons/category-white.svg

@@ -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>

+ 0 - 7
p/themes/Screwdriver/icons/category.svg

@@ -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>

+ 0 - 7
p/themes/Screwdriver/icons/close.svg

@@ -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>

+ 0 - 5
p/themes/Screwdriver/icons/configure.svg

@@ -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>

+ 0 - 5
p/themes/Screwdriver/icons/down.svg

@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<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"/>
-</g>
-</svg>

BIN
p/themes/Screwdriver/icons/favicon-16-32-48-64.ico


BIN
p/themes/Screwdriver/icons/favicon-256.png


+ 0 - 13
p/themes/Screwdriver/icons/favicon.svg

@@ -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>

BIN
p/themes/Screwdriver/icons/grey.gif


+ 0 - 7
p/themes/Screwdriver/icons/help.svg

@@ -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>

+ 0 - 12
p/themes/Screwdriver/icons/icon.svg

@@ -1,12 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
-	<title>Logo FreshRSS</title>
-	<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>

+ 0 - 7
p/themes/Screwdriver/icons/key.svg

@@ -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>

Разница между файлами не показана из-за своего большого размера
+ 0 - 4
p/themes/Screwdriver/icons/link.svg


+ 0 - 6
p/themes/Screwdriver/icons/login.svg

@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g transform="translate(-181.0002,-237)" fill="#bebebe">
-<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="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>
-</svg>

+ 0 - 6
p/themes/Screwdriver/icons/logout.svg

@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g transform="translate(-201.0002,-237)" fill="#bebebe">
-<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="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>
-</svg>

+ 0 - 5
p/themes/Screwdriver/icons/next.svg

@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<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"/>
-</g>
-</svg>

Разница между файлами не показана из-за своего большого размера
+ 0 - 2
p/themes/Screwdriver/icons/non-starred.svg


+ 0 - 5
p/themes/Screwdriver/icons/prev.svg

@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g transform="translate(-301.0002,-747)">
-<path style="block-progression:tb;color:#bebebe;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="#bebebe"/>
-</g>
-</svg>

+ 3 - 57
p/themes/Screwdriver/icons/read.svg

@@ -1,57 +1,3 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   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.001"
-   width="16"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="read.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.749079"
-     inkscape:cx="-2.2040272"
-     inkscape:cy="8.0004997"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <g
-     transform="translate(-60.99995,-296.9989)"
-     id="g4" />
-  <path
-     style="fill:#cccccc;fill-opacity:1"
-     inkscape:connector-curvature="0"
-     d="m 8.0004996,3.2833392 c -3.433907,0 -6.410294,1.9996259 -7.87290101,4.9205634 1.46260701,2.9209364 4.43899401,4.9205624 7.87290101,4.9205624 3.4338474,0 6.4102344,-1.999626 7.8729014,-4.9205624 C 14.410824,5.2829651 11.434347,3.2833392 8.0004996,3.2833392 z m 3.8818634,2.6094965 c 0.925096,0.590068 1.709004,1.3804357 2.29781,2.3110669 -0.588806,0.9306312 -1.372744,1.7209988 -2.29784,2.3110964 -1.162392,0.741404 -2.5047194,1.133295 -3.8818334,1.133295 -1.377143,0 -2.719472,-0.391891 -3.881863,-1.133326 -0.925066,-0.5900366 -1.708974,-1.3804016 -2.29781,-2.3110654 0.588806,-0.9306638 1.372744,-1.7210288 2.29781,-2.3110669 0.06025,-0.038442 0.121108,-0.075682 0.182338,-0.1122479 -0.153123,0.4202145 -0.236925,0.873738 -0.236925,1.3469419 0,2.1740274 1.762423,3.9364493 3.93645,3.9364493 2.1740274,0 3.9364514,-1.7624219 3.9364514,-3.9364493 0,-0.4732039 -0.0838,-0.9267274 -0.236925,-1.3469745 0.0612,0.036566 0.122061,0.073839 0.182337,0.1122805 z M 8.0004996,6.6354719 c 0,0.8152761 -0.660894,1.4761705 -1.476168,1.4761705 -0.815275,0 -1.476169,-0.6608944 -1.476169,-1.4761705 0,-0.8152759 0.660894,-1.4761676 1.476169,-1.4761676 0.815274,0 1.476168,0.6608917 1.476168,1.4761676 z"
-     id="path3167" />
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" height="16.001" width="16">
+<path fill="#CCC" d="m8.0005,3.2833c-3.4339,0-6.4103,1.9996-7.8729,4.9206,1.4626,2.9209,4.439,4.9206,7.8729,4.9206,3.4338,0,6.4102-1.9996,7.8729-4.9206-1.462-2.9204-4.439-4.9201-7.8725-4.9201zm3.8819,2.6095c0.9251,0.59007,1.709,1.3804,2.2978,2.3111-0.58881,0.93063-1.3727,1.721-2.2978,2.3111-1.1624,0.7414-2.5047,1.1333-3.8818,1.1333s-2.7195-0.39189-3.8819-1.1333c-0.92507-0.59004-1.709-1.3804-2.2978-2.3111,0.58881-0.93066,1.3727-1.721,2.2978-2.3111,0.06025-0.038442,0.12111-0.075682,0.18234-0.11225-0.15312,0.42021-0.23692,0.87374-0.23692,1.3469,0,2.174,1.7624,3.9364,3.9364,3.9364s3.9365-1.7624,3.9365-3.9364c0-0.4732-0.0838-0.92673-0.23692-1.347,0.0612,0.036566,0.12206,0.073839,0.18234,0.11228zm-3.8815,0.7427c0,0.81528-0.66089,1.4762-1.4762,1.4762-0.81528,0-1.4762-0.66089-1.4762-1.4762,0-0.81528,0.66089-1.4762,1.4762-1.4762,0.81527,0,1.4762,0.66089,1.4762,1.4762z"/>
+</svg>

+ 0 - 5
p/themes/Screwdriver/icons/refresh.svg

@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g transform="translate(-241.0002,-627)">
-<path style="baseline-shift:baseline;block-progression:tb;color:#666666;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" fill="#666" d="m253.91,628.97a1.0001,1.0001,0,0,0,-0.125,0.0312,1.0001,1.0001,0,0,0,-0.78125,1v1.6875c-0.38225-0.57796-0.84927-1.0822-1.4062-1.5-1.1556-0.86677-2.532-1.2523-3.875-1.1875-0.19186,0.009-0.37223,0.0353-0.5625,0.0625-1.5222,0.21741-2.9782,1.023-3.9688,2.3438-1.9812,2.6414-1.4227,6.425,1.2188,8.4062s6.425,1.4227,8.4062-1.2188a1.0063,1.0063,0,0,0,0.18,-0.59,1.0063,1.0063,0,0,0,0,-0.15625v-0.84375h-0.8125-0.0937a1.0063,1.0063,0,0,0,-0.0937,0,1.0063,1.0063,0,0,0,-0.8125,0.40625c-1.3326,1.7767-3.817,2.1139-5.5938,0.78125-1.7767-1.3326-2.1139-3.817-0.78125-5.5938,1.3326-1.7767,3.817-2.1139,5.5938-0.78125,0.42946,0.32212,0.76954,0.73295,1.0312,1.1875h-1.4375a1.0001,1.0001,0,0,0,-1,1,1.0001,1.0001,0,0,0,0,0.21875v0.78125h0.84375,0.15625,4,1v-1-4a1.0001,1.0001,0,0,0,0,-0.1875v-0.8125h-0.8125a1.0001,1.0001,0,0,0,-0.28125,-0.0312z"/>
-</g>
-</svg>

+ 0 - 6
p/themes/Screwdriver/icons/rss.svg

@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g fill-rule="nonzero" transform="translate(-561,-301.00012)" fill="#666">
-<path style="enable-background:new;color:#000000;" d="m325.06,97.188c0,1.7872-0.89543,3.2361-2,3.2361s-2-1.4488-2-3.2361c0-1.7872,0.89543-3.2361,2-3.2361s2,1.4488,2,3.2361z" transform="matrix(1.0000007,0,0,0.61803426,241.93747,252.93479)"/>
-<path style="enable-background:new;color:#000000;" d="m563,303,0,1c0,0.55016,0.45347,1,1,1,4.9706,0,9,4.0294,9,9,0,0.55016,0.45347,1,1,1h1v-1c0-6.0751-4.9249-11-11-11h-1zm0,4,0,1c0,0.55016,0.45347,1,1,1,2.7614,0,5,2.2386,5,5,0,0.55016,0.45347,1,1,1h1v-1c0-3.866-3.134-7-7-7h-1z"/>
-</g>
-</svg>

+ 0 - 6
p/themes/Screwdriver/icons/search.svg

@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g fill="#666" transform="translate(-441.0004,-195)">
-<path style="baseline-shift:baseline;block-progression:tb;color:#666666;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m447.51,196c-3.0289,0-5.5107,2.479-5.5107,5.5045,0,3.0254,2.4819,5.5045,5.5107,5.5045s5.5107-2.479,5.5107-5.5045c0-3.0254-2.4819-5.5045-5.5107-5.5045zm0,2.0089c1.9474,0,3.4995,1.5504,3.4995,3.4955s-1.5522,3.4955-3.4995,3.4955c-1.9474,0-3.4995-1.5504-3.4995-3.4955,0-1.9452,1.5522-3.4955,3.4995-3.4955z"/>
-<path style="baseline-shift:baseline;block-progression:tb;color:#666666;direction:ltr;text-indent:0;text-align:start;enable-background:new;text-transform:none;" d="m450.81,204a1.0001,1.0001,0,0,0,-0.5,1.7188l4,4a1.0055,1.0055,0,1,0,1.4062,-1.4375l-4-4a1.0001,1.0001,0,0,0,-0.91,-0.28z"/>
-</g>
-</svg>

+ 0 - 8
p/themes/Screwdriver/icons/share.svg

@@ -1,8 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g fill="#bebebe" 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,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="baseline-shift:baseline;block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m593.62,198.16-10.062,4.875-1.8125,0.90625,1.8125,0.90625,10.031,5.0625,0.90625-1.8125-8.2188-4.1562,8.2188-4-0.875-1.7812z"/>
-</g>
-</svg>

+ 5 - 60
p/themes/Screwdriver/icons/starred.svg

@@ -1,60 +1,5 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   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="starred.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="685"
-     inkscape:window-height="480"
-     id="namedview8"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="svg2" />
-  <g
-     transform="translate(-41.000202,-397)"
-     id="g4">
-    <path
-       style="enable-background:accumulate;color:#000000;fill:#eaa904;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>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
+<g transform="translate(-41.000202,-397)">
+<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="#eaa904"/>
+</g>
+</svg>

+ 0 - 5
p/themes/Screwdriver/icons/tag.svg

@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<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"/>
-</g>
-</svg>

+ 3 - 65
p/themes/Screwdriver/icons/unread.svg

@@ -1,65 +1,3 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   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="unread.svg">
-  <metadata
-     id="metadata14">
-    <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="defs12" />
-  <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="namedview10"
-     showgrid="false"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:zoom="20.85965"
-     inkscape:cx="3.2842788"
-     inkscape:cy="5.738225"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2">
-    <sodipodi:guide
-       orientation="0,1"
-       position="18.02523,13.039528"
-       id="guide4011" />
-    <sodipodi:guide
-       orientation="0,1"
-       position="10.738435,2.1093355"
-       id="guide4013" />
-  </sodipodi:namedview>
-  <path
-     style="fill:#666666;fill-opacity:1"
-     inkscape:connector-curvature="0"
-     d="m 7.9824408,3.5290339 c -3.4339072,0 -6.4102945,1.9996258 -7.87290106,4.9205633 C 1.5721463,11.370534 4.5485336,13.37016 7.9824408,13.37016 c 3.4338472,0 6.4102342,-1.999626 7.8729012,-4.9205628 C 14.392765,5.5286597 11.416288,3.5290339 7.9824408,3.5290339 z m 3.8818632,2.6094964 c 0.925096,0.590068 1.709004,1.3804357 2.29781,2.3110669 -0.588806,0.9306312 -1.372744,1.7209988 -2.29784,2.3110968 -1.162392,0.741404 -2.5047196,1.133295 -3.8818332,1.133295 -1.377143,0 -2.7194718,-0.391891 -3.8818628,-1.133326 C 3.1755118,10.170626 2.3916036,9.380261 1.8027674,8.4495972 2.3915738,7.5189334 3.1755118,6.7285684 4.100578,6.1385303 4.160827,6.1000883 4.221686,6.0628483 4.2829153,6.0262824 c -0.1531228,0.4202145 -0.236925,0.873738 -0.236925,1.3469419 0,2.1740274 1.7624231,3.9364497 3.9364505,3.9364497 2.1740272,0 3.9364512,-1.7624223 3.9364512,-3.9364497 0,-0.4732039 -0.0838,-0.9267274 -0.236925,-1.3469745 0.0612,0.036566 0.122061,0.073839 0.182337,0.1122805 z M 7.9824408,6.8811665 c 0,0.8152761 -0.660894,1.4761705 -1.476168,1.4761705 -0.8152757,0 -1.4761697,-0.6608944 -1.4761697,-1.4761705 0,-0.8152759 0.660894,-1.4761676 1.4761697,-1.4761676 0.815274,0 1.476168,0.6608917 1.476168,1.4761676 z"
-     id="path3167" />
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
+<path fill="#666" d="m7.9824,3.529c-3.4339,0-6.4103,1.9996-7.8729,4.9206,1.4626,2.9214,4.439,4.9204,7.8729,4.9204,3.4338,0,6.4102-1.9996,7.8729-4.9206-1.462-2.9207-4.439-4.9204-7.8726-4.9204zm3.8819,2.6095c0.9251,0.59007,1.709,1.3804,2.2978,2.3111-0.58881,0.93063-1.3727,1.721-2.2978,2.3111-1.1624,0.7414-2.5047,1.1333-3.8818,1.1333s-2.7195-0.39189-3.8819-1.1333c-0.9248-0.59-1.7087-1.3807-2.2975-2.3114,0.5888-0.9307,1.3727-1.721,2.2978-2.3111,0.0602-0.0384,0.1211-0.0757,0.1823-0.1122-0.15312,0.42021-0.23692,0.87374-0.23692,1.3469,0,2.174,1.7624,3.9364,3.9365,3.9364,2.174,0,3.9365-1.7624,3.9365-3.9364,0-0.4732-0.0838-0.92673-0.23692-1.347,0.0612,0.036566,0.12206,0.073839,0.18234,0.11228zm-3.8816,0.7427c0,0.81528-0.66089,1.4762-1.4762,1.4762-0.81528,0-1.4762-0.66089-1.4762-1.4762,0-0.81528,0.66089-1.4762,1.4762-1.4762,0.81527,0,1.4762,0.66089,1.4762,1.4762z"/>
+</svg>

+ 0 - 5
p/themes/Screwdriver/icons/up.svg

@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
-<g transform="translate(-201.0002,-747)">
-<path style="block-progression:tb;color:#bebebe;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="#bebebe"/>
-</g>
-</svg>

+ 0 - 1
p/themes/Screwdriver/icons/view-global.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g transform="translate(-61-867)" fill="#666" color="#000"><rect height="2" rx=".385" ry=".379" width="2" x="64" y="870"/><rect height="2" rx=".385" ry=".379" width="2" x="68" y="870"/><rect height="2" rx=".385" ry=".379" width="2" x="72" y="870"/><rect height="2" rx=".385" ry=".379" width="2" x="64" y="874.02"/><rect height="2" rx=".385" ry=".379" width="2" x="68" y="874.02"/><rect height="2" rx=".385" ry=".379" width="2" x="72" y="874.02"/><rect height="2" rx=".385" ry=".379" width="2" x="64" y="878"/><rect height="2" rx=".385" ry=".379" width="2" x="68" y="878"/><rect height="2" rx=".385" ry=".379" width="2" x="72" y="878"/></g></svg>

+ 0 - 1
p/themes/Screwdriver/icons/view-normal.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g transform="translate(-40-746)" fill="#666" color="#666"><path d="m43 749h10v2h-10z"/><path d="m43 753h10v2h-10z"/><path d="m43 757h10v2h-10z"/></g></svg>

+ 0 - 1
p/themes/Screwdriver/icons/view-reader.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g transform="translate(-181-867)" fill="#666" color="#666"><path d="m 181,868 0,1 0,11 0,1 1,0 5,0 c 0.1754,0 0.52538,0.15166 0.8125,0.34375 0.28712,0.19209 0.46875,0.375 0.46875,0.375 L 189,882.4375 l 0.71875,-0.75 c 0,0 0.8963,-0.6875 1.28125,-0.6875 l 5,0 1,0 0,-1 0,-11 0,-1 -1,0 -5,0 c -0.87652,0 -1.56017,0.34756 -2.03125,0.6875 -0.0301,-0.0207 -0.031,-0.0105 -0.0625,-0.0312 C 188.44557,868.35254 187.82811,868 187,868 l -5,0 -1,0 z m 2,2 4,0 c 0.13821,0 0.51476,0.14746 0.8125,0.34375 0.29774,0.19629 0.5,0.375 0.5,0.375 l 0.71875,0.6875 0.6875,-0.71875 c 0,0 0.89975,-0.6875 1.28125,-0.6875 l 4,0 0,9 -4,0 c -0.87693,0 -1.56008,0.34735 -2.03125,0.6875 -0.0196,-0.0135 -0.011,-0.0177 -0.0312,-0.0312 C 188.47725,879.34834 187.83512,879 187,879 l -4,0 0,-9 z"/><g transform="scale(-1 1)"><rect height="2" rx=".375" width="3" x="-187" y="872"/><rect height="2" rx=".375" width="3" x="-187" y="875"/><rect height="2" rx=".375" width="3" x="-194" y="872"/><rect height="2" rx=".375" width="3" x="-194" y="875"/></g></g></svg>

+ 1 - 1
p/themes/Screwdriver/screwdriver.css

@@ -394,7 +394,7 @@ a.btn {
 }
 .dropdown-menu > .item > span,
 .dropdown-menu > .item > .as-link {
-	padding: 0 25px;
+	padding: 0 22px;
 	line-height: 2em;
 	color: #ccc;
 }

+ 1 - 1
p/themes/base-theme/base.css

@@ -257,7 +257,7 @@ a.btn {
 }
 .dropdown-menu > .item > span,
 .dropdown-menu > .item > .as-link {
-	padding: 0 25px;
+	padding: 0 22px;
 	line-height: 2em;
 }
 .dropdown-menu > .item:hover {

+ 3 - 0
p/themes/base-theme/template.css

@@ -96,6 +96,7 @@ button.as-link:active {
 	color: inherit;
 	cursor: pointer;
 	font-size: 1.1em;
+	text-align: left;
 }
 
 /*=== Tables */
@@ -199,8 +200,10 @@ a.btn {
 	display: block;
 }
 .dropdown-menu > .item > a,
+.dropdown-menu > .item > .as-link,
 .dropdown-menu > .item > span {
 	display: block;
+	min-width: 200px;
 }
 .dropdown-menu > .item[aria-checked="true"] > a:before {
 	content: '✓';

+ 6 - 0
p/themes/icons/stats.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">
+<g transform="translate(-142,-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="M144.19,490c-1.21,0-2.19,1.02-2.19,2.22v10.562c0,1.2008,0.98238,2.2188,2.1875,2.2188h11.625c1.2051,0,2.1875-1.0179,2.1875-2.2188v-10.562c-0.01-1.2-0.99-2.22-2.2-2.22h-11.625zm0,2,11.625,0c0.12026,0,0.1875,0.08,0.1875,0.21875v10.562c-0.01,0.14-0.08,0.22-0.2,0.22h-11.625c-0.12026,0-0.1875-0.08-0.1875-0.21875v-10.562c0.01-0.14,0.08-0.22,0.2-0.22z"/>
+<path style="block-progression:tb;color:#000000;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" d="m151.31,493.97a0.50005,0.50005,0,0,0,-0.34375,0.34375l-1.6875,6.0938-0.875-1.1875a0.50005,0.50005,0,0,0,-0.4,-0.21h-2.5-0.5v1h0.5,2.25l1.3125,1.7812a0.50005,0.50005,0,0,0,0.875,-0.15625l1.5312-5.4375,1.0625,3.4688a0.50005,0.50005,0,0,0,0.47,0.35h1.5,0.5v-1h-0.5-1.125l-1.4375-4.6875a0.50005,0.50005,0,0,0,-0.625,-0.34375z"/>
+</g>
+</svg>

Некоторые файлы не были показаны из-за большого количества измененных файлов