]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Update thumbnail integration after rebasing the branch
authorArthurHoaro <arthur@hoa.ro>
Sat, 11 Nov 2017 13:01:21 +0000 (14:01 +0100)
committerArthurHoaro <arthur@hoa.ro>
Thu, 5 Jul 2018 18:31:35 +0000 (20:31 +0200)
21 files changed:
application/Thumbnailer.php
application/Updater.php
assets/common/js/picwall.js [deleted file]
assets/common/js/thumbnails.js [new file with mode: 0644]
assets/default/scss/shaarli.scss
composer.json
composer.lock
inc/languages/fr/LC_MESSAGES/shaarli.po
inc/web-thumbnailer.json
index.php
tests/ThumbnailerTest.php
tests/Updater/UpdaterTest.php
tests/utils/config/configJson.json.php
tests/utils/config/wt.json [new file with mode: 0644]
tpl/default/configure.html
tpl/default/linklist.html
tpl/default/page.header.html
tpl/default/picwall.html
tpl/vintage/linklist.html
tpl/vintage/picwall.html
webpack.config.js

index b669adaedef74afcbca8d80219901b91f8a12b7c..9cf5dacdfb573dddbe679c4465c5dd380d6b665d 100644 (file)
@@ -1,6 +1,11 @@
 <?php
 
 <?php
 
+namespace Shaarli;
+
+use Shaarli\Config\ConfigManager;
+use WebThumbnailer\Exception\WebThumbnailerException;
 use WebThumbnailer\WebThumbnailer;
 use WebThumbnailer\WebThumbnailer;
+use WebThumbnailer\Application\ConfigManager as WTConfigManager;
 
 /**
  * Class Thumbnailer
 
 /**
  * Class Thumbnailer
@@ -28,7 +33,7 @@ class Thumbnailer
     {
         $this->conf = $conf;
         $this->wt = new WebThumbnailer();
     {
         $this->conf = $conf;
         $this->wt = new WebThumbnailer();
-        \WebThumbnailer\Application\ConfigManager::addFile('inc/web-thumbnailer.json');
+        WTConfigManager::addFile('inc/web-thumbnailer.json');
         $this->wt->maxWidth($this->conf->get('thumbnails.width'))
                  ->maxHeight($this->conf->get('thumbnails.height'))
                  ->crop(true)
         $this->wt->maxWidth($this->conf->get('thumbnails.width'))
                  ->maxHeight($this->conf->get('thumbnails.height'))
                  ->crop(true)
@@ -44,6 +49,12 @@ class Thumbnailer
      */
     public function get($url)
     {
      */
     public function get($url)
     {
-        return $this->wt->thumbnail($url);
+        try {
+            return $this->wt->thumbnail($url);
+        } catch (WebThumbnailerException $e) {
+            // Exceptions are only thrown in debug mode.
+            error_log(get_class($e) .': '. $e->getMessage());
+            return false;
+        }
     }
 }
     }
 }
index dece2c020d297fdf13bf8773b76cb37895328025..6fbe3e000f6577d884a136cce911a05bdf424c4b 100644 (file)
@@ -480,7 +480,19 @@ class Updater
         }
 
         $this->conf->write($this->isLoggedIn);
         }
 
         $this->conf->write($this->isLoggedIn);
+        return true;
+    }
 
 
+    /**
+     * * Move thumbnails management to WebThumbnailer, coming with new settings.
+     */
+    public function updateMethodWebThumbnailer()
+    {
+        $this->conf->set('thumbnails.enabled', $this->conf->get('thumbnail.enable_thumbnails', true));
+        $this->conf->set('thumbnails.width', 125);
+        $this->conf->set('thumbnails.height', 90);
+        $this->conf->remove('thumbnail');
+        $this->conf->write(true);
         return true;
     }
 }
         return true;
     }
 }
diff --git a/assets/common/js/picwall.js b/assets/common/js/picwall.js
deleted file mode 100644 (file)
index 87a93fc..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-import Blazy from 'blazy';
-
-(() => {
-  const picwall = document.getElementById('picwall_container');
-  if (picwall != null) {
-    // Suppress ESLint error because that's how bLazy works
-    /* eslint-disable no-new */
-    new Blazy();
-  }
-})();
diff --git a/assets/common/js/thumbnails.js b/assets/common/js/thumbnails.js
new file mode 100644 (file)
index 0000000..c28322b
--- /dev/null
@@ -0,0 +1,7 @@
+import Blazy from 'blazy';
+
+(() => {
+  // Suppress ESLint error because that's how bLazy works
+  /* eslint-disable no-new */
+  new Blazy();
+})();
index 09d5efbefb19a0f1e6fb60ff3e664927b574203d..425a0490f2e69151bee7c54015bfb5cf5079739c 100644 (file)
@@ -146,6 +146,10 @@ body,
   background-color: $main-green;
 }
 
   background-color: $main-green;
 }
 
