]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge branch 'dev' into reloadarticle
authorThomas Citharel <tcit@tcit.fr>
Sun, 1 Feb 2015 10:27:10 +0000 (11:27 +0100)
committerThomas Citharel <tcit@tcit.fr>
Sun, 1 Feb 2015 10:27:10 +0000 (11:27 +0100)
21 files changed:
CREDITS.md
composer.json
inc/3rdparty/libraries/MOBIClass/MOBI.php
inc/3rdparty/libraries/MOBIClass/readability/JSLikeHTMLElement.php [deleted file]
inc/3rdparty/libraries/MOBIClass/readability/Readability.php [deleted file]
inc/3rdparty/libraries/readability/Readability.php
inc/3rdparty/libraries/tcpdf/tcpdf.php
inc/3rdparty/makefulltextfeed.php
inc/poche/Poche.class.php
inc/poche/Routing.class.php
inc/poche/Tools.class.php
inc/poche/WallabagEBooks.class.php
install/index.php
install/wallabag_compatibility_test.php
locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo
locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po
locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo
locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po
themes/baggy/home.twig
themes/courgette/config.twig [deleted file]
themes/default/home.twig

index f1e9d7af4a13c1dd8aa1671ee1931fb4a7fb6951..e76c580d38bd8060fdef8fd55a0e186617f4deb4 100644 (file)
@@ -8,9 +8,10 @@ wallabag is based on :
 * Twig http://twig.sensiolabs.org
 * Flash messages https://github.com/plasticbrain/PHP-Flash-Messages
 * Pagination https://github.com/daveismyname/pagination
+* PHPePub https://github.com/Grandt/PHPePub/
 
 wallabag is mainly developed by Nicolas Lœuillet under the MIT License
 
 Thank you so much to @tcitworld and @mariroz.
 
-Contributors : https://github.com/wallabag/wallabag/graphs/contributors
\ No newline at end of file
+Contributors : https://github.com/wallabag/wallabag/graphs/contributors
index 6c69e48ded1ae0f2cb00e88ca79b663ea5a60e5b..a63f2893f526dc6015c3322b585caddbc2cd6c1e 100644 (file)
@@ -1,4 +1,27 @@
 {
+    "name": "wallabag/wallabag",
+    "type": "project",
+    "description": "open source self hostable read-it-later web application",
+    "keywords": ["read-it-later","read it later"],
+    "homepage": "https://github.com/wallabag/wallabag",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Lœuillet",
+            "email": "nicolas@loeuillet.org",
+            "homepage": "http://www.cdetc.fr",
+            "role": "Developer"
+        },
+        {
+            "name": "Thomas Citharel",
+            "homepage": "http://tcit.fr",
+            "role": "Developer"
+        }
+    ],
+    "support": {
+        "email": "hello@wallabag.org",
+        "issues": "https://github.com/wallabag/wallabag/issues"
+    },
     "require": {
         "twig/twig": "1.*",
         "twig/extensions": "1.0.*",
index 17e718c12e04eb05a03860e3e1c82b2a94fe3c8d..df4826b04b0f0a6475a5aedbc309e0a4aadf6d15 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-require_once(dirname(__FILE__)."/readability/Readability.php");
+require_once(dirname(__FILE__)."/../readability/Readability.php");
 require_once(dirname(__FILE__).'/CharacterEntities.php');
 require_once(dirname(__FILE__).'/constants.php');
 require_once(dirname(__FILE__).'/ContentProvider.php');
@@ -189,4 +189,4 @@ class MOBI {
        }
        
 }
