From: ArthurHoaro Date: Sat, 6 Oct 2018 11:30:29 +0000 (+0200) Subject: Merge pull request #1208 from ArthurHoaro/feature/select-all X-Git-Tag: v0.10.3~2^2~12 X-Git-Url: https://git.immae.eu/?p=github%2Fshaarli%2FShaarli.git;a=commitdiff_plain;h=a062416918c964e7551137c08b5b5671e6e2bb7e;hp=fc574e64544db2f7b56443a827e17d58c7561804 Merge pull request #1208 from ArthurHoaro/feature/select-all Add a button to toggle all checkboxes of displayed links --- diff --git a/application/LinkDB.php b/application/LinkDB.php index cd0f2967..cdd68cfb 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php @@ -537,6 +537,9 @@ You use the community supported version of the original Shaarli project, by Seba $order = $order === 'ASC' ? -1 : 1; // Reorder array by dates. usort($this->links, function($a, $b) use ($order) { + if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) { + return $a['sticky'] ? -1 : 1; + } return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; }); diff --git a/application/Router.php b/application/Router.php index bf86b884..beb3165b 100644 --- a/application/Router.php +++ b/application/Router.php @@ -37,6 +37,8 @@ class Router public static $PAGE_DELETELINK = 'delete_link'; + public static $PAGE_PINLINK = 'pin'; + public static $PAGE_EXPORT = 'export'; public static $PAGE_IMPORT = 'import'; @@ -146,6 +148,10 @@ class Router return self::$PAGE_DELETELINK; } + if (startsWith($query, 'do='. self::$PAGE_PINLINK)) { + return self::$PAGE_PINLINK; + } + if (startsWith($query, 'do='. self::$PAGE_EXPORT)) { return self::$PAGE_EXPORT; } diff --git a/application/Updater.php b/application/Updater.php index 480bff82..5dde47cb 100644 --- a/application/Updater.php +++ b/application/Updater.php @@ -517,6 +517,26 @@ class Updater return true; } + + /** + * Set sticky = false on all links + * + * @return bool true if the update is successful, false otherwise. + */ + public function updateMethodSetSticky() + { + foreach ($this->linkDB as $key => $link) { + if (isset($link['sticky'])) { + return true; + } + $link['sticky'] = false; + $this->linkDB[$key] = $link; + } + + $this->linkDB->save($this->conf->get('resource.page_cache')); + + return true; + } } /** diff --git a/assets/default/js/base.js b/assets/default/js/base.js index 951e3f4d..99e03370 100644 --- a/assets/default/js/base.js +++ b/assets/default/js/base.js @@ -567,7 +567,7 @@ function init(description) { event.preventDefault(); const block = findParent(event.target, 'div', { class: 'tag-list-item' }); const tag = block.getAttribute('data-tag'); - const refreshedToken = document.getElementById('token'); + const refreshedToken = document.getElementById('token').value; if (confirm(`Are you sure you want to delete the tag "${tag}"?`)) { const xhr = new XMLHttpRequest(); diff --git a/assets/default/scss/shaarli.scss b/assets/default/scss/shaarli.scss index 7e7302fa..760d8d6a 100644 --- a/assets/default/scss/shaarli.scss +++ b/assets/default/scss/shaarli.scss @@ -755,6 +755,14 @@ body, font-size: 1.3em; } +.pin-link { + font-size: 1.3em; +} + +.pinned-link { + color: $blue !important; +} + .linklist-item-description { position: relative; padding: 0 10px; @@ -848,6 +856,10 @@ body, margin: 0 7px; } +.ctrl-delete { + margin: 0 7px 0 0; +} + // 64em -> lg @media screen and (max-width: 64em) { .linklist-item-infos-url { diff --git a/doc/custom_theme/main.html b/doc/custom_theme/main.html new file mode 100644 index 00000000..69b398f6 --- /dev/null +++ b/doc/custom_theme/main.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{# +The entry point for the ReadTheDocs Theme. + +Any theme customisations should override this file to redefine blocks defined in +the various templates. The custom theme should only need to define a main.html +which `{% extends "base.html" %}` and defines various blocks which will replace +the blocks defined in base.html and its included child templates. +#} + +{%- block site_meta %} + + + + +{%- if 'media.readthedocs.org' not in config.extra_css[0] %} + +{%- endif %} + +{% if page and page.is_homepage %}{% endif %} +{% if config.site_author %}{% endif %} +{% if config.site_favicon %} +{% else %}{% endif %} +{%- endblock %} diff --git a/doc/md/Server-configuration.md b/doc/md/Server-configuration.md index e281dc85..cf44ecf5 100644 --- a/doc/md/Server-configuration.md +++ b/doc/md/Server-configuration.md @@ -397,6 +397,7 @@ http { ``` ## Proxies + If Shaarli is served behind a proxy (i.e. there is a proxy server between clients and the web server hosting Shaarli), please refer to the proxy server documentation for proper configuration. In particular, you have to ensure that the following server variables are properly set: - `X-Forwarded-Proto` @@ -405,6 +406,12 @@ If Shaarli is served behind a proxy (i.e. there is a proxy server between client See also [proxy-related](https://github.com/shaarli/Shaarli/issues?utf8=%E2%9C%93&q=label%3Aproxy+) issues. +## Robots and crawlers + +Shaarli disallows indexing and crawling of your local documentation pages by search engines, using `` HTML tags. +Your Shaarli instance and other pages you host may still be indexed by various robots on the public Internet. +You may want to setup a robots.txt file or other crawler control mechanism on your server. +See [[1]](https://en.wikipedia.org/wiki/Robots_exclusion_standard), [[2]](https://support.google.com/webmasters/answer/6062608?hl=en) and [[3]](https://developers.google.com/search/reference/robots_meta_tag) ## See also diff --git a/inc/languages/fr/LC_MESSAGES/shaarli.po b/inc/languages/fr/LC_MESSAGES/shaarli.po index 5fd0f775..102c80da 100644 --- a/inc/languages/fr/LC_MESSAGES/shaarli.po +++ b/inc/languages/fr/LC_MESSAGES/shaarli.po @@ -1,15 +1,15 @@ msgid "" msgstr "" "Project-Id-Version: Shaarli\n" -"POT-Creation-Date: 2018-07-17 13:04+0200\n" -"PO-Revision-Date: 2018-07-17 13:07+0200\n" +"POT-Creation-Date: 2018-10-06 13:08+0200\n" +"PO-Revision-Date: 2018-10-06 13:08+0200\n" "Last-Translator: \n" "Language-Team: Shaarli\n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.9\n" +"X-Generator: Poedit 2.1.1\n" "X-Poedit-Basepath: ../../../..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" @@ -101,8 +101,6 @@ msgid "Array offset and link ID must be equal." msgstr "La clé du tableau et l'ID du lien doivent être identiques." #: application/LinkDB.php:251 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 msgid "" @@ -125,8 +123,8 @@ msgstr "" "Bienvenue sur Shaarli ! Ceci est votre premier marque-page public. Pour me " "modifier ou me supprimer, vous devez d'abord vous connecter.\n" "\n" -"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » " -"en bas de page.\n" +"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » en " +"bas de page.\n" "\n" "Vous utilisez la version supportée par la communauté du projet original " "Shaarli de Sébastien Sauvage." @@ -185,14 +183,14 @@ msgid "" "php-gd extension must be loaded to use thumbnails. Thumbnails are now " "disabled. Please reload the page." msgstr "" -"l'extension php-gd doit être chargée pour utiliser les miniatures. Les miniatures sont désormais " -"désactivées. Rechargez la page." +"l'extension php-gd doit être chargée pour utiliser les miniatures. Les " +"miniatures sont désormais désactivées. Rechargez la page." #: application/Updater.php:86 msgid "Couldn't retrieve Updater class methods." msgstr "Impossible de récupérer les méthodes de la classe Updater." -#: application/Updater.php:514 index.php:1023 +#: application/Updater.php:514 index.php:1022 msgid "" "You have enabled or changed thumbnails mode. Please synchronize them." @@ -200,17 +198,17 @@ msgstr "" "Vous avez activé ou changé le mode de miniatures. Merci de les synchroniser." -#: application/Updater.php:566 +#: application/Updater.php:586 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:606 +#: application/Updater.php:626 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:611 +#: application/Updater.php:631 msgid "Unable to write updates in " msgstr "Impossible d'écrire les mises à jour dans " @@ -288,72 +286,64 @@ msgstr "NON. Vous êtes banni pour le moment. Revenez plus tard." msgid "Wrong login/password." msgstr "Nom d'utilisateur ou mot de passe incorrect(s)." -#: index.php:483 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46 +#: index.php:482 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46 msgid "Daily" msgstr "Quotidien" -#: index.php:589 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 +#: index.php:588 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 -#: 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" -#: index.php:606 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41 +#: index.php:605 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41 msgid "Picture wall" msgstr "Mur d'images" -#: index.php:683 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36 +#: index.php:682 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 msgid "Tag cloud" msgstr "Nuage de tags" -#: index.php:716 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 +#: index.php:715 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 msgid "Tag list" msgstr "Liste des tags" -#: index.php:941 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31 +#: index.php:940 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31 msgid "Tools" msgstr "Outils" -#: index.php:950 +#: index.php:949 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:955 index.php:997 index.php:1085 index.php:1116 index.php:1221 +#: index.php:954 index.php:996 index.php:1084 index.php:1116 index.php:1221 msgid "Wrong token." msgstr "Jeton invalide." -#: index.php:960 +#: index.php:959 msgid "The old password is not correct." msgstr "L'ancien mot de passe est incorrect." -#: index.php:980 +#: index.php:979 msgid "Your password has been changed" msgstr "Votre mot de passe a été modifié" -#: index.php:985 -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 +#: index.php:984 tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 msgid "Change password" msgstr "Modifier le mot de passe" -#: index.php:1043 +#: index.php:1042 msgid "Configuration was saved." msgstr "La configuration a été sauvegardée." -#: index.php:1068 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 +#: index.php:1067 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 msgid "Configure" msgstr "Configurer" -#: index.php:1079 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 +#: index.php:1078 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 msgid "Manage tags" msgstr "Gérer les tags" @@ -381,7 +371,6 @@ msgid "Edit" msgstr "Modifier" #: index.php:1281 index.php:1351 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26 msgid "Shaare" msgstr "Shaare" @@ -390,15 +379,19 @@ msgstr "Shaare" msgid "Note: " msgstr "Note : " -#: index.php:1360 tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65 +#: index.php:1359 +msgid "Invalid link ID provided" +msgstr "" + +#: index.php:1379 msgid "Export" msgstr "Exporter" -#: index.php:1422 tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83 +#: index.php:1441 msgid "Import" msgstr "Importer" -#: index.php:1432 +#: index.php:1451 #, php-format msgid "" "The file you are trying to upload is probably bigger than what this " @@ -408,20 +401,20 @@ msgstr "" "le serveur web peut accepter (%s). Merci de l'envoyer en parties plus " "légères." -#: index.php:1471 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 +#: index.php:1490 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22 msgid "Plugin administration" msgstr "Administration des plugins" -#: index.php:1523 tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 +#: index.php:1542 tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 msgid "Thumbnails update" msgstr "Mise à jour des miniatures" -#: index.php:1695 +#: index.php:1714 msgid "Search: " msgstr "Recherche : " -#: index.php:1735 +#: index.php:1754 #, php-format msgid "" "
Sessions do not seem to work correctly on your server.
Make sure the " @@ -431,16 +424,16 @@ msgid "" "custom hostname without a dot causes cookie storage to fail. We recommend " "accessing your server via it's IP address or Fully Qualified Domain Name.
" msgstr "" -"
Les sesssions ne semblent pas fonctionner sur ce serveur.
Assurez vous " -"que la variable « session.save_path » est correctement définie dans votre " -"fichier de configuration PHP, et que vous avez les droits d'écriture dessus." -"
Ce paramètre pointe actuellement sur %s.
Sur certains navigateurs, " -"accéder à votre serveur depuis un nom d'hôte comme « localhost » ou autre " -"nom personnalisé sans point '.' entraine l'échec de la sauvegarde des " -"cookies. Nous vous recommandons d'accéder à votre serveur depuis son adresse " -"IP ou un Fully Qualified Domain Name.
" - -#: index.php:1745 +"
Les sesssions ne semblent pas fonctionner sur ce serveur.
Assurez " +"vous que la variable « session.save_path » est correctement définie dans " +"votre fichier de configuration PHP, et que vous avez les droits d'écriture " +"dessus.
Ce paramètre pointe actuellement sur %s.
Sur certains " +"navigateurs, accéder à votre serveur depuis un nom d'hôte comme « localhost " +"» ou autre nom personnalisé sans point '.' entraine l'échec de la sauvegarde " +"des cookies. Nous vous recommandons d'accéder à votre serveur depuis son " +"adresse IP ou un Fully Qualified Domain Name.
" + +#: index.php:1764 msgid "Click to try again." msgstr "Cliquer ici pour réessayer." @@ -481,12 +474,13 @@ msgstr "" "Erreur de l'extension Isso : Merci de définir le paramètre « ISSO_SERVER » " "dans la page d'administration des extensions." -#: plugins/isso/isso.php:63 +#: plugins/isso/isso.php:90 msgid "Let visitor comment your shaares on permalinks with Isso." msgstr "" -"Permettre aux visiteurs de commenter vos shaares sur les permaliens avec Isso." +"Permettre aux visiteurs de commenter vos shaares sur les permaliens avec " +"Isso." -#: plugins/isso/isso.php:64 +#: plugins/isso/isso.php:91 msgid "Isso server URL (without 'http://')" msgstr "URL du serveur Isso (sans 'http://')" @@ -603,35 +597,17 @@ msgstr "Version de l'API Wallabag (1 ou 2)" #: tests/LanguagesTest.php:214 tests/LanguagesTest.php:227 #: tests/languages/fr/LanguagesFrTest.php:160 #: tests/languages/fr/LanguagesFrTest.php:173 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:85 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:85 msgid "Search" msgid_plural "Search" msgstr[0] "Rechercher" msgstr[1] "Rechercher" -#: tmp/404.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12 -msgid "Sorry, nothing to see here." -msgstr "Désolé, il y a rien à voir ici." - #: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 msgid "URL or leave empty to post a note" msgstr "URL ou laisser vide pour créer une note" -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -msgid "Current password" -msgstr "Mot de passe actuel" - -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 -msgid "New password" -msgstr "Nouveau mot de passe" - -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23 -msgid "Change" -msgstr "Changer" - #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77 msgid "Tag" msgstr "Tag" @@ -661,6 +637,34 @@ msgstr "Vous pouvez aussi modifier les tags dans la" msgid "tag list" msgstr "liste des tags" +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:143 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:296 +msgid "All" +msgstr "Tous" + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:147 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:300 +msgid "Only common media hosts" +msgstr "Seulement les hébergeurs de média connus" + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:151 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:304 +msgid "None" +msgstr "Aucune" + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:158 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281 +msgid "You need to enable the extension php-gd to use thumbnails." +msgstr "" +"Vous devez activer l'extension php-gd pour utiliser les " +"miniatures." + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:162 +#, fuzzy +#| msgid "Enable thumbnails" +msgid "Synchonize thumbnails" +msgstr "Activer les miniatures" + #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 msgid "title" msgstr "titre" @@ -678,22 +682,18 @@ msgid "Theme" msgstr "Thème" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:87 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:78 msgid "Language" msgstr "Langue" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:116 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102 msgid "Timezone" msgstr "Fuseau horaire" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103 msgid "Continent" msgstr "Continent" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103 msgid "City" msgstr "Ville" @@ -734,22 +734,18 @@ msgid "Do not show any links if the user is not logged in" msgstr "N'afficher aucun lien sans être connecté" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:231 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:150 msgid "Check updates" msgstr "Vérifier les mises à jour" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:232 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152 msgid "Notify me when a new release is ready" msgstr "Me notifier lorsqu'une nouvelle version est disponible" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:247 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169 msgid "Enable REST API" msgstr "Activer l'API REST" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:248 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:170 msgid "Allow third party software to use Shaarli such as mobile application" msgstr "" "Permet aux applications tierces d'utiliser Shaarli, par exemple les " @@ -763,30 +759,11 @@ msgstr "Clé d'API secrète" msgid "Enable thumbnails" msgstr "Activer les miniatures" -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281 -msgid "You need to enable the extension php-gd to use thumbnails." -msgstr "" -"Vous devez activer l'extension php-gd pour utiliser les " -"miniatures." - #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:285 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:56 msgid "Synchronize thumbnails" msgstr "Synchroniser les miniatures" -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:296 -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31 -msgid "All" -msgstr "Tous" - -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:300 -msgid "Only common media hosts" -msgstr "Seulement les hébergeurs de média connus" - -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:304 -msgid "None" -msgstr "Aucune" - #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:312 #: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 @@ -847,7 +824,6 @@ msgid "Tags" msgstr "Tags" #: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57 -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:167 msgid "Private" msgstr "Privé" @@ -856,99 +832,6 @@ msgstr "Privé" msgid "Apply Changes" msgstr "Appliquer les changements" -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -msgid "Export Database" -msgstr "Exporter les données" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 -msgid "Selection" -msgstr "Choisir" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -msgid "Public" -msgstr "Publics" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:52 -msgid "Prepend note permalinks with this Shaarli instance's URL" -msgstr "Préfixer les liens de note avec l'URL de l'instance de Shaarli" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53 -msgid "Useful to import bookmarks in a web browser" -msgstr "Utile pour importer les marques-pages dans un navigateur" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -msgid "Import Database" -msgstr "Importer des données" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23 -msgid "Maximum size allowed:" -msgstr "Taille maximum autorisée :" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 -msgid "Visibility" -msgstr "Visibilité" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 -msgid "Use values from the imported file, default to public" -msgstr "" -"Utiliser les valeurs présentes dans le fichier d'import, public par défaut" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -msgid "Import all bookmarks as private" -msgstr "Importer tous les liens comme privés" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 -msgid "Import all bookmarks as public" -msgstr "Importer tous les liens comme publics" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57 -msgid "Overwrite existing bookmarks" -msgstr "Remplacer les liens existants" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58 -msgid "Duplicates based on URL" -msgstr "Les doublons s'appuient sur les URL" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 -msgid "Add default tags" -msgstr "Ajouter des tags par défaut" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22 -msgid "Install Shaarli" -msgstr "Installation de Shaarli" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25 -msgid "It looks like it's the first time you run Shaarli. Please configure it." -msgstr "" -"Il semblerait que ça soit la première fois que vous lancez Shaarli. Merci de " -"le configurer." - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33 -#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30 -#: 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 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152 -msgid "Password" -msgstr "Mot de passe" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:63 -msgid "Shaarli title" -msgstr "Titre du Shaarli" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69 -msgid "My links" -msgstr "Mes liens" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:182 -msgid "Install" -msgstr "Installer" - #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79 msgid "shaare" @@ -964,13 +847,11 @@ msgstr[0] "lien privé" msgstr[1] "liens privés" #: 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" #: 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 @@ -1011,7 +892,6 @@ msgid "without any tag" msgstr "sans tag" #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42 msgid "Fold" msgstr "Replier" @@ -1028,36 +908,36 @@ msgstr "permalien" msgid "Add tag" msgstr "Ajouter un tag" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7 +#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:183 +msgid "Toggle sticky" +msgstr "Changer statut épinglé" + +#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:185 +msgid "Sticky" +msgstr "Épinglé" + #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:7 msgid "Filters" msgstr "Filtres" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:12 msgid "Only display private links" msgstr "Afficher uniquement les liens privés" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:15 msgid "Only display public links" msgstr "Afficher uniquement les liens publics" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:20 msgid "Filter untagged links" msgstr "Filtrer par liens privés" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:24 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43 msgid "Fold all" msgstr "Replier tout" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:69 msgid "Links per page" msgstr "Liens par page" @@ -1069,59 +949,56 @@ msgstr "" "Vous avez été banni après trop d'échecs d'authentification. Merci de " "réessayer plus tard." +#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30 +#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34 +#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152 +msgid "Password" +msgstr "Mot de passe" + #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:155 msgid "Remember me" msgstr "Rester connecté" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 msgid "by the Shaarli community" msgstr "par la communauté Shaarli" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15 msgid "Documentation" msgstr "Documentation" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44 msgid "Expand" msgstr "Déplier" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45 msgid "Expand all" msgstr "Déplier tout" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46 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: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" -#: 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" -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:173 msgid "is available" msgstr "est disponible" -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:180 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:180 msgid "Error" msgstr "Erreur" @@ -1221,22 +1098,18 @@ msgstr "tags" msgid "List all links with those tags" msgstr "Lister tous les liens avec ces tags" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:3 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3 msgid "Sort by:" msgstr "Trier par :" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:5 msgid "Cloud" msgstr "Nuage" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:6 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:6 msgid "Most used" msgstr "Plus utilisés" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:7 msgid "Alphabetical" msgstr "Alphabétique" @@ -1266,9 +1139,13 @@ msgid "Rename or delete a tag in all links" msgstr "Renommer ou supprimer un tag dans tous les liens" #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 +#, fuzzy +#| msgid "" +#| "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, " +#| "delicious…)" msgid "" "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, " -"delicious…)" +"delicious...)" msgstr "" "Importer des marques pages au format Netscape HTML (comme exportés depuis " "Firefox, Chrome, Opera, delicious…)" @@ -1278,9 +1155,13 @@ msgid "Import links" msgstr "Importer des liens" #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47 +#, fuzzy +#| msgid "" +#| "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, " +#| "Opera, delicious…)" msgid "" "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, " -"Opera, delicious…)" +"Opera, delicious...)" msgstr "" "Exporter les marques pages au format Netscape HTML (comme exportés depuis " "Firefox, Chrome, Opera, delicious…)" @@ -1339,33 +1220,16 @@ msgstr "" msgid "Add Note" msgstr "Ajouter une Note" -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 -msgid "" -"You need to browse your Shaarli over HTTPS to use this " -"functionality." -msgstr "" -"Vous devez utiliser Shaarli en HTTPS pour utiliser cette " -"fonctionalité." - -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144 -msgid "Add to" -msgstr "Ajouter à" - -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:136 msgid "3rd party" msgstr "Applications tierces" -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:157 -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:163 -msgid "Plugin" -msgstr "Extension" - -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:158 -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:164 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144 msgid "plugin" msgstr "extension" -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:191 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169 msgid "" "Drag this link to your bookmarks toolbar, or right-click it and choose " "Bookmark This Link" @@ -1373,10 +1237,91 @@ msgstr "" "Glisser ce lien dans votre barre de favoris ou cliquer droit dessus et « " "Ajouter aux favoris »" -#, fuzzy -#~| msgid "Enable thumbnails" -#~ msgid "Synchonize thumbnails" -#~ msgstr "Activer les miniatures" +#~ msgid "Sorry, nothing to see here." +#~ msgstr "Désolé, il y a rien à voir ici." + +#~ msgid "Current password" +#~ msgstr "Mot de passe actuel" + +#~ msgid "New password" +#~ msgstr "Nouveau mot de passe" + +#~ msgid "Change" +#~ msgstr "Changer" + +#~ msgid "Export Database" +#~ msgstr "Exporter les données" + +#~ msgid "Selection" +#~ msgstr "Choisir" + +#~ msgid "Public" +#~ msgstr "Publics" + +#~ msgid "Prepend note permalinks with this Shaarli instance's URL" +#~ msgstr "Préfixer les liens de note avec l'URL de l'instance de Shaarli" + +#~ msgid "Useful to import bookmarks in a web browser" +#~ msgstr "Utile pour importer les marques-pages dans un navigateur" + +#~ msgid "Import Database" +#~ msgstr "Importer des données" + +#~ msgid "Maximum size allowed:" +#~ msgstr "Taille maximum autorisée :" + +#~ msgid "Visibility" +#~ msgstr "Visibilité" + +#~ msgid "Use values from the imported file, default to public" +#~ msgstr "" +#~ "Utiliser les valeurs présentes dans le fichier d'import, public par défaut" + +#~ msgid "Import all bookmarks as private" +#~ msgstr "Importer tous les liens comme privés" + +#~ msgid "Import all bookmarks as public" +#~ msgstr "Importer tous les liens comme publics" + +#~ msgid "Overwrite existing bookmarks" +#~ msgstr "Remplacer les liens existants" + +#~ msgid "Duplicates based on URL" +#~ msgstr "Les doublons s'appuient sur les URL" + +#~ msgid "Add default tags" +#~ msgstr "Ajouter des tags par défaut" + +#~ msgid "Install Shaarli" +#~ msgstr "Installation de Shaarli" + +#~ msgid "" +#~ "It looks like it's the first time you run Shaarli. Please configure it." +#~ msgstr "" +#~ "Il semblerait que ça soit la première fois que vous lancez Shaarli. Merci " +#~ "de le configurer." + +#~ msgid "Shaarli title" +#~ msgstr "Titre du Shaarli" + +#~ msgid "My links" +#~ msgstr "Mes liens" + +#~ msgid "Install" +#~ msgstr "Installer" + +#~ msgid "" +#~ "You need to browse your Shaarli over HTTPS to use this " +#~ "functionality." +#~ msgstr "" +#~ "Vous devez utiliser Shaarli en HTTPS pour utiliser cette " +#~ "fonctionalité." + +#~ msgid "Add to" +#~ msgstr "Ajouter à" + +#~ msgid "Plugin" +#~ msgstr "Extension" #~ msgid "Warning: " #~ msgstr "Attention : " @@ -1450,7 +1395,8 @@ msgstr "" #~ "\n" #~ msgid "Sessions do not seem to work correctly on your server." -#~ msgstr "Les sessions ne semblent pas fonctionner correctement sur votre serveur." +#~ msgstr "" +#~ "Les sessions ne semblent pas fonctionner correctement sur votre serveur." #~ msgid "Tag was renamed in " #~ msgstr "Le tag a été renommé dans " diff --git a/index.php b/index.php index 4b86a3e2..b702bd13 100644 --- a/index.php +++ b/index.php @@ -1084,7 +1084,8 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager, die(t('Wrong token.')); } - $alteredLinks = $LINKSDB->renameTag(escape($_POST['fromtag']), escape($_POST['totag'])); + $toTag = isset($_POST['totag']) ? escape($_POST['totag']) : null; + $alteredLinks = $LINKSDB->renameTag(escape($_POST['fromtag']), $toTag); $LINKSDB->save($conf->get('resource.page_cache')); foreach ($alteredLinks as $link) { $history->updateLink($link); @@ -1236,10 +1237,10 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager, $id = (int) escape($id); $link = $LINKSDB[$id]; $pluginManager->executeHooks('delete_link', $link); + $history->deleteLink($link); unset($LINKSDB[$id]); } $LINKSDB->save($conf->get('resource.page_cache')); // save to disk - $history->deleteLink($link); // If we are called from the bookmarklet, we must close the popup: if (isset($_GET['source']) && ($_GET['source']=='bookmarklet' || $_GET['source']=='firefoxsocialapi')) { echo ''; exit; } @@ -1352,6 +1353,25 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager, exit; } + if ($targetPage == Router::$PAGE_PINLINK) { + if (! isset($_GET['id']) || empty($LINKSDB[$_GET['id']])) { + // FIXME! Use a proper error system. + $msg = t('Invalid link ID provided'); + echo ''; + exit; + } + if (! $sessionManager->checkToken($_GET['token'])) { + die('Wrong token.'); + } + + $link = $LINKSDB[$_GET['id']]; + $link['sticky'] = ! $link['sticky']; + $LINKSDB[(int) $_GET['id']] = $link; + $LINKSDB->save($conf->get('resource.page_cache')); + header('Location: '.index_url($_SERVER)); + exit; + } + if ($targetPage == Router::$PAGE_EXPORT) { // Export links as a Netscape Bookmarks file @@ -1858,6 +1878,7 @@ $app->group('/api/v1', function() { })->add('\Shaarli\Api\ApiMiddleware'); $response = $app->run(true); + // Hack to make Slim and Shaarli router work together: // If a Slim route isn't found and NOT API call, we call renderPage(). if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v1') === false) { @@ -1865,5 +1886,12 @@ if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v header('Content-Type: text/html; charset=utf-8'); renderPage($conf, $pluginManager, $linkDb, $history, $sessionManager, $loginManager); } else { + $response = $response + ->withHeader('Access-Control-Allow-Origin', '*') + ->withHeader( + 'Access-Control-Allow-Headers', + 'X-Requested-With, Content-Type, Accept, Origin, Authorization' + ) + ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); $app->respond($response); } diff --git a/mkdocs.yml b/mkdocs.yml index 941fce3a..248fdbfe 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,7 +2,9 @@ site_name: Shaarli Documentation repo_url: https://github.com/shaarli/Shaarli edit_uri: edit/master/doc/md site_description: The personal, minimalist, super-fast, database free, bookmarking service -theme: readthedocs +theme: + name: readthedocs + custom_dir: doc/custom_theme/ docs_dir: doc/md site_dir: doc/html # Disable strict mode until ReadTheDocs provides up-to-date MkDocs settings: diff --git a/plugins/isso/comment.png b/plugins/isso/comment.png new file mode 100644 index 00000000..0158c03b Binary files /dev/null and b/plugins/isso/comment.png differ diff --git a/plugins/isso/isso.php b/plugins/isso/isso.php index 5bc1cce2..378c11af 100644 --- a/plugins/isso/isso.php +++ b/plugins/isso/isso.php @@ -46,9 +46,36 @@ function hook_isso_render_linklist($data, $conf) $isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']); $data['plugin_end_zone'][] = $isso; + } else { + $button = ''; + // For the default theme we use a FontAwesome icon which is better than an image + if ($conf->get('resource.theme') === 'default') { + $button .= ''; + } else { + $button .= ' + + archive.org + + diff --git a/plugins/markdown/markdown.php b/plugins/markdown/markdown.php index 821bb125..21972814 100644 --- a/plugins/markdown/markdown.php +++ b/plugins/markdown/markdown.php @@ -215,6 +215,15 @@ function reverse_text2clickable($description) $descriptionLine ); + // Make hashtag links markdown ready, otherwise the links will be ignored with escape set to true + if (!$codeBlockOn && !$codeLineOn) { + $descriptionLine = preg_replace( + '#([^<]+)#m', + '[$2]($1)', + $descriptionLine + ); + } + $descriptionOut .= $descriptionLine; if ($lineCount++ < count($descriptionLines) - 1) { $descriptionOut .= PHP_EOL; diff --git a/tests/FeedBuilderTest.php b/tests/FeedBuilderTest.php index a590306d..4ca58e5a 100644 --- a/tests/FeedBuilderTest.php +++ b/tests/FeedBuilderTest.php @@ -82,8 +82,8 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $this->assertFalse($data['usepermalinks']); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); - // Test first link (note link) - $link = reset($data['links']); + // Test first not pinned link (note link) + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals(41, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); @@ -119,7 +119,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $data = $feedBuilder->buildData(); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']); - $link = reset($data['links']); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']); $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links'][8]['up_iso_date']); } @@ -148,13 +148,13 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase public function testBuildDataCount() { $criteria = array( - 'nb' => '1', + 'nb' => '3', ); $feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, $criteria, false); $feedBuilder->setLocale(self::$LOCALE); $data = $feedBuilder->buildData(); - $this->assertEquals(1, count($data['links'])); - $link = array_shift($data['links']); + $this->assertEquals(3, count($data['links'])); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals(41, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); } @@ -171,7 +171,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); $this->assertTrue($data['usepermalinks']); // First link is a permalink - $link = array_shift($data['links']); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals(41, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); @@ -179,7 +179,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $this->assertContains('Direct link', $link['description']); $this->assertContains('http://host.tld/?WDWyig', $link['description']); // Second link is a direct link - $link = array_shift($data['links']); + $link = $data['links'][array_keys($data['links'])[3]]; $this->assertEquals(8, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114633'), $link['created']); $this->assertEquals('http://host.tld/?RttfEw', $link['guid']); @@ -237,7 +237,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase ); // Test first link (note link) - $link = array_shift($data['links']); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['guid']); $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['url']); $this->assertContains('http://host.tld:8080/~user/shaarli/?addtag=hashtag', $link['description']); diff --git a/tests/LinkDBTest.php b/tests/LinkDBTest.php index 3b980878..fcab76f6 100644 --- a/tests/LinkDBTest.php +++ b/tests/LinkDBTest.php @@ -239,12 +239,12 @@ class LinkDBTest extends PHPUnit_Framework_TestCase public function testDays() { $this->assertEquals( - array('20100310', '20121206', '20130614', '20150310'), + array('20100309', '20100310', '20121206', '20121207', '20130614', '20150310'), self::$publicLinkDB->days() ); $this->assertEquals( - array('20100310', '20121206', '20130614', '20141125', '20150310'), + array('20100309', '20100310', '20121206', '20121207', '20130614', '20141125', '20150310'), self::$privateLinkDB->days() ); } @@ -475,13 +475,15 @@ class LinkDBTest extends PHPUnit_Framework_TestCase public function testReorderLinksDesc() { self::$privateLinkDB->reorder('ASC'); - $linkIds = array(42, 4, 9, 1, 0, 7, 6, 8, 41); + $stickyIds = [11, 10]; + $standardIds = [42, 4, 9, 1, 0, 7, 6, 8, 41]; + $linkIds = array_merge($stickyIds, $standardIds); $cpt = 0; foreach (self::$privateLinkDB as $key => $value) { $this->assertEquals($linkIds[$cpt++], $key); } self::$privateLinkDB->reorder('DESC'); - $linkIds = array_reverse($linkIds); + $linkIds = array_merge(array_reverse($stickyIds), array_reverse($standardIds)); $cpt = 0; foreach (self::$privateLinkDB as $key => $value) { $this->assertEquals($linkIds[$cpt++], $key); diff --git a/tests/NetscapeBookmarkUtils/BookmarkExportTest.php b/tests/NetscapeBookmarkUtils/BookmarkExportTest.php index 6a47bbb9..77fbd5f3 100644 --- a/tests/NetscapeBookmarkUtils/BookmarkExportTest.php +++ b/tests/NetscapeBookmarkUtils/BookmarkExportTest.php @@ -110,7 +110,7 @@ class BookmarkExportTest extends PHPUnit_Framework_TestCase $links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'public', false, ''); $this->assertEquals( '?WDWyig', - $links[0]['url'] + $links[2]['url'] ); } @@ -128,7 +128,7 @@ class BookmarkExportTest extends PHPUnit_Framework_TestCase ); $this->assertEquals( $indexUrl . '?WDWyig', - $links[0]['url'] + $links[2]['url'] ); } } diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index cacee2d2..870f169a 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -688,6 +688,7 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; } /** +<<<<<<< HEAD * Test updateMethodWebThumbnailer with thumbnails enabled. */ public function testUpdateMethodWebThumbnailerEnabled() @@ -732,4 +733,64 @@ $GLOBALS[\'privateLinkByDefault\'] = true;'; $this->assertEquals(53, $this->conf->get('thumbnails.height')); $this->assertTrue(empty($_SESSION['warnings'])); } + + /** + * Test updateMethodSetSticky(). + */ + public function testUpdateStickyValid() + { + $blank = [ + 'id' => 1, + 'url' => 'z', + 'title' => '', + 'description' => '', + 'tags' => '', + 'created' => new DateTime(), + ]; + $links = [ + 1 => ['id' => 1] + $blank, + 2 => ['id' => 2] + $blank, + ]; + $refDB = new ReferenceLinkDB(); + $refDB->setLinks($links); + $refDB->write(self::$testDatastore); + $linkDB = new LinkDB(self::$testDatastore, true, false); + + $updater = new Updater(array(), $linkDB, $this->conf, true); + $this->assertTrue($updater->updateMethodSetSticky()); + + $linkDB = new LinkDB(self::$testDatastore, true, false); + foreach ($linkDB as $link) { + $this->assertFalse($link['sticky']); + } + } + + /** + * Test updateMethodSetSticky(). + */ + public function testUpdateStickyNothingToDo() + { + $blank = [ + 'id' => 1, + 'url' => 'z', + 'title' => '', + 'description' => '', + 'tags' => '', + 'created' => new DateTime(), + ]; + $links = [ + 1 => ['id' => 1, 'sticky' => true] + $blank, + 2 => ['id' => 2] + $blank, + ]; + $refDB = new ReferenceLinkDB(); + $refDB->setLinks($links); + $refDB->write(self::$testDatastore); + $linkDB = new LinkDB(self::$testDatastore, true, false); + + $updater = new Updater(array(), $linkDB, $this->conf, true); + $this->assertTrue($updater->updateMethodSetSticky()); + + $linkDB = new LinkDB(self::$testDatastore, true, false); + $this->assertTrue($linkDB[1]['sticky']); + } } diff --git a/tests/api/controllers/links/GetLinksTest.php b/tests/api/controllers/links/GetLinksTest.php index d22ed3bf..64f02774 100644 --- a/tests/api/controllers/links/GetLinksTest.php +++ b/tests/api/controllers/links/GetLinksTest.php @@ -95,7 +95,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $this->assertEquals($this->refDB->countLinks(), count($data)); // Check order - $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; + $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42]; $cpt = 0; foreach ($data as $link) { $this->assertEquals(self::NB_FIELDS_LINK, count($link)); @@ -103,7 +103,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase } // Check first element fields - $first = $data[0]; + $first = $data[2]; $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); $this->assertEquals('WDWyig', $first['shorturl']); $this->assertEquals('Link title: @website', $first['title']); @@ -120,7 +120,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $this->assertEmpty($first['updated']); // Multi tags - $link = $data[1]; + $link = $data[3]; $this->assertEquals(7, count($link['tags'])); // Update date @@ -138,7 +138,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase { $env = Environment::mock([ 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'offset=1&limit=1' + 'QUERY_STRING' => 'offset=3&limit=1' ]); $request = Request::createFromEnvironment($env); $response = $this->controller->getLinks($request, new Response()); @@ -164,7 +164,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $data = json_decode((string) $response->getBody(), true); $this->assertEquals($this->refDB->countLinks(), count($data)); // Check order - $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; + $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42]; $cpt = 0; foreach ($data as $link) { $this->assertEquals(self::NB_FIELDS_LINK, count($link)); @@ -205,7 +205,8 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string)$response->getBody(), true); $this->assertEquals($this->refDB->countLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(10, $data[0]['id']); + $this->assertEquals(41, $data[2]['id']); $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); } @@ -243,7 +244,8 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string)$response->getBody(), true); $this->assertEquals($this->refDB->countPublicLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(10, $data[0]['id']); + $this->assertEquals(41, $data[2]['id']); $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); } @@ -413,8 +415,9 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase $response = $this->controller->getLinks($request, new Response()); $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(9, count($data)); - $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, count($data)); + $this->assertEquals(10, $data[0]['id']); + $this->assertEquals(41, $data[2]['id']); // wildcard: optional ('*' does not need to expand) $env = Environment::mock([ diff --git a/tests/plugins/PluginIssoTest.php b/tests/plugins/PluginIssoTest.php index 0ae73183..2c9efbcd 100644 --- a/tests/plugins/PluginIssoTest.php +++ b/tests/plugins/PluginIssoTest.php @@ -21,7 +21,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test Isso init without errors. */ - public function testWallabagInitNoError() + public function testIssoInitNoError() { $conf = new ConfigManager(''); $conf->set('plugins.ISSO_SERVER', 'value'); @@ -32,7 +32,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase /** * Test Isso init with errors. */ - public function testWallabagInitError() + public function testIssoInitError() { $conf = new ConfigManager(''); $errors = isso_init($conf); @@ -96,19 +96,22 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase array( 'id' => 12, 'url' => $str, + 'shorturl' => $short1 = 'abcd', 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date1), ), array( 'id' => 13, 'url' => $str . '2', + 'shorturl' => $short2 = 'efgh', 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date2), ), ) ); $processed = hook_isso_render_linklist($data, $conf); - // data shouldn't be altered - $this->assertEquals($data, $processed); + // link_plugin should be added for the icon + $this->assertContains('', $processed['links'][0]['link_plugin'][0]); + $this->assertContains('', $processed['links'][1]['link_plugin'][0]); } /** @@ -127,6 +130,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase array( 'id' => 12, 'url' => $str, + 'shorturl' => $short1 = 'abcd', 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date), ) ), @@ -135,8 +139,8 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase $processed = hook_isso_render_linklist($data, $conf); - // data shouldn't be altered - $this->assertEquals($data, $processed); + // link_plugin should be added for the icon + $this->assertContains('', $processed['links'][0]['link_plugin'][0]); } /** diff --git a/tests/plugins/PluginMarkdownTest.php b/tests/plugins/PluginMarkdownTest.php index b31e817f..319a94ba 100644 --- a/tests/plugins/PluginMarkdownTest.php +++ b/tests/plugins/PluginMarkdownTest.php @@ -106,6 +106,18 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase $this->assertEquals($text, $reversedText); } + /** + * Test reverse_text2clickable(). + */ + public function testReverseText2clickableHashtags() + { + $text = file_get_contents('tests/plugins/resources/hashtags.raw'); + $md = file_get_contents('tests/plugins/resources/hashtags.md'); + $clickableText = hashtag_autolink($text); + $reversedText = reverse_text2clickable($clickableText); + $this->assertEquals($md, $reversedText); + } + /** * Test reverse_nl2br(). */ @@ -246,7 +258,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase $this->conf->get('security.markdown_escape', true), $this->conf->get('security.allowed_protocols') ); - $this->assertEquals($html, $data); + $this->assertEquals($html, $data . PHP_EOL); } /** diff --git a/tests/plugins/resources/hashtags.md b/tests/plugins/resources/hashtags.md new file mode 100644 index 00000000..46326de3 --- /dev/null +++ b/tests/plugins/resources/hashtags.md @@ -0,0 +1,10 @@ +[#lol](?addtag=lol) + + #test + +`#test2` + +``` +bla #bli blo +#bla +``` diff --git a/tests/plugins/resources/hashtags.raw b/tests/plugins/resources/hashtags.raw new file mode 100644 index 00000000..9d2dc98a --- /dev/null +++ b/tests/plugins/resources/hashtags.raw @@ -0,0 +1,10 @@ +#lol + + #test + +`#test2` + +``` +bla #bli blo +#bla +``` diff --git a/tests/plugins/resources/markdown.html b/tests/plugins/resources/markdown.html index f1df4e7e..c3460bf7 100644 --- a/tests/plugins/resources/markdown.html +++ b/tests/plugins/resources/markdown.html @@ -12,11 +12,11 @@
  • two
  • three
  • four
  • -
  • foo <a href="?addtag=foobar" title="Hashtag foobar">#foobar</a>
  • +
  • foo #foobar
  • -

    <a href="?addtag=foobar" title="Hashtag foobar">#foobar</a> foo lol #foo <a href="?addtag=bar" title="Hashtag bar">#bar</a>

    -

    fsdfs http://link.tld <a href="?addtag=foobar" title="Hashtag foobar">#foobar</a> http://link.tld

    +

    #foobar foo lol #foo #bar

    +

    fsdfs http://link.tld #foobar http://link.tld

    http://link.tld #foobar
     next #foo

    Block:

    @@ -30,4 +30,4 @@ next #foo
    link
    link
    link
    -link

    \ No newline at end of file +link

    diff --git a/tests/plugins/resources/markdown.md b/tests/plugins/resources/markdown.md index b8ebd934..9350a8c7 100644 --- a/tests/plugins/resources/markdown.md +++ b/tests/plugins/resources/markdown.md @@ -31,4 +31,4 @@ lorem ipsum #foobar http://link.tld [link](ftp://test.tld/path/?query=value#hash) [link](magnet:test.tld/path/?query=value#hash) [link](javascript:alert('xss')) -[link](other://test.tld/path/?query=value#hash) \ No newline at end of file +[link](other://test.tld/path/?query=value#hash) diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php index e887aa78..7426ad07 100644 --- a/tests/utils/ReferenceLinkDB.php +++ b/tests/utils/ReferenceLinkDB.php @@ -4,7 +4,7 @@ */ class ReferenceLinkDB { - public static $NB_LINKS_TOTAL = 9; + public static $NB_LINKS_TOTAL = 11; private $_links = array(); private $_publicCount = 0; @@ -15,6 +15,32 @@ class ReferenceLinkDB */ public function __construct() { + $this->addLink( + 11, + 'Pined older', + '?PCRizQ', + 'This is an older pinned link', + 0, + DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20100309_101010'), + '', + null, + 'PCRizQ', + true + ); + + $this->addLink( + 10, + 'Pined', + '?0gCTjQ', + 'This is a pinned link', + 0, + DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121207_152312'), + '', + null, + '0gCTjQ', + true + ); + $this->addLink( 41, 'Link title: @website', @@ -114,7 +140,17 @@ class ReferenceLinkDB /** * Adds a new link */ - protected function addLink($id, $title, $url, $description, $private, $date, $tags, $updated = '', $shorturl = '') + protected function addLink( + $id, + $title, + $url, + $description, + $private, + $date, + $tags, + $updated = '', + $shorturl = '', + $pinned = false) { $link = array( 'id' => $id, @@ -126,6 +162,7 @@ class ReferenceLinkDB 'created' => $date, 'updated' => $updated, 'shorturl' => $shorturl ? $shorturl : smallHash($date->format(LinkDB::LINK_DATE_FORMAT) . $id), + 'sticky' => $pinned ); $this->_links[$id] = $link; @@ -165,6 +202,10 @@ class ReferenceLinkDB $order = $order === 'ASC' ? -1 : 1; // Reorder array by dates. usort($this->_links, function($a, $b) use ($order) { + if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) { + return $a['sticky'] ? -1 : 1; + } + return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; }); } diff --git a/tpl/default/daily.html b/tpl/default/daily.html index 816e5d0a..2c409478 100644 --- a/tpl/default/daily.html +++ b/tpl/default/daily.html @@ -72,7 +72,7 @@ {if="$thumbnails_enabled && !empty($link.thumbnail)"}
    thumbnail
    {/if} diff --git a/tpl/default/linklist.html b/tpl/default/linklist.html index 97730c29..ed78f40a 100644 --- a/tpl/default/linklist.html +++ b/tpl/default/linklist.html @@ -125,6 +125,8 @@ {$strPermalink=t('Permalink')} {$strPermalinkLc=t('permalink')} {$strAddTag=t('Add tag')} + {$strToggleSticky=t('Toggle sticky')} + {$strSticky=t('Sticky')} {ignore}End of translations{/ignore} {loop="links"}
    @@ -137,7 +139,7 @@ {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} thumbnail @@ -201,7 +203,23 @@ + + + + + + {else} + {if="$value.sticky"} + + {/if} {/if} {if="!$hide_timestamps || $is_logged_in"} diff --git a/tpl/default/picwall.html b/tpl/default/picwall.html index 9a0b10dc..4c325487 100644 --- a/tpl/default/picwall.html +++ b/tpl/default/picwall.html @@ -37,7 +37,7 @@
    {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} thumbnail {$value.title} {loop="$value.picwall_plugin"} diff --git a/tpl/vintage/daily.html b/tpl/vintage/daily.html index 00148a58..71d84475 100644 --- a/tpl/vintage/daily.html +++ b/tpl/vintage/daily.html @@ -71,7 +71,7 @@ {if="$thumbnails_enabled && !empty($link.thumbnail)"}
    thumbnail
    {/if} diff --git a/tpl/vintage/linklist.html b/tpl/vintage/linklist.html index 3f202849..dcb14e90 100644 --- a/tpl/vintage/linklist.html +++ b/tpl/vintage/linklist.html @@ -85,7 +85,7 @@ {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} thumbnail
    diff --git a/tpl/vintage/picwall.html b/tpl/vintage/picwall.html index 5f1d266e..b3a16791 100644 --- a/tpl/vintage/picwall.html +++ b/tpl/vintage/picwall.html @@ -17,7 +17,7 @@
    {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} thumbnail {$value.title} {loop="$value.picwall_plugin"}