aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.htaccess25
-rw-r--r--AUTHORS3
-rw-r--r--CHANGELOG.md26
-rw-r--r--Makefile3
-rw-r--r--README.md2
-rw-r--r--application/LinkDB.php3
-rw-r--r--application/Router.php6
-rw-r--r--application/Updater.php22
-rw-r--r--assets/default/js/base.js29
-rw-r--r--assets/default/scss/shaarli.scss16
-rw-r--r--composer.lock121
-rw-r--r--doc/custom_theme/main.html25
-rw-r--r--doc/md/Server-configuration.md7
-rw-r--r--inc/languages/fr/LC_MESSAGES/shaarli.po486
-rw-r--r--index.php45
-rw-r--r--mkdocs.yml4
-rw-r--r--plugins/isso/comment.pngbin0 -> 277 bytes
-rw-r--r--plugins/isso/isso.php31
-rw-r--r--plugins/isso/isso_button.html5
-rw-r--r--plugins/markdown/markdown.php9
-rw-r--r--tests/FeedBuilderTest.php18
-rw-r--r--tests/LinkDBTest.php10
-rw-r--r--tests/NetscapeBookmarkUtils/BookmarkExportTest.php4
-rw-r--r--tests/Updater/UpdaterTest.php61
-rw-r--r--tests/api/controllers/links/GetLinksTest.php21
-rw-r--r--tests/plugins/PluginIssoTest.php16
-rw-r--r--tests/plugins/PluginMarkdownTest.php14
-rw-r--r--tests/plugins/resources/hashtags.md10
-rw-r--r--tests/plugins/resources/hashtags.raw10
-rw-r--r--tests/plugins/resources/markdown.html8
-rw-r--r--tests/plugins/resources/markdown.md2
-rw-r--r--tests/utils/ReferenceLinkDB.php45
-rw-r--r--tpl/default/daily.html12
-rw-r--r--tpl/default/dailyrss.html2
-rw-r--r--tpl/default/linklist.html22
-rw-r--r--tpl/default/linklist.paging.html3
-rw-r--r--tpl/default/page.header.html4
-rw-r--r--tpl/default/picwall.html2
-rw-r--r--tpl/default/tools.html11
-rw-r--r--tpl/vintage/configure.html8
-rw-r--r--tpl/vintage/daily.html9
-rw-r--r--tpl/vintage/dailyrss.html4
-rw-r--r--tpl/vintage/linklist.html2
-rw-r--r--tpl/vintage/picwall.html2
44 files changed, 749 insertions, 419 deletions
diff --git a/.htaccess b/.htaccess
index b238854c..4c004271 100644
--- a/.htaccess
+++ b/.htaccess
@@ -16,8 +16,33 @@ RewriteCond %{REQUEST_FILENAME} !-d
16RewriteRule ^ index.php [QSA,L] 16RewriteRule ^ index.php [QSA,L]
17 17
18<Limit GET POST PUT DELETE OPTIONS> 18<Limit GET POST PUT DELETE OPTIONS>
19 <IfModule version_module>
20 <IfVersion >= 2.4>
21 Require all granted
22 </IfVersion>
23 <IfVersion < 2.4>
24 Allow from all
25 Deny from none
26 </IfVersion>
27 </IfModule>
28
29 <IfModule !version_module>
19 Require all granted 30 Require all granted
31 </IfModule>
20</Limit> 32</Limit>
33
21<LimitExcept GET POST PUT DELETE OPTIONS> 34<LimitExcept GET POST PUT DELETE OPTIONS>
35 <IfModule version_module>
36 <IfVersion >= 2.4>
37 Require all denied
38 </IfVersion>
39 <IfVersion < 2.4>
40 Allow from none
41 Deny from all
42 </IfVersion>
43 </IfModule>
44
45 <IfModule !version_module>
22 Require all denied 46 Require all denied
47 </IfModule>
23</LimitExcept> 48</LimitExcept>
diff --git a/AUTHORS b/AUTHORS
index 40d22c17..db23ad32 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,4 +1,4 @@
1 664 ArthurHoaro <arthur@hoa.ro> 1 687 ArthurHoaro <arthur@hoa.ro>
2 355 VirtualTam <virtualtam@flibidi.net> 2 355 VirtualTam <virtualtam@flibidi.net>
3 195 nodiscc <nodiscc@gmail.com> 3 195 nodiscc <nodiscc@gmail.com>
4 56 Sébastien Sauvage <sebsauvage@sebsauvage.net> 4 56 Sébastien Sauvage <sebsauvage@sebsauvage.net>
@@ -15,6 +15,7 @@
15 4 David Sferruzza <david.sferruzza@gmail.com> 15 4 David Sferruzza <david.sferruzza@gmail.com>
16 4 Immánuel Fodor <immanuelfactor+github@gmail.com> 16 4 Immánuel Fodor <immanuelfactor+github@gmail.com>
17 3 Teromene <teromene@teromene.fr> 17 3 Teromene <teromene@teromene.fr>
18 3 llune <llune@users.noreply.github.com>
18 2 Chris Kuethe <chris.kuethe@gmail.com> 19 2 Chris Kuethe <chris.kuethe@gmail.com>
19 2 Felix Bartels <felix@host-consultants.de> 20 2 Felix Bartels <felix@host-consultants.de>
20 2 Knah Tsaeb <Knah-Tsaeb@knah-tsaeb.org> 21 2 Knah Tsaeb <Knah-Tsaeb@knah-tsaeb.org>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 04cb2fd1..aa1f0d8a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,32 @@ All notable changes to this project will be documented in this file.
4The format is based on [Keep a Changelog](http://keepachangelog.com/) 4The format is based on [Keep a Changelog](http://keepachangelog.com/)
5and this project adheres to [Semantic Versioning](http://semver.org/). 5and this project adheres to [Semantic Versioning](http://semver.org/).
6 6
7## [v0.10.2](https://github.com/shaarli/Shaarli/releases/tag/v0.10.2) - 2018-08-11
8
9### Fixed
10
11- Docker build
12
13## [v0.10.1](https://github.com/shaarli/Shaarli/releases/tag/v0.10.1) - 2018-08-11
14
15### Changed
16
17- Accessibility:
18 - Remove alt text on the logo
19 - Remove redundant title in tools page
20
21### Fixed
22
23- Fixed an error on the daily page and daily RSS
24- Fixed an issue causing 'You are not authorized to add a link' error while logged out
25- Fixed thumbnail path when Shaarli's path uses symbolic links
26- Add a `mod_version` check in Shaarli's root `.htaccess` file for Apache 2.2 syntax
27- Include assets in the release Makefile target
28
29### Removed
30
31- Firefox Social API shaare has been removed
32
7## [v0.10.0](https://github.com/shaarli/Shaarli/releases/tag/v0.10.0) - 2018-07-28 33## [v0.10.0](https://github.com/shaarli/Shaarli/releases/tag/v0.10.0) - 2018-07-28
8**PHP 5.5 compatibility has been dropped.** Shaarli now requires at least PHP 5.6. 34**PHP 5.5 compatibility has been dropped.** Shaarli now requires at least PHP 5.6.
9 35
diff --git a/Makefile b/Makefile
index b0cdadf0..56cf09b2 100644
--- a/Makefile
+++ b/Makefile
@@ -170,6 +170,7 @@ release_tar: composer_dependencies htmldoc translate build_frontend
170 git archive --prefix=$(ARCHIVE_PREFIX) -o $(ARCHIVE_VERSION).tar HEAD 170 git archive --prefix=$(ARCHIVE_PREFIX) -o $(ARCHIVE_VERSION).tar HEAD
171 tar rvf $(ARCHIVE_VERSION).tar --transform "s|^vendor|$(ARCHIVE_PREFIX)vendor|" vendor/ 171 tar rvf $(ARCHIVE_VERSION).tar --transform "s|^vendor|$(ARCHIVE_PREFIX)vendor|" vendor/
172 tar rvf $(ARCHIVE_VERSION).tar --transform "s|^doc/html|$(ARCHIVE_PREFIX)doc/html|" doc/html/ 172 tar rvf $(ARCHIVE_VERSION).tar --transform "s|^doc/html|$(ARCHIVE_PREFIX)doc/html|" doc/html/
173 tar rvf $(ARCHIVE_VERSION).tar --transform "s|^tpl|$(ARCHIVE_PREFIX)tpl|" tpl/
173 gzip $(ARCHIVE_VERSION).tar 174 gzip $(ARCHIVE_VERSION).tar
174 175
175### generate a release zip and include 3rd-party dependencies and translations 176### generate a release zip and include 3rd-party dependencies and translations
@@ -180,6 +181,8 @@ release_zip: composer_dependencies htmldoc translate build_frontend
180 zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)doc/ 181 zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)doc/
181 rsync -a vendor/ $(ARCHIVE_PREFIX)vendor/ 182 rsync -a vendor/ $(ARCHIVE_PREFIX)vendor/
182 zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)vendor/ 183 zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)vendor/
184 rsync -a tpl/ $(ARCHIVE_PREFIX)tpl/
185 zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)tpl/
183 rm -rf $(ARCHIVE_PREFIX) 186 rm -rf $(ARCHIVE_PREFIX)
184 187
185## 188##
diff --git a/README.md b/README.md
index 0c56d602..0e23e33d 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ _It is designed to be personal (single-user), fast and handy._
9[![](https://img.shields.io/badge/stable-v0.9.7-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.9.7) 9[![](https://img.shields.io/badge/stable-v0.9.7-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.9.7)
10[![](https://img.shields.io/travis/shaarli/Shaarli/stable.svg?label=stable)](https://travis-ci.org/shaarli/Shaarli) 10[![](https://img.shields.io/travis/shaarli/Shaarli/stable.svg?label=stable)](https://travis-ci.org/shaarli/Shaarli)
11&bull; 11&bull;
12[![](https://img.shields.io/badge/latest-v0.10.0-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.10.0) 12[![](https://img.shields.io/badge/latest-v0.10.2-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.10.2)
13[![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli) 13[![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli)
14&bull; 14&bull;
15[![](https://img.shields.io/badge/master-v0.10.x-blue.svg)](https://github.com/shaarli/Shaarli) 15[![](https://img.shields.io/badge/master-v0.10.x-blue.svg)](https://github.com/shaarli/Shaarli)
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
537 $order = $order === 'ASC' ? -1 : 1; 537 $order = $order === 'ASC' ? -1 : 1;
538 // Reorder array by dates. 538 // Reorder array by dates.
539 usort($this->links, function($a, $b) use ($order) { 539 usort($this->links, function($a, $b) use ($order) {
540 if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) {
541 return $a['sticky'] ? -1 : 1;
542 }
540 return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; 543 return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
541 }); 544 });
542 545
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
37 37
38 public static $PAGE_DELETELINK = 'delete_link'; 38 public static $PAGE_DELETELINK = 'delete_link';
39 39
40 public static $PAGE_PINLINK = 'pin';
41
40 public static $PAGE_EXPORT = 'export'; 42 public static $PAGE_EXPORT = 'export';
41 43
42 public static $PAGE_IMPORT = 'import'; 44 public static $PAGE_IMPORT = 'import';
@@ -146,6 +148,10 @@ class Router
146 return self::$PAGE_DELETELINK; 148 return self::$PAGE_DELETELINK;
147 } 149 }
148 150
151 if (startsWith($query, 'do='. self::$PAGE_PINLINK)) {
152 return self::$PAGE_PINLINK;
153 }
154
149 if (startsWith($query, 'do='. self::$PAGE_EXPORT)) { 155 if (startsWith($query, 'do='. self::$PAGE_EXPORT)) {
150 return self::$PAGE_EXPORT; 156 return self::$PAGE_EXPORT;
151 } 157 }
diff --git a/application/Updater.php b/application/Updater.php
index c2aa1568..5dde47cb 100644
--- a/application/Updater.php
+++ b/application/Updater.php
@@ -502,7 +502,7 @@ class Updater
502 return true; 502 return true;
503 } 503 }
504 504
505 $thumbnailsEnabled = $this->conf->get('thumbnail.enable_thumbnails', true); 505 $thumbnailsEnabled = extension_loaded('gd') && $this->conf->get('thumbnail.enable_thumbnails', true);
506 $this->conf->set('thumbnails.mode', $thumbnailsEnabled ? Thumbnailer::MODE_ALL : Thumbnailer::MODE_NONE); 506 $this->conf->set('thumbnails.mode', $thumbnailsEnabled ? Thumbnailer::MODE_ALL : Thumbnailer::MODE_NONE);
507 $this->conf->set('thumbnails.width', 125); 507 $this->conf->set('thumbnails.width', 125);
508 $this->conf->set('thumbnails.height', 90); 508 $this->conf->set('thumbnails.height', 90);
@@ -517,6 +517,26 @@ class Updater
517 517
518 return true; 518 return true;
519 } 519 }
520
521 /**
522 * Set sticky = false on all links
523 *
524 * @return bool true if the update is successful, false otherwise.
525 */
526 public function updateMethodSetSticky()
527 {
528 foreach ($this->linkDB as $key => $link) {
529 if (isset($link['sticky'])) {
530 return true;
531 }
532 $link['sticky'] = false;
533 $this->linkDB[$key] = $link;
534 }
535
536 $this->linkDB->save($this->conf->get('resource.page_cache'));
537
538 return true;
539 }
520} 540}
521 541
522/** 542/**
diff --git a/assets/default/js/base.js b/assets/default/js/base.js
index 8bf79d3e..99e03370 100644
--- a/assets/default/js/base.js
+++ b/assets/default/js/base.js
@@ -422,12 +422,12 @@ function init(description) {
422 /** 422 /**
423 * Bulk actions 423 * Bulk actions
424 */ 424 */
425 const linkCheckboxes = document.querySelectorAll('.delete-checkbox'); 425 const linkCheckboxes = document.querySelectorAll('.link-checkbox');
426 const bar = document.getElementById('actions'); 426 const bar = document.getElementById('actions');
427 [...linkCheckboxes].forEach((checkbox) => { 427 [...linkCheckboxes].forEach((checkbox) => {
428 checkbox.style.display = 'inline-block'; 428 checkbox.style.display = 'inline-block';
429 checkbox.addEventListener('click', () => { 429 checkbox.addEventListener('change', () => {
430 const linkCheckedCheckboxes = document.querySelectorAll('.delete-checkbox:checked'); 430 const linkCheckedCheckboxes = document.querySelectorAll('.link-checkbox:checked');
431 const count = [...linkCheckedCheckboxes].length; 431 const count = [...linkCheckedCheckboxes].length;
432 if (count === 0 && bar.classList.contains('open')) { 432 if (count === 0 && bar.classList.contains('open')) {
433 bar.classList.toggle('open'); 433 bar.classList.toggle('open');
@@ -444,7 +444,7 @@ function init(description) {
444 event.preventDefault(); 444 event.preventDefault();
445 445
446 const links = []; 446 const links = [];
447 const linkCheckedCheckboxes = document.querySelectorAll('.delete-checkbox:checked'); 447 const linkCheckedCheckboxes = document.querySelectorAll('.link-checkbox:checked');
448 [...linkCheckedCheckboxes].forEach((checkbox) => { 448 [...linkCheckedCheckboxes].forEach((checkbox) => {
449 links.push({ 449 links.push({
450 id: checkbox.value, 450 id: checkbox.value,
@@ -467,6 +467,25 @@ function init(description) {
467 } 467 }
468 468
469 /** 469 /**
470 * Select all button
471 */
472 const selectAllButtons = document.querySelectorAll('.select-all-button');
473 [...selectAllButtons].forEach((selectAllButton) => {
474 selectAllButton.addEventListener('click', (e) => {
475 e.preventDefault();
476 const checked = selectAllButton.classList.contains('filter-off');
477 [...selectAllButtons].forEach((selectAllButton2) => {
478 selectAllButton2.classList.toggle('filter-off');
479 selectAllButton2.classList.toggle('filter-on');
480 });
481 [...linkCheckboxes].forEach((linkCheckbox) => {
482 linkCheckbox.checked = checked;
483 linkCheckbox.dispatchEvent(new Event('change'));
484 });
485 });
486 });
487
488 /**
470 * Tag list operations 489 * Tag list operations
471 * 490 *
472 * TODO: support error code in the backend for AJAX requests 491 * TODO: support error code in the backend for AJAX requests
@@ -548,7 +567,7 @@ function init(description) {
548 event.preventDefault(); 567 event.preventDefault();
549 const block = findParent(event.target, 'div', { class: 'tag-list-item' }); 568 const block = findParent(event.target, 'div', { class: 'tag-list-item' });
550 const tag = block.getAttribute('data-tag'); 569 const tag = block.getAttribute('data-tag');
551 const refreshedToken = document.getElementById('token'); 570 const refreshedToken = document.getElementById('token').value;
552 571
553 if (confirm(`Are you sure you want to delete the tag "${tag}"?`)) { 572 if (confirm(`Are you sure you want to delete the tag "${tag}"?`)) {
554 const xhr = new XMLHttpRequest(); 573 const xhr = new XMLHttpRequest();
diff --git a/assets/default/scss/shaarli.scss b/assets/default/scss/shaarli.scss
index 6b286f1e..760d8d6a 100644
--- a/assets/default/scss/shaarli.scss
+++ b/assets/default/scss/shaarli.scss
@@ -381,8 +381,6 @@ body,
381 box-shadow: 0 1px 0 $light-shadow, 0 1px 4px $dark-shadow inset; 381 box-shadow: 0 1px 0 $light-shadow, 0 1px 4px $dark-shadow inset;
382 background: $almost-white; 382 background: $almost-white;
383 padding: 5px 5px 3px 15px; 383 padding: 5px 5px 3px 15px;
384 width: 20%;
385 height: 20px;
386 color: $dark-grey; 384 color: $dark-grey;
387} 385}
388 386
@@ -742,7 +740,7 @@ body,
742 font-size: 1em; 740 font-size: 1em;
743 } 741 }
744 742
745 .delete-checkbox { 743 .link-checkbox {
746 display: none; 744 display: none;
747 } 745 }
748} 746}
@@ -757,6 +755,14 @@ body,
757 font-size: 1.3em; 755 font-size: 1.3em;
758} 756}
759 757
758.pin-link {
759 font-size: 1.3em;
760}
761
762.pinned-link {
763 color: $blue !important;
764}
765
760.linklist-item-description { 766.linklist-item-description {
761 position: relative; 767 position: relative;
762 padding: 0 10px; 768 padding: 0 10px;
@@ -850,6 +856,10 @@ body,
850 margin: 0 7px; 856 margin: 0 7px;
851} 857}
852 858
859.ctrl-delete {
860 margin: 0 7px 0 0;
861}
862
853// 64em -> lg 863// 64em -> lg
854@media screen and (max-width: 64em) { 864@media screen and (max-width: 64em) {
855 .linklist-item-infos-url { 865 .linklist-item-infos-url {
diff --git a/composer.lock b/composer.lock
index 0f56338d..22c97fa9 100644
--- a/composer.lock
+++ b/composer.lock
@@ -8,16 +8,16 @@
8 "packages": [ 8 "packages": [
9 { 9 {
10 "name": "arthurhoaro/web-thumbnailer", 10 "name": "arthurhoaro/web-thumbnailer",
11 "version": "v1.2.1", 11 "version": "v1.3.1",
12 "source": { 12 "source": {
13 "type": "git", 13 "type": "git",
14 "url": "https://github.com/ArthurHoaro/web-thumbnailer.git", 14 "url": "https://github.com/ArthurHoaro/web-thumbnailer.git",
15 "reference": "a5a52f69e8e8f3c71fab9649e2a927e2d3f418f1" 15 "reference": "7142bd94ec93719a756a7012ebb8e1c5813c6860"
16 }, 16 },
17 "dist": { 17 "dist": {
18 "type": "zip", 18 "type": "zip",
19 "url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/a5a52f69e8e8f3c71fab9649e2a927e2d3f418f1", 19 "url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/7142bd94ec93719a756a7012ebb8e1c5813c6860",
20 "reference": "a5a52f69e8e8f3c71fab9649e2a927e2d3f418f1", 20 "reference": "7142bd94ec93719a756a7012ebb8e1c5813c6860",
21 "shasum": "" 21 "shasum": ""
22 }, 22 },
23 "require": { 23 "require": {
@@ -52,7 +52,7 @@
52 } 52 }
53 ], 53 ],
54 "description": "PHP library which will retrieve a thumbnail for any given URL", 54 "description": "PHP library which will retrieve a thumbnail for any given URL",
55 "time": "2018-07-17T10:21:14+00:00" 55 "time": "2018-08-11T12:21:52+00:00"
56 }, 56 },
57 { 57 {
58 "name": "container-interop/container-interop", 58 "name": "container-interop/container-interop",
@@ -1111,16 +1111,16 @@
1111 }, 1111 },
1112 { 1112 {
1113 "name": "phpspec/prophecy", 1113 "name": "phpspec/prophecy",
1114 "version": "1.7.6", 1114 "version": "1.8.0",
1115 "source": { 1115 "source": {
1116 "type": "git", 1116 "type": "git",
1117 "url": "https://github.com/phpspec/prophecy.git", 1117 "url": "https://github.com/phpspec/prophecy.git",
1118 "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" 1118 "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06"
1119 }, 1119 },
1120 "dist": { 1120 "dist": {
1121 "type": "zip", 1121 "type": "zip",
1122 "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", 1122 "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
1123 "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", 1123 "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
1124 "shasum": "" 1124 "shasum": ""
1125 }, 1125 },
1126 "require": { 1126 "require": {
@@ -1132,12 +1132,12 @@
1132 }, 1132 },
1133 "require-dev": { 1133 "require-dev": {
1134 "phpspec/phpspec": "^2.5|^3.2", 1134 "phpspec/phpspec": "^2.5|^3.2",
1135 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" 1135 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
1136 }, 1136 },
1137 "type": "library", 1137 "type": "library",
1138 "extra": { 1138 "extra": {
1139 "branch-alias": { 1139 "branch-alias": {
1140 "dev-master": "1.7.x-dev" 1140 "dev-master": "1.8.x-dev"
1141 } 1141 }
1142 }, 1142 },
1143 "autoload": { 1143 "autoload": {
@@ -1170,7 +1170,7 @@
1170 "spy", 1170 "spy",
1171 "stub" 1171 "stub"
1172 ], 1172 ],
1173 "time": "2018-04-18T13:57:24+00:00" 1173 "time": "2018-08-05T17:53:17+00:00"
1174 }, 1174 },
1175 { 1175 {
1176 "name": "phpunit/php-code-coverage", 1176 "name": "phpunit/php-code-coverage",
@@ -2255,16 +2255,16 @@
2255 }, 2255 },
2256 { 2256 {
2257 "name": "symfony/config", 2257 "name": "symfony/config",
2258 "version": "v3.4.13", 2258 "version": "v3.4.14",
2259 "source": { 2259 "source": {
2260 "type": "git", 2260 "type": "git",
2261 "url": "https://github.com/symfony/config.git", 2261 "url": "https://github.com/symfony/config.git",
2262 "reference": "1fffdeb349ff36a25184e5564c25289b1dbfc402" 2262 "reference": "7b08223b7f6abd859651c56bcabf900d1627d085"
2263 }, 2263 },
2264 "dist": { 2264 "dist": {
2265 "type": "zip", 2265 "type": "zip",
2266 "url": "https://api.github.com/repos/symfony/config/zipball/1fffdeb349ff36a25184e5564c25289b1dbfc402", 2266 "url": "https://api.github.com/repos/symfony/config/zipball/7b08223b7f6abd859651c56bcabf900d1627d085",
2267 "reference": "1fffdeb349ff36a25184e5564c25289b1dbfc402", 2267 "reference": "7b08223b7f6abd859651c56bcabf900d1627d085",
2268 "shasum": "" 2268 "shasum": ""
2269 }, 2269 },
2270 "require": { 2270 "require": {
@@ -2315,20 +2315,20 @@
2315 ], 2315 ],
2316 "description": "Symfony Config Component", 2316 "description": "Symfony Config Component",
2317 "homepage": "https://symfony.com", 2317 "homepage": "https://symfony.com",
2318 "time": "2018-06-19T14:02:58+00:00" 2318 "time": "2018-07-26T11:19:56+00:00"
2319 }, 2319 },
2320 { 2320 {
2321 "name": "symfony/console", 2321 "name": "symfony/console",
2322 "version": "v3.4.13", 2322 "version": "v3.4.14",
2323 "source": { 2323 "source": {
2324 "type": "git", 2324 "type": "git",
2325 "url": "https://github.com/symfony/console.git", 2325 "url": "https://github.com/symfony/console.git",
2326 "reference": "e54f84c50e3b12972e7750edfc5ca84b2284c44e" 2326 "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73"
2327 }, 2327 },
2328 "dist": { 2328 "dist": {
2329 "type": "zip", 2329 "type": "zip",
2330 "url": "https://api.github.com/repos/symfony/console/zipball/e54f84c50e3b12972e7750edfc5ca84b2284c44e", 2330 "url": "https://api.github.com/repos/symfony/console/zipball/6b217594552b9323bcdcfc14f8a0ce126e84cd73",
2331 "reference": "e54f84c50e3b12972e7750edfc5ca84b2284c44e", 2331 "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73",
2332 "shasum": "" 2332 "shasum": ""
2333 }, 2333 },
2334 "require": { 2334 "require": {
@@ -2384,20 +2384,20 @@
2384 ], 2384 ],
2385 "description": "Symfony Console Component", 2385 "description": "Symfony Console Component",
2386 "homepage": "https://symfony.com", 2386 "homepage": "https://symfony.com",
2387 "time": "2018-07-10T14:02:11+00:00" 2387 "time": "2018-07-26T11:19:56+00:00"
2388 }, 2388 },
2389 { 2389 {
2390 "name": "symfony/debug", 2390 "name": "symfony/debug",
2391 "version": "v3.4.13", 2391 "version": "v3.4.14",
2392 "source": { 2392 "source": {
2393 "type": "git", 2393 "type": "git",
2394 "url": "https://github.com/symfony/debug.git", 2394 "url": "https://github.com/symfony/debug.git",
2395 "reference": "0e3ca9cbde90fffec8038f4d4e16fd4046bbd018" 2395 "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc"
2396 }, 2396 },
2397 "dist": { 2397 "dist": {
2398 "type": "zip", 2398 "type": "zip",
2399 "url": "https://api.github.com/repos/symfony/debug/zipball/0e3ca9cbde90fffec8038f4d4e16fd4046bbd018", 2399 "url": "https://api.github.com/repos/symfony/debug/zipball/d5a058ff6ecad26b30c1ba452241306ea34c65cc",
2400 "reference": "0e3ca9cbde90fffec8038f4d4e16fd4046bbd018", 2400 "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc",
2401 "shasum": "" 2401 "shasum": ""
2402 }, 2402 },
2403 "require": { 2403 "require": {
@@ -2440,20 +2440,20 @@
2440 ], 2440 ],
2441 "description": "Symfony Debug Component", 2441 "description": "Symfony Debug Component",
2442 "homepage": "https://symfony.com", 2442 "homepage": "https://symfony.com",
2443 "time": "2018-06-26T08:45:54+00:00" 2443 "time": "2018-07-26T11:19:56+00:00"
2444 }, 2444 },
2445 { 2445 {
2446 "name": "symfony/dependency-injection", 2446 "name": "symfony/dependency-injection",
2447 "version": "v3.4.13", 2447 "version": "v3.4.14",
2448 "source": { 2448 "source": {
2449 "type": "git", 2449 "type": "git",
2450 "url": "https://github.com/symfony/dependency-injection.git", 2450 "url": "https://github.com/symfony/dependency-injection.git",
2451 "reference": "3f115cc3aae4d320b26db05e9531f4e32da29b89" 2451 "reference": "1c0e679e522591fd744fdf242fec41a43d62b2b1"
2452 }, 2452 },
2453 "dist": { 2453 "dist": {
2454 "type": "zip", 2454 "type": "zip",
2455 "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3f115cc3aae4d320b26db05e9531f4e32da29b89", 2455 "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1c0e679e522591fd744fdf242fec41a43d62b2b1",
2456 "reference": "3f115cc3aae4d320b26db05e9531f4e32da29b89", 2456 "reference": "1c0e679e522591fd744fdf242fec41a43d62b2b1",
2457 "shasum": "" 2457 "shasum": ""
2458 }, 2458 },
2459 "require": { 2459 "require": {
@@ -2511,20 +2511,20 @@
2511 ], 2511 ],
2512 "description": "Symfony DependencyInjection Component", 2512 "description": "Symfony DependencyInjection Component",
2513 "homepage": "https://symfony.com", 2513 "homepage": "https://symfony.com",
2514 "time": "2018-07-16T13:57:19+00:00" 2514 "time": "2018-07-29T15:19:31+00:00"
2515 }, 2515 },
2516 { 2516 {
2517 "name": "symfony/filesystem", 2517 "name": "symfony/filesystem",
2518 "version": "v3.4.13", 2518 "version": "v3.4.14",
2519 "source": { 2519 "source": {
2520 "type": "git", 2520 "type": "git",
2521 "url": "https://github.com/symfony/filesystem.git", 2521 "url": "https://github.com/symfony/filesystem.git",
2522 "reference": "8dab220fec8fc904821485326b29a6c670286124" 2522 "reference": "a59f917e3c5d82332514cb4538387638f5bde2d6"
2523 }, 2523 },
2524 "dist": { 2524 "dist": {
2525 "type": "zip", 2525 "type": "zip",
2526 "url": "https://api.github.com/repos/symfony/filesystem/zipball/8dab220fec8fc904821485326b29a6c670286124", 2526 "url": "https://api.github.com/repos/symfony/filesystem/zipball/a59f917e3c5d82332514cb4538387638f5bde2d6",
2527 "reference": "8dab220fec8fc904821485326b29a6c670286124", 2527 "reference": "a59f917e3c5d82332514cb4538387638f5bde2d6",
2528 "shasum": "" 2528 "shasum": ""
2529 }, 2529 },
2530 "require": { 2530 "require": {
@@ -2561,20 +2561,20 @@
2561 ], 2561 ],
2562 "description": "Symfony Filesystem Component", 2562 "description": "Symfony Filesystem Component",
2563 "homepage": "https://symfony.com", 2563 "homepage": "https://symfony.com",
2564 "time": "2018-07-09T13:25:43+00:00" 2564 "time": "2018-07-26T11:19:56+00:00"
2565 }, 2565 },
2566 { 2566 {
2567 "name": "symfony/finder", 2567 "name": "symfony/finder",
2568 "version": "v3.4.13", 2568 "version": "v3.4.14",
2569 "source": { 2569 "source": {
2570 "type": "git", 2570 "type": "git",
2571 "url": "https://github.com/symfony/finder.git", 2571 "url": "https://github.com/symfony/finder.git",
2572 "reference": "3a8c3de91d2b2c68cd2d665cf9d00f7ef9eaa394" 2572 "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a"
2573 }, 2573 },
2574 "dist": { 2574 "dist": {
2575 "type": "zip", 2575 "type": "zip",
2576 "url": "https://api.github.com/repos/symfony/finder/zipball/3a8c3de91d2b2c68cd2d665cf9d00f7ef9eaa394", 2576 "url": "https://api.github.com/repos/symfony/finder/zipball/8a84fcb207451df0013b2c74cbbf1b62d47b999a",
2577 "reference": "3a8c3de91d2b2c68cd2d665cf9d00f7ef9eaa394", 2577 "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a",
2578 "shasum": "" 2578 "shasum": ""
2579 }, 2579 },
2580 "require": { 2580 "require": {
@@ -2610,29 +2610,32 @@
2610 ], 2610 ],
2611 "description": "Symfony Finder Component", 2611 "description": "Symfony Finder Component",
2612 "homepage": "https://symfony.com", 2612 "homepage": "https://symfony.com",
2613 "time": "2018-06-19T20:52:10+00:00" 2613 "time": "2018-07-26T11:19:56+00:00"
2614 }, 2614 },
2615 { 2615 {
2616 "name": "symfony/polyfill-ctype", 2616 "name": "symfony/polyfill-ctype",
2617 "version": "v1.8.0", 2617 "version": "v1.9.0",
2618 "source": { 2618 "source": {
2619 "type": "git", 2619 "type": "git",
2620 "url": "https://github.com/symfony/polyfill-ctype.git", 2620 "url": "https://github.com/symfony/polyfill-ctype.git",
2621 "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" 2621 "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
2622 }, 2622 },
2623 "dist": { 2623 "dist": {
2624 "type": "zip", 2624 "type": "zip",
2625 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", 2625 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
2626 "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", 2626 "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
2627 "shasum": "" 2627 "shasum": ""
2628 }, 2628 },
2629 "require": { 2629 "require": {
2630 "php": ">=5.3.3" 2630 "php": ">=5.3.3"
2631 }, 2631 },
2632 "suggest": {
2633 "ext-ctype": "For best performance"
2634 },
2632 "type": "library", 2635 "type": "library",
2633 "extra": { 2636 "extra": {
2634 "branch-alias": { 2637 "branch-alias": {
2635 "dev-master": "1.8-dev" 2638 "dev-master": "1.9-dev"
2636 } 2639 }
2637 }, 2640 },
2638 "autoload": { 2641 "autoload": {
@@ -2665,20 +2668,20 @@
2665 "polyfill", 2668 "polyfill",
2666 "portable" 2669 "portable"
2667 ], 2670 ],
2668 "time": "2018-04-30T19:57:29+00:00" 2671 "time": "2018-08-06T14:22:27+00:00"
2669 }, 2672 },
2670 { 2673 {
2671 "name": "symfony/polyfill-mbstring", 2674 "name": "symfony/polyfill-mbstring",
2672 "version": "v1.8.0", 2675 "version": "v1.9.0",
2673 "source": { 2676 "source": {
2674 "type": "git", 2677 "type": "git",
2675 "url": "https://github.com/symfony/polyfill-mbstring.git", 2678 "url": "https://github.com/symfony/polyfill-mbstring.git",
2676 "reference": "3296adf6a6454a050679cde90f95350ad604b171" 2679 "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
2677 }, 2680 },
2678 "dist": { 2681 "dist": {
2679 "type": "zip", 2682 "type": "zip",
2680 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", 2683 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
2681 "reference": "3296adf6a6454a050679cde90f95350ad604b171", 2684 "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
2682 "shasum": "" 2685 "shasum": ""
2683 }, 2686 },
2684 "require": { 2687 "require": {
@@ -2690,7 +2693,7 @@
2690 "type": "library", 2693 "type": "library",
2691 "extra": { 2694 "extra": {
2692 "branch-alias": { 2695 "branch-alias": {
2693 "dev-master": "1.8-dev" 2696 "dev-master": "1.9-dev"
2694 } 2697 }
2695 }, 2698 },
2696 "autoload": { 2699 "autoload": {
@@ -2724,20 +2727,20 @@
2724 "portable", 2727 "portable",
2725 "shim" 2728 "shim"
2726 ], 2729 ],
2727 "time": "2018-04-26T10:06:28+00:00" 2730 "time": "2018-08-06T14:22:27+00:00"
2728 }, 2731 },
2729 { 2732 {
2730 "name": "symfony/yaml", 2733 "name": "symfony/yaml",
2731 "version": "v3.4.13", 2734 "version": "v3.4.14",
2732 "source": { 2735 "source": {
2733 "type": "git", 2736 "type": "git",
2734 "url": "https://github.com/symfony/yaml.git", 2737 "url": "https://github.com/symfony/yaml.git",
2735 "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0" 2738 "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2"
2736 }, 2739 },
2737 "dist": { 2740 "dist": {
2738 "type": "zip", 2741 "type": "zip",
2739 "url": "https://api.github.com/repos/symfony/yaml/zipball/c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", 2742 "url": "https://api.github.com/repos/symfony/yaml/zipball/810af2d35fc72b6cf5c01116806d2b65ccaaf2e2",
2740 "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", 2743 "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2",
2741 "shasum": "" 2744 "shasum": ""
2742 }, 2745 },
2743 "require": { 2746 "require": {
@@ -2783,7 +2786,7 @@
2783 ], 2786 ],
2784 "description": "Symfony Yaml Component", 2787 "description": "Symfony Yaml Component",
2785 "homepage": "https://symfony.com", 2788 "homepage": "https://symfony.com",
2786 "time": "2018-05-03T23:18:14+00:00" 2789 "time": "2018-07-26T11:19:56+00:00"
2787 }, 2790 },
2788 { 2791 {
2789 "name": "theseer/fdomdocument", 2792 "name": "theseer/fdomdocument",
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 @@
1{% extends "base.html" %}
2
3{#
4The entry point for the ReadTheDocs Theme.
5
6Any theme customisations should override this file to redefine blocks defined in
7the various templates. The custom theme should only need to define a main.html
8which `{% extends "base.html" %}` and defines various blocks which will replace
9the blocks defined in base.html and its included child templates.
10#}
11
12{%- block site_meta %}
13<meta charset="utf-8">
14<meta http-equiv="X-UA-Compatible" content="IE=edge">
15<meta name="viewport" content="width=device-width, initial-scale=1.0">
16
17{%- if 'media.readthedocs.org' not in config.extra_css[0] %}
18<meta name="robots" content="noindex, nofollow">
19{%- endif %}
20
21{% if page and page.is_homepage %}<meta name="description" content="{{ config.site_description }}">{% endif %}
22{% if config.site_author %}<meta name="author" content="{{ config.site_author }}">{% endif %}
23{% if config.site_favicon %}<link rel="shortcut icon" href="{{ config.site_favicon|url }}">
24{% else %}<link rel="shortcut icon" href="{{ 'img/favicon.ico'|url }}">{% endif %}
25{%- 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 {
397``` 397```
398 398
399## Proxies 399## Proxies
400
400If 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: 401If 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:
401 402
402- `X-Forwarded-Proto` 403- `X-Forwarded-Proto`
@@ -405,6 +406,12 @@ If Shaarli is served behind a proxy (i.e. there is a proxy server between client
405 406
406See also [proxy-related](https://github.com/shaarli/Shaarli/issues?utf8=%E2%9C%93&q=label%3Aproxy+) issues. 407See also [proxy-related](https://github.com/shaarli/Shaarli/issues?utf8=%E2%9C%93&q=label%3Aproxy+) issues.
407 408
409## Robots and crawlers
410
411Shaarli disallows indexing and crawling of your local documentation pages by search engines, using `<meta name="robots">` HTML tags.
412Your Shaarli instance and other pages you host may still be indexed by various robots on the public Internet.
413You may want to setup a robots.txt file or other crawler control mechanism on your server.
414See [[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)
408 415
409## See also 416## See also
410 417
diff --git a/inc/languages/fr/LC_MESSAGES/shaarli.po b/inc/languages/fr/LC_MESSAGES/shaarli.po
index 155eb52e..102c80da 100644
--- a/inc/languages/fr/LC_MESSAGES/shaarli.po
+++ b/inc/languages/fr/LC_MESSAGES/shaarli.po
@@ -1,15 +1,15 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: Shaarli\n" 3"Project-Id-Version: Shaarli\n"
4"POT-Creation-Date: 2018-07-17 13:04+0200\n" 4"POT-Creation-Date: 2018-10-06 13:08+0200\n"
5"PO-Revision-Date: 2018-07-17 13:07+0200\n" 5"PO-Revision-Date: 2018-10-06 13:08+0200\n"
6"Last-Translator: \n" 6"Last-Translator: \n"
7"Language-Team: Shaarli\n" 7"Language-Team: Shaarli\n"
8"Language: fr_FR\n" 8"Language: fr_FR\n"
9"MIME-Version: 1.0\n" 9"MIME-Version: 1.0\n"
10"Content-Type: text/plain; charset=UTF-8\n" 10"Content-Type: text/plain; charset=UTF-8\n"
11"Content-Transfer-Encoding: 8bit\n" 11"Content-Transfer-Encoding: 8bit\n"
12"X-Generator: Poedit 2.0.9\n" 12"X-Generator: Poedit 2.1.1\n"
13"X-Poedit-Basepath: ../../../..\n" 13"X-Poedit-Basepath: ../../../..\n"
14"Plural-Forms: nplurals=2; plural=(n > 1);\n" 14"Plural-Forms: nplurals=2; plural=(n > 1);\n"
15"X-Poedit-SourceCharset: UTF-8\n" 15"X-Poedit-SourceCharset: UTF-8\n"
@@ -48,7 +48,7 @@ msgstr "le fichier n'est pas accessible en écriture"
48#: application/Cache.php:16 48#: application/Cache.php:16
49#, php-format 49#, php-format
50msgid "Cannot purge %s: no directory" 50msgid "Cannot purge %s: no directory"
51msgstr "Impossible de purger %s: le répertoire n'existe pas" 51msgstr "Impossible de purger %s : le répertoire n'existe pas"
52 52
53#: application/FeedBuilder.php:151 53#: application/FeedBuilder.php:151
54msgid "Direct link" 54msgid "Direct link"
@@ -98,17 +98,15 @@ msgstr "Vous devez utiliser un entier comme clé."
98 98
99#: application/LinkDB.php:145 99#: application/LinkDB.php:145
100msgid "Array offset and link ID must be equal." 100msgid "Array offset and link ID must be equal."
101msgstr "La clé du tableau et l'ID du lien doivent être égaux." 101msgstr "La clé du tableau et l'ID du lien doivent être identiques."
102 102
103#: application/LinkDB.php:251 103#: application/LinkDB.php:251
104#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
105#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
106#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14 104#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14
107#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 105#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
108msgid "" 106msgid ""
109"The personal, minimalist, super-fast, database free, bookmarking service" 107"The personal, minimalist, super-fast, database free, bookmarking service"
110msgstr "" 108msgstr ""
111"Le gestionnaire de marque-page personnel, minimaliste, et sans base de " 109"Le gestionnaire de marque-pages personnel, minimaliste, et sans base de "
112"données" 110"données"
113 111
114#: application/LinkDB.php:253 112#: application/LinkDB.php:253
@@ -125,11 +123,11 @@ msgstr ""
125"Bienvenue sur Shaarli ! Ceci est votre premier marque-page public. Pour me " 123"Bienvenue sur Shaarli ! Ceci est votre premier marque-page public. Pour me "
126"modifier ou me supprimer, vous devez d'abord vous connecter.\n" 124"modifier ou me supprimer, vous devez d'abord vous connecter.\n"
127"\n" 125"\n"
128"Pour apprendre comment utiliser Shaarli, consultez le lien « Documentation » " 126"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » en "
129"en bas de page.\n" 127"bas de page.\n"
130"\n" 128"\n"
131"Vous utilisez la version supportée par la communauté du projet original " 129"Vous utilisez la version supportée par la communauté du projet original "
132"Shaarli, de Sébastien Sauvage." 130"Shaarli de Sébastien Sauvage."
133 131
134#: application/LinkDB.php:267 132#: application/LinkDB.php:267
135msgid "My secret stuff... - Pastebin.com" 133msgid "My secret stuff... - Pastebin.com"
@@ -185,14 +183,14 @@ msgid ""
185"php-gd extension must be loaded to use thumbnails. Thumbnails are now " 183"php-gd extension must be loaded to use thumbnails. Thumbnails are now "
186"disabled. Please reload the page." 184"disabled. Please reload the page."
187msgstr "" 185msgstr ""
188"php-gd extension must be loaded to use thumbnails. Thumbnails are now " 186"l'extension php-gd doit être chargée pour utiliser les miniatures. Les "
189"disabled. Please reload the page." 187"miniatures sont désormais désactivées. Rechargez la page."
190 188
191#: application/Updater.php:86 189#: application/Updater.php:86
192msgid "Couldn't retrieve Updater class methods." 190msgid "Couldn't retrieve Updater class methods."
193msgstr "Impossible de récupérer les méthodes de la classe Updater." 191msgstr "Impossible de récupérer les méthodes de la classe Updater."
194 192
195#: application/Updater.php:514 index.php:1023 193#: application/Updater.php:514 index.php:1022
196msgid "" 194msgid ""
197"You have enabled or changed thumbnails mode. <a href=\"?do=thumbs_update" 195"You have enabled or changed thumbnails mode. <a href=\"?do=thumbs_update"
198"\">Please synchronize them</a>." 196"\">Please synchronize them</a>."
@@ -200,17 +198,17 @@ msgstr ""
200"Vous avez activé ou changé le mode de miniatures. <a href=\"?do=thumbs_update" 198"Vous avez activé ou changé le mode de miniatures. <a href=\"?do=thumbs_update"
201"\">Merci de les synchroniser</a>." 199"\">Merci de les synchroniser</a>."
202 200
203#: application/Updater.php:566 201#: application/Updater.php:586
204msgid "An error occurred while running the update " 202msgid "An error occurred while running the update "
205msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour " 203msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour "
206 204
207#: application/Updater.php:606 205#: application/Updater.php:626
208msgid "Updates file path is not set, can't write updates." 206msgid "Updates file path is not set, can't write updates."
209msgstr "" 207msgstr ""
210"Le chemin vers le fichier de mise à jour n'est pas défini, impossible " 208"Le chemin vers le fichier de mise à jour n'est pas défini, impossible "
211"d'écrire les mises à jour." 209"d'écrire les mises à jour."
212 210
213#: application/Updater.php:611 211#: application/Updater.php:631
214msgid "Unable to write updates in " 212msgid "Unable to write updates in "
215msgstr "Impossible d'écrire les mises à jour dans " 213msgstr "Impossible d'écrire les mises à jour dans "
216 214
@@ -286,74 +284,66 @@ msgstr "NON. Vous êtes banni pour le moment. Revenez plus tard."
286 284
287#: index.php:273 285#: index.php:273
288msgid "Wrong login/password." 286msgid "Wrong login/password."
289msgstr "Nom d'utilisateur ou mot de passe incorrects." 287msgstr "Nom d'utilisateur ou mot de passe incorrect(s)."
290 288
291#: index.php:483 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 289#: index.php:482 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46
292#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46
293msgid "Daily" 290msgid "Daily"
294msgstr "Quotidien" 291msgstr "Quotidien"
295 292
296#: index.php:589 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 293#: index.php:588 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
297#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 294#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
298#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75
299#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99
300#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:75 295#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:75
301#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:99 296#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:99
302msgid "Login" 297msgid "Login"
303msgstr "Connexion" 298msgstr "Connexion"
304 299
305#: index.php:606 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 300#: index.php:605 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41
306#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41
307msgid "Picture wall" 301msgid "Picture wall"
308msgstr "Mur d'images" 302msgstr "Mur d'images"
309 303
310#: index.php:683 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 304#: index.php:682 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36
311#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36
312#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 305#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
313msgid "Tag cloud" 306msgid "Tag cloud"
314msgstr "Nuage de tags" 307msgstr "Nuage de tags"
315 308
316#: index.php:716 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 309#: index.php:715 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
317msgid "Tag list" 310msgid "Tag list"
318msgstr "Liste des tags" 311msgstr "Liste des tags"
319 312
320#: index.php:941 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31 313#: index.php:940 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31
321#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31
322msgid "Tools" 314msgid "Tools"
323msgstr "Outils" 315msgstr "Outils"
324 316
325#: index.php:950 317#: index.php:949
326msgid "You are not supposed to change a password on an Open Shaarli." 318msgid "You are not supposed to change a password on an Open Shaarli."
327msgstr "" 319msgstr ""
328"Vous n'êtes pas censé modifier le mot de passe d'un Shaarli en mode ouvert." 320"Vous n'êtes pas censé modifier le mot de passe d'un Shaarli en mode ouvert."
329 321
330#: index.php:955 index.php:997 index.php:1085 index.php:1116 index.php:1221 322#: index.php:954 index.php:996 index.php:1084 index.php:1116 index.php:1221
331msgid "Wrong token." 323msgid "Wrong token."
332msgstr "Jeton invalide." 324msgstr "Jeton invalide."
333 325
334#: index.php:960 326#: index.php:959
335msgid "The old password is not correct." 327msgid "The old password is not correct."
336msgstr "L'ancien mot de passe est incorrect." 328msgstr "L'ancien mot de passe est incorrect."
337 329
338#: index.php:980 330#: index.php:979
339msgid "Your password has been changed" 331msgid "Your password has been changed"
340msgstr "Votre mot de passe a été modifié" 332msgstr "Votre mot de passe a été modifié"
341 333
342#: index.php:985 334#: index.php:984 tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
343#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
344#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
345msgid "Change password" 335msgid "Change password"
346msgstr "Modification du mot de passe" 336msgstr "Modifier le mot de passe"
347 337
348#: index.php:1043 338#: index.php:1042
349msgid "Configuration was saved." 339msgid "Configuration was saved."
350msgstr "La configuration a été sauvegardé." 340msgstr "La configuration a été sauvegardée."
351 341
352#: index.php:1068 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 342#: index.php:1067 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
353msgid "Configure" 343msgid "Configure"
354msgstr "Configurer" 344msgstr "Configurer"
355 345
356#: index.php:1079 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 346#: index.php:1078 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
357#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 347#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
358msgid "Manage tags" 348msgid "Manage tags"
359msgstr "Gérer les tags" 349msgstr "Gérer les tags"
@@ -381,7 +371,6 @@ msgid "Edit"
381msgstr "Modifier" 371msgstr "Modifier"
382 372
383#: index.php:1281 index.php:1351 373#: index.php:1281 index.php:1351
384#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
385#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26 374#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26
386msgid "Shaare" 375msgid "Shaare"
387msgstr "Shaare" 376msgstr "Shaare"
@@ -390,15 +379,19 @@ msgstr "Shaare"
390msgid "Note: " 379msgid "Note: "
391msgstr "Note : " 380msgstr "Note : "
392 381
393#: index.php:1360 tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65 382#: index.php:1359
383msgid "Invalid link ID provided"
384msgstr ""
385
386#: index.php:1379
394msgid "Export" 387msgid "Export"
395msgstr "Exporter" 388msgstr "Exporter"
396 389
397#: index.php:1422 tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83 390#: index.php:1441
398msgid "Import" 391msgid "Import"
399msgstr "Importer" 392msgstr "Importer"
400 393
401#: index.php:1432 394#: index.php:1451
402#, php-format 395#, php-format
403msgid "" 396msgid ""
404"The file you are trying to upload is probably bigger than what this " 397"The file you are trying to upload is probably bigger than what this "
@@ -408,20 +401,20 @@ msgstr ""
408"le serveur web peut accepter (%s). Merci de l'envoyer en parties plus " 401"le serveur web peut accepter (%s). Merci de l'envoyer en parties plus "
409"légères." 402"légères."
410 403
411#: index.php:1471 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 404#: index.php:1490 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
412#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22 405#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
413msgid "Plugin administration" 406msgid "Plugin administration"
414msgstr "Administration des extensions" 407msgstr "Administration des plugins"
415 408
416#: index.php:1523 tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 409#: index.php:1542 tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
417msgid "Thumbnails update" 410msgid "Thumbnails update"
418msgstr "Mise à jour des miniatures" 411msgstr "Mise à jour des miniatures"
419 412
420#: index.php:1695 413#: index.php:1714
421msgid "Search: " 414msgid "Search: "
422msgstr "Recherche : " 415msgstr "Recherche : "
423 416
424#: index.php:1735 417#: index.php:1754
425#, php-format 418#, php-format
426msgid "" 419msgid ""
427"<pre>Sessions do not seem to work correctly on your server.<br>Make sure the " 420"<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
@@ -431,16 +424,16 @@ msgid ""
431"custom hostname without a dot causes cookie storage to fail. We recommend " 424"custom hostname without a dot causes cookie storage to fail. We recommend "
432"accessing your server via it's IP address or Fully Qualified Domain Name.<br>" 425"accessing your server via it's IP address or Fully Qualified Domain Name.<br>"
433msgstr "" 426msgstr ""
434"<pre>Les sesssions ne semble pas fonctionner sur ce serveur.<br>Assurez vous " 427"<pre>Les sesssions ne semblent pas fonctionner sur ce serveur.<br>Assurez "
435"que la variable « session.save_path » est correctement définie dans votre " 428"vous que la variable « session.save_path » est correctement définie dans "
436"fichier de configuration PHP, et que vous y avez les droits d'écriture." 429"votre fichier de configuration PHP, et que vous avez les droits d'écriture "
437"<br>Ce paramètre pointe actuellement sur %s.<br>Sur certains navigateurs, " 430"dessus.<br>Ce paramètre pointe actuellement sur %s.<br>Sur certains "
438"accéder à votre serveur depuis un nom d'hôte comme « localhost » ou autre " 431"navigateurs, accéder à votre serveur depuis un nom d'hôte comme « localhost "
439"nom personnalisé sans point '.' entraine l'échec de la sauvegarde des " 432"» ou autre nom personnalisé sans point '.' entraine l'échec de la sauvegarde "
440"cookies. Nous vous recommandons d'accéder à votre serveur depuis son adresse " 433"des cookies. Nous vous recommandons d'accéder à votre serveur depuis son "
441"IP ou un <em>Fully Qualified Domain Name</em>.<br>" 434"adresse IP ou un <em>Fully Qualified Domain Name</em>.<br>"
442 435
443#: index.php:1745 436#: index.php:1764
444msgid "Click to try again." 437msgid "Click to try again."
445msgstr "Cliquer ici pour réessayer." 438msgstr "Cliquer ici pour réessayer."
446 439
@@ -455,7 +448,7 @@ msgstr "Shaare"
455 448
456#: plugins/addlink_toolbar/addlink_toolbar.php:50 449#: plugins/addlink_toolbar/addlink_toolbar.php:50
457msgid "Adds the addlink input on the linklist page." 450msgid "Adds the addlink input on the linklist page."
458msgstr "Ajout le formulaire d'ajout de liens sur la page principale." 451msgstr "Ajoute le formulaire d'ajout de liens sur la page principale."
459 452
460#: plugins/archiveorg/archiveorg.php:23 453#: plugins/archiveorg/archiveorg.php:23
461msgid "View on archive.org" 454msgid "View on archive.org"
@@ -471,7 +464,7 @@ msgid ""
471"developers." 464"developers."
472msgstr "" 465msgstr ""
473"Une extension de démonstration couvrant tous les cas d'utilisation pour les " 466"Une extension de démonstration couvrant tous les cas d'utilisation pour les "
474"designers et les développeurs." 467"designers de thèmes et les développeurs d'extensions."
475 468
476#: plugins/isso/isso.php:20 469#: plugins/isso/isso.php:20
477msgid "" 470msgid ""
@@ -481,12 +474,13 @@ msgstr ""
481"Erreur de l'extension Isso : Merci de définir le paramètre « ISSO_SERVER » " 474"Erreur de l'extension Isso : Merci de définir le paramètre « ISSO_SERVER » "
482"dans la page d'administration des extensions." 475"dans la page d'administration des extensions."
483 476
484#: plugins/isso/isso.php:63 477#: plugins/isso/isso.php:90
485msgid "Let visitor comment your shaares on permalinks with Isso." 478msgid "Let visitor comment your shaares on permalinks with Isso."
486msgstr "" 479msgstr ""
487"Permet aux visiteurs de commenter vos shaares sur les permaliens avec Isso." 480"Permettre aux visiteurs de commenter vos shaares sur les permaliens avec "
481"Isso."
488 482
489#: plugins/isso/isso.php:64 483#: plugins/isso/isso.php:91
490msgid "Isso server URL (without 'http://')" 484msgid "Isso server URL (without 'http://')"
491msgstr "URL du serveur Isso (sans 'http://')" 485msgstr "URL du serveur Isso (sans 'http://')"
492 486
@@ -578,7 +572,7 @@ msgstr "Active la publication de flux vers PubSubHubbub."
578 572
579#: plugins/qrcode/qrcode.php:69 plugins/wallabag/wallabag.php:68 573#: plugins/qrcode/qrcode.php:69 plugins/wallabag/wallabag.php:68
580msgid "For each link, add a QRCode icon." 574msgid "For each link, add a QRCode icon."
581msgstr "Pour chaque liens, ajouter une icône de QRCode." 575msgstr "Pour chaque lien, ajouter une icône de QRCode."
582 576
583#: plugins/wallabag/wallabag.php:21 577#: plugins/wallabag/wallabag.php:21
584msgid "" 578msgid ""
@@ -603,35 +597,17 @@ msgstr "Version de l'API Wallabag (1 ou 2)"
603#: tests/LanguagesTest.php:214 tests/LanguagesTest.php:227 597#: tests/LanguagesTest.php:214 tests/LanguagesTest.php:227
604#: tests/languages/fr/LanguagesFrTest.php:160 598#: tests/languages/fr/LanguagesFrTest.php:160
605#: tests/languages/fr/LanguagesFrTest.php:173 599#: tests/languages/fr/LanguagesFrTest.php:173
606#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:85
607#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:85 600#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:85
608msgid "Search" 601msgid "Search"
609msgid_plural "Search" 602msgid_plural "Search"
610msgstr[0] "Rechercher" 603msgstr[0] "Rechercher"
611msgstr[1] "Rechercher" 604msgstr[1] "Rechercher"
612 605
613#: tmp/404.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12
614msgid "Sorry, nothing to see here."
615msgstr "Désolé, il y a rien à voir ici."
616
617#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 606#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
618msgid "URL or leave empty to post a note" 607msgid "URL or leave empty to post a note"
619msgstr "URL ou laisser vide pour créer une note" 608msgstr "URL ou laisser vide pour créer une note"
620 609
621#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
622msgid "Current password"
623msgstr "Mot de passe actuel"
624
625#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
626msgid "New password"
627msgstr "Nouveau mot de passe"
628
629#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
630msgid "Change"
631msgstr "Changer"
632
633#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 610#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
634#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
635msgid "Tag" 611msgid "Tag"
636msgstr "Tag" 612msgstr "Tag"
637 613
@@ -661,6 +637,34 @@ msgstr "Vous pouvez aussi modifier les tags dans la"
661msgid "tag list" 637msgid "tag list"
662msgstr "liste des tags" 638msgstr "liste des tags"
663 639
640#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:143
641#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:296
642msgid "All"
643msgstr "Tous"
644
645#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:147
646#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:300
647msgid "Only common media hosts"
648msgstr "Seulement les hébergeurs de média connus"
649
650#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:151
651#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:304
652msgid "None"
653msgstr "Aucune"
654
655#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:158
656#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281
657msgid "You need to enable the extension <code>php-gd</code> to use thumbnails."
658msgstr ""
659"Vous devez activer l'extension <code>php-gd</code> pour utiliser les "
660"miniatures."
661
662#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:162
663#, fuzzy
664#| msgid "Enable thumbnails"
665msgid "Synchonize thumbnails"
666msgstr "Activer les miniatures"
667
664#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 668#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
665msgid "title" 669msgid "title"
666msgstr "titre" 670msgstr "titre"
@@ -678,22 +682,18 @@ msgid "Theme"
678msgstr "Thème" 682msgstr "Thème"
679 683
680#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:87 684#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:87
681#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:78
682msgid "Language" 685msgid "Language"
683msgstr "Langue" 686msgstr "Langue"
684 687
685#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:116 688#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:116
686#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
687msgid "Timezone" 689msgid "Timezone"
688msgstr "Fuseau horaire" 690msgstr "Fuseau horaire"
689 691
690#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117 692#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
691#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103
692msgid "Continent" 693msgid "Continent"
693msgstr "Continent" 694msgstr "Continent"
694 695
695#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117 696#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
696#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103
697msgid "City" 697msgid "City"
698msgstr "Ville" 698msgstr "Ville"
699 699
@@ -734,25 +734,21 @@ msgid "Do not show any links if the user is not logged in"
734msgstr "N'afficher aucun lien sans être connecté" 734msgstr "N'afficher aucun lien sans être connecté"
735 735
736#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:231 736#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:231
737#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:150
738msgid "Check updates" 737msgid "Check updates"
739msgstr "Vérifier les mises à jour" 738msgstr "Vérifier les mises à jour"
740 739
741#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:232 740#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:232
742#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152
743msgid "Notify me when a new release is ready" 741msgid "Notify me when a new release is ready"
744msgstr "Me notifier lorsqu'une nouvelle version est disponible" 742msgstr "Me notifier lorsqu'une nouvelle version est disponible"
745 743
746#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:247 744#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:247
747#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
748msgid "Enable REST API" 745msgid "Enable REST API"
749msgstr "Activer l'API REST" 746msgstr "Activer l'API REST"
750 747
751#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:248 748#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:248
752#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:170
753msgid "Allow third party software to use Shaarli such as mobile application" 749msgid "Allow third party software to use Shaarli such as mobile application"
754msgstr "" 750msgstr ""
755"Permets aux applications tierces d'utiliser Shaarli, par exemple les " 751"Permet aux applications tierces d'utiliser Shaarli, par exemple les "
756"applications mobiles" 752"applications mobiles"
757 753
758#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:263 754#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:263
@@ -763,30 +759,11 @@ msgstr "Clé d'API secrète"
763msgid "Enable thumbnails" 759msgid "Enable thumbnails"
764msgstr "Activer les miniatures" 760msgstr "Activer les miniatures"
765 761
766#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281
767msgid "You need to enable the extension <code>php-gd</code> to use thumbnails."
768msgstr ""
769"Vous devez activer l'extension <code>php-gd</code> pour utiliser les "
770"miniatures."
771
772#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:285 762#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:285
773#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:56 763#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:56
774msgid "Synchronize thumbnails" 764msgid "Synchronize thumbnails"
775msgstr "Synchroniser les miniatures" 765msgstr "Synchroniser les miniatures"
776 766
777#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:296
778#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
779msgid "All"
780msgstr "Tous"
781
782#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:300
783msgid "Only common media hosts"
784msgstr "Seulement les hébergeurs de média connus"
785
786#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:304
787msgid "None"
788msgstr "Aucune"
789
790#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:312 767#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:312
791#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 768#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
792#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 769#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
@@ -847,107 +824,13 @@ msgid "Tags"
847msgstr "Tags" 824msgstr "Tags"
848 825
849#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57 826#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57
850#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
851#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:167 827#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:167
852msgid "Private" 828msgid "Private"
853msgstr "Privé" 829msgstr "Privé"
854 830
855#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 831#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
856msgid "Apply Changes" 832msgid "Apply Changes"
857msgstr "Appliquer" 833msgstr "Appliquer les changements"
858
859#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
860msgid "Export Database"
861msgstr "Exporter les données"
862
863#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
864msgid "Selection"
865msgstr "Choisir"
866
867#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
868msgid "Public"
869msgstr "Publics"
870
871#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:52
872msgid "Prepend note permalinks with this Shaarli instance's URL"
873msgstr "Préfixer les liens de notes avec l'URL de l'instance de Shaarli"
874
875#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53
876msgid "Useful to import bookmarks in a web browser"
877msgstr "Utile pour importer les marques-pages dans un navigateur"
878
879#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
880msgid "Import Database"
881msgstr "Importer des données"
882
883#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
884msgid "Maximum size allowed:"
885msgstr "Taille maximum autorisée :"
886
887#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
888msgid "Visibility"
889msgstr "Visibilité"
890
891#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
892msgid "Use values from the imported file, default to public"
893msgstr ""
894"Utiliser les valeurs présentes dans le fichier d'import, public par défaut"
895
896#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
897msgid "Import all bookmarks as private"
898msgstr "Importer tous les liens comme privés"
899
900#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
901msgid "Import all bookmarks as public"
902msgstr "Importer tous les liens comme publics"
903
904#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57
905msgid "Overwrite existing bookmarks"
906msgstr "Remplacer les liens existants"
907
908#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
909msgid "Duplicates based on URL"
910msgstr "Les doublons s'appuient sur les URL"
911
912#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
913msgid "Add default tags"
914msgstr "Ajouter des tags par défaut"
915
916#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
917msgid "Install Shaarli"
918msgstr "Installation de Shaarli"
919
920#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
921msgid "It looks like it's the first time you run Shaarli. Please configure it."
922msgstr ""
923"Il semblerait que ça soit la première fois que vous lancez Shaarli. Merci de "
924"le configurer."
925
926#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33
927#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
928#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:151
929#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151
930msgid "Username"
931msgstr "Nom d'utilisateur"
932
933#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
934#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
935#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152
936#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152
937msgid "Password"
938msgstr "Mot de passe"
939
940#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:63
941msgid "Shaarli title"
942msgstr "Titre du Shaarli"
943
944#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69
945msgid "My links"
946msgstr "Mes liens"
947
948#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:182
949msgid "Install"
950msgstr "Installer"
951 834
952#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 835#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
953#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79 836#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79
@@ -964,13 +847,11 @@ msgstr[0] "lien privé"
964msgstr[1] "liens privés" 847msgstr[1] "liens privés"
965 848
966#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30 849#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
967#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
968#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:121 850#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:121
969msgid "Search text" 851msgid "Search text"
970msgstr "Recherche texte" 852msgstr "Recherche texte"
971 853
972#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:37 854#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:37
973#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:128
974#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:128 855#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:128
975#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 856#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
976#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64 857#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64
@@ -1011,7 +892,6 @@ msgid "without any tag"
1011msgstr "sans tag" 892msgstr "sans tag"
1012 893
1013#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173 894#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
1014#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
1015#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42 895#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42
1016msgid "Fold" 896msgid "Fold"
1017msgstr "Replier" 897msgstr "Replier"
@@ -1028,36 +908,36 @@ msgstr "permalien"
1028msgid "Add tag" 908msgid "Add tag"
1029msgstr "Ajouter un tag" 909msgstr "Ajouter un tag"
1030 910
1031#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7 911#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:183
912msgid "Toggle sticky"
913msgstr "Changer statut épinglé"
914
915#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:185
916msgid "Sticky"
917msgstr "Épinglé"
918
1032#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:7 919#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:7
1033msgid "Filters" 920msgid "Filters"
1034msgstr "Filtres" 921msgstr "Filtres"
1035 922
1036#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12
1037#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:12 923#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:12
1038msgid "Only display private links" 924msgid "Only display private links"
1039msgstr "Afficher uniquement les liens privés" 925msgstr "Afficher uniquement les liens privés"
1040 926
1041#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
1042#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:15 927#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:15
1043msgid "Only display public links" 928msgid "Only display public links"
1044msgstr "Afficher uniquement les liens publics" 929msgstr "Afficher uniquement les liens publics"
1045 930
1046#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20
1047#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:20 931#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:20
1048msgid "Filter untagged links" 932msgid "Filter untagged links"
1049msgstr "Filtrer par liens privés" 933msgstr "Filtrer par liens privés"
1050 934
1051#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
1052#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
1053#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:24 935#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:24
1054#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76 936#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76
1055#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
1056#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43 937#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43
1057msgid "Fold all" 938msgid "Fold all"
1058msgstr "Replier tout" 939msgstr "Replier tout"
1059 940
1060#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69
1061#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:69 941#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:69
1062msgid "Links per page" 942msgid "Links per page"
1063msgstr "Liens par page" 943msgstr "Liens par page"
@@ -1066,62 +946,59 @@ msgstr "Liens par page"
1066msgid "" 946msgid ""
1067"You have been banned after too many failed login attempts. Try again later." 947"You have been banned after too many failed login attempts. Try again later."
1068msgstr "" 948msgstr ""
1069"Vous avez été banni après trop d'échec d'authentification. Merci de " 949"Vous avez été banni après trop d'échecs d'authentification. Merci de "
1070"réessayer plus tard." 950"réessayer plus tard."
1071 951
952#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
953#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151
954msgid "Username"
955msgstr "Nom d'utilisateur"
956
957#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
958#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152
959msgid "Password"
960msgstr "Mot de passe"
961
1072#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 962#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1073#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155
1074#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:155 963#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:155
1075msgid "Remember me" 964msgid "Remember me"
1076msgstr "Rester connecté" 965msgstr "Rester connecté"
1077 966
1078#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
1079#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1080#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14 967#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14
1081#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 968#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
1082msgid "by the Shaarli community" 969msgid "by the Shaarli community"
1083msgstr "par la communauté Shaarli" 970msgstr "par la communauté Shaarli"
1084 971
1085#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
1086#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15 972#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15
1087msgid "Documentation" 973msgid "Documentation"
1088msgstr "Documentation" 974msgstr "Documentation"
1089 975
1090#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
1091#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44 976#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44
1092msgid "Expand" 977msgid "Expand"
1093msgstr "Déplier" 978msgstr "Déplier"
1094 979
1095#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45
1096#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45 980#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45
1097msgid "Expand all" 981msgid "Expand all"
1098msgstr "Déplier tout" 982msgstr "Déplier tout"
1099 983
1100#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
1101#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46 984#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46
1102msgid "Are you sure you want to delete this link?" 985msgid "Are you sure you want to delete this link?"
1103msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?" 986msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?"
1104 987
1105#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65
1106#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:90
1107#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:65 988#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:65
1108#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:90 989#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:90
1109msgid "RSS Feed" 990msgid "RSS Feed"
1110msgstr "Flux RSS" 991msgstr "Flux RSS"
1111 992
1112#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:70
1113#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:106
1114#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:70 993#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:70
1115#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:106 994#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:106
1116msgid "Logout" 995msgid "Logout"
1117msgstr "Déconnexion" 996msgstr "Déconnexion"
1118 997
1119#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
1120#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:173 998#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:173
1121msgid "is available" 999msgid "is available"
1122msgstr "est disponible" 1000msgstr "est disponible"
1123 1001
1124#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:180
1125#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:180 1002#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:180
1126msgid "Error" 1003msgid "Error"
1127msgstr "Erreur" 1004msgstr "Erreur"
@@ -1221,22 +1098,18 @@ msgstr "tags"
1221msgid "List all links with those tags" 1098msgid "List all links with those tags"
1222msgstr "Lister tous les liens avec ces tags" 1099msgstr "Lister tous les liens avec ces tags"
1223 1100
1224#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:3
1225#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3 1101#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3
1226msgid "Sort by:" 1102msgid "Sort by:"
1227msgstr "Trier par :" 1103msgstr "Trier par :"
1228 1104
1229#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5
1230#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:5 1105#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:5
1231msgid "Cloud" 1106msgid "Cloud"
1232msgstr "Nuage" 1107msgstr "Nuage"
1233 1108
1234#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:6
1235#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:6 1109#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:6
1236msgid "Most used" 1110msgid "Most used"
1237msgstr "Plus utilisés" 1111msgstr "Plus utilisés"
1238 1112
1239#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7
1240#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:7 1113#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:7
1241msgid "Alphabetical" 1114msgid "Alphabetical"
1242msgstr "Alphabétique" 1115msgstr "Alphabétique"
@@ -1251,7 +1124,7 @@ msgstr "Changer les paramètres de Shaarli : titre, fuseau horaire, etc."
1251 1124
1252#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:17 1125#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:17
1253msgid "Configure your Shaarli" 1126msgid "Configure your Shaarli"
1254msgstr "Conguration de Shaarli" 1127msgstr "Configurer Shaarli"
1255 1128
1256#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:21 1129#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:21
1257msgid "Enable, disable and configure plugins" 1130msgid "Enable, disable and configure plugins"
@@ -1259,31 +1132,39 @@ msgstr "Activer, désactiver et configurer les extensions"
1259 1132
1260#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 1133#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
1261msgid "Change your password" 1134msgid "Change your password"
1262msgstr "Modification du mot de passe" 1135msgstr "Modifier le mot de passe"
1263 1136
1264#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35 1137#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
1265msgid "Rename or delete a tag in all links" 1138msgid "Rename or delete a tag in all links"
1266msgstr "Rename or delete a tag in all links" 1139msgstr "Renommer ou supprimer un tag dans tous les liens"
1267 1140
1268#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 1141#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1142#, fuzzy
1143#| msgid ""
1144#| "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
1145#| "delicious…)"
1269msgid "" 1146msgid ""
1270"Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, " 1147"Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
1271"delicious...)" 1148"delicious...)"
1272msgstr "" 1149msgstr ""
1273"Importer des marques pages au format Netscape HTML (comme exportés depuis " 1150"Importer des marques pages au format Netscape HTML (comme exportés depuis "
1274"Firefox, Chrome, Opera, delicious...)" 1151"Firefox, Chrome, Opera, delicious)"
1275 1152
1276#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42 1153#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
1277msgid "Import links" 1154msgid "Import links"
1278msgstr "Importer des liens" 1155msgstr "Importer des liens"
1279 1156
1280#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47 1157#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1158#, fuzzy
1159#| msgid ""
1160#| "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
1161#| "Opera, delicious…)"
1281msgid "" 1162msgid ""
1282"Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, " 1163"Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
1283"Opera, delicious...)" 1164"Opera, delicious...)"
1284msgstr "" 1165msgstr ""
1285"Exporter les marques pages au format Netscape HTML (comme exportés depuis " 1166"Exporter les marques pages au format Netscape HTML (comme exportés depuis "
1286"Firefox, Chrome, Opera, delicious...)" 1167"Firefox, Chrome, Opera, delicious)"
1287 1168
1288#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 1169#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1289msgid "Export database" 1170msgid "Export database"
@@ -1298,13 +1179,13 @@ msgid ""
1298"Drag one of these button to your bookmarks toolbar or right-click it and " 1179"Drag one of these button to your bookmarks toolbar or right-click it and "
1299"\"Bookmark This Link\"" 1180"\"Bookmark This Link\""
1300msgstr "" 1181msgstr ""
1301"Glisser un de ces bouttons dans votre barre de favoris ou cliquer droit " 1182"Glisser un de ces boutons dans votre barre de favoris ou cliquer droit "
1302"dessus et « Ajouter aux favoris »" 1183"dessus et « Ajouter aux favoris »"
1303 1184
1304#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:82 1185#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:82
1305msgid "then click on the bookmarklet in any page you want to share." 1186msgid "then click on the bookmarklet in any page you want to share."
1306msgstr "" 1187msgstr ""
1307"puis cliquer sur le marque page depuis un site que vous souhaitez partager." 1188"puis cliquer sur le marque-page depuis un site que vous souhaitez partager."
1308 1189
1309#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86 1190#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86
1310#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:110 1191#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:110
@@ -1339,33 +1220,16 @@ msgstr ""
1339msgid "Add Note" 1220msgid "Add Note"
1340msgstr "Ajouter une Note" 1221msgstr "Ajouter une Note"
1341 1222
1342#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 1223#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:136
1343msgid ""
1344"You need to browse your Shaarli over <strong>HTTPS</strong> to use this "
1345"functionality."
1346msgstr ""
1347"Vous devez utiliser Shaarli en <strong>HTTPS</strong> pour utiliser cette "
1348"fonctionalité."
1349
1350#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144
1351msgid "Add to"
1352msgstr "Ajouter à"
1353
1354#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155
1355msgid "3rd party" 1224msgid "3rd party"
1356msgstr "Applications tierces" 1225msgstr "Applications tierces"
1357 1226
1358#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:157 1227#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
1359#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:163 1228#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144
1360msgid "Plugin"
1361msgstr "Extension"
1362
1363#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:158
1364#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:164
1365msgid "plugin" 1229msgid "plugin"
1366msgstr "extension" 1230msgstr "extension"
1367 1231
1368#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:191 1232#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
1369msgid "" 1233msgid ""
1370"Drag this link to your bookmarks toolbar, or right-click it and choose " 1234"Drag this link to your bookmarks toolbar, or right-click it and choose "
1371"Bookmark This Link" 1235"Bookmark This Link"
@@ -1373,10 +1237,91 @@ msgstr ""
1373"Glisser ce lien dans votre barre de favoris ou cliquer droit dessus et « " 1237"Glisser ce lien dans votre barre de favoris ou cliquer droit dessus et « "
1374"Ajouter aux favoris »" 1238"Ajouter aux favoris »"
1375 1239
1376#, fuzzy 1240#~ msgid "Sorry, nothing to see here."
1377#~| msgid "Enable thumbnails" 1241#~ msgstr "Désolé, il y a rien à voir ici."
1378#~ msgid "Synchonize thumbnails" 1242
1379#~ msgstr "Activer les miniatures" 1243#~ msgid "Current password"
1244#~ msgstr "Mot de passe actuel"
1245
1246#~ msgid "New password"
1247#~ msgstr "Nouveau mot de passe"
1248
1249#~ msgid "Change"
1250#~ msgstr "Changer"
1251
1252#~ msgid "Export Database"
1253#~ msgstr "Exporter les données"
1254
1255#~ msgid "Selection"
1256#~ msgstr "Choisir"
1257
1258#~ msgid "Public"
1259#~ msgstr "Publics"
1260
1261#~ msgid "Prepend note permalinks with this Shaarli instance's URL"
1262#~ msgstr "Préfixer les liens de note avec l'URL de l'instance de Shaarli"
1263
1264#~ msgid "Useful to import bookmarks in a web browser"
1265#~ msgstr "Utile pour importer les marques-pages dans un navigateur"
1266
1267#~ msgid "Import Database"
1268#~ msgstr "Importer des données"
1269
1270#~ msgid "Maximum size allowed:"
1271#~ msgstr "Taille maximum autorisée :"
1272
1273#~ msgid "Visibility"
1274#~ msgstr "Visibilité"
1275
1276#~ msgid "Use values from the imported file, default to public"
1277#~ msgstr ""
1278#~ "Utiliser les valeurs présentes dans le fichier d'import, public par défaut"
1279
1280#~ msgid "Import all bookmarks as private"
1281#~ msgstr "Importer tous les liens comme privés"
1282
1283#~ msgid "Import all bookmarks as public"
1284#~ msgstr "Importer tous les liens comme publics"
1285
1286#~ msgid "Overwrite existing bookmarks"
1287#~ msgstr "Remplacer les liens existants"
1288
1289#~ msgid "Duplicates based on URL"
1290#~ msgstr "Les doublons s'appuient sur les URL"
1291
1292#~ msgid "Add default tags"
1293#~ msgstr "Ajouter des tags par défaut"
1294
1295#~ msgid "Install Shaarli"
1296#~ msgstr "Installation de Shaarli"
1297
1298#~ msgid ""
1299#~ "It looks like it's the first time you run Shaarli. Please configure it."
1300#~ msgstr ""
1301#~ "Il semblerait que ça soit la première fois que vous lancez Shaarli. Merci "
1302#~ "de le configurer."
1303
1304#~ msgid "Shaarli title"
1305#~ msgstr "Titre du Shaarli"
1306
1307#~ msgid "My links"
1308#~ msgstr "Mes liens"
1309
1310#~ msgid "Install"
1311#~ msgstr "Installer"
1312
1313#~ msgid ""
1314#~ "You need to browse your Shaarli over <strong>HTTPS</strong> to use this "
1315#~ "functionality."
1316#~ msgstr ""
1317#~ "Vous devez utiliser Shaarli en <strong>HTTPS</strong> pour utiliser cette "
1318#~ "fonctionalité."
1319
1320#~ msgid "Add to"
1321#~ msgstr "Ajouter à"
1322
1323#~ msgid "Plugin"
1324#~ msgstr "Extension"
1380 1325
1381#~ msgid "Warning: " 1326#~ msgid "Warning: "
1382#~ msgstr "Attention : " 1327#~ msgstr "Attention : "
@@ -1450,7 +1395,8 @@ msgstr ""
1450#~ "\n" 1395#~ "\n"
1451 1396
1452#~ msgid "Sessions do not seem to work correctly on your server." 1397#~ msgid "Sessions do not seem to work correctly on your server."
1453#~ msgstr "Les sessions ne semblent " 1398#~ msgstr ""
1399#~ "Les sessions ne semblent pas fonctionner correctement sur votre serveur."
1454 1400
1455#~ msgid "Tag was renamed in " 1401#~ msgid "Tag was renamed in "
1456#~ msgstr "Le tag a été renommé dans " 1402#~ msgstr "Le tag a été renommé dans "
diff --git a/index.php b/index.php
index 1480bbc5..b702bd13 100644
--- a/index.php
+++ b/index.php
@@ -356,7 +356,6 @@ function showDailyRSS($conf, $loginManager) {
356 $conf->get('redirector.url'), 356 $conf->get('redirector.url'),
357 $conf->get('redirector.encode_url') 357 $conf->get('redirector.encode_url')
358 ); 358 );
359 $link['thumbnail'] = thumbnail($conf, $link['url']);
360 $link['timestamp'] = $link['created']->getTimestamp(); 359 $link['timestamp'] = $link['created']->getTimestamp();
361 if (startsWith($link['url'], '?')) { 360 if (startsWith($link['url'], '?')) {
362 $link['url'] = index_url($_SERVER) . $link['url']; // make permalink URL absolute 361 $link['url'] = index_url($_SERVER) . $link['url']; // make permalink URL absolute
@@ -371,6 +370,7 @@ function showDailyRSS($conf, $loginManager) {
371 $tpl->assign('links', $links); 370 $tpl->assign('links', $links);
372 $tpl->assign('rssdate', escape($dayDate->format(DateTime::RSS))); 371 $tpl->assign('rssdate', escape($dayDate->format(DateTime::RSS)));
373 $tpl->assign('hide_timestamps', $conf->get('privacy.hide_timestamps', false)); 372 $tpl->assign('hide_timestamps', $conf->get('privacy.hide_timestamps', false));
373 $tpl->assign('index_url', $pageaddr);
374 $html = $tpl->draw('dailyrss', true); 374 $html = $tpl->draw('dailyrss', true);
375 375
376 echo $html . PHP_EOL; 376 echo $html . PHP_EOL;
@@ -433,7 +433,6 @@ function showDaily($pageBuilder, $LINKSDB, $conf, $pluginManager, $loginManager)
433 $conf->get('redirector.url'), 433 $conf->get('redirector.url'),
434 $conf->get('redirector.encode_url') 434 $conf->get('redirector.encode_url')
435 ); 435 );
436 $linksToDisplay[$key]['thumbnail'] = thumbnail($conf, $link['url']);
437 $linksToDisplay[$key]['timestamp'] = $link['created']->getTimestamp(); 436 $linksToDisplay[$key]['timestamp'] = $link['created']->getTimestamp();
438 } 437 }
439 438
@@ -1085,7 +1084,8 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
1085 die(t('Wrong token.')); 1084 die(t('Wrong token.'));
1086 } 1085 }
1087 1086
1088 $alteredLinks = $LINKSDB->renameTag(escape($_POST['fromtag']), escape($_POST['totag'])); 1087 $toTag = isset($_POST['totag']) ? escape($_POST['totag']) : null;
1088 $alteredLinks = $LINKSDB->renameTag(escape($_POST['fromtag']), $toTag);
1089 $LINKSDB->save($conf->get('resource.page_cache')); 1089 $LINKSDB->save($conf->get('resource.page_cache'));
1090 foreach ($alteredLinks as $link) { 1090 foreach ($alteredLinks as $link) {
1091 $history->updateLink($link); 1091 $history->updateLink($link);
@@ -1237,10 +1237,10 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
1237 $id = (int) escape($id); 1237 $id = (int) escape($id);
1238 $link = $LINKSDB[$id]; 1238 $link = $LINKSDB[$id];
1239 $pluginManager->executeHooks('delete_link', $link); 1239 $pluginManager->executeHooks('delete_link', $link);
1240 $history->deleteLink($link);
1240 unset($LINKSDB[$id]); 1241 unset($LINKSDB[$id]);
1241 } 1242 }
1242 $LINKSDB->save($conf->get('resource.page_cache')); // save to disk 1243 $LINKSDB->save($conf->get('resource.page_cache')); // save to disk
1243 $history->deleteLink($link);
1244 1244
1245 // If we are called from the bookmarklet, we must close the popup: 1245 // If we are called from the bookmarklet, we must close the popup:
1246 if (isset($_GET['source']) && ($_GET['source']=='bookmarklet' || $_GET['source']=='firefoxsocialapi')) { echo '<script>self.close();</script>'; exit; } 1246 if (isset($_GET['source']) && ($_GET['source']=='bookmarklet' || $_GET['source']=='firefoxsocialapi')) { echo '<script>self.close();</script>'; exit; }
@@ -1353,6 +1353,25 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
1353 exit; 1353 exit;
1354 } 1354 }
1355 1355
1356 if ($targetPage == Router::$PAGE_PINLINK) {
1357 if (! isset($_GET['id']) || empty($LINKSDB[$_GET['id']])) {
1358 // FIXME! Use a proper error system.
1359 $msg = t('Invalid link ID provided');
1360 echo '<script>alert("'. $msg .'");document.location=\''. index_url($_SERVER) .'\';</script>';
1361 exit;
1362 }
1363 if (! $sessionManager->checkToken($_GET['token'])) {
1364 die('Wrong token.');
1365 }
1366
1367 $link = $LINKSDB[$_GET['id']];
1368 $link['sticky'] = ! $link['sticky'];
1369 $LINKSDB[(int) $_GET['id']] = $link;
1370 $LINKSDB->save($conf->get('resource.page_cache'));
1371 header('Location: '.index_url($_SERVER));
1372 exit;
1373 }
1374
1356 if ($targetPage == Router::$PAGE_EXPORT) { 1375 if ($targetPage == Router::$PAGE_EXPORT) {
1357 // Export links as a Netscape Bookmarks file 1376 // Export links as a Netscape Bookmarks file
1358 1377
@@ -1636,9 +1655,9 @@ function buildLinkList($PAGE, $LINKSDB, $conf, $pluginManager, $loginManager)
1636 uasort($taglist, 'strcasecmp'); 1655 uasort($taglist, 'strcasecmp');
1637 $link['taglist'] = $taglist; 1656 $link['taglist'] = $taglist;
1638 1657
1639 // Thumbnails enabled, not a note, 1658 // Logged in, thumbnails enabled, not a note,
1640 // and (never retrieved yet or no valid cache file) 1659 // and (never retrieved yet or no valid cache file)
1641 if ($thumbnailsEnabled && $link['url'][0] != '?' 1660 if ($loginManager->isLoggedIn() && $thumbnailsEnabled && $link['url'][0] != '?'
1642 && (! isset($link['thumbnail']) || ($link['thumbnail'] !== false && ! is_file($link['thumbnail']))) 1661 && (! isset($link['thumbnail']) || ($link['thumbnail'] !== false && ! is_file($link['thumbnail'])))
1643 ) { 1662 ) {
1644 $elem = $LINKSDB[$keys[$i]]; 1663 $elem = $LINKSDB[$keys[$i]];
@@ -1812,7 +1831,11 @@ function install($conf, $sessionManager, $loginManager) {
1812 exit; 1831 exit;
1813} 1832}
1814 1833
1815if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do=dailyrss')) { showDailyRSS($conf); exit; } 1834if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do=dailyrss')) {
1835 showDailyRSS($conf, $loginManager);
1836 exit;
1837}
1838
1816if (!isset($_SESSION['LINKS_PER_PAGE'])) { 1839if (!isset($_SESSION['LINKS_PER_PAGE'])) {
1817 $_SESSION['LINKS_PER_PAGE'] = $conf->get('general.links_per_page', 20); 1840 $_SESSION['LINKS_PER_PAGE'] = $conf->get('general.links_per_page', 20);
1818} 1841}
@@ -1855,6 +1878,7 @@ $app->group('/api/v1', function() {
1855})->add('\Shaarli\Api\ApiMiddleware'); 1878})->add('\Shaarli\Api\ApiMiddleware');
1856 1879
1857$response = $app->run(true); 1880$response = $app->run(true);
1881
1858// Hack to make Slim and Shaarli router work together: 1882// Hack to make Slim and Shaarli router work together:
1859// If a Slim route isn't found and NOT API call, we call renderPage(). 1883// If a Slim route isn't found and NOT API call, we call renderPage().
1860if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v1') === false) { 1884if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v1') === false) {
@@ -1862,5 +1886,12 @@ if ($response->getStatusCode() == 404 && strpos($_SERVER['REQUEST_URI'], '/api/v
1862 header('Content-Type: text/html; charset=utf-8'); 1886 header('Content-Type: text/html; charset=utf-8');
1863 renderPage($conf, $pluginManager, $linkDb, $history, $sessionManager, $loginManager); 1887 renderPage($conf, $pluginManager, $linkDb, $history, $sessionManager, $loginManager);
1864} else { 1888} else {
1889 $response = $response
1890 ->withHeader('Access-Control-Allow-Origin', '*')
1891 ->withHeader(
1892 'Access-Control-Allow-Headers',
1893 'X-Requested-With, Content-Type, Accept, Origin, Authorization'
1894 )
1895 ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
1865 $app->respond($response); 1896 $app->respond($response);
1866} 1897}
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
2repo_url: https://github.com/shaarli/Shaarli 2repo_url: https://github.com/shaarli/Shaarli
3edit_uri: edit/master/doc/md 3edit_uri: edit/master/doc/md
4site_description: The personal, minimalist, super-fast, database free, bookmarking service 4site_description: The personal, minimalist, super-fast, database free, bookmarking service
5theme: readthedocs 5theme:
6 name: readthedocs
7 custom_dir: doc/custom_theme/
6docs_dir: doc/md 8docs_dir: doc/md
7site_dir: doc/html 9site_dir: doc/html
8# Disable strict mode until ReadTheDocs provides up-to-date MkDocs settings: 10# 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
--- /dev/null
+++ b/plugins/isso/comment.png
Binary files 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)
46 46
47 $isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']); 47 $isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']);
48 $data['plugin_end_zone'][] = $isso; 48 $data['plugin_end_zone'][] = $isso;
49 } else {
50 $button = '<span><a href="?%s#isso-thread">';
51 // For the default theme we use a FontAwesome icon which is better than an image
52 if ($conf->get('resource.theme') === 'default') {
53 $button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
54 } else {
55 $button .= '<img class="linklist-plugin-icon" src="plugins/isso/comment.png" ';
56 $button .= 'title="Comment on this shaare" alt="Comments" />';
57 }
58 $button .= '</a></span>';
59 foreach ($data['links'] as &$value) {
60 $commentLink = sprintf($button, $value['shorturl']);
61 $value['link_plugin'][] = $commentLink;
62 }
63 }
49 64
50 // Hackish way to include this CSS file only when necessary. 65 return $data;
51 $data['plugins_includes']['css_files'][] = PluginManager::$PLUGINS_PATH . '/isso/isso.css'; 66}
67
68/**
69 * When linklist is displayed, include isso CSS file.
70 *
71 * @param array $data - header data.
72 *
73 * @return mixed - header data with isso CSS file added.
74 */
75function hook_isso_render_includes($data)
76{
77 if ($data['_PAGE_'] == Router::$PAGE_LINKLIST) {
78 $data['css_files'][] = PluginManager::$PLUGINS_PATH . '/isso/isso.css';
52 } 79 }
53 80
54 return $data; 81 return $data;
diff --git a/plugins/isso/isso_button.html b/plugins/isso/isso_button.html
new file mode 100644
index 00000000..3f828480
--- /dev/null
+++ b/plugins/isso/isso_button.html
@@ -0,0 +1,5 @@
1<span>
2 <a href="?%s#isso-thread">
3 <img class="linklist-plugin-icon" src="plugins/archiveorg/internetarchive.png" title="%s" alt="archive.org" />
4 </a>
5</span>
diff --git a/plugins/markdown/markdown.php b/plugins/markdown/markdown.php
index d4fb1f76..08e64dae 100644
--- a/plugins/markdown/markdown.php
+++ b/plugins/markdown/markdown.php
@@ -216,6 +216,15 @@ function reverse_text2clickable($description)
216 $descriptionLine 216 $descriptionLine
217 ); 217 );
218 218
219 // Make hashtag links markdown ready, otherwise the links will be ignored with escape set to true
220 if (!$codeBlockOn && !$codeLineOn) {
221 $descriptionLine = preg_replace(
222 '#<a href="([^ ]*)"'. $hashtagTitle .'>([^<]+)</a>#m',
223 '[$2]($1)',
224 $descriptionLine
225 );
226 }
227
219 $descriptionOut .= $descriptionLine; 228 $descriptionOut .= $descriptionLine;
220 if ($lineCount++ < count($descriptionLines) - 1) { 229 if ($lineCount++ < count($descriptionLines) - 1) {
221 $descriptionOut .= PHP_EOL; 230 $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
82 $this->assertFalse($data['usepermalinks']); 82 $this->assertFalse($data['usepermalinks']);
83 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); 83 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
84 84
85 // Test first link (note link) 85 // Test first not pinned link (note link)
86 $link = reset($data['links']); 86 $link = $data['links'][array_keys($data['links'])[2]];
87 $this->assertEquals(41, $link['id']); 87 $this->assertEquals(41, $link['id']);
88 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); 88 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
89 $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); 89 $this->assertEquals('http://host.tld/?WDWyig', $link['guid']);
@@ -119,7 +119,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase
119 $data = $feedBuilder->buildData(); 119 $data = $feedBuilder->buildData();
120 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); 120 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
121 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']); 121 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']);
122 $link = reset($data['links']); 122 $link = $data['links'][array_keys($data['links'])[2]];
123 $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']); 123 $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']);
124 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links'][8]['up_iso_date']); 124 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links'][8]['up_iso_date']);
125 } 125 }
@@ -148,13 +148,13 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase
148 public function testBuildDataCount() 148 public function testBuildDataCount()
149 { 149 {
150 $criteria = array( 150 $criteria = array(
151 'nb' => '1', 151 'nb' => '3',
152 ); 152 );
153 $feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, $criteria, false); 153 $feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, $criteria, false);
154 $feedBuilder->setLocale(self::$LOCALE); 154 $feedBuilder->setLocale(self::$LOCALE);
155 $data = $feedBuilder->buildData(); 155 $data = $feedBuilder->buildData();
156 $this->assertEquals(1, count($data['links'])); 156 $this->assertEquals(3, count($data['links']));
157 $link = array_shift($data['links']); 157 $link = $data['links'][array_keys($data['links'])[2]];
158 $this->assertEquals(41, $link['id']); 158 $this->assertEquals(41, $link['id']);
159 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); 159 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
160 } 160 }
@@ -171,7 +171,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase
171 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); 171 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
172 $this->assertTrue($data['usepermalinks']); 172 $this->assertTrue($data['usepermalinks']);
173 // First link is a permalink 173 // First link is a permalink
174 $link = array_shift($data['links']); 174 $link = $data['links'][array_keys($data['links'])[2]];
175 $this->assertEquals(41, $link['id']); 175 $this->assertEquals(41, $link['id']);
176 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); 176 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
177 $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); 177 $this->assertEquals('http://host.tld/?WDWyig', $link['guid']);
@@ -179,7 +179,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase
179 $this->assertContains('Direct link', $link['description']); 179 $this->assertContains('Direct link', $link['description']);
180 $this->assertContains('http://host.tld/?WDWyig', $link['description']); 180 $this->assertContains('http://host.tld/?WDWyig', $link['description']);
181 // Second link is a direct link 181 // Second link is a direct link
182 $link = array_shift($data['links']); 182 $link = $data['links'][array_keys($data['links'])[3]];
183 $this->assertEquals(8, $link['id']); 183 $this->assertEquals(8, $link['id']);
184 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114633'), $link['created']); 184 $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114633'), $link['created']);
185 $this->assertEquals('http://host.tld/?RttfEw', $link['guid']); 185 $this->assertEquals('http://host.tld/?RttfEw', $link['guid']);
@@ -237,7 +237,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase
237 ); 237 );
238 238
239 // Test first link (note link) 239 // Test first link (note link)
240 $link = array_shift($data['links']); 240 $link = $data['links'][array_keys($data['links'])[2]];
241 $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['guid']); 241 $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['guid']);
242 $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['url']); 242 $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['url']);
243 $this->assertContains('http://host.tld:8080/~user/shaarli/?addtag=hashtag', $link['description']); 243 $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
239 public function testDays() 239 public function testDays()
240 { 240 {
241 $this->assertEquals( 241 $this->assertEquals(
242 array('20100310', '20121206', '20130614', '20150310'), 242 array('20100309', '20100310', '20121206', '20121207', '20130614', '20150310'),
243 self::$publicLinkDB->days() 243 self::$publicLinkDB->days()
244 ); 244 );
245 245
246 $this->assertEquals( 246 $this->assertEquals(
247 array('20100310', '20121206', '20130614', '20141125', '20150310'), 247 array('20100309', '20100310', '20121206', '20121207', '20130614', '20141125', '20150310'),
248 self::$privateLinkDB->days() 248 self::$privateLinkDB->days()
249 ); 249 );
250 } 250 }
@@ -475,13 +475,15 @@ class LinkDBTest extends PHPUnit_Framework_TestCase
475 public function testReorderLinksDesc() 475 public function testReorderLinksDesc()
476 { 476 {
477 self::$privateLinkDB->reorder('ASC'); 477 self::$privateLinkDB->reorder('ASC');
478 $linkIds = array(42, 4, 9, 1, 0, 7, 6, 8, 41); 478 $stickyIds = [11, 10];
479 $standardIds = [42, 4, 9, 1, 0, 7, 6, 8, 41];
480 $linkIds = array_merge($stickyIds, $standardIds);
479 $cpt = 0; 481 $cpt = 0;
480 foreach (self::$privateLinkDB as $key => $value) { 482 foreach (self::$privateLinkDB as $key => $value) {
481 $this->assertEquals($linkIds[$cpt++], $key); 483 $this->assertEquals($linkIds[$cpt++], $key);
482 } 484 }
483 self::$privateLinkDB->reorder('DESC'); 485 self::$privateLinkDB->reorder('DESC');
484 $linkIds = array_reverse($linkIds); 486 $linkIds = array_merge(array_reverse($stickyIds), array_reverse($standardIds));
485 $cpt = 0; 487 $cpt = 0;
486 foreach (self::$privateLinkDB as $key => $value) { 488 foreach (self::$privateLinkDB as $key => $value) {
487 $this->assertEquals($linkIds[$cpt++], $key); 489 $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
110 $links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'public', false, ''); 110 $links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'public', false, '');
111 $this->assertEquals( 111 $this->assertEquals(
112 '?WDWyig', 112 '?WDWyig',
113 $links[0]['url'] 113 $links[2]['url']
114 ); 114 );
115 } 115 }
116 116
@@ -128,7 +128,7 @@ class BookmarkExportTest extends PHPUnit_Framework_TestCase
128 ); 128 );
129 $this->assertEquals( 129 $this->assertEquals(
130 $indexUrl . '?WDWyig', 130 $indexUrl . '?WDWyig',
131 $links[0]['url'] 131 $links[2]['url']
132 ); 132 );
133 } 133 }
134} 134}
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;';
688 } 688 }
689 689
690 /** 690 /**
691<<<<<<< HEAD
691 * Test updateMethodWebThumbnailer with thumbnails enabled. 692 * Test updateMethodWebThumbnailer with thumbnails enabled.
692 */ 693 */
693 public function testUpdateMethodWebThumbnailerEnabled() 694 public function testUpdateMethodWebThumbnailerEnabled()
@@ -732,4 +733,64 @@ $GLOBALS[\'privateLinkByDefault\'] = true;';
732 $this->assertEquals(53, $this->conf->get('thumbnails.height')); 733 $this->assertEquals(53, $this->conf->get('thumbnails.height'));
733 $this->assertTrue(empty($_SESSION['warnings'])); 734 $this->assertTrue(empty($_SESSION['warnings']));
734 } 735 }
736
737 /**
738 * Test updateMethodSetSticky().
739 */
740 public function testUpdateStickyValid()
741 {
742 $blank = [
743 'id' => 1,
744 'url' => 'z',
745 'title' => '',
746 'description' => '',
747 'tags' => '',
748 'created' => new DateTime(),
749 ];
750 $links = [
751 1 => ['id' => 1] + $blank,
752 2 => ['id' => 2] + $blank,
753 ];
754 $refDB = new ReferenceLinkDB();
755 $refDB->setLinks($links);
756 $refDB->write(self::$testDatastore);
757 $linkDB = new LinkDB(self::$testDatastore, true, false);
758
759 $updater = new Updater(array(), $linkDB, $this->conf, true);
760 $this->assertTrue($updater->updateMethodSetSticky());
761
762 $linkDB = new LinkDB(self::$testDatastore, true, false);
763 foreach ($linkDB as $link) {
764 $this->assertFalse($link['sticky']);
765 }
766 }
767
768 /**
769 * Test updateMethodSetSticky().
770 */
771 public function testUpdateStickyNothingToDo()
772 {
773 $blank = [
774 'id' => 1,
775 'url' => 'z',
776 'title' => '',
777 'description' => '',
778 'tags' => '',
779 'created' => new DateTime(),
780 ];
781 $links = [
782 1 => ['id' => 1, 'sticky' => true] + $blank,
783 2 => ['id' => 2] + $blank,
784 ];
785 $refDB = new ReferenceLinkDB();
786 $refDB->setLinks($links);
787 $refDB->write(self::$testDatastore);
788 $linkDB = new LinkDB(self::$testDatastore, true, false);
789
790 $updater = new Updater(array(), $linkDB, $this->conf, true);
791 $this->assertTrue($updater->updateMethodSetSticky());
792
793 $linkDB = new LinkDB(self::$testDatastore, true, false);
794 $this->assertTrue($linkDB[1]['sticky']);
795 }
735} 796}
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
95 $this->assertEquals($this->refDB->countLinks(), count($data)); 95 $this->assertEquals($this->refDB->countLinks(), count($data));
96 96
97 // Check order 97 // Check order
98 $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; 98 $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42];
99 $cpt = 0; 99 $cpt = 0;
100 foreach ($data as $link) { 100 foreach ($data as $link) {
101 $this->assertEquals(self::NB_FIELDS_LINK, count($link)); 101 $this->assertEquals(self::NB_FIELDS_LINK, count($link));
@@ -103,7 +103,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
103 } 103 }
104 104
105 // Check first element fields 105 // Check first element fields
106 $first = $data[0]; 106 $first = $data[2];
107 $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); 107 $this->assertEquals('http://domain.tld/?WDWyig', $first['url']);
108 $this->assertEquals('WDWyig', $first['shorturl']); 108 $this->assertEquals('WDWyig', $first['shorturl']);
109 $this->assertEquals('Link title: @website', $first['title']); 109 $this->assertEquals('Link title: @website', $first['title']);
@@ -120,7 +120,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
120 $this->assertEmpty($first['updated']); 120 $this->assertEmpty($first['updated']);
121 121
122 // Multi tags 122 // Multi tags
123 $link = $data[1]; 123 $link = $data[3];
124 $this->assertEquals(7, count($link['tags'])); 124 $this->assertEquals(7, count($link['tags']));
125 125
126 // Update date 126 // Update date
@@ -138,7 +138,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
138 { 138 {
139 $env = Environment::mock([ 139 $env = Environment::mock([
140 'REQUEST_METHOD' => 'GET', 140 'REQUEST_METHOD' => 'GET',
141 'QUERY_STRING' => 'offset=1&limit=1' 141 'QUERY_STRING' => 'offset=3&limit=1'
142 ]); 142 ]);
143 $request = Request::createFromEnvironment($env); 143 $request = Request::createFromEnvironment($env);
144 $response = $this->controller->getLinks($request, new Response()); 144 $response = $this->controller->getLinks($request, new Response());
@@ -164,7 +164,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
164 $data = json_decode((string) $response->getBody(), true); 164 $data = json_decode((string) $response->getBody(), true);
165 $this->assertEquals($this->refDB->countLinks(), count($data)); 165 $this->assertEquals($this->refDB->countLinks(), count($data));
166 // Check order 166 // Check order
167 $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; 167 $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42];
168 $cpt = 0; 168 $cpt = 0;
169 foreach ($data as $link) { 169 foreach ($data as $link) {
170 $this->assertEquals(self::NB_FIELDS_LINK, count($link)); 170 $this->assertEquals(self::NB_FIELDS_LINK, count($link));
@@ -205,7 +205,8 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
205 $this->assertEquals(200, $response->getStatusCode()); 205 $this->assertEquals(200, $response->getStatusCode());
206 $data = json_decode((string)$response->getBody(), true); 206 $data = json_decode((string)$response->getBody(), true);
207 $this->assertEquals($this->refDB->countLinks(), count($data)); 207 $this->assertEquals($this->refDB->countLinks(), count($data));
208 $this->assertEquals(41, $data[0]['id']); 208 $this->assertEquals(10, $data[0]['id']);
209 $this->assertEquals(41, $data[2]['id']);
209 $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); 210 $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
210 } 211 }
211 212
@@ -243,7 +244,8 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
243 $this->assertEquals(200, $response->getStatusCode()); 244 $this->assertEquals(200, $response->getStatusCode());
244 $data = json_decode((string)$response->getBody(), true); 245 $data = json_decode((string)$response->getBody(), true);
245 $this->assertEquals($this->refDB->countPublicLinks(), count($data)); 246 $this->assertEquals($this->refDB->countPublicLinks(), count($data));
246 $this->assertEquals(41, $data[0]['id']); 247 $this->assertEquals(10, $data[0]['id']);
248 $this->assertEquals(41, $data[2]['id']);
247 $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); 249 $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
248 } 250 }
249 251
@@ -413,8 +415,9 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase
413 $response = $this->controller->getLinks($request, new Response()); 415 $response = $this->controller->getLinks($request, new Response());
414 $this->assertEquals(200, $response->getStatusCode()); 416 $this->assertEquals(200, $response->getStatusCode());
415 $data = json_decode((string) $response->getBody(), true); 417 $data = json_decode((string) $response->getBody(), true);
416 $this->assertEquals(9, count($data)); 418 $this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, count($data));
417 $this->assertEquals(41, $data[0]['id']); 419 $this->assertEquals(10, $data[0]['id']);
420 $this->assertEquals(41, $data[2]['id']);
418 421
419 // wildcard: optional ('*' does not need to expand) 422 // wildcard: optional ('*' does not need to expand)
420 $env = Environment::mock([ 423 $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
21 /** 21 /**
22 * Test Isso init without errors. 22 * Test Isso init without errors.
23 */ 23 */
24 public function testWallabagInitNoError() 24 public function testIssoInitNoError()
25 { 25 {
26 $conf = new ConfigManager(''); 26 $conf = new ConfigManager('');
27 $conf->set('plugins.ISSO_SERVER', 'value'); 27 $conf->set('plugins.ISSO_SERVER', 'value');
@@ -32,7 +32,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase
32 /** 32 /**
33 * Test Isso init with errors. 33 * Test Isso init with errors.
34 */ 34 */
35 public function testWallabagInitError() 35 public function testIssoInitError()
36 { 36 {
37 $conf = new ConfigManager(''); 37 $conf = new ConfigManager('');
38 $errors = isso_init($conf); 38 $errors = isso_init($conf);
@@ -96,19 +96,22 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase
96 array( 96 array(
97 'id' => 12, 97 'id' => 12,
98 'url' => $str, 98 'url' => $str,
99 'shorturl' => $short1 = 'abcd',
99 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date1), 100 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date1),
100 ), 101 ),
101 array( 102 array(
102 'id' => 13, 103 'id' => 13,
103 'url' => $str . '2', 104 'url' => $str . '2',
105 'shorturl' => $short2 = 'efgh',
104 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date2), 106 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date2),
105 ), 107 ),
106 ) 108 )
107 ); 109 );
108 110
109 $processed = hook_isso_render_linklist($data, $conf); 111 $processed = hook_isso_render_linklist($data, $conf);
110 // data shouldn't be altered 112 // link_plugin should be added for the icon
111 $this->assertEquals($data, $processed); 113 $this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
114 $this->assertContains('<a href="?'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]);
112 } 115 }
113 116
114 /** 117 /**
@@ -127,6 +130,7 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase
127 array( 130 array(
128 'id' => 12, 131 'id' => 12,
129 'url' => $str, 132 'url' => $str,
133 'shorturl' => $short1 = 'abcd',
130 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date), 134 'created' => DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $date),
131 ) 135 )
132 ), 136 ),
@@ -135,8 +139,8 @@ class PluginIssoTest extends PHPUnit_Framework_TestCase
135 139
136 $processed = hook_isso_render_linklist($data, $conf); 140 $processed = hook_isso_render_linklist($data, $conf);
137 141
138 // data shouldn't be altered 142 // link_plugin should be added for the icon
139 $this->assertEquals($data, $processed); 143 $this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
140 } 144 }
141 145
142 /** 146 /**
diff --git a/tests/plugins/PluginMarkdownTest.php b/tests/plugins/PluginMarkdownTest.php
index 31c1f8b7..44364b05 100644
--- a/tests/plugins/PluginMarkdownTest.php
+++ b/tests/plugins/PluginMarkdownTest.php
@@ -109,6 +109,18 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase
109 } 109 }
110 110
111 /** 111 /**
112 * Test reverse_text2clickable().
113 */
114 public function testReverseText2clickableHashtags()
115 {
116 $text = file_get_contents('tests/plugins/resources/hashtags.raw');
117 $md = file_get_contents('tests/plugins/resources/hashtags.md');
118 $clickableText = hashtag_autolink($text);
119 $reversedText = reverse_text2clickable($clickableText);
120 $this->assertEquals($md, $reversedText);
121 }
122
123 /**
112 * Test reverse_nl2br(). 124 * Test reverse_nl2br().
113 */ 125 */
114 public function testReverseNl2br() 126 public function testReverseNl2br()
@@ -248,7 +260,7 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase
248 $this->conf->get('security.markdown_escape', true), 260 $this->conf->get('security.markdown_escape', true),
249 $this->conf->get('security.allowed_protocols') 261 $this->conf->get('security.allowed_protocols')
250 ); 262 );
251 $this->assertEquals($html, $data); 263 $this->assertEquals($html, $data . PHP_EOL);
252 } 264 }
253 265
254 /** 266 /**
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 @@
1[#lol](?addtag=lol)
2
3 #test
4
5`#test2`
6
7```
8bla #bli blo
9#bla
10```
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 @@
1#lol
2
3 #test
4
5`#test2`
6
7```
8bla #bli blo
9#bla
10```
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 @@
12<li><a href="http://link.tld">two</a></li> 12<li><a href="http://link.tld">two</a></li>
13<li><a href="http://link.tld">three</a></li> 13<li><a href="http://link.tld">three</a></li>
14<li><a href="http://link.tld">four</a></li> 14<li><a href="http://link.tld">four</a></li>
15<li>foo &lt;a href=&quot;?addtag=foobar&quot; title=&quot;Hashtag foobar&quot;&gt;#foobar&lt;/a&gt;</li> 15<li>foo <a href="?addtag=foobar">#foobar</a></li>
16</ol></li> 16</ol></li>
17</ol> 17</ol>
18<p>&lt;a href=&quot;?addtag=foobar&quot; title=&quot;Hashtag foobar&quot;&gt;#foobar&lt;/a&gt; foo <code>lol #foo</code> &lt;a href=&quot;?addtag=bar&quot; title=&quot;Hashtag bar&quot;&gt;#bar&lt;/a&gt;</p> 18<p><a href="?addtag=foobar">#foobar</a> foo <code>lol #foo</code> <a href="?addtag=bar">#bar</a></p>
19<p>fsdfs <a href="http://link.tld">http://link.tld</a> &lt;a href=&quot;?addtag=foobar&quot; title=&quot;Hashtag foobar&quot;&gt;#foobar&lt;/a&gt; <code>http://link.tld</code></p> 19<p>fsdfs <a href="http://link.tld">http://link.tld</a> <a href="?addtag=foobar">#foobar</a> <code>http://link.tld</code></p>
20<pre><code>http://link.tld #foobar 20<pre><code>http://link.tld #foobar
21next #foo</code></pre> 21next #foo</code></pre>
22<p>Block:</p> 22<p>Block:</p>
@@ -30,4 +30,4 @@ next #foo</code></pre>
30<a href="ftp://test.tld/path/?query=value#hash">link</a><br /> 30<a href="ftp://test.tld/path/?query=value#hash">link</a><br />
31<a href="magnet:test.tld/path/?query=value#hash">link</a><br /> 31<a href="magnet:test.tld/path/?query=value#hash">link</a><br />
32<a href="http://alert(&#039;xss&#039;)">link</a><br /> 32<a href="http://alert(&#039;xss&#039;)">link</a><br />
33<a href="http://test.tld/path/?query=value#hash">link</a></p></div> \ No newline at end of file 33<a href="http://test.tld/path/?query=value#hash">link</a></p></div>
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
31[link](ftp://test.tld/path/?query=value#hash) 31[link](ftp://test.tld/path/?query=value#hash)
32[link](magnet:test.tld/path/?query=value#hash) 32[link](magnet:test.tld/path/?query=value#hash)
33[link](javascript:alert('xss')) 33[link](javascript:alert('xss'))
34[link](other://test.tld/path/?query=value#hash) \ No newline at end of file 34[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 @@
4 */ 4 */
5class ReferenceLinkDB 5class ReferenceLinkDB
6{ 6{
7 public static $NB_LINKS_TOTAL = 9; 7 public static $NB_LINKS_TOTAL = 11;
8 8
9 private $_links = array(); 9 private $_links = array();
10 private $_publicCount = 0; 10 private $_publicCount = 0;
@@ -16,6 +16,32 @@ class ReferenceLinkDB
16 public function __construct() 16 public function __construct()
17 { 17 {
18 $this->addLink( 18 $this->addLink(
19 11,
20 'Pined older',
21 '?PCRizQ',
22 'This is an older pinned link',
23 0,
24 DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20100309_101010'),
25 '',
26 null,
27 'PCRizQ',
28 true
29 );
30
31 $this->addLink(
32 10,
33 'Pined',
34 '?0gCTjQ',
35 'This is a pinned link',
36 0,
37 DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121207_152312'),
38 '',
39 null,
40 '0gCTjQ',
41 true
42 );
43
44 $this->addLink(
19 41, 45 41,
20 'Link title: @website', 46 'Link title: @website',
21 '?WDWyig', 47 '?WDWyig',
@@ -114,7 +140,17 @@ class ReferenceLinkDB
114 /** 140 /**
115 * Adds a new link 141 * Adds a new link
116 */ 142 */
117 protected function addLink($id, $title, $url, $description, $private, $date, $tags, $updated = '', $shorturl = '') 143 protected function addLink(
144 $id,
145 $title,
146 $url,
147 $description,
148 $private,
149 $date,
150 $tags,
151 $updated = '',
152 $shorturl = '',
153 $pinned = false)
118 { 154 {
119 $link = array( 155 $link = array(
120 'id' => $id, 156 'id' => $id,
@@ -126,6 +162,7 @@ class ReferenceLinkDB
126 'created' => $date, 162 'created' => $date,
127 'updated' => $updated, 163 'updated' => $updated,
128 'shorturl' => $shorturl ? $shorturl : smallHash($date->format(LinkDB::LINK_DATE_FORMAT) . $id), 164 'shorturl' => $shorturl ? $shorturl : smallHash($date->format(LinkDB::LINK_DATE_FORMAT) . $id),
165 'sticky' => $pinned
129 ); 166 );
130 $this->_links[$id] = $link; 167 $this->_links[$id] = $link;
131 168
@@ -165,6 +202,10 @@ class ReferenceLinkDB
165 $order = $order === 'ASC' ? -1 : 1; 202 $order = $order === 'ASC' ? -1 : 1;
166 // Reorder array by dates. 203 // Reorder array by dates.
167 usort($this->_links, function($a, $b) use ($order) { 204 usort($this->_links, function($a, $b) use ($order) {
205 if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) {
206 return $a['sticky'] ? -1 : 1;
207 }
208
168 return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; 209 return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
169 }); 210 });
170 } 211 }
diff --git a/tpl/default/daily.html b/tpl/default/daily.html
index 29d845d5..2c409478 100644
--- a/tpl/default/daily.html
+++ b/tpl/default/daily.html
@@ -69,9 +69,12 @@
69 </a> 69 </a>
70 <a href="{$link.real_url}">{$link.title}</a> 70 <a href="{$link.real_url}">{$link.title}</a>
71 </div> 71 </div>
72 {$thumb=thumbnail($value.url)} 72 {if="$thumbnails_enabled && !empty($link.thumbnail)"}
73 {if="$thumb!=false"} 73 <div class="daily-entry-thumbnail">
74 <div class="daily-entry-thumbnail">{$thumb}</div> 74 <img data-src="{$link.thumbnail}#" class="b-lazy"
75 src=""
76 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
77 </div>
75 {/if} 78 {/if}
76 <div class="daily-entry-description">{$link.formatedDescription}</div> 79 <div class="daily-entry-description">{$link.formatedDescription}</div>
77 {if="$link.tags"} 80 {if="$link.tags"}
@@ -83,7 +86,7 @@
83 {/loop} 86 {/loop}
84 </div> 87 </div>
85 {/if} 88 {/if}
86 <div class="dailyEntryFooter"> 89 <div class="dailyEntryFooter clear">
87 {loop="$link.link_plugin"} 90 {loop="$link.link_plugin"}
88 {$value} 91 {$value}
89 {/loop} 92 {/loop}
@@ -108,6 +111,7 @@
108 </div> 111 </div>
109</div> 112</div>
110{include="page.footer"} 113{include="page.footer"}
114<script src="js/thumbnails.min.js?v={$version_hash}"></script>
111</body> 115</body>
112</html> 116</html>
113 117
diff --git a/tpl/default/dailyrss.html b/tpl/default/dailyrss.html
index b14a3859..f589b06e 100644
--- a/tpl/default/dailyrss.html
+++ b/tpl/default/dailyrss.html
@@ -8,7 +8,7 @@
8 <h3><a href="{$value.url}">{$value.title}</a></h3> 8 <h3><a href="{$value.url}">{$value.title}</a></h3>
9 <small>{if="!$hide_timestamps"}{function="strftime('%c', $value.timestamp)"} - {/if}{if="$value.tags"}{$value.tags}{/if}<br> 9 <small>{if="!$hide_timestamps"}{function="strftime('%c', $value.timestamp)"} - {/if}{if="$value.tags"}{$value.tags}{/if}<br>
10 {$value.url}</small><br> 10 {$value.url}</small><br>
11 {if="$value.thumbnail"}{$value.thumbnail}{/if}<br> 11 {if="$value.thumbnail"}<img src="{$index_url}{$value.thumbnail}#" alt="thumbnail" />{/if}<br>
12 {if="$value.description"}{$value.formatedDescription}{/if} 12 {if="$value.description"}{$value.formatedDescription}{/if}
13 <br><br><hr> 13 <br><br><hr>
14 {/loop} 14 {/loop}
diff --git a/tpl/default/linklist.html b/tpl/default/linklist.html
index 8ea2ce66..ed78f40a 100644
--- a/tpl/default/linklist.html
+++ b/tpl/default/linklist.html
@@ -125,6 +125,8 @@
125 {$strPermalink=t('Permalink')} 125 {$strPermalink=t('Permalink')}
126 {$strPermalinkLc=t('permalink')} 126 {$strPermalinkLc=t('permalink')}
127 {$strAddTag=t('Add tag')} 127 {$strAddTag=t('Add tag')}
128 {$strToggleSticky=t('Toggle sticky')}
129 {$strSticky=t('Sticky')}
128 {ignore}End of translations{/ignore} 130 {ignore}End of translations{/ignore}
129 {loop="links"} 131 {loop="links"}
130 <div class="anchor" id="{$value.shorturl}"></div> 132 <div class="anchor" id="{$value.shorturl}"></div>
@@ -137,7 +139,7 @@
137 <a href="{$value.real_url}"> 139 <a href="{$value.real_url}">
138 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} 140 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
139 <img data-src="{$value.thumbnail}#" class="b-lazy" 141 <img data-src="{$value.thumbnail}#" class="b-lazy"
140 src="#" 142 src=""
141 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" /> 143 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
142 </a> 144 </a>
143 </div> 145 </div>
@@ -190,7 +192,7 @@
190 {if="$is_logged_in"} 192 {if="$is_logged_in"}
191 <div class="linklist-item-infos-controls-group pure-u-0 pure-u-lg-visible"> 193 <div class="linklist-item-infos-controls-group pure-u-0 pure-u-lg-visible">
192 <span class="linklist-item-infos-controls-item ctrl-checkbox"> 194 <span class="linklist-item-infos-controls-item ctrl-checkbox">
193 <input type="checkbox" class="delete-checkbox" value="{$value.id}"> 195 <input type="checkbox" class="link-checkbox" value="{$value.id}">
194 </span> 196 </span>
195 <span class="linklist-item-infos-controls-item ctrl-edit"> 197 <span class="linklist-item-infos-controls-item ctrl-edit">
196 <a href="?edit_link={$value.id}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link"></i></a> 198 <a href="?edit_link={$value.id}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link"></i></a>
@@ -201,7 +203,23 @@
201 <i class="fa fa-trash"></i> 203 <i class="fa fa-trash"></i>
202 </a> 204 </a>
203 </span> 205 </span>
206 <span class="linklist-item-infos-controls-item ctrl-pin">
207 <a href="?do=pin&amp;id={$value.id}&amp;token={$token}"
208 title="{$strToggleSticky}" class="pin-link {if="$value.sticky"}pinned-link{/if} pure-u-0 pure-u-lg-visible">
209 <i class="fa fa-thumb-tack"></i>
210 </a>
211 </span>
204 </div> 212 </div>
213 {else}
214 {if="$value.sticky"}
215 <div class="linklist-item-infos-controls-group pure-u-0 pure-u-lg-visible">
216 <span class="linklist-item-infos-controls-item ctrl-pin">
217 <span title="{$strSticky}" class="pin-link pinned-link pure-u-0 pure-u-lg-visible">
218 <i class="fa fa-thumb-tack"></i>
219 </span>
220 </span>
221 </div>
222 {/if}
205 {/if} 223 {/if}
206 <a href="?{$value.shorturl}" title="{$strPermalink}"> 224 <a href="?{$value.shorturl}" title="{$strPermalink}">
207 {if="!$hide_timestamps || $is_logged_in"} 225 {if="!$hide_timestamps || $is_logged_in"}
diff --git a/tpl/default/linklist.paging.html b/tpl/default/linklist.paging.html
index 5309e348..fe665a84 100644
--- a/tpl/default/linklist.paging.html
+++ b/tpl/default/linklist.paging.html
@@ -16,6 +16,9 @@
16 <a href="?untaggedonly" title="{'Filter untagged links'|t}" 16 <a href="?untaggedonly" title="{'Filter untagged links'|t}"
17 class={if="$untaggedonly"}"filter-on"{else}"filter-off"{/if} 17 class={if="$untaggedonly"}"filter-on"{else}"filter-off"{/if}
18 ><i class="fa fa-tag"></i></a> 18 ><i class="fa fa-tag"></i></a>
19 <a href="#" title="{'Select all'|t}"
20 class="filter-off select-all-button"
21 ><i class="fa fa-check-square-o"></i></a>
19 <a href="#" class="filter-off fold-all pure-u-lg-0" title="{'Fold all'|t}"> 22 <a href="#" class="filter-off fold-all pure-u-lg-0" title="{'Fold all'|t}">
20 <i class="fa fa-chevron-up"></i> 23 <i class="fa fa-chevron-up"></i>
21 </a> 24 </a>
diff --git a/tpl/default/page.header.html b/tpl/default/page.header.html
index fc03404e..3b43a611 100644
--- a/tpl/default/page.header.html
+++ b/tpl/default/page.header.html
@@ -2,7 +2,7 @@
2 <div class="pure-u-lg-0 pure-u-1"> 2 <div class="pure-u-lg-0 pure-u-1">
3 <div class="pure-menu"> 3 <div class="pure-menu">
4 <a href="{$titleLink}" class="pure-menu-link shaarli-title" id="shaarli-title-mobile"> 4 <a href="{$titleLink}" class="pure-menu-link shaarli-title" id="shaarli-title-mobile">
5 <img src="img/icon.png" width="16" height="16" class="head-logo" alt="logo" /> 5 <img src="img/icon.png" width="16" height="16" class="head-logo" alt="" />
6 {$shaarlititle} 6 {$shaarlititle}
7 </a> 7 </a>
8 <a href="#" class="menu-toggle" id="menu-toggle"><s class="bar"></s><s class="bar"></s></a> 8 <a href="#" class="menu-toggle" id="menu-toggle"><s class="bar"></s><s class="bar"></s></a>
@@ -13,7 +13,7 @@
13 <ul class="pure-menu-list pure-u-lg-5-6 pure-u-1"> 13 <ul class="pure-menu-list pure-u-lg-5-6 pure-u-1">
14 <li class="pure-menu-item pure-u-0 pure-u-lg-visible"> 14 <li class="pure-menu-item pure-u-0 pure-u-lg-visible">
15 <a href="{$titleLink}" class="pure-menu-link shaarli-title" id="shaarli-title-desktop"> 15 <a href="{$titleLink}" class="pure-menu-link shaarli-title" id="shaarli-title-desktop">
16 <img src="img/icon.png" width="16" height="16" class="head-logo" alt="logo" /> 16 <img src="img/icon.png" width="16" height="16" class="head-logo" alt="" />
17 {$shaarlititle} 17 {$shaarlititle}
18 </a> 18 </a>
19 </li> 19 </li>
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 @@
37 <div class="picwall-pictureframe"> 37 <div class="picwall-pictureframe">
38 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} 38 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
39 <img data-src="{$value.thumbnail}#" class="b-lazy" 39 <img data-src="{$value.thumbnail}#" class="b-lazy"
40 src="#" 40 src=""
41 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" /> 41 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
42 <a href="{$value.real_url}"><span class="info">{$value.title}</span></a> 42 <a href="{$value.real_url}"><span class="info">{$value.title}</span></a>
43 {loop="$value.picwall_plugin"} 43 {loop="$value.picwall_plugin"}
diff --git a/tpl/default/tools.html b/tpl/default/tools.html
index 6b4d7bec..c9ce1eaf 100644
--- a/tpl/default/tools.html
+++ b/tpl/default/tools.html
@@ -125,25 +125,22 @@
125 <div class="pure-u-lg-1-3 pure-u-22-24 page-form page-form-light"> 125 <div class="pure-u-lg-1-3 pure-u-22-24 page-form page-form-light">
126 <h2 class="window-title">{'3rd party'|t}</h2> 126 <h2 class="window-title">{'3rd party'|t}</h2>
127 <div class="tools-item"> 127 <div class="tools-item">
128 <a href="https://addons.mozilla.org/fr/firefox/addon/shaarli/" title="Firefox {'Plugin'|t}"> 128 <a href="https://addons.mozilla.org/fr/firefox/addon/shaarli/">
129 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Firefox {'plugin'|t}</span> 129 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Firefox {'plugin'|t}</span>
130 </a> 130 </a>
131 </div> 131 </div>
132 <div class="tools-item"> 132 <div class="tools-item">
133 <a href="https://chrome.google.com/webstore/detail/shiny-shaarli/hajdfkmbdmadjmmpkkbbcnllepomekin" 133 <a href="https://chrome.google.com/webstore/detail/shiny-shaarli/hajdfkmbdmadjmmpkkbbcnllepomekin">
134 title="Chrome {'Plugin'|t}">
135 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Chrome {'plugin'|t}</span> 134 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Chrome {'plugin'|t}</span>
136 </a> 135 </a>
137 </div> 136 </div>
138 <div class="tools-item"> 137 <div class="tools-item">
139 <a href="https://play.google.com/store/apps/details?id=com.dimtion.shaarlier&hl=fr" 138 <a href="https://play.google.com/store/apps/details?id=com.dimtion.shaarlier&hl=fr">
140 title="Android Shaarlier">
141 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android Shaarlier</span> 139 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android Shaarlier</span>
142 </a> 140 </a>
143 </div> 141 </div>
144 <div class="tools-item"> 142 <div class="tools-item">
145 <a href="https://stakali.toneiv.eu/" 143 <a href="https://stakali.toneiv.eu/">
146 title="Android Stakali">
147 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android Stakali</span> 144 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android Stakali</span>
148 </a> 145 </a>
149 </div> 146 </div>
diff --git a/tpl/vintage/configure.html b/tpl/vintage/configure.html
index 9466c235..f1892fa1 100644
--- a/tpl/vintage/configure.html
+++ b/tpl/vintage/configure.html
@@ -59,14 +59,6 @@
59 </tr> 59 </tr>
60 60
61 <tr> 61 <tr>
62 <td><b>Redirector</b></td>
63 <td>
64 <input type="text" name="redirector" id="redirector" size="50" value="{$redirector}"><br>
65 (e.g. <i>http://anonym.to/?</i> will mask the HTTP_REFERER)
66 </td>
67 </tr>
68
69 <tr>
70 <td><b>Security:</b></td> 62 <td><b>Security:</b></td>
71 <td> 63 <td>
72 <input type="checkbox" name="disablesessionprotection" id="disablesessionprotection" 64 <input type="checkbox" name="disablesessionprotection" id="disablesessionprotection"
diff --git a/tpl/vintage/daily.html b/tpl/vintage/daily.html
index ede35910..71d84475 100644
--- a/tpl/vintage/daily.html
+++ b/tpl/vintage/daily.html
@@ -68,8 +68,12 @@
68 <div class="dailyEntryTitle"> 68 <div class="dailyEntryTitle">
69 <a href="{$link.real_url}">{$link.title}</a> 69 <a href="{$link.real_url}">{$link.title}</a>
70 </div> 70 </div>
71 {if="$link.thumbnail"} 71 {if="$thumbnails_enabled && !empty($link.thumbnail)"}
72 <div class="dailyEntryThumbnail">{$link.thumbnail}</div> 72 <div class="dailyEntryThumbnail">
73 <img data-src="{$link.thumbnail}#" class="b-lazy"
74 src=""
75 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
76 </div>
73 {/if} 77 {/if}
74 <div class="dailyEntryDescription">{$link.formatedDescription}</div> 78 <div class="dailyEntryDescription">{$link.formatedDescription}</div>
75 79
@@ -97,5 +101,6 @@
97 <div id="closing"><img src="img/squiggle_closing.png" width="66" height="61" alt="-"></div> 101 <div id="closing"><img src="img/squiggle_closing.png" width="66" height="61" alt="-"></div>
98</div> 102</div>
99{include="page.footer"} 103{include="page.footer"}
104<script src="js/thumbnails.min.js?v={$version_hash}"></script>
100</body> 105</body>
101</html> 106</html>
diff --git a/tpl/vintage/dailyrss.html b/tpl/vintage/dailyrss.html
index ddbd6c5e..f589b06e 100644
--- a/tpl/vintage/dailyrss.html
+++ b/tpl/vintage/dailyrss.html
@@ -4,11 +4,11 @@
4 <link>{$absurl}</link> 4 <link>{$absurl}</link>
5 <pubDate>{$rssdate}</pubDate> 5 <pubDate>{$rssdate}</pubDate>
6 <description><![CDATA[ 6 <description><![CDATA[
7 {loop="$links"} 7 {loop="links"}
8 <h3><a href="{$value.url}">{$value.title}</a></h3> 8 <h3><a href="{$value.url}">{$value.title}</a></h3>
9 <small>{if="!$hide_timestamps"}{function="strftime('%c', $value.timestamp)"} - {/if}{if="$value.tags"}{$value.tags}{/if}<br> 9 <small>{if="!$hide_timestamps"}{function="strftime('%c', $value.timestamp)"} - {/if}{if="$value.tags"}{$value.tags}{/if}<br>
10 {$value.url}</small><br> 10 {$value.url}</small><br>
11 {if="$value.thumbnail"}{$value.thumbnail}{/if}<br> 11 {if="$value.thumbnail"}<img src="{$index_url}{$value.thumbnail}#" alt="thumbnail" />{/if}<br>
12 {if="$value.description"}{$value.formatedDescription}{/if} 12 {if="$value.description"}{$value.formatedDescription}{/if}
13 <br><br><hr> 13 <br><br><hr>
14 {/loop} 14 {/loop}
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 @@
85 <a href="{$value.real_url}"> 85 <a href="{$value.real_url}">
86 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} 86 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
87 <img data-src="{$value.thumbnail}#" class="b-lazy" 87 <img data-src="{$value.thumbnail}#" class="b-lazy"
88 src="#" 88 src=""
89 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" /> 89 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
90 </a> 90 </a>
91 </div> 91 </div>
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 @@
17 <div class="picwall_pictureframe"> 17 <div class="picwall_pictureframe">
18 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore} 18 {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
19 <img data-src="{$value.thumbnail}#" class="b-lazy" 19 <img data-src="{$value.thumbnail}#" class="b-lazy"
20 src="#" 20 src=""
21 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" /> 21 alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
22 <a href="{$value.real_url}"><span class="info">{$value.title}</span></a> 22 <a href="{$value.real_url}"><span class="info">{$value.title}</span></a>
23 {loop="$value.picwall_plugin"} 23 {loop="$value.picwall_plugin"}