-?>
\ No newline at end of file
+?>
diff --git a/inc/3rdparty/libraries/MOBIClass/readability/JSLikeHTMLElement.php b/inc/3rdparty/libraries/MOBIClass/readability/JSLikeHTMLElement.php
deleted file mode 100644 (file)
index 1a8ec88..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-/**
-* JavaScript-like HTML DOM Element
-*
-* This class extends PHP's DOMElement to allow
-* users to get and set the innerHTML property of
-* HTML elements in the same way it's done in
-* JavaScript.
-*
-* Example usage:
-* @code
-* require_once 'JSLikeHTMLElement.php';
-* header('Content-Type: text/plain');
-* $doc = new DOMDocument();
-* $doc->registerNodeClass('DOMElement', 'JSLikeHTMLElement');
-* $doc->loadHTML('<div><p>Para 1</p><p>Para 2</p></div>');
-* $elem = $doc->getElementsByTagName('div')->item(0);
-*
-* // print innerHTML
-* echo $elem->innerHTML; // prints '<p>Para 1</p><p>Para 2</p>'
-* echo "\n\n";
-*
-* // set innerHTML
-* $elem->innerHTML = '<a href="http://fivefilters.org">FiveFilters.org</a>';
-* echo $elem->innerHTML; // prints '<a href="http://fivefilters.org">FiveFilters.org</a>'
-* echo "\n\n";
-*
-* // print document (with our changes)
-* echo $doc->saveXML();
-* @endcode
-*
-* @author Keyvan Minoukadeh - http://www.keyvan.net - keyvan@keyvan.net
-* @see http://fivefilters.org (the project this was written for)
-*/
-class JSLikeHTMLElement extends DOMElement
-{
-       /**
-       * Used for setting innerHTML like it's done in JavaScript:
-       * @code
-       * $div->innerHTML = '<h2>Chapter 2</h2><p>The story begins...</p>';
-       * @endcode
-       */
-       public function __set($name, $value) {
-               if ($name == 'innerHTML') {
-                       // first, empty the element
-                       for ($x=$this->childNodes->length-1; $x>=0; $x--) {
-                               $this->removeChild($this->childNodes->item($x));
-                       }
-                       // $value holds our new inner HTML
-                       if ($value != '') {
-                               $f = $this->ownerDocument->createDocumentFragment();
-                               // appendXML() expects well-formed markup (XHTML)
-                               $result = @$f->appendXML($value); // @ to suppress PHP warnings
-                               if ($result) {
-                                       if ($f->hasChildNodes()) $this->appendChild($f);
-                               } else {
-                                       // $value is probably ill-formed
-                                       $f = new DOMDocument();
-                                       $value = mb_convert_encoding($value, 'HTML-ENTITIES', 'UTF-8');
-                                       // Using <htmlfragment> will generate a warning, but so will bad HTML
-                                       // (and by this point, bad HTML is what we've got).
-                                       // We use it (and suppress the warning) because an HTML fragment will
-                                       // be wrapped around <html><body> tags which we don't really want to keep.
-                                       // Note: despite the warning, if loadHTML succeeds it will return true.
-                                       $result = @$f->loadHTML('<htmlfragment>'.$value.'</htmlfragment>');
-                                       if ($result) {
-                                               $import = $f->getElementsByTagName('htmlfragment')->item(0);
-                                               foreach ($import->childNodes as $child) {
-                                                       $importedNode = $this->ownerDocument->importNode($child, true);
-                                                       $this->appendChild($importedNode);
-                                               }
-                                       } else {
-                                               // oh well, we tried, we really did. :(
-                                               // this element is now empty
-                                       }
-                               }
-                       }
-               } else {
-                       $trace = debug_backtrace();
-                       trigger_error('Undefined property via __set(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE);
-               }
-       }
-
-       /**
-       * Used for getting innerHTML like it's done in JavaScript:
-       * @code
-       * $string = $div->innerHTML;
-       * @endcode
-       */
-       public function __get($name)
-       {
-               if ($name == 'innerHTML') {
-                       $inner = '';
-                       foreach ($this->childNodes as $child) {
-                               $inner .= $this->ownerDocument->saveXML($child);
-                       }
-                       return $inner;
-               }
-
-               $trace = debug_backtrace();
-               trigger_error('Undefined property via __get(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE);
-               return null;
-       }
-
-       public function __toString()
-       {
-               return '['.$this->tagName.']';
-       }
-}
-?>
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/MOBIClass/readability/Readability.php b/inc/3rdparty/libraries/MOBIClass/readability/Readability.php
deleted file mode 100644 (file)
index 9155424..0000000
+++ /dev/null
@@ -1,1069 +0,0 @@
-<?php
-/**
-* Arc90's Readability ported to PHP for FiveFilters.org
-* Based on readability.js version 1.7.1 (without multi-page support)
-* ------------------------------------------------------
-* Original URL: http://lab.arc90.com/experiments/readability/js/readability.js
-* Arc90's project URL: http://lab.arc90.com/experiments/readability/
-* JS Source: http://code.google.com/p/arc90labs-readability
-* Ported by: Keyvan Minoukadeh, http://www.keyvan.net
-* More information: http://fivefilters.org/content-only/
-* License: Apache License, Version 2.0
-* Requires: PHP5
-* Date: 2010-10-29
-*
-* Differences between the PHP port and the original
-* ------------------------------------------------------
-* Arc90's Readability is designed to run in the browser. It works on the DOM
-* tree (the parsed HTML) after the page's CSS styles have been applied and
-* Javascript code executed. This PHP port does not run inside a browser.
-* We use PHP's ability to parse HTML to build our DOM tree, but we cannot
-* rely on CSS or Javascript support. As such, the results will not always
-* match Arc90's Readability. (For example, if a web page contains CSS style
-* rules or Javascript code which hide certain HTML elements from display,
-* Arc90's Readability will dismiss those from consideration but our PHP port,
-* unable to understand CSS or Javascript, will not know any better.)
-*
-* Another significant difference is that the aim of Arc90's Readability is
-* to re-present the main content block of a given web page so users can
-* read it more easily in their browsers. Correct identification, clean up,
-* and separation of the content block is only a part of this process.
-* This PHP port is only concerned with this part, it does not include code
-* that relates to presentation in the browser - Arc90 already do
-* that extremely well, and for PDF output there's FiveFilters.org's
-* PDF Newspaper: http://fivefilters.org/pdf-newspaper/.
-*
-* Finally, this class contains methods that might be useful for developers
-* working on HTML document fragments. So without deviating too much from
-* the original code (which I don't want to do because it makes debugging
-* and updating more difficult), I've tried to make it a little more
-* developer friendly. You should be able to use the methods here on
-* existing DOMElement objects without passing an entire HTML document to
-* be parsed.
-*/
-
-// This class allows us to do JavaScript like assignements to innerHTML
-require_once(dirname(__FILE__).'/JSLikeHTMLElement.php');
-
-// Alternative usage (for testing only!)
-// uncomment the lins below and call Readability.php in your browser
-// passing it the URL of the page you'd like content from, e.g.:
-// Readability.php?url=http://medialens.org/alerts/09/090615_the_guardian_climate.php
-
-/*
-if (!isset($_GET['url']) || $_GET['url'] == '') {
-       die('Please pass a URL to the script. E.g. Readability.php?url=bla.com/story.html');
-}
-$url = $_GET['url'];
-if (!preg_match('!^https?://!i', $url)) $url = 'http://'.$url;
-$html = file_get_contents($url);
-$r = new Readability($html, $url);
-$r->init();
-echo $r->articleContent->innerHTML;
-*/
-
-class Readability
-{
-       public $version = '1.7.1-without-multi-page';
-       public $convertLinksToFootnotes = false;
-       public $revertForcedParagraphElements = true;
-       public $articleTitle;
-       public $articleContent;
-       public $dom;
-       public $url = null; // optional - URL where HTML was retrieved
-       public $debug = false;
-       protected $body = null; //
-       protected $bodyCache = null; // Cache the body HTML in case we need to re-use it later
-       protected $flags = 7; // 1 | 2 | 4;   // Start with all flags set.
-       protected $success = false; // indicates whether we were able to extract or not
-
-       /**
-       * All of the regular expressions in use within readability.
-       * Defined up here so we don't instantiate them repeatedly in loops.
-       **/
-       public $regexps = array(
-               'unlikelyCandidates' => '/combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup|tweet|twitter/i',
-               'okMaybeItsACandidate' => '/and|article|body|column|main|shadow/i',
-               'positive' => '/article|body|content|entry|hentry|main|page|pagination|post|text|blog|story/i',
-               'negative' => '/combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget/i',
-               'divToPElements' => '/<(a|blockquote|dl|div|img|ol|p|pre|table|ul)/i',
-               'replaceBrs' => '/(<br[^>]*>[ \n\r\t]*){2,}/i',
-               'replaceFonts' => '/<(\/?)font[^>]*>/i',
-               // 'trimRe' => '/^\s+|\s+$/g', // PHP has trim()
-               'normalize' => '/\s{2,}/',
-               'killBreaks' => '/(<br\s*\/?>(\s|&nbsp;?)*){1,}/',
-               'video' => '/http:\/\/(www\.)?(youtube|vimeo)\.com/i',
-               'skipFootnoteLink' => '/^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation needed)\s*$/i'
-       );
-
-       /* constants */
-       const FLAG_STRIP_UNLIKELYS = 1;
-       const FLAG_WEIGHT_CLASSES = 2;
-       const FLAG_CLEAN_CONDITIONALLY = 4;
-
-       /**
-       * Create instance of Readability
-       * @param string UTF-8 encoded string
-       * @param string (optional) URL associated with HTML (used for footnotes)
-       */
-       function __construct($html, $url=null)
-       {
-               /* Turn all double br's into p's */
-               /* Note, this is pretty costly as far as processing goes. Maybe optimize later. */
-               $html = preg_replace($this->regexps['replaceBrs'], '</p><p>', $html);
-               $html = preg_replace($this->regexps['replaceFonts'], '<$1span>', $html);
-               $html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
-               $this->dom = new DOMDocument();
-               $this->dom->preserveWhiteSpace = false;
-               $this->dom->registerNodeClass('DOMElement', 'JSLikeHTMLElement');
-               @$this->dom->loadHTML($html);
-               $this->url = $url;
-       }
-
-       /**
-       * Get article title element
-       * @return DOMElement
-       */
-       public function getTitle() {
-               return $this->articleTitle;
-       }
-
-       /**
-       * Get article content element
-       * @return DOMElement
-       */
-       public function getContent() {
-               return $this->articleContent;
-       }
-
-       /**
-       * Runs readability.
-       *
-       * Workflow:
-       *  1. Prep the document by removing script tags, css, etc.
-       *  2. Build readability's DOM tree.
-       *  3. Grab the article content from the current dom tree.
-       *  4. Replace the current DOM tree with the new one.
-       *  5. Read peacefully.
-       *
-       * @return boolean true if we found content, false otherwise
-       **/
-       public function init()
-       {
-               $this->removeScripts($this->dom);
-
-               // Assume successful outcome
-               $this->success = true;
-
-               $bodyElems = $this->dom->getElementsByTagName('body');
-               if ($bodyElems->length > 0) {
-                       if ($this->bodyCache == null) {
-                               $this->bodyCache = $bodyElems->item(0)->innerHTML;
-                       }
-                       if ($this->body == null) {
-                               $this->body = $bodyElems->item(0);
-                       }
-               }
-
-               $this->prepDocument();
-
-               //die($this->dom->documentElement->parentNode->nodeType);
-               //$this->setInnerHTML($this->dom->documentElement, $this->getInnerHTML($this->dom->documentElement));
-               //die($this->getInnerHTML($this->dom->documentElement));
-
-               /* Build readability's DOM tree */
-               $overlay        = $this->dom->createElement('div');
-               $innerDiv       = $this->dom->createElement('div');
-               $articleTitle   = $this->getArticleTitle();
-               $articleContent = $this->grabArticle();
-
-               if (!$articleContent) {
-                       $this->success = false;
-                       $articleContent = $this->dom->createElement('div');
-                       $articleContent->setAttribute('id', 'readability-content');
-                       $articleContent->innerHTML = '<p>Sorry, Readability was unable to parse this page for content.</p>';
-               }
-
-               $overlay->setAttribute('id', 'readOverlay');
-               $innerDiv->setAttribute('id', 'readInner');
-
-               /* Glue the structure of our document together. */
-               $innerDiv->appendChild($articleTitle);
-               $innerDiv->appendChild($articleContent);
-               $overlay->appendChild($innerDiv);
-
-               /* Clear the old HTML, insert the new content. */
-               $this->body->innerHTML = '';
-               $this->body->appendChild($overlay);
-               //document.body.insertBefore(overlay, document.body.firstChild);
-               $this->body->removeAttribute('style');
-
-               $this->postProcessContent($articleContent);
-
-               // Set title and content instance variables
-               $this->articleTitle = $articleTitle;
-               $this->articleContent = $articleContent;
-
-               return $this->success;
-       }
-
-       /**
-       * Debug
-       */
-       protected function dbg($msg) {
-               if ($this->debug) echo '* ',$msg, '<br />', "\n";
-       }
-
-       /**
-       * Run any post-process modifications to article content as necessary.
-       *
-       * @param DOMElement
-       * @return void
-       */
-       public function postProcessContent($articleContent) {
-               if ($this->convertLinksToFootnotes && !preg_match('/wikipedia\.org/', @$this->url)) {
-                       $this->addFootnotes($articleContent);
-               }
-       }
-
-       /**
-       * Get the article title as an H1.
-       *
-       * @return DOMElement
-       */
-       protected function getArticleTitle() {
-               $curTitle = '';
-               $origTitle = '';
-
-               try {
-                       $curTitle = $origTitle = $this->getInnerText($this->dom->getElementsByTagName('title')->item(0));
-               } catch(Exception $e) {}
-
-               if (preg_match('/ [\|\-] /', $curTitle))
-               {
-                       $curTitle = preg_replace('/(.*)[\|\-] .*/i', '$1', $origTitle);
-
-                       if (count(explode(' ', $curTitle)) < 3) {
-                               $curTitle = preg_replace('/[^\|\-]*[\|\-](.*)/i', '$1', $origTitle);
-                       }
-               }
-               else if (strpos($curTitle, ': ') !== false)
-               {
-                       $curTitle = preg_replace('/.*:(.*)/i', '$1', $origTitle);
-
-                       if (count(explode(' ', $curTitle)) < 3) {
-                               $curTitle = preg_replace('/[^:]*[:](.*)/i','$1', $origTitle);
-                       }
-               }
-               else if(strlen($curTitle) > 150 || strlen($curTitle) < 15)
-               {
-                       $hOnes = $this->dom->getElementsByTagName('h1');
-                       if($hOnes->length == 1)
-                       {
-                               $curTitle = $this->getInnerText($hOnes->item(0));
-                       }
-               }
-
-               $curTitle = trim($curTitle);
-
-               if (count(explode(' ', $curTitle)) <= 4) {
-                       $curTitle = $origTitle;
-               }
-
-               $articleTitle = $this->dom->createElement('h1');
-               $articleTitle->innerHTML = $curTitle;
-
-               return $articleTitle;
-       }
-
-       /**
-       * Prepare the HTML document for readability to scrape it.
-       * This includes things like stripping javascript, CSS, and handling terrible markup.
-       *
-       * @return void
-       **/
-       protected function prepDocument() {
-               /**
-               * In some cases a body element can't be found (if the HTML is totally hosed for example)
-               * so we create a new body node and append it to the document.
-               */
-               if($this->dom->documentElement == null){
-                       throw new Exception("No document element");
-               }
-               if ($this->body == null)
-               {
-                       $this->body = $this->dom->createElement('body');
-                       $this->dom->documentElement->appendChild($this->body);
-               }
-
-               $this->body->setAttribute('id', 'readabilityBody');
-
-               /* Remove all style tags in head */
-               $styleTags = $this->dom->getElementsByTagName('style');
-               for ($i = $styleTags->length-1; $i >= 0; $i--)
-               {
-                       $styleTags->item($i)->parentNode->removeChild($styleTags->item($i));
-               }
-
-               /* Turn all double br's into p's */
-               /* Note, this is pretty costly as far as processing goes. Maybe optimize later. */
-               //document.body.innerHTML = document.body.innerHTML.replace(readability.regexps.replaceBrs, '</p><p>').replace(readability.regexps.replaceFonts, '<$1span>');
-               // We do this in the constructor for PHP as that's when we have raw HTML - before parsing it into a DOM tree.
-               // Manipulating innerHTML as it's done in JS is not possible in PHP.
-       }
-
-       /**
-       * For easier reading, convert this document to have footnotes at the bottom rather than inline links.
-       * @see http://www.roughtype.com/archives/2010/05/experiments_in.php
-       *
-       * @return void
-       **/
-       public function addFootnotes($articleContent) {
-               $footnotesWrapper = $this->dom->createElement('div');
-               $footnotesWrapper->setAttribute('id', 'readability-footnotes');
-               $footnotesWrapper->innerHTML = '<h3>References</h3>';
-
-               $articleFootnotes = $this->dom->createElement('ol');
-               $articleFootnotes->setAttribute('id', 'readability-footnotes-list');
-               $footnotesWrapper->appendChild($articleFootnotes);
-
-               $articleLinks = $articleContent->getElementsByTagName('a');
-
-               $linkCount = 0;
-               for ($i = 0; $i < $articleLinks->length; $i++)
-               {
-                       $articleLink  = $articleLinks->item($i);
-                       $footnoteLink = $articleLink->cloneNode(true);
-                       $refLink      = $this->dom->createElement('a');
-                       $footnote     = $this->dom->createElement('li');
-                       $linkDomain   = @parse_url($footnoteLink->getAttribute('href'), PHP_URL_HOST);
-                       if (!$linkDomain && isset($this->url)) $linkDomain = @parse_url($this->url, PHP_URL_HOST);
-                       //linkDomain   = footnoteLink.host ? footnoteLink.host : document.location.host,
-                       $linkText     = $this->getInnerText($articleLink);
-
-                       if ((strpos($articleLink->getAttribute('class'), 'readability-DoNotFootnote') !== false) || preg_match($this->regexps['skipFootnoteLink'], $linkText)) {
-                               continue;
-                       }
-
-                       $linkCount++;
-
-                       /** Add a superscript reference after the article link */
-                       $refLink->setAttribute('href', '#readabilityFootnoteLink-' . $linkCount);
-                       $refLink->innerHTML = '<small><sup>[' . $linkCount . ']</sup></small>';
-                       $refLink->setAttribute('class', 'readability-DoNotFootnote');
-                       $refLink->setAttribute('style', 'color: inherit;');
-
-                       //TODO: does this work or should we use DOMNode.isSameNode()?
-                       if ($articleLink->parentNode->lastChild == $articleLink) {
-                               $articleLink->parentNode->appendChild($refLink);
-                       } else {
-                               $articleLink->parentNode->insertBefore($refLink, $articleLink->nextSibling);
-                       }
-
-                       $articleLink->setAttribute('style', 'color: inherit; text-decoration: none;');
-                       $articleLink->setAttribute('name', 'readabilityLink-' . $linkCount);
-
-                       $footnote->innerHTML = '<small><sup><a href="#readabilityLink-' . $linkCount . '" title="Jump to Link in Article">^</a></sup></small> ';
-
-                       $footnoteLink->innerHTML = ($footnoteLink->getAttribute('title') != '' ? $footnoteLink->getAttribute('title') : $linkText);
-                       $footnoteLink->setAttribute('name', 'readabilityFootnoteLink-' . $linkCount);
-
-                       $footnote->appendChild($footnoteLink);
-                       if ($linkDomain) $footnote->innerHTML = $footnote->innerHTML . '<small> (' . $linkDomain . ')</small>';
-
-                       $articleFootnotes->appendChild($footnote);
-               }
-
-               if ($linkCount > 0) {
-                       $articleContent->appendChild($footnotesWrapper);
-               }
-       }
-
-       /**
-       * Reverts P elements with class 'readability-styled'
-       * to text nodes - which is what they were before.
-       *
-       * @param DOMElement
-       * @return void
-       */
-       function revertReadabilityStyledElements($articleContent) {
-               $xpath = new DOMXPath($articleContent->ownerDocument);
-               $elems = $xpath->query('.//p[@class="readability-styled"]', $articleContent);
-               //$elems = $articleContent->getElementsByTagName('p');
-               for ($i = $elems->length-1; $i >= 0; $i--) {
-                       $e = $elems->item($i);
-                       $e->parentNode->replaceChild($articleContent->ownerDocument->createTextNode($e->textContent), $e);
-                       //if ($e->hasAttribute('class') && $e->getAttribute('class') == 'readability-styled') {
-                       //      $e->parentNode->replaceChild($this->dom->createTextNode($e->textContent), $e);
-                       //}
-               }
-       }
-
-       /**
-       * Prepare the article node for display. Clean out any inline styles,
-       * iframes, forms, strip extraneous <p> tags, etc.
-       *
-       * @param DOMElement
-       * @return void
-       */
-       function prepArticle($articleContent) {
-               $this->cleanStyles($articleContent);
-               $this->killBreaks($articleContent);
-               if ($this->revertForcedParagraphElements) {
-                       $this->revertReadabilityStyledElements($articleContent);
-               }
-
-               /* Clean out junk from the article content */
-               $this->cleanConditionally($articleContent, 'form');
-               $this->clean($articleContent, 'object');
-               $this->clean($articleContent, 'h1');
-
-               /**
-               * If there is only one h2, they are probably using it
-               * as a header and not a subheader, so remove it since we already have a header.
-               ***/
-               if ($articleContent->getElementsByTagName('h2')->length == 1) {
-                       $this->clean($articleContent, 'h2');
-               }
-               $this->clean($articleContent, 'iframe');
-
-               $this->cleanHeaders($articleContent);
-
-               /* Do these last as the previous stuff may have removed junk that will affect these */
-               $this->cleanConditionally($articleContent, 'table');
-               $this->cleanConditionally($articleContent, 'ul');
-               $this->cleanConditionally($articleContent, 'div');
-
-               /* Remove extra paragraphs */
-               $articleParagraphs = $articleContent->getElementsByTagName('p');
-               for ($i = $articleParagraphs->length-1; $i >= 0; $i--)
-               {
-                       $imgCount    = $articleParagraphs->item($i)->getElementsByTagName('img')->length;
-                       $embedCount  = $articleParagraphs->item($i)->getElementsByTagName('embed')->length;
-                       $objectCount = $articleParagraphs->item($i)->getElementsByTagName('object')->length;
-
-                       if ($imgCount === 0 && $embedCount === 0 && $objectCount === 0 && $this->getInnerText($articleParagraphs->item($i), false) == '')
-                       {
-                               $articleParagraphs->item($i)->parentNode->removeChild($articleParagraphs->item($i));
-                       }
-               }
-
-               try {
-                       $articleContent->innerHTML = preg_replace('/<br[^>]*>\s*<p/i', '<p', $articleContent->innerHTML);
-                       //articleContent.innerHTML = articleContent.innerHTML.replace(/<br[^>]*>\s*<p/gi, '<p');
-               }
-               catch (Exception $e) {
-                       $this->dbg("Cleaning innerHTML of breaks failed. This is an IE strict-block-elements bug. Ignoring.: " . $e);
-               }
-       }
-
-       /**
-       * Initialize a node with the readability object. Also checks the
-       * className/id for special names to add to its score.
-       *
-       * @param Element
-       * @return void
-       **/
-       protected function initializeNode($node) {
-               $readability = $this->dom->createAttribute('readability');
-               $readability->value = 0; // this is our contentScore
-               $node->setAttributeNode($readability);
-
-               switch (strtoupper($node->tagName)) { // unsure if strtoupper is needed, but using it just in case
-                       case 'DIV':
-                               $readability->value += 5;
-                               break;
-
-                       case 'PRE':
-                       case 'TD':
-                       case 'BLOCKQUOTE':
-                               $readability->value += 3;
-                               break;
-
-                       case 'ADDRESS':
-                       case 'OL':
-                       case 'UL':
-                       case 'DL':
-                       case 'DD':
-                       case 'DT':
-                       case 'LI':
-                       case 'FORM':
-                               $readability->value -= 3;
-                               break;
-
-                       case 'H1':
-                       case 'H2':
-                       case 'H3':
-                       case 'H4':
-                       case 'H5':
-                       case 'H6':
-                       case 'TH':
-                               $readability->value -= 5;
-                               break;
-               }
-               $readability->value += $this->getClassWeight($node);
-       }
-
-       /***
-       * grabArticle - Using a variety of metrics (content score, classname, element types), find the content that is
-       *               most likely to be the stuff a user wants to read. Then return it wrapped up in a div.
-       *
-       * @return DOMElement
-       **/
-       protected function grabArticle($page=null) {
-               $stripUnlikelyCandidates = $this->flagIsActive(self::FLAG_STRIP_UNLIKELYS);
-               if (!$page) $page = $this->dom;
-               $allElements = $page->getElementsByTagName('*');
-               /**
-               * First, node prepping. Trash nodes that look cruddy (like ones with the class name "comment", etc), and turn divs
-               * into P tags where they have been used inappropriately (as in, where they contain no other block level elements.)
-               *
-               * Note: Assignment from index for performance. See http://www.peachpit.com/articles/article.aspx?p=31567&seqNum=5
-               * TODO: Shouldn't this be a reverse traversal?
-               **/
-               $node = null;
-               $nodesToScore = array();
-               for ($nodeIndex = 0; ($node = $allElements->item($nodeIndex)); $nodeIndex++) {
-               //for ($nodeIndex=$targetList->length-1; $nodeIndex >= 0; $nodeIndex--) {
-                       //$node = $targetList->item($nodeIndex);
-                       $tagName = strtoupper($node->tagName);
-                       /* Remove unlikely candidates */
-                       if ($stripUnlikelyCandidates) {
-                               $unlikelyMatchString = $node->getAttribute('class') . $node->getAttribute('id');
-                               if (
-                                       preg_match($this->regexps['unlikelyCandidates'], $unlikelyMatchString) &&
-                                       !preg_match($this->regexps['okMaybeItsACandidate'], $unlikelyMatchString) &&
-                                       $tagName != 'BODY'
-                               )
-                               {
-                                       $this->dbg('Removing unlikely candidate - ' . $unlikelyMatchString);
-                                       //$nodesToRemove[] = $node;
-                                       $node->parentNode->removeChild($node);
-                                       $nodeIndex--;
-                                       continue;
-                               }
-                       }
-
-                       if ($tagName == 'P' || $tagName == 'TD' || $tagName == 'PRE') {
-                               $nodesToScore[] = $node;
-                       }
-
-                       /* Turn all divs that don't have children block level elements into p's */
-                       if ($tagName == 'DIV') {
-                               if (!preg_match($this->regexps['divToPElements'], $node->innerHTML)) {
-                                       //$this->dbg('Altering div to p');
-                                       $newNode = $this->dom->createElement('p');
-                                       try {
-                                               $newNode->innerHTML = $node->innerHTML;
-                                               //$nodesToReplace[] = array('new'=>$newNode, 'old'=>$node);
-                                               $node->parentNode->replaceChild($newNode, $node);
-                                               $nodeIndex--;
-                                               $nodesToScore[] = $node; // or $newNode?
-                                       }
-                                       catch(Exception $e) {
-                                               $this->dbg('Could not alter div to p, reverting back to div.: ' . $e);
-                                       }
-                               }
-                               else
-                               {
-                                       /* EXPERIMENTAL */
-                                       // TODO: change these p elements back to text nodes after processing
-                                       for ($i = 0, $il = $node->childNodes->length; $i < $il; $i++) {
-                                               $childNode = $node->childNodes->item($i);
-                                               if ($childNode->nodeType == 3) { // XML_TEXT_NODE
-                                                       //$this->dbg('replacing text node with a p tag with the same content.');
-                                                       $p = $this->dom->createElement('p');
-                                                       $p->innerHTML = $childNode->nodeValue;
-                                                       $p->setAttribute('style', 'display: inline;');
-                                                       $p->setAttribute('class', 'readability-styled');
-                                                       $childNode->parentNode->replaceChild($p, $childNode);
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               /**
-               * Loop through all paragraphs, and assign a score to them based on how content-y they look.
-               * Then add their score to their parent node.
-               *
-               * A score is determined by things like number of commas, class names, etc. Maybe eventually link density.
-               **/
-               $candidates = array();
-               for ($pt=0; $pt < count($nodesToScore); $pt++) {
-                       $parentNode      = $nodesToScore[$pt]->parentNode;
-                       // $grandParentNode = $parentNode ? $parentNode->parentNode : null;
-                       $grandParentNode = !$parentNode ? null : (($parentNode->parentNode instanceof DOMElement) ? $parentNode->parentNode : null);
-                       $innerText       = $this->getInnerText($nodesToScore[$pt]);
-
-                       if (!$parentNode || !isset($parentNode->tagName)) {
-                               continue;
-                       }
-
-                       /* If this paragraph is less than 25 characters, don't even count it. */
-                       if(strlen($innerText) < 25) {
-                               continue;
-                       }
-
-                       /* Initialize readability data for the parent. */
-                       if (!$parentNode->hasAttribute('readability'))
-                       {
-                               $this->initializeNode($parentNode);
-                               $candidates[] = $parentNode;
-                       }
-
-                       /* Initialize readability data for the grandparent. */
-                       if ($grandParentNode && !$grandParentNode->hasAttribute('readability') && isset($grandParentNode->tagName))
-                       {
-                               $this->initializeNode($grandParentNode);
-                               $candidates[] = $grandParentNode;
-                       }
-
-                       $contentScore = 0;
-
-                       /* Add a point for the paragraph itself as a base. */
-                       $contentScore++;
-
-                       /* Add points for any commas within this paragraph */
-                       $contentScore += count(explode(',', $innerText));
-
-                       /* For every 100 characters in this paragraph, add another point. Up to 3 points. */
-                       $contentScore += min(floor(strlen($innerText) / 100), 3);
-
-                       /* Add the score to the parent. The grandparent gets half. */
-                       $parentNode->getAttributeNode('readability')->value += $contentScore;
-
-                       if ($grandParentNode) {
-                               $grandParentNode->getAttributeNode('readability')->value += $contentScore/2;
-                       }
-               }
-
-               /**
-               * After we've calculated scores, loop through all of the possible candidate nodes we found
-               * and find the one with the highest score.
-               **/
-               $topCandidate = null;
-               for ($c=0, $cl=count($candidates); $c < $cl; $c++)
-               {
-                       /**
-                       * Scale the final candidates score based on link density. Good content should have a
-                       * relatively small link density (5% or less) and be mostly unaffected by this operation.
-                       **/
-                       $readability = $candidates[$c]->getAttributeNode('readability');
-                       $readability->value = $readability->value * (1-$this->getLinkDensity($candidates[$c]));
-
-                       $this->dbg('Candidate: ' . $candidates[$c]->tagName . ' (' . $candidates[$c]->getAttribute('class') . ':' . $candidates[$c]->getAttribute('id') . ') with score ' . $readability->value);
-
-                       if (!$topCandidate || $readability->value > (int)$topCandidate->getAttribute('readability')) {
-                               $topCandidate = $candidates[$c];
-                       }
-               }
-
-               /**
-               * If we still have no top candidate, just use the body as a last resort.
-               * We also have to copy the body node so it is something we can modify.
-               **/
-               if ($topCandidate === null || strtoupper($topCandidate->tagName) == 'BODY')
-               {
-                       $topCandidate = $this->dom->createElement('div');
-                       $topCandidate->innerHTML = ($page instanceof DOMDocument) ? $page->saveXML($page->documentElement) : $page->innerHTML;
-                       $page->innerHTML = '';
-                       $page->appendChild($topCandidate);
-                       $this->initializeNode($topCandidate);
-               }
-
-               /**
-               * Now that we have the top candidate, look through its siblings for content that might also be related.
-               * Things like preambles, content split by ads that we removed, etc.
-               **/
-               $articleContent        = $this->dom->createElement('div');
-               $articleContent->setAttribute('id', 'readability-content');
-               $siblingScoreThreshold = max(10, ((int)$topCandidate->getAttribute('readability')) * 0.2);
-               $siblingNodes          = $topCandidate->parentNode->childNodes;
-
-               for ($s=0, $sl=$siblingNodes->length; $s < $sl; $s++)
-               {
-                       $siblingNode = $siblingNodes->item($s);
-                       $append      = false;
-
-                       $this->dbg('Looking at sibling node: ' . $siblingNode->nodeName . (($siblingNode->nodeType === XML_ELEMENT_NODE && $siblingNode->hasAttribute('readability')) ? (' with score ' . $siblingNode->getAttribute('readability')) : ''));
-
-                       //dbg('Sibling has score ' . ($siblingNode->readability ? siblingNode.readability.contentScore : 'Unknown'));
-
-                       if ($siblingNode === $topCandidate)
-                       // or if ($siblingNode->isSameNode($topCandidate))
-                       {
-                               $append = true;
-                       }
-
-                       $contentBonus = 0;
-                       /* Give a bonus if sibling nodes and top candidates have the example same classname */
-                       if ($siblingNode->nodeType === XML_ELEMENT_NODE && $siblingNode->getAttribute('class') == $topCandidate->getAttribute('class') && $topCandidate->getAttribute('class') != '') {
-                               $contentBonus += ((int)$topCandidate->getAttribute('readability')) * 0.2;
-                       }
-
-                       if ($siblingNode->nodeType === XML_ELEMENT_NODE && $siblingNode->hasAttribute('readability') && (((int)$siblingNode->getAttribute('readability')) + $contentBonus) >= $siblingScoreThreshold)
-                       {
-                               $append = true;
-                       }
-
-                       if (strtoupper($siblingNode->nodeName) == 'P') {
-                               $linkDensity = $this->getLinkDensity($siblingNode);
-                               $nodeContent = $this->getInnerText($siblingNode);
-                               $nodeLength  = strlen($nodeContent);
-
-                               if ($nodeLength > 80 && $linkDensity < 0.25)
-                               {
-                                       $append = true;
-                               }
-                               else if ($nodeLength < 80 && $linkDensity === 0 && preg_match('/\.( |$)/', $nodeContent))
-                               {
-                                       $append = true;
-                               }
-                       }
-
-                       if ($append)
-                       {
-                               $this->dbg('Appending node: ' . $siblingNode->nodeName);
-
-                               $nodeToAppend = null;
-                               $sibNodeName = strtoupper($siblingNode->nodeName);
-                               if ($sibNodeName != 'DIV' && $sibNodeName != 'P') {
-                                       /* We have a node that isn't a common block level element, like a form or td tag. Turn it into a div so it doesn't get filtered out later by accident. */
-
-                                       $this->dbg('Altering siblingNode of ' . $sibNodeName . ' to div.');
-                                       $nodeToAppend = $this->dom->createElement('div');
-                                       try {
-                                               $nodeToAppend->setAttribute('id', $siblingNode->getAttribute('id'));
-                                               $nodeToAppend->innerHTML = $siblingNode->innerHTML;
-                                       }
-                                       catch(Exception $e)
-                                       {
-                                               $this->dbg('Could not alter siblingNode to div, reverting back to original.');
-                                               $nodeToAppend = $siblingNode;
-                                               $s--;
-                                               $sl--;
-                                       }
-                               } else {
-                                       $nodeToAppend = $siblingNode;
-                                       $s--;
-                                       $sl--;
-                               }
-
-                               /* To ensure a node does not interfere with readability styles, remove its classnames */
-                               $nodeToAppend->removeAttribute('class');
-
-                               /* Append sibling and subtract from our list because it removes the node when you append to another node */
-                               $articleContent->appendChild($nodeToAppend);
-                       }
-               }
-
-               /**
-               * So we have all of the content that we need. Now we clean it up for presentation.
-               **/
-               $this->prepArticle($articleContent);
-
-               /**
-               * Now that we've gone through the full algorithm, check to see if we got any meaningful content.
-               * If we didn't, we may need to re-run grabArticle with different flags set. This gives us a higher
-               * likelihood of finding the content, and the sieve approach gives us a higher likelihood of
-               * finding the -right- content.
-               **/
-               if (strlen($this->getInnerText($articleContent, false)) < 250)
-               {
-                       $this->body->innerHTML = $this->bodyCache;
-
-                       if ($this->flagIsActive(self::FLAG_STRIP_UNLIKELYS)) {
-                               $this->removeFlag(self::FLAG_STRIP_UNLIKELYS);
-                               return $this->grabArticle($this->body);
-                       }
-                       else if ($this->flagIsActive(self::FLAG_WEIGHT_CLASSES)) {
-                               $this->removeFlag(self::FLAG_WEIGHT_CLASSES);
-                               return $this->grabArticle($this->body);
-                       }
-                       else if ($this->flagIsActive(self::FLAG_CLEAN_CONDITIONALLY)) {
-                               $this->removeFlag(self::FLAG_CLEAN_CONDITIONALLY);
-                               return $this->grabArticle($this->body);
-                       }
-                       else {
-                               return false;
-                       }
-               }
-               return $articleContent;
-       }
-
-       /**
-       * Remove script tags from document
-       *
-       * @param DOMElement
-       * @return void
-       */
-       public function removeScripts($doc) {
-               $scripts = $doc->getElementsByTagName('script');
-               for($i = $scripts->length-1; $i >= 0; $i--)
-               {
-                       $scripts->item($i)->parentNode->removeChild($scripts->item($i));
-               }
-       }
-
-       /**
-       * Get the inner text of a node.
-       * This also strips out any excess whitespace to be found.
-       *
-       * @param DOMElement $
-       * @param boolean $normalizeSpaces (default: true)
-       * @return string
-       **/
-       public function getInnerText($e, $normalizeSpaces=true) {
-               $textContent = '';
-
-               if (!isset($e->textContent) || $e->textContent == '') {
-                       return '';
-               }
-
-               $textContent = trim($e->textContent);
-
-               if ($normalizeSpaces) {
-                       return preg_replace($this->regexps['normalize'], ' ', $textContent);
-               } else {
-                       return $textContent;
-               }
-       }
-
-       /**
-       * Get the number of times a string $s appears in the node $e.
-       *
-       * @param DOMElement $e
-       * @param string - what to count. Default is ","
-       * @return number (integer)
-       **/
-       public function getCharCount($e, $s=',') {
-               return substr_count($this->getInnerText($e), $s);
-       }
-
-       /**
-       * Remove the style attribute on every $e and under.
-       *
-       * @param DOMElement $e
-       * @return void
-       */
-       public function cleanStyles($e) {
-               $elems = $e->getElementsByTagName('*');
-               foreach ($elems as $elem) {
-                       $elem->removeAttribute('style');
-               }
-       }
-
-       /**
-       * Get the density of links as a percentage of the content
-       * This is the amount of text that is inside a link divided by the total text in the node.
-       *
-       * @param DOMElement $e
-       * @return number (float)
-       */
-       public function getLinkDensity($e) {
-               $links      = $e->getElementsByTagName('a');
-               $textLength = strlen($this->getInnerText($e));
-               $linkLength = 0;
-               for ($i=0, $il=$links->length; $i < $il; $i++)
-               {
-                       $linkLength += strlen($this->getInnerText($links->item($i)));
-               }
-               if ($textLength > 0) {
-                       return $linkLength / $textLength;
-               } else {
-                       return 0;
-               }
-       }
-
-       /**
-       * Get an elements class/id weight. Uses regular expressions to tell if this
-       * element looks good or bad.
-       *
-       * @param DOMElement $e
-       * @return number (Integer)
-       */
-       public function getClassWeight($e) {
-               if(!$this->flagIsActive(self::FLAG_WEIGHT_CLASSES)) {
-                       return 0;
-               }
-
-               $weight = 0;
-
-               /* Look for a special classname */
-               if ($e->hasAttribute('class') && $e->getAttribute('class') != '')
-               {
-                       if (preg_match($this->regexps['negative'], $e->getAttribute('class'))) {
-                               $weight -= 25;
-                       }
-                       if (preg_match($this->regexps['positive'], $e->getAttribute('class'))) {
-                               $weight += 25;
-                       }
-               }
-
-               /* Look for a special ID */
-               if ($e->hasAttribute('id') && $e->getAttribute('id') != '')
-               {
-                       if (preg_match($this->regexps['negative'], $e->getAttribute('id'))) {
-                               $weight -= 25;
-                       }
-                       if (preg_match($this->regexps['positive'], $e->getAttribute('id'))) {
-                               $weight += 25;
-                       }
-               }
-               return $weight;
-       }
-
-       /**
-       * Remove extraneous break tags from a node.
-       *
-       * @param DOMElement $node
-       * @return void
-       */
-       public function killBreaks($node) {
-               $html = $node->innerHTML;
-               $html = preg_replace($this->regexps['killBreaks'], '<br />', $html);
-               $node->innerHTML = $html;
-       }
-
-       /**
-       * Clean a node of all elements of type "tag".
-       * (Unless it's a youtube/vimeo video. People love movies.)
-       *
-       * @param DOMElement $e
-       * @param string $tag
-       * @return void
-       */
-       public function clean($e, $tag) {
-               $targetList = $e->getElementsByTagName($tag);
-               $isEmbed = ($tag == 'object' || $tag == 'embed');
-
-               for ($y=$targetList->length-1; $y >= 0; $y--) {
-                       /* Allow youtube and vimeo videos through as people usually want to see those. */
-                       if ($isEmbed) {
-                               $attributeValues = '';
-                               for ($i=0, $il=$targetList->item($y)->attributes->length; $i < $il; $i++) {
-                                       $attributeValues .= $targetList->item($y)->attributes->item($i)->value . '|'; // DOMAttr? (TODO: test)
-                               }
-
-                               /* First, check the elements attributes to see if any of them contain youtube or vimeo */
-                               if (preg_match($this->regexps['video'], $attributeValues)) {
-                                       continue;
-                               }
-
-                               /* Then check the elements inside this element for the same. */
-                               if (preg_match($this->regexps['video'], $targetList->item($y)->innerHTML)) {
-                                       continue;
-                               }
-                       }
-                       $targetList->item($y)->parentNode->removeChild($targetList->item($y));
-               }
-       }
-
-       /**
-       * Clean an element of all tags of type "tag" if they look fishy.
-       * "Fishy" is an algorithm based on content length, classnames,
-       * link density, number of images & embeds, etc.
-       *
-       * @param DOMElement $e
-       * @param string $tag
-       * @return void
-       */
-       public function cleanConditionally($e, $tag) {
-               if (!$this->flagIsActive(self::FLAG_CLEAN_CONDITIONALLY)) {
-                       return;
-               }
-
-               $tagsList = $e->getElementsByTagName($tag);
-               $curTagsLength = $tagsList->length;
-
-               /**
-               * Gather counts for other typical elements embedded within.
-               * Traverse backwards so we can remove nodes at the same time without effecting the traversal.
-               *
-               * TODO: Consider taking into account original contentScore here.
-               */
-               for ($i=$curTagsLength-1; $i >= 0; $i--) {
-                       $weight = $this->getClassWeight($tagsList->item($i));
-                       $contentScore = ($tagsList->item($i)->hasAttribute('readability')) ? (int)$tagsList->item($i)->getAttribute('readability') : 0;
-
-                       $this->dbg('Cleaning Conditionally ' . $tagsList->item($i)->tagName . ' (' . $tagsList->item($i)->getAttribute('class') . ':' . $tagsList->item($i)->getAttribute('id') . ')' . (($tagsList->item($i)->hasAttribute('readability')) ? (' with score ' . $tagsList->item($i)->getAttribute('readability')) : ''));
-
-                       if ($weight + $contentScore < 0) {
-                               $tagsList->item($i)->parentNode->removeChild($tagsList->item($i));
-                       }
-                       else if ( $this->getCharCount($tagsList->item($i), ',') < 10) {
-                               /**
-                               * If there are not very many commas, and the number of
-                               * non-paragraph elements is more than paragraphs or other ominous signs, remove the element.
-                               **/
-                               $p      = $tagsList->item($i)->getElementsByTagName('p')->length;
-                               $img    = $tagsList->item($i)->getElementsByTagName('img')->length;
-                               $li     = $tagsList->item($i)->getElementsByTagName('li')->length-100;
-                               $input  = $tagsList->item($i)->getElementsByTagName('input')->length;
-
-                               $embedCount = 0;
-                               $embeds = $tagsList->item($i)->getElementsByTagName('embed');
-                               for ($ei=0, $il=$embeds->length; $ei < $il; $ei++) {
-                                       if (preg_match($this->regexps['video'], $embeds->item($ei)->getAttribute('src'))) {
-                                       $embedCount++;
-                                       }
-                               }
-
-                               $linkDensity   = $this->getLinkDensity($tagsList->item($i));
-                               $contentLength = strlen($this->getInnerText($tagsList->item($i)));
-                               $toRemove      = false;
-
-                               if ( $img > $p ) {
-                                       $toRemove = true;
-                               } else if ($li > $p && $tag != 'ul' && $tag != 'ol') {
-                                       $toRemove = true;
-                               } else if ( $input > floor($p/3) ) {
-                                       $toRemove = true;
-                               } else if ($contentLength < 25 && ($img === 0 || $img > 2) ) {
-                                       $toRemove = true;
-                               } else if($weight < 25 && $linkDensity > 0.2) {
-                                       $toRemove = true;
-                               } else if($weight >= 25 && $linkDensity > 0.5) {
-                                       $toRemove = true;
-                               } else if(($embedCount == 1 && $contentLength < 75) || $embedCount > 1) {
-                                       $toRemove = true;
-                               }
-
-                               if ($toRemove) {
-                                       $tagsList->item($i)->parentNode->removeChild($tagsList->item($i));
-                               }
-                       }
-               }
-       }
-
-       /**
-       * Clean out spurious headers from an Element. Checks things like classnames and link density.
-       *
-       * @param DOMElement $e
-       * @return void
-       */
-       public function cleanHeaders($e) {
-               for ($headerIndex = 1; $headerIndex < 3; $headerIndex++) {
-                       $headers = $e->getElementsByTagName('h' . $headerIndex);
-                       for ($i=$headers->length-1; $i >=0; $i--) {
-                               if ($this->getClassWeight($headers->item($i)) < 0 || $this->getLinkDensity($headers->item($i)) > 0.33) {
-                                       $headers->item($i)->parentNode->removeChild($headers->item($i));
-                               }
-                       }
-               }
-       }
-
-       public function flagIsActive($flag) {
-               return ($this->flags & $flag) > 0;
-       }
-
-       public function addFlag($flag) {
-               $this->flags = $this->flags | $flag;
-       }
-
-       public function removeFlag($flag) {
-               $this->flags = $this->flags & ~$flag;
-       }
-}
-?>
\ No newline at end of file
index 4fa3ba63d4d2aaadede82fc464dcb4e59392aee0..a30012cedff207a6c59d5b61eca64dde62de0df7 100755 (executable)
@@ -46,6 +46,7 @@
 
 // This class allows us to do JavaScript like assignements to innerHTML
 require_once(dirname(__FILE__).'/JSLikeHTMLElement.php');
+libxml_use_internal_errors(true);
 
 // Alternative usage (for testing only!)
 // uncomment the lines below and call Readability.php in your browser 
@@ -697,7 +698,7 @@ class Readability
                $articleContent        = $this->dom->createElement('div');
                $articleContent->setAttribute('id', 'readability-content');
                $siblingScoreThreshold = max(10, ((int)$topCandidate->getAttribute('readability')) * 0.2);
-               $siblingNodes          = $topCandidate->parentNode->childNodes;
+               $siblingNodes          = @$topCandidate->parentNode->childNodes;
                if (!isset($siblingNodes)) {
                        $siblingNodes = new stdClass;
                        $siblingNodes->length = 0;
@@ -1148,4 +1149,4 @@ class Readability
        }
                
 }
-?>
\ No newline at end of file
+?>
index 78694a0e45c09f24f2d3d20fa62ef04dae3e2e12..70c1747ac7c9b541f6aba0b38c6abc4249f41c31 100644 (file)
@@ -2926,12 +2926,18 @@ class TCPDF {
         */
        public function Error($msg) {
                // unset all class variables
+               $this->_destroy(true);
+               throw new Exception('TCPDF ERROR: '.$msg);
+               /* 
+
+               I had problems with the constants for some reason, so here we force
+               
                $this->_destroy(true);
                if (defined('K_TCPDF_THROW_EXCEPTION_ERROR') AND !K_TCPDF_THROW_EXCEPTION_ERROR) {
                        die('<strong>TCPDF ERROR: </strong>'.$msg);
                } else {
                        throw new Exception('TCPDF ERROR: '.$msg);
-               }
+               }*/
        }
 
        /**
@@ -6915,7 +6921,7 @@ class TCPDF {
                                $ph = $this->getHTMLUnitToUnits($h, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
                                $imsize = array($pw, $ph);
                        } else {
-                               $this->Error('[Image] Unable to get the size of the image: '.$file);
+                               $this->Error('[Image] Unable to fetch image: '.$file);
                        }
                }
                // file hash
index a081f88b29f6800dab4cd2249366e35d45cd33dd..27a62d7324890d474dea4cead9bc5c451c45ec32 100755 (executable)
@@ -31,6 +31,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //error_reporting(E_ALL ^ E_NOTICE);\r
 ini_set("display_errors", 1);\r
 @set_time_limit(120);\r
+libxml_use_internal_errors(true); \r
+\r
 \r
 // Deal with magic quotes\r
 if (get_magic_quotes_gpc()) {\r
index f5262a8e8fc5907734560b01b24a7d32b2e13abf..a164ed4753cefc5f1ac169e75e46214a0e52607c 100755 (executable)
@@ -180,6 +180,13 @@ class Poche
                         }
                     }
 
+                    // if there are tags, add them to the new article
+                    if (isset($_GET['tags'])) {
+                        $_POST['value'] = $_GET['tags'];
+                        $_POST['entry_id'] = $last_id;
+                        $this->action('add_tag', $url);
+                    }
+
                     $this->messages->add('s', _('the link has been added successfully'));
                 }
                 else {
@@ -192,20 +199,34 @@ class Poche
                 } else {
                   Tools::redirect('?view=home&closewin=true');
                 }
+                return $last_id;
                 break;
             case 'delete':
-                $msg = 'delete link #' . $id;
-                if ($this->store->deleteById($id, $this->user->getId())) {
-                    if (DOWNLOAD_PICTURES) {
-                        Picture::removeDirectory(ABS_PATH . $id);
+                if (isset($_GET['search'])) {
+                    //when we want to apply a delete to a search
+                    $tags = array($_GET['search']);
+                    $allentry_ids = $this->store->search($tags[0], $this->user->getId());
+                    $entry_ids = array();
+                    foreach ($allentry_ids as $eachentry) {
+                        $entry_ids[] = $eachentry[0];
                     }
-                    $this->messages->add('s', _('the link has been deleted successfully'));
+                } else { // delete a single article
+                    $entry_ids = array($id);
                 }
-                else {
-                    $this->messages->add('e', _('the link wasn\'t deleted'));
-                    $msg = 'error : can\'t delete link #' . $id;
+                foreach($entry_ids as $id) {
+                    $msg = 'delete link #' . $id;
+                    if ($this->store->deleteById($id, $this->user->getId())) {
+                        if (DOWNLOAD_PICTURES) {
+                            Picture::removeDirectory(ABS_PATH . $id);
+                        }
+                        $this->messages->add('s', _('the link has been deleted successfully'));
+                    }
+                    else {
+                        $this->messages->add('e', _('the link wasn\'t deleted'));
+                        $msg = 'error : can\'t delete link #' . $id;
+                    }
+                    Tools::logm($msg);
                 }
-                Tools::logm($msg);
                 Tools::redirect('?');
                 break;
             case 'toggle_fav' :
@@ -220,8 +241,21 @@ class Poche
                 }
                 break;
             case 'toggle_archive' :
-                $this->store->archiveById($id, $this->user->getId());
-                Tools::logm('archive link #' . $id);
+                if (isset($_GET['tag_id'])) {
+                    //when we want to archive a whole tag
+                    $tag_id = $_GET['tag_id'];
+                    $allentry_ids = $this->store->retrieveEntriesByTag($tag_id, $this->user->getId());
+                    $entry_ids = array();
+                    foreach ($allentry_ids as $eachentry) {
+                        $entry_ids[] = $eachentry[0];
+                    }
+                } else { //archive a single article
+                    $entry_ids = array($id);
+                }
+                foreach($entry_ids as $id) {
+                    $this->store->archiveById($id, $this->user->getId());
+                    Tools::logm('archive link #' . $id);
+                }
                 if ( Tools::isAjaxRequest() ) {
                   echo 1;
                   exit;
@@ -414,9 +448,12 @@ class Poche
                     }
 
                     # flattr checking
-                    $flattr = new FlattrItem();
-                    $flattr->checkItem($entry['url'], $entry['id']);
-
+                    $flattr = NULL;
+                    if (FLATTR) {
+                        $flattr = new FlattrItem();
+                        $flattr->checkItem($entry['url'], $entry['id']);
+                    }
+                    
                     # tags
                     $tags = $this->store->retrieveTagsByEntry($entry['id']);
 
@@ -549,6 +586,8 @@ class Poche
                 Tools::redirect($referer);
             }
             $this->messages->add('e', _('login failed: bad login or password'));
+            // log login failure in web server log to allow fail2ban usage
+            error_log('user '.$login.' authentication failure');
             Tools::logm('login failed');
             Tools::redirect();
         }
@@ -634,7 +673,18 @@ class Poche
                         $urlsInserted[] = $url; //add
                         if (isset($record['tags']) && trim($record['tags'])) {
 
-                            // @TODO: set tags
+                            $tags = explode(',', $record['tags']);                                                                                                             
+                                                       foreach($tags as $tag) {
+                                                               $entry_id = $id;
+                                                               $tag_id = $this->store->retrieveTagByValue($tag);
+                                                               if ($tag_id) {
+                                                                       $this->store->setTagToEntry($tag_id['id'], $entry_id);                                                                  
+                                                               } else {
+                                                                       $this->store->createTag($tag);
+                                                                       $tag_id = $this->store->retrieveTagByValue($tag);
+                                                                       $this->store->setTagToEntry($tag_id['id'], $entry_id);
+                                                               }
+                                                       }
 
                         }
                     }
@@ -757,10 +807,11 @@ class Poche
      *
      * @param $token
      * @param $user_id
-     * @param $tag_id
-     * @param string $type
+     * @param $tag_id if $type is 'tag', the id of the tag to generate feed for
+     * @param string $type the type of feed to generate
+     * @param int $limit the maximum number of items (0 means all)
      */
-    public function generateFeeds($token, $user_id, $tag_id, $type = 'home')
+    public function generateFeeds($token, $user_id, $tag_id, $type = 'home', $limit = 0)
     {
         $allowed_types = array('home', 'fav', 'archive', 'tag');
         $config = $this->store->getConfigUser($user_id);
@@ -787,8 +838,13 @@ class Poche
             $entries = $this->store->getEntriesByView($type, $user_id);
         }
 
+        // if $limit is set to zero, use all entries
+        if (0 == $limit) {
+            $limit = count($entries);
+        }
         if (count($entries) > 0) {
-            foreach ($entries as $entry) {
+            for ($i = 0; $i < min(count($entries), $limit); $i++) {
+                $entry = $entries[$i];
                 $newItem = $feed->createNewItem();
                 $newItem->setTitle($entry['title']);
                 $newItem->setSource(Tools::getPocheUrl() . '?view=view&amp;id=' . $entry['id']);
index 5acd08ba608d0704b8d6a76e2152363ba4afe808..a8d00b89806435ada989e973cbeefb736fbf4804 100755 (executable)
@@ -102,7 +102,8 @@ class Routing
                $this->wallabag->login($this->referer);
         } elseif (isset($_GET['feed']) && isset($_GET['user_id'])) {
             $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']);
+            $limit = (isset($_GET['limit']) ? intval($_GET['limit']) : 0);
+            $this->wallabag->generateFeeds($_GET['token'], filter_var($_GET['user_id'],FILTER_SANITIZE_NUMBER_INT), $tag_id, $_GET['type'], $limit);
         }
         
         //allowed ONLY to logged in user
@@ -115,7 +116,7 @@ class Routing
                 // update password
                 $this->wallabag->updatePassword($_POST['password'], $_POST['password_repeat']);
             } elseif (isset($_GET['newuser'])) {
-                $this->wallabag->createNewUser($_POST['newusername'], $_POST['password4newuser']);
+                $this->wallabag->createNewUser($_POST['newusername'], $_POST['password4newuser'], $_POST['newuseremail']);
             } elseif (isset($_GET['deluser'])) {
                 $this->wallabag->deleteUser($_POST['password4deletinguser']);
             } elseif (isset($_GET['epub'])) {
index f803e3b57b1435e6064cefea5e9e48e08b6672ee..7ccfc069b16bb5094be623003198f5f7ecbabd10 100755 (executable)
@@ -342,7 +342,10 @@ final class Tools
             return $json;
         };
 
-        $json = $scope("inc/3rdparty/makefulltextfeed.php", array("url" => $url));
+       // Silence $scope function to avoid
+       // issues with FTRSS when error_reporting is to high
+       // FTRSS generates PHP warnings which break output
+        $json = @$scope("inc/3rdparty/makefulltextfeed.php", array("url" => $url));
 
         // Clearing and restoring context
         foreach ($GLOBALS as $key => $value) {
index bc40990b1e2cd90694e57ddd6b71df2412538c65..558315719f336e50bc32b21a4a41bb5c137de328 100644 (file)
@@ -33,7 +33,7 @@ class WallabagEBooks
                 $entry = $this->wallabag->store->retrieveOneById($entryID, $this->wallabag->user->getId());
                 $this->entries = array($entry);
                 $this->bookTitle = $entry['title'];
-                $this->bookFileName = substr($this->bookTitle, 0, 200);
+                $this->bookFileName = str_replace('/', '_', substr($this->bookTitle, 0, 200));
                 $this->author = preg_replace('#^w{3}.#', '', Tools::getdomain($entry["url"])); # if only one article, set author to domain name (we strip the eventual www part)
                 Tools::logm('Producing ebook from article ' . $this->bookTitle);
                 break;
@@ -81,6 +81,9 @@ class WallabagEpub extends WallabagEBooks
     public function produceEpub()
     {
         Tools::logm('Starting to produce ePub 3 file');
+
+        try {
+
         $content_start =
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
             . "<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\">\n"
@@ -155,6 +158,11 @@ class WallabagEpub extends WallabagEBooks
         $book->finalize();
         $zipData = $book->sendBook($this->bookFileName);
         Tools::logm('Ebook produced');
+       }
+        catch (Exception $e) {
+            Tools::logm('PHPePub has encountered an error : '.$e->getMessage());
+            $this->wallabag->messages->add('e', $e->getMessage());
+        }
     }
 } 
 
@@ -167,7 +175,7 @@ class WallabagMobi extends WallabagEBooks
 
        public function produceMobi()
        {
-
+               try {
         Tools::logm('Starting to produce Mobi file');
         $mobi = new MOBI();
         $content = new MOBIFile();
@@ -194,9 +202,17 @@ class WallabagMobi extends WallabagEBooks
         }
         $mobi->setContentProvider($content);
 
+        // the browser inside Kindle Devices doesn't likes special caracters either, we limit to A-z/0-9
+        $this->bookFileName = preg_replace('/[^A-Za-z0-9\-]/', '', $this->bookFileName);
+
         // we offer file to download
         $mobi->download($this->bookFileName.'.mobi');
         Tools::logm('Mobi file produced');
+       }
+        catch (Exception $e) {
+            Tools::logm('PHPMobi has encountered an error : '.$e->getMessage());
+            $this->wallabag->messages->add('e', $e->getMessage());
+        }
     }
 }
 
@@ -206,15 +222,16 @@ class WallabagPDF extends WallabagEbooks
        {
 
         Tools::logm('Starting to produce PDF file');
-
+        @define ('K_TCPDF_THROW_EXCEPTION_ERROR', TRUE);
+        try {
         $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
 
         Tools::logm('Filling metadata for PDF...');
         $pdf->SetCreator(PDF_CREATOR);
-        $pdf->SetAuthor('');
+        $pdf->SetAuthor('wallabag');
         $pdf->SetTitle($this->bookTitle);
-        $pdf->SetSubject('TCPDF Tutorial');
-        $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+        $pdf->SetSubject('Articles via wallabag');
+        $pdf->SetKeywords('wallabag');
                
         Tools::logm('Adding introduction...');
         $pdf->AddPage();
@@ -229,18 +246,26 @@ class WallabagPDF extends WallabagEbooks
         $i = 1;
         Tools::logm('Adding actual content...');
         foreach ($this->entries as $item) {
+               $tags = $this->wallabag->store->retrieveTagsByEntry($entry['id']);
+               foreach ($tags as $tag) {
+                $pdf->SetKeywords($tag['value']);
+            }
             $pdf->AddPage();
             $html = '<h1>' . $item['title'] . '</h1>';
             $html .= $item['content'];
             $pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
-            $i = $i+1;
         }
 
         // set image scale factor
         $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
         
-
+        
         $pdf->Output($this->bookFileName . '.pdf', 'FD');
+        }
+        catch (Exception $e) {
+            Tools::logm('TCPDF has encountered an error : '.$e->getMessage());
+            $this->wallabag->messages->add('e', $e->getMessage());
+            }
 
        }
 }
index 06d1a4198049cd192021aa44de505d032d2d266c..892af2416858b92d3a6a1dcb8572d43f013afcfd 100755 (executable)
 $errors = array();
 $successes = array();
 
-/* Function taken from at http://php.net/manual/en/function.rmdir.php#110489
- * Idea : nbari at dalmp dot com
- * Rights unknown
- * Here in case of .gitignore files
- */
-function delTree($dir) {
-    $files = array_diff(scandir($dir), array('.','..'));
-    foreach ($files as $file) {
-      (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
-    }
-    return rmdir($dir);
-  }
+require_once('wallabag_compatibility_test.php');
 
 if (isset($_GET['clean'])) {
     if (is_dir('install')){
@@ -58,136 +47,109 @@ if (isset($_POST['download'])) {
 else if (isset($_POST['install'])) {
     if (!is_dir('vendor')) {
         $errors[] = 'You must install twig before.';
-    }
-    else {
+    } else {
         $continue = true;
-        // Create config.inc.php
-        if (!copy('inc/poche/config.inc.default.php', 'inc/poche/config.inc.php')) {
-            $errors[] = 'Installation aborted, impossible to create inc/poche/config.inc.php file. Maybe you don\'t have write access to create it.';
-            $continue = false;
-        }
-        else {
-            function generate_salt() {
-                mt_srand(microtime(true)*100000 + memory_get_usage(true));
-                return md5(uniqid(mt_rand(), true));
-            }
+        $salt = generate_salt();
+        $content = file_get_contents('inc/poche/config.inc.default.php');
 
-            $content = file_get_contents('inc/poche/config.inc.php');
-            $salt = generate_salt();
-            $content = str_replace("define ('SALT', '');", "define ('SALT', '".$salt."');", $content);
-            file_put_contents('inc/poche/config.inc.php', $content);
-        }
+        // User informations
+        $username = trim($_POST['username']);
+        $password = trim($_POST['password']);
+        $salted_password = sha1($password . $username . $salt);
 
-        if ($continue) {
-
-            // User informations
-            $username = trim($_POST['username']);
-            $password = trim($_POST['password']);
-            $salted_password = sha1($password . $username . $salt);
-
-            // Database informations
-            $moreQueries = array();
-            if ($_POST['db_engine'] == 'sqlite') {
-                if (!copy('install/poche.sqlite', 'db/poche.sqlite')) {
-                    $errors[] = 'Impossible to create inc/poche/config.inc.php file.';
-                    $continue = false;
-                }
-                else {
-                    $db_path = 'sqlite:' . realpath('') . '/db/poche.sqlite';
-                    $handle = new PDO($db_path);
-                    $sql_structure = "";
-                }
+        // Database informations
+        $moreQueries = array();
+
+        if ($_POST['db_engine'] == 'sqlite') {
+            if (!copy('install/poche.sqlite', 'db/poche.sqlite')) {
+                $errors[] = 'Impossible to create the SQLite database file.';
             }
             else {
-                $content = file_get_contents('inc/poche/config.inc.php');
-
-                if ($_POST['db_engine'] == 'mysql') {
-                    $db_path = 'mysql:host=' . $_POST['mysql_server'] . ';dbname=' . $_POST['mysql_database'] . ';charset=utf8mb4';
-                    $content = str_replace("define ('STORAGE_SERVER', 'localhost');", "define ('STORAGE_SERVER', '".$_POST['mysql_server']."');", $content);
-                    $content = str_replace("define ('STORAGE_DB', 'poche');", "define ('STORAGE_DB', '".$_POST['mysql_database']."');", $content);
-                    $content = str_replace("define ('STORAGE_USER', 'poche');", "define ('STORAGE_USER', '".$_POST['mysql_user']."');", $content);
-                    $content = str_replace("define ('STORAGE_PASSWORD', 'poche');", "define ('STORAGE_PASSWORD', '".$_POST['mysql_password']."');", $content);
-                    $handle = new PDO($db_path, $_POST['mysql_user'], $_POST['mysql_password'], array(
-                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
-                    ));
-
-                    $moreQueries[] = "INSERT INTO `entries` (`id`, `title`, `url`, `is_read`, `is_fav`, `content`, `user_id`) VALUES
+                $db_path = 'sqlite:' . realpath('') . '/db/poche.sqlite';
+                $handle = new PDO($db_path);
+                $handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+                $sql_structure = "";
+            }
+        } else {
+            // MySQL and Postgre
+            try {
+
+            if ($_POST['db_engine'] == 'mysql') {
+                $db_path = 'mysql:host=' . $_POST['mysql_server'] . ';dbname=' . $_POST['mysql_database'] . ';charset=utf8mb4';
+                $content = str_replace("define ('STORAGE_SERVER', 'localhost');", "define ('STORAGE_SERVER', '".$_POST['mysql_server']."');", $content);
+                $content = str_replace("define ('STORAGE_DB', 'poche');", "define ('STORAGE_DB', '".$_POST['mysql_database']."');", $content);
+                $content = str_replace("define ('STORAGE_USER', 'poche');", "define ('STORAGE_USER', '".$_POST['mysql_user']."');", $content);
+                $content = str_replace("define ('STORAGE_PASSWORD', 'poche');", "define ('STORAGE_PASSWORD', '".$_POST['mysql_password']."');", $content);
+                $handle = new PDO($db_path, $_POST['mysql_user'], $_POST['mysql_password'], array(
+                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
+                ));
+
+                $moreQueries[] = "INSERT INTO `entries` (`id`, `title`, `url`, `is_read`, `is_fav`, `content`, `user_id`) VALUES
 (1, 'Framabag, un nouveau service libre et gratuit', 'http://www.framablog.org/index.php/post/2014/02/05/Framabag-service-libre-gratuit-interview-developpeur', 0, 0, 0x0a3c68323e556e6520696e74657276696577206465204e69636f6c61732c20736f6e2064c3a976656c6f70706575722e3c2f68323e0a3c703e3c656d3e496c206e6520766f757320612073c3bb72656d656e742070617320c3a96368617070c3a920717565206e6f74726520636f6e736f6d6d6174696f6e20646520636f6e74656e75732064752057656220657374207465727269626c656d656e74206368726f6e6f706861676520657420706172746963756c69c3a872656d656e7420667275737472616e746520746f757420c3a0206c6120666f6973c2a03a206e6f6e207365756c656d656e74206e6f757320706173736f6e732062656175636f7570202874726f70c2a03f292064652074656d707320656e206c69676e6520c3a0206578706c6f726572206c6573206d696e6573206175726966c3a8726573206465206c6120746f696c652c20792064c3a974656374616e742070c3a970697465732065742066696c6f6e732c206d616973206e6f757320736f6d6d657320737572746f757420636f6e7374616d6d656e7420656e206d616e7175652e204dc3aa6d65207369206e6f7573206e6520736f6d6d6573207061732064616e73206c65207a617070696e67206672c3a96ec3a9746971756520736920666163696c656d656e742064c3a96e6f6e63c3a920706172206c657320646f637465732070737963686f6c6f677565732071756920706f6e74696669656e7420737572206c65732064616e67657273206475206e756dc3a9726971756520706f7572206c6573206a65756e65732063657276656c6c65732c20696c206e6f7573207669656e7420736f7576656e74206c6520676fc3bb7420616d6572206465206ce28099696e6163686576c3a9c2a03a20706173206c652074656d707320646520746f7574206c69726520283c6120687265663d22687474703a2f2f66722e77696b74696f6e6172792e6f72672f77696b692f544c4452223e544c3b44523c2f613e2065737420646576656e75206c6520636c696e2064e28099c593696c206d692d6669677565206d692d72616973696e2064e28099756e652067c3a96ec3a9726174696f6e206465206c65637465757273207072657373c3a973292c207061732074726f70206c652074656d70732064652072c3a9666cc3a963686972206e6f6e20706c75732068c3a96c61732c20706173206c652074656d707320646520737569767265206c6120726962616d62656c6c65206465206c69656e73206173736f6369c3a97320c3a020756e2061727469636c65e280a63c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e506f7572206e6f757320646f6e6e657220626f6e6e6520636f6e736369656e63652c206e6f75732072616e67656f6e73207363727570756c657573656d656e7420756e206d61727175652d7061676520646520706c75732064616e7320756e20736f75732d646f73736965722071756920656e20636f6d706f7274652064c3a96ac3a0203235362c206e6f7573206e6f746f6e7320756e20c3a96cc3a96d656e7420646520706c75732064616e73206c6120746f756a6f757273207269646963756c656d656e74206c6f6e67756520746f75646f756c697374652c2062726566206e6f75732072656d6574746f6e7320c3a020706c757320746172642c2063e280996573742dc3a02d64697265206c6520706c757320736f7576656e742061757820696e74726f757661626c65732063616c656e6465732067726563717565732c206c6520736f696e206465206c69726520767261696d656e7420756e2061727469636c65206a7567c3a920696e74c3a972657373616e742c20646520726567617264657220756e6520766964c3a96f207369676e616cc3a96520706172206c65732072c3a97a6f73736f63696f732c206465206c69726520756e20636861706974726520656e746965722064e28099756e206f75767261676520646973706f6e69626c6520656e206c69676e65e280a63c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e416c6f7273206269656e2073c3bb722c20c3a02064c3a966617574206465206e6f757320646f6e6e657220746f7574206c652074656d70732071756920736572616974206ec3a963657373616972652c2064657320736f6c7574696f6e73206578697374656e7420706f7572206e6f7573207065726d657474726520646520c2abc2a06c69726520706c75732074617264c2a0c2bb20656e20736175766567617264616e74206c65207072c3a9636965757820706f6c6c656e206465206e6f7320627574696e61676573206465207369746520656e20736974652c2065742064e28099656e20666169726520756c74c3a97269657572656d656e7420766f747265206d69656cc2a03b2063e280996573742062656c20657420626f6e206d616973206c65732072756368657320736f6e7420756e207065752064697374616e7465732c20c3a7612073e28099617070656c6c65206c6520636c6f756420286e6f7320616d69732074656368696573206de280996f6e74206269656e206578706c697175c3a9206d616973206ae280996169207365756c656d656e7420636f6d70726973207175652064657320747275637320c3a0206d6f6920736f6e742073757220646573206d616368696e6573206c6f696e7461696e65732c20c3a761206e65206d652072617373757265207061732074726f702920657420656c6c657320736f6e7420736f7576656e742070726f707269c3a97461697265732c206e65206c61697373616e7420656e7472657220717565206c6573203c733e7574696c69736174657572733c2f733e20636f6e736f6d6d61746575727320706179616e74732065742071756920636f6e73656e74656e7420c3a0206c6575727320636f6e646974696f6e732e2053616e7320636f6d70746572207175652064652067726f7320626f7572646f6e73207669656e6e656e742070726f666974657220706c7573206f75206d6f696e73206469736372c3a874656d656e7420646520746f757465732063657320747261636573206465206e6f75732d6dc3aa6d657320717569207065726d657474656e74206465206d6f6ec3a97469736572206e6f7472652070726f66696cc2a03a207369206a6520636f6c6c65637465207375722063657320736572766963657320286e65206c6573206e6f6d6d6f6e73207061732c206a757374656d656e742920756e652073c3a97269652064e2809961727469636c657320737572206ce280996964c3a965206465204e6174757265206368657a2044696465726f742c206a6520726563657672616920646976657273657320736f6c6c696369746174696f6e7320706f757220646576656e697220636c69656e74206465206c6120626f757469717565204e61747572652026616d703b2044c3a9636f75766572746520647520626f756c65766172642044696465726f742e2045742073692064e280996176656e74757265206c65732070726f6772616d6d6573206465206c61204e5341206d6f756c696e656e7420737572206c6520736572766963652c206a6520736572616920706575742dc3aa74726520756e206a6f75722064616e7320756e65206c6973746520646573206d696c6974616e7473206e61747572697374657320696e64c3a973697261626c657320737572206c657320766f6c73206465206c612050616e416d20286a65206e65207361697320706c75732074726f70207369206a6520706c616973616e7465206cc3a02c2066696e616c656d656e74e280a6293c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4c6120626f6e6e65206964c3a965c2a03a20c2abc2a0736520636f6e7374697475657220756e2072c3a9736572766f697220646520646f63756d656e74732073c3a96c656374696f6e6ec3a97320c3a020706172636f7572697220706c75732074617264c2a0c2bb20617070656c61697420646f6e6320756e6520617574726520626f6e6e65206964c3a9652c2063656c6c652064e2809961766f6972206c6520636f6e7472c3b46c652064652063652072c3a9736572766f69722c206465206e6f74726520636f6c6c656374696f6e20706572736f6e6e656c6c652e2043e28099657374204e69636f6c6173204cc59375696c6c65742c2063692d646573736f757320696e74657276696577c3a92c207175692073e28099792065737420636f6c6cc3a9206176656320756e652062656c6c65206170706c69636174696f6e20617070656cc3a96520657568e280a6206f75692c20617070656cc3a9652057616c6c616261672e3c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4672616d61736f667420736f757469656e742064e28099617574616e7420706c757320736f6e20696e6974696174697665207175e280993c6120687265663d22687474703a2f2f7777772e6672616d61626c6f672e6f72672f696e6465782e7068702f706f73742f323031342f30312f33312f4765656b74696f6e6e6572642d57616c6c61626167223e6f6e206c7569206120636865726368c3a920646573206d6973c3a872657320706f757220756e6520686973746f697265206465206e6f6d3c2f613e206574207175e28099696c2065737420706f737369626c652064e28099696e7374616c6c657220736f692d6dc3aa6d6520756e6520636f7069652064652057616c6c616261672073757220736f6e2070726f70726520736974652e3c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4c6520706574697420706c7573206465204672616d61736f66742c2072c3a97365617520746f756a6f7572732064c3a973697265757820646520766f75732070726f706f7365722064657320616c7465726e617469766573206c6962c3a972617472696365732c2063e2809965737420646520766f75732070726f706f736572202873757220696e736372697074696f6e207072c3a9616c61626c652920756e20616363c3a873206175204672616d616261672c2061757472656d656e742064697420766f7472652057616c6c616261672073757220756e2073657276657572204672616d612a2061766563206e6f74726520676172616e74696520646520636f6e666964656e7469616c6974c3a92e20436f6d6d6520706f7572206c65204672616d616e6577732c206e6f757320766f7573206163637565696c6c6f6e7320766f6c6f6e74696572732064616e73206c61206c696d697465206465206e6f732063617061636974c3a9732c20656e20766f757320696e766974616e7420c3a020766f7573206c616e6365722064616e7320766f747265206175746f2d68c3a962657267656d656e742064652057616c6c616261672e3c6272202f3e4365742061727469636c65206573742074726f70206c6f6e67c2a03f204d657474657a2d6c652064616e73203c6120687265663d22687474703a2f2f7777772e6672616d616261672e6f72672f696e6465782e706870223e766f747265204672616d616261673c2f613e20657420686f702e3c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4672616d61626c6f67c2a03a2053616c7574204e69636f6c6173e280a62054752070657578207465207072c3a973656e74657220627269c3a876656d656e74c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e53616c7574c2a0212044c3a976656c6f70706575722050485020646570756973207175656c7175657320616e6ec3a96573206d61696e74656e616e742028313020616e73292c206ae28099616920766f756c75206d652072656d657474726520c3a0206e697665617520746563686e697175656d656e74207061726c616e742028646570756973203320616e732c206ae28099616920706173206d616c206cc3a26368c3a9206c6520636c6176696572292e20506f7572206d6573206265736f696e7320706572736f732c206ae28099616920646f6e63206372c3a9c3a920756e2070657469742070726f6a657420706f75722072656d706c6163657220756e6520736f6c7574696f6e2070726f707269c3a97461697265206578697374616e74652e2053616e7320617563756e65207072c3a974656e74696f6e2c206ae2809961692068c3a962657267c3a92063652070726f6a6574207375722047697468756220657420636f6d6d652063e28099657374206c61207365756c6520736f6c7574696f6e203c656d3e6f70656e20736f757263653c2f656d3e20646520636520747970652c206c65206e6f6d62726520646520706572736f6e6e657320696e74c3a972657373c3a965732061206175676d656e74c3a920e280a63c2f703e0a3c703e3c656d3e4c6573207574696c6973617465757273206465207365727669636573204672616d61736f6674206e65206c6520736176656e742070617320666f7263c3a96d656e742c206d6169732074752061732064c3a96ac3a020706173206d616c207061727469636970c3a920c3a0206c61204672616d6147616c617869652c206e6f6ec2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e456e2065666665742e204ae28099616920636f6d6d656e63c3a920756e20706c7567696e20706f7572204672616d616e6577732c203c6120687265663d2268747470733a2f2f6769746875622e636f6d2f6e69636f736f6d622f74747273732d70757267652d6163636f756e7473223e74747273732d70757267652d6163636f756e74733c2f613e2c20717569207065726d6574206465206e6574746f796572206c61206261736520646520646f6e6ec3a9657320646520636f6d7074657320706c7573207574696c6973c3a9732e204d616973206365203c656d3e706c7567696e3c2f656d3e2061206265736f696e2064e28099c3aa747265207465726d696ec3a920c3a0203130302520706f757220c3aa74726520696e74c3a96772c3a9206175207365696e206465204672616d616e6577732028657420646f6e632064652054696e792054696e7920525353292c207369207175656c7175e28099756e20736f756861697465206de2809961696465722c20696c206ee2809979206120617563756e20736f7563692e3c6272202f3e4ae28099616920617573736920666169742031206f7520322061707061726974696f6e732064616e73206465732074726164756374696f6e7320706f7572204672616d61626c6f672e205269656e2064e2809965787472616f7264696e616972652c206a65206e652073756973207061732062696c696e6775652c20c3a761206d65207065726d6574206465206de28099656e747261c3ae6e65722e3c2f703e0a3c703e3c656d3e5061726c6f6e73206465207375697465206465206365207175692066c3a2636865c2a03a20746f6e206170706c69636174696f6e2057616c6c616261672c20656c6c652073e28099617070656c6c6169742070617320e2809c506f636865e2809d2c206176616e74c2a03f205475206e6f7573207261636f6e746573206ce28099686973746f697265c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e45756820656e20656666657420e280a62044c3a96ac3a02c20706f757271756f69203c656d3e706f6368653c2f656d3ec2a03f20506172636520717565206ce28099756e206465732074726f697320c2abc2a074c3a96e6f7273c2a0c2bb20737572206c65206d61726368c3a92073e28099617070656c6c65203c656d3e506f636b65743c2f656d3e2e20436f6d6d65206d6f6e206170706c69206ee28099c3a9746169742064657374696ec3a965207175e28099c3a0206d6f6e20757361676520706572736f6e6e656c2061752064c3a9706172742c206a65206e65206d6520737569732070617320746f72747572c3a9206269656e206c6f6e6774656d70732e3c2f703e0a3c703e43657420c3a974c3a92c206f6e2061206661696c6c69206368616e676572206465206e6f6d2c207175616e6420696c2079206120657520646520706c757320656e20706c75732064e280997574696c69736174657572732e2045742070756973206f6e2073e28099657374206469742071756520706f6368652c2063e28099c3a97461697420706173206d616c2c20c3a76120736f6e6e616974206269656e206672616ec3a761697320657420707569732061766563206c6573207175656c717565732064697a61696e65732064e280997574696c69736174657572732c206f6e206e652067c3aa6e657261697420706572736f6e6e652e3c2f703e0a3c703e43e280996573742073616e7320636f6d707465722061766563206c657320736f6369c3a974c3a97320616dc3a972696361696e6573206574206c6575722066c3a2636865757365206d616e696520646520766f756c6f697220656e766f796572206c657572732061766f6361747320c3a020746f757420626f7574206465206368616d702e204c65203233206a616e766965722c206ae280996169207265c3a77520756e20656d61696c206465206c61207061727420647520636162696e65742064e2809961766f6361747320646520506f636b6574206d652064656d616e64616e74206465206368616e676572206c65206e6f6d2c206c65206c6f676f2c206465206e6520706c7573207574696c69736572206c65207465726d6520e2809c726561642d69742d6c61746572e2809d2028c2abc2a06c6973657a206c6520706c75732074617264c2a0c2bb29206574206465206e6520706c757320646972652071756520506f636b6574206ee280996573742070617320677261747569742028746f7574206573742070617274692064e280993c6120687265663d2268747470733a2f2f747769747465722e636f6d2f77616c6c616261676170702f7374617475732f343233373836333635393434323235373932223e756e2074776565743c2f613e206fc3b9206a65207175616c6966696520506f636b657420646520c2abc2a06e6f6e2066726565c2a0c2bb20c3a0207361766f6972206e6f6e206c69627265292e20427265662c206dc3aa6d65207369206a652073656d626c6169732064616e73206d6f6e2064726f69742c206ae280996169207175616e64206dc3aa6d652070726973206c612064c3a9636973696f6e206465206368616e676572206465206e6f6d2065742057616c6c6162616720657374206ec3a92c20737569746520617578203c6120687265663d22687474703a2f2f6672616d61646174652e6f72672f73747564732e7068703f736f6e646167653d6c6c6370366f6a70796339706b6c6861223e64697a61696e65732064652070726f706f736974696f6e73206465206e6f6d207265c3a77565733c2f613e2e2043e2809965737420756e206dc3a96c616e676520656e747265206c652077616c6c61627920286465206c612066616d696c6c6520646573206b616e676f75726f75732c207175692073746f636b656e742064616e73206c65757220706f63686520636520717569206c65757220657374206368657229206574203c656d3e6261673c2f656d3e20286c6573207465726d657320736163202f207361636f636865202f2062657361636520736f6e7420c3a96e6f726dc3a96d656e7420726576656e7573292e204d616973206d61696e74656e616e742c206f6e207661206465206ce280996176616e742c20706c75732064652074656d707320c3a020706572647265206176656320c3a7612c206f6e2061206475207061696e20737572206c6120706c616e6368652e3c6272202f3e3c696d67207372633d22687474703a2f2f7777772e6672616d61626c6f672e6f72672f7075626c69632f5f696d672f6672616d61626c6f672f77616c6c6162795f626162792e6a70672220616c743d2277616c6c61627920617665632062c3a962c3a92064616e7320736120706f6368652220636c6173733d22633122207469746c653d2277616c6c61627920617665632062c3a962c3a92064616e7320736120706f63686522202f3e206372c3a96469742070686f746f203c6120687265663d22687474703a2f2f7777772e666c69636b722e636f6d2f70686f746f732f3236373832383634404e30302f353032373230323233342f696e2f70686f746f6c6973742d3845654a35412d6831544c36762d4e454c38312d636e4e6b536f2d39594d3174762d374b636736622d387a70416f612d61315a4c4d4e2d39594d3339722d3768355341442d38456548664c2d3845654677752d647456776e4d2d38756f4d45312d4a457a58652d47713471792d3932564a50522d43786531762d38483344324a2d61315a464e732d395937324b362d38456547784c2d354c353346782d354e6b454e732d3555384354592d354e6b7373682d6e6b6176462d3943726777502d3773644341612d647566324b682d685a65707a792d685a645531652d685a656f66462d685a656b44672d685a656741592d685a654d5a6e2d6a61486741662d3850383744322d354e677152762d6154343851422d685a645634592d685a654336342d45526770732d3556594747642d3556594a42312d354e6b72466b2d364a786837682d3768395075512d4552664d782d6831553169682d683155534278223e57696c6c69616d2057617262793c2f613e20717569206175746f72697365206578706c69636974656d656e7420746f7574652072c3a97574696c69736174696f6e2e3c2f703e0a3c703e3c656d3e426f6e2c20616c6f7273206578706c697175652d6d6f6920636520717565206a65207661697320706f75766f69722066616972652061766563204672616d61626167e280a63c6272202f3e3c2f656d3e3c2f703e0a3c703e416c6f7273204672616d616261672c20c3a761207465207065726d6574206465207465206372c3a9657220756e20636f6d7074652067726174756974656d656e74206574206c696272656d656e7420706f757220706f75766f6972207574696c697365722057616c6c616261672e205365756c6520746f6e206164726573736520656d61696c20657374206ec3a963657373616972652c206f6e207365206368617267652064e28099696e7374616c6c6572206574206465206d657474726520c3a0206a6f75722057616c6c6162616720706f757220746f692e20547520706575782064e2809961696c6c657572732070726f6669746572203c6120687265663d22687474703a2f2f7777772e6672616d61736f66742e6e65742f23746f705067436c6f7564223e64e280996175747265732073657276696365732070726f706f73c3a97320706172204672616d61736f6674206963693c2f613e2e3c2f703e0a3c703ec380206365206a6f75722c20696c207920612038333420636f6d70746573206372c3a9c3a97320737572204672616d616261672e3c2f703e0a3c703e3c656d3e566f7573206176657a20767261696d656e7420636f6ec3a7752063652073657276696365206166696e207175e280996f6e20707569737365206ce280997574696c69736572206176656320756e206d6178696d756d2064e280996f7574696c732c206e6f6ec2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e4175746f7572206465206ce280996170706c69636174696f6e207765622c20696c206578697374652064c3a96ac3a020646573206170706c69636174696f6e7320706f757220736d61727470686f6e65732028416e64726f69642065742057696e646f77732050686f6e65292c2064657320657874656e73696f6e732046697265666f7820657420476f6f676c65204368726f6d652e3c2f703e0a3c703e436f6d6d652057616c6c6162616720706f7373c3a864652064657320666c7578205253532c2063e2809965737420666163696c65206465206c697265206c65732061727469636c657320736175766567617264c3a97320737572207361206c697365757365202873692063656c6c652d6369207065726d6574206465206c6972652064657320666c757820525353292e2043616c696272652028c2abc2a06c6f67696369656c206465206c6563747572652c2064652067657374696f6e206465206269626c696f7468c3a87175657320657420646520636f6e76657273696f6e206465206669636869657273206e756dc3a972697175657320646520747970652065626f6f6b206f75206c6976726520c3a96c656374726f6e69717565c2a0c2bb2c6e6f757320646974207562756e74752d66722e6f72672920696e74c3a867726520646570756973207175656c717565732073656d61696e6573206d61696e74656e616e74206c6120706f73736962696c6974c3a92064652072c3a9637570c3a9726572206c65732061727469636c6573206e6f6e206c75732c20707261746971756520706f757220666169726520756e20666963686965722065507562c2a0213c2f703e0a3c703e44e28099617574726573206170706c69636174696f6e7320776562207065726d657474656e74206ce28099696e74c3a967726174696f6e20617665632057616c6c61626167202846726573685253532c204c6565642065742054696e792054696e792052535320706f7572206c657320616772c3a96761746575727320646520666c7578292e204ce2809941504920717569207365726120646973706f6e69626c652064616e73206c612070726f636861696e652076657273696f6e2064652057616c6c61626167207065726d657474726120656e636f726520706c75732064e28099696e74657261637469766974c3a92e3c2f703e0a3c703e3c656d3e5920612d742d696c20756e206d6f6465206465206c65637475726520686f7273206c69676e65206f75206573742d6365207175652063e28099657374207072c3a9767520706f7572206c65732070726f636861696e65732076657273696f6e73c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e496c2079206120756e2070736575646f206d6f646520686f7273206c69676e652c20646973706f6e69626c652061766563206ce280996170706c69636174696f6e20416e64726f69642e204f6e20706575742072c3a9637570c3a9726572202876696120756e20666c75782052535329206c65732061727469636c6573206e6f6e206c757320717565206ce280996f6e206120736175766567617264c3a9732e20556e6520666f69732064c3a9636f6e6e656374c3a92c206f6e207065757420636f6e74696e75657220c3a0206c6972652073757220736f6e20736d61727470686f6e65206f75207361207461626c65747465206c65732061727469636c65732e2050617220636f6e7472652c20696c206d616e7175652064657320666f6e6374696f6e6e616c6974c3a973c2a03a207175616e64207475206d61727175657320756e2061727469636c6520636f6d6d65206c752c206365206ee28099657374207061732073796e6368726f6e6973c3a92061766563206c612076657273696f6e207765622064652057616c6c616261672e204ae28099657370c3a8726520717565206a652073756973207072657371756520636c6169722064616e73206d6573206578706c69636174696f6e732e3c2f703e0a3c703e506f7572206c612076322c20717569206573742064c3a96ac3a020656e20636f7572732064652064c3a976656c6f7070656d656e742c206fc3b9206a652073756973206269656e20616964c3a9207061722056696e63656e74204a6f757373652c206f6e2061757261206c6120706f73736962696c6974c3a92064e2809961766f697220756e2076726169206d6f646520686f7273206c69676e652e3c2f703e0a3c703e3c656d3e416c6f7273207369206f6e2076657574206169646572202f2070617274696369706572202f20747269666f75696c6c6572206c6520636f6465202f20766f757320656e766f79657220646573207265746f7572732c206f6e206661697420636f6d6d656e74c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e4f6e207065757420616964657220646520706c75736965757273206661c3a76f6e73c2a03a3c2f703e0a3c756c3e3c6c693e7574696c697365722077616c6c61626167206574206e6f75732072656d6f6e746572206c65732070726f626cc3a86d65732072656e636f6e7472c3a973c2a03b3c2f6c693e0a3c6c693e706172746963697065722061752064c3a976656c6f7070656d656e74206465206ce280996170706c69636174696f6e2068747470733a2f2f6769746875622e636f6d2f77616c6c616261672f77616c6c616261672053692053696c6578202f2053796d666f6e7932202f2048544d4c35202f206574632e207465207061726c656e742c206ee2809968c3a97369746520706173c2a0213c2f6c693e0a3c6c693e636f6d6d6520746f75742070726f6a65742c206c652067726f7320706f696e74206e6f697220657374206c65206d616e71756520646520646f63756d656e746174696f6e2e203c6120687265663d22687474703a2f2f646f632e77616c6c616261672e6f7267223e456c6c652065737420646973706f206963693c2f613e206d61697320696c206d616e71756520706c65696e2064652063686f73657320657420746f7574206ee280996573742070617320c3a0206a6f7572c2a03b3c2f6c693e0a3c6c693e7061726c65722064652057616c6c61626167206175746f757220646520766f7573c2a03b3c2f6c693e0a3c6c693e696c20657869737465203c6120687265663d2268747470733a2f2f666c617474722e636f6d2f7468696e672f313236353438302f706f6368652d612d726561642d69742d6c617465722d6f70656e2d736f757263652d73797374656d223e756e20636f6d70746520466c617474723c2f613e2e3c2f6c693e0a3c2f756c3e3c703e3c656d3e4c65206d6f74206465206c612066696ee280a63f3c6272202f3e3c2f656d3e3c2f703e0a3c703e4d6572636920c3a0204672616d61736f66742064e280996163637565696c6c697220657420646520736f7574656e69722057616c6c61626167c2a0213c2f703e0a3c703e4c6120726f7574652065737420656e636f7265206269656e206c6f6e67756520706f7572206e6520706c7573207574696c6973657220646520736f6c7574696f6e732070726f707269c3a97461697265732c206d616973206f6e2064657672616974207920617272697665722c206e6f6ec2a03f3c2f703e0a3c703e3c696d67207372633d22687474703a2f2f7777772e6672616d61626c6f672e6f72672f7075626c69632f5f696d672f6672616d61626c6f672f706c65696e4c6573506f636865732e706e672220616c743d226672616d61736f667420706c65696e206c657320706f636865732220636c6173733d22633122207469746c653d226672616d61736f667420706c65696e206c657320706f6368657322202f3e3c6272202f3e3c6120687265663d22687474703a2f2f6672616d616c61622e6f72672f676b6e642d63726561746f722f223e6861636b657a2047c3a967c3a9c2a0213c2f613e3c2f703e0a, 1),
 (2, 'wallabag/wallabag', 'https://github.com/wallabag/wallabag', 0, 0, 0x3c7370616e20636c6173733d226e616d65223e524541444d452e6d643c2f7370616e3e3c703e77616c6c6162616720697320612073656c6620686f737461626c65206170706c69636174696f6e20616c6c6f77696e6720796f7520746f206e6f74206d69737320616e7920636f6e74656e7420616e796d6f72652e20436c69636b2c20736176652c2072656164206974207768656e20796f752063616e2e20497420657874726163747320636f6e74656e7420736f207468617420796f752063616e2072656164206974207768656e20796f7520686176652074696d652e3c2f703e0a3c703e4d6f726520696e666f726d6174696f6e73206f6e206f757220776562736974653a203c6120687265663d22687474703a2f2f77616c6c616261672e6f7267223e77616c6c616261672e6f72673c2f613e3c2f703e0a3c68323e3c6120636c6173733d22616e63686f722220687265663d2268747470733a2f2f6769746875622e636f6d2f77616c6c616261672f77616c6c61626167236c6963656e7365223e3c2f613e4c6963656e73653c2f68323e0a3c703e436f7079726967687420c2a920323031302d32303134204e69636f6c6173204cc59375696c6c6574203c6120687265663d226d61696c746f3a6e69636f6c6173406c6f6575696c6c65742e6f7267223e6e69636f6c6173406c6f6575696c6c65742e6f72673c2f613e205468697320776f726b20697320667265652e20596f752063616e2072656469737472696275746520697420616e642f6f72206d6f6469667920697420756e64657220746865207465726d73206f662074686520446f205768617420546865204675636b20596f752057616e7420546f205075626c6963204c6963656e73652c2056657273696f6e20322c206173207075626c69736865642062792053616d20486f63657661722e205365652074686520434f5059494e472066696c6520666f72206d6f72652064657461696c732e3c2f703e0a, 1),
 (3, 'a self hostable application for saving web pages | wallabag', 'https://www.wallabag.org/', 0, 1, 0x0a3c64697620636c6173733d22726f77223e0a3c64697620636c6173733d22636f6c2d6c672d3820636f6c2d6d642d313220636f6c2d78732d313220636f6c2d736d2d3132223e0a3c703e77616c6c616261672028666f726d65726c7920706f636865292069732061203c7374726f6e673e73656c6620686f737461626c65206170706c69636174696f6e20666f7220736176696e67207765622070616765733c2f7374726f6e673e2e20556e6c696b65206f746865722073657276696365732cc2a077616c6c6162616720697320667265652028617320696e2066726565646f6d2920616e64206f70656e20736f757263652e3c2f703e0a3c2f6469763e0a0a3c2f6469763e0a3c64697620636c6173733d22726f77223e0a3c64697620636c6173733d22636f6c2d6c672d3820636f6c2d6d642d313220636f6c2d78732d313220636f6c2d736d2d3132223e0a3c703e576974682074686973206170706c69636174696f6e20796f752077696c6c206e6f74206d69737320636f6e74656e7420616e796d6f72652e203c7374726f6e673e436c69636b2c20736176652c2072656164206974207768656e20796f752077616e743c2f7374726f6e673e2e2049742073617665732074686520636f6e74656e7420796f752073656c65637420736f207468617420796f752063616e2072656164206974207768656e20796f7520686176652074696d652e3c2f703e0a3c2f6469763e0a0a3c2f6469763e0a3c64697620636c6173733d22726f77223e0a3c64697620636c6173733d22636f6c2d6c672d3620636f6c2d6d642d313220636f6c2d78732d313220636f6c2d736d2d3132223e0a3c68323e486f7720697420776f726b733c2f68323e0a3c703e5468616e6b7320746f2074686520626f6f6b6d61726b6c6574206f72203c61207469746c653d22446f776e6c6f6164732220687265663d22687474703a2f2f7777772e77616c6c616261672e6f72672f646f776e6c6f6164732f223e74686972642d7061727479206170706c69636174696f6e733c2f613e2c20796f75207361766520616e2061727469636c6520696e20796f7572c2a077616c6c6162616720746f2072656164206974206c617465722e205468656e2c207768656e20796f75206f70656e20796f75722077616c6c616261672c203c7374726f6e673e796f752063616e20636f6d666f727461626c79207265616420796f75722061727469636c65733c2f7374726f6e673e2e3c2f703e0a3c68323e486f7720746f207573652077616c6c616261673c2f68323e0a3c703e5468657265206172652074776f207761797320746f207573652077616c6c616261673a20796f752063616e203c6120687265663d22687474703a2f2f7777772e77616c6c616261672e6f72672f6672657175656e746c792d61736b65642d7175657374696f6e732f23486f775f63616e5f495f696e7374616c6c5f77616c6c616261675f616e645f776861745f6172655f7468655f726571756972656d656e7473223e696e7374616c6c2069743c2f613ec2a06f6e20796f75722077656220736572766572206f7220796f752063616ec2a03c6120687265663d22687474703a2f2f6170702e696e746865706f6368652e636f6d223e63726561746520616e206163636f756e743c2f613ec2a06174204672616d616261672028776520696e7374616c6c20616e642075706772616465c2a077616c6c6162616720666f7220796f75292e3c2f703e0a3c2f6469763e0a0a3c2f6469763e0a, 1);";
-                    $moreQueries[] = "INSERT INTO `tags` (`id`, `value`) VALUES (1, 'opensource');";
-                    $moreQueries[] = "INSERT INTO `tags_entries` (`id`, `entry_id`, `tag_id`) VALUES (1, 2, 1);";
-
-                    $sql_structure = file_get_contents('install/mysql.sql');
-                }
-                else if ($_POST['db_engine'] == 'postgres') {
-                    $db_path = 'pgsql:host=' . $_POST['pg_server'] . ';dbname=' . $_POST['pg_database'];
-                    $content = str_replace("define ('STORAGE_SERVER', 'localhost');", "define ('STORAGE_SERVER', '".$_POST['pg_server']."');", $content);
-                    $content = str_replace("define ('STORAGE_DB', 'poche');", "define ('STORAGE_DB', '".$_POST['pg_database']."');", $content);
-                    $content = str_replace("define ('STORAGE_USER', 'poche');", "define ('STORAGE_USER', '".$_POST['pg_user']."');", $content);
-                    $content = str_replace("define ('STORAGE_PASSWORD', 'poche');", "define ('STORAGE_PASSWORD', '".$_POST['pg_password']."');", $content);
-                    $handle = new PDO($db_path, $_POST['pg_user'], $_POST['pg_password']);
-                    
-                    $moreQueries[] = "INSERT INTO entries (title, url, is_read, is_fav, content, user_id) VALUES
+                $moreQueries[] = "INSERT INTO `tags` (`id`, `value`) VALUES (1, 'opensource');";
+                $moreQueries[] = "INSERT INTO `tags_entries` (`id`, `entry_id`, `tag_id`) VALUES (1, 2, 1);";
+
+                $sql_structure = file_get_contents('install/mysql.sql');
+            }
+            else if ($_POST['db_engine'] == 'postgres') {
+                $db_path = 'pgsql:host=' . $_POST['pg_server'] . ';dbname=' . $_POST['pg_database'];
+                $content = str_replace("define ('STORAGE_SERVER', 'localhost');", "define ('STORAGE_SERVER', '".$_POST['pg_server']."');", $content);
+                $content = str_replace("define ('STORAGE_DB', 'poche');", "define ('STORAGE_DB', '".$_POST['pg_database']."');", $content);
+                $content = str_replace("define ('STORAGE_USER', 'poche');", "define ('STORAGE_USER', '".$_POST['pg_user']."');", $content);
+                $content = str_replace("define ('STORAGE_PASSWORD', 'poche');", "define ('STORAGE_PASSWORD', '".$_POST['pg_password']."');", $content);
+                $handle = new PDO($db_path, $_POST['pg_user'], $_POST['pg_password']);
+                
+                $moreQueries[] = "INSERT INTO entries (title, url, is_read, is_fav, content, user_id) VALUES
 ('Framabag, un nouveau service libre et gratuit', 'http://www.framablog.org/index.php/post/2014/02/05/Framabag-service-libre-gratuit-interview-developpeur', false, false, convert_from(decode('3c68323e556e6520696e74657276696577206465204e69636f6c61732c20736f6e2064c3a976656c6f70706575722e3c2f68323e0a3c703e3c656d3e496c206e6520766f757320612073c3bb72656d656e742070617320c3a96368617070c3a920717565206e6f74726520636f6e736f6d6d6174696f6e20646520636f6e74656e75732064752057656220657374207465727269626c656d656e74206368726f6e6f706861676520657420706172746963756c69c3a872656d656e7420667275737472616e746520746f757420c3a0206c6120666f6973c2a03a206e6f6e207365756c656d656e74206e6f757320706173736f6e732062656175636f7570202874726f70c2a03f292064652074656d707320656e206c69676e6520c3a0206578706c6f726572206c6573206d696e6573206175726966c3a8726573206465206c6120746f696c652c20792064c3a974656374616e742070c3a970697465732065742066696c6f6e732c206d616973206e6f757320736f6d6d657320737572746f757420636f6e7374616d6d656e7420656e206d616e7175652e204dc3aa6d65207369206e6f7573206e6520736f6d6d6573207061732064616e73206c65207a617070696e67206672c3a96ec3a9746971756520736920666163696c656d656e742064c3a96e6f6e63c3a920706172206c657320646f637465732070737963686f6c6f677565732071756920706f6e74696669656e7420737572206c65732064616e67657273206475206e756dc3a9726971756520706f7572206c6573206a65756e65732063657276656c6c65732c20696c206e6f7573207669656e7420736f7576656e74206c6520676fc3bb7420616d6572206465206ce28099696e6163686576c3a9c2a03a20706173206c652074656d707320646520746f7574206c69726520283c6120687265663d22687474703a2f2f66722e77696b74696f6e6172792e6f72672f77696b692f544c4452223e544c3b44523c2f613e2065737420646576656e75206c6520636c696e2064e28099c593696c206d692d6669677565206d692d72616973696e2064e28099756e652067c3a96ec3a9726174696f6e206465206c65637465757273207072657373c3a973292c207061732074726f70206c652074656d70732064652072c3a9666cc3a963686972206e6f6e20706c75732068c3a96c61732c20706173206c652074656d707320646520737569767265206c6120726962616d62656c6c65206465206c69656e73206173736f6369c3a97320c3a020756e2061727469636c65e280a63c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e506f7572206e6f757320646f6e6e657220626f6e6e6520636f6e736369656e63652c206e6f75732072616e67656f6e73207363727570756c657573656d656e7420756e206d61727175652d7061676520646520706c75732064616e7320756e20736f75732d646f73736965722071756920656e20636f6d706f7274652064c3a96ac3a0203235362c206e6f7573206e6f746f6e7320756e20c3a96cc3a96d656e7420646520706c75732064616e73206c6120746f756a6f757273207269646963756c656d656e74206c6f6e67756520746f75646f756c697374652c2062726566206e6f75732072656d6574746f6e7320c3a020706c757320746172642c2063e280996573742dc3a02d64697265206c6520706c757320736f7576656e742061757820696e74726f757661626c65732063616c656e6465732067726563717565732c206c6520736f696e206465206c69726520767261696d656e7420756e2061727469636c65206a7567c3a920696e74c3a972657373616e742c20646520726567617264657220756e6520766964c3a96f207369676e616cc3a96520706172206c65732072c3a97a6f73736f63696f732c206465206c69726520756e20636861706974726520656e746965722064e28099756e206f75767261676520646973706f6e69626c6520656e206c69676e65e280a63c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e416c6f7273206269656e2073c3bb722c20c3a02064c3a966617574206465206e6f757320646f6e6e657220746f7574206c652074656d70732071756920736572616974206ec3a963657373616972652c2064657320736f6c7574696f6e73206578697374656e7420706f7572206e6f7573207065726d657474726520646520c2abc2a06c69726520706c75732074617264c2a0c2bb20656e20736175766567617264616e74206c65207072c3a9636965757820706f6c6c656e206465206e6f7320627574696e61676573206465207369746520656e20736974652c2065742064e28099656e20666169726520756c74c3a97269657572656d656e7420766f747265206d69656cc2a03b2063e280996573742062656c20657420626f6e206d616973206c65732072756368657320736f6e7420756e207065752064697374616e7465732c20c3a7612073e28099617070656c6c65206c6520636c6f756420286e6f7320616d69732074656368696573206de280996f6e74206269656e206578706c697175c3a9206d616973206ae280996169207365756c656d656e7420636f6d70726973207175652064657320747275637320c3a0206d6f6920736f6e742073757220646573206d616368696e6573206c6f696e7461696e65732c20c3a761206e65206d652072617373757265207061732074726f702920657420656c6c657320736f6e7420736f7576656e742070726f707269c3a97461697265732c206e65206c61697373616e7420656e7472657220717565206c6573203c733e7574696c69736174657572733c2f733e20636f6e736f6d6d61746575727320706179616e74732065742071756920636f6e73656e74656e7420c3a0206c6575727320636f6e646974696f6e732e2053616e7320636f6d70746572207175652064652067726f7320626f7572646f6e73207669656e6e656e742070726f666974657220706c7573206f75206d6f696e73206469736372c3a874656d656e7420646520746f757465732063657320747261636573206465206e6f75732d6dc3aa6d657320717569207065726d657474656e74206465206d6f6ec3a97469736572206e6f7472652070726f66696cc2a03a207369206a6520636f6c6c65637465207375722063657320736572766963657320286e65206c6573206e6f6d6d6f6e73207061732c206a757374656d656e742920756e652073c3a97269652064e2809961727469636c657320737572206ce280996964c3a965206465204e6174757265206368657a2044696465726f742c206a6520726563657672616920646976657273657320736f6c6c696369746174696f6e7320706f757220646576656e697220636c69656e74206465206c6120626f757469717565204e61747572652026616d703b2044c3a9636f75766572746520647520626f756c65766172642044696465726f742e2045742073692064e280996176656e74757265206c65732070726f6772616d6d6573206465206c61204e5341206d6f756c696e656e7420737572206c6520736572766963652c206a6520736572616920706575742dc3aa74726520756e206a6f75722064616e7320756e65206c6973746520646573206d696c6974616e7473206e61747572697374657320696e64c3a973697261626c657320737572206c657320766f6c73206465206c612050616e416d20286a65206e65207361697320706c75732074726f70207369206a6520706c616973616e7465206cc3a02c2066696e616c656d656e74e280a6293c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4c6120626f6e6e65206964c3a965c2a03a20c2abc2a0736520636f6e7374697475657220756e2072c3a9736572766f697220646520646f63756d656e74732073c3a96c656374696f6e6ec3a97320c3a020706172636f7572697220706c75732074617264c2a0c2bb20617070656c61697420646f6e6320756e6520617574726520626f6e6e65206964c3a9652c2063656c6c652064e2809961766f6972206c6520636f6e7472c3b46c652064652063652072c3a9736572766f69722c206465206e6f74726520636f6c6c656374696f6e20706572736f6e6e656c6c652e2043e28099657374204e69636f6c6173204cc59375696c6c65742c2063692d646573736f757320696e74657276696577c3a92c207175692073e28099792065737420636f6c6cc3a9206176656320756e652062656c6c65206170706c69636174696f6e20617070656cc3a96520657568e280a6206f75692c20617070656cc3a9652057616c6c616261672e3c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4672616d61736f667420736f757469656e742064e28099617574616e7420706c757320736f6e20696e6974696174697665207175e280993c6120687265663d22687474703a2f2f7777772e6672616d61626c6f672e6f72672f696e6465782e7068702f706f73742f323031342f30312f33312f4765656b74696f6e6e6572642d57616c6c61626167223e6f6e206c7569206120636865726368c3a920646573206d6973c3a872657320706f757220756e6520686973746f697265206465206e6f6d3c2f613e206574207175e28099696c2065737420706f737369626c652064e28099696e7374616c6c657220736f692d6dc3aa6d6520756e6520636f7069652064652057616c6c616261672073757220736f6e2070726f70726520736974652e3c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4c6520706574697420706c7573206465204672616d61736f66742c2072c3a97365617520746f756a6f7572732064c3a973697265757820646520766f75732070726f706f7365722064657320616c7465726e617469766573206c6962c3a972617472696365732c2063e2809965737420646520766f75732070726f706f736572202873757220696e736372697074696f6e207072c3a9616c61626c652920756e20616363c3a873206175204672616d616261672c2061757472656d656e742064697420766f7472652057616c6c616261672073757220756e2073657276657572204672616d612a2061766563206e6f74726520676172616e74696520646520636f6e666964656e7469616c6974c3a92e20436f6d6d6520706f7572206c65204672616d616e6577732c206e6f757320766f7573206163637565696c6c6f6e7320766f6c6f6e74696572732064616e73206c61206c696d697465206465206e6f732063617061636974c3a9732c20656e20766f757320696e766974616e7420c3a020766f7573206c616e6365722064616e7320766f747265206175746f2d68c3a962657267656d656e742064652057616c6c616261672e3c6272202f3e4365742061727469636c65206573742074726f70206c6f6e67c2a03f204d657474657a2d6c652064616e73203c6120687265663d22687474703a2f2f7777772e6672616d616261672e6f72672f696e6465782e706870223e766f747265204672616d616261673c2f613e20657420686f702e3c6272202f3e3c2f656d3e3c2f703e0a3c703e3c656d3e4672616d61626c6f67c2a03a2053616c7574204e69636f6c6173e280a62054752070657578207465207072c3a973656e74657220627269c3a876656d656e74c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e53616c7574c2a0212044c3a976656c6f70706575722050485020646570756973207175656c7175657320616e6ec3a96573206d61696e74656e616e742028313020616e73292c206ae28099616920766f756c75206d652072656d657474726520c3a0206e697665617520746563686e697175656d656e74207061726c616e742028646570756973203320616e732c206ae28099616920706173206d616c206cc3a26368c3a9206c6520636c6176696572292e20506f7572206d6573206265736f696e7320706572736f732c206ae28099616920646f6e63206372c3a9c3a920756e2070657469742070726f6a657420706f75722072656d706c6163657220756e6520736f6c7574696f6e2070726f707269c3a97461697265206578697374616e74652e2053616e7320617563756e65207072c3a974656e74696f6e2c206ae2809961692068c3a962657267c3a92063652070726f6a6574207375722047697468756220657420636f6d6d652063e28099657374206c61207365756c6520736f6c7574696f6e203c656d3e6f70656e20736f757263653c2f656d3e20646520636520747970652c206c65206e6f6d62726520646520706572736f6e6e657320696e74c3a972657373c3a965732061206175676d656e74c3a920e280a63c2f703e0a3c703e3c656d3e4c6573207574696c6973617465757273206465207365727669636573204672616d61736f6674206e65206c6520736176656e742070617320666f7263c3a96d656e742c206d6169732074752061732064c3a96ac3a020706173206d616c207061727469636970c3a920c3a0206c61204672616d6147616c617869652c206e6f6ec2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e456e2065666665742e204ae28099616920636f6d6d656e63c3a920756e20706c7567696e20706f7572204672616d616e6577732c203c6120687265663d2268747470733a2f2f6769746875622e636f6d2f6e69636f736f6d622f74747273732d70757267652d6163636f756e7473223e74747273732d70757267652d6163636f756e74733c2f613e2c20717569207065726d6574206465206e6574746f796572206c61206261736520646520646f6e6ec3a9657320646520636f6d7074657320706c7573207574696c6973c3a9732e204d616973206365203c656d3e706c7567696e3c2f656d3e2061206265736f696e2064e28099c3aa747265207465726d696ec3a920c3a0203130302520706f757220c3aa74726520696e74c3a96772c3a9206175207365696e206465204672616d616e6577732028657420646f6e632064652054696e792054696e7920525353292c207369207175656c7175e28099756e20736f756861697465206de2809961696465722c20696c206ee2809979206120617563756e20736f7563692e3c6272202f3e4ae28099616920617573736920666169742031206f7520322061707061726974696f6e732064616e73206465732074726164756374696f6e7320706f7572204672616d61626c6f672e205269656e2064e2809965787472616f7264696e616972652c206a65206e652073756973207061732062696c696e6775652c20c3a761206d65207065726d6574206465206de28099656e747261c3ae6e65722e3c2f703e0a3c703e3c656d3e5061726c6f6e73206465207375697465206465206365207175692066c3a2636865c2a03a20746f6e206170706c69636174696f6e2057616c6c616261672c20656c6c652073e28099617070656c6c6169742070617320e2809c506f636865e2809d2c206176616e74c2a03f205475206e6f7573207261636f6e746573206ce28099686973746f697265c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e45756820656e20656666657420e280a62044c3a96ac3a02c20706f757271756f69203c656d3e706f6368653c2f656d3ec2a03f20506172636520717565206ce28099756e206465732074726f697320c2abc2a074c3a96e6f7273c2a0c2bb20737572206c65206d61726368c3a92073e28099617070656c6c65203c656d3e506f636b65743c2f656d3e2e20436f6d6d65206d6f6e206170706c69206ee28099c3a9746169742064657374696ec3a965207175e28099c3a0206d6f6e20757361676520706572736f6e6e656c2061752064c3a9706172742c206a65206e65206d6520737569732070617320746f72747572c3a9206269656e206c6f6e6774656d70732e3c2f703e0a3c703e43657420c3a974c3a92c206f6e2061206661696c6c69206368616e676572206465206e6f6d2c207175616e6420696c2079206120657520646520706c757320656e20706c75732064e280997574696c69736174657572732e2045742070756973206f6e2073e28099657374206469742071756520706f6368652c2063e28099c3a97461697420706173206d616c2c20c3a76120736f6e6e616974206269656e206672616ec3a761697320657420707569732061766563206c6573207175656c717565732064697a61696e65732064e280997574696c69736174657572732c206f6e206e652067c3aa6e657261697420706572736f6e6e652e3c2f703e0a3c703e43e280996573742073616e7320636f6d707465722061766563206c657320736f6369c3a974c3a97320616dc3a972696361696e6573206574206c6575722066c3a2636865757365206d616e696520646520766f756c6f697220656e766f796572206c657572732061766f6361747320c3a020746f757420626f7574206465206368616d702e204c65203233206a616e766965722c206ae280996169207265c3a77520756e20656d61696c206465206c61207061727420647520636162696e65742064e2809961766f6361747320646520506f636b6574206d652064656d616e64616e74206465206368616e676572206c65206e6f6d2c206c65206c6f676f2c206465206e6520706c7573207574696c69736572206c65207465726d6520e2809c726561642d69742d6c61746572e2809d2028c2abc2a06c6973657a206c6520706c75732074617264c2a0c2bb29206574206465206e6520706c757320646972652071756520506f636b6574206ee280996573742070617320677261747569742028746f7574206573742070617274692064e280993c6120687265663d2268747470733a2f2f747769747465722e636f6d2f77616c6c616261676170702f7374617475732f343233373836333635393434323235373932223e756e2074776565743c2f613e206fc3b9206a65207175616c6966696520506f636b657420646520c2abc2a06e6f6e2066726565c2a0c2bb20c3a0207361766f6972206e6f6e206c69627265292e20427265662c206dc3aa6d65207369206a652073656d626c6169732064616e73206d6f6e2064726f69742c206ae280996169207175616e64206dc3aa6d652070726973206c612064c3a9636973696f6e206465206368616e676572206465206e6f6d2065742057616c6c6162616720657374206ec3a92c20737569746520617578203c6120687265663d22687474703a2f2f6672616d61646174652e6f72672f73747564732e7068703f736f6e646167653d6c6c6370366f6a70796339706b6c6861223e64697a61696e65732064652070726f706f736974696f6e73206465206e6f6d207265c3a77565733c2f613e2e2043e2809965737420756e206dc3a96c616e676520656e747265206c652077616c6c61627920286465206c612066616d696c6c6520646573206b616e676f75726f75732c207175692073746f636b656e742064616e73206c65757220706f63686520636520717569206c65757220657374206368657229206574203c656d3e6261673c2f656d3e20286c6573207465726d657320736163202f207361636f636865202f2062657361636520736f6e7420c3a96e6f726dc3a96d656e7420726576656e7573292e204d616973206d61696e74656e616e742c206f6e207661206465206ce280996176616e742c20706c75732064652074656d707320c3a020706572647265206176656320c3a7612c206f6e2061206475207061696e20737572206c6120706c616e6368652e3c6272202f3e3c696d67207372633d22687474703a2f2f7777772e6672616d61626c6f672e6f72672f7075626c69632f5f696d672f6672616d61626c6f672f77616c6c6162795f626162792e6a70672220616c743d2277616c6c61627920617665632062c3a962c3a92064616e7320736120706f6368652220636c6173733d22633122207469746c653d2277616c6c61627920617665632062c3a962c3a92064616e7320736120706f63686522202f3e206372c3a96469742070686f746f203c6120687265663d22687474703a2f2f7777772e666c69636b722e636f6d2f70686f746f732f3236373832383634404e30302f353032373230323233342f696e2f70686f746f6c6973742d3845654a35412d6831544c36762d4e454c38312d636e4e6b536f2d39594d3174762d374b636736622d387a70416f612d61315a4c4d4e2d39594d3339722d3768355341442d38456548664c2d3845654677752d647456776e4d2d38756f4d45312d4a457a58652d47713471792d3932564a50522d43786531762d38483344324a2d61315a464e732d395937324b362d38456547784c2d354c353346782d354e6b454e732d3555384354592d354e6b7373682d6e6b6176462d3943726777502d3773644341612d647566324b682d685a65707a792d685a645531652d685a656f66462d685a656b44672d685a656741592d685a654d5a6e2d6a61486741662d3850383744322d354e677152762d6154343851422d685a645634592d685a654336342d45526770732d3556594747642d3556594a42312d354e6b72466b2d364a786837682d3768395075512d4552664d782d6831553169682d683155534278223e57696c6c69616d2057617262793c2f613e20717569206175746f72697365206578706c69636974656d656e7420746f7574652072c3a97574696c69736174696f6e2e3c2f703e0a3c703e3c656d3e426f6e2c20616c6f7273206578706c697175652d6d6f6920636520717565206a65207661697320706f75766f69722066616972652061766563204672616d61626167e280a63c6272202f3e3c2f656d3e3c2f703e0a3c703e416c6f7273204672616d616261672c20c3a761207465207065726d6574206465207465206372c3a9657220756e20636f6d7074652067726174756974656d656e74206574206c696272656d656e7420706f757220706f75766f6972207574696c697365722057616c6c616261672e205365756c6520746f6e206164726573736520656d61696c20657374206ec3a963657373616972652c206f6e207365206368617267652064e28099696e7374616c6c6572206574206465206d657474726520c3a0206a6f75722057616c6c6162616720706f757220746f692e20547520706575782064e2809961696c6c657572732070726f6669746572203c6120687265663d22687474703a2f2f7777772e6672616d61736f66742e6e65742f23746f705067436c6f7564223e64e280996175747265732073657276696365732070726f706f73c3a97320706172204672616d61736f6674206963693c2f613e2e3c2f703e0a3c703ec380206365206a6f75722c20696c207920612038333420636f6d70746573206372c3a9c3a97320737572204672616d616261672e3c2f703e0a3c703e3c656d3e566f7573206176657a20767261696d656e7420636f6ec3a7752063652073657276696365206166696e207175e280996f6e20707569737365206ce280997574696c69736572206176656320756e206d6178696d756d2064e280996f7574696c732c206e6f6ec2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e4175746f7572206465206ce280996170706c69636174696f6e207765622c20696c206578697374652064c3a96ac3a020646573206170706c69636174696f6e7320706f757220736d61727470686f6e65732028416e64726f69642065742057696e646f77732050686f6e65292c2064657320657874656e73696f6e732046697265666f7820657420476f6f676c65204368726f6d652e3c2f703e0a3c703e436f6d6d652057616c6c6162616720706f7373c3a864652064657320666c7578205253532c2063e2809965737420666163696c65206465206c697265206c65732061727469636c657320736175766567617264c3a97320737572207361206c697365757365202873692063656c6c652d6369207065726d6574206465206c6972652064657320666c757820525353292e2043616c696272652028c2abc2a06c6f67696369656c206465206c6563747572652c2064652067657374696f6e206465206269626c696f7468c3a87175657320657420646520636f6e76657273696f6e206465206669636869657273206e756dc3a972697175657320646520747970652065626f6f6b206f75206c6976726520c3a96c656374726f6e69717565c2a0c2bb2c6e6f757320646974207562756e74752d66722e6f72672920696e74c3a867726520646570756973207175656c717565732073656d61696e6573206d61696e74656e616e74206c6120706f73736962696c6974c3a92064652072c3a9637570c3a9726572206c65732061727469636c6573206e6f6e206c75732c20707261746971756520706f757220666169726520756e20666963686965722065507562c2a0213c2f703e0a3c703e44e28099617574726573206170706c69636174696f6e7320776562207065726d657474656e74206ce28099696e74c3a967726174696f6e20617665632057616c6c61626167202846726573685253532c204c6565642065742054696e792054696e792052535320706f7572206c657320616772c3a96761746575727320646520666c7578292e204ce2809941504920717569207365726120646973706f6e69626c652064616e73206c612070726f636861696e652076657273696f6e2064652057616c6c61626167207065726d657474726120656e636f726520706c75732064e28099696e74657261637469766974c3a92e3c2f703e0a3c703e3c656d3e5920612d742d696c20756e206d6f6465206465206c65637475726520686f7273206c69676e65206f75206573742d6365207175652063e28099657374207072c3a9767520706f7572206c65732070726f636861696e65732076657273696f6e73c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e496c2079206120756e2070736575646f206d6f646520686f7273206c69676e652c20646973706f6e69626c652061766563206ce280996170706c69636174696f6e20416e64726f69642e204f6e20706575742072c3a9637570c3a9726572202876696120756e20666c75782052535329206c65732061727469636c6573206e6f6e206c757320717565206ce280996f6e206120736175766567617264c3a9732e20556e6520666f69732064c3a9636f6e6e656374c3a92c206f6e207065757420636f6e74696e75657220c3a0206c6972652073757220736f6e20736d61727470686f6e65206f75207361207461626c65747465206c65732061727469636c65732e2050617220636f6e7472652c20696c206d616e7175652064657320666f6e6374696f6e6e616c6974c3a973c2a03a207175616e64207475206d61727175657320756e2061727469636c6520636f6d6d65206c752c206365206ee28099657374207061732073796e6368726f6e6973c3a92061766563206c612076657273696f6e207765622064652057616c6c616261672e204ae28099657370c3a8726520717565206a652073756973207072657371756520636c6169722064616e73206d6573206578706c69636174696f6e732e3c2f703e0a3c703e506f7572206c612076322c20717569206573742064c3a96ac3a020656e20636f7572732064652064c3a976656c6f7070656d656e742c206fc3b9206a652073756973206269656e20616964c3a9207061722056696e63656e74204a6f757373652c206f6e2061757261206c6120706f73736962696c6974c3a92064e2809961766f697220756e2076726169206d6f646520686f7273206c69676e652e3c2f703e0a3c703e3c656d3e416c6f7273207369206f6e2076657574206169646572202f2070617274696369706572202f20747269666f75696c6c6572206c6520636f6465202f20766f757320656e766f79657220646573207265746f7572732c206f6e206661697420636f6d6d656e74c2a03f3c6272202f3e3c2f656d3e3c2f703e0a3c703e4f6e207065757420616964657220646520706c75736965757273206661c3a76f6e73c2a03a3c2f703e0a3c756c3e3c6c693e7574696c697365722077616c6c61626167206574206e6f75732072656d6f6e746572206c65732070726f626cc3a86d65732072656e636f6e7472c3a973c2a03b3c2f6c693e0a3c6c693e706172746963697065722061752064c3a976656c6f7070656d656e74206465206ce280996170706c69636174696f6e2068747470733a2f2f6769746875622e636f6d2f77616c6c616261672f77616c6c616261672053692053696c6578202f2053796d666f6e7932202f2048544d4c35202f206574632e207465207061726c656e742c206ee2809968c3a97369746520706173c2a0213c2f6c693e0a3c6c693e636f6d6d6520746f75742070726f6a65742c206c652067726f7320706f696e74206e6f697220657374206c65206d616e71756520646520646f63756d656e746174696f6e2e203c6120687265663d22687474703a2f2f646f632e77616c6c616261672e6f7267223e456c6c652065737420646973706f206963693c2f613e206d61697320696c206d616e71756520706c65696e2064652063686f73657320657420746f7574206ee280996573742070617320c3a0206a6f7572c2a03b3c2f6c693e0a3c6c693e7061726c65722064652057616c6c61626167206175746f757220646520766f7573c2a03b3c2f6c693e0a3c6c693e696c20657869737465203c6120687265663d2268747470733a2f2f666c617474722e636f6d2f7468696e672f313236353438302f706f6368652d612d726561642d69742d6c617465722d6f70656e2d736f757263652d73797374656d223e756e20636f6d70746520466c617474723c2f613e2e3c2f6c693e0a3c2f756c3e3c703e3c656d3e4c65206d6f74206465206c612066696ee280a63f3c6272202f3e3c2f656d3e3c2f703e0a3c703e4d6572636920c3a0204672616d61736f66742064e280996163637565696c6c697220657420646520736f7574656e69722057616c6c61626167c2a0213c2f703e0a3c703e4c6120726f7574652065737420656e636f7265206269656e206c6f6e67756520706f7572206e6520706c7573207574696c6973657220646520736f6c7574696f6e732070726f707269c3a97461697265732c206d616973206f6e2064657672616974207920617272697665722c206e6f6ec2a03f3c2f703e0a3c703e3c696d67207372633d22687474703a2f2f7777772e6672616d61626c6f672e6f72672f7075626c69632f5f696d672f6672616d61626c6f672f706c65696e4c6573506f636865732e706e672220616c743d226672616d61736f667420706c65696e206c657320706f636865732220636c6173733d22633122207469746c653d226672616d61736f667420706c65696e206c657320706f6368657322202f3e3c6272202f3e3c6120687265663d22687474703a2f2f6672616d616c61622e6f72672f676b6e642d63726561746f722f223e6861636b657a2047c3a967c3a9c2a0213c2f613e3c2f703e0a', 'hex'), 'UTF8'), 1),
 ('wallabag/wallabag', 'https://github.com/wallabag/wallabag', false, false, convert_from(decode('3c7370616e20636c6173733d226e616d65223e524541444d452e6d643c2f7370616e3e3c703e77616c6c6162616720697320612073656c6620686f737461626c65206170706c69636174696f6e20616c6c6f77696e6720796f7520746f206e6f74206d69737320616e7920636f6e74656e7420616e796d6f72652e20436c69636b2c20736176652c2072656164206974207768656e20796f752063616e2e20497420657874726163747320636f6e74656e7420736f207468617420796f752063616e2072656164206974207768656e20796f7520686176652074696d652e3c2f703e0a3c703e4d6f726520696e666f726d6174696f6e73206f6e206f757220776562736974653a203c6120687265663d22687474703a2f2f77616c6c616261672e6f7267223e77616c6c616261672e6f72673c2f613e3c2f703e0a3c68323e3c6120636c6173733d22616e63686f722220687265663d2268747470733a2f2f6769746875622e636f6d2f77616c6c616261672f77616c6c61626167236c6963656e7365223e3c2f613e4c6963656e73653c2f68323e0a3c703e436f7079726967687420c2a920323031302d32303134204e69636f6c6173204cc59375696c6c6574203c6120687265663d226d61696c746f3a6e69636f6c6173406c6f6575696c6c65742e6f7267223e6e69636f6c6173406c6f6575696c6c65742e6f72673c2f613e205468697320776f726b20697320667265652e20596f752063616e2072656469737472696275746520697420616e642f6f72206d6f6469667920697420756e64657220746865207465726d73206f662074686520446f205768617420546865204675636b20596f752057616e7420546f205075626c6963204c6963656e73652c2056657273696f6e20322c206173207075626c69736865642062792053616d20486f63657661722e205365652074686520434f5059494e472066696c6520666f72206d6f72652064657461696c732e3c2f703e0a', 'hex'), 'UTF8'), 1),
 ('a self hostable application for saving web pages | wallabag', 'https://www.wallabag.org/', false, true, convert_from(decode('3c64697620636c6173733d22726f77223e0a3c64697620636c6173733d22636f6c2d6c672d3820636f6c2d6d642d313220636f6c2d78732d313220636f6c2d736d2d3132223e0a3c703e77616c6c616261672028666f726d65726c7920706f636865292069732061203c7374726f6e673e73656c6620686f737461626c65206170706c69636174696f6e20666f7220736176696e67207765622070616765733c2f7374726f6e673e2e20556e6c696b65206f746865722073657276696365732cc2a077616c6c6162616720697320667265652028617320696e2066726565646f6d2920616e64206f70656e20736f757263652e3c2f703e0a3c2f6469763e0a0a3c2f6469763e0a3c64697620636c6173733d22726f77223e0a3c64697620636c6173733d22636f6c2d6c672d3820636f6c2d6d642d313220636f6c2d78732d313220636f6c2d736d2d3132223e0a3c703e576974682074686973206170706c69636174696f6e20796f752077696c6c206e6f74206d69737320636f6e74656e7420616e796d6f72652e203c7374726f6e673e436c69636b2c20736176652c2072656164206974207768656e20796f752077616e743c2f7374726f6e673e2e2049742073617665732074686520636f6e74656e7420796f752073656c65637420736f207468617420796f752063616e2072656164206974207768656e20796f7520686176652074696d652e3c2f703e0a3c2f6469763e0a0a3c2f6469763e0a3c64697620636c6173733d22726f77223e0a3c64697620636c6173733d22636f6c2d6c672d3620636f6c2d6d642d313220636f6c2d78732d313220636f6c2d736d2d3132223e0a3c68323e486f7720697420776f726b733c2f68323e0a3c703e5468616e6b7320746f2074686520626f6f6b6d61726b6c6574206f72203c61207469746c653d22446f776e6c6f6164732220687265663d22687474703a2f2f7777772e77616c6c616261672e6f72672f646f776e6c6f6164732f223e74686972642d7061727479206170706c69636174696f6e733c2f613e2c20796f75207361766520616e2061727469636c6520696e20796f7572c2a077616c6c6162616720746f2072656164206974206c617465722e205468656e2c207768656e20796f75206f70656e20796f75722077616c6c616261672c203c7374726f6e673e796f752063616e20636f6d666f727461626c79207265616420796f75722061727469636c65733c2f7374726f6e673e2e3c2f703e0a3c68323e486f7720746f207573652077616c6c616261673c2f68323e0a3c703e5468657265206172652074776f207761797320746f207573652077616c6c616261673a20796f752063616e203c6120687265663d22687474703a2f2f7777772e77616c6c616261672e6f72672f6672657175656e746c792d61736b65642d7175657374696f6e732f23486f775f63616e5f495f696e7374616c6c5f77616c6c616261675f616e645f776861745f6172655f7468655f726571756972656d656e7473223e696e7374616c6c2069743c2f613ec2a06f6e20796f75722077656220736572766572206f7220796f752063616ec2a03c6120687265663d22687474703a2f2f6170702e696e746865706f6368652e636f6d223e63726561746520616e206163636f756e743c2f613ec2a06174204672616d616261672028776520696e7374616c6c20616e642075706772616465c2a077616c6c6162616720666f7220796f75292e3c2f703e0a3c2f6469763e0a0a3c2f6469763e0a', 'hex'), 'UTF8'), 1)";
-                    $moreQueries[] = "INSERT INTO tags (value) VALUES ('opensource')";
-                    $moreQueries[] = "INSERT INTO tags_entries (entry_id, tag_id) VALUES (2, 1)";
-
-                    $sql_structure = file_get_contents('install/postgres.sql');
-                }
+                $moreQueries[] = "INSERT INTO tags (value) VALUES ('opensource')";
+                $moreQueries[] = "INSERT INTO tags_entries (entry_id, tag_id) VALUES (2, 1)";
 
-                $content = str_replace("define ('STORAGE', 'sqlite');", "define ('STORAGE', '".$_POST['db_engine']."');", $content);
-                file_put_contents('inc/poche/config.inc.php', $content);
+                $sql_structure = file_get_contents('install/postgres.sql');
             }
+            // create database structure
+            $query = $handle->exec($sql_structure);
+        } catch (PDOException $e) {
+            $errors[] = $e->getMessage();
+            $continue = false;
+        }
+        }
+    }
+    if ($continue) {
+        $sql = "INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, '')";
+        $params = array($username, $salted_password, $username);
+        $query = executeQuery($handle, $sql, $params);
 
-            if ($continue) {
-
-                function executeQuery($handle, $sql, $params) {
-                    try
-                    {
-                        $query = $handle->prepare($sql);
-                        $query->execute($params);
-                        return $query->fetchAll();
-                    }
-                    catch (Exception $e)
-                    {
-                        return FALSE;
-                    }
-                }
-
-                if ($_POST['db_engine'] != "sqlite") {
-                    // create database structure
-                    $query = $handle->exec($sql_structure);
-                }
-
-                // Create user
-                $handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
-                $sql = "INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, '')";
-                $params = array($username, $salted_password, $username);
-                $query = executeQuery($handle, $sql, $params);
-
-                $id_user = (int)$handle->lastInsertId('users_id_seq');
+        $id_user = (int)$handle->lastInsertId('users_id_seq');
 
-                $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)';
-                $params = array($id_user, 'pager', '10');
-                $query = executeQuery($handle, $sql, $params);
+        $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)';
+        $params = array($id_user, 'pager', '10');
+        $query = executeQuery($handle, $sql, $params);
 
-                $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)';
-                $params = array($id_user, 'language', 'en_EN.UTF8');
-                $query = executeQuery($handle, $sql, $params);
+        $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)';
+        $params = array($id_user, 'language', 'en_EN.UTF8');
+        $query = executeQuery($handle, $sql, $params);
 
-                foreach ($moreQueries as $query) {
-                    executeQuery($handle, $query, array());
-                }
+        foreach ($moreQueries as $query) {
+            executeQuery($handle, $query, array());
+        }
+        $successes[] = 'wallabag is now installed. You can now <a href="index.php?clean=0">access it !</a>';
 
-                $successes[] = 'wallabag is now installed. You can now <a href="index.php?clean=0">access it !</a>';
-            }
+    if (!copy('inc/poche/config.inc.default.php', 'inc/poche/config.inc.php')) {
+        $errors[] = 'Installation aborted, impossible to create inc/poche/config.inc.php file. Maybe you don\'t have write access to create it.';
+    } else {
+        if ($_POST['db_engine'] != 'sqlite') {
+            $content = str_replace("define ('STORAGE', 'sqlite');", "define ('STORAGE', '".$_POST['db_engine']."');", $content);
+            file_put_contents('inc/poche/config.inc.php', $content);
         }
+        $content = str_replace("define ('SALT', '');", "define ('SALT', '".$salt."');", $content);
+        file_put_contents('inc/poche/config.inc.php', $content);
     }
 }
+}
 ?>
 <!DOCTYPE html>
 <html>
@@ -208,8 +170,162 @@ else if (isset($_POST['install'])) {
         <link rel="stylesheet" href="themes/baggy/css/main.css" media="all">
         <link rel="stylesheet" href="themes/baggy/css/messages.css" media="all">
         <link rel="stylesheet" href="themes/baggy/css/print.css" media="print">
-        <script src="themes/default/js/jquery-2.0.3.min.js"></script>
+        <script src="themes/_global/js/jquery-2.0.3.min.js"></script>
         <script src="themes/baggy/js/init.js"></script>
+
+
+        <style type="text/css">
+a {
+color:#000;
+text-decoration:underline;
+padding:0 1px;
+}
+a:hover {
+color:#fff;
+background-color:#333;
+text-decoration:none;
+padding:0 1px;
+}
+p {
+margin:0;
+padding:5px 0;
+}
+em {
+font-style:normal;
+background-color:#ffc;
+padding: 0.1em 0;
+}
+ul, ol {
+margin:10px 0 10px 20px;
+padding:0 0 0 15px;
+}
+ul li, ol li {
+margin:0 0 7px 0;
+padding:0 0 0 3px;
+}
+h2 {
+font-size:18px;
+padding:0;
+}
+h3 {
+font-size:16px;
+padding:0;
+margin:20px 0 5px 0;
+}
+h4 {
+font-size:14px;
+padding:0;
+margin:15px 0 5px 0;
+}
+code {
+font-size:1.1em;
+background-color:#f3f3ff;
+color:#000;
+}
+em strong {
+text-transform: uppercase;
+}
+table#chart {
+border-collapse:collapse;
+}
+table#chart th {
+background-color:#eee;
+padding:2px 3px;
+border:1px solid #fff;
+}
+table#chart td {
+text-align:center;
+padding:2px 3px;
+border:1px solid #eee;
+}
+table#chart tr.enabled td {
+/* Leave this alone */
+}
+table#chart tr.disabled td,
+table#chart tr.disabled td a {
+}
+table#chart tr.disabled td a {
+text-decoration:underline;
+}
+div.chunk {
+margin:20px 0 0 0;
+padding:0 0 10px 0;
+border-bottom:1px solid #ccc;
+}
+.footnote,
+.footnote a {
+font:10px/12px verdana, sans-serif;
+color:#aaa;
+}
+.footnote em {
+background-color:transparent;
+font-style:italic;
+}
+.good{
+background-color:#52CC5B;
+}
+.bad{
+background-color:#F74343;
+font-style:italic;
+font-weight: bold;
+}
+.pass{
+background-color:#FF9500;
+}
+.detail {
+cursor: pointer;
+}
+.descriptions {
+    margin-left: 10%;
+    position: relative;
+    top: 50%;
+}
+.database_inputs {
+    float: left;
+    width: 50%
+}
+.database_info {
+    width: 100%;
+    overflow: auto;
+}
+.compatibity_result {
+       margin: auto;
+       max-width: 300px;
+       min-height: 50px;
+       line-height: 50px;
+       text-align: center;
+    margin-bottom: 30px;
+    border-radius: 3px;
+}
+
+h2, legend {
+       font-size: 30px;
+       text-transform: uppercase;
+       font-family: "PT Sans",sans-serif;
+}
+
+legend:after {
+    content: "";
+    height: 4px;
+    width: 70px;
+    background-color: #000;
+    display: block;
+}
+#reloadpage {
+cursor: pointer;
+background-color: #000;
+color: #FFF;
+padding: 0.5em 1em;
+display: inline-block;
+border: 1px solid #000;
+}
+#reloadpage:hover {
+    background-color: #FFF;
+    color: #000;
+}
+
+</style>
+
     </head>
     <body>
         <header class="w600p center mbm">