+.page-single-alert {
+  margin-top: 100px;
+}
+
 .anchor {
   &:target {
     padding-top: 40px;
 .anchor {
   &:target {
     padding-top: 40px;
index 983bf9e939417976b071b78c46e652b4b703ed89..bdf52fcc6eba9daeb9bcfec72ade2296cf08a652 100644 (file)
@@ -19,7 +19,7 @@
         "shaarli/netscape-bookmark-parser": "^2.0",
         "erusev/parsedown": "^1.6",
         "slim/slim": "^3.0",
         "shaarli/netscape-bookmark-parser": "^2.0",
         "erusev/parsedown": "^1.6",
         "slim/slim": "^3.0",
-        "arthurhoaro/web-thumbnailer": "dev-master",
+        "arthurhoaro/web-thumbnailer": "^1.0",
         "pubsubhubbub/publisher": "dev-master",
         "gettext/gettext": "^4.4"
     },
         "pubsubhubbub/publisher": "dev-master",
         "gettext/gettext": "^4.4"
     },
index ee762c0e7f2df026045d272aa7295ba2615cf7a0..3f9ef7e2134044677928e6ccad885d44922cd8df 100644 (file)
@@ -4,8 +4,49 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "content-hash": "308a35eab91602fbb449f2c669c445ed",
+    "content-hash": "efa8b74ec9a15bb8c18e4a36fd13d480",
     "packages": [
     "packages": [
+        {
+            "name": "arthurhoaro/web-thumbnailer",
+            "version": "v1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ArthurHoaro/web-thumbnailer.git",
+                "reference": "10e2919c2aa0bf55f4593c8b05508a98c79d6706"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/10e2919c2aa0bf55f4593c8b05508a98c79d6706",
+                "reference": "10e2919c2aa0bf55f4593c8b05508a98c79d6706",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "5.2.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "WebThumbnailer\\": [
+                        "src/",
+                        "tests/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Arthur Hoaro",
+                    "homepage": "http://hoa.ro"
+                }
+            ],
+            "time": "2017-11-11T15:39:49+00:00"
+        },
         {
             "name": "container-interop/container-interop",
             "version": "1.2.0",
         {
             "name": "container-interop/container-interop",
             "version": "1.2.0",
index 2ebeccbc2d4c9629033c1a52670860b0e46786f4..15c8b2bb850de936e0d0673fd894f36c3b879f33 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Shaarli\n"
 msgid ""
 msgstr ""
 "Project-Id-Version: Shaarli\n"
-"POT-Creation-Date: 2018-01-24 18:43+0100\n"
-"PO-Revision-Date: 2018-03-06 18:44+0100\n"
+"POT-Creation-Date: 2018-05-05 12:47+0200\n"
+"PO-Revision-Date: 2018-05-05 12:47+0200\n"
 "Last-Translator: \n"
 "Language-Team: Shaarli\n"
 "Language: fr_FR\n"
 "Last-Translator: \n"
 "Language-Team: Shaarli\n"
 "Language: fr_FR\n"
@@ -56,7 +56,7 @@ msgstr "Liens directs"
 
 #: application/FeedBuilder.php:153
 #: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:88
 
 #: application/FeedBuilder.php:153
 #: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:88
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:178
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:177
 msgid "Permalink"
 msgstr "Permalien"
 
 msgid "Permalink"
 msgstr "Permalien"
 
@@ -68,18 +68,22 @@ msgstr "Le fichier d'historique n'est pas accessible en lecture ou en écriture"
 msgid "Could not parse history file"
 msgstr "Format incorrect pour le fichier d'historique"
 
 msgid "Could not parse history file"
 msgstr "Format incorrect pour le fichier d'historique"
 
-#: application/Languages.php:161
+#: application/Languages.php:177
 msgid "Automatic"
 msgstr "Automatique"
 
 msgid "Automatic"
 msgstr "Automatique"
 
-#: application/Languages.php:162
+#: application/Languages.php:178
 msgid "English"
 msgstr "Anglais"
 
 msgid "English"
 msgstr "Anglais"
 
-#: application/Languages.php:163
+#: application/Languages.php:179
 msgid "French"
 msgstr "Français"
 
 msgid "French"
 msgstr "Français"
 
+#: application/Languages.php:180
+msgid "German"
+msgstr "Allemand"
+
 #: application/LinkDB.php:136
 msgid "You are not authorized to add a link."
 msgstr "Vous n'êtes pas autorisé à ajouter un lien."
 #: application/LinkDB.php:136
 msgid "You are not authorized to add a link."
 msgstr "Vous n'êtes pas autorisé à ajouter un lien."
@@ -163,11 +167,11 @@ msgstr ""
 "a été importé avec succès en %d secondes : %d liens importés, %d liens "
 "écrasés, %d liens ignorés."
 
 "a été importé avec succès en %d secondes : %d liens importés, %d liens "
 "écrasés, %d liens ignorés."
 
-#: application/PageBuilder.php:168
+#: application/PageBuilder.php:173
 msgid "The page you are trying to reach does not exist or has been deleted."
 msgstr "La page que vous essayez de consulter n'existe pas ou a été supprimée."
 
 msgid "The page you are trying to reach does not exist or has been deleted."
 msgstr "La page que vous essayez de consulter n'existe pas ou a été supprimée."
 
-#: application/PageBuilder.php:170
+#: application/PageBuilder.php:175
 msgid "404 Not Found"
 msgstr "404 Introuvable"
 
 msgid "404 Not Found"
 msgstr "404 Introuvable"
 
@@ -180,17 +184,17 @@ msgstr "Les fichiers de l'extension \"%s\" sont introuvables."
 msgid "Couldn't retrieve Updater class methods."
 msgstr "Impossible de récupérer les méthodes de la classe Updater."
 
 msgid "Couldn't retrieve Updater class methods."
 msgstr "Impossible de récupérer les méthodes de la classe Updater."
 
-#: application/Updater.php:506
+#: application/Updater.php:544
 msgid "An error occurred while running the update "
 msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour "
 
 msgid "An error occurred while running the update "
 msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour "
 
-#: application/Updater.php:546
+#: application/Updater.php:584
 msgid "Updates file path is not set, can't write updates."
 msgstr ""
 "Le chemin vers le fichier de mise à jour n'est pas défini, impossible "
 "d'écrire les mises à jour."
 
 msgid "Updates file path is not set, can't write updates."
 msgstr ""
 "Le chemin vers le fichier de mise à jour n'est pas défini, impossible "
 "d'écrire les mises à jour."
 
-#: application/Updater.php:551
+#: application/Updater.php:589
 msgid "Unable to write updates in "
 msgstr "Impossible d'écrire les mises à jour dans "
 
 msgid "Unable to write updates in "
 msgstr "Impossible d'écrire les mises à jour dans "
 
@@ -230,6 +234,7 @@ msgstr ""
 "Shaarli a les droits d'écriture dans le dossier dans lequel il est installé."
 
 #: application/config/ConfigManager.php:135
 "Shaarli a les droits d'écriture dans le dossier dans lequel il est installé."
 
 #: application/config/ConfigManager.php:135
+#: application/config/ConfigManager.php:162
 msgid "Invalid setting key parameter. String expected, got: "
 msgstr "Clé de paramétrage invalide. Chaîne de caractères obtenue, attendu : "
 
 msgid "Invalid setting key parameter. String expected, got: "
 msgstr "Clé de paramétrage invalide. Chaîne de caractères obtenue, attendu : "
 
@@ -251,135 +256,133 @@ msgstr "Vous n'êtes pas autorisé à modifier la configuration."
 msgid "Error accessing"
 msgstr "Une erreur s'est produite en accédant à"
 
 msgid "Error accessing"
 msgstr "Une erreur s'est produite en accédant à"
 
-#: index.php:142
+#: index.php:143
 msgid "Shared links on "
 msgstr "Liens partagés sur "
 
 msgid "Shared links on "
 msgstr "Liens partagés sur "
 
-#: index.php:164
+#: index.php:165
 msgid "Insufficient permissions:"
 msgstr "Permissions insuffisantes :"
 
 msgid "Insufficient permissions:"
 msgstr "Permissions insuffisantes :"
 
-#: index.php:303
+#: index.php:304
 msgid "I said: NO. You are banned for the moment. Go away."
 msgstr "NON. Vous êtes banni pour le moment. Revenez plus tard."
 
 msgid "I said: NO. You are banned for the moment. Go away."
 msgstr "NON. Vous êtes banni pour le moment. Revenez plus tard."
 
-#: index.php:368
+#: index.php:369
 msgid "Wrong login/password."
 msgstr "Nom d'utilisateur ou mot de passe incorrects."
 
 msgid "Wrong login/password."
 msgstr "Nom d'utilisateur ou mot de passe incorrects."
 
-#: index.php:576 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:42
+#: index.php:577 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46
 msgid "Daily"
 msgstr "Quotidien"
 
 msgid "Daily"
 msgstr "Quotidien"
 
-#: index.php:681 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
+#: index.php:682 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:71
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:95
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:71
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:95
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:75
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:99
 msgid "Login"
 msgstr "Connexion"
 
 msgid "Login"
 msgstr "Connexion"
 
-#: index.php:722 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:39
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:39
+#: index.php:750 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41
 msgid "Picture wall"
 msgstr "Mur d'images"
 
 msgid "Picture wall"
 msgstr "Mur d'images"
 
-#: index.php:770 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
+#: index.php:798 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36
 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
 msgid "Tag cloud"
 msgstr "Nuage de tags"
 
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36
 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
 msgid "Tag cloud"
 msgstr "Nuage de tags"
 
-#: index.php:803 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
+#: index.php:831 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
 msgid "Tag list"
 msgstr "Liste des tags"
 
 msgid "Tag list"
 msgstr "Liste des tags"
 
-#: index.php:1028 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
+#: index.php:1056 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31
 msgid "Tools"
 msgstr "Outils"
 
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31
 msgid "Tools"
 msgstr "Outils"
 
-#: index.php:1037
+#: index.php:1065
 msgid "You are not supposed to change a password on an Open Shaarli."
 msgstr ""
 "Vous n'êtes pas censé modifier le mot de passe d'un Shaarli en mode ouvert."
 
 msgid "You are not supposed to change a password on an Open Shaarli."
 msgstr ""
 "Vous n'êtes pas censé modifier le mot de passe d'un Shaarli en mode ouvert."
 
-#: index.php:1042 index.php:1084 index.php:1162 index.php:1193 index.php:1293
+#: index.php:1070 index.php:1112 index.php:1189 index.php:1220 index.php:1325
 msgid "Wrong token."
 msgstr "Jeton invalide."
 
 msgid "Wrong token."
 msgstr "Jeton invalide."
 
-#: index.php:1047
+#: index.php:1075
 msgid "The old password is not correct."
 msgstr "L'ancien mot de passe est incorrect."
 
 msgid "The old password is not correct."
 msgstr "L'ancien mot de passe est incorrect."
 
-#: index.php:1067
+#: index.php:1095
 msgid "Your password has been changed"
 msgstr "Votre mot de passe a été modifié"
 
 msgid "Your password has been changed"
 msgstr "Votre mot de passe a été modifié"
 
-#: index.php:1072
+#: index.php:1100
 #: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
 msgid "Change password"
 msgstr "Modification du mot de passe"
 
 #: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
 msgid "Change password"
 msgstr "Modification du mot de passe"
 
-#: index.php:1121
+#: index.php:1149
 msgid "Configuration was saved."
 msgstr "La configuration a été sauvegardé."
 
 msgid "Configuration was saved."
 msgstr "La configuration a été sauvegardé."
 
-#: index.php:1145 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
+#: index.php:1172 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
 msgid "Configure"
 msgstr "Configurer"
 
 msgid "Configure"
 msgstr "Configurer"
 
-#: index.php:1156 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
+#: index.php:1183 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 msgid "Manage tags"
 msgstr "Gérer les tags"
 
 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 msgid "Manage tags"
 msgstr "Gérer les tags"
 
-#: index.php:1174
+#: index.php:1201
 #, php-format
 msgid "The tag was removed from %d link."
 msgid_plural "The tag was removed from %d links."
 msgstr[0] "Le tag a été supprimé de %d lien."
 msgstr[1] "Le tag a été supprimé de %d liens."
 
 #, php-format
 msgid "The tag was removed from %d link."
 msgid_plural "The tag was removed from %d links."
 msgstr[0] "Le tag a été supprimé de %d lien."
 msgstr[1] "Le tag a été supprimé de %d liens."
 
-#: index.php:1175
+#: index.php:1202
 #, php-format
 msgid "The tag was renamed in %d link."
 msgid_plural "The tag was renamed in %d links."
 msgstr[0] "Le tag a été renommé dans %d lien."
 msgstr[1] "Le tag a été renommé dans %d liens."
 
 #, php-format
 msgid "The tag was renamed in %d link."
 msgid_plural "The tag was renamed in %d links."
 msgstr[0] "Le tag a été renommé dans %d lien."
 msgstr[1] "Le tag a été renommé dans %d liens."
 
-#: index.php:1183 tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
+#: index.php:1210 tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
 msgid "Shaare a new link"
 msgstr "Partager un nouveau lien"
 
 msgid "Shaare a new link"
 msgstr "Partager un nouveau lien"
 
-#: index.php:1353 tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:170
+#: index.php:1385 tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
 msgid "Edit"
 msgstr "Modifier"
 
 msgid "Edit"
 msgstr "Modifier"
 
-#: index.php:1353 index.php:1418
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
+#: index.php:1385 index.php:1455
 #: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26
 msgid "Shaare"
 msgstr "Shaare"
 
 #: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26
 msgid "Shaare"
 msgstr "Shaare"
 
-#: index.php:1387
+#: index.php:1424
 msgid "Note: "
 msgstr "Note : "
 
 msgid "Note: "
 msgstr "Note : "
 
-#: index.php:1427 tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65
+#: index.php:1464 tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65
 msgid "Export"
 msgstr "Exporter"
 
 msgid "Export"
 msgstr "Exporter"
 
-#: index.php:1489 tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
+#: index.php:1526 tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
 msgid "Import"
 msgstr "Importer"
 
 msgid "Import"
 msgstr "Importer"
 
-#: index.php:1499
+#: index.php:1536
 #, php-format
 msgid ""
 "The file you are trying to upload is probably bigger than what this "
 #, php-format
 msgid ""
 "The file you are trying to upload is probably bigger than what this "
@@ -389,16 +392,16 @@ msgstr ""
 "le serveur web peut accepter (%s). Merci de l'envoyer en parties plus "
 "légères."
 
 "le serveur web peut accepter (%s). Merci de l'envoyer en parties plus "
 "légères."
 
-#: index.php:1538 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
+#: index.php:1575 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
 msgid "Plugin administration"
 msgstr "Administration des extensions"
 
 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
 msgid "Plugin administration"
 msgstr "Administration des extensions"
 
-#: index.php:1703
+#: index.php:1759
 msgid "Search: "
 msgstr "Recherche : "
 
 msgid "Search: "
 msgstr "Recherche : "
 
-#: index.php:1930
+#: index.php:1798
 #, php-format
 msgid ""
 "<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
 #, php-format
 msgid ""
 "<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
@@ -417,7 +420,7 @@ msgstr ""
 "cookies. Nous vous recommandons d'accéder à votre serveur depuis son adresse "
 "IP ou un <em>Fully Qualified Domain Name</em>.<br>"
 
 "cookies. Nous vous recommandons d'accéder à votre serveur depuis son adresse "
 "IP ou un <em>Fully Qualified Domain Name</em>.<br>"
 
-#: index.php:1940
+#: index.php:1808
 msgid "Click to try again."
 msgstr "Cliquer ici pour réessayer."
 
 msgid "Click to try again."
 msgstr "Cliquer ici pour réessayer."
 
@@ -577,11 +580,11 @@ msgstr "URL de l'API Wallabag"
 msgid "Wallabag API version (1 or 2)"
 msgstr "Version de l'API Wallabag (1 ou 2)"
 
 msgid "Wallabag API version (1 or 2)"
 msgstr "Version de l'API Wallabag (1 ou 2)"
 
-#: tests/LanguagesTest.php:188 tests/LanguagesTest.php:201
+#: tests/LanguagesTest.php:214 tests/LanguagesTest.php:227
 #: tests/languages/fr/LanguagesFrTest.php:160
 #: tests/languages/fr/LanguagesFrTest.php:173
 #: tests/languages/fr/LanguagesFrTest.php:160
 #: tests/languages/fr/LanguagesFrTest.php:173
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:81
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:81
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:85
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:85
 msgid "Search"
 msgid_plural "Search"
 msgstr[0] "Rechercher"
 msgid "Search"
 msgid_plural "Search"
 msgstr[0] "Rechercher"
@@ -625,8 +628,8 @@ msgid "Rename"
 msgstr "Renommer"
 
 #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
 msgstr "Renommer"
 
 #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:172
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171
 msgid "Delete"
 msgstr "Supprimer"
 
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -736,8 +739,29 @@ msgstr ""
 msgid "API secret"
 msgstr "Clé d'API secrète"
 
 msgid "API secret"
 msgstr "Clé d'API secrète"
 
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:274
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
+#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:277
+msgid "Enable thumbnails"
+msgstr "Activer les miniatures"
+
+#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:279
+msgid "Warning: "
+msgstr "Attention : "
+
+#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281
+msgid "It's recommended to visit the picture wall after enabling this feature."
+msgstr ""
+"Il est recommandé de visiter le Mur d'images après avoir activé cette "
+"fonctionnalité."
+
+#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:283
+msgid ""
+"If you have a large database, the first retrieval may take a few minutes."
+msgstr ""
+"Si vous avez beaucoup de liens, la première récupération peut prendre "
+"plusieurs minutes."
+
+#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:297
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
 msgid "Save"
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
 msgid "Save"
@@ -763,25 +787,27 @@ msgstr "Tous les liens d'un jour sur une page."
 msgid "Next day"
 msgstr "Jour suivant"
 
 msgid "Next day"
 msgstr "Jour suivant"
 
-#: tpl/editlink.html
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
 msgid "Edit Shaare"
 msgstr "Modifier le Shaare"
 msgid "Edit Shaare"
 msgstr "Modifier le Shaare"
+
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
 msgid "New Shaare"
 msgstr "Nouveau Shaare"
 
 msgid "New Shaare"
 msgstr "Nouveau Shaare"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
 msgid "Created:"
 msgstr "Création :"
 
 msgid "Created:"
 msgstr "Création :"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
 msgid "URL"
 msgstr "URL"
 
 msgid "URL"
 msgstr "URL"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:32
 msgid "Title"
 msgstr "Titre"
 
 msgid "Title"
 msgstr "Titre"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:38
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75
 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99
@@ -789,17 +815,17 @@ msgstr "Titre"
 msgid "Description"
 msgstr "Description"
 
 msgid "Description"
 msgstr "Description"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
 msgid "Tags"
 msgstr "Tags"
 
 msgid "Tags"
 msgstr "Tags"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:59
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57
 #: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 #: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:168
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:167
 msgid "Private"
 msgstr "Privé"
 
 msgid "Private"
 msgstr "Privé"
 
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
 msgid "Apply Changes"
 msgstr "Appliquer"
 
 msgid "Apply Changes"
 msgstr "Appliquer"
 
@@ -876,15 +902,15 @@ msgstr ""
 
 #: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
 
 #: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:147
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:147
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:151
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151
 msgid "Username"
 msgstr "Nom d'utilisateur"
 
 #: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
 msgid "Username"
 msgstr "Nom d'utilisateur"
 
 #: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:148
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:148
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152
 msgid "Password"
 msgstr "Mot de passe"
 
 msgid "Password"
 msgstr "Mot de passe"
 
@@ -901,28 +927,28 @@ msgid "Install"
 msgstr "Installer"
 
 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
 msgstr "Installer"
 
 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:80
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79
 msgid "shaare"
 msgid_plural "shaares"
 msgstr[0] "shaare"
 msgstr[1] "shaares"
 
 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:18
 msgid "shaare"
 msgid_plural "shaares"
 msgstr[0] "shaare"
 msgstr[1] "shaares"
 
 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:18
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:84
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
 msgid "private link"
 msgid_plural "private links"
 msgstr[0] "lien privé"
 msgstr[1] "liens privés"
 
 msgid "private link"
 msgid_plural "private links"
 msgstr[0] "lien privé"
 msgstr[1] "liens privés"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:117
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:121
 msgid "Search text"
 msgstr "Recherche texte"
 
 msgid "Search text"
 msgstr "Recherche texte"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:38
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:124
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:124
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:37
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:128
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:128
 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64
 #: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64
 #: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
@@ -930,52 +956,52 @@ msgstr "Recherche texte"
 msgid "Filter by tag"
 msgstr "Filtrer par tag"
 
 msgid "Filter by tag"
 msgstr "Filtrer par tag"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:111
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:110
 msgid "Nothing found."
 msgstr "Aucun résultat."
 
 msgid "Nothing found."
 msgstr "Aucun résultat."
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:119
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:118
 #, php-format
 msgid "%s result"
 msgid_plural "%s results"
 msgstr[0] "%s résultat"
 msgstr[1] "%s résultats"
 
 #, php-format
 msgid "%s result"
 msgid_plural "%s results"
 msgstr[0] "%s résultat"
 msgstr[1] "%s résultats"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:123
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:122
 msgid "for"
 msgstr "pour"
 
 msgid "for"
 msgstr "pour"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:130
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:129
 msgid "tagged"
 msgstr "taggé"
 
 msgid "tagged"
 msgstr "taggé"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:134
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:133
 msgid "Remove tag"
 msgstr "Retirer le tag"
 
 msgid "Remove tag"
 msgstr "Retirer le tag"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:143
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:142
 msgid "with status"
 msgstr "avec le statut"
 
 msgid "with status"
 msgstr "avec le statut"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:154
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:153
 msgid "without any tag"
 msgstr "sans tag"
 
 msgid "without any tag"
 msgstr "sans tag"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:174
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
 #: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42
 msgid "Fold"
 msgstr "Replier"
 
 #: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42
 msgid "Fold"
 msgstr "Replier"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:176
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:175
 msgid "Edited: "
 msgstr "Modifié : "
 
 msgid "Edited: "
 msgstr "Modifié : "
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:180
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:179
 msgid "permalink"
 msgstr "permalien"
 
 msgid "permalink"
 msgstr "permalien"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:182
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:181
 msgid "Add tag"
 msgstr "Ajouter un tag"
 
 msgid "Add tag"
 msgstr "Ajouter un tag"
 
@@ -1021,8 +1047,8 @@ msgstr ""
 "réessayer plus tard."
 
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
 "réessayer plus tard."
 
 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:151
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:155
 msgid "Remember me"
 msgstr "Rester connecté"
 
 msgid "Remember me"
 msgstr "Rester connecté"
 
@@ -1053,35 +1079,40 @@ msgstr "Déplier tout"
 msgid "Are you sure you want to delete this link?"
 msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?"
 
 msgid "Are you sure you want to delete this link?"
 msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?"
 
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:61
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:61
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:86
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:90
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:65
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:90
 msgid "RSS Feed"
 msgstr "Flux RSS"
 
 msgid "RSS Feed"
 msgstr "Flux RSS"
 
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:66
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:66
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:102
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:70
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:106
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:70
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:106
 msgid "Logout"
 msgstr "Déconnexion"
 
 msgid "Logout"
 msgstr "Déconnexion"
 
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:169
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:173
 msgid "is available"
 msgstr "est disponible"
 
 msgid "is available"
 msgstr "est disponible"
 
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:176
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:176
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:180
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:180
 msgid "Error"
 msgstr "Erreur"
 
 msgid "Error"
 msgstr "Erreur"
 
-#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
+#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
+msgid "Picture wall unavailable (thumbnails are disabled)."
+msgstr ""
+"Le mur d'images n'est pas disponible (les miniatures sont désactivées)."
+
+#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
 msgid "Picture Wall"
 msgstr "Mur d'images"
 
 msgid "Picture Wall"
 msgstr "Mur d'images"
 
-#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
+#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
 msgid "pics"
 msgstr "images"
 
 msgid "pics"
 msgstr "images"
 
index 8a19f07053dc26b6c817bc838f17bb69add0d9d0..263529fdd7ad96a3ce5ea8bb4b42a1077c67e2c1 100644 (file)
@@ -3,7 +3,10 @@
     "default": {
       "_comment": "infinite cache",
       "cache_duration": -1,
     "default": {
       "_comment": "infinite cache",
       "cache_duration": -1,
-      "timeout": 60
+      "timeout": 10
+    },
+    "path": {
+      "cache": "cache/"
     }
   }
 }
\ No newline at end of file
     }
   }
 }
