From 3602405ec0dbc576fce09ff9e865ba2404622080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Fri, 11 Jul 2014 16:03:59 +0200 Subject: WHAT. A. BIG. REFACTOR. + new license (we moved to MIT one) --- inc/3rdparty/FlattrItem.class.php | 26 ++- inc/3rdparty/Session.class.php | 34 +++ inc/poche/Database.class.php | 19 +- inc/poche/Language.class.php | 114 ++++++++++ inc/poche/Poche.class.php | 453 +++++--------------------------------- inc/poche/Routing.class.php | 149 +++++++++++++ inc/poche/Template.class.php | 236 ++++++++++++++++++++ inc/poche/Tools.class.php | 156 +++++++++---- inc/poche/Url.class.php | 2 +- inc/poche/User.class.php | 11 +- inc/poche/config.inc.default.php | 2 +- inc/poche/global.inc.php | 23 +- inc/poche/pochePictures.php | 267 +++++++++++----------- 13 files changed, 876 insertions(+), 616 deletions(-) create mode 100644 inc/poche/Language.class.php create mode 100644 inc/poche/Routing.class.php create mode 100644 inc/poche/Template.class.php (limited to 'inc') diff --git a/inc/3rdparty/FlattrItem.class.php b/inc/3rdparty/FlattrItem.class.php index 711b4ee0..5cf9e5fc 100644 --- a/inc/3rdparty/FlattrItem.class.php +++ b/inc/3rdparty/FlattrItem.class.php @@ -1,25 +1,32 @@ + * @copyright 2013 + * @license http://opensource.org/licenses/MIT see COPYING file + */ +class FlattrItem +{ public $status; public $urltoflattr; public $flattrItemURL; public $numflattrs; - public function checkItem($urltoflattr,$id) { - $this->cacheflattrfile($urltoflattr, $id); + public function checkItem($urltoflattr, $id) + { + $this->_cacheflattrfile($urltoflattr, $id); $flattrResponse = file_get_contents(CACHE . "/flattr/".$id.".cache"); if($flattrResponse != FALSE) { $result = json_decode($flattrResponse); - if (isset($result->message)){ + if (isset($result->message)) { if ($result->message == "flattrable") { $this->status = FLATTRABLE; } } - elseif (is_object($result) && $result->link) { + elseif (is_object($result) && $result->link) { $this->status = FLATTRED; $this->flattrItemURL = $result->link; $this->numflattrs = $result->flattrs; @@ -33,7 +40,8 @@ class FlattrItem { } } - private function cacheflattrfile($urltoflattr, $id) { + private function _cacheflattrfile($urltoflattr, $id) + { if (!is_dir(CACHE . '/flattr')) { mkdir(CACHE . '/flattr', 0777); } diff --git a/inc/3rdparty/Session.class.php b/inc/3rdparty/Session.class.php index 59dfbe67..b56e4c54 100644 --- a/inc/3rdparty/Session.class.php +++ b/inc/3rdparty/Session.class.php @@ -309,4 +309,38 @@ class Session return true; // User is not banned. } + + + /** + * Tells if a param exists in session + * + * @param $name name of the param to test + * @return bool + */ + public static function isInSession($name) + { + return (isset($_SESSION[$name]) ? : FALSE); + } + + /** + * Returns param in session + * + * @param $name name of the param to return + * @return mixed param or null + */ + public static function getParam($name) + { + return (self::isInSession($name) ? $_SESSION[$name] : NULL); + } + + /** + * Store value in session + * + * @param $name name of the variable to store + * @param $value value to store + */ + public static function setParam($name, $value) + { + $_SESSION[$name] = $value; + } } diff --git a/inc/poche/Database.class.php b/inc/poche/Database.class.php index 11cccb72..9c1c0286 100755 --- a/inc/poche/Database.class.php +++ b/inc/poche/Database.class.php @@ -5,7 +5,7 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ class Database { @@ -38,6 +38,7 @@ class Database { } $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $this->_checkTags(); Tools::logm('storage type ' . STORAGE); } @@ -45,21 +46,7 @@ class Database { return $this->handle; } - public function isInstalled() { - $sql = "SELECT username FROM users"; - $query = $this->executeQuery($sql, array()); - if ($query == false) { - die(STORAGE . ' database looks empty. You have to create it (you can find database structure in install folder).'); - } - $hasAdmin = count($query->fetchAll()); - - if ($hasAdmin == 0) - return false; - - return true; - } - - public function checkTags() { + private function _checkTags() { if (STORAGE == 'sqlite') { $sql = ' diff --git a/inc/poche/Language.class.php b/inc/poche/Language.class.php new file mode 100644 index 00000000..790cc197 --- /dev/null +++ b/inc/poche/Language.class.php @@ -0,0 +1,114 @@ + + * @copyright 2013 + * @license http://opensource.org/licenses/MIT see COPYING file + */ + +class Language +{ + protected $wallabag; + + private $currentLanguage; + + private $languageNames = array( + 'cs_CZ.utf8' => 'čeština', + 'de_DE.utf8' => 'German', + 'en_EN.utf8' => 'English', + 'es_ES.utf8' => 'Español', + 'fa_IR.utf8' => 'فارسی', + 'fr_FR.utf8' => 'Français', + 'it_IT.utf8' => 'Italiano', + 'pl_PL.utf8' => 'Polski', + 'pt_BR.utf8' => 'Português (Brasil)', + 'ru_RU.utf8' => 'Pусский', + 'sl_SI.utf8' => 'Slovenščina', + 'uk_UA.utf8' => 'Українська', + ); + + public function __construct(Poche $wallabag) + { + $this->wallabag = $wallabag; + $pocheUser = Session::getParam('poche_user'); + $language = (is_null($pocheUser) ? LANG : $pocheUser->getConfigValue('language')); + + @putenv('LC_ALL=' . $language); + setlocale(LC_ALL, $language); + bindtextdomain($language, LOCALE); + textdomain($language); + + $this->currentLanguage = $language; + } + + public function getLanguage() { + return $this->currentLanguage; + } + + public function getInstalledLanguages() { + $handle = opendir(LOCALE); + $languages = array(); + + while (($language = readdir($handle)) !== false) { + # Languages are stored in a directory, so all directory names are languages + # @todo move language installation data to database + if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.', 'tools'))) { + continue; + } + + $current = false; + + if ($language === $this->getLanguage()) { + $current = true; + } + + $languages[] = array('name' => (isset($this->languageNames[$language]) ? $this->languageNames[$language] : $language), 'value' => $language, 'current' => $current); + } + + return $languages; + } + + + /** + * Update language for current user + * + * @param $newLanguage + */ + public function updateLanguage($newLanguage) + { + # we are not going to change it to the current language + if ($newLanguage == $this->getLanguage()) { + $this->wallabag->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!')); + Tools::redirect('?view=config'); + } + + $languages = $this->getInstalledLanguages(); + $actualLanguage = false; + + foreach ($languages as $language) { + if ($language['value'] == $newLanguage) { + $actualLanguage = true; + break; + } + } + + if (!$actualLanguage) { + $this->wallabag->messages->add('e', _('that language does not seem to be installed')); + Tools::redirect('?view=config'); + } + + $this->wallabag->store->updateUserConfig($this->wallabag->user->getId(), 'language', $newLanguage); + $this->wallabag->messages->add('s', _('you have changed your language preferences')); + + $currentConfig = $_SESSION['poche_user']->config; + $currentConfig['language'] = $newLanguage; + + $_SESSION['poche_user']->setConfig($currentConfig); + + $this->wallabag->emptyCache(); + + Tools::redirect('?view=config'); + } +} \ No newline at end of file diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php index 09a9f5ff..bc4320b8 100755 --- a/inc/poche/Poche.class.php +++ b/inc/poche/Poche.class.php @@ -5,244 +5,77 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ class Poche { - public static $canRenderTemplates = true; - public static $configFileAvailable = true; - + /** + * @var User + */ public $user; + /** + * @var Database + */ public $store; + /** + * @var Template + */ public $tpl; + /** + * @var Language + */ + public $language; + /** + * @var Routing + */ + public $routing; + /** + * @var Messages + */ public $messages; + /** + * @var Paginator + */ public $pagination; - private $currentTheme = ''; - private $currentLanguage = ''; - private $notInstalledMessage = array(); - - private $language_names = array( - 'cs_CZ.utf8' => 'čeština', - 'de_DE.utf8' => 'German', - 'en_EN.utf8' => 'English', - 'es_ES.utf8' => 'Español', - 'fa_IR.utf8' => 'فارسی', - 'fr_FR.utf8' => 'Français', - 'it_IT.utf8' => 'Italiano', - 'pl_PL.utf8' => 'Polski', - 'pt_BR.utf8' => 'Português (Brasil)', - 'ru_RU.utf8' => 'Pусский', - 'sl_SI.utf8' => 'Slovenščina', - 'uk_UA.utf8' => 'Українська', - ); public function __construct() { - if ($this->configFileIsAvailable()) { - $this->init(); - } - - if ($this->themeIsInstalled()) { - $this->initTpl(); - } - - if ($this->systemIsInstalled()) { - $this->store = new Database(); - $this->messages = new Messages(); - # installation - if (! $this->store->isInstalled()) { - $this->install(); - } - $this->store->checkTags(); - } + $this->init(); } private function init() { Tools::initPhp(); - if (isset($_SESSION['poche_user']) && $_SESSION['poche_user'] != array()) { - $this->user = $_SESSION['poche_user']; + $pocheUser = Session::getParam('poche_user'); + + if ($pocheUser && $pocheUser != array()) { + $this->user = $pocheUser; } else { - # fake user, just for install & login screens + // fake user, just for install & login screens $this->user = new User(); $this->user->setConfig($this->getDefaultConfig()); } - # l10n - $language = $this->user->getConfigValue('language'); - @putenv('LC_ALL=' . $language); - setlocale(LC_ALL, $language); - bindtextdomain($language, LOCALE); - textdomain($language); - - # Pagination - $this->pagination = new Paginator($this->user->getConfigValue('pager'), 'p'); - - # Set up theme - $themeDirectory = $this->user->getConfigValue('theme'); - - if ($themeDirectory === false) { - $themeDirectory = DEFAULT_THEME; - } - - $this->currentTheme = $themeDirectory; - - # Set up language - $languageDirectory = $this->user->getConfigValue('language'); - - if ($languageDirectory === false) { - $languageDirectory = DEFAULT_THEME; - } - - $this->currentLanguage = $languageDirectory; - } - - public function configFileIsAvailable() { - if (! self::$configFileAvailable) { - $this->notInstalledMessage[] = 'You have to copy (don\'t just rename!) inc/poche/config.inc.default.php to inc/poche/config.inc.php.'; - - return false; - } - - return true; + $this->pagination = new Paginator($this->user->getConfigValue('pager'), 'p'); + $this->language = new Language($this); + $this->tpl = new Template($this); + $this->store = new Database(); + $this->messages = new Messages(); + $this->routing = new Routing($this); } - public function themeIsInstalled() { - $passTheme = TRUE; - # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet - if (! self::$canRenderTemplates) { - $this->notInstalledMessage[] = 'Twig does not seem to be installed. Please initialize the Composer installation to automatically fetch dependencies. You can also download vendor.zip and extract it in your wallabag folder.'; - $passTheme = FALSE; - } - - if (! is_writable(CACHE)) { - $this->notInstalledMessage[] = 'You don\'t have write access on cache directory.'; - - self::$canRenderTemplates = false; - - $passTheme = FALSE; - } - - # Check if the selected theme and its requirements are present - $theme = $this->getTheme(); - - if ($theme != '' && ! is_dir(THEME . '/' . $theme)) { - $this->notInstalledMessage[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')'; - - self::$canRenderTemplates = false; - - $passTheme = FALSE; - } - - $themeInfo = $this->getThemeInfo($theme); - if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { - foreach ($themeInfo['requirements'] as $requiredTheme) { - if (! is_dir(THEME . '/' . $requiredTheme)) { - $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'; - - self::$canRenderTemplates = false; - - $passTheme = FALSE; - } - } - } - - if (!$passTheme) { - return FALSE; - } - - - return true; + public function run() + { + $this->routing->run(); } /** - * all checks before installation. - * @todo move HTML to template - * @return boolean + * Creates a new user */ - public function systemIsInstalled() + public function createNewUser() { - $msg = TRUE; - - $configSalt = defined('SALT') ? constant('SALT') : ''; - - if (empty($configSalt)) { - $this->notInstalledMessage[] = 'You have not yet filled in the SALT value in the config.inc.php file.'; - $msg = FALSE; - } - if (STORAGE == 'sqlite' && ! file_exists(STORAGE_SQLITE)) { - Tools::logm('sqlite file doesn\'t exist'); - $this->notInstalledMessage[] = 'sqlite file doesn\'t exist, you can find it in install folder. Copy it in /db folder.'; - $msg = FALSE; - } - if (is_dir(ROOT . '/install') && ! DEBUG_POCHE) { - $this->notInstalledMessage[] = 'you have to delete the /install folder before using poche.'; - $msg = FALSE; - } - if (STORAGE == 'sqlite' && ! is_writable(STORAGE_SQLITE)) { - Tools::logm('you don\'t have write access on sqlite file'); - $this->notInstalledMessage[] = 'You don\'t have write access on sqlite file.'; - $msg = FALSE; - } - - if (! $msg) { - return false; - } - - return true; - } - - public function getNotInstalledMessage() { - return $this->notInstalledMessage; - } - - private function initTpl() - { - $loaderChain = new Twig_Loader_Chain(); - $theme = $this->getTheme(); - - # add the current theme as first to the loader chain so Twig will look there first for overridden template files - try { - $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme)); - } catch (Twig_Error_Loader $e) { - # @todo isInstalled() should catch this, inject Twig later - die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)'); - } - - # add all required themes to the loader chain - $themeInfo = $this->getThemeInfo($theme); - if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { - foreach ($themeInfo['requirements'] as $requiredTheme) { - try { - $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $requiredTheme)); - } catch (Twig_Error_Loader $e) { - # @todo isInstalled() should catch this, inject Twig later - die('The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'); - } - } - } - - if (DEBUG_POCHE) { - $twigParams = array(); - } else { - $twigParams = array('cache' => CACHE); - } - - $this->tpl = new Twig_Environment($loaderChain, $twigParams); - $this->tpl->addExtension(new Twig_Extensions_Extension_I18n()); - - # filter to display domain name of an url - $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); - $this->tpl->addFilter($filter); - - # filter for reading time - $filter = new Twig_SimpleFilter('getReadingTime', 'Tools::getReadingTime'); - $this->tpl->addFilter($filter); - } - - public function createNewUser() { if (isset($_GET['newuser'])){ if ($_POST['newusername'] != "" && $_POST['password4newuser'] != ""){ $newusername = filter_var($_POST['newusername'], FILTER_SANITIZE_STRING); @@ -266,7 +99,11 @@ class Poche } } - public function deleteUser(){ + /** + * Delete an existing user + */ + public function deleteUser() + { if (isset($_GET['deluser'])){ if ($this->store->listUsers() > 1) { if (Tools::encodeString($_POST['password4deletinguser'].$this->user->getUsername()) == $this->store->getUserPassword($this->user->getId())) { @@ -294,115 +131,6 @@ class Poche } } - private function install() - { - Tools::logm('poche still not installed'); - echo $this->tpl->render('install.twig', array( - 'token' => Session::getToken(), - 'theme' => $this->getTheme(), - 'poche_url' => Tools::getPocheUrl() - )); - if (isset($_GET['install'])) { - if (($_POST['password'] == $_POST['password_repeat']) - && $_POST['password'] != "" && $_POST['login'] != "") { - # let's rock, install poche baby ! - if ($this->store->install($_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login']))) - { - Session::logout(); - Tools::logm('poche is now installed'); - Tools::redirect(); - } - } - else { - Tools::logm('error during installation'); - Tools::redirect(); - } - } - exit(); - } - - public function getTheme() { - return $this->currentTheme; - } - - /** - * Provides theme information by parsing theme.ini file if present in the theme's root directory. - * In all cases, the following data will be returned: - * - name: theme's name, or key if the theme is unnamed, - * - current: boolean informing if the theme is the current user theme. - * - * @param string $theme Theme key (directory name) - * @return array|boolean Theme information, or false if the theme doesn't exist. - */ - public function getThemeInfo($theme) { - if (!is_dir(THEME . '/' . $theme)) { - return false; - } - - $themeIniFile = THEME . '/' . $theme . '/theme.ini'; - $themeInfo = array(); - - if (is_file($themeIniFile) && is_readable($themeIniFile)) { - $themeInfo = parse_ini_file($themeIniFile); - } - - if ($themeInfo === false) { - $themeInfo = array(); - } - if (!isset($themeInfo['name'])) { - $themeInfo['name'] = $theme; - } - $themeInfo['current'] = ($theme === $this->getTheme()); - - return $themeInfo; - } - - public function getInstalledThemes() { - $handle = opendir(THEME); - $themes = array(); - - while (($theme = readdir($handle)) !== false) { - # Themes are stored in a directory, so all directory names are themes - # @todo move theme installation data to database - if (!is_dir(THEME . '/' . $theme) || in_array($theme, array('.', '..'))) { - continue; - } - - $themes[$theme] = $this->getThemeInfo($theme); - } - - ksort($themes); - - return $themes; - } - - public function getLanguage() { - return $this->currentLanguage; - } - - public function getInstalledLanguages() { - $handle = opendir(LOCALE); - $languages = array(); - - while (($language = readdir($handle)) !== false) { - # Languages are stored in a directory, so all directory names are languages - # @todo move language installation data to database - if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.', 'tools'))) { - continue; - } - - $current = false; - - if ($language === $this->getLanguage()) { - $current = true; - } - - $languages[] = array('name' => (isset($this->language_names[$language]) ? $this->language_names[$language] : $language), 'value' => $language, 'current' => $current); - } - - return $languages; - } - public function getDefaultConfig() { return array( @@ -437,7 +165,7 @@ class Poche if ( $last_id ) { Tools::logm('add link ' . $url->getUrl()); if (DOWNLOAD_PICTURES) { - $content = filtre_picture($body, $url->getUrl(), $last_id); + $content = Picture::filterPicture($body, $url->getUrl(), $last_id); Tools::logm('updating content article'); $this->store->updateContent($last_id, $content, $this->user->getId()); } @@ -472,7 +200,7 @@ class Poche $msg = 'delete link #' . $id; if ($this->store->deleteById($id, $this->user->getId())) { if (DOWNLOAD_PICTURES) { - remove_directory(ABS_PATH . $id); + Picture::removeDirectory(ABS_PATH . $id); } $this->messages->add('s', _('the link has been deleted successfully')); } @@ -598,8 +326,8 @@ class Poche $check_time_prod = date('d-M-Y H:i', $prod_infos[1]); $compare_dev = version_compare(POCHE, $dev); $compare_prod = version_compare(POCHE, $prod); - $themes = $this->getInstalledThemes(); - $languages = $this->getInstalledLanguages(); + $themes = $this->tpl->getInstalledThemes(); + $languages = $this->language->getInstalledLanguages(); $token = $this->user->getConfigValue('token'); $http_auth = (isset($_SERVER['PHP_AUTH_USER']) || isset($_SERVER['REMOTE_USER'])) ? true : false; $only_user = ($this->store->listUsers() > 1) ? false : true; @@ -703,7 +431,7 @@ class Poche 'listmode' => (isset($_COOKIE['listmode']) ? true : false), ); - //if id is given - we retrive entries by tag: id is tag id + //if id is given - we retrieve entries by tag: id is tag id if ($id) { $tpl_vars['tag'] = $this->store->retrieveTag($id, $this->user->getId()); $tpl_vars['id'] = intval($id); @@ -757,85 +485,6 @@ class Poche } } - public function updateTheme() - { - # no data - if (empty($_POST['theme'])) { - } - - # we are not going to change it to the current theme... - if ($_POST['theme'] == $this->getTheme()) { - $this->messages->add('w', _('still using the "' . $this->getTheme() . '" theme!')); - Tools::redirect('?view=config'); - } - - $themes = $this->getInstalledThemes(); - $actualTheme = false; - - foreach (array_keys($themes) as $theme) { - if ($theme == $_POST['theme']) { - $actualTheme = true; - break; - } - } - - if (! $actualTheme) { - $this->messages->add('e', _('that theme does not seem to be installed')); - Tools::redirect('?view=config'); - } - - $this->store->updateUserConfig($this->user->getId(), 'theme', $_POST['theme']); - $this->messages->add('s', _('you have changed your theme preferences')); - - $currentConfig = $_SESSION['poche_user']->config; - $currentConfig['theme'] = $_POST['theme']; - - $_SESSION['poche_user']->setConfig($currentConfig); - - $this->emptyCache(); - - Tools::redirect('?view=config'); - } - - public function updateLanguage() - { - # no data - if (empty($_POST['language'])) { - } - - # we are not going to change it to the current language... - if ($_POST['language'] == $this->getLanguage()) { - $this->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!')); - Tools::redirect('?view=config'); - } - - $languages = $this->getInstalledLanguages(); - $actualLanguage = false; - - foreach ($languages as $language) { - if ($language['value'] == $_POST['language']) { - $actualLanguage = true; - break; - } - } - - if (! $actualLanguage) { - $this->messages->add('e', _('that language does not seem to be installed')); - Tools::redirect('?view=config'); - } - - $this->store->updateUserConfig($this->user->getId(), 'language', $_POST['language']); - $this->messages->add('s', _('you have changed your language preferences')); - - $currentConfig = $_SESSION['poche_user']->config; - $currentConfig['language'] = $_POST['language']; - - $_SESSION['poche_user']->setConfig($currentConfig); - - $this->emptyCache(); - - Tools::redirect('?view=config'); - } /** * get credentials from differents sources * it redirects the user to the $referer link diff --git a/inc/poche/Routing.class.php b/inc/poche/Routing.class.php new file mode 100644 index 00000000..7e259c24 --- /dev/null +++ b/inc/poche/Routing.class.php @@ -0,0 +1,149 @@ + + * @copyright 2013 + * @license http://opensource.org/licenses/MIT see COPYING file + */ + +class Routing +{ + protected $wallabag; + protected $referer; + protected $view; + protected $action; + protected $id; + protected $url; + protected $file; + protected $defaultVars = array(); + protected $vars = array(); + + public function __construct(Poche $wallabag) + { + $this->wallabag = $wallabag; + $this->_init(); + } + + private function _init() + { + # Parse GET & REFERER vars + $this->referer = empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER']; + $this->view = Tools::checkVar('view', 'home'); + $this->action = Tools::checkVar('action'); + $this->id = Tools::checkVar('id'); + $_SESSION['sort'] = Tools::checkVar('sort', 'id'); + $this->url = new Url((isset ($_GET['url'])) ? $_GET['url'] : ''); + } + + public function run() + { + # vars to _always_ send to templates + $this->defaultVars = array( + 'referer' => $this->referer, + 'view' => $this->view, + 'poche_url' => Tools::getPocheUrl(), + 'title' => _('wallabag, a read it later open source system'), + 'token' => \Session::getToken(), + 'theme' => $this->wallabag->tpl->getTheme() + ); + + $this->_launchAction(); + $this->_defineTplInformation(); + + # because messages can be added in $poche->action(), we have to add this entry now (we can add it before) + $this->vars = array_merge($this->vars, array('messages' => $this->wallabag->messages->display('all', FALSE))); + + $this->_render($this->file, $this->vars); + } + + private function _defineTplInformation() + { + $tplFile = array(); + $tplVars = array(); + + if (\Session::isLogged()) { + $this->wallabag->action($this->action, $this->url, $this->id); + $tplFile = Tools::getTplFile($this->view); + $tplVars = array_merge($this->vars, $this->wallabag->displayView($this->view, $this->id)); + } elseif(isset($_SERVER['PHP_AUTH_USER'])) { + if($this->wallabag->store->userExists($_SERVER['PHP_AUTH_USER'])) { + $this->wallabag->login($this->referer); + } else { + $this->wallabag->messages->add('e', _('login failed: user doesn\'t exist')); + Tools::logm('user doesn\'t exist'); + $tplFile = Tools::getTplFile('login'); + $tplVars['http_auth'] = 1; + } + } elseif(isset($_SERVER['REMOTE_USER'])) { + if($this->wallabag->store->userExists($_SERVER['REMOTE_USER'])) { + $this->wallabag->login($this->referer); + } else { + $this->wallabag->messages->add('e', _('login failed: user doesn\'t exist')); + Tools::logm('user doesn\'t exist'); + $tplFile = Tools::getTplFile('login'); + $tplVars['http_auth'] = 1; + } + } else { + $tplFile = Tools::getTplFile('login'); + $tplVars['http_auth'] = 0; + \Session::logout(); + } + + $this->file = $tplFile; + $this->vars = array_merge($this->defaultVars, $tplVars); + } + + private function _launchAction() + { + if (isset($_GET['login'])) { + // hello you + $this->wallabag->login($this->referer); + } elseif (isset($_GET['logout'])) { + // see you soon ! + $this->wallabag->logout(); + } elseif (isset($_GET['config'])) { + // update password + $this->wallabag->updatePassword(); + } elseif (isset($_GET['newuser'])) { + $this->wallabag->createNewUser(); + } elseif (isset($_GET['deluser'])) { + $this->wallabag->deleteUser(); + } elseif (isset($_GET['epub'])) { + $this->wallabag->createEpub(); + } elseif (isset($_GET['import'])) { + $import = $this->wallabag->import(); + $tplVars = array_merge($this->vars, $import); + } elseif (isset($_GET['download'])) { + Tools::downloadDb(); + } elseif (isset($_GET['empty-cache'])) { + $this->wallabag->emptyCache(); + } elseif (isset($_GET['export'])) { + $this->wallabag->export(); + } elseif (isset($_GET['updatetheme'])) { + $this->wallabag->tpl->updateTheme($_POST['theme']); + } elseif (isset($_GET['updatelanguage'])) { + $this->wallabag->language->updateLanguage($_POST['language']); + } elseif (isset($_GET['uploadfile'])) { + $this->wallabag->uploadFile(); + } elseif (isset($_GET['feed'])) { + if (isset($_GET['action']) && $_GET['action'] == 'generate') { + $this->wallabag->generateToken(); + } + else { + $tag_id = (isset($_GET['tag_id']) ? intval($_GET['tag_id']) : 0); + $this->wallabag->generateFeeds($_GET['token'], filter_var($_GET['user_id'],FILTER_SANITIZE_NUMBER_INT), $tag_id, $_GET['type']); + } + } + elseif (isset($_GET['plainurl']) && !empty($_GET['plainurl'])) { + $plainUrl = new Url(base64_encode($_GET['plainurl'])); + $this->wallabag->action('add', $plainUrl); + } + } + + private function _render($file, $vars) + { + echo $this->wallabag->tpl->render($file, $vars); + } +} \ No newline at end of file diff --git a/inc/poche/Template.class.php b/inc/poche/Template.class.php new file mode 100644 index 00000000..0e09ad64 --- /dev/null +++ b/inc/poche/Template.class.php @@ -0,0 +1,236 @@ + + * @copyright 2013 + * @license http://opensource.org/licenses/MIT see COPYING file + */ + +class Template extends Twig_Environment +{ + protected $wallabag; + + private $canRenderTemplates = TRUE; + private $currentTheme = ''; + + public function __construct(Poche $wallabag) + { + $this->wallabag = $wallabag; + + // Set up theme + $pocheUser = Session::getParam('poche_user'); + + $themeDirectory = (is_null($pocheUser) ? DEFAULT_THEME : $pocheUser->getConfigValue('theme')); + + if ($themeDirectory === false) { + $themeDirectory = DEFAULT_THEME; + } + + $this->currentTheme = $themeDirectory; + + if ($this->_themeIsInstalled() === array()) { + $this->_init(); + } + } + + /** + * Returns true if selected theme is installed + * + * @return bool + */ + private function _themeIsInstalled() + { + $errors = array(); + + // Twig is an absolute requirement for wallabag to function. + // Abort immediately if the Composer installer hasn't been run yet + if (!$this->canRenderTemplates) { + $errors[] = 'Twig does not seem to be installed. Please initialize the Composer installation to automatically fetch dependencies. You can also download vendor.zip and extract it in your wallabag folder.'; + } + + // Check if the selected theme and its requirements are present + $theme = $this->getTheme(); + if ($theme != '' && !is_dir(THEME . '/' . $theme)) { + $errors[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')'; + $this->canRenderTemplates = FALSE; + } + + $themeInfo = $this->getThemeInfo($theme); + if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { + foreach ($themeInfo['requirements'] as $requiredTheme) { + if (! is_dir(THEME . '/' . $requiredTheme)) { + $errors[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'; + $this->canRenderTemplates = FALSE; + } + } + } + + $currentErrors = (is_null(Session::getParam('errors'))? array() : Session::getParam('errors')); + Session::setParam('errors', array_merge($errors, $currentErrors)); + + return $errors; + } + + /** + * Initialization for templates + */ + private function _init() + { + $loaderChain = new Twig_Loader_Chain(); + $theme = $this->getTheme(); + + // add the current theme as first to the loader chain + // so Twig will look there first for overridden template files + try { + $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme)); + } catch (Twig_Error_Loader $e) { + # @todo isInstalled() should catch this, inject Twig later + die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)'); + } + + // add all required themes to the loader chain + $themeInfo = $this->getThemeInfo($theme); + if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { + foreach ($themeInfo['requirements'] as $requiredTheme) { + try { + $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $requiredTheme)); + } catch (Twig_Error_Loader $e) { + # @todo isInstalled() should catch this, inject Twig later + die('The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'); + } + } + } + + if (DEBUG_POCHE) { + $twigParams = array(); + } else { + $twigParams = array('cache' => CACHE); + } + + parent::__construct($loaderChain, $twigParams); + + //$tpl = new Twig_Environment($loaderChain, $twigParams); + $this->addExtension(new Twig_Extensions_Extension_I18n()); + + # filter to display domain name of an url + $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); + $this->addFilter($filter); + + # filter for reading time + $filter = new Twig_SimpleFilter('getReadingTime', 'Tools::getReadingTime'); + $this->addFilter($filter); + } + + /** + * Returns current theme + * + * @return string + */ + public function getTheme() + { + return $this->currentTheme; + } + + /** + * Provides theme information by parsing theme.ini file if present in the theme's root directory. + * In all cases, the following data will be returned: + * - name: theme's name, or key if the theme is unnamed, + * - current: boolean informing if the theme is the current user theme. + * + * @param string $theme Theme key (directory name) + * @return array|boolean Theme information, or false if the theme doesn't exist. + */ + public function getThemeInfo($theme) + { + if (!is_dir(THEME . '/' . $theme)) { + return false; + } + + $themeIniFile = THEME . '/' . $theme . '/theme.ini'; + $themeInfo = array(); + + if (is_file($themeIniFile) && is_readable($themeIniFile)) { + $themeInfo = parse_ini_file($themeIniFile); + } + + if ($themeInfo === false) { + $themeInfo = array(); + } + + if (!isset($themeInfo['name'])) { + $themeInfo['name'] = $theme; + } + + $themeInfo['current'] = ($theme === $this->getTheme()); + + return $themeInfo; + } + + /** + * Returns an array with installed themes + * + * @return array + */ + public function getInstalledThemes() + { + $handle = opendir(THEME); + $themes = array(); + + while (($theme = readdir($handle)) !== false) { + # Themes are stored in a directory, so all directory names are themes + # @todo move theme installation data to database + if (!is_dir(THEME . '/' . $theme) || in_array($theme, array('.', '..'))) { + continue; + } + + $themes[$theme] = $this->getThemeInfo($theme); + } + + ksort($themes); + + return $themes; + } + + /** + * Update theme for the current user + * + * @param $newTheme + */ + public function updateTheme($newTheme) + { + # we are not going to change it to the current theme... + if ($newTheme == $this->getTheme()) { + $this->wallabag->messages->add('w', _('still using the "' . $this->getTheme() . '" theme!')); + Tools::redirect('?view=config'); + } + + $themes = $this->getInstalledThemes(); + $actualTheme = false; + + foreach (array_keys($themes) as $theme) { + if ($theme == $newTheme) { + $actualTheme = true; + break; + } + } + + if (!$actualTheme) { + $this->wallabag->messages->add('e', _('that theme does not seem to be installed')); + Tools::redirect('?view=config'); + } + + $this->wallabag->store->updateUserConfig($this->wallabag->user->getId(), 'theme', $newTheme); + $this->wallabag->messages->add('s', _('you have changed your theme preferences')); + + $currentConfig = $_SESSION['poche_user']->config; + $currentConfig['theme'] = $newTheme; + + $_SESSION['poche_user']->setConfig($currentConfig); + + $this->wallabag->emptyCache(); + + Tools::redirect('?view=config'); + } +} \ No newline at end of file diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php index cc01f403..762e4446 100755 --- a/inc/poche/Tools.class.php +++ b/inc/poche/Tools.class.php @@ -5,19 +5,23 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ -class Tools +final class Tools { + private function __construct() + { + + } + + /** + * Initialize PHP environment + */ public static function initPhp() { define('START_TIME', microtime(true)); - if (phpversion() < 5) { - die(_('Oops, it seems you don\'t have PHP 5.')); - } - function stripslashesDeep($value) { return is_array($value) ? array_map('stripslashesDeep', $value) @@ -34,6 +38,11 @@ class Tools register_shutdown_function('ob_end_flush'); } + /** + * Get wallabag instance URL + * + * @return string + */ public static function getPocheUrl() { $https = (!empty($_SERVER['HTTPS']) @@ -67,6 +76,11 @@ class Tools . $host . $serverport . $scriptname; } + /** + * Redirects to a URL + * + * @param string $url + */ public static function redirect($url = '') { if ($url === '') { @@ -87,11 +101,18 @@ class Tools $url = $ref; } } + self::logm('redirect to ' . $url); header('Location: '.$url); exit(); } + /** + * Returns name of the template file to display + * + * @param $view + * @return string + */ public static function getTplFile($view) { $views = array( @@ -99,13 +120,15 @@ class Tools 'edit-tags', 'view', 'login', 'error' ); - if (in_array($view, $views)) { - return $view . '.twig'; - } - - return 'home.twig'; + return (in_array($view, $views) ? $view . '.twig' : 'home.twig'); } + /** + * Download a file (typically, for downloading pictures on web server) + * + * @param $url + * @return bool|mixed|string + */ public static function getFile($url) { $timeout = 15; @@ -186,6 +209,11 @@ class Tools } } + /** + * Headers for JSON export + * + * @param $data + */ public static function renderJson($data) { header('Cache-Control: no-cache, must-revalidate'); @@ -195,6 +223,11 @@ class Tools exit(); } + /** + * Create new line in log file + * + * @param $message + */ public static function logm($message) { if (DEBUG_POCHE && php_sapi_name() != 'cli') { @@ -204,36 +237,57 @@ class Tools } } + /** + * Encode a URL by using a salt + * + * @param $string + * @return string + */ public static function encodeString($string) { return sha1($string . SALT); } + /** + * Cleans a variable + * + * @param $var + * @param string $default + * @return string + */ public static function checkVar($var, $default = '') { - return ((isset ($_REQUEST["$var"])) ? htmlentities($_REQUEST["$var"]) : $default); + return ((isset($_REQUEST["$var"])) ? htmlentities($_REQUEST["$var"]) : $default); } + /** + * Returns the domain name for a URL + * + * @param $url + * @return string + */ public static function getDomain($url) { return parse_url($url, PHP_URL_HOST); } - public static function getReadingTime($text) { - $word = str_word_count(strip_tags($text)); - $minutes = floor($word / 200); - $seconds = floor($word % 200 / (200 / 60)); - $time = array('minutes' => $minutes, 'seconds' => $seconds); - - return $minutes; - } - - public static function getDocLanguage($userlanguage) { - $lang = explode('.', $userlanguage); - return str_replace('_', '-', $lang[0]); + /** + * For a given text, we calculate reading time for an article + * + * @param $text + * @return float + */ + public static function getReadingTime($text) + { + return floor(str_word_count(strip_tags($text)) / 200); } - public static function status($status_code) + /** + * Returns the correct header for a status code + * + * @param $status_code + */ + private static function _status($status_code) { if (strpos(php_sapi_name(), 'apache') !== false) { @@ -245,9 +299,13 @@ class Tools } } - public static function download_db() { + /** + * Download the sqlite database + */ + public static function downloadDb() + { header('Content-Disposition: attachment; filename="poche.sqlite.gz"'); - self::status(200); + self::_status(200); header('Content-Transfer-Encoding: binary'); header('Content-Type: application/octet-stream'); @@ -256,18 +314,24 @@ class Tools exit; } + /** + * Get the content for a given URL (by a call to FullTextFeed) + * + * @param Url $url + * @return mixed + */ public static function getPageContent(Url $url) { // Saving and clearing context $REAL = array(); foreach( $GLOBALS as $key => $value ) { if( $key != 'GLOBALS' && $key != '_SESSION' && $key != 'HTTP_SESSION_VARS' ) { - $GLOBALS[$key] = array(); - $REAL[$key] = $value; + $GLOBALS[$key] = array(); + $REAL[$key] = $value; } } // Saving and clearing session - if ( isset($_SESSION) ) { + if (isset($_SESSION)) { $REAL_SESSION = array(); foreach( $_SESSION as $key => $value ) { $REAL_SESSION[$key] = $value; @@ -279,12 +343,12 @@ class Tools $scope = function() { extract( func_get_arg(1) ); $_GET = $_REQUEST = array( - "url" => $url->getUrl(), - "max" => 5, - "links" => "preserve", - "exc" => "", - "format" => "json", - "submit" => "Create Feed" + "url" => $url->getUrl(), + "max" => 5, + "links" => "preserve", + "exc" => "", + "format" => "json", + "submit" => "Create Feed" ); ob_start(); require func_get_arg(0); @@ -292,23 +356,26 @@ class Tools ob_end_clean(); return $json; }; - $json = $scope( "inc/3rdparty/makefulltextfeed.php", array("url" => $url) ); + + $json = $scope("inc/3rdparty/makefulltextfeed.php", array("url" => $url)); // Clearing and restoring context - foreach( $GLOBALS as $key => $value ) { - if( $key != "GLOBALS" && $key != "_SESSION" ) { + foreach ($GLOBALS as $key => $value) { + if($key != "GLOBALS" && $key != "_SESSION" ) { unset($GLOBALS[$key]); } } - foreach( $REAL as $key => $value ) { + foreach ($REAL as $key => $value) { $GLOBALS[$key] = $value; } + // Clearing and restoring session - if ( isset($REAL_SESSION) ) { - foreach( $_SESSION as $key => $value ) { + if (isset($REAL_SESSION)) { + foreach($_SESSION as $key => $value) { unset($_SESSION[$key]); } - foreach( $REAL_SESSION as $key => $value ) { + + foreach($REAL_SESSION as $key => $value) { $_SESSION[$key] = $value; } } @@ -318,11 +385,12 @@ class Tools /** * Returns whether we handle an AJAX (XMLHttpRequest) request. + * * @return boolean whether we handle an AJAX (XMLHttpRequest) request. */ public static function isAjaxRequest() { - return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; + return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; } } diff --git a/inc/poche/Url.class.php b/inc/poche/Url.class.php index aba236fa..d9172b7d 100644 --- a/inc/poche/Url.class.php +++ b/inc/poche/Url.class.php @@ -5,7 +5,7 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ class Url diff --git a/inc/poche/User.class.php b/inc/poche/User.class.php index cc8bec65..eaadd3e5 100644 --- a/inc/poche/User.class.php +++ b/inc/poche/User.class.php @@ -5,7 +5,7 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ class User @@ -44,7 +44,14 @@ class User $this->config = $config; } - public function getConfigValue($name) { + /** + * Returns configuration entry for a user + * + * @param $name + * @return bool + */ + public function getConfigValue($name) + { return (isset($this->config[$name])) ? $this->config[$name] : FALSE; } } \ No newline at end of file diff --git a/inc/poche/config.inc.default.php b/inc/poche/config.inc.default.php index 95f727c6..6f03af18 100755 --- a/inc/poche/config.inc.default.php +++ b/inc/poche/config.inc.default.php @@ -5,7 +5,7 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ @define ('SALT', ''); # put a strong string here diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php index 8cf86d03..2c22c014 100755 --- a/inc/poche/global.inc.php +++ b/inc/poche/global.inc.php @@ -5,7 +5,7 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ # the poche system root directory (/inc) @@ -18,6 +18,10 @@ require_once INCLUDES . '/poche/Tools.class.php'; require_once INCLUDES . '/poche/User.class.php'; require_once INCLUDES . '/poche/Url.class.php'; require_once INCLUDES . '/3rdparty/class.messages.php'; +require_once ROOT . '/vendor/autoload.php'; +require_once INCLUDES . '/poche/Template.class.php'; +require_once INCLUDES . '/poche/Language.class.php'; +require_once INCLUDES . '/poche/Routing.class.php'; require_once INCLUDES . '/poche/Poche.class.php'; require_once INCLUDES . '/poche/Database.class.php'; @@ -36,22 +40,11 @@ require_once INCLUDES . '/3rdparty/libraries/PHPePub/Logger.php'; require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPub.php'; require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPubChapterSplitter.php'; -# Composer its autoloader for automatically loading Twig -if (! file_exists(ROOT . '/vendor/autoload.php')) { - Poche::$canRenderTemplates = false; -} else { - require_once ROOT . '/vendor/autoload.php'; -} - # system configuration; database credentials et caetera -if (! file_exists(INCLUDES . '/poche/config.inc.php')) { - Poche::$configFileAvailable = false; -} else { - require_once INCLUDES . '/poche/config.inc.php'; - require_once INCLUDES . '/poche/config.inc.default.php'; -} +require_once INCLUDES . '/poche/config.inc.php'; +require_once INCLUDES . '/poche/config.inc.default.php'; -if (Poche::$configFileAvailable && DOWNLOAD_PICTURES) { +if (DOWNLOAD_PICTURES) { require_once INCLUDES . '/poche/pochePictures.php'; } diff --git a/inc/poche/pochePictures.php b/inc/poche/pochePictures.php index 7c319a85..26bf0706 100644 --- a/inc/poche/pochePictures.php +++ b/inc/poche/pochePictures.php @@ -5,154 +5,169 @@ * @category wallabag * @author Nicolas Lœuillet * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file + * @license http://opensource.org/licenses/MIT see COPYING file */ -/** - * On modifie les URLS des images dans le corps de l'article - */ -function filtre_picture($content, $url, $id) + +final class Picture { - $matches = array(); - $processing_pictures = array(); // list of processing image to avoid processing the same pictures twice - preg_match_all('#<\s*(img)[^>]+src="([^"]*)"[^>]*>#Si', $content, $matches, PREG_SET_ORDER); - foreach($matches as $i => $link) { - $link[1] = trim($link[1]); - if (!preg_match('#^(([a-z]+://)|(\#))#', $link[1])) { - $absolute_path = get_absolute_link($link[2],$url); - $filename = basename(parse_url($absolute_path, PHP_URL_PATH)); - $directory = create_assets_directory($id); - $fullpath = $directory . '/' . $filename; - - if (in_array($absolute_path, $processing_pictures) === true) { - // replace picture's URL only if processing is OK : already processing -> go to next picture - continue; - } - - if (download_pictures($absolute_path, $fullpath) === true) { - $content = str_replace($matches[$i][2], $fullpath, $content); + private function __construct() + { + + } + + /** + * Changing pictures URL in article content + */ + public static function filterPicture($content, $url, $id) + { + $matches = array(); + $processing_pictures = array(); // list of processing image to avoid processing the same pictures twice + preg_match_all('#<\s*(img)[^>]+src="([^"]*)"[^>]*>#Si', $content, $matches, PREG_SET_ORDER); + foreach($matches as $i => $link) { + $link[1] = trim($link[1]); + if (!preg_match('#^(([a-z]+://)|(\#))#', $link[1])) { + $absolute_path = self::_getAbsoluteLink($link[2], $url); + $filename = basename(parse_url($absolute_path, PHP_URL_PATH)); + $directory = self::_createAssetsDirectory($id); + $fullpath = $directory . '/' . $filename; + + if (in_array($absolute_path, $processing_pictures) === true) { + // replace picture's URL only if processing is OK : already processing -> go to next picture + continue; + } + + if (self::_downloadPictures($absolute_path, $fullpath) === true) { + $content = str_replace($matches[$i][2], $fullpath, $content); + } + + $processing_pictures[] = $absolute_path; } - - $processing_pictures[] = $absolute_path; } + return $content; } - return $content; -} + /** + * Get absolute URL + */ + private static function _getAbsoluteLink($relativeLink, $url) + { + /* return if already absolute URL */ + if (parse_url($relativeLink, PHP_URL_SCHEME) != '') return $relativeLink; -/** - * Retourne le lien absolu - */ -function get_absolute_link($relative_link, $url) { - /* return if already absolute URL */ - if (parse_url($relative_link, PHP_URL_SCHEME) != '') return $relative_link; + /* queries and anchors */ + if ($relativeLink[0]=='#' || $relativeLink[0]=='?') return $url . $relativeLink; - /* queries and anchors */ - if ($relative_link[0]=='#' || $relative_link[0]=='?') return $url . $relative_link; + /* parse base URL and convert to local variables: + $scheme, $host, $path */ + extract(parse_url($url)); - /* parse base URL and convert to local variables: - $scheme, $host, $path */ - extract(parse_url($url)); + /* remove non-directory element from path */ + $path = preg_replace('#/[^/]*$#', '', $path); - /* remove non-directory element from path */ - $path = preg_replace('#/[^/]*$#', '', $path); + /* destroy path if relative url points to root */ + if ($relativeLink[0] == '/') $path = ''; - /* destroy path if relative url points to root */ - if ($relative_link[0] == '/') $path = ''; + /* dirty absolute URL */ + $abs = $host . $path . '/' . $relativeLink; - /* dirty absolute URL */ - $abs = $host . $path . '/' . $relative_link; + /* replace '//' or '/./' or '/foo/../' with '/' */ + $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); + for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {} - /* replace '//' or '/./' or '/foo/../' with '/' */ - $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); - for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {} + /* absolute URL is ready! */ + return $scheme.'://'.$abs; + } - /* absolute URL is ready! */ - return $scheme.'://'.$abs; -} + /** + * Downloading pictures + * + * @return bool true if the download and processing is OK, false else + */ + private static function _downloadPictures($absolute_path, $fullpath) + { + $rawdata = Tools::getFile($absolute_path); + $fullpath = urldecode($fullpath); + + if(file_exists($fullpath)) { + unlink($fullpath); + } -/** - * Téléchargement des images - * - * @return bool true if the download and processing is OK, false else - */ -function download_pictures($absolute_path, $fullpath) -{ - $rawdata = Tools::getFile($absolute_path); - $fullpath = urldecode($fullpath); + // check extension + $file_ext = strrchr($fullpath, '.'); + $whitelist = array(".jpg",".jpeg",".gif",".png"); + if (!(in_array($file_ext, $whitelist))) { + Tools::logm('processed image with not allowed extension. Skipping ' . $fullpath); + return false; + } - if(file_exists($fullpath)) { - unlink($fullpath); - } - - // check extension - $file_ext = strrchr($fullpath, '.'); - $whitelist = array(".jpg",".jpeg",".gif",".png"); - if (!(in_array($file_ext, $whitelist))) { - Tools::logm('processed image with not allowed extension. Skipping ' . $fullpath); - return false; - } - - // check headers - $imageinfo = getimagesize($absolute_path); - if ($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg'&& $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') { - Tools::logm('processed image with bad header. Skipping ' . $fullpath); - return false; - } - - // regenerate image - $im = imagecreatefromstring($rawdata); - if ($im === false) { - Tools::logm('error while regenerating image ' . $fullpath); - return false; - } - - switch ($imageinfo['mime']) { - case 'image/gif': - $result = imagegif($im, $fullpath); - break; - case 'image/jpeg': - case 'image/jpg': - $result = imagejpeg($im, $fullpath, REGENERATE_PICTURES_QUALITY); - break; - case 'image/png': - $result = imagepng($im, $fullpath, ceil(REGENERATE_PICTURES_QUALITY / 100 * 9)); - break; - } - imagedestroy($im); - - return $result; -} + // check headers + $imageinfo = getimagesize($absolute_path); + if ($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg'&& $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') { + Tools::logm('processed image with bad header. Skipping ' . $fullpath); + return false; + } -/** - * Crée un répertoire de médias pour l'article - */ -function create_assets_directory($id) -{ - $assets_path = ABS_PATH; - if(!is_dir($assets_path)) { - mkdir($assets_path, 0715); - } + // regenerate image + $im = imagecreatefromstring($rawdata); + if ($im === false) { + Tools::logm('error while regenerating image ' . $fullpath); + return false; + } + + switch ($imageinfo['mime']) { + case 'image/gif': + $result = imagegif($im, $fullpath); + break; + case 'image/jpeg': + case 'image/jpg': + $result = imagejpeg($im, $fullpath, REGENERATE_PICTURES_QUALITY); + break; + case 'image/png': + $result = imagepng($im, $fullpath, ceil(REGENERATE_PICTURES_QUALITY / 100 * 9)); + break; + } + imagedestroy($im); - $article_directory = $assets_path . $id; - if(!is_dir($article_directory)) { - mkdir($article_directory, 0715); + return $result; } - return $article_directory; -} + /** + * Create a directory for an article + * + * @param $id ID of the article + * @return string + */ + private static function _createAssetsDirectory($id) + { + $assets_path = ABS_PATH; + if (!is_dir($assets_path)) { + mkdir($assets_path, 0715); + } -/** - * Suppression du répertoire d'images - */ -function remove_directory($directory) -{ - if(is_dir($directory)) { - $files = array_diff(scandir($directory), array('.','..')); - foreach ($files as $file) { - (is_dir("$directory/$file")) ? remove_directory("$directory/$file") : unlink("$directory/$file"); + $article_directory = $assets_path . $id; + if (!is_dir($article_directory)) { + mkdir($article_directory, 0715); + } + + return $article_directory; + } + + /** + * Remove the directory + * + * @param $directory + * @return bool + */ + public static function removeDirectory($directory) + { + if (is_dir($directory)) { + $files = array_diff(scandir($directory), array('.','..')); + foreach ($files as $file) { + (is_dir("$directory/$file")) ? self::removeDirectory("$directory/$file") : unlink("$directory/$file"); + } + return rmdir($directory); } - return rmdir($directory); } -} +} \ No newline at end of file -- cgit v1.2.3 From b3cda72e93fff3a4c3476e9e7e78ef2b2a3f02b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Fri, 11 Jul 2014 17:06:51 +0200 Subject: PicoFarad framework for routing --- inc/3rdparty/PicoFarad/Request.php | 78 ++++++++++++++++++ inc/3rdparty/PicoFarad/Response.php | 156 +++++++++++++++++++++++++++++++++++ inc/3rdparty/PicoFarad/Router.php | 157 ++++++++++++++++++++++++++++++++++++ inc/3rdparty/PicoFarad/Session.php | 57 +++++++++++++ inc/3rdparty/PicoFarad/Template.php | 36 +++++++++ inc/poche/Database.class.php | 138 ++++++++++++++++++++----------- inc/poche/Routing.class.php | 8 +- inc/poche/global.inc.php | 19 ++++- 8 files changed, 595 insertions(+), 54 deletions(-) create mode 100644 inc/3rdparty/PicoFarad/Request.php create mode 100644 inc/3rdparty/PicoFarad/Response.php create mode 100644 inc/3rdparty/PicoFarad/Router.php create mode 100644 inc/3rdparty/PicoFarad/Session.php create mode 100644 inc/3rdparty/PicoFarad/Template.php (limited to 'inc') diff --git a/inc/3rdparty/PicoFarad/Request.php b/inc/3rdparty/PicoFarad/Request.php new file mode 100644 index 00000000..46c82bca --- /dev/null +++ b/inc/3rdparty/PicoFarad/Request.php @@ -0,0 +1,78 @@ + $_FILES[$field]['name'], + 'mimetype' => $_FILES[$field]['type'], + 'size' => $_FILES[$field]['size'], + ); + } + + return false; +} + + +function file_move($field, $destination) +{ + if (isset($_FILES[$field]) && ! file_exists($destination)) { + @mkdir(dirname($destination), 0777, true); + move_uploaded_file($_FILES[$field]['tmp_name'], $destination); + } +} \ No newline at end of file diff --git a/inc/3rdparty/PicoFarad/Response.php b/inc/3rdparty/PicoFarad/Response.php new file mode 100644 index 00000000..9114fde0 --- /dev/null +++ b/inc/3rdparty/PicoFarad/Response.php @@ -0,0 +1,156 @@ + $hosts) { + + if (is_array($hosts)) { + + $acl = ''; + + foreach ($hosts as &$host) { + + if ($host === '*' || $host === 'self' || strpos($host, 'http') === 0) { + $acl .= $host.' '; + } + } + } + else { + + $acl = $hosts; + } + + $values .= $policy.' '.trim($acl).'; '; + } + + header('Content-Security-Policy: '.$values); +} + + +function nosniff() +{ + header('X-Content-Type-Options: nosniff'); +} + + +function xss() +{ + header('X-XSS-Protection: 1; mode=block'); +} + + +function hsts() +{ + header('Strict-Transport-Security: max-age=31536000'); +} + + +function xframe($mode = 'DENY', array $urls = array()) +{ + header('X-Frame-Options: '.$mode.' '.implode(' ', $urls)); +} \ No newline at end of file diff --git a/inc/3rdparty/PicoFarad/Router.php b/inc/3rdparty/PicoFarad/Router.php new file mode 100644 index 00000000..b62b8e2d --- /dev/null +++ b/inc/3rdparty/PicoFarad/Router.php @@ -0,0 +1,157 @@ + 'value']); +function load() +{ + if (func_num_args() < 1 || func_num_args() > 2) { + die('Invalid template arguments'); + } + + if (! file_exists(PATH.func_get_arg(0).'.php')) { + die('Unable to load the template: "'.func_get_arg(0).'"'); + } + + if (func_num_args() === 2) { + + if (! is_array(func_get_arg(1))) { + die('Template variables must be an array'); + } + + extract(func_get_arg(1)); + } + + ob_start(); + include PATH.func_get_arg(0).'.php'; + return ob_get_clean(); +} + + +function layout($template_name, array $template_args = array(), $layout_name = 'layout') +{ + return load($layout_name, $template_args + array('content_for_layout' => load($template_name, $template_args))); +} diff --git a/inc/poche/Database.class.php b/inc/poche/Database.class.php index 9c1c0286..8d74f2ff 100755 --- a/inc/poche/Database.class.php +++ b/inc/poche/Database.class.php @@ -9,6 +9,7 @@ */ class Database { + var $handle; private $order = array( 'ia' => 'ORDER BY entries.id', @@ -42,11 +43,13 @@ class Database { Tools::logm('storage type ' . STORAGE); } - private function getHandle() { + private function getHandle() + { return $this->handle; } - private function _checkTags() { + private function _checkTags() + { if (STORAGE == 'sqlite') { $sql = ' @@ -110,7 +113,8 @@ class Database { $query = $this->executeQuery($sql, array()); } - public function install($login, $password) { + public function install($login, $password) + { $sql = 'INSERT INTO users ( username, password, name, email) VALUES (?, ?, ?, ?)'; $params = array($login, $password, $login, ' '); $query = $this->executeQuery($sql, $params); @@ -137,7 +141,8 @@ class Database { return TRUE; } - public function getConfigUser($id) { + public function getConfigUser($id) + { $sql = "SELECT * FROM users_config WHERE user_id = ?"; $query = $this->executeQuery($sql, array($id)); $result = $query->fetchAll(); @@ -150,7 +155,8 @@ class Database { return $user_config; } - public function userExists($username) { + public function userExists($username) + { $sql = "SELECT * FROM users WHERE username=?"; $query = $this->executeQuery($sql, array($username)); $login = $query->fetchAll(); @@ -161,7 +167,8 @@ class Database { } } - public function login($username, $password, $isauthenticated=false) { + public function login($username, $password, $isauthenticated = FALSE) + { if ($isauthenticated) { $sql = "SELECT * FROM users WHERE username=?"; $query = $this->executeQuery($sql, array($username)); @@ -191,7 +198,8 @@ class Database { $query = $this->executeQuery($sql_update, $params_update); } - public function updateUserConfig($userId, $key, $value) { + public function updateUserConfig($userId, $key, $value) + { $config = $this->getConfigUser($userId); if (! isset($config[$key])) { @@ -205,7 +213,8 @@ class Database { $query = $this->executeQuery($sql, $params); } - private function executeQuery($sql, $params) { + private function executeQuery($sql, $params) + { try { $query = $this->getHandle()->prepare($sql); @@ -219,28 +228,32 @@ class Database { } } - public function listUsers($username=null) { + public function listUsers($username = NULL) + { $sql = 'SELECT count(*) FROM users'.( $username ? ' WHERE username=?' : ''); $query = $this->executeQuery($sql, ( $username ? array($username) : array())); list($count) = $query->fetch(); return $count; } - public function getUserPassword($userID) { + public function getUserPassword($userID) + { $sql = "SELECT * FROM users WHERE id=?"; $query = $this->executeQuery($sql, array($userID)); $password = $query->fetchAll(); return isset($password[0]['password']) ? $password[0]['password'] : null; } - public function deleteUserConfig($userID) { + public function deleteUserConfig($userID) + { $sql_action = 'DELETE from users_config WHERE user_id=?'; $params_action = array($userID); $query = $this->executeQuery($sql_action, $params_action); return $query; } - public function deleteTagsEntriesAndEntries($userID) { + public function deleteTagsEntriesAndEntries($userID) + { $entries = $this->retrieveAll($userID); foreach($entries as $entryid) { $tags = $this->retrieveTagsByEntry($entryid); @@ -251,20 +264,23 @@ class Database { } } - public function deleteUser($userID) { + public function deleteUser($userID) + { $sql_action = 'DELETE from users WHERE id=?'; $params_action = array($userID); $query = $this->executeQuery($sql_action, $params_action); } - public function updateContentAndTitle($id, $title, $body, $user_id) { + public function updateContentAndTitle($id, $title, $body, $user_id) + { $sql_action = 'UPDATE entries SET content = ?, title = ? WHERE id=? AND user_id=?'; $params_action = array($body, $title, $id, $user_id); $query = $this->executeQuery($sql_action, $params_action); return $query; } - public function retrieveUnfetchedEntries($user_id, $limit) { + public function retrieveUnfetchedEntries($user_id, $limit) + { $sql_limit = "LIMIT 0,".$limit; if (STORAGE == 'postgres') { @@ -278,7 +294,8 @@ class Database { return $entries; } - public function retrieveUnfetchedEntriesCount($user_id) { + public function retrieveUnfetchedEntriesCount($user_id) + { $sql = "SELECT count(*) FROM entries WHERE (content = '' OR content IS NULL) AND title LIKE 'Untitled - Import%' AND user_id=?"; $query = $this->executeQuery($sql, array($user_id)); list($count) = $query->fetch(); @@ -286,7 +303,8 @@ class Database { return $count; } - public function retrieveAll($user_id) { + public function retrieveAll($user_id) + { $sql = "SELECT * FROM entries WHERE user_id=? ORDER BY id"; $query = $this->executeQuery($sql, array($user_id)); $entries = $query->fetchAll(); @@ -294,7 +312,8 @@ class Database { return $entries; } - public function retrieveOneById($id, $user_id) { + public function retrieveOneById($id, $user_id) + { $entry = NULL; $sql = "SELECT * FROM entries WHERE id=? AND user_id=?"; $params = array(intval($id), $user_id); @@ -304,7 +323,8 @@ class Database { return isset($entry[0]) ? $entry[0] : null; } - public function retrieveOneByURL($url, $user_id) { + public function retrieveOneByURL($url, $user_id) + { $entry = NULL; $sql = "SELECT * FROM entries WHERE url=? AND user_id=?"; $params = array($url, $user_id); @@ -314,13 +334,15 @@ class Database { return isset($entry[0]) ? $entry[0] : null; } - public function reassignTags($old_entry_id, $new_entry_id) { + public function reassignTags($old_entry_id, $new_entry_id) + { $sql = "UPDATE tags_entries SET entry_id=? WHERE entry_id=?"; $params = array($new_entry_id, $old_entry_id); $query = $this->executeQuery($sql, $params); } - public function getEntriesByView($view, $user_id, $limit = '', $tag_id = 0) { + public function getEntriesByView($view, $user_id, $limit = '', $tag_id = 0) + { switch ($view) { case 'archive': $sql = "SELECT * FROM entries WHERE user_id=? AND is_read=? "; @@ -348,9 +370,10 @@ class Database { $entries = $query->fetchAll(); return $entries; - } + } - public function getEntriesByViewCount($view, $user_id, $tag_id = 0) { + public function getEntriesByViewCount($view, $user_id, $tag_id = 0) + { switch ($view) { case 'archive': $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; @@ -378,7 +401,8 @@ class Database { return $count; } - public function updateContent($id, $content, $user_id) { + public function updateContent($id, $content, $user_id) + { $sql_action = 'UPDATE entries SET content = ? WHERE id=? AND user_id=?'; $params_action = array($content, $id, $user_id); $query = $this->executeQuery($sql_action, $params_action); @@ -393,7 +417,8 @@ class Database { * @param integer $user_id * @return integer $id of inserted record */ - public function add($url, $title, $content, $user_id, $isFavorite=0, $isRead=0) { + public function add($url, $title, $content, $user_id, $isFavorite=0, $isRead=0) + { $sql_action = 'INSERT INTO entries ( url, title, content, user_id, is_fav, is_read ) VALUES (?, ?, ?, ?, ?, ?)'; $params_action = array($url, $title, $content, $user_id, $isFavorite, $isRead); @@ -406,36 +431,42 @@ class Database { return $id; } - public function deleteById($id, $user_id) { + public function deleteById($id, $user_id) + { $sql_action = "DELETE FROM entries WHERE id=? AND user_id=?"; $params_action = array($id, $user_id); $query = $this->executeQuery($sql_action, $params_action); return $query; } - public function favoriteById($id, $user_id) { + public function favoriteById($id, $user_id) + { $sql_action = "UPDATE entries SET is_fav=NOT is_fav WHERE id=? AND user_id=?"; $params_action = array($id, $user_id); $query = $this->executeQuery($sql_action, $params_action); } - public function archiveById($id, $user_id) { + public function archiveById($id, $user_id) + { $sql_action = "UPDATE entries SET is_read=NOT is_read WHERE id=? AND user_id=?"; $params_action = array($id, $user_id); $query = $this->executeQuery($sql_action, $params_action); } - public function archiveAll($user_id) { + public function archiveAll($user_id) + { $sql_action = "UPDATE entries SET is_read=? WHERE user_id=? AND is_read=?"; $params_action = array($user_id, 1, 0); $query = $this->executeQuery($sql_action, $params_action); } - public function getLastId($column = '') { + public function getLastId($column = '') + { return $this->getHandle()->lastInsertId($column); } - public function search($term, $user_id, $limit = '') { + public function search($term, $user_id, $limit = '') + { $search = '%'.$term.'%'; $sql_action = "SELECT * FROM entries WHERE user_id=? AND (content LIKE ? OR title LIKE ? OR url LIKE ?) "; //searches in content, title and URL $sql_action .= $this->getEntriesOrder().' ' . $limit; @@ -444,7 +475,8 @@ class Database { return $query->fetchAll(); } - public function retrieveAllTags($user_id, $term = null) { + public function retrieveAllTags($user_id, $term = NULL) + { $sql = "SELECT DISTINCT tags.*, count(entries.id) AS entriescount FROM tags LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id LEFT JOIN entries ON tags_entries.entry_id=entries.id @@ -458,7 +490,8 @@ class Database { return $tags; } - public function retrieveTag($id, $user_id) { + public function retrieveTag($id, $user_id) + { $tag = NULL; $sql = "SELECT DISTINCT tags.* FROM tags LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id @@ -468,10 +501,11 @@ class Database { $query = $this->executeQuery($sql, $params); $tag = $query->fetchAll(); - return isset($tag[0]) ? $tag[0] : null; + return isset($tag[0]) ? $tag[0] : NULL; } - public function retrieveEntriesByTag($tag_id, $user_id) { + public function retrieveEntriesByTag($tag_id, $user_id) + { $sql = "SELECT entries.* FROM entries LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id @@ -482,7 +516,8 @@ class Database { return $entries; } - public function retrieveTagsByEntry($entry_id) { + public function retrieveTagsByEntry($entry_id) + { $sql = "SELECT tags.* FROM tags LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id @@ -493,14 +528,16 @@ class Database { return $tags; } - public function removeTagForEntry($entry_id, $tag_id) { + public function removeTagForEntry($entry_id, $tag_id) + { $sql_action = "DELETE FROM tags_entries WHERE tag_id=? AND entry_id=?"; $params_action = array($tag_id, $entry_id); $query = $this->executeQuery($sql_action, $params_action); return $query; } - public function cleanUnusedTag($tag_id) { + public function cleanUnusedTag($tag_id) + { $sql_action = "SELECT tags.* FROM tags JOIN tags_entries ON tags_entries.tag_id=tags.id WHERE tags.id=?"; $query = $this->executeQuery($sql_action,array($tag_id)); $tagstokeep = $query->fetchAll(); @@ -519,7 +556,8 @@ class Database { } - public function retrieveTagByValue($value) { + public function retrieveTagByValue($value) + { $tag = NULL; $sql = "SELECT * FROM tags WHERE value=?"; $params = array($value); @@ -529,27 +567,29 @@ class Database { return isset($tag[0]) ? $tag[0] : null; } - public function createTag($value) { + public function createTag($value) + { $sql_action = 'INSERT INTO tags ( value ) VALUES (?)'; $params_action = array($value); $query = $this->executeQuery($sql_action, $params_action); return $query; } - public function setTagToEntry($tag_id, $entry_id) { + public function setTagToEntry($tag_id, $entry_id) + { $sql_action = 'INSERT INTO tags_entries ( tag_id, entry_id ) VALUES (?, ?)'; $params_action = array($tag_id, $entry_id); $query = $this->executeQuery($sql_action, $params_action); return $query; } - private function getEntriesOrder() { - if (isset($_SESSION['sort']) and array_key_exists($_SESSION['sort'], $this->order)) { - return $this->order[$_SESSION['sort']]; - } - else { - return $this->order['default']; - } + private function getEntriesOrder() + { + if (isset($_SESSION['sort']) and array_key_exists($_SESSION['sort'], $this->order)) { + return $this->order[$_SESSION['sort']]; } - + else { + return $this->order['default']; + } + } } diff --git a/inc/poche/Routing.class.php b/inc/poche/Routing.class.php index 7e259c24..6e2c046b 100644 --- a/inc/poche/Routing.class.php +++ b/inc/poche/Routing.class.php @@ -11,8 +11,8 @@ class Routing { protected $wallabag; - protected $referer; - protected $view; + public $referer; + public $view; protected $action; protected $id; protected $url; @@ -55,7 +55,7 @@ class Routing # because messages can be added in $poche->action(), we have to add this entry now (we can add it before) $this->vars = array_merge($this->vars, array('messages' => $this->wallabag->messages->display('all', FALSE))); - $this->_render($this->file, $this->vars); + $this->render($this->file, $this->vars); } private function _defineTplInformation() @@ -142,7 +142,7 @@ class Routing } } - private function _render($file, $vars) + public function render($file, $vars) { echo $this->wallabag->tpl->render($file, $vars); } diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php index 2c22c014..9d710b6c 100755 --- a/inc/poche/global.inc.php +++ b/inc/poche/global.inc.php @@ -40,6 +40,12 @@ require_once INCLUDES . '/3rdparty/libraries/PHPePub/Logger.php'; require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPub.php'; require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPubChapterSplitter.php'; +require_once INCLUDES . '/3rdparty/PicoFarad/Request.php'; +require_once INCLUDES . '/3rdparty/PicoFarad/Response.php'; +require_once INCLUDES . '/3rdparty/PicoFarad/Router.php'; +require_once INCLUDES . '/3rdparty/PicoFarad/Session.php'; +require_once INCLUDES . '/3rdparty/PicoFarad/Template.php'; + # system configuration; database credentials et caetera require_once INCLUDES . '/poche/config.inc.php'; require_once INCLUDES . '/poche/config.inc.default.php'; @@ -50,4 +56,15 @@ if (DOWNLOAD_PICTURES) { if (!ini_get('date.timezone') || !@date_default_timezone_set(ini_get('date.timezone'))) { date_default_timezone_set('UTC'); -} \ No newline at end of file +} + +if (defined('ERROR_REPORTING')) { + error_reporting(ERROR_REPORTING); +} + +// Start session +Session::$sessionName = 'wallabag'; +Session::init(); + +// Let's rock ! +$wallabag = new Poche(); -- cgit v1.2.3 From 26b77483ee7545c0e4f8eeb205a5743bf3589adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Sat, 12 Jul 2014 16:39:31 +0200 Subject: remove PicoFarad MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I’ll implement it an other day. --- inc/3rdparty/PicoFarad/Request.php | 78 ------------------ inc/3rdparty/PicoFarad/Response.php | 156 ----------------------------------- inc/3rdparty/PicoFarad/Router.php | 157 ------------------------------------ inc/3rdparty/PicoFarad/Session.php | 57 ------------- inc/3rdparty/PicoFarad/Template.php | 36 --------- inc/poche/Routing.class.php | 8 +- inc/poche/global.inc.php | 13 --- 7 files changed, 4 insertions(+), 501 deletions(-) delete mode 100644 inc/3rdparty/PicoFarad/Request.php delete mode 100644 inc/3rdparty/PicoFarad/Response.php delete mode 100644 inc/3rdparty/PicoFarad/Router.php delete mode 100644 inc/3rdparty/PicoFarad/Session.php delete mode 100644 inc/3rdparty/PicoFarad/Template.php (limited to 'inc') diff --git a/inc/3rdparty/PicoFarad/Request.php b/inc/3rdparty/PicoFarad/Request.php deleted file mode 100644 index 46c82bca..00000000 --- a/inc/3rdparty/PicoFarad/Request.php +++ /dev/null @@ -1,78 +0,0 @@ - $_FILES[$field]['name'], - 'mimetype' => $_FILES[$field]['type'], - 'size' => $_FILES[$field]['size'], - ); - } - - return false; -} - - -function file_move($field, $destination) -{ - if (isset($_FILES[$field]) && ! file_exists($destination)) { - @mkdir(dirname($destination), 0777, true); - move_uploaded_file($_FILES[$field]['tmp_name'], $destination); - } -} \ No newline at end of file diff --git a/inc/3rdparty/PicoFarad/Response.php b/inc/3rdparty/PicoFarad/Response.php deleted file mode 100644 index 9114fde0..00000000 --- a/inc/3rdparty/PicoFarad/Response.php +++ /dev/null @@ -1,156 +0,0 @@ - $hosts) { - - if (is_array($hosts)) { - - $acl = ''; - - foreach ($hosts as &$host) { - - if ($host === '*' || $host === 'self' || strpos($host, 'http') === 0) { - $acl .= $host.' '; - } - } - } - else { - - $acl = $hosts; - } - - $values .= $policy.' '.trim($acl).'; '; - } - - header('Content-Security-Policy: '.$values); -} - - -function nosniff() -{ - header('X-Content-Type-Options: nosniff'); -} - - -function xss() -{ - header('X-XSS-Protection: 1; mode=block'); -} - - -function hsts() -{ - header('Strict-Transport-Security: max-age=31536000'); -} - - -function xframe($mode = 'DENY', array $urls = array()) -{ - header('X-Frame-Options: '.$mode.' '.implode(' ', $urls)); -} \ No newline at end of file diff --git a/inc/3rdparty/PicoFarad/Router.php b/inc/3rdparty/PicoFarad/Router.php deleted file mode 100644 index b62b8e2d..00000000 --- a/inc/3rdparty/PicoFarad/Router.php +++ /dev/null @@ -1,157 +0,0 @@ - 'value']); -function load() -{ - if (func_num_args() < 1 || func_num_args() > 2) { - die('Invalid template arguments'); - } - - if (! file_exists(PATH.func_get_arg(0).'.php')) { - die('Unable to load the template: "'.func_get_arg(0).'"'); - } - - if (func_num_args() === 2) { - - if (! is_array(func_get_arg(1))) { - die('Template variables must be an array'); - } - - extract(func_get_arg(1)); - } - - ob_start(); - include PATH.func_get_arg(0).'.php'; - return ob_get_clean(); -} - - -function layout($template_name, array $template_args = array(), $layout_name = 'layout') -{ - return load($layout_name, $template_args + array('content_for_layout' => load($template_name, $template_args))); -} diff --git a/inc/poche/Routing.class.php b/inc/poche/Routing.class.php index 6e2c046b..8c2f38e3 100644 --- a/inc/poche/Routing.class.php +++ b/inc/poche/Routing.class.php @@ -11,8 +11,8 @@ class Routing { protected $wallabag; - public $referer; - public $view; + protected $referer; + protected $view; protected $action; protected $id; protected $url; @@ -55,7 +55,7 @@ class Routing # because messages can be added in $poche->action(), we have to add this entry now (we can add it before) $this->vars = array_merge($this->vars, array('messages' => $this->wallabag->messages->display('all', FALSE))); - $this->render($this->file, $this->vars); + $this->_render($this->file, $this->vars); } private function _defineTplInformation() @@ -142,7 +142,7 @@ class Routing } } - public function render($file, $vars) + public function _render($file, $vars) { echo $this->wallabag->tpl->render($file, $vars); } diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php index 9d710b6c..3eb64df0 100755 --- a/inc/poche/global.inc.php +++ b/inc/poche/global.inc.php @@ -40,12 +40,6 @@ require_once INCLUDES . '/3rdparty/libraries/PHPePub/Logger.php'; require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPub.php'; require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPubChapterSplitter.php'; -require_once INCLUDES . '/3rdparty/PicoFarad/Request.php'; -require_once INCLUDES . '/3rdparty/PicoFarad/Response.php'; -require_once INCLUDES . '/3rdparty/PicoFarad/Router.php'; -require_once INCLUDES . '/3rdparty/PicoFarad/Session.php'; -require_once INCLUDES . '/3rdparty/PicoFarad/Template.php'; - # system configuration; database credentials et caetera require_once INCLUDES . '/poche/config.inc.php'; require_once INCLUDES . '/poche/config.inc.default.php'; @@ -61,10 +55,3 @@ if (!ini_get('date.timezone') || !@date_default_timezone_set(ini_get('date.timez if (defined('ERROR_REPORTING')) { error_reporting(ERROR_REPORTING); } - -// Start session -Session::$sessionName = 'wallabag'; -Session::init(); - -// Let's rock ! -$wallabag = new Poche(); -- cgit v1.2.3 From 2f26729c841a68669a1baf799091cb2c6c9f585a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Sat, 12 Jul 2014 19:01:11 +0200 Subject: Refactor --- inc/poche/Language.class.php | 3 +- inc/poche/Poche.class.php | 507 +++++++++++++++------------------------ inc/poche/Routing.class.php | 13 +- inc/poche/Template.class.php | 3 +- inc/poche/Tools.class.php | 41 +++- inc/poche/WallabagEpub.class.php | 137 +++++++++++ inc/poche/global.inc.php | 1 + inc/poche/pochePictures.php | 5 - 8 files changed, 381 insertions(+), 329 deletions(-) create mode 100644 inc/poche/WallabagEpub.class.php (limited to 'inc') diff --git a/inc/poche/Language.class.php b/inc/poche/Language.class.php index 790cc197..8d3912f5 100644 --- a/inc/poche/Language.class.php +++ b/inc/poche/Language.class.php @@ -107,8 +107,7 @@ class Language $_SESSION['poche_user']->setConfig($currentConfig); - $this->wallabag->emptyCache(); - + Tools::emptyCache(); Tools::redirect('?view=config'); } } \ No newline at end of file diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php index bc4320b8..a49413f2 100755 --- a/inc/poche/Poche.class.php +++ b/inc/poche/Poche.class.php @@ -74,61 +74,57 @@ class Poche /** * Creates a new user */ - public function createNewUser() + public function createNewUser($username, $password) { - if (isset($_GET['newuser'])){ - if ($_POST['newusername'] != "" && $_POST['password4newuser'] != ""){ - $newusername = filter_var($_POST['newusername'], FILTER_SANITIZE_STRING); - if (!$this->store->userExists($newusername)){ - if ($this->store->install($newusername, Tools::encodeString($_POST['password4newuser'] . $newusername))) { - Tools::logm('The new user '.$newusername.' has been installed'); - $this->messages->add('s', sprintf(_('The new user %s has been installed. Do you want to logout ?'),$newusername)); - Tools::redirect(); - } - else { - Tools::logm('error during adding new user'); - Tools::redirect(); - } + if (!empty($username) && !empty($password)){ + $newUsername = filter_var($username, FILTER_SANITIZE_STRING); + if (!$this->store->userExists($newUsername)){ + if ($this->store->install($newUsername, Tools::encodeString($password . $newUsername))) { + Tools::logm('The new user ' . $newUsername . ' has been installed'); + $this->messages->add('s', sprintf(_('The new user %s has been installed. Do you want to logout ?'), $newUsername)); + Tools::redirect(); } else { - $this->messages->add('e', sprintf(_('Error : An user with the name %s already exists !'),$newusername)); - Tools::logm('An user with the name '.$newusername.' already exists !'); + Tools::logm('error during adding new user'); Tools::redirect(); } } + else { + $this->messages->add('e', sprintf(_('Error : An user with the name %s already exists !'), $newUsername)); + Tools::logm('An user with the name ' . $newUsername . ' already exists !'); + Tools::redirect(); + } } } /** * Delete an existing user */ - public function deleteUser() + public function deleteUser($password) { - if (isset($_GET['deluser'])){ - if ($this->store->listUsers() > 1) { - if (Tools::encodeString($_POST['password4deletinguser'].$this->user->getUsername()) == $this->store->getUserPassword($this->user->getId())) { - $username = $this->user->getUsername(); - $this->store->deleteUserConfig($this->user->getId()); - Tools::logm('The configuration for user '. $username .' has been deleted !'); - $this->store->deleteTagsEntriesAndEntries($this->user->getId()); - Tools::logm('The entries for user '. $username .' has been deleted !'); - $this->store->deleteUser($this->user->getId()); - Tools::logm('User '. $username .' has been completely deleted !'); - Session::logout(); - Tools::logm('logout'); - Tools::redirect(); - $this->messages->add('s', sprintf(_('User %s has been successfully deleted !'),$newusername)); - } - else { - Tools::logm('Bad password !'); - $this->messages->add('e', _('Error : The password is wrong !')); - } + if ($this->store->listUsers() > 1) { + if (Tools::encodeString($password . $this->user->getUsername()) == $this->store->getUserPassword($this->user->getId())) { + $username = $this->user->getUsername(); + $this->store->deleteUserConfig($this->user->getId()); + Tools::logm('The configuration for user '. $username .' has been deleted !'); + $this->store->deleteTagsEntriesAndEntries($this->user->getId()); + Tools::logm('The entries for user '. $username .' has been deleted !'); + $this->store->deleteUser($this->user->getId()); + Tools::logm('User '. $username .' has been completely deleted !'); + Session::logout(); + Tools::logm('logout'); + Tools::redirect(); + $this->messages->add('s', sprintf(_('User %s has been successfully deleted !'), $username)); } else { - Tools::logm('Only user !'); - $this->messages->add('e', _('Error : You are the only user, you cannot delete your account !')); + Tools::logm('Bad password !'); + $this->messages->add('e', _('Error : The password is wrong !')); } } + else { + Tools::logm('Only user !'); + $this->messages->add('e', _('Error : You are the only user, you cannot delete your account !')); + } } public function getDefaultConfig() @@ -153,7 +149,7 @@ class Poche $body = $content['rss']['channel']['item']['description']; // clean content from prevent xss attack - $purifier = $this->getPurifier(); + $purifier = $this->_getPurifier(); $title = $purifier->purify($title); $body = $purifier->purify($body); @@ -318,10 +314,10 @@ class Poche switch ($view) { case 'config': - $dev_infos = $this->getPocheVersion('dev'); + $dev_infos = $this->_getPocheVersion('dev'); $dev = trim($dev_infos[0]); $check_time_dev = date('d-M-Y H:i', $dev_infos[1]); - $prod_infos = $this->getPocheVersion('prod'); + $prod_infos = $this->_getPocheVersion('prod'); $prod = trim($prod_infos[0]); $check_time_prod = date('d-M-Y H:i', $prod_infos[1]); $compare_dev = version_compare(POCHE, $dev); @@ -461,7 +457,7 @@ class Poche * @todo set the new password in function header like this updatePassword($newPassword) * @return boolean */ - public function updatePassword() + public function updatePassword($password, $confirmPassword) { if (MODE_DEMO) { $this->messages->add('i', _('in demo mode, you can\'t update your password')); @@ -469,10 +465,10 @@ class Poche Tools::redirect('?view=config'); } else { - if (isset($_POST['password']) && isset($_POST['password_repeat'])) { - if ($_POST['password'] == $_POST['password_repeat'] && $_POST['password'] != "") { + if (isset($password) && isset($confirmPassword)) { + if ($password == $confirmPassword && !empty($password)) { $this->messages->add('s', _('your password has been updated')); - $this->store->updatePassword($this->user->getId(), Tools::encodeString($_POST['password'] . $this->user->getUsername())); + $this->store->updatePassword($this->user->getId(), Tools::encodeString($password . $this->user->getUsername())); Session::logout(); Tools::logm('password updated'); Tools::redirect(); @@ -486,22 +482,24 @@ class Poche } /** - * get credentials from differents sources - * it redirects the user to the $referer link + * Get credentials from differents sources + * It redirects the user to the $referer link + * * @return array */ - private function credentials() { - if(isset($_SERVER['PHP_AUTH_USER'])) { - return array($_SERVER['PHP_AUTH_USER'],'php_auth',true); + private function credentials() + { + if (isset($_SERVER['PHP_AUTH_USER'])) { + return array($_SERVER['PHP_AUTH_USER'], 'php_auth', true); } - if(!empty($_POST['login']) && !empty($_POST['password'])) { - return array($_POST['login'],$_POST['password'],false); + if (!empty($_POST['login']) && !empty($_POST['password'])) { + return array($_POST['login'], $_POST['password'], false); } - if(isset($_SERVER['REMOTE_USER'])) { - return array($_SERVER['REMOTE_USER'],'http_auth',true); + if (isset($_SERVER['REMOTE_USER'])) { + return array($_SERVER['REMOTE_USER'], 'http_auth', true); } - return array(false,false,false); + return array(false, false, false); } /** @@ -550,129 +548,148 @@ class Poche } /** - * import datas into your poche + * import datas into your wallabag * @return boolean */ - public function import() { - - if ( isset($_FILES['file']) ) { - Tools::logm('Import stated: parsing file'); - - // assume, that file is in json format - $str_data = file_get_contents($_FILES['file']['tmp_name']); - $data = json_decode($str_data, true); - - if ( $data === null ) { - //not json - assume html - $html = new simple_html_dom(); - $html->load_file($_FILES['file']['tmp_name']); - $data = array(); - $read = 0; - foreach (array('ol','ul') as $list) { - foreach ($html->find($list) as $ul) { - foreach ($ul->find('li') as $li) { - $tmpEntry = array(); - $a = $li->find('a'); - $tmpEntry['url'] = $a[0]->href; - $tmpEntry['tags'] = $a[0]->tags; - $tmpEntry['is_read'] = $read; - if ($tmpEntry['url']) { - $data[] = $tmpEntry; - } - } - # the second
    is for read links - $read = ((sizeof($data) && $read)?0:1); + public function import() + { + if (isset($_FILES['file'])) { + Tools::logm('Import stated: parsing file'); + + // assume, that file is in json format + + $str_data = file_get_contents($_FILES['file']['tmp_name']); + $data = json_decode($str_data, true); + if ($data === null) { + + // not json - assume html + + $html = new simple_html_dom(); + $html->load_file($_FILES['file']['tmp_name']); + $data = array(); + $read = 0; + foreach(array('ol','ul') as $list) { + foreach($html->find($list) as $ul) { + foreach($ul->find('li') as $li) { + $tmpEntry = array(); + $a = $li->find('a'); + $tmpEntry['url'] = $a[0]->href; + $tmpEntry['tags'] = $a[0]->tags; + $tmpEntry['is_read'] = $read; + if ($tmpEntry['url']) { + $data[] = $tmpEntry; + } + } + + // the second
      is for read links + + $read = ((sizeof($data) && $read) ? 0 : 1); + } + } } - } - } - //for readability structure - foreach ($data as $record) { - if (is_array($record)) { - $data[] = $record; - foreach ($record as $record2) { - if (is_array($record2)) { - $data[] = $record2; - } + // for readability structure + + foreach($data as $record) { + if (is_array($record)) { + $data[] = $record; + foreach($record as $record2) { + if (is_array($record2)) { + $data[] = $record2; + } + } + } } - } - } - $urlsInserted = array(); //urls of articles inserted - foreach ($data as $record) { - $url = trim( isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '') ); - if ( $url and !in_array($url, $urlsInserted) ) { - $title = (isset($record['title']) ? $record['title'] : _('Untitled - Import - ').' '._('click to finish import').''); - $body = (isset($record['content']) ? $record['content'] : ''); - $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive'])?intval($record['archive']):0)); - $isFavorite = (isset($record['is_fav']) ? intval($record['is_fav']) : (isset($record['favorite'])?intval($record['favorite']):0) ); - //insert new record - $id = $this->store->add($url, $title, $body, $this->user->getId(), $isFavorite, $isRead); - if ( $id ) { - $urlsInserted[] = $url; //add - - if ( isset($record['tags']) && trim($record['tags']) ) { - //@TODO: set tags - - } + $urlsInserted = array(); //urls of articles inserted + foreach($data as $record) { + $url = trim(isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '')); + if ($url and !in_array($url, $urlsInserted)) { + $title = (isset($record['title']) ? $record['title'] : _('Untitled - Import - ') . ' ' . _('click to finish import') . ''); + $body = (isset($record['content']) ? $record['content'] : ''); + $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive']) ? intval($record['archive']) : 0)); + $isFavorite = (isset($record['is_fav']) ? intval($record['is_fav']) : (isset($record['favorite']) ? intval($record['favorite']) : 0)); + + // insert new record + + $id = $this->store->add($url, $title, $body, $this->user->getId() , $isFavorite, $isRead); + if ($id) { + $urlsInserted[] = $url; //add + if (isset($record['tags']) && trim($record['tags'])) { + + // @TODO: set tags + + } + } + } } - } - } - $i = sizeof($urlsInserted); - if ( $i > 0 ) { - $this->messages->add('s', _('Articles inserted: ').$i._('. Please note, that some may be marked as "read".')); + $i = sizeof($urlsInserted); + if ($i > 0) { + $this->messages->add('s', _('Articles inserted: ') . $i . _('. Please note, that some may be marked as "read".')); + } + + Tools::logm('Import of articles finished: ' . $i . ' articles added (w/o content if not provided).'); } - Tools::logm('Import of articles finished: '.$i.' articles added (w/o content if not provided).'); - } - //file parsing finished here - //now download article contents if any + // file parsing finished here + // now download article contents if any + // check if we need to download any content - //check if we need to download any content - $recordsDownloadRequired = $this->store->retrieveUnfetchedEntriesCount($this->user->getId()); - if ( $recordsDownloadRequired == 0 ) { - //nothing to download - $this->messages->add('s', _('Import finished.')); - Tools::logm('Import finished completely'); - Tools::redirect(); - } - else { - //if just inserted - don't download anything, download will start in next reload - if ( !isset($_FILES['file']) ) { - //download next batch - Tools::logm('Fetching next batch of articles...'); - $items = $this->store->retrieveUnfetchedEntries($this->user->getId(), IMPORT_LIMIT); + $recordsDownloadRequired = $this->store->retrieveUnfetchedEntriesCount($this->user->getId()); + + if ($recordsDownloadRequired == 0) { - $purifier = $this->getPurifier(); + // nothing to download - foreach ($items as $item) { - $url = new Url(base64_encode($item['url'])); - Tools::logm('Fetching article '.$item['id']); - $content = Tools::getPageContent($url); + $this->messages->add('s', _('Import finished.')); + Tools::logm('Import finished completely'); + Tools::redirect(); + } + else { - $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled')); - $body = (($content['rss']['channel']['item']['description'] != '') ? $content['rss']['channel']['item']['description'] : _('Undefined')); + // if just inserted - don't download anything, download will start in next reload - //clean content to prevent xss attack - $title = $purifier->purify($title); - $body = $purifier->purify($body); + if (!isset($_FILES['file'])) { - $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId()); - Tools::logm('Article '.$item['id'].' updated.'); - } + // download next batch + Tools::logm('Fetching next batch of articles...'); + $items = $this->store->retrieveUnfetchedEntries($this->user->getId() , IMPORT_LIMIT); + $purifier = $this->_getPurifier(); + foreach($items as $item) { + $url = new Url(base64_encode($item['url'])); + Tools::logm('Fetching article ' . $item['id']); + $content = Tools::getPageContent($url); + $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled')); + $body = (($content['rss']['channel']['item']['description'] != '') ? $content['rss']['channel']['item']['description'] : _('Undefined')); + + // clean content to prevent xss attack + + $title = $purifier->purify($title); + $body = $purifier->purify($body); + $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId()); + Tools::logm('Article ' . $item['id'] . ' updated.'); + } + } } - } - return array('includeImport'=>true, 'import'=>array('recordsDownloadRequired'=>$recordsDownloadRequired, 'recordsUnderDownload'=> IMPORT_LIMIT, 'delay'=> IMPORT_DELAY * 1000) ); + return array( + 'includeImport' => true, + 'import' => array( + 'recordsDownloadRequired' => $recordsDownloadRequired, + 'recordsUnderDownload' => IMPORT_LIMIT, + 'delay' => IMPORT_DELAY * 1000 + ) + ); } /** * export poche entries in json * @return json all poche entries */ - public function export() { + public function export() + { $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json"; header('Content-Disposition: attachment; filename='.$filename); @@ -688,7 +705,7 @@ class Poche * @param string $which 'prod' or 'dev' * @return string latest $which version */ - private function getPocheVersion($which = 'prod') { + private function _getPocheVersion($which = 'prod') { $cache_file = CACHE . '/' . $which; $check_time = time(); @@ -703,29 +720,27 @@ class Poche return array($version, $check_time); } - public function generateToken() + /** + * Update token for current user + */ + public function updateToken() { - if (ini_get('open_basedir') === '') { - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - echo 'This is a server using Windows!'; - // alternative to /dev/urandom for Windows - $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); - } else { - $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15); - } - } - else { - $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); - } - - $token = str_replace('+', '', $token); - $this->store->updateUserConfig($this->user->getId(), 'token', $token); - $currentConfig = $_SESSION['poche_user']->config; - $currentConfig['token'] = $token; - $_SESSION['poche_user']->setConfig($currentConfig); - Tools::redirect(); + $token = Tools::generateToken(); + $this->store->updateUserConfig($this->user->getId(), 'token', $token); + $currentConfig = $_SESSION['poche_user']->config; + $currentConfig['token'] = $token; + $_SESSION['poche_user']->setConfig($currentConfig); + Tools::redirect(); } + /** + * Generate RSS feeds for current user + * + * @param $token + * @param $user_id + * @param $tag_id + * @param string $type + */ public function generateFeeds($token, $user_id, $tag_id, $type = 'home') { $allowed_types = array('home', 'fav', 'archive', 'tag'); @@ -738,7 +753,6 @@ class Poche if (!in_array($type, $allowed_types) || $token != $config['token']) { die(_('Uh, there is a problem while generating feeds.')); } - // Check the token $feed = new FeedWriter(RSS2); $feed->setTitle('wallabag — ' . $type . ' feed'); @@ -770,147 +784,22 @@ class Poche exit; } - public function emptyCache() { - $files = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator(CACHE, RecursiveDirectoryIterator::SKIP_DOTS), - RecursiveIteratorIterator::CHILD_FIRST - ); - - foreach ($files as $fileinfo) { - $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink'); - $todo($fileinfo->getRealPath()); - } - Tools::logm('empty cache'); - $this->messages->add('s', _('Cache deleted.')); - Tools::redirect(); - } /** - * return new purifier object with actual config + * Returns new purifier object with actual config */ - protected function getPurifier() { - $config = HTMLPurifier_Config::createDefault(); - $config->set('Cache.SerializerPath', CACHE); - $config->set('HTML.SafeIframe', true); + private function _getPurifier() + { + $config = HTMLPurifier_Config::createDefault(); + $config->set('Cache.SerializerPath', CACHE); + $config->set('HTML.SafeIframe', true); - //allow YouTube, Vimeo and dailymotion videos - $config->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/|www\.dailymotion\.com/embed/video/)%'); + //allow YouTube, Vimeo and dailymotion videos + $config->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/|www\.dailymotion\.com/embed/video/)%'); - return new HTMLPurifier($config); + return new HTMLPurifier($config); } - /** - * handle epub - */ - public function createEpub() { - - switch ($_GET['method']) { - case 'id': - $entryID = filter_var($_GET['id'],FILTER_SANITIZE_NUMBER_INT); - $entry = $this->store->retrieveOneById($entryID, $this->user->getId()); - $entries = array($entry); - $bookTitle = $entry['title']; - $bookFileName = substr($bookTitle, 0, 200); - break; - case 'all': - $entries = $this->store->retrieveAll($this->user->getId()); - $bookTitle = sprintf(_('All my articles on '), date(_('d.m.y'))); #translatable because each country has it's own date format system - $bookFileName = _('Allarticles') . date(_('dmY')); - break; - case 'tag': - $tag = filter_var($_GET['tag'],FILTER_SANITIZE_STRING); - $tags_id = $this->store->retrieveAllTags($this->user->getId(),$tag); - $tag_id = $tags_id[0]["id"]; // we take the first result, which is supposed to match perfectly. There must be a workaround. - $entries = $this->store->retrieveEntriesByTag($tag_id,$this->user->getId()); - $bookTitle = sprintf(_('Articles tagged %s'),$tag); - $bookFileName = substr(sprintf(_('Tag %s'),$tag), 0, 200); - break; - case 'category': - $category = filter_var($_GET['category'],FILTER_SANITIZE_STRING); - $entries = $this->store->getEntriesByView($category,$this->user->getId()); - $bookTitle = sprintf(_('All articles in category %s'), $category); - $bookFileName = substr(sprintf(_('Category %s'),$category), 0, 200); - break; - case 'search': - $search = filter_var($_GET['search'],FILTER_SANITIZE_STRING); - $entries = $this->store->search($search,$this->user->getId()); - $bookTitle = sprintf(_('All articles for search %s'), $search); - $bookFileName = substr(sprintf(_('Search %s'), $search), 0, 200); - break; - case 'default': - die(_('Uh, there is a problem while generating epub.')); - - } - - $content_start = - "\n" - . "\n" - . "" - . "\n" - . "wallabag articles book\n" - . "\n" - . "\n"; - - $bookEnd = "\n\n"; - - $log = new Logger("wallabag", TRUE); - $fileDir = CACHE; - - $book = new EPub(EPub::BOOK_VERSION_EPUB3, DEBUG_POCHE); - $log->logLine("new EPub()"); - $log->logLine("EPub class version: " . EPub::VERSION); - $log->logLine("EPub Req. Zip version: " . EPub::REQ_ZIP_VERSION); - $log->logLine("Zip version: " . Zip::VERSION); - $log->logLine("getCurrentServerURL: " . $book->getCurrentServerURL()); - $log->logLine("getCurrentPageURL..: " . $book->getCurrentPageURL()); - - $book->setTitle(_('wallabag\'s articles')); - $book->setIdentifier("http://$_SERVER[HTTP_HOST]", EPub::IDENTIFIER_URI); // Could also be the ISBN number, prefered for published books, or a UUID. - //$book->setLanguage("en"); // Not needed, but included for the example, Language is mandatory, but EPub defaults to "en". Use RFC3066 Language codes, such as "en", "da", "fr" etc. - $book->setDescription(_("Some articles saved on my wallabag")); - $book->setAuthor("wallabag","wallabag"); - $book->setPublisher("wallabag","wallabag"); // I hope this is a non existant address :) - $book->setDate(time()); // Strictly not needed as the book date defaults to time(). - //$book->setRights("Copyright and licence information specific for the book."); // As this is generated, this _could_ contain the name or licence information of the user who purchased the book, if needed. If this is used that way, the identifier must also be made unique for the book. - $book->setSourceURL("http://$_SERVER[HTTP_HOST]"); - - $book->addDublinCoreMetadata(DublinCore::CONTRIBUTOR, "PHP"); - $book->addDublinCoreMetadata(DublinCore::CONTRIBUTOR, "wallabag"); - - $cssData = "body {\n margin-left: .5em;\n margin-right: .5em;\n text-align: justify;\n}\n\np {\n font-family: serif;\n font-size: 10pt;\n text-align: justify;\n text-indent: 1em;\n margin-top: 0px;\n margin-bottom: 1ex;\n}\n\nh1, h2 {\n font-family: sans-serif;\n font-style: italic;\n text-align: center;\n background-color: #6b879c;\n color: white;\n width: 100%;\n}\n\nh1 {\n margin-bottom: 2px;\n}\n\nh2 {\n margin-top: -2px;\n margin-bottom: 2px;\n}\n"; - - $log->logLine("Add Cover"); - $fullTitle = "

      " . $bookTitle . "

      \n"; - - $book->setCoverImage("Cover.png", file_get_contents("themes/baggy/img/apple-touch-icon-152.png"), "image/png", $fullTitle); - - $cover = $content_start . '

      ' . _('Produced by wallabag with PHPePub') . '

      '. _('Please open an issue if you have trouble with the display of this E-Book on your device.') . '

      ' . $bookEnd; - - //$book->addChapter("Table of Contents", "TOC.xhtml", NULL, false, EPub::EXTERNAL_REF_IGNORE); - $book->addChapter("Notices", "Cover2.html", $cover); - - $book->buildTOC(); - - foreach ($entries as $entry) { //set tags as subjects - $tags = $this->store->retrieveTagsByEntry($entry['id']); - foreach ($tags as $tag) { - $book->setSubject($tag['value']); - } - - $log->logLine("Set up parameters"); - - $chapter = $content_start . $entry['content'] . $bookEnd; - $book->addChapter($entry['title'], htmlspecialchars($entry['title']) . ".html", $chapter, true, EPub::EXTERNAL_REF_ADD); - $log->logLine("Added chapter " . $entry['title']); - } - - if (DEBUG_POCHE) { - $epuplog = $book->getLog(); - $book->addChapter("Log", "Log.html", $content_start . $log->getLog() . "\n" . $bookEnd); // log generation - } - $book->finalize(); - $zipData = $book->sendBook($bookFileName); - } } diff --git a/inc/poche/Routing.class.php b/inc/poche/Routing.class.php index 8c2f38e3..eb4c4d90 100644 --- a/inc/poche/Routing.class.php +++ b/inc/poche/Routing.class.php @@ -105,20 +105,21 @@ class Routing $this->wallabag->logout(); } elseif (isset($_GET['config'])) { // update password - $this->wallabag->updatePassword(); + $this->wallabag->updatePassword($_POST['password'], $_POST['password_repeat']); } elseif (isset($_GET['newuser'])) { - $this->wallabag->createNewUser(); + $this->wallabag->createNewUser($_POST['newusername'], $_POST['password4newuser']); } elseif (isset($_GET['deluser'])) { - $this->wallabag->deleteUser(); + $this->wallabag->deleteUser($_POST['password4deletinguser']); } elseif (isset($_GET['epub'])) { - $this->wallabag->createEpub(); + $epub = new WallabagEpub($this->wallabag, $_GET['method'], $_GET['id'], $_GET['value']); + $epub->run(); } elseif (isset($_GET['import'])) { $import = $this->wallabag->import(); $tplVars = array_merge($this->vars, $import); } elseif (isset($_GET['download'])) { Tools::downloadDb(); } elseif (isset($_GET['empty-cache'])) { - $this->wallabag->emptyCache(); + Tools::emptyCache(); } elseif (isset($_GET['export'])) { $this->wallabag->export(); } elseif (isset($_GET['updatetheme'])) { @@ -129,7 +130,7 @@ class Routing $this->wallabag->uploadFile(); } elseif (isset($_GET['feed'])) { if (isset($_GET['action']) && $_GET['action'] == 'generate') { - $this->wallabag->generateToken(); + $this->wallabag->updateToken(); } else { $tag_id = (isset($_GET['tag_id']) ? intval($_GET['tag_id']) : 0); diff --git a/inc/poche/Template.class.php b/inc/poche/Template.class.php index 0e09ad64..b686f2ec 100644 --- a/inc/poche/Template.class.php +++ b/inc/poche/Template.class.php @@ -229,8 +229,7 @@ class Template extends Twig_Environment $_SESSION['poche_user']->setConfig($currentConfig); - $this->wallabag->emptyCache(); - + Tools::emptyCache(); Tools::redirect('?view=config'); } } \ No newline at end of file diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php index 762e4446..63137d76 100755 --- a/inc/poche/Tools.class.php +++ b/inc/poche/Tools.class.php @@ -10,11 +10,6 @@ final class Tools { - private function __construct() - { - - } - /** * Initialize PHP environment */ @@ -393,4 +388,40 @@ final class Tools return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; } + /* + * Empty cache folder + */ + public static function emptyCache() + { + $files = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator(CACHE, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ($files as $fileInfo) { + $todo = ($fileInfo->isDir() ? 'rmdir' : 'unlink'); + $todo($fileInfo->getRealPath()); + } + + Tools::logm('empty cache'); + Tools::redirect(); + } + + public static function generateToken() + { + if (ini_get('open_basedir') === '') { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + // alternative to /dev/urandom for Windows + $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); + } else { + $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15); + } + } + else { + $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); + } + + return str_replace('+', '', $token); + } + } diff --git a/inc/poche/WallabagEpub.class.php b/inc/poche/WallabagEpub.class.php new file mode 100644 index 00000000..b81d9bfd --- /dev/null +++ b/inc/poche/WallabagEpub.class.php @@ -0,0 +1,137 @@ + + * @copyright 2013 + * @license http://opensource.org/licenses/MIT see COPYING file + */ + +class WallabagEpub +{ + protected $wallabag; + protected $method; + protected $id; + protected $value; + + public function __construct(Poche $wallabag, $method, $id, $value) + { + $this->wallabag = $wallabag; + $this->method = $method; + $this->id = $id; + $this->value = $value; + } + + /** + * handle ePub + */ + public function run() + { + switch ($this->method) { + case 'id': + $entryID = filter_var($this->id, FILTER_SANITIZE_NUMBER_INT); + $entry = $this->wallabag->store->retrieveOneById($entryID, $this->wallabag->user->getId()); + $entries = array($entry); + $bookTitle = $entry['title']; + $bookFileName = substr($bookTitle, 0, 200); + break; + case 'all': + $entries = $this->wallabag->store->retrieveAll($this->wallabag->user->getId()); + $bookTitle = sprintf(_('All my articles on '), date(_('d.m.y'))); #translatable because each country has it's own date format system + $bookFileName = _('Allarticles') . date(_('dmY')); + break; + case 'tag': + $tag = filter_var($this->value, FILTER_SANITIZE_STRING); + $tags_id = $this->wallabag->store->retrieveAllTags($this->wallabag->user->getId(), $tag); + $tag_id = $tags_id[0]["id"]; // we take the first result, which is supposed to match perfectly. There must be a workaround. + $entries = $this->wallabag->store->retrieveEntriesByTag($tag_id, $this->wallabag->user->getId()); + $bookTitle = sprintf(_('Articles tagged %s'), $tag); + $bookFileName = substr(sprintf(_('Tag %s'), $tag), 0, 200); + break; + case 'category': + $category = filter_var($this->value, FILTER_SANITIZE_STRING); + $entries = $this->wallabag->store->getEntriesByView($category, $this->wallabag->user->getId()); + $bookTitle = sprintf(_('All articles in category %s'), $category); + $bookFileName = substr(sprintf(_('Category %s'), $category), 0, 200); + break; + case 'search': + $search = filter_var($this->value, FILTER_SANITIZE_STRING); + $entries = $this->store->search($search, $this->wallabag->user->getId()); + $bookTitle = sprintf(_('All articles for search %s'), $search); + $bookFileName = substr(sprintf(_('Search %s'), $search), 0, 200); + break; + case 'default': + die(_('Uh, there is a problem while generating epub.')); + } + + $content_start = + "\n" + . "\n" + . "" + . "\n" + . "wallabag articles book\n" + . "\n" + . "\n"; + + $bookEnd = "\n\n"; + + $log = new Logger("wallabag", TRUE); + $fileDir = CACHE; + + $book = new EPub(EPub::BOOK_VERSION_EPUB3, DEBUG_POCHE); + $log->logLine("new EPub()"); + $log->logLine("EPub class version: " . EPub::VERSION); + $log->logLine("EPub Req. Zip version: " . EPub::REQ_ZIP_VERSION); + $log->logLine("Zip version: " . Zip::VERSION); + $log->logLine("getCurrentServerURL: " . $book->getCurrentServerURL()); + $log->logLine("getCurrentPageURL..: " . $book->getCurrentPageURL()); + + $book->setTitle(_('wallabag\'s articles')); + $book->setIdentifier("http://$_SERVER[HTTP_HOST]", EPub::IDENTIFIER_URI); // Could also be the ISBN number, prefered for published books, or a UUID. + //$book->setLanguage("en"); // Not needed, but included for the example, Language is mandatory, but EPub defaults to "en". Use RFC3066 Language codes, such as "en", "da", "fr" etc. + $book->setDescription(_("Some articles saved on my wallabag")); + $book->setAuthor("wallabag", "wallabag"); + $book->setPublisher("wallabag", "wallabag"); // I hope this is a non existant address :) + $book->setDate(time()); // Strictly not needed as the book date defaults to time(). + //$book->setRights("Copyright and licence information specific for the book."); // As this is generated, this _could_ contain the name or licence information of the user who purchased the book, if needed. If this is used that way, the identifier must also be made unique for the book. + $book->setSourceURL("http://$_SERVER[HTTP_HOST]"); + + $book->addDublinCoreMetadata(DublinCore::CONTRIBUTOR, "PHP"); + $book->addDublinCoreMetadata(DublinCore::CONTRIBUTOR, "wallabag"); + + $cssData = "body {\n margin-left: .5em;\n margin-right: .5em;\n text-align: justify;\n}\n\np {\n font-family: serif;\n font-size: 10pt;\n text-align: justify;\n text-indent: 1em;\n margin-top: 0px;\n margin-bottom: 1ex;\n}\n\nh1, h2 {\n font-family: sans-serif;\n font-style: italic;\n text-align: center;\n background-color: #6b879c;\n color: white;\n width: 100%;\n}\n\nh1 {\n margin-bottom: 2px;\n}\n\nh2 {\n margin-top: -2px;\n margin-bottom: 2px;\n}\n"; + + $log->logLine("Add Cover"); + + $fullTitle = "

      " . $bookTitle . "

      \n"; + + $book->setCoverImage("Cover.png", file_get_contents("themes/baggy/img/apple-touch-icon-152.png"), "image/png", $fullTitle); + + $cover = $content_start . '

      ' . _('Produced by wallabag with PHPePub') . '

      '. _('Please open an issue if you have trouble with the display of this E-Book on your device.') . '

      ' . $bookEnd; + + //$book->addChapter("Table of Contents", "TOC.xhtml", NULL, false, EPub::EXTERNAL_REF_IGNORE); + $book->addChapter("Notices", "Cover2.html", $cover); + + $book->buildTOC(); + + foreach ($entries as $entry) { //set tags as subjects + $tags = $this->wallabag->store->retrieveTagsByEntry($entry['id']); + foreach ($tags as $tag) { + $book->setSubject($tag['value']); + } + + $log->logLine("Set up parameters"); + + $chapter = $content_start . $entry['content'] . $bookEnd; + $book->addChapter($entry['title'], htmlspecialchars($entry['title']) . ".html", $chapter, true, EPub::EXTERNAL_REF_ADD); + $log->logLine("Added chapter " . $entry['title']); + } + + if (DEBUG_POCHE) { + $book->addChapter("Log", "Log.html", $content_start . $log->getLog() . "\n" . $bookEnd); // log generation + } + $book->finalize(); + $zipData = $book->sendBook($bookFileName); + } +} \ No newline at end of file diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php index 3eb64df0..b8c487e3 100755 --- a/inc/poche/global.inc.php +++ b/inc/poche/global.inc.php @@ -22,6 +22,7 @@ require_once ROOT . '/vendor/autoload.php'; require_once INCLUDES . '/poche/Template.class.php'; require_once INCLUDES . '/poche/Language.class.php'; require_once INCLUDES . '/poche/Routing.class.php'; +require_once INCLUDES . '/poche/WallabagEpub.class.php'; require_once INCLUDES . '/poche/Poche.class.php'; require_once INCLUDES . '/poche/Database.class.php'; diff --git a/inc/poche/pochePictures.php b/inc/poche/pochePictures.php index 26bf0706..7a914f90 100644 --- a/inc/poche/pochePictures.php +++ b/inc/poche/pochePictures.php @@ -11,11 +11,6 @@ final class Picture { - private function __construct() - { - - } - /** * Changing pictures URL in article content */ -- cgit v1.2.3 From 4e067ceabd705201a16b4c92cf4b23f3b990326c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Sun, 13 Jul 2014 10:15:40 +0200 Subject: updated specific configuration for parsing --- inc/3rdparty/site_config/standard/24ways.org.txt | 8 +- inc/3rdparty/site_config/standard/36kr.com.txt | 8 ++ .../site_config/standard/37signals.com.txt | 8 +- .../site_config/standard/3quarksdaily.com.txt | 16 +-- .../site_config/standard/3voor12.vpro.nl.txt | 0 .../site_config/standard/43folders.com.txt | 4 +- inc/3rdparty/site_config/standard/500px.com.txt | 50 +++---- .../site_config/standard/512pixels.net.txt | 0 inc/3rdparty/site_config/standard/5by5.tv.txt | 14 +- .../site_config/standard/7newsbelize.com.txt | 7 + inc/3rdparty/site_config/standard/944.com.txt | 14 +- inc/3rdparty/site_config/standard/README.md | 38 ++++++ .../standard/aachener-nachrichten.de.txt | 18 +-- .../site_config/standard/aachener-zeitung.de.txt | 18 +-- inc/3rdparty/site_config/standard/abc.es.txt | 10 +- inc/3rdparty/site_config/standard/abc.net.au.txt | 26 ++-- .../site_config/standard/abcnews.go.com.txt | 52 ++++---- .../site_config/standard/accesstoinsight.org.txt | 16 +-- inc/3rdparty/site_config/standard/acidcow.com.txt | 4 +- inc/3rdparty/site_config/standard/acquia.com.txt | 14 +- inc/3rdparty/site_config/standard/acroswing.fr.txt | 6 +- .../site_config/standard/aftenposten.no.txt | 5 + .../site_config/standard/aftonbladet.se.txt | 13 ++ .../site_config/standard/aht.seriouseats.com.txt | 26 ++-- inc/3rdparty/site_config/standard/albayan.ae.txt | 6 + .../site_config/standard/alex.mullr.net.txt | 0 .../site_config/standard/alexduner.com.txt | 4 + .../standard/alexduner.squarespace.com.txt | 4 + .../site_config/standard/alistapart.com.txt | 20 +-- .../site_config/standard/aljazeera.com.txt | 14 +- .../site_config/standard/allrecipes.com.txt | 24 ++-- .../site_config/standard/allthingsd.com.txt | 21 +-- inc/3rdparty/site_config/standard/allyou.com.txt | 12 +- .../site_config/standard/alphabeta.argaam.com.txt | 18 +-- inc/3rdparty/site_config/standard/alriyadh.com.txt | 16 +-- inc/3rdparty/site_config/standard/alseraj.net.txt | 0 inc/3rdparty/site_config/standard/alt1040.com.txt | 0 inc/3rdparty/site_config/standard/alternet.org.txt | 4 + inc/3rdparty/site_config/standard/altfoto.com.txt | 0 .../site_config/standard/alumni.stanford.edu.txt | 16 +-- .../site_config/standard/amandala.com.bz.txt | 6 + inc/3rdparty/site_config/standard/amazon.com.txt | 36 ++--- .../site_config/standard/americandrink.net.txt | 8 +- .../site_config/standard/americascup.com.txt | 18 +-- .../standard/americastestkitchenfeed.com.txt | 6 +- inc/3rdparty/site_config/standard/amptoons.com.txt | 8 ++ .../site_config/standard/anandtech.com.txt | 20 +-- .../site_config/standard/androidpolice.com.txt | 5 + .../site_config/standard/andyrutledge.com.txt | 16 +-- .../standard/annatravelling.wordpress.com.txt | 14 +- .../site_config/standard/applature.com.txt | 34 ++--- inc/3rdparty/site_config/standard/apple.com.txt | 12 +- .../site_config/standard/appledaily.com.tw.txt | 4 + .../site_config/standard/appleinsider.com.txt | 34 +++-- .../site_config/standard/appleweblog.com.txt | 0 .../site_config/standard/archdaily.com.txt | 6 +- .../site_config/standard/archiveofourown.org.txt | 38 +++--- .../site_config/standard/arstechnica.com.txt | 33 ++--- .../site_config/standard/articles.boston.com.txt | 8 +- .../site_config/standard/articles.courant.com.txt | 18 +-- .../standard/articles.washingtonpost.com.txt | 11 ++ inc/3rdparty/site_config/standard/asahi.com.txt | 2 +- inc/3rdparty/site_config/standard/ascarter.net.txt | 6 +- .../site_config/standard/astronews.com.txt | 10 +- inc/3rdparty/site_config/standard/asymco.com.txt | 12 +- inc/3rdparty/site_config/standard/autoblog.com.txt | 8 +- inc/3rdparty/site_config/standard/avclub.com.txt | 4 +- .../site_config/standard/baltimoresun.com.txt | 20 +-- .../standard/baseballprospectus.com.txt | 13 ++ .../site_config/standard/basicthinking.de.txt | 10 +- inc/3rdparty/site_config/standard/bb.is.txt | 22 +-- inc/3rdparty/site_config/standard/bbc.co.uk.txt | 74 ++++++----- .../site_config/standard/bbcgoodfood.com.txt | 16 +++ .../site_config/standard/benoitmaison.org.txt | 28 ++-- .../site_config/standard/berlingske.dk.txt | 2 +- inc/3rdparty/site_config/standard/bernama.com.txt | 5 + inc/3rdparty/site_config/standard/betabeat.com.txt | 0 inc/3rdparty/site_config/standard/betanews.com.txt | 10 +- .../site_config/standard/biography.com.txt | 12 +- inc/3rdparty/site_config/standard/bitelia.com.txt | 0 .../site_config/standard/bizjournals.com.txt | 13 ++ inc/3rdparty/site_config/standard/bjango.com.txt | 10 +- .../site_config/standard/blog.arsln.org.txt | 12 +- .../site_config/standard/blog.asmartbear.com.txt | 10 +- .../site_config/standard/blog.cloudflare.com.txt | 14 +- inc/3rdparty/site_config/standard/blog.fefe.de.txt | 6 +- .../site_config/standard/blog.instagram.com.txt | 18 +-- .../site_config/standard/blog.instapaper.com.txt | 9 ++ .../site_config/standard/blog.jaysalvat.com.txt | 4 +- .../site_config/standard/blog.kaelig.fr.txt | 6 +- .../site_config/standard/blog.naver.com.txt | 8 +- .../site_config/standard/blog.pchome.net.txt | 20 +-- .../site_config/standard/blog.pinboard.in.txt | 8 +- .../site_config/standard/blog.renren.com.txt | 11 ++ .../site_config/standard/blog.sina.com.cn.txt | 50 +++---- inc/3rdparty/site_config/standard/blog.spu.edu.txt | 0 .../site_config/standard/blog.wells.ee.txt | 10 +- .../site_config/standard/blogs.aljazeera.net.txt | 12 +- .../site_config/standard/blogs.forbes.com.txt | 0 .../site_config/standard/blogs.hbr.org.txt | 6 +- .../site_config/standard/blogs.msdn.com.txt | 8 +- .../site_config/standard/blogs.reuters.com.txt | 2 +- .../standard/blogs.scientificamerican.com.txt | 28 ++-- .../standard/blogs.smithsonianmag.com.txt | 26 ++-- .../site_config/standard/blogs.technet.com.txt | 13 +- .../site_config/standard/bluetouff.com.txt | 4 +- .../site_config/standard/boagworld.com.txt | 12 +- .../site_config/standard/boingboing.net.txt | 18 +-- .../site_config/standard/boldizsar.palotas.eu.txt | 2 +- .../site_config/standard/book.douban.com.txt | 8 +- .../site_config/standard/bookforum.com.txt | 34 ++--- .../site_config/standard/borderhouseblog.com.txt | 10 +- .../site_config/standard/bostonglobe.com.txt | 28 ++-- .../site_config/standard/bostonreview.net.txt | 26 ++-- .../site_config/standard/boundlessline.org.txt | 6 +- .../site_config/standard/bowdoinorient.com.txt | 6 + .../site_config/standard/brainfacts.org.txt | 16 +-- inc/3rdparty/site_config/standard/brandeins.de.txt | 10 +- .../standard/brandingstrategyinsider.com.txt | 2 +- .../site_config/standard/brasil.elpais.com.txt | 23 ++++ .../site_config/standard/brettterpstra.com.txt | 6 +- .../site_config/standard/brisbanetimes.com.au.txt | 0 .../site_config/standard/brookings.edu.txt | 22 +-- .../site_config/standard/brooksreview.net.txt | 10 +- inc/3rdparty/site_config/standard/bt.no.txt | 12 ++ inc/3rdparty/site_config/standard/buffed.de.txt | 14 ++ inc/3rdparty/site_config/standard/buquad.com.txt | 12 +- .../standard/business2community.com.txt | 5 + .../site_config/standard/businessinsider.com.txt | 28 ++-- .../site_config/standard/businessnews.com.tn.txt | 22 +-- .../site_config/standard/businessweek.com.txt | 58 ++++---- inc/3rdparty/site_config/standard/buzzfeed.com.txt | 26 ++-- .../site_config/standard/bygonebureau.com.txt | 8 +- inc/3rdparty/site_config/standard/cable.co.uk.txt | 11 ++ .../standard/cardboardconnection.com.txt | 12 +- .../site_config/standard/carpeaqua.com.txt | 8 +- inc/3rdparty/site_config/standard/cars.com.txt | 7 + inc/3rdparty/site_config/standard/catb.org.txt | 10 +- inc/3rdparty/site_config/standard/cbc.ca.txt | 6 +- inc/3rdparty/site_config/standard/cbn.com.txt | 8 ++ inc/3rdparty/site_config/standard/cbsnews.com.txt | 29 ++-- .../site_config/standard/cedarrepublican.com.txt | 2 + inc/3rdparty/site_config/standard/chareidi.org.txt | 0 .../site_config/standard/chinamining.org.txt | 16 +-- inc/3rdparty/site_config/standard/chomsky.info.txt | 8 +- inc/3rdparty/site_config/standard/chrisltd.com.txt | 6 + .../site_config/standard/christianitytoday.com.txt | 22 +-- .../site_config/standard/christianpf.com.txt | 6 +- .../site_config/standard/christies.com.txt | 8 +- .../site_config/standard/chrome.google.com.txt | 14 +- .../site_config/standard/chronicle.com.txt | 30 ++--- .../site_config/standard/ciaosamin.com.txt | 4 + inc/3rdparty/site_config/standard/cicero.de.txt | 62 ++++----- .../site_config/standard/ciperchile.cl.txt | 4 +- inc/3rdparty/site_config/standard/cjr.org.txt | 10 +- .../site_config/standard/classyllama.com.txt | 6 + inc/3rdparty/site_config/standard/clientk.com.txt | 8 +- inc/3rdparty/site_config/standard/clubic.com.txt | 20 +-- inc/3rdparty/site_config/standard/cmswire.com.txt | 8 +- .../site_config/standard/cn.engadget.com.txt | 5 + .../site_config/standard/cn.reuters.com.txt | 5 + inc/3rdparty/site_config/standard/cnet.com.txt | 30 ++--- inc/3rdparty/site_config/standard/cnn.com.txt | 42 +++--- inc/3rdparty/site_config/standard/cnnsi.com.txt | 50 +++---- .../site_config/standard/code.activestate.com.txt | 18 +-- .../site_config/standard/code.fivefilters.org.txt | 1 + .../site_config/standard/code.google.com.txt | 8 +- .../site_config/standard/codeproject.com.txt | 3 + .../site_config/standard/codinghorror.com.txt | 26 ++-- .../site_config/standard/collegehumor.com.txt | 24 ++-- .../standard/communities-dominate.blogs.com.txt | 0 .../standard/community.service-now.com.txt | 12 +- inc/3rdparty/site_config/standard/computer.org.txt | 6 +- .../site_config/standard/computerbase.de.txt | 34 ++--- .../site_config/standard/computerworld.com.txt | 42 +++--- .../site_config/standard/computerworld.dk.txt | 8 +- .../site_config/standard/contemporist.com.txt | 14 +- .../standard/conversaciones.nokia.com.txt | 12 +- inc/3rdparty/site_config/standard/cooper.com.txt | 4 + inc/3rdparty/site_config/standard/core77.com.txt | 10 +- .../site_config/standard/counterpunch.org.txt | 10 +- .../site_config/standard/crazybutable.com.txt | 2 +- .../site_config/standard/crimemagazine.com.txt | 0 .../site_config/standard/crimethinc.com.txt | 2 +- inc/3rdparty/site_config/standard/crn.de.txt | 2 +- .../site_config/standard/csmonitor.com.txt | 32 ++--- .../site_config/standard/csnbayarea.com.txt | 10 +- .../site_config/standard/csnphilly.com.txt | 42 +++--- .../site_config/standard/css-tricks.com.txt | 6 + .../site_config/standard/cucharasonica.com.txt | 0 inc/3rdparty/site_config/standard/cw.com.tw.txt | 14 ++ .../site_config/standard/da.feedsportal.com.txt | 6 +- inc/3rdparty/site_config/standard/dagogtid.no.txt | 4 + inc/3rdparty/site_config/standard/dailydot.com.txt | 4 +- inc/3rdparty/site_config/standard/dailykos.com.txt | 20 +-- .../site_config/standard/dailymail.co.uk.txt | 22 +-- .../site_config/standard/dailystar.com.lb.txt | 6 + inc/3rdparty/site_config/standard/danleech.com.txt | 6 + inc/3rdparty/site_config/standard/dansdata.com.txt | 6 +- .../site_config/standard/dantri.com.vn.txt | 7 + .../site_config/standard/daringfireball.net.txt | 12 +- inc/3rdparty/site_config/standard/datanami.com.txt | 4 +- inc/3rdparty/site_config/standard/dcurt.is.txt | 14 +- .../site_config/standard/defomicron.net.txt | 9 ++ .../site_config/standard/delong.typepad.com.txt | 4 +- .../site_config/standard/democracynow.org.txt | 5 + .../site_config/standard/derstandard.at.txt | 22 +-- .../site_config/standard/designtagebuch.de.txt | 18 +-- .../site_config/standard/desitvforum.net.txt | 8 +- inc/3rdparty/site_config/standard/details.com.txt | 14 +- .../standard/developers.facebook.com.txt | 2 +- .../standard/devlinsangle.blogspot.co.at.txt | 8 +- .../standard/dictionary.reference.com.txt | 12 +- .../site_config/standard/diepresse.com.txt | 8 +- .../standard/digiphoto.techbang.com.txt | 12 +- .../standard/digital-photography-school.com.txt | 10 +- .../site_config/standard/digitalspy.co.uk.txt | 6 +- inc/3rdparty/site_config/standard/dilbert.com.txt | 17 ++- .../site_config/standard/dinamalar.com.txt | 34 ++--- inc/3rdparty/site_config/standard/dn.se.txt | 54 ++++---- .../site_config/standard/dobreprogramy.pl.txt | 6 + inc/3rdparty/site_config/standard/doctac.com.txt | 12 +- inc/3rdparty/site_config/standard/domusweb.it.txt | 38 +++--- inc/3rdparty/site_config/standard/dou.ua.txt | 12 +- inc/3rdparty/site_config/standard/douban.com.txt | 40 +++--- inc/3rdparty/site_config/standard/dpreview.com.txt | 14 +- inc/3rdparty/site_config/standard/dr.dk.txt | 14 +- .../site_config/standard/dramasonline.com.txt | 18 +-- inc/3rdparty/site_config/standard/drdobbs.com.txt | 0 inc/3rdparty/site_config/standard/drive2.ru.txt | 20 +-- inc/3rdparty/site_config/standard/dropbox.com.txt | 1 + inc/3rdparty/site_config/standard/drupal.org.txt | 12 +- .../standard/dukebasketballreport.com.txt | 18 +-- .../site_config/standard/dushumashang.com.txt | 17 +++ inc/3rdparty/site_config/standard/dvice.com.txt | 14 +- .../site_config/standard/eamesinerudition.com.txt | 12 +- .../site_config/standard/eandt.theiet.org.txt | 12 +- .../site_config/standard/eastoftheweb.com.txt | 32 ++--- inc/3rdparty/site_config/standard/ebay.com.txt | 8 +- inc/3rdparty/site_config/standard/ecetia.com.txt | 0 .../site_config/standard/econlog.econlib.org.txt | 8 +- .../standard/economia.estadao.com.br.txt | 10 +- .../site_config/standard/economist.com.txt | 16 +-- .../site_config/standard/edge-online.com.txt | 24 ++-- inc/3rdparty/site_config/standard/edge.org.txt | 8 +- .../standard/edition.channel5belize.com.txt | 9 ++ .../site_config/standard/edition.cnn.com.txt | 25 ++-- inc/3rdparty/site_config/standard/eetimes.com.txt | 8 ++ inc/3rdparty/site_config/standard/ekultura.hu.txt | 18 +-- inc/3rdparty/site_config/standard/elance.com.txt | 2 +- .../standard/elderscrollsonline.com.txt | 22 +++ .../site_config/standard/elektroniknet.de.txt | 50 +++---- .../site_config/standard/elmalpensante.com.txt | 4 +- inc/3rdparty/site_config/standard/elpais.com.txt | 40 +++--- .../site_config/standard/emaratalyoum.com.txt | 7 + .../site_config/standard/en.espnf1.com.txt | 16 +-- inc/3rdparty/site_config/standard/engadget.com.txt | 12 +- .../standard/engineering.tumblr.com.txt | 10 +- .../site_config/standard/english.aljazeera.net.txt | 12 +- inc/3rdparty/site_config/standard/enikos.gr.txt | 16 +-- .../standard/entertainment.timesonline.co.uk.txt | 16 +-- inc/3rdparty/site_config/standard/ericsuh.com.txt | 4 + inc/3rdparty/site_config/standard/es.hu.txt | 18 +-- .../site_config/standard/escapistmagazine.com.txt | 8 +- inc/3rdparty/site_config/standard/espn.go.com.txt | 20 +-- inc/3rdparty/site_config/standard/esquire.com.txt | 21 +-- .../standard/essentialpublicradio.org.txt | 8 +- inc/3rdparty/site_config/standard/etc.se.txt | 10 +- .../site_config/standard/eternabuenosaires.com.txt | 0 .../site_config/standard/eurogamer.net.txt | 14 +- inc/3rdparty/site_config/standard/evo.co.uk.txt | 18 +-- inc/3rdparty/site_config/standard/expressen.se.txt | 19 +-- .../site_config/standard/extracine.com.txt | 0 inc/3rdparty/site_config/standard/f1actual.com.txt | 0 inc/3rdparty/site_config/standard/facebook.com.txt | 5 + inc/3rdparty/site_config/standard/facta.co.jp.txt | 2 +- inc/3rdparty/site_config/standard/falter.at.txt | 32 ++--- .../site_config/standard/fanfiction.net.txt | 8 +- .../site_config/standard/fastcompany.com.txt | 30 ++--- inc/3rdparty/site_config/standard/faz.net.txt | 66 ++++----- inc/3rdparty/site_config/standard/fertigung.de.txt | 23 ++++ .../site_config/standard/fictionpress.com.txt | 6 +- inc/3rdparty/site_config/standard/ficwad.com.txt | 20 +-- .../site_config/standard/finance.yahoo.com.txt | 22 +-- .../standard/findtheswagger.tumblr.com.txt | 16 +-- .../site_config/standard/firstthings.com.txt | 12 +- .../site_config/standard/fivechapters.com.txt | 0 .../site_config/standard/fivefilters.org.txt | 0 .../site_config/standard/fivethirtyeight.com.txt | 10 +- .../standard/flyingmachinestudios.com.txt | 2 + inc/3rdparty/site_config/standard/fm4.orf.at.txt | 10 +- inc/3rdparty/site_config/standard/fnal.gov.txt | 26 ++-- inc/3rdparty/site_config/standard/focus.de.txt | 34 ++--- inc/3rdparty/site_config/standard/folklore.org.txt | 4 + inc/3rdparty/site_config/standard/food.com.txt | 11 ++ inc/3rdparty/site_config/standard/fool.com.txt | 20 +-- inc/3rdparty/site_config/standard/forbes.com.txt | 43 +++--- .../site_config/standard/foreignaffairs.com.txt | 34 +++++ .../site_config/standard/foreignpolicy.com.txt | 26 ++-- inc/3rdparty/site_config/standard/forsvaret.no.txt | 14 +- inc/3rdparty/site_config/standard/foxnews.com.txt | 16 +-- .../site_config/standard/freelancer.com.txt | 2 +- .../site_config/standard/freytag-film.com.txt | 6 +- inc/3rdparty/site_config/standard/fria.nu.txt | 8 ++ .../site_config/standard/friatidningen.se.txt | 7 + .../site_config/standard/friendskorner.com.txt | 20 +-- inc/3rdparty/site_config/standard/ft.com.txt | 6 +- .../site_config/standard/ftchinese.com.txt | 18 +++ inc/3rdparty/site_config/standard/ftd.de.txt | 6 +- inc/3rdparty/site_config/standard/fubiz.net.txt | 2 +- .../site_config/standard/futurezone.at.txt | 18 +-- .../site_config/standard/gamasutra.com.txt | 36 ++--- inc/3rdparty/site_config/standard/gameblog.fr.txt | 18 +-- .../site_config/standard/gamechurch.com.txt | 10 ++ inc/3rdparty/site_config/standard/gamer.no.txt | 11 ++ .../site_config/standard/gamereactor.no.txt | 11 ++ .../site_config/standard/garythink.com.txt | 4 +- .../site_config/standard/gasteroprod.com.txt | 4 +- .../site_config/standard/gatopardo.com.txt | 12 +- inc/3rdparty/site_config/standard/gawker.com.txt | 10 +- .../site_config/standard/geeksofdoom.com.txt | 2 +- inc/3rdparty/site_config/standard/geenstijl.nl.txt | 2 +- inc/3rdparty/site_config/standard/getnews.jp.txt | 2 +- .../site_config/standard/giantbomb.com.txt | 18 +-- inc/3rdparty/site_config/standard/giga.de.txt | 36 ++--- inc/3rdparty/site_config/standard/gigaom.com.txt | 29 ++-- inc/3rdparty/site_config/standard/gihyo.jp.txt | 2 +- .../site_config/standard/gist.github.com.txt | 10 +- .../standard/givemesomethingtoread.com.txt | 2 +- .../site_config/standard/gizmodo.co.uk.txt | 12 +- inc/3rdparty/site_config/standard/gizmodo.com.txt | 18 ++- .../site_config/standard/gizmodo.uol.com.br.txt | 6 + .../site_config/standard/gizmologia.com.txt | 0 inc/3rdparty/site_config/standard/gizmovil.com.txt | 0 inc/3rdparty/site_config/standard/global.txt | 22 ++- .../site_config/standard/globalissues.org.txt | 28 ++-- .../standard/globoesporte.globo.com.txt | 25 ++++ .../site_config/standard/gloswielkopolski.pl.txt | 8 ++ inc/3rdparty/site_config/standard/goal.com.txt | 30 ++--- inc/3rdparty/site_config/standard/golem.de.txt | 48 +++---- inc/3rdparty/site_config/standard/good.is.txt | 6 +- inc/3rdparty/site_config/standard/goodfil.ms.txt | 2 + inc/3rdparty/site_config/standard/gossip-tv.gr.txt | 26 ++-- .../site_config/standard/goteborgsfria.se.txt | 7 + .../site_config/standard/gothamist.com.txt | 10 +- .../site_config/standard/gotomanager.com.txt | 38 +++--- inc/3rdparty/site_config/standard/gov.ky.txt | 4 + inc/3rdparty/site_config/standard/gp.se.txt | 11 ++ inc/3rdparty/site_config/standard/gq.com.txt | 14 +- .../site_config/standard/grantland.com.txt | 38 +++--- .../standard/greatergreaterwashington.org.txt | 18 +-- .../site_config/standard/groups.drupal.org.txt | 6 +- inc/3rdparty/site_config/standard/gulfnews.com.txt | 8 +- inc/3rdparty/site_config/standard/guokr.com.txt | 42 +++--- inc/3rdparty/site_config/standard/haberler.com.txt | 6 +- inc/3rdparty/site_config/standard/hackmake.org.txt | 7 + .../site_config/standard/halo.bungie.org.txt | 6 +- .../standard/hammers.theoffside.com.txt | 10 +- .../site_config/standard/handelsblatt.com.txt | 31 +++++ .../site_config/standard/hanselman.com.txt | 4 +- inc/3rdparty/site_config/standard/hardware.fr.txt | 8 +- inc/3rdparty/site_config/standard/hardware.no.txt | 16 +++ inc/3rdparty/site_config/standard/hbr.org.txt | 13 +- .../site_config/standard/headrush.typepad.com.txt | 14 ++ .../site_config/standard/heise-online.mobi.txt | 2 +- inc/3rdparty/site_config/standard/heise.de.txt | 12 +- inc/3rdparty/site_config/standard/hemmings.com.txt | 9 ++ inc/3rdparty/site_config/standard/heroturko.me.txt | 6 + inc/3rdparty/site_config/standard/hespress.com.txt | 12 +- inc/3rdparty/site_config/standard/hiamag.com.txt | 3 + .../site_config/standard/highscalability.com.txt | 2 +- inc/3rdparty/site_config/standard/hiperpop.com.txt | 0 .../site_config/standard/hiphopleeft.nl.txt | 4 +- .../site_config/standard/historytoday.com.txt | 18 +-- inc/3rdparty/site_config/standard/hmercer.com.txt | 6 +- .../site_config/standard/hollywoodlife.com.txt | 22 +++ .../site_config/standard/hometheaterreview.com.txt | 4 +- .../site_config/standard/hosted.ap.org.txt | 8 +- .../site_config/standard/howtogeek.com.txt | 11 ++ inc/3rdparty/site_config/standard/hs.fi.txt | 2 +- inc/3rdparty/site_config/standard/ht.ly.txt | 4 +- .../site_config/standard/huffingtonpost.com.txt | 37 +++--- .../site_config/standard/humantransit.org.txt | 6 +- .../site_config/standard/hurriyet.com.tr.txt | 12 +- inc/3rdparty/site_config/standard/hvg.hu.txt | 14 +- .../site_config/standard/hypebeast.com.txt | 18 +-- .../site_config/standard/icannabis.tumblr.com.txt | 9 ++ .../site_config/standard/idealog.co.nz.txt | 12 ++ .../site_config/standard/idlewords.com.txt | 10 +- .../site_config/standard/igeneration.fr.txt | 6 +- .../standard/ignoredbydinosaurs.com.txt | 10 +- inc/3rdparty/site_config/standard/ilounge.com.txt | 22 +-- .../site_config/standard/ilyabirman.ru.txt | 6 +- inc/3rdparty/site_config/standard/inc.com.txt | 40 +++--- .../site_config/standard/independent.co.uk.txt | 14 +- .../site_config/standard/indiatimes.com.txt | 10 +- .../site_config/standard/inessential.com.txt | 6 +- .../site_config/standard/info.abril.com.br.txt | 4 +- inc/3rdparty/site_config/standard/infoq.com.txt | 24 ++-- .../site_config/standard/informador.com.mx.txt | 14 +- .../site_config/standard/information.dk.txt | 10 +- .../standard/informationarchitects.net.txt | 16 +-- .../standard/informationclearinghouse.info.txt | 10 +- inc/3rdparty/site_config/standard/informit.com.txt | 12 +- .../site_config/standard/infoworld.com.txt | 20 +-- inc/3rdparty/site_config/standard/infzm.com.txt | 14 +- .../site_config/standard/inhabitat.com.txt | 12 +- inc/3rdparty/site_config/standard/instagr.am.txt | 8 +- .../site_config/standard/interest.co.nz.txt | 0 .../site_config/standard/iolanguage.com.txt | 0 inc/3rdparty/site_config/standard/ipadclub.nl.txt | 10 +- .../site_config/standard/ipadplanet.nl.txt | 10 +- .../site_config/standard/iphoneclub.nl.txt | 12 +- .../site_config/standard/iphonehacks.com.txt | 16 +-- .../site_config/standard/iplaysoft.com.txt | 0 inc/3rdparty/site_config/standard/isource.com.txt | 8 +- inc/3rdparty/site_config/standard/itavisen.no.txt | 8 +- .../site_config/standard/itmedia.co.jp.txt | 8 ++ .../site_config/standard/itstactical.com.txt | 20 +-- inc/3rdparty/site_config/standard/itwire.com.txt | 5 + inc/3rdparty/site_config/standard/itworld.com.txt | 6 +- inc/3rdparty/site_config/standard/izismile.com.txt | 6 +- inc/3rdparty/site_config/standard/jalopnik.com.txt | 0 inc/3rdparty/site_config/standard/jandan.net.txt | 8 +- .../site_config/standard/jetzt.sueddeutsche.de.txt | 40 +++--- inc/3rdparty/site_config/standard/jjahnke.net.txt | 4 +- .../site_config/standard/jobbank.gc.ca.txt | 8 +- .../site_config/standard/joelonsoftware.com.txt | 38 +++--- inc/3rdparty/site_config/standard/jouire.com.txt | 2 +- inc/3rdparty/site_config/standard/joystiq.com.txt | 12 +- .../standard/juedische-allgemeine.de.txt | 36 ++--- inc/3rdparty/site_config/standard/juppy.org.txt | 12 +- inc/3rdparty/site_config/standard/kachestvo.ru.txt | 2 +- .../site_config/standard/kachiblog.com.txt | 7 + .../site_config/standard/kathimerini.gr.txt | 4 + .../site_config/standard/kenrockwell.com.txt | 10 +- inc/3rdparty/site_config/standard/kicker.de.txt | 38 +++--- .../site_config/standard/kickstarter.com.txt | 10 +- .../site_config/standard/kingarthurflour.com.txt | 4 +- inc/3rdparty/site_config/standard/kotaku.com.txt | 0 inc/3rdparty/site_config/standard/kottke.org.txt | 10 +- .../site_config/standard/kumailplus.com.txt | 2 +- inc/3rdparty/site_config/standard/kumb.com.txt | 16 +-- .../site_config/standard/kwerfeldein.de.txt | 14 +- .../site_config/standard/landetsfria.se.txt | 7 + .../site_config/standard/laphamsquarterly.org.txt | 24 ++-- .../site_config/standard/laprensagrafica.com.txt | 2 +- .../site_config/standard/laquadrature.net.txt | 18 +-- .../site_config/standard/lareviewofbooks.org.txt | 24 ++-- inc/3rdparty/site_config/standard/latimes.com.txt | 18 +-- .../site_config/standard/laughingsquid.com.txt | 2 +- inc/3rdparty/site_config/standard/leancrew.com.txt | 14 +- inc/3rdparty/site_config/standard/lefigaro.fr.txt | 14 +- inc/3rdparty/site_config/standard/lemonde.fr.txt | 31 +++-- .../site_config/standard/lesnumeriques.com.txt | 16 +-- inc/3rdparty/site_config/standard/letemps.ch.txt | 2 +- inc/3rdparty/site_config/standard/libcom.org.txt | 7 + .../site_config/standard/lifeandculture.fr.txt | 2 +- .../site_config/standard/lifehacker.com.txt | 89 +++++++------ .../standard/lifestyle.inquirer.net.txt | 7 + .../site_config/standard/lifeweek.com.cn.txt | 23 ++++ inc/3rdparty/site_config/standard/linkedin.com.txt | 0 .../site_config/standard/livescience.com.txt | 20 +++ inc/3rdparty/site_config/standard/longform.org.txt | 2 +- .../site_config/standard/loopinsight.com.txt | 16 +-- .../site_config/standard/lostgarden.com.txt | 2 +- inc/3rdparty/site_config/standard/lovefm.com.txt | 6 + .../site_config/standard/lovetv.com.bz.txt | 9 ++ inc/3rdparty/site_config/standard/lrb.co.uk.txt | 20 +-- .../standard/luminous-landscape.com.txt | 8 +- inc/3rdparty/site_config/standard/luxuo.com.txt | 4 + inc/3rdparty/site_config/standard/m.bbc.co.uk.txt | 12 +- inc/3rdparty/site_config/standard/m.douban.com.txt | 13 ++ .../site_config/standard/m.vanityfair.com.txt | 11 ++ inc/3rdparty/site_config/standard/mac4ever.com.txt | 6 +- .../site_config/standard/macdrifter.com.txt | 2 +- .../standard/macformat.techradar.com.txt | 14 +- .../site_config/standard/macgeneration.com.txt | 6 +- .../site_config/standard/macmagazine.com.br.txt | 38 +++--- .../site_config/standard/macrumors.com.txt | 20 +-- .../site_config/standard/macstories.net.txt | 14 +- .../site_config/standard/mactalk.com.au.txt | 4 +- .../site_config/standard/mactechnews.de.txt | 2 +- inc/3rdparty/site_config/standard/macworld.com.txt | 46 +++---- inc/3rdparty/site_config/standard/mainichi.jp.txt | 2 +- inc/3rdparty/site_config/standard/mainpost.de.txt | 52 ++++---- .../site_config/standard/makeuseof.com.txt | 10 +- .../site_config/standard/manager.co.th.txt | 26 ++++ inc/3rdparty/site_config/standard/marco.org.txt | 14 +- .../site_config/standard/marksdailyapple.com.txt | 0 .../site_config/standard/martinfowler.com.txt | 12 +- inc/3rdparty/site_config/standard/mashable.com.txt | 13 +- .../site_config/standard/matt.might.net.txt | 5 + .../site_config/standard/mattcutts.com.txt | 0 inc/3rdparty/site_config/standard/mbl.is.txt | 0 .../site_config/standard/medialens.org.txt | 4 +- inc/3rdparty/site_config/standard/medium.com.txt | 7 + inc/3rdparty/site_config/standard/megamp3.eu.txt | 8 ++ .../site_config/standard/menshealth.com.txt | 30 ++--- .../site_config/standard/metafilter.com.txt | 8 ++ .../site_config/standard/mforum.cari.com.my.txt | 6 + inc/3rdparty/site_config/standard/mikeash.com.txt | 6 +- .../site_config/standard/mikeindustries.com.txt | 14 +- .../standard/minnesota.publicradio.org.txt | 16 +-- inc/3rdparty/site_config/standard/minnpost.com.txt | 6 +- .../site_config/standard/mirrorfootball.co.uk.txt | 2 +- inc/3rdparty/site_config/standard/mises.org.txt | 6 +- inc/3rdparty/site_config/standard/mlb.mlb.com.txt | 26 ++-- .../site_config/standard/mlb.sbnation.com.txt | 24 ++-- .../site_config/standard/mlssoccer.com.txt | 8 +- .../site_config/standard/mmo-champion.com.txt | 6 +- inc/3rdparty/site_config/standard/mnn.com.txt | 18 +-- inc/3rdparty/site_config/standard/mno.hu.txt | 24 ++-- .../site_config/standard/mobile.nytimes.com.txt | 4 + .../site_config/standard/mobile.slate.com.txt | 6 +- .../standard/mobileopportunity.blogspot.com.txt | 18 +-- .../site_config/standard/modernghana.com.txt | 14 +- .../site_config/standard/money.cnn.com.txt | 46 +++---- .../site_config/standard/monkeyzen.com.txt | 0 inc/3rdparty/site_config/standard/moonsault.de.txt | 22 +-- .../standard/moreintelligentlife.com.txt | 12 +- .../site_config/standard/motherboard.vice.com.txt | 8 +- .../site_config/standard/mothering.com.txt | 10 +- .../site_config/standard/motherjones.com.txt | 26 ++-- .../site_config/standard/motorfull.com.txt | 0 .../site_config/standard/movie.douban.com.txt | 12 ++ .../site_config/standard/msdn.microsoft.com.txt | 2 +- .../site_config/standard/msnbc.msn.com.txt | 38 +++--- .../site_config/standard/myfoxatlanta.com.txt | 5 + .../site_config/standard/myfoxboston.com.txt | 6 +- .../site_config/standard/myrecipes.com.txt | 22 +-- inc/3rdparty/site_config/standard/narenji.ir.txt | 0 inc/3rdparty/site_config/standard/nasa.gov.txt | 12 +- inc/3rdparty/site_config/standard/nbweekly.com.txt | 16 +-- inc/3rdparty/site_config/standard/neh.gov.txt | 30 ++--- inc/3rdparty/site_config/standard/neomoney.co.txt | 2 +- .../site_config/standard/net-security.org.txt | 10 +- .../site_config/standard/netmagazine.com.txt | 28 ++-- .../site_config/standard/netzpolitik.org.txt | 8 +- .../site_config/standard/newleftproject.org.txt | 3 + .../site_config/standard/newmatilda.com.txt | 14 +- .../site_config/standard/newrepublic.com.txt | 8 ++ .../site_config/standard/news-gazette.com.txt | 12 +- .../site_config/standard/news.cnet.com.txt | 20 +-- .../site_config/standard/news.detik.com.txt | 12 +- .../site_config/standard/news.kanaloco.jp.txt | 14 +- .../site_config/standard/news.mynavi.jp.txt | 18 +-- inc/3rdparty/site_config/standard/news.orf.at.txt | 18 +-- .../site_config/standard/news.rambler.ru.txt | 14 +- .../site_config/standard/news.techmeme.com.txt | 6 +- .../site_config/standard/news.yahoo.com.txt | 20 +-- .../site_config/standard/news.ycombinator.com.txt | 2 +- inc/3rdparty/site_config/standard/news.zing.vn.txt | 3 + inc/3rdparty/site_config/standard/news247.gr.txt | 6 + inc/3rdparty/site_config/standard/newsbomb.gr.txt | 16 +-- inc/3rdparty/site_config/standard/newsle.com.txt | 0 inc/3rdparty/site_config/standard/newsmill.se.txt | 22 +-- .../site_config/standard/newsunspun.org.txt | 18 +-- inc/3rdparty/site_config/standard/newsweek.com.txt | 6 + inc/3rdparty/site_config/standard/newswise.com.txt | 17 +++ .../site_config/standard/newyorker.com.txt | 21 +-- inc/3rdparty/site_config/standard/next-gen.biz.txt | 28 ++-- inc/3rdparty/site_config/standard/nfl.com.txt | 18 +-- .../standard/ngm.nationalgeographic.com.txt | 10 +- inc/3rdparty/site_config/standard/nhk.or.jp.txt | 0 .../standard/nintendoworldreport.com.txt | 22 +-- .../site_config/standard/nojesguiden.se.txt | 6 +- .../site_config/standard/northumberlandview.ca.txt | 20 +-- inc/3rdparty/site_config/standard/nosalty.hu.txt | 6 + .../site_config/standard/nplusonemag.com.txt | 8 +- inc/3rdparty/site_config/standard/npr.org.txt | 66 ++++----- inc/3rdparty/site_config/standard/nybooks.com.txt | 24 ++-- inc/3rdparty/site_config/standard/nymag.com.txt | 14 +- inc/3rdparty/site_config/standard/nyteknik.se.txt | 12 +- inc/3rdparty/site_config/standard/nytimes.com.txt | 85 +++++++----- inc/3rdparty/site_config/standard/nzz.ch.txt | 22 +-- inc/3rdparty/site_config/standard/observer.com.txt | 12 +- inc/3rdparty/site_config/standard/off.net.mk.txt | 10 +- inc/3rdparty/site_config/standard/omaha.com.txt | 0 inc/3rdparty/site_config/standard/omiliya.org.txt | 14 +- inc/3rdparty/site_config/standard/on.net.mk.txt | 6 +- .../site_config/standard/online.wsj.com.txt | 48 +++---- .../site_config/standard/onlinewelten.com.txt | 0 .../site_config/standard/onstartups.com.txt | 0 .../site_config/standard/ontologicalgeek.com.txt | 8 ++ .../site_config/standard/opensource.org.txt | 0 .../site_config/standard/openthemagazine.com.txt | 4 +- inc/3rdparty/site_config/standard/openwebx.org.txt | 6 +- inc/3rdparty/site_config/standard/orf.at.txt | 18 +-- inc/3rdparty/site_config/standard/origo.hu.txt | 32 ++--- inc/3rdparty/site_config/standard/oschina.net.txt | 3 + .../site_config/standard/pakistantvdekho.com.txt | 20 +-- inc/3rdparty/site_config/standard/pakmedia.tv.txt | 17 +++ inc/3rdparty/site_config/standard/pandagon.net.txt | 6 +- .../site_config/standard/pandodaily.com.txt | 6 +- inc/3rdparty/site_config/standard/panic.com.txt | 2 +- .../site_config/standard/papodehomem.com.br.txt | 6 + .../site_config/standard/parislemon.com.txt | 8 +- .../site_config/standard/parliament.uk.txt | 2 +- inc/3rdparty/site_config/standard/pastebin.com.txt | 8 +- .../standard/pastepad.fivefilters.org.txt | 6 +- inc/3rdparty/site_config/standard/pathawks.com.txt | 12 +- inc/3rdparty/site_config/standard/pcast.me.txt | 0 inc/3rdparty/site_config/standard/pcmag.com.txt | 16 +-- inc/3rdparty/site_config/standard/pcworld.com.txt | 36 ++--- .../site_config/standard/penny-arcade.com.txt | 44 +++--- .../site_config/standard/pentaxforums.com.txt | 0 .../standard/philadelphiaeagles.com.txt | 8 +- inc/3rdparty/site_config/standard/philly.com.txt | 16 +-- .../site_config/standard/photo.tutsplus.com.txt | 8 +- inc/3rdparty/site_config/standard/php.net.txt | 8 +- .../site_config/standard/physicstoday.org.txt | 10 +- .../site_config/standard/pinterest.com.txt | 5 + .../site_config/standard/pitchfork.com.txt | 28 ++-- inc/3rdparty/site_config/standard/pittnews.com.txt | 12 +- .../standard/pittsburgh.pirates.mlb.com.txt | 26 ++-- .../site_config/standard/pittsburghlive.com.txt | 10 +- .../standard/pittsburghmagazine.com.txt | 12 +- .../standard/pittsburghpanthers.com.txt | 4 +- .../site_config/standard/pittscriptblog.com.txt | 12 +- .../site_config/standard/planetvita.de.txt | 5 + inc/3rdparty/site_config/standard/playboy.com.txt | 8 +- .../site_config/standard/plus.google.com.txt | 32 ++--- .../site_config/standard/plzkthxbai.com.txt | 4 +- .../standard/pogue.blogs.nytimes.com.txt | 4 +- inc/3rdparty/site_config/standard/politico.com.txt | 26 ++-- .../site_config/standard/politifact.com.txt | 4 +- inc/3rdparty/site_config/standard/politiken.dk.txt | 22 +-- inc/3rdparty/site_config/standard/polygon.com.txt | 34 +++++ .../site_config/standard/popularmechanics.com.txt | 12 +- .../site_config/standard/portertech.ca.txt | 3 + .../site_config/standard/positioningmag.com.txt | 34 ++--- .../site_config/standard/post-gazette.com.txt | 50 +++---- inc/3rdparty/site_config/standard/posta.com.tr.txt | 26 ++-- inc/3rdparty/site_config/standard/prb.org.txt | 12 +- .../site_config/standard/prog21.dadgum.com.txt | 14 +- inc/3rdparty/site_config/standard/prolost.com.txt | 4 +- .../site_config/standard/propublica.org.txt | 18 +-- inc/3rdparty/site_config/standard/prosa.dk.txt | 4 +- .../standard/prospectmagazine.co.uk.txt | 50 +++---- .../site_config/standard/protothema.gr.txt | 6 + .../site_config/standard/psychologytoday.com.txt | 14 +- .../standard/publications.parliament.uk.txt | 4 +- inc/3rdparty/site_config/standard/publico.pt.txt | 12 ++ .../site_config/standard/purpleplanetmedia.com.txt | 4 +- inc/3rdparty/site_config/standard/qctimes.com.txt | 5 + .../site_config/standard/quantumdiaries.org.txt | 24 ++-- inc/3rdparty/site_config/standard/queerty.com.txt | 2 +- inc/3rdparty/site_config/standard/quepasa.cl.txt | 8 +- inc/3rdparty/site_config/standard/quora.com.txt | 30 ++--- .../site_config/standard/racjonalista.pl.txt | 5 + .../site_config/standard/radar.oreilly.com.txt | 2 +- .../site_config/standard/radionz.co.nz.txt | 2 +- .../site_config/standard/randsinrepose.com.txt | 20 +-- .../site_config/standard/readability.com.txt | 2 +- .../site_config/standard/readwriteweb.com.txt | 14 +- inc/3rdparty/site_config/standard/real.gr.txt | 4 +- inc/3rdparty/site_config/standard/recipe.com.txt | 18 +-- .../site_config/standard/red-hot-girls.com.txt | 8 +- inc/3rdparty/site_config/standard/reddit.com.txt | 36 ++--- .../site_config/standard/redmondpie.com.txt | 24 ++-- .../site_config/standard/redtape.msnbc.msn.com.txt | 36 ++--- inc/3rdparty/site_config/standard/reflets.info.txt | 6 +- .../site_config/standard/renenekuda.cz.txt | 2 +- inc/3rdparty/site_config/standard/resume.se.txt | 9 ++ .../site_config/standard/retrieverweekly.com.txt | 8 +- inc/3rdparty/site_config/standard/reuters.com.txt | 18 +-- .../standard/revistapiaui.estadao.com.br.txt | 16 +-- .../site_config/standard/rezeptwelt.de.txt | 5 + .../standard/richardmuscat.wordpress.com.txt | 6 +- .../site_config/standard/ritemail.blogspot.com.txt | 8 +- inc/3rdparty/site_config/standard/ritholtz.com.txt | 5 + .../standard/robertsspaceindustries.com.txt | 4 + .../site_config/standard/robots.thoughtbot.com.txt | 5 + .../site_config/standard/rockpapershotgun.com.txt | 12 +- .../site_config/standard/rodrigo.sharpcube.com.txt | 10 +- .../site_config/standard/rogerebert.com.txt | 12 +- .../site_config/standard/rolfinjapan.nl.txt | 10 +- .../site_config/standard/rollingstone.com.txt | 0 .../site_config/standard/rottentomatoes.com.txt | 18 +-- .../site_config/standard/roughtype.com.txt | 6 +- inc/3rdparty/site_config/standard/roy.gbiv.com.txt | 0 inc/3rdparty/site_config/standard/rpgsite.net.txt | 6 +- inc/3rdparty/site_config/standard/rubysfera.pl.txt | 14 +- inc/3rdparty/site_config/standard/ruhlman.com.txt | 8 +- inc/3rdparty/site_config/standard/ruttloff.org.txt | 2 +- inc/3rdparty/site_config/standard/salon.com.txt | 20 +-- inc/3rdparty/site_config/standard/salzburg.com.txt | 10 +- .../site_config/standard/sanpedrosun.com.txt | 10 ++ .../site_config/standard/saveyourself.ca.txt | 46 +++---- inc/3rdparty/site_config/standard/sayidaty.net.txt | 4 + inc/3rdparty/site_config/standard/sbnation.com.txt | 52 ++++---- inc/3rdparty/site_config/standard/schneier.com.txt | 48 +++---- .../site_config/standard/science.orf.at.txt | 18 +-- .../site_config/standard/scienceblogs.de.txt | 20 +-- .../site_config/standard/scienceticker.info.txt | 18 +-- .../standard/scientificamerican.com.txt | 48 +++---- inc/3rdparty/site_config/standard/scilogs.de.txt | 15 +++ .../site_config/standard/scotusblog.com.txt | 12 +- inc/3rdparty/site_config/standard/scraplab.net.txt | 2 +- .../site_config/standard/scripting.com.txt | 12 +- .../site_config/standard/sct.temple.edu.txt | 6 +- .../standard/searchenginejournal.com.txt | 5 + .../site_config/standard/searchengineland.com.txt | 36 ++--- .../standard/seattletransitblog.com.txt | 0 inc/3rdparty/site_config/standard/sebbo.net.txt | 4 +- .../site_config/standard/select.yeeyan.org.txt | 18 +++ .../site_config/standard/seriouseats.com.txt | 26 ++-- .../site_config/standard/sf.curbed.com.txt | 10 +- inc/3rdparty/site_config/standard/sf.eater.com.txt | 10 +- inc/3rdparty/site_config/standard/sfgate.com.txt | 20 +-- inc/3rdparty/site_config/standard/sfweekly.com.txt | 2 +- inc/3rdparty/site_config/standard/shabayek.com.txt | 2 +- .../site_config/standard/shawnblanc.net.txt | 20 +-- .../site_config/standard/shifteleven.com.txt | 8 +- inc/3rdparty/site_config/standard/siasat.pk.txt | 20 +-- .../site_config/standard/signalscv.com.txt | 10 ++ .../site_config/standard/simonwillison.net.txt | 6 +- .../singaporeanstocksinvestor.blogspot.com.txt | 6 +- .../site_config/standard/singularityhub.com.txt | 0 .../site_config/standard/sintagoulis.gr.txt | 10 +- inc/3rdparty/site_config/standard/sivers.org.txt | 6 + .../site_config/standard/skanesfria.se.txt | 7 + .../site_config/standard/slashfilm.com.txt | 28 ++-- inc/3rdparty/site_config/standard/slate.com.txt | 36 ++--- .../site_config/standard/slice.seriouseats.com.txt | 26 ++-- .../site_config/standard/slog.thestranger.com.txt | 4 +- .../site_config/standard/smartinvestor.de.txt | 6 +- inc/3rdparty/site_config/standard/sme.sk.txt | 2 +- .../site_config/standard/smithsonianmag.com.txt | 36 ++--- .../site_config/standard/smokingapples.com.txt | 8 +- .../site_config/standard/somethingawful.com.txt | 17 +++ .../site_config/standard/songshuhui.net.txt | 7 + .../site_config/standard/sourcebooks.com.txt | 6 +- .../site_config/standard/spectator.co.uk.txt | 10 +- .../site_config/standard/spectrum.ieee.org.txt | 2 +- inc/3rdparty/site_config/standard/speirs.org.txt | 0 inc/3rdparty/site_config/standard/spiegel.de.txt | 148 ++++++++++----------- .../site_config/standard/spiked-online.com.txt | 7 + inc/3rdparty/site_config/standard/spin.com.txt | 6 +- inc/3rdparty/site_config/standard/splatf.com.txt | 6 +- .../site_config/standard/splitsider.com.txt | 4 +- .../site_config/standard/sport.detik.com.txt | 12 +- inc/3rdparty/site_config/standard/sport.orf.at.txt | 18 +-- inc/3rdparty/site_config/standard/sport365.fr.txt | 8 ++ .../site_config/standard/sports.espn.go.com.txt | 22 +-- .../site_config/standard/sports.yahoo.com.txt | 14 +- .../site_config/standard/sportschau.de.txt | 40 +++--- .../standard/sportsillustrated.cnn.com.txt | 50 +++---- .../site_config/standard/sprengsatz.de.txt | 6 +- inc/3rdparty/site_config/standard/sqlite.org.txt | 12 +- .../site_config/standard/squashed.tumblr.com.txt | 4 +- .../site_config/standard/stackoverflow.com.txt | 24 ++-- .../site_config/standard/stalbansreview.co.uk.txt | 26 ++-- .../site_config/standard/standard.co.uk.txt | 28 ++-- .../site_config/standard/staradvertiser.com.txt | 20 +-- .../site_config/standard/stephenfry.com.txt | 12 +- .../site_config/standard/stlbeacon.org.txt | 6 +- .../site_config/standard/stockholm.etc.se.txt | 6 +- .../site_config/standard/stockholmsfria.nu.txt | 7 + .../site_config/standard/straightdope.com.txt | 6 + .../site_config/standard/streetsblog.net.txt | 10 +- inc/3rdparty/site_config/standard/stuff.co.nz.txt | 42 +++--- .../site_config/standard/stumbleupon.com.txt | 6 +- .../site_config/standard/subtraction.com.txt | 32 ++--- .../site_config/standard/sueddeutsche.de.txt | 34 ++--- inc/3rdparty/site_config/standard/summify.com.txt | 0 inc/3rdparty/site_config/standard/suntimes.com.txt | 24 ++-- inc/3rdparty/site_config/standard/svd.se.txt | 16 ++- inc/3rdparty/site_config/standard/svt.se.txt | 16 +++ .../site_config/standard/sydsvenskan.se.txt | 29 ++-- .../site_config/standard/symmetrymagazine.org.txt | 20 +-- .../standard/sz-magazin.sueddeutsche.de.txt | 26 ++-- inc/3rdparty/site_config/standard/sz.de.txt | 18 +++ .../site_config/standard/tagesschau.de.txt | 42 +++--- inc/3rdparty/site_config/standard/tampabay.com.txt | 6 +- .../site_config/standard/taptaptap.com.txt | 4 +- .../site_config/standard/tasteofhome.com.txt | 26 ++-- inc/3rdparty/site_config/standard/taz.de.txt | 12 +- inc/3rdparty/site_config/standard/tbray.org.txt | 6 +- inc/3rdparty/site_config/standard/tcmanila.tk.txt | 7 + inc/3rdparty/site_config/standard/tcng.org.txt | 4 +- .../site_config/standard/tech.fortune.cnn.com.txt | 4 +- .../site_config/standard/tech.gilt.com.txt | 5 + .../site_config/standard/tech.sina.com.cn.txt | 18 +-- .../site_config/standard/techcrunch.com.txt | 34 ++--- inc/3rdparty/site_config/standard/techdirt.com.txt | 20 +-- inc/3rdparty/site_config/standard/techhive.com.txt | 18 +++ inc/3rdparty/site_config/standard/techmeme.com.txt | 4 +- .../standard/technicallyjordan.tumblr.com.txt | 14 +- .../site_config/standard/technologizer.com.txt | 5 + .../site_config/standard/technologyreview.com.txt | 30 ++--- .../site_config/standard/techpinions.com.txt | 10 +- .../site_config/standard/techradar.com.txt | 20 +-- inc/3rdparty/site_config/standard/telegraaf.nl.txt | 14 +- .../site_config/standard/telegraph.co.uk.txt | 16 +-- .../site_config/standard/thanhnien.com.vn.txt | 4 + .../site_config/standard/the-magazine.org.txt | 3 + .../site_config/standard/theage.com.au.txt | 5 + .../standard/theamericanscholar.org.txt | 13 ++ .../site_config/standard/theappleblog.com.txt | 2 +- .../site_config/standard/theatlantic.com.txt | 36 ++--- .../site_config/standard/theatlanticcities.com.txt | 17 +++ .../site_config/standard/thebostonchannel.com.txt | 12 +- .../site_config/standard/thebrowser.com.txt | 16 +-- .../site_config/standard/thecarton.net.txt | 18 +-- inc/3rdparty/site_config/standard/thedaily.com.txt | 46 +++---- .../site_config/standard/thedailybeast.com.txt | 12 +- .../site_config/standard/thedailymash.co.uk.txt | 26 ++-- .../site_config/standard/thedisneyblog.com.txt | 7 + .../standard/theeuropean-magazine.com.txt | 17 +++ .../site_config/standard/thefilmexperience.net.txt | 0 .../standard/thegamedesignforum.com.txt | 14 ++ .../site_config/standard/theglobalmail.org.txt | 78 +++++------ .../site_config/standard/theglobeandmail.com.txt | 6 +- .../standard/thegreatdiscontent.com.txt | 6 + .../site_config/standard/theguardian.com.txt | 13 ++ .../site_config/standard/theindychannel.com.txt | 22 +-- .../site_config/standard/themarker.com.txt | 11 ++ .../site_config/standard/themillions.com.txt | 16 +-- .../standard/themuseumofinnocence.com.txt | 10 +- .../site_config/standard/thenation.com.txt | 22 +-- .../standard/thenetworkgarden.blogs.com.txt | 4 +- .../site_config/standard/thenextgeneration.org.txt | 8 ++ .../site_config/standard/thenextweb.com.txt | 22 +-- .../site_config/standard/theoaklandpress.com.txt | 2 +- inc/3rdparty/site_config/standard/theonion.com.txt | 18 +-- .../site_config/standard/thepioneerwoman.com.txt | 18 +-- .../site_config/standard/theregister.co.uk.txt | 13 +- inc/3rdparty/site_config/standard/theroot.com.txt | 2 +- .../site_config/standard/therumpus.net.txt | 4 +- .../site_config/standard/thesiasat.com.txt | 20 +-- .../site_config/standard/thesimpledollar.com.txt | 4 +- .../site_config/standard/thespoiler.co.uk.txt | 2 +- inc/3rdparty/site_config/standard/thespoof.com.txt | 16 +-- .../site_config/standard/thestranger.com.txt | 20 +-- .../site_config/standard/thestreet.com.txt | 48 +++---- .../site_config/standard/thethaovanhoa.vn.txt | 0 inc/3rdparty/site_config/standard/theverge.com.txt | 79 ++++++----- inc/3rdparty/site_config/standard/theweek.com.txt | 4 +- .../site_config/standard/thinkprogress.org.txt | 4 +- .../site_config/standard/thisdaylive.com.txt | 2 +- .../site_config/standard/thisismynext.com.txt | 12 +- inc/3rdparty/site_config/standard/tidbits.com.txt | 4 +- inc/3rdparty/site_config/standard/time.com.txt | 26 ++-- .../standard/timeshighereducation.co.uk.txt | 8 +- inc/3rdparty/site_config/standard/tipb.com.txt | 16 +-- inc/3rdparty/site_config/standard/tnr.com.txt | 32 ++--- .../site_config/standard/tomdispatch.com.txt | 8 +- .../site_config/standard/tomshardware.com.txt | 12 +- .../site_config/standard/tomshardware.de.txt | 20 +-- .../site_config/standard/toolsandtoys.net.txt | 8 +- .../site_config/standard/tracks.ranea.org.txt | 14 ++ .../site_config/standard/trailer.web-view.net.txt | 0 .../site_config/standard/trailerzone.de.txt | 9 ++ .../site_config/standard/traningslara.se.txt | 12 +- inc/3rdparty/site_config/standard/triblive.com.txt | 24 ++-- inc/3rdparty/site_config/standard/truthdig.com.txt | 22 +-- .../site_config/standard/tthfanfic.org.txt | 4 +- inc/3rdparty/site_config/standard/tthor.com.txt | 0 inc/3rdparty/site_config/standard/tuaw.com.txt | 8 +- .../site_config/standard/tuckreview.com.txt | 10 +- inc/3rdparty/site_config/standard/tvtropes.org.txt | 36 ++--- inc/3rdparty/site_config/standard/twitter.com.txt | 16 +-- inc/3rdparty/site_config/standard/uefa.com.txt | 10 +- .../site_config/standard/uk.xbox360.ign.com.txt | 42 +++--- .../site_config/standard/uni-watch.com.txt | 30 ++--- .../site_config/standard/unwinnable.com.txt | 9 ++ .../site_config/standard/uppsalafria.se.txt | 7 + .../site_config/standard/urbandictionary.com.txt | 6 +- inc/3rdparty/site_config/standard/usatoday.com.txt | 8 ++ inc/3rdparty/site_config/standard/usccb.org.txt | 8 +- inc/3rdparty/site_config/standard/useit.com.txt | 12 +- inc/3rdparty/site_config/standard/usfirst.org.txt | 6 + .../site_config/standard/utdailybeacon.com.txt | 5 + inc/3rdparty/site_config/standard/ux.artu.tv.txt | 10 +- .../standard/uzivatelsketestovani.cz.txt | 0 .../site_config/standard/vanityfair.com.txt | 58 ++++---- inc/3rdparty/site_config/standard/varingen.no.txt | 6 +- .../site_config/standard/varsity.co.uk.txt | 4 +- inc/3rdparty/site_config/standard/vea.gov.vn.txt | 7 + inc/3rdparty/site_config/standard/vedomosti.ru.txt | 2 +- .../site_config/standard/veggbilder.no.txt | 6 +- inc/3rdparty/site_config/standard/vemedio.com.txt | 8 +- .../site_config/standard/venturebeat.com.txt | 8 +- inc/3rdparty/site_config/standard/version2.dk.txt | 20 +-- .../site_config/standard/verybestbaking.com.txt | 10 +- inc/3rdparty/site_config/standard/vg.no.txt | 2 +- .../site_config/standard/video.forbes.com.txt | 16 +-- inc/3rdparty/site_config/standard/videogum.com.txt | 8 +- .../site_config/standard/villagevoice.com.txt | 14 +- inc/3rdparty/site_config/standard/vimeo.com.txt | 32 ++--- inc/3rdparty/site_config/standard/viply.de.txt | 12 ++ inc/3rdparty/site_config/standard/visir.is.txt | 24 ++-- inc/3rdparty/site_config/standard/vitispr.com.txt | 8 +- .../site_config/standard/vivirmexico.com.txt | 0 .../site_config/standard/vnexpress.net.txt | 14 +- .../standard/voices.washingtonpost.com.txt | 2 +- inc/3rdparty/site_config/standard/vworker.com.txt | 2 +- .../site_config/standard/waffle.wootest.net.txt | 4 +- .../site_config/standard/walrusmagazine.com.txt | 24 ++-- .../site_config/standard/warnerbros.fr.txt | 2 +- .../standard/washingtoninstitute.org.txt | 6 + .../site_config/standard/washingtonmonthly.com.txt | 16 +-- .../site_config/standard/washingtonpost.com.txt | 51 ++++--- .../site_config/standard/web-libre.org.txt | 8 +- .../standard/weblog.bignerdranch.com.txt | 6 +- .../site_config/standard/weblogs.asp.net.txt | 14 +- .../site_config/standard/webpaper.nzz.ch.txt | 12 +- inc/3rdparty/site_config/standard/webwereld.nl.txt | 8 ++ inc/3rdparty/site_config/standard/welt.de.txt | 42 +++--- .../site_config/standard/westhamtillidie.com.txt | 8 +- .../site_config/standard/what-if.xkcd.com.txt | 0 .../site_config/standard/whatever.scalzi.com.txt | 10 +- .../site_config/standard/wheelyric.com.txt | 18 +-- .../site_config/standard/wiki.guildwars.com.txt | 12 +- .../site_config/standard/wiki.guildwars2.com.txt | 12 +- inc/3rdparty/site_config/standard/wikihow.com.txt | 15 +++ .../site_config/standard/wikitravel.org.txt | 24 ++-- .../site_config/standard/will-self.com.txt | 4 +- .../site_config/standard/williampfaff.com.txt | 2 +- inc/3rdparty/site_config/standard/winfuture.de.txt | 20 +-- .../site_config/standard/winrumors.com.txt | 10 +- .../site_config/standard/winsupersite.com.txt | 4 +- inc/3rdparty/site_config/standard/wired.com.txt | 47 ++++--- inc/3rdparty/site_config/standard/wmnf.org.txt | 22 +-- .../site_config/standard/wmpoweruser.com.txt | 4 +- .../site_config/standard/worldpoultry.net.txt | 6 +- .../site_config/standard/worldwidewords.org.txt | 4 +- .../site_config/standard/wow.joystiq.com.txt | 8 +- inc/3rdparty/site_config/standard/wpmayor.com.txt | 8 ++ .../site_config/standard/wtatennis.com.txt | 7 + .../site_config/standard/www1.folha.uol.com.br.txt | 28 ++-- .../site_config/standard/www3.imperial.ac.uk.txt | 0 inc/3rdparty/site_config/standard/wyborcza.pl.txt | 20 ++- inc/3rdparty/site_config/standard/wyctim.com.txt | 2 +- .../site_config/standard/wz-newsline.de.txt | 6 +- inc/3rdparty/site_config/standard/xfgjls.com.txt | 11 ++ inc/3rdparty/site_config/standard/xoeb.us.txt | 4 +- inc/3rdparty/site_config/standard/yated.com.txt | 0 inc/3rdparty/site_config/standard/ynet.co.il.txt | 26 ++++ .../site_config/standard/yostivanich.com.txt | 6 +- inc/3rdparty/site_config/standard/yourerie.com.txt | 2 + inc/3rdparty/site_config/standard/youtube.com.txt | 28 ++-- .../site_config/standard/zcommunications.org.txt | 7 + inc/3rdparty/site_config/standard/zdnet.com.txt | 18 +-- inc/3rdparty/site_config/standard/zeit.de.txt | 89 +++++++------ .../site_config/standard/zerohedge.com.txt | 10 ++ .../site_config/standard/zerokspot.com.txt | 2 +- inc/3rdparty/site_config/standard/zhihu.com.txt | 19 +++ .../site_config/standard/zingtrain.com.txt | 2 +- inc/poche/Database.class.php | 20 +-- 952 files changed, 7587 insertions(+), 5684 deletions(-) mode change 100644 => 100755 inc/3rdparty/site_config/standard/24ways.org.txt create mode 100755 inc/3rdparty/site_config/standard/36kr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/37signals.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/3quarksdaily.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/3voor12.vpro.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/43folders.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/500px.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/512pixels.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/5by5.tv.txt create mode 100755 inc/3rdparty/site_config/standard/7newsbelize.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/944.com.txt create mode 100755 inc/3rdparty/site_config/standard/README.md mode change 100644 => 100755 inc/3rdparty/site_config/standard/aachener-nachrichten.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/aachener-zeitung.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/abc.es.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/abc.net.au.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/abcnews.go.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/accesstoinsight.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/acidcow.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/acquia.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/acroswing.fr.txt create mode 100755 inc/3rdparty/site_config/standard/aftenposten.no.txt create mode 100755 inc/3rdparty/site_config/standard/aftonbladet.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/aht.seriouseats.com.txt create mode 100755 inc/3rdparty/site_config/standard/albayan.ae.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alex.mullr.net.txt create mode 100755 inc/3rdparty/site_config/standard/alexduner.com.txt create mode 100755 inc/3rdparty/site_config/standard/alexduner.squarespace.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alistapart.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/aljazeera.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/allrecipes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/allthingsd.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/allyou.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alphabeta.argaam.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alriyadh.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alseraj.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alt1040.com.txt create mode 100755 inc/3rdparty/site_config/standard/alternet.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/altfoto.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/alumni.stanford.edu.txt create mode 100755 inc/3rdparty/site_config/standard/amandala.com.bz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/amazon.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/americandrink.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/americascup.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/americastestkitchenfeed.com.txt create mode 100755 inc/3rdparty/site_config/standard/amptoons.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/anandtech.com.txt create mode 100755 inc/3rdparty/site_config/standard/androidpolice.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/andyrutledge.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/annatravelling.wordpress.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/applature.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/apple.com.txt create mode 100755 inc/3rdparty/site_config/standard/appledaily.com.tw.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/appleinsider.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/appleweblog.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/archdaily.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/archiveofourown.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/arstechnica.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/articles.boston.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/articles.courant.com.txt create mode 100755 inc/3rdparty/site_config/standard/articles.washingtonpost.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/asahi.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ascarter.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/astronews.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/asymco.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/autoblog.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/avclub.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/baltimoresun.com.txt create mode 100755 inc/3rdparty/site_config/standard/baseballprospectus.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/basicthinking.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bb.is.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bbc.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/bbcgoodfood.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/benoitmaison.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/berlingske.dk.txt create mode 100755 inc/3rdparty/site_config/standard/bernama.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/betabeat.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/betanews.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/biography.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bitelia.com.txt create mode 100755 inc/3rdparty/site_config/standard/bizjournals.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bjango.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.arsln.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.asmartbear.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.cloudflare.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.fefe.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.instagram.com.txt create mode 100755 inc/3rdparty/site_config/standard/blog.instapaper.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.jaysalvat.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.kaelig.fr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.naver.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.pchome.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.pinboard.in.txt create mode 100755 inc/3rdparty/site_config/standard/blog.renren.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.sina.com.cn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.spu.edu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blog.wells.ee.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.aljazeera.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.forbes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.hbr.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.msdn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.reuters.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.scientificamerican.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.smithsonianmag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/blogs.technet.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bluetouff.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/boagworld.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/boingboing.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/boldizsar.palotas.eu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/book.douban.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bookforum.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/borderhouseblog.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bostonglobe.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bostonreview.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/boundlessline.org.txt create mode 100755 inc/3rdparty/site_config/standard/bowdoinorient.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brainfacts.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brandeins.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brandingstrategyinsider.com.txt create mode 100755 inc/3rdparty/site_config/standard/brasil.elpais.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brettterpstra.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brisbanetimes.com.au.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brookings.edu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/brooksreview.net.txt create mode 100755 inc/3rdparty/site_config/standard/bt.no.txt create mode 100755 inc/3rdparty/site_config/standard/buffed.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/buquad.com.txt create mode 100755 inc/3rdparty/site_config/standard/business2community.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/businessinsider.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/businessnews.com.tn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/businessweek.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/buzzfeed.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/bygonebureau.com.txt create mode 100755 inc/3rdparty/site_config/standard/cable.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cardboardconnection.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/carpeaqua.com.txt create mode 100755 inc/3rdparty/site_config/standard/cars.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/catb.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cbc.ca.txt create mode 100755 inc/3rdparty/site_config/standard/cbn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cbsnews.com.txt create mode 100755 inc/3rdparty/site_config/standard/cedarrepublican.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/chareidi.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/chinamining.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/chomsky.info.txt create mode 100755 inc/3rdparty/site_config/standard/chrisltd.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/christianitytoday.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/christianpf.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/christies.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/chrome.google.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/chronicle.com.txt create mode 100755 inc/3rdparty/site_config/standard/ciaosamin.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cicero.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ciperchile.cl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cjr.org.txt create mode 100755 inc/3rdparty/site_config/standard/classyllama.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/clientk.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/clubic.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cmswire.com.txt create mode 100755 inc/3rdparty/site_config/standard/cn.engadget.com.txt create mode 100755 inc/3rdparty/site_config/standard/cn.reuters.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cnet.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cnn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cnnsi.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/code.activestate.com.txt create mode 100755 inc/3rdparty/site_config/standard/code.fivefilters.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/code.google.com.txt create mode 100755 inc/3rdparty/site_config/standard/codeproject.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/codinghorror.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/collegehumor.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/communities-dominate.blogs.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/community.service-now.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/computer.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/computerbase.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/computerworld.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/computerworld.dk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/contemporist.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/conversaciones.nokia.com.txt create mode 100755 inc/3rdparty/site_config/standard/cooper.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/core77.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/counterpunch.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/crazybutable.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/crimemagazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/crimethinc.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/crn.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/csmonitor.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/csnbayarea.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/csnphilly.com.txt create mode 100755 inc/3rdparty/site_config/standard/css-tricks.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/cucharasonica.com.txt create mode 100755 inc/3rdparty/site_config/standard/cw.com.tw.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/da.feedsportal.com.txt create mode 100755 inc/3rdparty/site_config/standard/dagogtid.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dailydot.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dailykos.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dailymail.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/dailystar.com.lb.txt create mode 100755 inc/3rdparty/site_config/standard/danleech.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dansdata.com.txt create mode 100755 inc/3rdparty/site_config/standard/dantri.com.vn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/daringfireball.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/datanami.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dcurt.is.txt create mode 100755 inc/3rdparty/site_config/standard/defomicron.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/delong.typepad.com.txt create mode 100755 inc/3rdparty/site_config/standard/democracynow.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/derstandard.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/designtagebuch.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/desitvforum.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/details.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/developers.facebook.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/devlinsangle.blogspot.co.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dictionary.reference.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/diepresse.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/digiphoto.techbang.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/digital-photography-school.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/digitalspy.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dilbert.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dinamalar.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dn.se.txt create mode 100755 inc/3rdparty/site_config/standard/dobreprogramy.pl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/doctac.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/domusweb.it.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dou.ua.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/douban.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dpreview.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dr.dk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dramasonline.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/drdobbs.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/drive2.ru.txt create mode 100755 inc/3rdparty/site_config/standard/dropbox.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/drupal.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dukebasketballreport.com.txt create mode 100755 inc/3rdparty/site_config/standard/dushumashang.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/dvice.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/eamesinerudition.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/eandt.theiet.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/eastoftheweb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ebay.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ecetia.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/econlog.econlib.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/economia.estadao.com.br.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/economist.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/edge-online.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/edge.org.txt create mode 100755 inc/3rdparty/site_config/standard/edition.channel5belize.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/edition.cnn.com.txt create mode 100755 inc/3rdparty/site_config/standard/eetimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ekultura.hu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/elance.com.txt create mode 100755 inc/3rdparty/site_config/standard/elderscrollsonline.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/elektroniknet.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/elmalpensante.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/elpais.com.txt create mode 100755 inc/3rdparty/site_config/standard/emaratalyoum.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/en.espnf1.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/engadget.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/engineering.tumblr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/english.aljazeera.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/enikos.gr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/entertainment.timesonline.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/ericsuh.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/es.hu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/escapistmagazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/espn.go.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/esquire.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/essentialpublicradio.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/etc.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/eternabuenosaires.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/eurogamer.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/evo.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/expressen.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/extracine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/f1actual.com.txt create mode 100755 inc/3rdparty/site_config/standard/facebook.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/facta.co.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/falter.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fanfiction.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fastcompany.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/faz.net.txt create mode 100755 inc/3rdparty/site_config/standard/fertigung.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fictionpress.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ficwad.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/finance.yahoo.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/findtheswagger.tumblr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/firstthings.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fivechapters.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fivefilters.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fivethirtyeight.com.txt create mode 100755 inc/3rdparty/site_config/standard/flyingmachinestudios.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fm4.orf.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fnal.gov.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/focus.de.txt create mode 100755 inc/3rdparty/site_config/standard/folklore.org.txt create mode 100755 inc/3rdparty/site_config/standard/food.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fool.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/forbes.com.txt create mode 100755 inc/3rdparty/site_config/standard/foreignaffairs.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/foreignpolicy.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/forsvaret.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/foxnews.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/freelancer.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/freytag-film.com.txt create mode 100755 inc/3rdparty/site_config/standard/fria.nu.txt create mode 100755 inc/3rdparty/site_config/standard/friatidningen.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/friendskorner.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ft.com.txt create mode 100755 inc/3rdparty/site_config/standard/ftchinese.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ftd.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/fubiz.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/futurezone.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gamasutra.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gameblog.fr.txt create mode 100755 inc/3rdparty/site_config/standard/gamechurch.com.txt create mode 100755 inc/3rdparty/site_config/standard/gamer.no.txt create mode 100755 inc/3rdparty/site_config/standard/gamereactor.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/garythink.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gasteroprod.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gatopardo.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gawker.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/geeksofdoom.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/geenstijl.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/getnews.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/giantbomb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/giga.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gigaom.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gihyo.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gist.github.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/givemesomethingtoread.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gizmodo.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gizmodo.com.txt create mode 100755 inc/3rdparty/site_config/standard/gizmodo.uol.com.br.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gizmologia.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gizmovil.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/global.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/globalissues.org.txt create mode 100755 inc/3rdparty/site_config/standard/globoesporte.globo.com.txt create mode 100755 inc/3rdparty/site_config/standard/gloswielkopolski.pl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/goal.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/golem.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/good.is.txt create mode 100755 inc/3rdparty/site_config/standard/goodfil.ms.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gossip-tv.gr.txt create mode 100755 inc/3rdparty/site_config/standard/goteborgsfria.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gothamist.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gotomanager.com.txt create mode 100755 inc/3rdparty/site_config/standard/gov.ky.txt create mode 100755 inc/3rdparty/site_config/standard/gp.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gq.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/grantland.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/greatergreaterwashington.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/groups.drupal.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/gulfnews.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/guokr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/haberler.com.txt create mode 100755 inc/3rdparty/site_config/standard/hackmake.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/halo.bungie.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hammers.theoffside.com.txt create mode 100755 inc/3rdparty/site_config/standard/handelsblatt.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hanselman.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hardware.fr.txt create mode 100755 inc/3rdparty/site_config/standard/hardware.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hbr.org.txt create mode 100755 inc/3rdparty/site_config/standard/headrush.typepad.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/heise-online.mobi.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/heise.de.txt create mode 100755 inc/3rdparty/site_config/standard/hemmings.com.txt create mode 100755 inc/3rdparty/site_config/standard/heroturko.me.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hespress.com.txt create mode 100755 inc/3rdparty/site_config/standard/hiamag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/highscalability.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hiperpop.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hiphopleeft.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/historytoday.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hmercer.com.txt create mode 100755 inc/3rdparty/site_config/standard/hollywoodlife.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hometheaterreview.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hosted.ap.org.txt create mode 100755 inc/3rdparty/site_config/standard/howtogeek.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hs.fi.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ht.ly.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/huffingtonpost.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/humantransit.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hurriyet.com.tr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hvg.hu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/hypebeast.com.txt create mode 100755 inc/3rdparty/site_config/standard/icannabis.tumblr.com.txt create mode 100755 inc/3rdparty/site_config/standard/idealog.co.nz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/idlewords.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/igeneration.fr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ignoredbydinosaurs.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ilounge.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ilyabirman.ru.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/inc.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/independent.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/indiatimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/inessential.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/info.abril.com.br.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/infoq.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/informador.com.mx.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/information.dk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/informationarchitects.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/informationclearinghouse.info.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/informit.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/infoworld.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/infzm.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/inhabitat.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/instagr.am.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/interest.co.nz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/iolanguage.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ipadclub.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ipadplanet.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/iphoneclub.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/iphonehacks.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/iplaysoft.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/isource.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/itavisen.no.txt create mode 100755 inc/3rdparty/site_config/standard/itmedia.co.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/itstactical.com.txt create mode 100755 inc/3rdparty/site_config/standard/itwire.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/itworld.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/izismile.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/jalopnik.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/jandan.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/jetzt.sueddeutsche.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/jjahnke.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/jobbank.gc.ca.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/joelonsoftware.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/jouire.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/joystiq.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/juedische-allgemeine.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/juppy.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kachestvo.ru.txt create mode 100755 inc/3rdparty/site_config/standard/kachiblog.com.txt create mode 100755 inc/3rdparty/site_config/standard/kathimerini.gr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kenrockwell.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kicker.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kickstarter.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kingarthurflour.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kotaku.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kottke.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kumailplus.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kumb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/kwerfeldein.de.txt create mode 100755 inc/3rdparty/site_config/standard/landetsfria.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/laphamsquarterly.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/laprensagrafica.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/laquadrature.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lareviewofbooks.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/latimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/laughingsquid.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/leancrew.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lefigaro.fr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lemonde.fr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lesnumeriques.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/letemps.ch.txt create mode 100755 inc/3rdparty/site_config/standard/libcom.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lifeandculture.fr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lifehacker.com.txt create mode 100755 inc/3rdparty/site_config/standard/lifestyle.inquirer.net.txt create mode 100755 inc/3rdparty/site_config/standard/lifeweek.com.cn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/linkedin.com.txt create mode 100755 inc/3rdparty/site_config/standard/livescience.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/longform.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/loopinsight.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lostgarden.com.txt create mode 100755 inc/3rdparty/site_config/standard/lovefm.com.txt create mode 100755 inc/3rdparty/site_config/standard/lovetv.com.bz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/lrb.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/luminous-landscape.com.txt create mode 100755 inc/3rdparty/site_config/standard/luxuo.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/m.bbc.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/m.douban.com.txt create mode 100755 inc/3rdparty/site_config/standard/m.vanityfair.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mac4ever.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macdrifter.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macformat.techradar.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macgeneration.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macmagazine.com.br.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macrumors.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macstories.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mactalk.com.au.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mactechnews.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/macworld.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mainichi.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mainpost.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/makeuseof.com.txt create mode 100755 inc/3rdparty/site_config/standard/manager.co.th.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/marco.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/marksdailyapple.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/martinfowler.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mashable.com.txt create mode 100755 inc/3rdparty/site_config/standard/matt.might.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mattcutts.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mbl.is.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/medialens.org.txt create mode 100755 inc/3rdparty/site_config/standard/medium.com.txt create mode 100755 inc/3rdparty/site_config/standard/megamp3.eu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/menshealth.com.txt create mode 100755 inc/3rdparty/site_config/standard/metafilter.com.txt create mode 100755 inc/3rdparty/site_config/standard/mforum.cari.com.my.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mikeash.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mikeindustries.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/minnesota.publicradio.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/minnpost.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mirrorfootball.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mises.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mlb.mlb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mlb.sbnation.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mlssoccer.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mmo-champion.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mnn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mno.hu.txt create mode 100755 inc/3rdparty/site_config/standard/mobile.nytimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mobile.slate.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mobileopportunity.blogspot.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/modernghana.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/money.cnn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/monkeyzen.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/moonsault.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/moreintelligentlife.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/motherboard.vice.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/mothering.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/motherjones.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/motorfull.com.txt create mode 100755 inc/3rdparty/site_config/standard/movie.douban.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/msdn.microsoft.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/msnbc.msn.com.txt create mode 100755 inc/3rdparty/site_config/standard/myfoxatlanta.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/myfoxboston.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/myrecipes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/narenji.ir.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nasa.gov.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nbweekly.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/neh.gov.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/neomoney.co.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/net-security.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/netmagazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/netzpolitik.org.txt create mode 100755 inc/3rdparty/site_config/standard/newleftproject.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/newmatilda.com.txt create mode 100755 inc/3rdparty/site_config/standard/newrepublic.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news-gazette.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.cnet.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.detik.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.kanaloco.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.mynavi.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.orf.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.rambler.ru.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.techmeme.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.yahoo.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/news.ycombinator.com.txt create mode 100755 inc/3rdparty/site_config/standard/news.zing.vn.txt create mode 100755 inc/3rdparty/site_config/standard/news247.gr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/newsbomb.gr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/newsle.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/newsmill.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/newsunspun.org.txt create mode 100755 inc/3rdparty/site_config/standard/newsweek.com.txt create mode 100755 inc/3rdparty/site_config/standard/newswise.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/newyorker.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/next-gen.biz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nfl.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ngm.nationalgeographic.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nhk.or.jp.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nintendoworldreport.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nojesguiden.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/northumberlandview.ca.txt create mode 100755 inc/3rdparty/site_config/standard/nosalty.hu.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nplusonemag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/npr.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nybooks.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nymag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nyteknik.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nytimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/nzz.ch.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/observer.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/off.net.mk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/omaha.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/omiliya.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/on.net.mk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/online.wsj.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/onlinewelten.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/onstartups.com.txt create mode 100755 inc/3rdparty/site_config/standard/ontologicalgeek.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/opensource.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/openthemagazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/openwebx.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/orf.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/origo.hu.txt create mode 100755 inc/3rdparty/site_config/standard/oschina.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pakistantvdekho.com.txt create mode 100755 inc/3rdparty/site_config/standard/pakmedia.tv.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pandagon.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pandodaily.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/panic.com.txt create mode 100755 inc/3rdparty/site_config/standard/papodehomem.com.br.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/parislemon.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/parliament.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pastebin.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pastepad.fivefilters.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pathawks.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pcast.me.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pcmag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pcworld.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/penny-arcade.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pentaxforums.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/philadelphiaeagles.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/philly.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/photo.tutsplus.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/php.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/physicstoday.org.txt create mode 100755 inc/3rdparty/site_config/standard/pinterest.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pitchfork.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pittnews.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pittsburgh.pirates.mlb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pittsburghlive.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pittsburghmagazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pittsburghpanthers.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pittscriptblog.com.txt create mode 100755 inc/3rdparty/site_config/standard/planetvita.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/playboy.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/plus.google.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/plzkthxbai.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/pogue.blogs.nytimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/politifact.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/politiken.dk.txt create mode 100755 inc/3rdparty/site_config/standard/polygon.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/popularmechanics.com.txt create mode 100755 inc/3rdparty/site_config/standard/portertech.ca.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/positioningmag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/post-gazette.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/posta.com.tr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/prb.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/prog21.dadgum.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/prolost.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/propublica.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/prosa.dk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/prospectmagazine.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/protothema.gr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/psychologytoday.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/publications.parliament.uk.txt create mode 100755 inc/3rdparty/site_config/standard/publico.pt.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/purpleplanetmedia.com.txt create mode 100755 inc/3rdparty/site_config/standard/qctimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/quantumdiaries.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/queerty.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/quepasa.cl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/quora.com.txt create mode 100755 inc/3rdparty/site_config/standard/racjonalista.pl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/radar.oreilly.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/radionz.co.nz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/randsinrepose.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/readability.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/readwriteweb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/real.gr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/recipe.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/red-hot-girls.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/reddit.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/redmondpie.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/redtape.msnbc.msn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/reflets.info.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/renenekuda.cz.txt create mode 100755 inc/3rdparty/site_config/standard/resume.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/retrieverweekly.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/reuters.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/revistapiaui.estadao.com.br.txt create mode 100644 inc/3rdparty/site_config/standard/rezeptwelt.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/richardmuscat.wordpress.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ritemail.blogspot.com.txt create mode 100755 inc/3rdparty/site_config/standard/ritholtz.com.txt create mode 100755 inc/3rdparty/site_config/standard/robertsspaceindustries.com.txt create mode 100755 inc/3rdparty/site_config/standard/robots.thoughtbot.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rockpapershotgun.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rodrigo.sharpcube.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rogerebert.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rolfinjapan.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rollingstone.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rottentomatoes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/roughtype.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/roy.gbiv.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rpgsite.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/rubysfera.pl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ruhlman.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ruttloff.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/salon.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/salzburg.com.txt create mode 100755 inc/3rdparty/site_config/standard/sanpedrosun.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/saveyourself.ca.txt create mode 100755 inc/3rdparty/site_config/standard/sayidaty.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sbnation.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/schneier.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/science.orf.at.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/scienceblogs.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/scienceticker.info.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/scientificamerican.com.txt create mode 100755 inc/3rdparty/site_config/standard/scilogs.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/scotusblog.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/scraplab.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/scripting.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sct.temple.edu.txt create mode 100755 inc/3rdparty/site_config/standard/searchenginejournal.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/searchengineland.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/seattletransitblog.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sebbo.net.txt create mode 100755 inc/3rdparty/site_config/standard/select.yeeyan.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/seriouseats.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sf.curbed.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sf.eater.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sfgate.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sfweekly.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/shabayek.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/shawnblanc.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/shifteleven.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/siasat.pk.txt create mode 100755 inc/3rdparty/site_config/standard/signalscv.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/simonwillison.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/singaporeanstocksinvestor.blogspot.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/singularityhub.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sintagoulis.gr.txt create mode 100755 inc/3rdparty/site_config/standard/sivers.org.txt create mode 100755 inc/3rdparty/site_config/standard/skanesfria.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/slashfilm.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/slate.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/slice.seriouseats.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/slog.thestranger.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/smartinvestor.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sme.sk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/smithsonianmag.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/smokingapples.com.txt create mode 100755 inc/3rdparty/site_config/standard/somethingawful.com.txt create mode 100755 inc/3rdparty/site_config/standard/songshuhui.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sourcebooks.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/spectator.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/spectrum.ieee.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/speirs.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/spiegel.de.txt create mode 100755 inc/3rdparty/site_config/standard/spiked-online.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/spin.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/splatf.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/splitsider.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sport.detik.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sport.orf.at.txt create mode 100755 inc/3rdparty/site_config/standard/sport365.fr.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sports.espn.go.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sports.yahoo.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sportschau.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sportsillustrated.cnn.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sprengsatz.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sqlite.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/squashed.tumblr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stackoverflow.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stalbansreview.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/standard.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/staradvertiser.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stephenfry.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stlbeacon.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stockholm.etc.se.txt create mode 100755 inc/3rdparty/site_config/standard/stockholmsfria.nu.txt create mode 100755 inc/3rdparty/site_config/standard/straightdope.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/streetsblog.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stuff.co.nz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/stumbleupon.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/subtraction.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sueddeutsche.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/summify.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/suntimes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/svd.se.txt create mode 100755 inc/3rdparty/site_config/standard/svt.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sydsvenskan.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/symmetrymagazine.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/sz-magazin.sueddeutsche.de.txt create mode 100755 inc/3rdparty/site_config/standard/sz.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tagesschau.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tampabay.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/taptaptap.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tasteofhome.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/taz.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tbray.org.txt create mode 100755 inc/3rdparty/site_config/standard/tcmanila.tk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tcng.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tech.fortune.cnn.com.txt create mode 100755 inc/3rdparty/site_config/standard/tech.gilt.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tech.sina.com.cn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/techcrunch.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/techdirt.com.txt create mode 100755 inc/3rdparty/site_config/standard/techhive.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/techmeme.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/technicallyjordan.tumblr.com.txt create mode 100755 inc/3rdparty/site_config/standard/technologizer.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/technologyreview.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/techpinions.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/techradar.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/telegraaf.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/telegraph.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/thanhnien.com.vn.txt create mode 100755 inc/3rdparty/site_config/standard/the-magazine.org.txt create mode 100755 inc/3rdparty/site_config/standard/theage.com.au.txt create mode 100755 inc/3rdparty/site_config/standard/theamericanscholar.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theappleblog.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theatlantic.com.txt create mode 100755 inc/3rdparty/site_config/standard/theatlanticcities.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thebostonchannel.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thebrowser.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thecarton.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thedaily.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thedailybeast.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thedailymash.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/thedisneyblog.com.txt create mode 100755 inc/3rdparty/site_config/standard/theeuropean-magazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thefilmexperience.net.txt create mode 100755 inc/3rdparty/site_config/standard/thegamedesignforum.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theglobalmail.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theglobeandmail.com.txt create mode 100755 inc/3rdparty/site_config/standard/thegreatdiscontent.com.txt create mode 100755 inc/3rdparty/site_config/standard/theguardian.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theindychannel.com.txt create mode 100755 inc/3rdparty/site_config/standard/themarker.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/themillions.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/themuseumofinnocence.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thenation.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thenetworkgarden.blogs.com.txt create mode 100755 inc/3rdparty/site_config/standard/thenextgeneration.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thenextweb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theoaklandpress.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theonion.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thepioneerwoman.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theregister.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theroot.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/therumpus.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thesiasat.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thesimpledollar.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thespoiler.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thespoof.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thestranger.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thestreet.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thethaovanhoa.vn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theverge.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/theweek.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thinkprogress.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thisdaylive.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/thisismynext.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tidbits.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/time.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/timeshighereducation.co.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tipb.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tnr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tomdispatch.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tomshardware.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tomshardware.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/toolsandtoys.net.txt create mode 100755 inc/3rdparty/site_config/standard/tracks.ranea.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/trailer.web-view.net.txt create mode 100755 inc/3rdparty/site_config/standard/trailerzone.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/traningslara.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/triblive.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/truthdig.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tthfanfic.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tthor.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tuaw.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tuckreview.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/tvtropes.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/twitter.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/uefa.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/uk.xbox360.ign.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/uni-watch.com.txt create mode 100755 inc/3rdparty/site_config/standard/unwinnable.com.txt create mode 100755 inc/3rdparty/site_config/standard/uppsalafria.se.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/urbandictionary.com.txt create mode 100755 inc/3rdparty/site_config/standard/usatoday.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/usccb.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/useit.com.txt create mode 100755 inc/3rdparty/site_config/standard/usfirst.org.txt create mode 100755 inc/3rdparty/site_config/standard/utdailybeacon.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/ux.artu.tv.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/uzivatelsketestovani.cz.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vanityfair.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/varingen.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/varsity.co.uk.txt create mode 100755 inc/3rdparty/site_config/standard/vea.gov.vn.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vedomosti.ru.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/veggbilder.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vemedio.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/venturebeat.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/version2.dk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/verybestbaking.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vg.no.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/video.forbes.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/videogum.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/villagevoice.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vimeo.com.txt create mode 100755 inc/3rdparty/site_config/standard/viply.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/visir.is.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vitispr.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vivirmexico.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vnexpress.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/voices.washingtonpost.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/vworker.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/waffle.wootest.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/walrusmagazine.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/warnerbros.fr.txt create mode 100755 inc/3rdparty/site_config/standard/washingtoninstitute.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/washingtonmonthly.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/washingtonpost.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/web-libre.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/weblog.bignerdranch.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/weblogs.asp.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/webpaper.nzz.ch.txt create mode 100755 inc/3rdparty/site_config/standard/webwereld.nl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/welt.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/westhamtillidie.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/what-if.xkcd.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/whatever.scalzi.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wheelyric.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wiki.guildwars.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wiki.guildwars2.com.txt create mode 100755 inc/3rdparty/site_config/standard/wikihow.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wikitravel.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/will-self.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/williampfaff.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/winfuture.de.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/winrumors.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/winsupersite.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wired.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wmnf.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wmpoweruser.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/worldpoultry.net.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/worldwidewords.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wow.joystiq.com.txt create mode 100755 inc/3rdparty/site_config/standard/wpmayor.com.txt create mode 100755 inc/3rdparty/site_config/standard/wtatennis.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/www1.folha.uol.com.br.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/www3.imperial.ac.uk.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wyborcza.pl.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wyctim.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/wz-newsline.de.txt create mode 100755 inc/3rdparty/site_config/standard/xfgjls.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/xoeb.us.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/yated.com.txt create mode 100755 inc/3rdparty/site_config/standard/ynet.co.il.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/yostivanich.com.txt create mode 100755 inc/3rdparty/site_config/standard/yourerie.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/youtube.com.txt create mode 100755 inc/3rdparty/site_config/standard/zcommunications.org.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/zdnet.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/zeit.de.txt create mode 100755 inc/3rdparty/site_config/standard/zerohedge.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/zerokspot.com.txt create mode 100755 inc/3rdparty/site_config/standard/zhihu.com.txt mode change 100644 => 100755 inc/3rdparty/site_config/standard/zingtrain.com.txt (limited to 'inc') diff --git a/inc/3rdparty/site_config/standard/24ways.org.txt b/inc/3rdparty/site_config/standard/24ways.org.txt old mode 100644 new mode 100755 index 03bd1950..86c9e077 --- a/inc/3rdparty/site_config/standard/24ways.org.txt +++ b/inc/3rdparty/site_config/standard/24ways.org.txt @@ -1,6 +1,6 @@ -title: //div[@class='meta']/h2/a -author: //div[@class='meta']/h2/following-sibling::p/a/text() -date://div[@class='meta']/h2/strong -body: //div[@id='article'] +title: //div[@class='meta']/h2/a +author: //div[@class='meta']/h2/following-sibling::p/a/text() +date://div[@class='meta']/h2/strong +body: //div[@id='article'] strip: //div[@class='domore'] test_url: http://24ways.org/2011/composing-the-new-canon \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/36kr.com.txt b/inc/3rdparty/site_config/standard/36kr.com.txt new file mode 100755 index 00000000..d73d7de5 --- /dev/null +++ b/inc/3rdparty/site_config/standard/36kr.com.txt @@ -0,0 +1,8 @@ +title: //h1[contains(@class, 'entry-title')] +date: //meta[@name='weibo: article:create_at']/@content +body: //div[contains(@class, 'mainContent')] +strip_id_or_class: related_topics + +prune: no + +test_url: http://www.36kr.com/p/207879.html \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/37signals.com.txt b/inc/3rdparty/site_config/standard/37signals.com.txt old mode 100644 new mode 100755 index 43a10ae5..531cac1e --- a/inc/3rdparty/site_config/standard/37signals.com.txt +++ b/inc/3rdparty/site_config/standard/37signals.com.txt @@ -1,6 +1,6 @@ -title: //div[@class='post_header']//h2/a -author: //span[@class='author'] -date: //span[@class='date'] -body: //div[@id='Content'] +title: //div[@class='post_header']//h2/a +author: //span[@class='author'] +date: //span[@class='date'] +body: //div[@id='Content'] test_url: http://37signals.com/svn/posts/2785-the-end-of-the-it-department \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/3quarksdaily.com.txt b/inc/3rdparty/site_config/standard/3quarksdaily.com.txt old mode 100644 new mode 100755 index c4e7940f..80a3958f --- a/inc/3rdparty/site_config/standard/3quarksdaily.com.txt +++ b/inc/3rdparty/site_config/standard/3quarksdaily.com.txt @@ -1,9 +1,9 @@ -body: //div[@class='content'] -date: //div[@class='content']/h2 -strip: //div[@class='content']/h2 -title: //div[@class='content']/h3 - -strip: //div[@id='postmenu'] -strip: //div[@class='trackback'] -tidy: no +body: //div[@class='content'] +date: //div[@class='content']/h2 +strip: //div[@class='content']/h2 +title: //div[@class='content']/h3 + +strip: //div[@id='postmenu'] +strip: //div[@class='trackback'] +tidy: no test_url: http://www.3quarksdaily.com/3quarksdaily/2012/01/martin-luther-king-i-have-a-dream.html \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/3voor12.vpro.nl.txt b/inc/3rdparty/site_config/standard/3voor12.vpro.nl.txt old mode 100644 new mode 100755 diff --git a/inc/3rdparty/site_config/standard/43folders.com.txt b/inc/3rdparty/site_config/standard/43folders.com.txt old mode 100644 new mode 100755 index e8073f6f..3777c66f --- a/inc/3rdparty/site_config/standard/43folders.com.txt +++ b/inc/3rdparty/site_config/standard/43folders.com.txt @@ -1,4 +1,4 @@ -body: //*[@class = 'content'] -author: //*[@class = 'submitted']/a +body: //*[@class = 'content'] +author: //*[@class = 'submitted']/a date: substring-after(//*[@class = 'submitted']/text(), '|') test_url: http://www.43folders.com/2011/04/22/cranking \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/500px.com.txt b/inc/3rdparty/site_config/standard/500px.com.txt old mode 100644 new mode 100755 index 68e6b2d0..b9b7e9dd --- a/inc/3rdparty/site_config/standard/500px.com.txt +++ b/inc/3rdparty/site_config/standard/500px.com.txt @@ -1,27 +1,27 @@ -# very loose setup for both 500px.com/photo/* and 500px.com/blog/* -# photo page example: http://500px.com/photo/4181666 -# blog page example: http://500px.com/blog/110 - -# avoid "no text" error -tidy:no -prune:no - -# reorganize photo page elements -#body://div[contains(@class,'container')] -move_into(body)://div[contains(@id,'thephoto')] -move_into(body)://div[contains(@id,'description')] -move_into(body)://div[contains(@id,'tags')] -move_into(body)://div[contains(@id,'photo-info')] - -# clean photo page info -strip://span[contains(@id,'copyright')] -strip://*[contains(@id,'store')] -strip://*[contains(@id,'user-info')] -strip://*[contains(@id,'photo-stats')] -strip://*[contains(@id,'voting_controls_container')] -strip://*[contains(@id,'more-photos')] -strip://*[contains(@id,'embed-photo')] - -# clean blog page side bar +# very loose setup for both 500px.com/photo/* and 500px.com/blog/* +# photo page example: http://500px.com/photo/4181666 +# blog page example: http://500px.com/blog/110 + +# avoid "no text" error +tidy:no +prune:no + +# reorganize photo page elements +#body://div[contains(@class,'container')] +move_into(body)://div[contains(@id,'thephoto')] +move_into(body)://div[contains(@id,'description')] +move_into(body)://div[contains(@id,'tags')] +move_into(body)://div[contains(@id,'photo-info')] + +# clean photo page info +strip://span[contains(@id,'copyright')] +strip://*[contains(@id,'store')] +strip://*[contains(@id,'user-info')] +strip://*[contains(@id,'photo-stats')] +strip://*[contains(@id,'voting_controls_container')] +strip://*[contains(@id,'more-photos')] +strip://*[contains(@id,'embed-photo')] + +# clean blog page side bar strip://*[contains(@class,'col d3 clearafter')] test_url: http://500px.com/photo/3641041?from=editors \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/512pixels.net.txt b/inc/3rdparty/site_config/standard/512pixels.net.txt old mode 100644 new mode 100755 diff --git a/inc/3rdparty/site_config/standard/5by5.tv.txt b/inc/3rdparty/site_config/standard/5by5.tv.txt old mode 100644 new mode 100755 index dce0df4e..59b70a99 --- a/inc/3rdparty/site_config/standard/5by5.tv.txt +++ b/inc/3rdparty/site_config/standard/5by5.tv.txt @@ -1,9 +1,9 @@ -body: //*[@id="episode"] -prune: no -tidy: no - -autodetect_next_page: no -strip_id_or_class: player - +body: //*[@id="episode"] +prune: no +tidy: no + +autodetect_next_page: no +strip_id_or_class: player + strip://*[@id="header"] test_url: http://5by5.tv/buildanalyze/60 \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/7newsbelize.com.txt b/inc/3rdparty/site_config/standard/7newsbelize.com.txt new file mode 100755 index 00000000..46d09f8e --- /dev/null +++ b/inc/3rdparty/site_config/standard/7newsbelize.com.txt @@ -0,0 +1,7 @@ +title: //*[@id='sstitle'] +body: //div[@id='sstory'] +strip_id_or_class: newsoptions +prune: no + +test_url: http://www.7newsbelize.com/sstory.php?nid=25654 +test_url: http://www.7newsbelize.com/7news.xml \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/944.com.txt b/inc/3rdparty/site_config/standard/944.com.txt old mode 100644 new mode 100755 index 84380e79..8bf6a4c2 --- a/inc/3rdparty/site_config/standard/944.com.txt +++ b/inc/3rdparty/site_config/standard/944.com.txt @@ -1,9 +1,9 @@ -title: //h2[@class='border'] -body: //div[@class='padding'] - -convert_double_br_tags: yes - -strip: //div[@id='social_sharing'] -strip: //div[@class='socialLinks'] +title: //h2[@class='border'] +body: //div[@class='padding'] + +convert_double_br_tags: yes + +strip: //div[@id='social_sharing'] +strip: //div[@class='socialLinks'] test_url: http://www.944.com/articles/mild-obsessions-frock-la-get-to-know-victoria-tik-s-haute-sustainable-fashion-line/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/README.md b/inc/3rdparty/site_config/standard/README.md new file mode 100755 index 00000000..9040ba85 --- /dev/null +++ b/inc/3rdparty/site_config/standard/README.md @@ -0,0 +1,38 @@ +Full-Text RSS site config files +================ + +[Full-Text RSS](http://fivefilters.org/content-only/), our article extraction tool, makes use of site-specific extraction rules to improve results. Each time a URL is processed, it checks to see if there are extraction rules for the site being processed. If there are no site patterns, it tries to detect the content block automatically. + +This repository contains the site config files we use in Full-Text RSS. + +### Contributing changes + +We chose GitHub for this set of files because they offer one feature which we hope will make contributing changes easier: [file editing](https://github.com/blog/844-forking-with-the-edit-button) through the web interface. + +You can now make changes to any of our site config files and request that your changes be pulled into the main set we maintain. This is what GitHub calls the Fork and Pull model: + +> The Fork & Pull Model lets anyone fork an existing repository and push changes to their personal fork without requiring access be granted to the source repository. The changes must then be pulled into the source repository by the project maintainer. This model reduces the amount of friction for new contributors and is popular with open source projects because it allows people to work independently without upfront coordination. + +When we receive a pull request we'll review the changes and if everything's okay we'll update our copy. + +If a site is not in our set, you can create a file for it in the same way. See [Creating files on GitHub](https://github.com/blog/1327-creating-files-on-github). + +### How to write a site config file + +The quickest and simplest way is to use our [point-and-click interface](http://siteconfig.fivefilters.org). It's a simple tool only intended to create a rule to extract the correct content block. + +For further refinements, e.g. selecting the title, stripping elements, dealing with multi-page articles, please see our [help page](http://help.fivefilters.org/customer/portal/articles/223153-site-patterns). + +### Instapaper + +When we introduced site patterns, we chose to adopt the [same format](http://blog.instapaper.com/post/730281947) used by Instapaper. This allows us to make use of the existing extraction rules contributed by Instapaper users. + +Marco, Instapaper's creator, graciously opened up the database of contributions to everyone: + +> And, recognizing that your efforts could be useful to a wide range of other tools and services, I'll make the list of all of these site-specific configurations available to the public, free, with no strings attached. + +Most of the extraction rules in our set are borrowed from Instapaper. You can see the list maintained by Instapaper at [instapaper.com/bodytext/](http://instapaper.com/bodytext/) (login required). + +### Testing site config files + +Currently you will have to have a copy of Full-Text RSS to test changes to the site config files. In the future we will try to make this process easier. diff --git a/inc/3rdparty/site_config/standard/aachener-nachrichten.de.txt b/inc/3rdparty/site_config/standard/aachener-nachrichten.de.txt old mode 100644 new mode 100755 index 379592e0..b60c15de --- a/inc/3rdparty/site_config/standard/aachener-nachrichten.de.txt +++ b/inc/3rdparty/site_config/standard/aachener-nachrichten.de.txt @@ -1,10 +1,10 @@ -title: //meta[@property='og:title']/@content -body: //*[@class='fliesstext_detail' or @class='detail_fliesstext'] | //img[@itemprop="image" and starts-with(@src, "/sixcms/media.php/")] - -strip_id_or_class: socialshareprivacy1 -strip_id_or_class: zvaFacebookButton - -tidy: no -prune: no - +title: //meta[@property='og:title']/@content +body: //*[@class='fliesstext_detail' or @class='detail_fliesstext'] | //img[@itemprop="image" and starts-with(@src, "/sixcms/media.php/")] + +strip_id_or_class: socialshareprivacy1 +strip_id_or_class: zvaFacebookButton + +tidy: no +prune: no + test_url: http://www.aachener-nachrichten.de/lokales/aachen-detail-an/2517757 \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/aachener-zeitung.de.txt b/inc/3rdparty/site_config/standard/aachener-zeitung.de.txt old mode 100644 new mode 100755 index 4d76fac7..013afa4c --- a/inc/3rdparty/site_config/standard/aachener-zeitung.de.txt +++ b/inc/3rdparty/site_config/standard/aachener-zeitung.de.txt @@ -1,10 +1,10 @@ -title: //meta[@property='og:title']/@content -body: //*[@class='fliesstext_detail' or @class='detail_fliesstext'] | //img[@itemprop="image" and starts-with(@src, "/sixcms/media.php/")] - -strip_id_or_class: socialshareprivacy1 -strip_id_or_class: zvaFacebookButton - -tidy: no -prune: no - +title: //meta[@property='og:title']/@content +body: //*[@class='fliesstext_detail' or @class='detail_fliesstext'] | //img[@itemprop="image" and starts-with(@src, "/sixcms/media.php/")] + +strip_id_or_class: socialshareprivacy1 +strip_id_or_class: zvaFacebookButton + +tidy: no +prune: no + test_url: http://www.aachener-zeitung.de/sixcms/detail.php?template=az_detail&id=2552718 \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/abc.es.txt b/inc/3rdparty/site_config/standard/abc.es.txt old mode 100644 new mode 100755 index a99833de..43aadc49 --- a/inc/3rdparty/site_config/standard/abc.es.txt +++ b/inc/3rdparty/site_config/standard/abc.es.txt @@ -1,7 +1,7 @@ -title: //meta[@property='og:title']/@content -body: //div[@class='datosi' or @class='date' or @class='photo-alt1' or @class='text'] -strip_id_or_class: colB - -prune: no +title: //meta[@property='og:title']/@content +body: //div[@class='datosi' or @class='date' or @class='photo-alt1' or @class='text' or @itemprop='articleBody'] +strip_id_or_class: colB + +prune: no test_url: http://www.abc.es/20120209/tv-series/abci-house-ultima-temporada-201202090936.html \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/abc.net.au.txt b/inc/3rdparty/site_config/standard/abc.net.au.txt old mode 100644 new mode 100755 index 5e6269cb..22b3a0f4 --- a/inc/3rdparty/site_config/standard/abc.net.au.txt +++ b/inc/3rdparty/site_config/standard/abc.net.au.txt @@ -1,10 +1,18 @@ -title: //h1 -author: //div[@class="byline"]/a -date: //span[@class="timestamp"] - -strip: //p[@class="topics"] -strip: //h1 -strip: //div[@class="byline"] -strip: //p[@class="published"] +title: //div[@class='article section']//h1 +author: //div[@class="byline"]/a +date: //span[@class="timestamp"] +body: //div[@class="page section"] + +strip: //a[@class="inline-caption"] +strip: //p[@class="ticker section noprint"] +strip: //p[@class="topics"] +strip: //h1 +strip: //div[@class="byline"] +strip: //p[@class="published"] strip: //div[contains(@class,"featured-scroller")] -test_url: http://www.abc.net.au/news/2011-11-08/crabb-carbon-legislation-abbott-demolition/3652544 \ No newline at end of file +strip_id_or_class: footer + +tidy: no + +test_url: http://www.abc.net.au/news/2013-03-27/open-speed-highways-change-clp-giles/4597892 +test_url: http://www.abc.net.au/news/2013-04-30/credit-growth-remains-subdued/4660054?section=business diff --git a/inc/3rdparty/site_config/standard/abcnews.go.com.txt b/inc/3rdparty/site_config/standard/abcnews.go.com.txt old mode 100644 new mode 100755 index c515d3e4..8d367351 --- a/inc/3rdparty/site_config/standard/abcnews.go.com.txt +++ b/inc/3rdparty/site_config/standard/abcnews.go.com.txt @@ -1,27 +1,27 @@ -title: //h1[@class='headline'] -body: //div[@id='storyText'] -# for video entries -body: //img[@id='ff-img'] | //div[@id='meta']//div[contains(@class, 'overview')] -author: //div[@class='byline'] -date: //div[@class='date'] -strip: //*[@id='date_partner'] - -strip: //div[@class='breadcrumb'] -strip: //div[contains(@class,'show_tools')] -strip: //div[@id='sponsoredByAd'] -strip: //div[contains(@class,'rel_container')] -strip: //p[a[starts-with(@href, 'http://www.twitter.com')]] -strip: //p[a[starts-with(@href, 'http://www.facebook.com')]] -strip: //p[contains(., 'Click here to return to')] -#strip_id_or_class: media -strip_id_or_class: mediaplayer - -replace_string( -replace_string:
      Price: - -strip_id_or_class: collapsePS -strip_id_or_class: expandPS -strip_id_or_class: psPlaceHolde -strip: //li[contains(., 'update product info') or contains(., 'give feedback on images')] - +title: //span[@id = 'btAsinTitle'] +body: (//*[@id='prodImageCell']//a)[1] | //div[@id = 'ps-content'] | //span[@id='actualPriceValue'] | //h2[.='Product Details']/following-sibling::div | //div[@class='h2' and .='Product Description']/following-sibling::div +#strip_id_or_class: quantityDropdownDiv +#strip_id_or_class: addToCartSpan +#strip_id_or_class: oneClickDiv +strip_id_or_class: nocontent +strip_id_or_class: masDynamicConten +strip_id_or_class: dynamic-content +prune: no + +find_string: +replace_string:
      Price: + +strip_id_or_class: collapsePS +strip_id_or_class: expandPS +strip_id_or_class: psPlaceHolde +strip: //li[contains(., 'update product info') or contains(., 'give feedback on images')] + test_url: http://www.amazon.com/Common-Sense-Forestry-Living-Mother/dp/1931498210/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/americandrink.net.txt b/inc/3rdparty/site_config/standard/americandrink.net.txt old mode 100644 new mode 100755 index dee0e868..7145f3ff --- a/inc/3rdparty/site_config/standard/americandrink.net.txt +++ b/inc/3rdparty/site_config/standard/americandrink.net.txt @@ -1,6 +1,6 @@ -title: //div[@class='head']/h2/a -author: //div[@class='head']/a -date: //div[@class='head']/p[@class='date']/a -body: //div[@class='copy'] +title: //div[@class='head']/h2/a +author: //div[@class='head']/a +date: //div[@class='head']/p[@class='date']/a +body: //div[@class='copy'] strip: //p[@class='meta'] test_url: http://americandrink.net/post/10567188712/free-the-hooch \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/americascup.com.txt b/inc/3rdparty/site_config/standard/americascup.com.txt old mode 100644 new mode 100755 index b1673b6a..31723f81 --- a/inc/3rdparty/site_config/standard/americascup.com.txt +++ b/inc/3rdparty/site_config/standard/americascup.com.txt @@ -1,10 +1,10 @@ -title: //div[@class="editorial-content"]/h3 -body: //div[@class="hero-image" or @class="editorial-content"] - -strip: //ul[@class="hero-caption"] -strip_id_or_class: footer - -prune: no -tidy: no - +title: //div[@class="editorial-content"]/h3 +body: //div[@class="hero-image" or @class="editorial-content"] + +strip: //ul[@class="hero-caption"] +strip_id_or_class: footer + +prune: no +tidy: no + test_url: http://www.americascup.com/en/Latest/News/2012/3/Coutts-and-Peyron-tell-transformative-tale-at-Global-Sports-Forum/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/americastestkitchenfeed.com.txt b/inc/3rdparty/site_config/standard/americastestkitchenfeed.com.txt old mode 100644 new mode 100755 index 8bf31ec2..c2b62b5a --- a/inc/3rdparty/site_config/standard/americastestkitchenfeed.com.txt +++ b/inc/3rdparty/site_config/standard/americastestkitchenfeed.com.txt @@ -1,5 +1,5 @@ -title: //h1[@class="post-title"] -author: //span[@class="author"]/a -date: //span[@class="date"] +title: //h1[@class="post-title"] +author: //span[@class="author"]/a +date: //span[@class="date"] body: //div[@class="post-content main"] test_url: http://www.americastestkitchenfeed.com/gadgets-and-gear/2012/07/chill-out-with-tovolos-king-cube-silicone-ice-cube-tray/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/amptoons.com.txt b/inc/3rdparty/site_config/standard/amptoons.com.txt new file mode 100755 index 00000000..87547c63 --- /dev/null +++ b/inc/3rdparty/site_config/standard/amptoons.com.txt @@ -0,0 +1,8 @@ +title: //title + +body: //div[@class="entry-content"] + +author: //span[@class="author vcard"] + +date: //span[@class="entry-date"] +test_url: http://www.amptoons.com/blog/2013/03/14/open-thread-and-link-farm-i-hate-being-sick-edition/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/anandtech.com.txt b/inc/3rdparty/site_config/standard/anandtech.com.txt old mode 100644 new mode 100755 index 8067e03c..7d804918 --- a/inc/3rdparty/site_config/standard/anandtech.com.txt +++ b/inc/3rdparty/site_config/standard/anandtech.com.txt @@ -1,11 +1,11 @@ -author: //a[@class='b'][1] -date: substring-after(substring-before(//div, 'Posted in'), ' on ') -strip_image_src: /content/images/globals/ -strip: //h2[. = 'Page 1']/preceding::p -strip: //h2 - -prune: no - -single_page_link: concat('http://www.anandtech.com/print/', substring-after(//meta[@property='og:url']/@content, '/show/')) - +author: //a[@class='b'][1] +date: substring-after(substring-before(//div, 'Posted in'), ' on ') +strip_image_src: /content/images/globals/ +strip: //h2[. = 'Page 1']/preceding::p +strip: //h2 + +prune: no + +single_page_link: concat('http://www.anandtech.com/print/', substring-after(//meta[@property='og:url']/@content, '/show/')) + test_url: http://www.anandtech.com/show/5812/eurocom-monster-10-clevos-little-monster/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/androidpolice.com.txt b/inc/3rdparty/site_config/standard/androidpolice.com.txt new file mode 100755 index 00000000..8f9b1a21 --- /dev/null +++ b/inc/3rdparty/site_config/standard/androidpolice.com.txt @@ -0,0 +1,5 @@ +body: //div[@class='post_content'] +date: //div[@class='date_day'] | div[@class='date_month'] + +test_url: http://www.androidpolice.com/2014/03/30/music-boss-for-pebble-can-now-control-playback-and-volume-on-chromecast-content-from-your-smartwatch/ + diff --git a/inc/3rdparty/site_config/standard/andyrutledge.com.txt b/inc/3rdparty/site_config/standard/andyrutledge.com.txt old mode 100644 new mode 100755 index f9ffd3c3..ce31fcf5 --- a/inc/3rdparty/site_config/standard/andyrutledge.com.txt +++ b/inc/3rdparty/site_config/standard/andyrutledge.com.txt @@ -1,9 +1,9 @@ -title: //h2 -author: string('Andy Rutledge') -date: //div[@class='articledate'] -body: //div[@class='copybody'] - -strip: //*[@class='space'] -strip: //*[@class='articleFoot'] - +title: //h2 +author: string('Andy Rutledge') +date: //div[@class='articledate'] +body: //div[@class='copybody'] + +strip: //*[@class='space'] +strip: //*[@class='articleFoot'] + test_url: http://www.andyrutledge.com/hungry-for-a-better-menu.php \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/annatravelling.wordpress.com.txt b/inc/3rdparty/site_config/standard/annatravelling.wordpress.com.txt old mode 100644 new mode 100755 index a5c7c08a..2d8937f7 --- a/inc/3rdparty/site_config/standard/annatravelling.wordpress.com.txt +++ b/inc/3rdparty/site_config/standard/annatravelling.wordpress.com.txt @@ -1,9 +1,9 @@ -title: //h1[@class="title"] - -author: ("Anna Manasova") -# is ignored, unfortunately - -date: //p[@class="date"] - +title: //h1[@class="title"] + +author: ("Anna Manasova") +# is ignored, unfortunately + +date: //p[@class="date"] + body: //div[@class="entry"] test_url: http://annatravelling.wordpress.com/2011/11/07/a-day-of-cooking-thai/ \ No newline at end of file diff --git a/inc/3rdparty/site_config/standard/applature.com.txt b/inc/3rdparty/site_config/standard/applature.com.txt old mode 100644 new mode 100755 index a78a6150..a820bba4 --- a/inc/3rdparty/site_config/standard/applature.com.txt +++ b/inc/3rdparty/site_config/standard/applature.com.txt @@ -1,18 +1,18 @@ -title: //h1[contains(@class, 'title')# -body: //div[@id='mainContent']//div[contains(@class, 'section_content')] | //ul[@class='section_footer'] -date: //div[@class='date'] - -strip_id_or_class: sharethis -strip_id_or_class: stats -strip_id_or_class: apply_form -strip_id_or_class: job_map -strip_id_or_class: respond -strip: //h1//span[@class='type'] -strip: //li[@class='print' or @class='map'] - -replace_string(