@@ -259,24 +375,192 @@ else if (isset($_POST['install'])) {
             <?php endif; ?>
             <p>To install wallabag, you just have to fill the following fields. That's all.</p>
             <p>If you need help, you can read the doc: <a href="docs/" target="_blank">offline documentation</a> and <a href="http://doc.wallabag.org" target="_blank">online one</a> (already up-to-date).</p>
-            <p>Don't forget to check your server compatibility <a href="install/wallabag_compatibility_test.php?from=install">here</a>.</p>
-            <form method="post">
-                <fieldset>
-                    <legend><strong>Technical settings</strong></legend>
-                    <?php if (!is_dir('vendor')) : ?>
-                        <div class='messages notice install'>wallabag needs twig, a template engine (<a href="http://twig.sensiolabs.org/">?</a>). Two ways to install it:<br />
-                        <ul>
-                            <li>automatically download and extract vendor.zip into your wallabag folder. 
-                            <p><input type="submit" name="download" value="Download vendor.zip" /></p>
-                            <?php if (!extension_loaded('zip')) : ?>
-                                <b>Be careful, zip extension is not enabled in your PHP configuration. You'll have to unzip vendor.zip manually.</b>
-                            <?php endif; ?>
-                                <em>This method is mainly recommended if you don't have a dedicated server.</em></li>
-                            <li>use <a href="http://getcomposer.org/">Composer</a> :<pre><code>curl -s http://getcomposer.org/installer | php
-php composer.phar install</code></pre></li>
-                        </ul>
-                        </div>
-                    <?php endif; ?>
+
+            <div>
+                   <h2>Server compatibility test</h2>
+                   <?php if (isOkay()) { ?>
+                       <div class="compatibity_result detail good">All good</div>
+                           <?php } elseif (isPassing()) { ?>
+                           <div class="compatibity_result detail pass">Some problems, but it's OK !</div>
+                           <?php } else  { ?>
+                           <div class="compatibity_result detail bad">Bad news : you can't run wallabag</div>
+                           <?php } $status = status(); ?>
+            </div>
+
+            <div class="details">
+                <div>
+                    <hr>
+                    <h2 style="text-align:center;"><?php echo $status['app_name']; ?>: Compatibility Test</h2>
+                    <table cellpadding="0" cellspacing="0" border="0" width="100%" id="chart">
+                        <thead>
+                            <tr>
+                                <th>Test</th>
+                                <th>Should Be</th>
+                                <th>What You Have</th>
+                                <th>What it means</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr class="<?php echo ($status['php']) ? 'enabled' : 'disabled'; ?>">
+                                <td>PHP</td>
+                                <td>5.3.3 or higher</td>
+                                <td class="<?php echo ($status['php']) ? 'good' : 'disabled'; ?>"><?php echo phpversion(); ?></td>
+                                <td><?php echo ($status['php']) ? '<strong>PHP:</strong> You are running a supported version of PHP.' : '<strong>PHP:</strong> You are running an unsupported version of PHP. <strong>' . $status['app_name'] . ' will not work here.</strong>' ;?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['pdo']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/manual/en/book.pdo.php">PDO</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['pdo']) ? '<td class="good">Enabled</span>' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['pdo']) ? '<strong>PDO:</strong> You have PDO support enabled.' : '<strong>PDO:</strong> Your PHP installation doesn\'t support PHP PDO. <strong>' . $status['app_name'] . ' will not work here.</strong>' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['pdo_drivers_passing']) ? 'enabled' : 'disabled'; ?>">
+                               <td>PDO Drivers</td>
+                               <td>One of the PDO drivers must be installed</td>
+                               <?php echo ($status['pdo_drivers_passing']) ? '<td class="good">One driver is enabled</span>' : '<td class="bad">No driver available'; ?></td>
+                               <td><?php echo ($status['pdo_drivers_passing']) ? '<strong>PDO:</strong> You have at least one PDO driver installed.' : '<strong>PDO Drivers:</strong> Your PHP installation doesn\'t have any PDO driver installed. <strong>' . $status['app_name'] . ' will not work here.</strong>' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['xml']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/xml">XML</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['xml']) ? '<td class="good">Enabled, and sane</span>' : '<td class="bad">Disabled, or broken'; ?></td>
+                                <td><?php echo ($status['xml']) ? '<strong>XML:</strong> You have XMLReader support or a version of XML support that isn\'t broken installed.' : '<strong>XML:</strong> Your PHP installation doesn\'t support XML parsing. <strong>' . $status['app_name'] . ' will not work here.</strong>' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['pcre']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/pcre">PCRE</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['pcre']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['pcre']) ? '<strong>PCRE:</strong> You have PCRE support installed.' : '<strong>PCRE:</strong> Your PHP installation doesn\'t support Perl-Compatible Regular Expressions. <strong>' . $status['app_name'] .' will not work here.</strong>' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['zlib']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/zlib">Zlib</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['zlib']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['zlib']) ? '<strong>Zlib:</strong> You have <code>Zlib</code> enabled.  This allows SimplePie to support GZIP-encoded pages.' : '<strong>Zlib:</strong> The <code>Zlib</code> extension is not available.  SimplePie will ignore any GZIP-encoding, and instead handle pages as uncompressed text.' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['mbstring']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/mbstring">mbstring</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['mbstring']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td rowspan="2"><?php if(($status['mbstring']) && ($status['iconv'])) { ?><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed!  This will allow <?php echo $status['app_name']; ?> to handle the greatest number of languages.
+                                <?php } elseif ($status['mbstring']) { ?><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not.
+                                <?php } elseif ($status['iconv']) { ?><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not.
+                                <?php } else { ?><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English pages, as well as even some English ones.
+                                <?php } ?>
+                                </td>
+                            </tr>
+                            <tr class="<?php echo ($status['iconv']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/iconv">iconv</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['iconv']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['dom']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/manual/en/book.dom.php">DOM / XML extension</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['dom']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['dom']) ? '<strong>DOM/XML:</strong> You can parse <em>ini</em> files.' : '<strong>DOM/XML:</strong> Your PHP configuration isn\'t standard, you\'re missing PHP-DOM.  You may try to install a package or recompile PHP. <strong>' . $status['app_name'] . ' will not work here.</strong>'; ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['filter']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://uk.php.net/manual/en/book.filter.php">Data filtering</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['filter']) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
+                                <td><?php echo ($status['filter']) ? '<strong>Data filtering:</strong> You can use the PHP build-in DOM to operate on XML documents.' : '<strong>Data filtering:</strong> Your PHP configuration has the filter extension disabled.  <strong>' . $status['app_name'] . ' will not work here.</strong>' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['gd']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/manual/en/book.image.php">GD</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['gd']) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
+                                <td><?php echo($status['gd']) ? '<strong>GD:</strong> You have <code>GD</code> support installed.' : '<strong>GD:</strong> The <code>GD</code> extension is not available.  ' . $status['app_name'] . ' will not be able to download pictures locally on your server.' ?></td>
+                            </tr>                   
+                            <tr class="<?php echo ($status['tidy']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/tidy">Tidy</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['tidy']) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
+                                <td><?php echo ($status['tidy']) ? '<strong>Tidy:</strong> You have <code>Tidy</code> support installed.' : '<strong>Tidy:</strong> The <code>Tidy</code> extension is not available.' . $status['app_name'] . ' should still work with most pages, but you may experience problems with some. You can install it with <code>sudo apt-get install php5-tidy</code> and then reload Apache <code>sudo service apache2 reload</code>.' ; ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['curl']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/curl">cURL</a></td>
+                                <td>Enabled</td>
+                                <?php echo (extension_loaded('curl')) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
+                                <td><?php echo ($status['curl']) ? '<strong>cURL:</strong> You have <code>cURL</code> support installed.' : '<strong>cURL:</strong> The <code>cURL</code> extension is not available.  SimplePie will use <code>fsockopen()</code> instead.' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['parse_ini']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://uk.php.net/manual/en/function.parse-ini-file.php">Parse ini file</td>
+                                <td>Enabled</td>
+                                <?php echo ($status['parse_ini']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['parse_ini']) ? '<strong>Parse ini:</strong> You can parse <em>ini</em> files.' : '<strong>Parse ini files function :</strong> Bad luck : your webhost has decided to block the use of the <em>parse_ini_file</em> function. <strong>' . $status['app_name'] . ' will not work here.' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['parallel']) ? 'enabled' : 'disabled'; ?>">
+                                <td>Parallel URL fetching</td>
+                                <td>Enabled</td>
+                                <?php echo ($status['parallel']) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
+                                <td><?php echo ($status['parallel']) ? '<strong>Parallel URL fetching:</strong> You have <code>HttpRequestPool</code> or <code>curl_multi</code> support installed.' : '<strong>Parallel URL fetching:</strong> <code>HttpRequestPool</code> or <code>curl_multi</code> support is not available. ' . $status['app_name'] . ' will use <code>file_get_contents()</code> instead to fetch URLs sequentially rather than in parallel.' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['allow_url_fopen']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen">allow_url_fopen</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['allow_url_fopen']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['allow_url_fopen']) ? '<strong>allow_url_fopen:</strong> You have allow_url_fopen enabled.' : '<strong>allow_url_fopen:</strong> Your PHP configuration has allow_url_fopen disabled.  <strong>' . $status['app_name'] . ' will not work here.</strong>' ?></td>
+                            </tr>
+                            <tr class="<?php echo ($status['gettext']) ? 'enabled' : 'disabled'; ?>">
+                                <td><a href="http://php.net/manual/en/book.gettext.php">gettext</a></td>
+                                <td>Enabled</td>
+                                <?php echo ($status['gettext']) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
+                                <td><?php echo ($status['gettext']) ? '<strong>Gettext:</strong> You have <code>gettext</code> enabled.</em>' : '<strong>GetText:</strong> The <code>gettext</code> extension is not available. The system we use to display wallabag in various languages is not available. <strong>' . $status['app_name'] .' will not work here.</strong>' ?></td>
+                            </tr>
+                        </tbody>
+                    </table>
+                    <hr>
+                </div>
+                <div class="details">
+                    <?php //if ($status['php'] && $status['xml'] && $status['pcre'] && $status['mbstring'] && $status['iconv'] && $status['filter'] && $status['allow_url_fopen']) { ?>
+                    <?php if (isOkay()) { ?>
+                        <h3>Bottom Line: Yes, you can run <?php echo $status['app_name']; ?> !</h3>
+                        <p><em>Your webhost has its act together!</em></p>
+                        <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $status['app_name']; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p>
+                    <?php //} else if ($status['php'] && $status['xml'] && $status['pcre'] && $status['mbstring'] && $status['allow_url_fopen'] && $status['filter']) { ?>
+                    <?php } else if (!isOkay() && isPassing()) { ?>
+                        <h3>Bottom Line: Yes, you can run <?php echo $status['app_name']; ?> !</h3>
+                        <p><em>For most pages, it'll run with no problems.</em> There are certain languages that you might have a hard time with though.</p>
+                        <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $status['app_name']; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p>
+                    <?php } else { ?>
+                        <h3>Bottom Line: We're sorry…</h3>
+                        <p><em>Your webhost does not support the minimum requirements for <?php echo $status['app_name']; ?>.</em>  It may be a good idea to contact your webhost and point them to the results of this test. They may be able to enable/install the required components.</p>
+                        <p>If this is your own server and you think you have all the requirements installed, please get in touch with us.</p>
+                    <?php } ?>
+                </div>
+
+                       <div class="chunk">
+                           <p class="footnote">This compatibility test has been borrowed (and slightly adapted by <a href="http://fivefilters.org/content-only/">fivefilters.org</a>) from the one supplied by <a href="http://simplepie.org/">SimplePie.org</a>.</a></p>
+                       </div>
+                </div>
+            <form method="post" class="technical">
+            <hr>
+            <div class='twig'>
+                <h2>Twig installation</h2>
+                <?php if (!is_dir('vendor')) : ?>
+                    
+                    <p>wallabag needs twig, a template engine (<a href="http://twig.sensiolabs.org/">?</a>). Two ways to install it:</p>
+                    <ul>
+                        <li>automatically download and extract vendor.zip into your wallabag folder. 
+                        <p><input type="submit" name="download" value="Download vendor.zip" /></p>
+                        <?php if (!extension_loaded('zip')) : ?>
+                            <b>Be careful, zip extension is not enabled in your PHP configuration. You'll have to unzip vendor.zip manually.</b>
+                        <?php endif; ?>
+                            <em>This method is mainly recommended if you don't have a dedicated server.</em></li>
+                        <li>use <a href="http://getcomposer.org/">Composer</a> in your wallabag folder :<pre><code>curl -s http://getcomposer.org/installer | php
+php composer.phar install</code></pre>
+                        <span id="reloadpage">Reload to check</span>
+                        </li>
+                    </ul>
+                    
+                <?php else : ?>
+                    Twig is properly installed.
+                <?php endif; ?>
+                </div>
+                <div class="database_info">
+                <hr>
+                <fieldset class="database_inputs">
+                    <legend><strong>Database settings</strong></legend>
                     <p>
                         Database engine:
                         <ul>