\ No newline at end of file
index 28dfd3b473dbd3f7b39d61295a0ec055681afacd..899edd67a282bdcd89e5b0620112df3caf2fad9c 100644 (file)
--- a/index.php
+++ b/index.php
@@ -74,13 +74,13 @@ require_once 'application/Url.php';
 require_once 'application/Utils.php';
 require_once 'application/PluginManager.php';
 require_once 'application/Router.php';
 require_once 'application/Utils.php';
 require_once 'application/PluginManager.php';
 require_once 'application/Router.php';
-require_once 'application/Thumbnailer.php';
 require_once 'application/Updater.php';
 require_once 'application/Updater.php';
-use \Shaarli\Languages;
-use \Shaarli\ThemeUtils;
 use \Shaarli\Config\ConfigManager;
 use \Shaarli\Config\ConfigManager;
+use \Shaarli\Languages;
 use \Shaarli\Security\LoginManager;
 use \Shaarli\Security\SessionManager;
 use \Shaarli\Security\LoginManager;
 use \Shaarli\Security\SessionManager;
+use \Shaarli\ThemeUtils;
+use \Shaarli\Thumbnailer;
 
 // Ensure the PHP version is supported
 try {
 
 // Ensure the PHP version is supported
 try {
@@ -603,7 +603,7 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
     if ($targetPage == Router::$PAGE_PICWALL)
     {
         if (! $conf->get('thumbnails.enabled')) {
     if ($targetPage == Router::$PAGE_PICWALL)
     {
         if (! $conf->get('thumbnails.enabled')) {
-            header('Location: ?');
+            $PAGE->renderPage('picwall');
             exit;
         }
 
             exit;
         }
 
@@ -614,23 +614,19 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
         $thumbnailer = new Thumbnailer($conf);
 
 
         $thumbnailer = new Thumbnailer($conf);
 
 
-        $cpt = 0;
+        $newThumbnailsCpt = 0;
         // Get only links which have a thumbnail.
         // Get only links which have a thumbnail.
-        foreach($links as $link)
+        foreach($links as $key => $link)
         {
         {
-            $permalink='?'.$link['shorturl'];
             // Not a note,
             // and (never retrieved yet or no valid cache file)
             if ($link['url'][0] != '?'
                 && (! isset($link['thumbnail']) || ($link['thumbnail'] !== false && ! is_file($link['thumbnail'])))
             ) {
             // Not a note,
             // and (never retrieved yet or no valid cache file)
             if ($link['url'][0] != '?'
                 && (! isset($link['thumbnail']) || ($link['thumbnail'] !== false && ! is_file($link['thumbnail'])))
             ) {
-                $link['thumbnail'] = $thumbnailer->get($link['url']);
-                // FIXME! we really need to get rid of ArrayAccess...
-                $item = $LINKSDB[$link['linkdate']];
-                $item['thumbnail'] = $link['thumbnail'];
-                $LINKSDB[$link['linkdate']] = $item;
-                $updateDB = true;
-                $cpt++;
+                $item = $LINKSDB[$key];
+                $item['thumbnail'] = $thumbnailer->get($link['url']);
+                $LINKSDB[$key] = $item;
+                $newThumbnailsCpt++;
             }
 
             if (isset($link['thumbnail']) && $link['thumbnail'] !== false) {
             }
 
             if (isset($link['thumbnail']) && $link['thumbnail'] !== false) {
@@ -639,14 +635,13 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
 
             // If we retrieved new thumbnails, we update the database every 20 links.
             // Downloading everything the first time may take a very long time
 
             // If we retrieved new thumbnails, we update the database every 20 links.
             // Downloading everything the first time may take a very long time
-            if (!empty($updateDB) && $cpt == 20) {
+            if ($newThumbnailsCpt == 20) {
                 $LINKSDB->save($conf->get('resource.page_cache'));
                 $LINKSDB->save($conf->get('resource.page_cache'));
-                $updateDB = false;
-                $cpt = 0;
+                $newThumbnailsCpt = 0;
             }
         }
 
             }
         }
 
-        if (!empty($updateDB)) {
+        if ($newThumbnailsCpt > 0) {
             $LINKSDB->save($conf->get('resource.page_cache'));
         }
 
             $LINKSDB->save($conf->get('resource.page_cache'));
         }
 
@@ -1619,11 +1614,9 @@ function buildLinkList($PAGE, $LINKSDB, $conf, $pluginManager, $loginManager)
         if ($conf->get('thumbnails.enabled') && $link['url'][0] != '?'
             && (! isset($link['thumbnail']) || ($link['thumbnail'] !== false && ! is_file($link['thumbnail'])))
         ) {
         if ($conf->get('thumbnails.enabled') && $link['url'][0] != '?'
             && (! isset($link['thumbnail']) || ($link['thumbnail'] !== false && ! is_file($link['thumbnail'])))
         ) {
-            $link['thumbnail'] = $thumbnailer->get($link['url']);
-            // FIXME! we really need to get rid of ArrayAccess...
-            $item = $LINKSDB[$keys[$i]];
-            $item['thumbnail'] = $link['thumbnail'];
-            $LINKSDB[$keys[$i]] = $item;
+            $elem = $LINKSDB[$keys[$i]];
+            $elem['thumbnail'] = $thumbnailer->get($link['url']);
+            $LINKSDB[$keys[$i]] = $elem;
             $updateDB = true;
         }
 
             $updateDB = true;
         }
 
index db10932114a6f9f078ed99407a2b8273f3dee047..c04b8fb56021c5d18aa34528a24a60e15db51ea9 100644 (file)
@@ -1,7 +1,10 @@
 <?php
 
 <?php
 
-require_once 'application/Thumbnailer.php';
-require_once 'application/config/ConfigManager.php';
+namespace Shaarli;
+
+use PHPUnit\Framework\TestCase;
+use Shaarli\Config\ConfigManager;
+use WebThumbnailer\Application\ConfigManager as WTConfigManager;
 
 /**
  * Class ThumbnailerTest
 
 /**
  * Class ThumbnailerTest
@@ -11,31 +14,48 @@ require_once 'application/config/ConfigManager.php';
  *   1. the thumbnailer library is itself tested
  *   2. we don't want to make too many external requests during the tests
  */
  *   1. the thumbnailer library is itself tested
  *   2. we don't want to make too many external requests during the tests
  */
-class ThumbnailerTest extends PHPUnit_Framework_TestCase
+class ThumbnailerTest extends TestCase
 {
 {
+    const WIDTH = 190;
+
+    const HEIGHT = 210;
+
     /**
     /**
-     * Test a thumbnail with a custom size.
+     * @var Thumbnailer;
      */
      */
-    public function testThumbnailValid()
+    protected $thumbnailer;
+
+    public function setUp()
     {
         $conf = new ConfigManager('tests/utils/config/configJson');
     {
         $conf = new ConfigManager('tests/utils/config/configJson');
-        $width = 200;
-        $height = 200;
-        $conf->set('thumbnails.width', $width);
-        $conf->set('thumbnails.height', $height);
+        $conf->set('thumbnails.width', self::WIDTH);
+        $conf->set('thumbnails.height', self::HEIGHT);
+        $conf->set('dev.debug', true);
+
+        $this->thumbnailer = new Thumbnailer($conf);
+        // cache files in the sandbox
+        WTConfigManager::addFile('tests/utils/config/wt.json');
+    }
+
+    public function tearDown()
+    {
+        $this->rrmdirContent('sandbox/');
+    }
 
 
-        $thumbnailer = new Thumbnailer($conf);
-        $thumb = $thumbnailer->get('https://github.com/shaarli/Shaarli/');
+    /**
+     * Test a thumbnail with a custom size.
+     */
+    public function testThumbnailValid()
+    {
+        $thumb = $this->thumbnailer->get('https://github.com/shaarli/Shaarli/');
         $this->assertNotFalse($thumb);
         $image = imagecreatefromstring(file_get_contents($thumb));
         $this->assertNotFalse($thumb);
         $image = imagecreatefromstring(file_get_contents($thumb));
-        $this->assertEquals($width, imagesx($image));
-        $this->assertEquals($height, imagesy($image));
+        $this->assertEquals(self::WIDTH, imagesx($image));
+        $this->assertEquals(self::HEIGHT, imagesy($image));
     }
 
     /**
      * Test a thumbnail that can't be retrieved.
     }
 
     /**
      * Test a thumbnail that can't be retrieved.
-     *
-     * @expectedException WebThumbnailer\Exception\ThumbnailNotFoundException
      */
     public function testThumbnailNotValid()
     {
      */
     public function testThumbnailNotValid()
     {
@@ -48,4 +68,18 @@ class ThumbnailerTest extends PHPUnit_Framework_TestCase
 
         ini_set('error_log', $oldlog);
     }
 
         ini_set('error_log', $oldlog);
     }
+
+    protected function rrmdirContent($dir) {
+        if (is_dir($dir)) {
+            $objects = scandir($dir);
+            foreach ($objects as $object) {
+                if ($object != "." && $object != "..") {
+                    if (is_dir($dir."/".$object))
+                        $this->rrmdirContent($dir."/".$object);
+                    else
+                        unlink($dir."/".$object);
+                }
+            }
+        }
+    }
 }
 }
index 94e3c7d307c4bb46f1e45d8cf523852ee3b7ba88..8b90fd5e1032aab84988aca65decc0f3a9721acc 100644 (file)
@@ -684,4 +684,19 @@ $GLOBALS[\'privateLinkByDefault\'] = true;';
         $this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
         $this->assertEquals(3, $this->conf->get('general.download_timeout'));
     }
         $this->assertEquals(4194304, $this->conf->get('general.download_max_size'));
         $this->assertEquals(3, $this->conf->get('general.download_timeout'));
     }
+
+    /**
+     * Test updateMethodAtomDefault with show_atom set to true.
+     * => nothing to do
+     */
+    public function testUpdateMethodWebThumbnailerEnabled()
+    {
+        $this->conf->set('thumbnail.enable_thumbnails', true);
+        $updater = new Updater([], [], $this->conf, true);
+        $this->assertTrue($updater->updateMethodWebThumbnailer());
+        $this->assertFalse($this->conf->exists('thumbnail'));
+        $this->assertTrue($this->conf->get('thumbnails.enabled'));
+        $this->assertEquals(125, $this->conf->get('thumbnails.width'));
+        $this->assertEquals(90, $this->conf->get('thumbnails.height'));
+    }
 }
 }
index 3101b22599880e0278e1a5dd08df24f22ed1f6a9..061d4c283119605db6450cbbc6bd49a66b3d6737 100644 (file)
@@ -1,38 +1,84 @@
 <?php /*
 {
     "credentials": {
 <?php /*
 {
     "credentials": {
-        "login":"root",
-        "hash":"hash",
-        "salt":"salt"
+        "login": "root",
+        "hash": "hash",
+        "salt": "salt"
     },
     "security": {
     },
     "security": {
-        "session_protection_disabled":false
+        "session_protection_disabled": false,
+        "ban_after": 4,
+        "ban_duration": 1800,
+        "open_shaarli": false,
+        "allowed_protocols": [
+            "ftp",
+            "ftps",
+            "magnet"
+        ]
     },
     "general": {
     },
     "general": {
-        "timezone":"Europe\/Paris",
+        "timezone": "Europe\/Paris",
         "title": "Shaarli",
         "title": "Shaarli",
-        "header_link": "?"
+        "header_link": "?",
+        "links_per_page": 20,
+        "enabled_plugins": [
+            "qrcode"
+        ],
+        "default_note_title": "Note: "
     },
     "privacy": {
     },
     "privacy": {
-        "default_private_links":true
+        "default_private_links": true,
+        "hide_public_links": false,
+        "force_login": false,
+        "hide_timestamps": false,
+        "remember_user_default": true
     },
     "redirector": {
     },
     "redirector": {
-        "url":"lala"
+        "url": "lala",
+        "encode_url": true
     },
     "config": {
         "foo": "bar"
     },
     "resource": {
         "datastore": "tests\/utils\/config\/datastore.php",
     },
     "config": {
         "foo": "bar"
     },
     "resource": {
         "datastore": "tests\/utils\/config\/datastore.php",
-        "data_dir": "sandbox/",
-        "raintpl_tpl": "tpl/"
+        "data_dir": "sandbox\/",
+        "raintpl_tpl": "tpl\/",
+        "config": "data\/config.php",
+        "ban_file": "data\/ipbans.php",
+        "updates": "data\/updates.txt",
+        "log": "data\/log.txt",
+        "update_check": "data\/lastupdatecheck.txt",
+        "history": "data\/history.php",
+        "theme": "default",
+        "raintpl_tmp": "tmp\/",
+        "thumbnails_cache": "cache",
+        "page_cache": "pagecache"
     },
     "plugins": {
         "WALLABAG_VERSION": 1
     },
     "dev": {
         "debug": true
     },
     "plugins": {
         "WALLABAG_VERSION": 1
     },
     "dev": {
         "debug": true
+    },
+    "thumbnails": {
+        "enabled": true,
+        "width": 125,
+        "height": 90
+    },
+    "updates": {
+        "check_updates": false,
+        "check_updates_branch": "stable",
+        "check_updates_interval": 86400
+    },
+    "feed": {
+        "rss_permalinks": true,
+        "show_atom": true
+    },
+    "translation": {
+        "language": "auto",
+        "mode": "php",
+        "extensions": []
     }
 }
     }
 }
-*/ ?>
-
+*/ ?>
\ No newline at end of file
diff --git a/tests/utils/config/wt.json b/tests/utils/config/wt.json
new file mode 100644 (file)
index 0000000..69ce49a
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "settings": {
+    "default": {
+      "_comment": "infinite cache",
+      "cache_duration": -1,
+      "timeout": 10
+    },
+    "path": {
+      "cache": "sandbox/"
+    }
+  }
+}
\ No newline at end of file
index a63c7ad33a6d8402423aebe90d51b5357c11de17..b91fc07ed07a0f8faa05cb0a77f969fe0d77686d 100644 (file)
           </div>
         </div>
       </div>
           </div>
         </div>
       </div>
+      <div class="pure-g">
+        <div class="pure-u-lg-{$ratioLabel} pure-u-{$ratioLabelMobile}">
+          <div class="form-label">
+            <label for="enableThumbnails">
+              <span class="label-name">{'Enable thumbnails'|t}</span><br>
+              <span class="label-desc">
+                {'Warning: '|t}
+                {'It\'s recommended to visit the picture wall after enabling this feature.'|t}
+                {'If you have a large database, the first retrieval may take a few minutes.'|t}
+              </span>
+            </label>
+          </div>
+        </div>
+        <div class="pure-u-lg-{$ratioInput} pure-u-{$ratioInputMobile}">
+          <div class="form-input">
+            <input type="checkbox" name="enableThumbnails" id="enableThumbnails"
+                   {if="$thumbnails_enabled"}checked{/if}/>
+          </div>
+        </div>
+      </div>
       <div class="center">
         <input type="submit" value="{'Save'|t}" name="save">
       </div>
       <div class="center">
         <input type="submit" value="{'Save'|t}" name="save">
       </div>
index 322cddd5341ec417cbfc9597bf199a629b7d6f9b..bf88e161b778c6181f219fb07d74048ce216669e 100644 (file)
 
         <div class="linklist-item linklist-item{if="$value.class"} {$value.class}{/if}" data-id="{$value.id}">
           <div class="linklist-item-title">
 
         <div class="linklist-item linklist-item{if="$value.class"} {$value.class}{/if}" data-id="{$value.id}">
           <div class="linklist-item-title">
-            {$thumb=thumbnail($value.url)}
-            {if="$thumb!=false"}
-              <div class="linklist-item-thumbnail">{$thumb}</div>
+            {if="$thumbnails_enabled && !empty($value.thumbnail)"}
+              <div class="linklist-item-thumbnail">
+                <div class="thumbnail">
+                  <a href="{$value.real_url}">
+                  {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
+                  <img data-src="{$value.thumbnail}#" class="b-lazy"
+                    src="#"
+                    alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
+                  </a>
+                </div>
+              </div>
             {/if}
 
             {if="$is_logged_in"}
             {/if}
 
             {if="$is_logged_in"}
 </div>
 
 {include="page.footer"}
 </div>
 
 {include="page.footer"}
+<script src="js/thumbnails.min.js?v={$version_hash}"></script>
 </body>
 </html>
 </body>
 </html>
index 82568d635ca0db797b2daf609b7d1852d1142bf0..840e4352c4353e8e1568a0ea0fade2d5b991e3c9 100644 (file)
         <li class="pure-menu-item" id="shaarli-menu-tags">
           <a href="?do=tagcloud" class="pure-menu-link">{'Tag cloud'|t}</a>
         </li>
         <li class="pure-menu-item" id="shaarli-menu-tags">
           <a href="?do=tagcloud" class="pure-menu-link">{'Tag cloud'|t}</a>
         </li>
-        <li class="pure-menu-item" id="shaarli-menu-picwall">
-          <a href="?do=picwall{$searchcrits}" class="pure-menu-link">{'Picture wall'|t}</a>
-        </li>
+        {if="$thumbnails_enabled"}
+          <li class="pure-menu-item" id="shaarli-menu-picwall">
+            <a href="?do=picwall{$searchcrits}" class="pure-menu-link">{'Picture wall'|t}</a>
+          </li>
+        {/if}
         <li class="pure-menu-item" id="shaarli-menu-daily">
           <a href="?do=daily" class="pure-menu-link">{'Daily'|t}</a>
         </li>
         <li class="pure-menu-item" id="shaarli-menu-daily">
           <a href="?do=daily" class="pure-menu-link">{'Daily'|t}</a>
         </li>
index 2f7e03dc3bc0b127e254acb7f3acb82f86d9d986..1ea9c20a6282d5c89f5d923b822903be17c0ba4a 100644 (file)
@@ -5,41 +5,53 @@
 </head>
 <body>
 {include="page.header"}
 </head>
 <body>
 {include="page.header"}
+{if="!$thumbnails_enabled"}
+<div class="pure-g pure-alert pure-alert-warning page-single-alert">
+  <div class="pure-u-1 center">
+    {'Picture wall unavailable (thumbnails are disabled).'|t}
+  </div>
+</div>
+{else}
+  <div class="pure-g">
+    <div class="pure-u-lg-1-6 pure-u-1-24"></div>
+    <div class="pure-u-lg-2-3 pure-u-22-24 page-form page-visitor">
+      {$countPics=count($linksToDisplay)}
+      <h2 class="window-title">{'Picture Wall'|t} - {$countPics} {'pics'|t}</h2>
 
 
-<div class="pure-g">
-  <div class="pure-u-lg-1-6 pure-u-1-24"></div>
-  <div class="pure-u-lg-2-3 pure-u-22-24 page-form page-visitor">
-    {$countPics=count($linksToDisplay)}
-    <h2 class="window-title">{'Picture Wall'|t} - {$countPics} {'pics'|t}</h2>
-
-    <div id="plugin_zone_start_picwall" class="plugin_zone">
-      {loop="$plugin_start_zone"}
-        {$value}
-      {/loop}
-    </div>
+      <div id="plugin_zone_start_picwall" class="plugin_zone">
+        {loop="$plugin_start_zone"}
+          {$value}
+        {/loop}
+      </div>
 
 
-    <div id="picwall_container" class="picwall-container">
-      {loop="$linksToDisplay"}
-        <div class="picwall-pictureframe">
-          {$value.thumbnail}<a href="{$value.real_url}"><span class="info">{$value.title}</span></a>
-          {loop="$value.picwall_plugin"}
-            {$value}
-          {/loop}
-        </div>
-      {/loop}
-      <div class="clear"></div>
-    </div>
+      <div id="picwall_container" class="picwall-container">
+        {loop="$linksToDisplay"}
+          <div class="picwall_pictureframe">
+            {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
+            <img data-src="{$value.thumbnail}#" class="b-lazy"
+                 src="#"
+                 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
+            <a href="{$value.real_url}"><span class="info">{$value.title}</span></a>
+            {loop="$value.picwall_plugin"}
+              {$value}
+            {/loop}
+          </div>
+        {/loop}
+        <div class="clear"></div>
+      </div>
 
 
-    <div id="plugin_zone_end_picwall" class="plugin_zone">
-      {loop="$plugin_end_zone"}
-        {$value}
-      {/loop}
+      <div id="plugin_zone_end_picwall" class="plugin_zone">
+        {loop="$plugin_end_zone"}
+          {$value}
+        {/loop}
+      </div>
     </div>
     </div>
+    <div class="pure-u-lg-1-6 pure-u-1-24"></div>
   </div>
   </div>
-</div>
+{/if}
 
 {include="page.footer"}
 
 {include="page.footer"}
-<script src="js/picwall.min.js?v={$version_hash}"></script>
+<script src="js/thumbnails.min.js?v={$version_hash}"></script>
 </body>
 </html>
 
 </body>
 </html>
 
index 9bdafa8cd249ba162f27ed5ce5d316ce50a08878..3f202849db3313b91f26b32ef2d5deec3b019656 100644 (file)
 </div>
 
     {include="page.footer"}
 </div>
 
     {include="page.footer"}
+<script src="js/thumbnails.min.js"></script>
 
 </body>
 </html>
 
 </body>
 </html>
index 2ac11ec20ca57a0a1fe11fe9b7adb5ff6c2a6c2c..5f1d266ee1f15ddc7bc4f00403e968511d033b7d 100644 (file)
@@ -38,6 +38,6 @@
 
 {include="page.footer"}
 
 
 {include="page.footer"}
 
-<script src="js/picwall.min.js"></script>
+<script src="js/thumbnails.min.js"></script>
 </body>
 </html>
 </body>
 </html>
index 94b7aa701b270a57f068a05800bac9d6e9964773..1fc5d01679efd433fd249c1bc0bdfecb0621d265 100644 (file)
@@ -23,7 +23,7 @@ const extractCssVintage = new ExtractTextPlugin({
 module.exports = [
   {
     entry: {
 module.exports = [
   {
     entry: {
-      picwall: './assets/common/js/picwall.js',
+      thumbnails: './assets/common/js/thumbnails.js',
       pluginsadmin: './assets/default/js/plugins-admin.js',
       shaarli: [
         './assets/default/js/base.js',
       pluginsadmin: './assets/default/js/plugins-admin.js',
       shaarli: [
         './assets/default/js/base.js',
@@ -96,7 +96,7 @@ module.exports = [
         './assets/vintage/css/reset.css',
         './assets/vintage/css/shaarli.css',
       ].concat(glob.sync('./assets/vintage/img/*')),
         './assets/vintage/css/reset.css',
         './assets/vintage/css/shaarli.css',
       ].concat(glob.sync('./assets/vintage/img/*')),
-      picwall: './assets/common/js/picwall.js',
+      thumbnails: './assets/common/js/thumbnails.js',
     },
     output: {
       filename: '[name].min.js',
     },
     output: {
       filename: '[name].min.js',