@@ -287,6 +571,9 @@ php composer.phar install</code></pre></li>
                             </li>
                             <li>
                                 <label for="mysql">MySQL</label> <input name="db_engine" type="radio" id="mysql" value="mysql" />
+                                <div id="pdo_mysql" class='messages notice install'>
+                                    <p>All fields have to be filled.</p>
+                                </div>
                                 <ul id="mysql_infos">
                                     <li><label for="mysql_server">Server</label> <input type="text" placeholder="localhost" id="mysql_server" name="mysql_server" /></li>
                                     <li><label for="mysql_database">Database</label> <input type="text" placeholder="wallabag" id="mysql_database" name="mysql_database" /></li>
@@ -296,6 +583,9 @@ php composer.phar install</code></pre></li>
                             </li>
                             <li>
                                 <label for="postgres">PostgreSQL</label> <input name="db_engine" type="radio" id="postgres" value="postgres" />
+                                <div id="pdo_postgres" class='messages notice install'>
+                                    <p>All fields have to be filled.</p>
+                                </div>
                                 <ul id="pg_infos">
                                     <li><label for="pg_server">Server</label> <input type="text" placeholder="localhost" id="pg_server" name="pg_server" /></li>
                                     <li><label for="pg_database">Database</label> <input type="text" placeholder="wallabag" id="pg_database" name="pg_database" /></li>
@@ -306,8 +596,21 @@ php composer.phar install</code></pre></li>
                         </ul>
                     </p>
                 </fieldset>
-
-                <fieldset>
+                <div class="descriptions">
+                    <div id="sqlite_description">
+                        SQLite is the most simple database system of all three. It is therefore recommended for people who don't want or know how to configure other database systems.
+                    </div>
+                    <div id="mysql_description">
+                        MySQL is one of the most popular database systems. It comes with most shared hosting plans.
+                    </div>
+                    <div id="postgres_description">
+                        PostgreSQL. Because some people prefer it to MySQL.
+                    </div>
+                </div>
+                </div>
+                <hr>
+                <div class="usersettings">
+                <fieldset style="clear: both">
                     <legend><strong>User settings</strong></legend>
                     <p>
                         <label for="username">Username</label>
@@ -323,13 +626,42 @@ php composer.phar install</code></pre></li>
                         <input type="email" id="email" name="email" />
                     </p>
                 </fieldset>
-
                 <input type="submit" id="install_button" value="Install wallabag" name="install" />
+                </div>
             </form>
         </div>
         <script>
+            <?php if (!is_dir('vendor')) : ?>
+            $(".database_info").hide();
+            $(".usersettings").hide();
+            <?php endif ?>
+            /* 
+             * Database showing/hiding
+             */ 
             $("#mysql_infos").hide();
+            $("#mysql_description").hide();
             $("#pg_infos").hide();
+            $("#postgres_description").hide();
+            $("#sqlite_description").show();
+            $("#pdo_postgres").hide();
+            $("#pdo_mysql").hide();
+
+            /*
+             * Details hiding
+             */
+
+            $(".details").hide();
+
+            <?php
+            if (!isPassing()) : ?>
+                $('.technical').hide();
+            <?php
+            else :
+            ?>
+                $('.technical').show();
+            <?php
+            endif;
+            ?>
 
             <?php
             if (!extension_loaded('pdo_sqlite')) : ?>
@@ -346,20 +678,35 @@ php composer.phar install</code></pre></li>
                 {
                     if ( $("#mysql").prop('checked')) {
                         $("#mysql_infos").show();
+                        $("#pdo_mysql").show();
                         $("#pg_infos").hide();
+                        $("#pdo_postgres").hide();
                         $("#pdo_sqlite").hide();
-                        $("#install_button").show();
+                        $("#sqlite_description").hide();
+                        $("#postgres_description").hide();
+                        $("#mysql_description").show();
+                        $("#install_button").show();        
                     }
                     else {
                         if ( $("#postgres").prop('checked')) {
                             $("#mysql_infos").hide();
+                            $("#pdo_mysql").hide();
                             $("#pg_infos").show();
+                            $("#pdo_postgres").show();
                             $("#pdo_sqlite").hide();
+                            $("#sqlite_description").hide();
+                            $("#mysql_description").hide();
+                            $("#postgres_description").show();
                             $("#install_button").show();
                         }
                         else {
                             $("#mysql_infos").hide();
                             $("#pg_infos").hide();
+                            $("#pdo_postgres").hide();
+                            $("#pdo_mysql").hide();
+                            $("#sqlite_description").show();
+                            $("#mysql_description").hide();
+                            $("#postgres_description").hide();
                             <?php
                             if (!extension_loaded('pdo_sqlite')) : ?>
                             $("#pdo_sqlite").show();
@@ -370,6 +717,16 @@ php composer.phar install</code></pre></li>
                         }
                     }
                 });
+
+            $(".detail").click(function()
+            {
+                $('.details').toggle();
+            });
+            $("#reloadpage").click(function()
+            {
+                 location.reload();
+            });
+
         </script>
     </body>
 </html>
index 61a8e99f0df54f82533ef1c8f4b5e57d58f6491c..3b465851af7f7652de4731453c0635a79ee59002 100644 (file)
@@ -8,9 +8,11 @@
  * @license    http://opensource.org/licenses/MIT see COPYING file
  */
 
+function status() {
 $app_name = 'wallabag';
 
 $php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.3.3', '>='));
+$pdo_ok = class_exists('PDO');
 $pcre_ok = extension_loaded('pcre');
 $zlib_ok = extension_loaded('zlib');
 $mbstring_ok = extension_loaded('mbstring');
@@ -24,7 +26,7 @@ $allow_url_fopen_ok = (bool)ini_get('allow_url_fopen');
 $filter_ok = extension_loaded('filter');
 $gettext_ok = function_exists("gettext");
 $gd_ok = extension_loaded('gd');
-
+$pdo_drivers_passing = extension_loaded('pdo_sqlite') || extension_loaded('pdo_mysql') || extension_loaded('pdo_pgsql');
 
 if (extension_loaded('xmlreader')) {
        $xml_ok = true;
@@ -37,391 +39,50 @@ if (extension_loaded('xmlreader')) {
        $xml_ok = false;
 }
 
-header('Content-type: text/html; charset=UTF-8');
-
-?><!DOCTYPE html>
-
-<html lang="en">
-<head>
-<title><?php echo $app_name; ?>: Server Compatibility Test</title>
-
-<style type="text/css">
-body {
-       font:14px/1.4em "Lucida Grande", Verdana, Arial, Helvetica, Clean, Sans, sans-serif;
-       letter-spacing:0px;
-       color:#333;
-       margin:0;
-       padding:0;
-       background:#fff;
-}
-
-div#site {
-       width:550px;
-       margin:20px auto 0 auto;
-}
-
-a {
-       color:#000;
-       text-decoration:underline;
-       padding:0 1px;
-}
-
-a:hover {
-       color:#fff;
-       background-color:#333;
-       text-decoration:none;
-       padding:0 1px;
-}
-
-p {
-       margin:0;
-       padding:5px 0;
-}
-
-em {
-       font-style:normal;
-       background-color:#ffc;
-       padding: 0.1em 0;
-}
-
-ul, ol {
-       margin:10px 0 10px 20px;
-       padding:0 0 0 15px;
-}
-
-ul li, ol li {
-       margin:0 0 7px 0;
-       padding:0 0 0 3px;
-}
-
-h2 {
-       font-size:18px;
-       padding:0;
-       margin:30px 0 20px 0;
-}
-
-h3 {
-       font-size:16px;
-       padding:0;
-       margin:20px 0 5px 0;
-}
-
-h4 {
-       font-size:14px;
-       padding:0;
-       margin:15px 0 5px 0;
-}
-
-code {
-       font-size:1.1em;
-       background-color:#f3f3ff;
-       color:#000;
-}
-
-em strong {
-    text-transform: uppercase;
-}
-
-table#chart {
-       border-collapse:collapse;
-}
-
-table#chart th {
-       background-color:#eee;
-       padding:2px 3px;
-       border:1px solid #fff;
-}
-
-table#chart td {
-       text-align:center;
-       padding:2px 3px;
-       border:1px solid #eee;
-}
-
-table#chart tr.enabled td {
-       /* Leave this alone */
-}
-
-table#chart tr.disabled td, 
-table#chart tr.disabled td a {
-}
-
-table#chart tr.disabled td a {
-       text-decoration:underline;
-}
-
-div.chunk {
-       margin:20px 0 0 0;
-       padding:0 0 10px 0;
-       border-bottom:1px solid #ccc;
-}
+$status = array('app_name' => $app_name, 'php' => $php_ok, 'pdo' => $pdo_ok, 'pdo_drivers_passing' => $pdo_drivers_passing, 'xml' => $xml_ok, 'pcre' => $pcre_ok, 'zlib' => $zlib_ok, 'mbstring' => $mbstring_ok, 'dom' => $dom_ok, 'iconv' => $iconv_ok, 'tidy' => $tidy_ok, 'curl' => $curl_ok, 'parse_ini' => $parse_ini_ok, 'parallel' => $parallel_ok, 'allow_url_fopen' => $allow_url_fopen_ok, 'filter' => $filter_ok, 'gettext' => $gettext_ok, 'gd' => $gd_ok);
 
-.footnote,
-.footnote a {
-       font:10px/12px verdana, sans-serif;
-       color:#aaa;
+return $status;
 }
-
-.footnote em {
-       background-color:transparent;
-       font-style:italic;
+function isOkay() {
+       return !in_array(false, status());
 }
 
-.good{
-background-color:#52CC5B;
-}
-.bad{
-background-color:#F74343;
-font-style:italic;
-font-weight: bold;
+function isPassing() {
+       $status = status();
+       unset($status['curl'], $status['parallel'], $status['tidy'], $status['gd'], $status['filter']);
+       return !in_array(false, $status);
 }
-.pass{
-background-color:#FF9500;
-}
-
-</style>
 
-</head>
-
-<body>
-<?php
-$frominstall = false;
-if (isset($_GET['from'])){
-       if ($_GET['from'] == 'install'){
-               $frominstall = true;
-               }}
-?>
-<div id="site">
-       <div id="content">
-
-               <div class="chunk">
-                       <h2 style="text-align:center;"><?php echo $app_name; ?>: Compatibility Test</h2>
-                       <table cellpadding="0" cellspacing="0" border="0" width="100%" id="chart">
-                               <thead>
-                                       <tr>
-                                               <th>Test</th>
-                                               <th>Should Be</th>
-                                               <th>What You Have</th>
-                                       </tr>
-                               </thead>
-                               <tbody>
-                                       <tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td>PHP</td>
-                                               <td>5.3.3 or higher</td>
-                                               <td class="<?php echo ($php_ok) ? 'good' : 'disabled'; ?>"><?php echo phpversion(); ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($xml_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/xml">XML</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($xml_ok) ? '<td class="good">Enabled, and sane</span>' : '<td class="bad">Disabled, or broken'; ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/pcre">PCRE</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($pcre_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr>
-<!--                                   <tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/zlib">Zlib</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($zlib_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr> -->
-<!--                                   <tr class="<?php echo ($mbstring_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/mbstring">mbstring</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($mbstring_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr> -->
-<!--                                   <tr class="<?php echo ($iconv_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/iconv">iconv</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($iconv_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr> -->
-                                       <tr class="<?php echo ($dom_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/manual/en/book.dom.php">DOM / XML extension</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($dom_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($filter_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://uk.php.net/manual/en/book.filter.php">Data filtering</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($filter_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($gd_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/manual/en/book.image.php">GD</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($gd_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
-                                       </tr>                                   
-                                       <tr class="<?php echo ($tidy_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/tidy">Tidy</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($tidy_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/curl">cURL</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo (extension_loaded('curl')) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
-                                       </tr>
-                    <tr class="<?php echo ($parse_ini_ok) ? 'enabled' : 'disabled'; ?>">
-                        <td><a href="http://uk.php.net/manual/en/function.parse-ini-file.php">Parse ini file</td>
-                        <td>Enabled</td>
-                        <?php echo ($parse_ini_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                    </tr>
-                                       <tr class="<?php echo ($parallel_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td>Parallel URL fetching</td>
-                                               <td>Enabled</td>
-                                               <?php echo ($parallel_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($allow_url_fopen_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen">allow_url_fopen</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($allow_url_fopen_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr>
-                                       <tr class="<?php echo ($gettext_ok) ? 'enabled' : 'disabled'; ?>">
-                                               <td><a href="http://php.net/manual/en/book.gettext.php">gettext</a></td>
-                                               <td>Enabled</td>
-                                               <?php echo ($gettext_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
-                                       </tr>
-                               </tbody>
-                       </table>
-               </div>
-
-               <div class="chunk">
-                       <h3>What does this mean?</h3>
-                       <ol>
-                               <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $zlib_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?>
-                               <?php if ($php_ok && $xml_ok && $pcre_ok && $dom_ok && $filter_ok && $gd_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok && $gettext_ok && $parse_ini_ok): ?>
-                               <li><em>You have everything you need to run <?php echo $app_name; ?> properly!  Congratulations!</em></li>
-                               <?php else: ?>
-                                       <?php if ($php_ok): ?>
-                                               <li><strong>PHP:</strong> You are running a supported version of PHP.  <em>No problems here.</em></li>
-                                               <?php if ($xml_ok): ?>
-                                                       <li><strong>XML:</strong> You have XMLReader support or a version of XML support that isn't broken installed.  <em>No problems here.</em></li>
-                                                       <?php if ($pcre_ok): ?>
-                                                               <li><strong>PCRE:</strong> You have PCRE support installed. <em>No problems here.</em></li>
-                                                               
-                                                               <?php if ($allow_url_fopen_ok): ?>
-                                                                       <li><strong>allow_url_fopen:</strong> You have allow_url_fopen enabled. <em>No problems here.</em></li>
-                                                                       
-                                                                       <?php if ($gettext_ok): ?>
-                                                                               <li><strong>Gettext:</strong> You have <code>gettext</code> enabled. <em>No problems here.</em></li>
-                                        
-                                        <?php if ($parse_ini_ok): ?>
-                                               <li><strong>Parse ini:</strong> You can parse <em>ini</em> files. <em>No problems here.</em></li>
-
-                                               <?php if ($dom_ok): ?>
-                                                       <li><strong>DOM/XML:</strong> You can parse <em>ini</em> files. <em>No problems here.</em></li>
-                                        
-                                                   <?php if ($filter_ok): ?>
-                                                       <li><strong>Data filtering:</strong> You can use the PHP build-in DOM to operate on XML documents. <em>No problems here.</em></li>
-               
-                                                       <?php if ($zlib_ok): ?>
-                                                           <li><strong>Zlib:</strong> You have <code>Zlib</code> enabled.  This allows SimplePie to support GZIP-encoded feeds.  <em>No problems here.</em></li>
-                                                       <?php else: ?>
-                                                           <li><strong>Zlib:</strong> The <code>Zlib</code> extension is not available.  SimplePie will ignore any GZIP-encoding, and instead handle feeds as uncompressed text.</li>
-                                                       <?php endif; ?>
-                                                       
-                                                       <?php if ($mbstring_ok && $iconv_ok): ?>
-                                                           <li><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed!  This will allow <?php echo $app_name; ?> to handle the greatest number of languages. <em>No problems here.</em></li>
-                                                       <?php elseif ($mbstring_ok): ?>
-                                                           <li><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not.</li>
-                                                       <?php elseif ($iconv_ok): ?>
-                                                           <li><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not.</li>
-                                                       <?php else: ?>
-                                                           <li><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English feeds, as well as even some English ones.</li>
-                                                       <?php endif; ?>
-
-                                                       <?php if ($gd_ok): ?>
-                                                           <li><strong>GD:</strong> You have <code>GD</code> support installed.  <em>No problems here.</em></li>
-                                                       <?php else: ?>
-                                                           <li><strong>GD:</strong> The <code>GD</code> extension is not available.  <?php echo $app_name; ?> will not be able to download pictures locally on your server.</li>
-                                                       <?php endif; ?>
-
-                                                       <?php if ($tidy_ok): ?>
-                                                           <li><strong>Tidy:</strong> You have <code>Tidy</code> support installed.  <em>No problems here.</em></li>
-                                                       <?php else: ?>
-                                                           <li><strong>Tidy:</strong> The <code>Tidy</code> extension is not available.  <?php echo $app_name; ?> should still work with most feeds, but you may experience problems with some. You can install it with <code>sudo apt-get install php5-tidy</code> and then reload Apache <code>sudo service apache2 reload</code>.</li>
-                                                       <?php endif; ?>
-                                                   
-                                                       <?php if ($curl_ok): ?>
-                                                           <li><strong>cURL:</strong> You have <code>cURL</code> support installed.  <em>No problems here.</em></li>
-                                                       <?php else: ?>
-                                                           <li><strong>cURL:</strong> The <code>cURL</code> extension is not available.  SimplePie will use <code>fsockopen()</code> instead.</li>
-                                                       <?php endif; ?>
-                       
-                                                       <?php if ($parallel_ok): ?>
-                                                           <li><strong>Parallel URL fetching:</strong> You have <code>HttpRequestPool</code> or <code>curl_multi</code> support installed.  <em>No problems here.</em></li>
-                                                       <?php else: ?>
-                                                           <li><strong>Parallel URL fetching:</strong> <code>HttpRequestPool</code> or <code>curl_multi</code> support is not available.  <?php echo $app_name; ?> will use <code>file_get_contents()</code> instead to fetch URLs sequentially rather than in parallel.</li>
-                                                       <?php endif; ?>
-
-                                                       <?php else: ?>
-                                                           <li><strong>Data filtering:</strong> Your PHP configuration has the filter extension disabled.  <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                                       <?php endif; ?>
-
-                                                   <?php else: ?>
-                                                       <li><strong>DOM/XML:</strong> Your PHP configuration isn't standard, you're missing PHP-DOM.  You may try to install a package or recompile PHP. <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                               <?php endif; ?>
-
-                                        <?php else : ?>
-                                            <li><strong>Parse ini files function :</strong> Bad luck : your webhost has decided to block the use of the <em>parse_ini_file</em> function. <strong><?php echo $app_name; ?> will not work here.</strong>
-                                        <?php endif; ?>
-                                                                               
-                                                                       <?php else: ?>
-                                                                               <li><strong>GetText:</strong> The <code>gettext</code> extension is not available. The system we use to display wallabag in various languages is not available. <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                                                       <?php endif; ?>
-                                                                               
-                                                               <?php else: ?>
-                                                                       <li><strong>allow_url_fopen:</strong> Your PHP configuration has allow_url_fopen disabled.  <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                                               <?php endif; ?>
-                                                                       
-                                                       <?php else: ?>
-                                                               <li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions.  <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                                       <?php endif; ?>
-                                               <?php else: ?>
-                                                       <li><strong>XML:</strong> Your PHP installation doesn't support XML parsing.  <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                               <?php endif; ?>
-                                       <?php else: ?>
-                                               <li><strong>PHP:</strong> You are running an unsupported version of PHP.  <strong><?php echo $app_name; ?> will not work here.</strong></li>
-                                       <?php endif; ?>
-                               <?php endif; ?>
-                       </ol>
-               </div>
-
-               <div class="chunk">
-                       <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $allow_url_fopen_ok) { ?>
-                       <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $allow_url_fopen_ok && $gettext_ok && $parse_ini_ok) { ?>
-                               <h3>Bottom Line: Yes, you can!</h3>
-                               <p><em>Your webhost has its act together!</em></p>
-                               <?php if (!$frominstall) { ?>
-                               <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p>
-                               <p>If you already have done that, you should access <a href="index.php">the index.php file</a> of your installation to configure and/or start using wallabag</p>
-                               <?php } else { ?>
-                               <p>You can now <a href="../index.php">return to the installation section</a>.</p>
-                               <?php } ?>
-                               <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p>
-                       <?php //} else if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $allow_url_fopen_ok && $filter_ok) { ?>
-                       <?php } else if ($php_ok && $xml_ok && $pcre_ok && $allow_url_fopen_ok && $filter_ok && $gettext_ok && $parse_ini_ok) { ?>
-                               <h3>Bottom Line: Yes, you can!</h3>
-                               <p><em>For most feeds, it'll run with no problems.</em> There are certain languages that you might have a hard time with though.</p>
-                               <?php if (!$frominstall) { ?>
-                               <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p>
-                               <p>If you already have done that, you should access <a href="index.php">the index.php file</a> of your installation to configure and/or start using wallabag</p>
-                               <?php } else { ?>
-                               <p>You can now <a href="../index.php">return to the installation section</a>.</p>
-                               <?php } ?>
-                               <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p>
-                       <?php } else { ?>
-                               <h3>Bottom Line: We're sorry…</h3>
-                               <p><em>Your webhost does not support the minimum requirements for <?php echo $app_name; ?>.</em>  It may be a good idea to contact your webhost and point them to the results of this test. They may be able to enable/install the required components.</p>
-                       <?php } ?>
-               </div>
-
-               <div class="chunk">
-                       <p class="footnote">This compatibility test has been borrowed (and slightly adapted by <a href="http://fivefilters.org/content-only/">fivefilters.org</a>) from the one supplied by <a href="http://simplepie.org/">SimplePie.org</a>.</a></p>
-               </div>
-
-       </div>
-
-</div>
+/* Function taken from at http://php.net/manual/en/function.rmdir.php#110489
+ * Idea : nbari at dalmp dot com
+ * Rights unknown
+ * Here in case of .gitignore files
+ */
 
-</body>
-</html>
+function delTree($dir) {
+    $files = array_diff(scandir($dir), array('.','..'));
+    foreach ($files as $file) {
+      (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
+    }
+    return rmdir($dir);
+  }
+
+function generate_salt() {
+       mt_srand(microtime(true)*100000 + memory_get_usage(true));
+    return md5(uniqid(mt_rand(), true));
+}
+
+function executeQuery($handle, $sql, $params) {
+    try
+    {
+        $query = $handle->prepare($sql);
+        $query->execute($params);
+        return $query->fetchAll();
+    }
+    catch (Exception $e)
+    {
+        return FALSE;
+    }
+}
+
+?>
\ No newline at end of file
index bd18817fbc80bb572c1e7e0808680b94eaac6af7..3add116cc30a5f98dc4dff0aa1eabc1c451c9c56 100644 (file)
Binary files a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo and b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo differ
index 8b82721d95da7f530bdb342dd2a30e53dba109e2..47801007424181db98720a0adc32d41095ed0b90 100644 (file)
@@ -1,18 +1,26 @@
 msgid ""
 msgstr ""
-"Project-Id-Version: Wallabag\n"
+"Project-Id-Version: wallabag\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-03-27 13:41+0100\n"
+"POT-Creation-Date: 2014-02-25 15:17+0300\n"
 "PO-Revision-Date: \n"
-"Last-Translator: Kevin Meyer <wallabag@kevin-meyer.de>\n"
+"Last-Translator: Julian Oster <wallabag@jlnostr.de>\n"
 "Language-Team: \n"
-"Language: de\n"
+"Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.6.4\n"
+"X-Generator: Poedit 1.7.3\n"
 "X-Poedit-Basepath: .\n"
-"X-Poedit-SearchPath-0: /Users/kevinmeyer/Dropbox/dev_web/wallabag-dev\n"
+
+msgid "wallabag, a read it later open source system"
+msgstr "wallabag, ein \"Read-it-later\"-Open-Source-System"
+
+msgid "login failed: user doesn't exist"
+msgstr "Anmeldung fehlgeschlagen: Benutzer existiert nicht"
+
+msgid "return home"
+msgstr "Auf Startseite zurückkehren"
 
 msgid "config"
 msgstr "Konfiguration"
@@ -21,13 +29,19 @@ msgid "Saving articles"
 msgstr "Artikel speichern"
 
 msgid "There are several ways to save an article:"
-msgstr "Es gibt viele Methoden um Artikel zu speichern:"
+msgstr "Es gibt mehrere Wege, um einen Artikel zu speichern:"
 
 msgid "read the documentation"
-msgstr "Die Dokumentation lesen"
+msgstr "Dokumentation lesen"
 
 msgid "download the extension"
-msgstr "installiere die Erweiterung"
+msgstr "Erweiterung herunterladen"
+
+msgid "Firefox Add-On"
+msgstr "Firefox-Addon"
+
+msgid "Chrome Extension"
+msgstr "Chrome-Erweiterung"
 
 msgid "via F-Droid"
 msgstr "via F-Droid"
@@ -39,16 +53,16 @@ msgid "via Google Play"
 msgstr "via Google Play"
 
 msgid "download the application"
-msgstr "lade die App"
+msgstr "App herunterladen"
 
 msgid "By filling this field"
-msgstr "Durch Ausfüllen dieses Feldes"
+msgstr "Durch das Ausfüllen dieses Feldes"
 
 msgid "bag it!"
 msgstr "bag it!"
 
 msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
-msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen-Leiste"
+msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen"
 
 msgid "Upgrading wallabag"
 msgstr "wallabag aktualisieren"
@@ -57,58 +71,46 @@ msgid "Installed version"
 msgstr "Installierte Version"
 
 msgid "Latest stable version"
-msgstr "Neuste stabile Version"
+msgstr "Letzte stabile Version"
 
 msgid "A more recent stable version is available."
-msgstr "Eine neuere stabile Version ist verfügbar."
+msgstr "Eine neuere Version ist verfügbar."
 
 msgid "You are up to date."
-msgstr "Du bist auf den neuesten Stand."
-
-msgid "Last check:"
-msgstr "Zuletzt geprüft:"
+msgstr "Du bist auf dem aktuellsten Stand."
 
 msgid "Latest dev version"
-msgstr "Neuste Entwicklungsversion"
+msgstr "Letzte Entwickler-Version"
 
 msgid "A more recent development version is available."
-msgstr "Eine neuere Entwicklungsversion ist verfügbar."
+msgstr "Eine neuere Entwickler-Version ist verfügbar."
 
 msgid "You can clear cache to check the latest release."
-msgstr "Leere den Cache um die neueste Version zu prüfen."
+msgstr "Du kannst den <a href=\"#cache\">Cache leeren</a>, um nach neueren Versionen zu suchen."
 
 msgid "Feeds"
 msgstr "Feeds"
 
-msgid ""
-"Your feed token is currently empty and must first be generated to enable "
-"feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
-msgstr ""
-"Dein Feed Token ist noch nicht vorhanden und muss zunächst generiert werden, "
-"um deine Feeds zu aktivieren. Klicke <a href='?feed&amp;"
-"action=generate'>hier um ihn zu generieren</a>."
+msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
+msgstr "Dein Feed-Token ist momentan leer und muss generiert werden, um die Feeds zu aktivieren. Klicke  <a href='?feed&amp;action=generate'>hier, um ihn zu erstellen</a>."
 
 msgid "Unread feed"
-msgstr "Ungelesen Feed"
+msgstr "Feed für Ungelesenes"
 
 msgid "Favorites feed"
-msgstr "Favoriten Feed"
+msgstr "Feed für Favoriten"
 
 msgid "Archive feed"
-msgstr "Archiv Feed"
+msgstr "Archiv-Feed"
 
 msgid "Your token:"
 msgstr "Dein Token:"
 
 msgid "Your user id:"
-msgstr "Deine User ID:"
+msgstr "Deine Benutzer-ID:"
 
-msgid ""
-"You can regenerate your token: <a href='?feed&amp;action=generate'>generate!"
-"</a>."
-msgstr ""
-"Hier kannst du dein Token erzeugen: <a href='?feed&amp;"
-"action=generate'>Generieren!</a>."
+msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
+msgstr "Du kannst deinen Token regenerieren: <a href='?feed&amp;action=generate'>generieren!</a>."
 
 msgid "Change your theme"
 msgstr "Theme ändern"
@@ -138,76 +140,58 @@ msgid "Repeat your new password:"
 msgstr "Neues Passwort wiederholen:"
 
 msgid "Import"
-msgstr "Import"
+msgstr "Importieren"
 
-msgid ""
-"Importing from other services can be quite long, and webservers default "
-"configuration often prevents long scripts execution time, so it must be done "
-"in multiple parts."
-msgstr ""
-"Der Import von anderen Diensten kann sehr lange dauern. Deswegen bricht der "
-"Webserver diesen in vielen Konfigurationen ab. Daher muss der Import in "
-"mehrere Teile aufgeteilt werden."
+msgid "You can import your Pocket, Readability, Instapaper, Wallabag or any data in appropriate json or html format."
+msgstr "Du kannst aus Pocket, Readability, Instapaper, wallabag oder einer beliebigen Datei in angebrachtem JSON- oder HTML-Format importieren."
+
+msgid "Please execute the import script locally as it can take a very long time."
+msgstr "Führe das Import-Skript lokal aus, da der Import sehr lange dauern kann."
 
-msgid "First, select the export file on your computer and upload it."
-msgstr "Wähle eine Datei von deinem Computer aus und lade sie hoch."
+msgid "Please select export file on your computer and press \"Import\" button below. Wallabag will parse your file, insert all URLs and start fetching of articles if required."
+msgstr ""
+"Wähle die Export-Datei auf deinem Computer aus und drücke den \"Import\"-Button unten. Wallabag wird deine Datei durchsuchen, alle URLs in der Datenbank speichern und die Artikel "
+"herunterladen, sofern dies erforderlich ist."
 
-msgid "File:"
-msgstr "Datei:"
+msgid "You can click here to fetch content for articles with no content."
+msgstr "Du kannst hier klicken, um den Inhalt für Artikel ohne Inhalt herunterzuladen."
 
-msgid "Upload"
-msgstr "Hochladen"
+msgid "More info in the official documentation:"
+msgstr "Mehr Infos in der offiziellen Dokumentation:"
 
-msgid "Then, click on the right link below."
-msgstr "Klicke dann unten auf den entsprechenden Link."
+msgid "(<a href=\"http://doc.wallabag.org/en/User_documentation/Save_your_first_article\" target=\"_blank\" title=\"Documentation\">?</a>)"
+msgstr "(<a href=\"http://doc.wallabag.org/de/Anwender/Den_ersten_Artikel_speichern\" target=\"_blank\" title=\"Dokumentation\">?</a>)"
 
 msgid "Import from Pocket"
-msgstr "Import aus Pocket"
+msgstr "Aus Pocket importieren"
 
 #, php-format
-msgid "(after uploaded %s file)"
-msgstr "(nach Upload der Datei %s)"
+msgid "(you must have a %s file on your server)"
+msgstr "(du solltest eine %s Datei auf deinem Server haben)"
 
 msgid "Import from Readability"
-msgstr "Import aus Readability"
+msgstr "Aus Readability importieren"
 
 msgid "Import from Instapaper"
-msgstr "Import aus Instapaper"
+msgstr "Aus Instapaper importieren"
 
 msgid "Import from wallabag"
-msgstr "Import aus Readability"
+msgstr "Aus wallabag importieren"
 
-msgid ""
-"3. Your feed token is currently empty and must first be generated to fetch "
-"content. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
-msgstr ""
-"3. Dein Feed Token ist noch nicht vorhanden und muss zunächst generiert "
-"werden, um Inhalt abrufen zu können. Klicke <a href='?feed&amp;"
-"action=generate'>hier um ihn zu generieren</a>."
-
-msgid "Finally, you have to fetch content for imported items."
-msgstr "Jetzt musst du den Inhalt der importierten Artikel abrufen."
+msgid "Export your wallabag data"
+msgstr "Deine wallabag-Daten exportieren"
 
 msgid "Click here"
-msgstr "Klicke hier"
-
-msgid "to fetch content for 10 articles"
-msgstr "um den Inhalt von 10 Artikeln abzurufen"
-
-msgid ""
-"If you have console access to your server, you can also create a cron task:"
-msgstr ""
-"Wenn du Konsolenzugang zu deinem Server hast kannst du auch einen cron "
-"erstellen:"
-
-msgid "Export your wallabag data"
-msgstr "Exportieren deine wallabag Daten"
+msgstr "Hier klicken, "
 
 msgid "to download your database."
-msgstr "um deine Datenbank herunterzuladen"
+msgstr "um die Datenbank herunterzuladen."
 
 msgid "to export your wallabag data."
-msgstr "um deine Daten aus wallabag zu exportieren."
+msgstr "um die wallabag-Daten zu exportieren."
+
+msgid "Export JSON"
+msgstr "JSON exportieren"
 
 msgid "Cache"
 msgstr "Cache"
@@ -215,444 +199,437 @@ msgstr "Cache"
 msgid "to delete cache."
 msgstr "um den Cache zu löschen."
 
-msgid "Tags"
-msgstr "Tags"
+msgid "Delete Cache"
+msgstr "Cache löschen, "
+
+msgid "You can enter multiple tags, separated by commas."
+msgstr "Du kannst mehrere Schlagworte, getrennt von einem Komma, hinzufügen."
+
+msgid "Add tags:"
+msgstr "Schlagworte hinzufügen:"
+
+msgid "no tags"
+msgstr "keine schlagworte"
+
+msgid "The tag has been applied successfully"
+msgstr "Das Schlagwort wurde erfolgreich übernommen."
+
+msgid "interview"
+msgstr "interview"
+
+msgid "editorial"
+msgstr "editorial"
+
+msgid "video"
+msgstr "video"
+
+msgid "return to article"
+msgstr "zum artikel zurückkehren"
+
+msgid "plop"
+msgstr "plop"
+
+msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
+msgstr "Du kannst deine <a href='wallabag_compatibility_test.php'>Konfiguration hier überprüfen</a>."
+
+msgid "favoris"
+msgstr "Favoriten"
+
+msgid "archive"
+msgstr "archiv"
+
+msgid "unread"
+msgstr "ungelesen"
 
 msgid "by date asc"
-msgstr "nach Datum aufsteigend"
+msgstr "nach Datum, aufsteigend"
 
 msgid "by date"
 msgstr "nach Datum"
 
 msgid "by date desc"
-msgstr "nach Datum absteigend"
+msgstr "nach Datum, absteigend"
 
 msgid "by title asc"
-msgstr "nach Titel aufsteigend"
+msgstr "nach Titel, aufsteigend"
 
 msgid "by title"
 msgstr "nach Titel"
 
 msgid "by title desc"
-msgstr "nach Titel absteigend"
-
-#, fuzzy
-msgid "toggle view mode"
-msgstr "Favorit"
+msgstr "nach Titel, absteigend"
 
-msgid "home"
-msgstr "Start"
+msgid "Tag"
+msgstr "Schlagwort"
 
-msgid "favorites"
-msgstr "Favoriten"
+msgid "No articles found."
+msgstr "Keine Artikel gefunden."
 
-msgid "archive"
-msgstr "Archiv"
+msgid "Toggle mark as read"
+msgstr "Als gelesen/ungelesen markieren"
 
-msgid "tags"
-msgstr "Tags"
+msgid "toggle favorite"
+msgstr "favorisieren"
 
-msgid "save a link"
-msgstr "Speichere einen Link"
+msgid "delete"
+msgstr "löschen"
 
-msgid "search"
-msgstr "Suche"
+msgid "original"
+msgstr "original"
 
-msgid "logout"
-msgstr "Logout"
+msgid "estimated reading time:"
+msgstr "Geschätzte Lesezeit:"
 
-msgid "return home"
-msgstr "Zurück zum Start"
+msgid "mark all the entries as read"
+msgstr "Alle Einträge als gelesen markieren"
 
-#, fuzzy
-msgid "Search"
-msgstr "Archiv"
+msgid "results"
+msgstr "Ergebnisse"
 
-msgid "powered by"
-msgstr "bereitgestellt von"
+msgid "installation"
+msgstr "installation"
 
-msgid "debug mode is on so cache is off."
-msgstr "Debug Modus ist aktiviert, das Caching ist somit deaktiviert"
+msgid "install your wallabag"
+msgstr "deine wallabag installieren"
 
-msgid "your wallabag version:"
-msgstr "Deine wallabag Version"
+msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
+msgstr ""
+"wallabag ist noch nicht installiert. Fülle das untenstehende Formular aus, um wallabag zu installieren. Scheue dich nicht davor, die <a href='http://doc.wallabag.org/de'>Dokumentation "
+"auf der wallabag-Webseite</a> zur Hilfe zu ziehen."
 
-msgid "storage:"
-msgstr "Speicher:"
+msgid "Login"
+msgstr "Anmelden"
 
-msgid "Save a link"
-msgstr "Speichere einen Link"
+msgid "Repeat your password"
+msgstr "Passwort wiederholen"
 
-msgid "save link!"
-msgstr "Link speichern!"
+msgid "Install"
+msgstr "Installieren"
 
-msgid "unread"
-msgstr "ungelesen"
+msgid "login to your wallabag"
+msgstr "Melde dich in deiner wallabag an"
 
-msgid "Tag"
-msgstr "Tag"
+msgid "Login to wallabag"
+msgstr "In wallabag anmelden"
 
-msgid "No articles found."
-msgstr "Keine Artikel gefunden."
+msgid "you are in demo mode, some features may be disabled."
+msgstr "Du bist im Demo-Modus, einige Features sind möglicherweise deaktiviert."
 
-msgid "estimated reading time:"
-msgstr "geschätzte Lesezeit:"
+msgid "Username"
+msgstr "Benutzername"
 
-msgid "estimated reading time :"
-msgstr "geschätzte Lesezeit:"
+msgid "Stay signed in"
+msgstr "Angemeldet bleiben"
 
-msgid "Toggle mark as read"
-msgstr "Als gelesen markieren"
+msgid "(Do not check on public computers)"
+msgstr "(nicht auf öffentlichen Computern ankreuzen)"
 
-msgid "toggle favorite"
-msgstr "Favorit"
+msgid "Sign in"
+msgstr "Anmelden"
 
-msgid "delete"
-msgstr "Löschen"
+msgid "favorites"
+msgstr "favoriten"
 
-msgid "original"
-msgstr "Original"
+msgid "estimated reading time :"
+msgstr "Geschätzte Lesezeit:"
 
 msgid "Mark all the entries as read"
-msgstr "Markiere alle als gelesen"
+msgstr "Alle Einträge als gelesen markieren"
 
-msgid "results"
-msgstr "Ergebnisse"
+msgid "Return home"
+msgstr "Zur Startseite zurückkehren"
 
-msgid "Uh, there is a problem with the cron."
-msgstr "Oh, es gab ein Problem mit dem cron."
+msgid "Back to top"
+msgstr "Nach oben scrollen"
 
-msgid "Untitled"
-msgstr "Ohne Titel"
-
-msgid "the link has been added successfully"
-msgstr "Speichern des Links erfolgreich"
-
-msgid "error during insertion : the link wasn't added"
-msgstr "Fehler beim Einfügen: Der Link wurde nicht hinzugefügt"
-
-msgid "the link has been deleted successfully"
-msgstr "Löschen des Links erfolgreich"
-
-msgid "the link wasn't deleted"
-msgstr "Der Link wurde nicht entfernt"
+msgid "Mark as read"
+msgstr "Als gelesen markieren"
 
-msgid "Article not found!"
-msgstr "Artikel nicht gefunden!"
+msgid "Favorite"
+msgstr "Favorisieren"
 
-msgid "previous"
-msgstr "vorherige"
+msgid "Toggle favorite"
+msgstr "favorisieren"
 
-msgid "next"
-msgstr "nächste"
+msgid "Delete"
+msgstr "Löschen"
 
-msgid "in demo mode, you can't update your password"
-msgstr "im Demo-Modus kann das Passwort nicht geändert werden"
+msgid "Tweet"
+msgstr "Twittern"
 
-msgid "your password has been updated"
-msgstr "Dein Passwort wurde geändert"
+msgid "Email"
+msgstr "Email"
 
-msgid ""
-"the two fields have to be filled & the password must be the same in the two "
-"fields"
-msgstr "Beide Felder müssen mit selbem Inhalt ausgefüllt sein"
+msgid "shaarli"
+msgstr "shaarli"
 
-msgid "still using the \""
-msgstr "nutze immernoch die \""
+msgid "flattr"
+msgstr "flattr"
 
-msgid "that theme does not seem to be installed"
-msgstr "dieses Theme scheint nicht installiert zu sein"
+msgid "Does this article appear wrong?"
+msgstr "Erscheint dieser Artikel nicht richtig?"
 
-msgid "you have changed your theme preferences"
-msgstr "Du hast deine Theme Einstellungen geändert"
+msgid "tags:"
+msgstr "schlagworte:"
 
-msgid "that language does not seem to be installed"
-msgstr "Diese Sprache scheint nicht installiert zu sein"
+msgid "Edit tags"
+msgstr "Schlagworte bearbeiten"
 
-msgid "you have changed your language preferences"
-msgstr "Du hast deine Spracheinstellungen geändert"
+msgid "save link!"
+msgstr "link speichern!"
 
-msgid "login failed: you have to fill all fields"
-msgstr "Anmeldung fehlgeschlagen: Alle Felder müssen ausgefüllt werden"
+msgid "home"
+msgstr "start"
 
-msgid "welcome to your wallabag"
-msgstr "Willkommen bei deiner wallabag"
+msgid "tags"
+msgstr "schlagworte"
 
-msgid "login failed: bad login or password"
-msgstr "Anmeldung fehlgeschlagen: Falscher Benutzername oder Passwort"
+msgid "logout"
+msgstr "abmelden"
 
-msgid ""
-"import from instapaper completed. You have to execute the cron to fetch "
-"content."
-msgstr ""
-"Import aus Instapaper vollständig. Führe den cronjob aus um den Inhalt "
-"abzurufen."
+msgid "powered by"
+msgstr "Angetrieben von"
 
-msgid ""
-"import from pocket completed. You have to execute the cron to fetch content."
-msgstr ""
-"Import aus Pocket vollständig. Führe den cronjob aus um den Inhalt abzurufen."
+msgid "debug mode is on so cache is off."
+msgstr "Der Debug-Modus ist aktiviert, also ist der Cache deaktiviert."
 
-msgid ""
-"import from Readability completed. You have to execute the cron to fetch "
-"content."
-msgstr ""
-"Import aus Readability vollständig. Führe den cronjob aus um den Inhalt "
-"abzurufen."
+msgid "your wallabag version:"
+msgstr "Deine wallabag-Version:"
 
-msgid ""
-"import from Poche completed. You have to execute the cron to fetch content."
-msgstr ""
-"Import aus Poche vollständig. Führe den cronjob aus um den Inhalt abzurufen."
+msgid "storage:"
+msgstr "speicher:"
 
-msgid "Unknown import provider."
-msgstr "Unbekannter Import Anbieter."
+msgid "save a link"
+msgstr "einen link speichern"
 
-msgid "Could not find required \""
-msgstr "Nicht gefunden: \""
+msgid "back to home"
+msgstr "zurück zur startseite"
 
-msgid "File uploaded. You can now execute import."
-msgstr "Datei hochgeladen. Du kannst nun importieren."
+msgid "toggle mark as read"
+msgstr "als gelesen/ungelesen markieren"
 
-msgid "Error while importing file. Do you have access to upload it?"
-msgstr "Fehler beim Importieren. Hast du das Recht zum Hochladen?"
+msgid "tweet"
+msgstr "tweet"
 
-msgid "User with this id ("
-msgstr "Nutzer mit dieser id ("
+msgid "email"
+msgstr "email"
 
-msgid "Uh, there is a problem while generating feeds."
-msgstr "Oh, es gab ein Problem beim Erstellen des Feeds."
+msgid "this article appears wrong?"
+msgstr "dieser artikel erscheint falsch?"
 
-msgid "Cache deleted."
-msgstr "Cache gelöscht"
+msgid "No link available here!"
+msgstr "Kein Link verfügbar!"
 
-msgid "Oops, it seems you don't have PHP 5."
-msgstr "Oops, es scheint als würde PHP 5 fehlen."
+msgid "Poching a link"
+msgstr "Link speichern"
 
-msgid "wallabag, a read it later open source system"
-msgstr "wallabag, ein Später-Lesen Open Source System"
+msgid "by filling this field"
+msgstr "mit dem Ausfüllen dieses Feldes"
 
-msgid "login failed: user doesn't exist"
-msgstr "Anmeldung fehlgeschlagen: Benutzer existiert nicht"
+msgid "bookmarklet: drag & drop this link to your bookmarks bar"
+msgstr "Bookmarklet: Drag & drop diesen Link in deine Lesezeichen"
 
-#~ msgid "You can enter multiple tags, separated by commas."
-#~ msgstr "Du kannst mehrere Tags, durch Kommata getrennt, eingeben."
+msgid "Drag &amp; drop this link to your bookmarks bar:"
+msgstr "Drag &amp; drop diesen Link in deine Lesezeichen:"
 
-#~ msgid "return to article"
-#~ msgstr "zurück zum Artikel"
+msgid "your version"
+msgstr "deine Version"
 
-#, fuzzy
-#~ msgid "favoris"
-#~ msgstr "Favoriten"
+msgid "latest stable version"
+msgstr "letzte stabile Version"
 
-#~ msgid "mark all the entries as read"
-#~ msgstr "Markiere alle als gelesen"
+msgid "a more recent stable version is available."
+msgstr "Eine aktuellere Version ist verfügbar."
 
-#~ msgid "Back to top"
-#~ msgstr "Nach Oben"
+msgid "you are up to date."
+msgstr "Du bist auf dem aktuellsten Stand."
 
-#~ msgid "Mark as read"
-#~ msgstr "Als gelesen markieren"
+msgid "latest dev version"
+msgstr "Letzte Entwickler-Version"
 
-#~ msgid "Favorite"
-#~ msgstr "Favoriten"
+msgid "a more recent development version is available."
+msgstr "Eine neuere Entwickler-Version ist verfügbar."
 
-#~ msgid "Toggle favorite"
-#~ msgstr "Favorit"
+msgid "Please execute the import script locally, it can take a very long time."
+msgstr "Führe das Import-Skript lokal aus, da der Import sehr lange dauern kann."
 
-#~ msgid "Delete"
-#~ msgstr "Löschen"
+msgid "More infos in the official doc:"
+msgstr "Mehr Informationen in der offiziellen Dokumentation:"
 
-#~ msgid "Tweet"
-#~ msgstr "Twittern"
+msgid "import from Pocket"
+msgstr "Aus Pocket importieren"
 
-#~ msgid "Email"
-#~ msgstr "per E-Mail senden"
+msgid "import from Readability"
+msgstr "Aus Readability importieren"
 
-#~ msgid "shaarli"
-#~ msgstr "Shaarli"
+msgid "import from Instapaper"
+msgstr "Aus Instapaper importieren"
 
-#~ msgid "flattr"
-#~ msgstr "flattr"
+msgid "Tags"
+msgstr "Schlagworte"
 
-#~ msgid "Does this article appear wrong?"
-#~ msgstr "Erscheint dieser Artikel falsch?"
+msgid "Untitled"
+msgstr "Untitled"
 
-#~ msgid "Edit tags"
-#~ msgstr "Tags bearbeiten"
+msgid "the link has been added successfully"
+msgstr "Der Link wurde erfolgreich hinzugefügt"
 
-#~ msgid "Start typing for auto complete."
-#~ msgstr "Beginne zu tippen für die Autovervollständigung."
+msgid "error during insertion : the link wasn't added"
+msgstr "Fehler während des Imports: Der Link wurde nicht hinzugefügt."
 
-#~ msgid "Return home"
-#~ msgstr "Zurück zum Start"
+msgid "the link has been deleted successfully"
+msgstr "Der Link wurde erfolgreich gelöscht"
 
-#~ msgid "tags:"
-#~ msgstr "Tags:"
+msgid "the link wasn't deleted"
+msgstr "Der Link wurde nicht gelöscht."
 
-#~ msgid "login to your wallabag"
-#~ msgstr "Bei wallabag anmelden"
+msgid "Article not found!"
+msgstr "Artikel nicht gefunden!"
 
-#~ msgid "you are in demo mode, some features may be disabled."
-#~ msgstr ""
-#~ "Du befindest dich im Demomodus, einige Funktionen könnten deaktiviert "
-#~ "sein."
+msgid "previous"
+msgstr "vorherige"
 
-#~ msgid "Login"
-#~ msgstr "Benutzername"
+msgid "next"
+msgstr "nächste"
 
-#~ msgid "Stay signed in"
-#~ msgstr "Angemeldet bleiben"
+msgid "in demo mode, you can't update your password"
+msgstr "Im Demo-Modus kannst du as Kennwort nicht aktualisieren."
 
-#~ msgid "(Do not check on public computers)"
-#~ msgstr "(nicht auf einem öffentlichen Computer anhaken)"
+msgid "your password has been updated"
+msgstr "Dein Passwort wurde aktualisiert"
 
-#~ msgid "plop"
-#~ msgstr "plop"
+msgid "the two fields have to be filled & the password must be the same in the two fields"
+msgstr "Beide Felder müssen ausgefüllt sein und das gleiche Passwort beinhalten"
 
-#~ msgid "Login to wallabag"
-#~ msgstr "Bei wallabag anmelden"
+msgid "still using the \""
+msgstr "nutze immernoch die \""
 
-#~ msgid "Username"
-#~ msgstr "Benutzername"
+msgid "that theme does not seem to be installed"
+msgstr "Dieses Theme scheint nicht installiert zu sein."
 
-#~ msgid "Sign in"
-#~ msgstr "Einloggen"
+msgid "you have changed your theme preferences"
+msgstr "Du hast deine Theme-Einstellungen geändert"
 
-#~ msgid "Enter your search here"
-#~ msgstr "Gib hier deine Suchanfrage ein"
+msgid "that language does not seem to be installed"
+msgstr "Diese Sprache scheint nicht installiert zu sein"
 
-#~ msgid "installation"
-#~ msgstr "Installieren"
+msgid "you have changed your language preferences"
+msgstr "Du hast deine Spracheinstellungen geändert"
 
-#~ msgid "install your wallabag"
-#~ msgstr "Installiere deine wallabag"
+msgid "login failed: you have to fill all fields"
+msgstr "Anmeldung fehlgeschlagen: Du musst alle Felder ausfüllen"
 
-#~ msgid ""
-#~ "wallabag is still not installed. Please fill the below form to install "
-#~ "it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the "
-#~ "documentation on wallabag website</a>."
-#~ msgstr ""
-#~ "wallabag ist noch nicht installiert. Bitte fülle die Felder unten aus, um "
-#~ "die Installation durchzuführen. Zögere nicht, <a href='http://doc."
-#~ "wallabag.org/'>die Dokumentation auf der Website von wallabag zu lesen, "
-#~ "falls du Probleme haben solltest."
+msgid "welcome to your wallabag"
+msgstr "Willkommen in deiner wallabag"
 
-#~ msgid "Repeat your password"
-#~ msgstr "Wiederhole dein Passwort"
+msgid "login failed: bad login or password"
+msgstr "Anmeldung fehlgeschlagen: Falscher Benutzername oder falsches Passwort"
 
-#~ msgid "Install"
-#~ msgstr "Installieren"
+msgid "import from instapaper completed"
+msgstr "Import aus Instapaper abgeschlossen"
 
-#~ msgid "No link available here!"
-#~ msgstr "Kein Link verfügbar!"
+msgid "import from pocket completed"
+msgstr "Import aus Pocket abgeschlossen"
 
-#~ msgid "toggle mark as read"
-#~ msgstr "Als gelesen markieren"
+msgid "import from Readability completed. "
+msgstr "Import aus Readability abgeschlossen."
 
-#~ msgid ""
-#~ "You can <a href='wallabag_compatibility_test.php'>check your "
-#~ "configuration here</a>."
-#~ msgstr ""
-#~ "Du kannst deine Konfiguration <a href='wallabag_compatibility_test."
-#~ "php'>hier testen</a>."
+msgid "import from Poche completed. "
+msgstr "Import aus wallabag abgeschlossen."
 
-#~ msgid "back to home"
-#~ msgstr "züruck zur Hauptseite"
+msgid "Unknown import provider."
+msgstr "Unbekannter Import-Provider."
 
-#~ msgid "tweet"
-#~ msgstr "Twittern"
+msgid "Incomplete inc/poche/define.inc.php file, please define \""
+msgstr "Die Datei /inc/poche/define.inc.php ist unvollständig, bitte definiere \""
 
-#~ msgid "email"
-#~ msgstr "senden per E-Mail"
+msgid "Could not find required \""
+msgstr "Nicht gefunden: \""
 
-#~ msgid "this article appears wrong?"
-#~ msgstr "dieser Artikel erscheint falsch?"
+msgid "Uh, there is a problem while generating feeds."
+msgstr "Oh, es gibt ein Problem bei dem Generieren der Feeds."
 
-#~ msgid "Poching a link"
-#~ msgstr "Poche einen Link"
+msgid "Cache deleted."
+msgstr "Cache geleert."
 
-#~ msgid "by filling this field"
-#~ msgstr "durch das ausfüllen dieses Feldes:"
+msgid "Oops, it seems you don't have PHP 5."
+msgstr "Ups, es sieht so aus, als ob du nicht PHP 5 hast."
 
-#~ msgid "bookmarklet: drag & drop this link to your bookmarks bar"
-#~ msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen-Leiste"
+msgid "Add user"
+msgstr "Benutzer hinzufügen"
 
-#~ msgid "your version"
-#~ msgstr "Deine Version"
+msgid "Add a new user :"
+msgstr "Neuen Benutzer hinzufügen:"
 
-#~ msgid "latest stable version"
-#~ msgstr "Neuste stabile Version"
+msgid "Login for new user"
+msgstr "Benutzername des neuen Benutzers"
 
-#~ msgid "a more recent stable version is available."
-#~ msgstr "Eine neuere stabile Version ist verfügbar."
+msgid "Password for new user"
+msgstr "Passwort des neuen Benutzers"
 
-#~ msgid "you are up to date."
-#~ msgstr "Du bist auf den neuesten Stand."
+msgid "Email for new user (not required)"
+msgstr "E-Mail-Adresse des neuen Benutzers (nicht erforderlich)"
 
-#~ msgid "latest dev version"
-#~ msgstr "Neuste Entwicklungsversion"
+msgid "Send"
+msgstr "Senden"
 
-#~ msgid "a more recent development version is available."
-#~ msgstr "Eine neuere Entwicklungsversion ist verfügbar."
+msgid "Delete account"
+msgstr "Account löschen"
 
-#~ msgid ""
-#~ "Please execute the import script locally, it can take a very long time."
-#~ msgstr ""
-#~ "Bitte führe das Import Script lokal aus, dies kann eine Weile dauern."
+msgid "You can delete your account by entering your password and validating."
+msgstr "Du kannst deinen Account löschen, indem du dein Kennwort eintippst und validierst."
 
-#~ msgid "More infos in the official doc:"
-#~ msgstr "Mehr Informationen in der offiziellen Dokumentation:"
+msgid "Be careful, data will be erased forever (that is a very long time)."
+msgstr "Pass auf, die Daten werden für immer gelöscht werden (eine sehr lange Zeit)."
 
-#~ msgid "import from Pocket"
-#~ msgstr "Import aus Pocket"
+msgid "Type here your password"
+msgstr "Kennwort hier eintippen"
 
-#~ msgid "(you must have a %s file on your server)"
-#~ msgstr "(du brauchst eine %s Datei auf deinem Server)"
+msgid "You are the only user, you cannot delete your own account."
+msgstr "Du kannst deinen Account nicht löschen, weil du der einzige Benutzer bist."
 
-#~ msgid "import from Readability"
-#~ msgstr "Import aus Readability"
+msgid "To completely remove wallabag, delete the wallabag folder on your web server (and eventual databases)."
+msgstr "Um wallabag komplett zu entfernen, lösche den wallabag-Ordner und die Datenbank(en) von deinem Webserver."
 
-#~ msgid "import from Instapaper"
-#~ msgstr "Import aus Instapaper"
+msgid "Enter your search here"
+msgstr "Suchbegriff hier eintippen"
 
-#~ msgid "You can also create a cron task:"
-#~ msgstr "Du kannst auch einen cronjob anlegen:"
+msgid "Tag these results as"
+msgstr "Diese Ergebnisse verschlagworten mit"
 
-#~ msgid ""
-#~ "Please execute the import script locally as it can take a very long time."
-#~ msgstr ""
-#~ "Bitte führe das Import Script lokal aus, da dies eine Weile dauern kann."
+# ebook
+msgid "Fancy an E-Book ?"
+msgstr "Willst du ein E-Book?"
 
-#~ msgid "More info in the official documentation:"
-#~ msgstr "Mehr Informationen in der offiziellen Dokumentation:"
+msgid "Click on <a href=\"./?epub&amp;method=all\" title=\"Generate ePub\">this link</a> to get all your articles in one ebook (ePub 3 format)."
+msgstr "Klicke auf <a href=\"./?epub&amp;method=all\" title=\"EPUB erstellen\">diesen Link</a>, um alle Artikel in ein E-Book (EPUB 3-Format) zu exportieren."
 
-#~ msgid "import from instapaper completed"
-#~ msgstr "Import aus Instapaper erfolgreich"
+msgid "This can <b>take a while</b> and can <b>even fail</b> if you have too many articles, depending on your server configuration."
+msgstr "Dies kann <b>eine Weile dauern</b> oder <b>sogar fehlschlagen</b>, wenn du zu viele Artikel hast, abhängig von deiner Server-Konfiguration."
 
-#~ msgid "import from pocket completed"
-#~ msgstr "Import aus Pocket erfolgreich"
+msgid "Download the articles from this tag in an epub"
+msgstr "Die Artikel von diesem Schlagwort als EPUB herunterladen"
 
-#~ msgid "import from Poche completed. "
-#~ msgstr "Import aus Poche erfolgreich"
+msgid "Download the articles from this search in an epub"
+msgstr "Alle Artikel aus dieser Suche als EPUB herunterladen"
 
-#~ msgid "Incomplete inc/poche/define.inc.php file, please define \""
-#~ msgstr "Unvollständige inc/poche/define.inc.php Datei, bitte setze \""
+msgid "Download the articles from this category in an epub"
+msgstr "Alle Artikel aus dieser Kategorie als EPUB herunterladen"
 
 #~ msgid "poche it!"
-#~ msgstr "Poche es!"
+#~ msgstr "poche it!"
 
 #~ msgid "Updating poche"
-#~ msgstr "Poche aktualisieren"
+#~ msgstr "Updating poche"
 
 #~ msgid "create an issue"
-#~ msgstr "ein Ticket erstellen"
+#~ msgstr "create an issue"
 
 #~ msgid "or"
-#~ msgstr "oder"
+#~ msgstr "or"
 
 #~ msgid "contact us by mail"
-#~ msgstr "kontaktieren Sie uns per E-Mail"
+#~ msgstr "contact us by mail"
 
 #~ msgid "your poche version:"
-#~ msgstr "Deine Poche Version"
+#~ msgstr "your poche version:"
index eed260b2e0a008835e8fcc661fb8d2035da8dc1b..83f397a05d37afd64e4e148c7340b97ae3144b2e 100644 (file)
Binary files a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo and b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo differ
index 4bdb3cd583d1220fafbd9e3c1dfd0470698a14e5..fef3120830babae6879352445f19b1dc2c775fb9 100644 (file)
@@ -250,7 +250,7 @@ msgid ""
 "your config file: IMPORT_LIMIT (how many articles are fetched at once) and "
 "IMPORT_DELAY (delay between fetch of next batch of articles)."
 msgstr ""
-"Sélectionner le fichier à importer sur votre disque dur, et pressez la "
+"Sélectionnez le fichier à importer sur votre disque dur, et pressez la "
 "bouton « Importer » ci-dessous.<br />wallabag analysera votre fichier, "
 "ajoutera toutes les URL trouvées et commencera à télécharger les contenus si "
 "nécessaire.<br />Le processus de téléchargement est contrôlé par deux "
index abebe455f11d159f742c1ffe8141e1e6a4f6ccd2..93515080d20f83ade7c672ed610357703f17e14c 100755 (executable)
             {{ block('pager') }}
             {% if view == 'home' %}{% if nb_results > 1 %}<p><a title="{% trans "Mark all the entries as read" %}"  href="./?action=archive_all">{% trans "Mark all the entries as read" %}</a></p>{% endif %}{% endif %}
             {% if searchterm is defined %}<a title="{% trans "Tag these results as" %} {{ searchterm }}" href="./?action=add_tag&search={{ searchterm }}">{% trans "Tag these results as" %} {{ searchterm }}</a>{% endif %}<br />
-            
+
+            {% if searchterm is defined %}<a title="{% trans "Delete results matching" %} {{ searchterm }}" href="./?action=delete&search={{ searchterm }}">{% trans "Delete results matching" %} {{ searchterm }}</a>{% endif %}<br />
+
+            {% if tag %}<a title="{% trans "Mark all articles from this tag as read" %}" href="./?action=toggle_archive&amp;tag_id={{ tag.id }}">{% trans "Mark all articles from this tag as read" %}</a><br />{% endif %}
+
             {% if tag %}
             {% if constant('EPUB') == 1 %}<a title="{% trans "Download the articles from this tag in an epub file" %}" href="./?epub&amp;method=tag&amp;value={{ tag.value }}">{% trans "Download as ePub3" %}</a>{% endif %}
             {% if constant('MOBI') == 1 %}<a title="{% trans "Download the articles from this tag in a mobi file" %}" href="./?mobi&amp;method=tag&amp;value={{ tag.value }}">{% trans "Download as Mobi" %}</a>{% endif %}
diff --git a/themes/courgette/config.twig b/themes/courgette/config.twig
deleted file mode 100755 (executable)
index 6b0fa30..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-{% extends "layout.twig" %}
-
-{% block title %}{% trans "config" %}{% endblock %}
-{% block menu %}
-{% include '_menu.twig' %}
-{% endblock %}
-{% block content %}
-        <div id="config">
-            <h2>{% trans "Poching a link" %}</h2>
-            <p>{% trans "There are several ways to save an article:" %} (<a class="special" href="http://doc.wallabag.org" title="{% trans "read the documentation" %}">?</a>)</p>
-            <ul>
-                <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/wallabag/" title="download the firefox extension">{% trans "download the extension" %}</a></li>
-                <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li>
-                <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li>
-                <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" title="download the iOS application">{% trans "download the application" %}</a></li>
-                <li>Windows Phone: <a href="http://www.windowsphone.com/en-us/store/app/wallabag/ff890514-348c-4d0b-9b43-153fff3f7450" title="download the window phone application">{% trans "download the application" %}</a></li>
-                <li>
-                    <form method="get" action="index.php">
-                        <label class="addurl" for="plainurl">{% trans "by filling this field" %}:</label>
-                        <input required placeholder="Ex:mywebsite.com/article" class="addurl" id="plainurl" name="plainurl" type="url" />
-                        <input type="submit" value="{% trans "bag it!" %}" />
-                    </form>
-                </li>
-                <li>{% trans "bookmarklet: drag & drop this link to your bookmarks bar" %} <a id="bookmarklet" ondragend="this.click();" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@wallabag.org']){top['bookmarklet-url@wallabag.org'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{{ poche_url }}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">{% trans "bag it!" %}</a></li>
-            </ul>
-
-            <h2>{% trans "Upgrading wallabag" %}</h2>
-            <ul>
-                <li>{% trans "your version" %} : <strong>{{ constant('POCHE') }}</strong></li>
-                <li>{% trans "latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "a more recent stable version is available." %}</a></strong>{% else %}{% trans "you are up to date." %}{% endif %}</li>
-                {% if constant('DEBUG_POCHE') == 1 %}<li>{% trans "latest dev version" %} : {{ dev }}. {% if compare_dev == -1 %}<strong><a href="http://wallabag.org/">{% trans "a more recent development version is available." %}</a></strong>{% else %}{% trans "you are up to date." %}{% endif %}</li>{% endif %}
-            </ul>
-            
-            <h2>{% trans "Change your theme" %}</h2>
-            <form method="post" action="?updatetheme" name="changethemeform">
-                <fieldset class="w500p">
-                    <div class="row">
-                        <label class="col w150p" for="theme">{% trans "Theme:" %}</label>
-                        <select class="col" id="theme" name="theme">
-                            {% for key, theme in themes %}
-                            <option value="{{ key }}" {{ theme.current ? 'selected' : '' }}>{{ theme.name }}</option>
-                            {% endfor %}
-                        </select>
-                    </div>
-                    <div class="row mts txtcenter">
-                        <button class="bouton" type="submit" tabindex="4">{% trans "Update" %}</button>
-                    </div>
-                </fieldset>
-                <input type="hidden" name="returnurl" value="{{ referer }}">
-                <input type="hidden" name="token" value="{{ token }}">
-            </form>
-
-            <h2>{% trans "Change your password" %}</h2>
-            <form method="post" action="?config" name="loginform">
-                <fieldset class="w500p">
-                    <div class="row">
-                        <label class="col w150p" for="password">{% trans "New password:" %}</label>
-                        <input class="col" type="password" id="password" name="password" placeholder="{% trans "Password" %}" tabindex="2">
-                    </div>
-                    <div class="row">
-                        <label class="col w150p" for="password_repeat">{% trans "Repeat your new password:" %}</label>
-                        <input class="col" type="password" id="password_repeat" name="password_repeat" placeholder="{% trans "Password" %}" tabindex="3">
-                    </div>
-                    <div class="row mts txtcenter">
-                        <button class="bouton" type="submit" tabindex="4">{% trans "Update" %}</button>
-                    </div>
-                </fieldset>
-                <input type="hidden" name="returnurl" value="{{ referer }}">
-                <input type="hidden" name="token" value="{{ token }}">
-            </form>
-
-            <h2>{% trans "Import" %}</h2>
-            <p>{% trans "Please execute the import script locally, it can take a very long time." %}</p>
-            <p>{% trans "More infos in the official doc:" %} <a href="http://doc.wallabag.org">wallabag.org</a></p>
-            <ul>
-                <li><a href="./?import&amp;from=pocket">{% trans "import from Pocket" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCKET_FILE')) }}</li>
-            <li><a href="./?import&amp;from=readability">{% trans "import from Readability" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('READABILITY_FILE')) }}</li>
-            <li><a href="./?import&amp;from=instapaper">{% trans "import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li>
-            </ul>
-
-            <h2>{% trans "Export your wallabag data" %}</h2>
-            <p><a href="./?export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your wallabag data." %}</p>
-            
-            <h2>{% trans "Fancy an E-Book ?" %}</h2>
-            <p>{% trans "Click to get all your articles in one ebook :" %}
-            <ul>
-            <li><a href="./?epub&amp;method=all" title="Generate ePub file">ePub 3</a></li>
-            <li><a href="./?mobi&amp;method=all" title="Generate Mobi file">Mobi</a></li>
-            <li><a href="./?pdf&amp;method=all" title="Generate PDF file">PDF</a></li>
-            </ul>
-
-            <br>{% trans "This can <b>take a while</b> and can <b>even fail</b> if you have too many articles, depending on your server configuration." %}</p>
-            
-            <h2>{% trans 'Add user' %}</h2>
-            <p>{% trans 'Add a new user :' %}</p>
-            <form method="post" action="?newuser">
-                <fieldset class="w500p">
-                <div class="row">
-                    <label class="col w150p" for="newusername">{% trans 'Login for new user' %}</label>
-                    <input class="col" type="text" id="newusername" name="newusername" placeholder="{% trans 'Login' %}">
-                </div>
-                <div class="row">
-                    <label class="col w150p" for="password4newuser">{% trans "Password for new user" %}</label>
-                    <input class="col" type="password" id="password4newuser" name="password4newuser" placeholder="{% trans "Password" %}">
-                </div>
-                <div class="row mts txtcenter">
-                    <button type="submit">{% trans "Send" %}</button>  
-                </div>
-                </fieldset>
-            </form>
-            
-            <h2>{% trans "Delete account" %}</h2>
-            {% if not only_user %}<form method="post" action="?deluser">
-            <p>{% trans "You can delete your account by entering your password and validating." %}<br /><b>{% trans "Be careful, data will be erased forever (that is a very long time)." %}</b></p>
-            <fieldset class="w500p">
-                <div class="row">
-                    <label class="col w150p" for="password4deletinguser">{% trans "Type here your password" %}</label>
-                    <input class="col" type="password" id="password4deletinguser" name="password4deletinguser" placeholder="{% trans "Password" %}">
-                </div>
-            <div class="row mts txtcenter">
-                <button type="submit">{% trans "Send" %}</button>
-            </div>
-            </form>
-            {% else %}<p>{% trans "You are the only user, you cannot delete your own account." %}<br />
-            {% trans "To completely remove wallabag, delete the wallabag folder on your web server." %}</p>{% endif %}
-        </div>
-{% endblock %}
index c5db58024096465276674a2edce4f017da74c442..b90005598cbbb5ffa3e924fce530427720c09230 100755 (executable)
             {{ block('pager') }}
             {% if view == 'home' %}{% if nb_results > 1 %}<p><a title="{% trans "Mark all the entries as read" %}"  href="./?action=archive_all">{% trans "Mark all the entries as read" %}</a></p>{% endif %}{% endif %}
             {% if searchterm is defined %}<a title="{% trans "Tag these results as" %} {{ searchterm }}" href="./?action=add_tag&search={{ searchterm }}">{% trans "Tag these results as" %} {{ searchterm }}</a>{% endif %}<br />
-            
+
+            {% if searchterm is defined %}<a title="{% trans "Delete results matching" %} {{ searchterm }}" href="./?action=delete&search={{ searchterm }}">{% trans "Delete results matching" %} {{ searchterm }}</a>{% endif %}<br />
+
+            {% if tag %}<a title="{% trans "Mark all articles from this tag as read" %}" href="./?action=toggle_archive&amp;tag_id={{ tag.id }}">{% trans "Mark all articles from this tag as read" %}</a><br />{% endif %}
+
             {% if tag %}
             {% if constant('EPUB') == 1 %}<a title="{% trans "Download the articles from this tag in an epub file" %}" href="./?epub&amp;method=tag&amp;value={{ tag.value }}">{% trans "Download as ePub3" %}</a>{% endif %}
             {% if constant('MOBI') == 1 %}<a title="{% trans "Download the articles from this tag in a mobi file" %}" href="./?mobi&amp;method=tag&amp;value={{ tag.value }}">{% trans "Download as Mobi" %}</a>{% endif %}
@@ -73,6 +77,6 @@
             {% if constant('MOBI') == 1 %}<a title="{% trans "Download the articles from this category in a mobi file" %}" href="./?mobi&amp;method=category&amp;value={{ view }}">{% trans "Download as Mobi" %}</a>{% endif %}
             {% if constant('PDF') == 1 %}<a title="{% trans "Download the articles from this category in a pdf file" %}" href="./?pdf&amp;method=category&amp;value={{ view }}">{% trans "Download as PDF" %}</a>{% endif %}
             {% endif %}
-            
+
             {% endif %}
 {% endblock %}