aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.travis.yml36
-rw-r--r--.zappr.yaml26
-rw-r--r--CHANGELOG.md53
-rw-r--r--README.md6
-rw-r--r--app/config/config.yml60
-rw-r--r--app/config/config_dev.yml17
-rw-r--r--app/config/config_prod.yml14
-rw-r--r--app/config/routing.yml4
-rw-r--r--app/config/routing_dev.yml6
-rw-r--r--app/config/security.yml16
l---------bin/doctrine1
l---------bin/doctrine-dbal1
l---------bin/doctrine-migrations1
l---------bin/doctrine.php1
l---------bin/php-cs-fixer1
l---------bin/phpunit1
l---------bin/security-checker1
-rwxr-xr-xbin/symfony_requirements2
-rw-r--r--composer.json12
-rw-r--r--docs/de/developer/api.rst270
-rw-r--r--docs/de/developer/docker.rst57
-rw-r--r--docs/de/developer/documentation.rst10
-rw-r--r--docs/de/developer/maintenance.rst32
-rw-r--r--docs/de/developer/translate.rst57
-rw-r--r--docs/de/index.rst52
-rw-r--r--docs/de/user/android.rst107
-rw-r--r--docs/de/user/annotations.rst24
-rw-r--r--docs/de/user/configuration.rst119
-rw-r--r--docs/de/user/create_account.rst25
-rw-r--r--docs/de/user/download_articles.rst17
-rw-r--r--docs/de/user/errors_during_fetching.rst28
-rw-r--r--docs/de/user/faq.rst45
-rw-r--r--docs/de/user/filters.rst49
-rw-r--r--docs/de/user/first_article.rst68
-rw-r--r--docs/de/user/import.rst46
-rw-r--r--docs/de/user/installation.rst326
-rw-r--r--docs/de/user/login.rst13
-rw-r--r--docs/de/user/migration.rst62
-rw-r--r--docs/de/user/tags.rst2
-rw-r--r--docs/de/user/upgrade.rst32
-rw-r--r--docs/en/user/android.rst20
-rw-r--r--docs/en/user/configuration.rst2
-rw-r--r--docs/en/user/faq.rst29
-rw-r--r--docs/en/user/installation.rst72
-rw-r--r--docs/fr/user/configuration.rst2
-rw-r--r--docs/fr/user/installation.rst4
-rw-r--r--docs/img/user/android_configuration_connection_test.en.pngbin0 -> 80965 bytes
-rw-r--r--docs/img/user/android_configuration_connection_test_success.en.pngbin0 -> 82290 bytes
-rw-r--r--docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.pngbin0 -> 106816 bytes
-rw-r--r--docs/img/user/android_configuration_filled_in.en.pngbin0 -> 98558 bytes
-rw-r--r--docs/img/user/android_configuration_get_feed_credentials.en.pngbin0 -> 81325 bytes
-rw-r--r--docs/img/user/android_configuration_saved_feed_update.en.pngbin0 -> 53196 bytes
-rw-r--r--docs/img/user/android_configuration_screen.en.pngbin0 -> 93709 bytes
-rw-r--r--docs/img/user/android_configuration_scroll_bottom.en.pngbin0 -> 98160 bytes
-rw-r--r--docs/img/user/android_unread_feed_synced.en.pngbin0 -> 89415 bytes
-rw-r--r--docs/img/user/android_welcome_screen.en.pngbin0 -> 51580 bytes
-rw-r--r--phpunit.xml.dist16
-rw-r--r--src/Wallabag/ApiBundle/Controller/WallabagRestController.php8
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php26
-rw-r--r--src/Wallabag/CoreBundle/Controller/FooterController.php27
-rw-r--r--src/Wallabag/CoreBundle/Controller/StaticController.php4
-rw-r--r--src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php7
-rw-r--r--src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php8
-rw-r--r--src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php1
-rw-r--r--src/Wallabag/CoreBundle/Entity/Entry.php19
-rw-r--r--src/Wallabag/CoreBundle/Entity/Tag.php23
-rw-r--r--src/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformer.php2
-rw-r--r--src/Wallabag/CoreBundle/Form/Type/ConfigType.php6
-rw-r--r--src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php36
-rw-r--r--src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php6
-rw-r--r--src/Wallabag/CoreBundle/Resources/config/parameters.yml12
-rw-r--r--src/Wallabag/CoreBundle/Resources/public/themes/baggy/css/ratatouille.css2
-rwxr-xr-xsrc/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css3
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.da.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.de.yml9
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.en.yml31
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.es.yml9
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml51
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml15
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.it.yml6
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig3
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig5
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig17
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig10
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig7
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig19
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig10
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/footer.html.twig41
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig42
-rw-r--r--src/Wallabag/CoreBundle/Tests/WallabagCoreTestCase.php51
-rw-r--r--src/Wallabag/ImportBundle/Import/AbstractImport.php47
-rw-r--r--src/Wallabag/ImportBundle/Import/PocketImport.php21
-rw-r--r--src/Wallabag/ImportBundle/Import/WallabagImport.php29
-rw-r--r--src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php65
-rw-r--r--src/Wallabag/UserBundle/Resources/views/TwoFactor/email_auth_code.html.twig2
-rw-r--r--tests/Wallabag/AnnotationBundle/Controller/AnnotationControllerTest.php (renamed from src/Wallabag/AnnotationBundle/Tests/Controller/AnnotationControllerTest.php)4
-rw-r--r--tests/Wallabag/AnnotationBundle/WallabagAnnotationTestCase.php (renamed from src/Wallabag/AnnotationBundle/Tests/WallabagAnnotationTestCase.php)2
-rw-r--r--tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php (renamed from src/Wallabag/ApiBundle/Tests/Controller/WallabagRestControllerTest.php)91
-rw-r--r--tests/Wallabag/ApiBundle/WallabagApiTestCase.php (renamed from src/Wallabag/ApiBundle/Tests/WallabagApiTestCase.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Command/InstallCommandTest.php (renamed from src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php)26
-rw-r--r--tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php (renamed from src/Wallabag/CoreBundle/Tests/Command/TagAllCommandTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/DeveloperControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/DeveloperControllerTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php)92
-rw-r--r--tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/ExportControllerTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/RssControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/SecurityControllerTest.php)6
-rw-r--r--tests/Wallabag/CoreBundle/Controller/SettingsControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/SettingsControllerTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/StaticControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/StaticControllerTest.php)4
-rw-r--r--tests/Wallabag/CoreBundle/Controller/TagControllerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php)10
-rw-r--r--tests/Wallabag/CoreBundle/EventListener/LocaleListenerTest.php (renamed from src/Wallabag/CoreBundle/Tests/EventListener/LocaleListenerTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListenerTest.php (renamed from src/Wallabag/CoreBundle/Tests/EventListener/RegistrationConfirmedListenerTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/EventListener/UserLocaleListenerTest.php (renamed from src/Wallabag/CoreBundle/Tests/EventListener/UserLocaleListenerTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Form/DataTransformer/StringToListTransformerTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php (renamed from src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Helper/RedirectTest.php (renamed from src/Wallabag/CoreBundle/Tests/Helper/RedirectTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Helper/RuleBasedTaggerTest.php (renamed from src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Mock/InstallCommandMock.php (renamed from src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php)2
-rw-r--r--tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php (renamed from src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriberTest.php (renamed from src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php (renamed from src/Wallabag/CoreBundle/Tests/Twig/WallabagExtensionTest.php)2
-rw-r--r--tests/Wallabag/CoreBundle/WallabagCoreTestCase.php83
-rw-r--r--tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php (renamed from src/Wallabag/ImportBundle/Tests/Controller/ImportControllerTest.php)4
-rw-r--r--tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php108
-rw-r--r--tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php (renamed from src/Wallabag/ImportBundle/Tests/Controller/WallabagV1ControllerTest.php)4
-rw-r--r--tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php (renamed from src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php)4
-rw-r--r--tests/Wallabag/ImportBundle/Import/ImportChainTest.php (renamed from src/Wallabag/ImportBundle/Tests/Import/ImportChainTest.php)2
-rw-r--r--tests/Wallabag/ImportBundle/Import/ImportCompilerPassTest.php (renamed from src/Wallabag/ImportBundle/Tests/Import/ImportCompilerPassTest.php)2
-rw-r--r--tests/Wallabag/ImportBundle/Import/PocketImportTest.php (renamed from src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php)53
-rw-r--r--tests/Wallabag/ImportBundle/Import/WallabagV1ImportTest.php (renamed from src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php)2
-rw-r--r--tests/Wallabag/ImportBundle/Import/WallabagV2ImportTest.php (renamed from src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php)42
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/test.html (renamed from src/Wallabag/ImportBundle/Tests/fixtures/test.html)0
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/test.txt (renamed from src/Wallabag/ImportBundle/Tests/fixtures/test.txt)0
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/unnamed.pngbin0 -> 3688 bytes
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/wallabag-v1-read.json (renamed from src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1-read.json)0
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/wallabag-v1.json (renamed from src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json)0
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json0
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/wallabag-v2-read.json (renamed from src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2-read.json)0
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/wallabag-v2.json (renamed from src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json)0
-rw-r--r--tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php (renamed from src/Wallabag/UserBundle/Tests/Mailer/AuthCodeMailerTest.php)2
-rw-r--r--var/SymfonyRequirements.php13
-rw-r--r--web/app.php10
148 files changed, 2681 insertions, 496 deletions
diff --git a/.gitignore b/.gitignore
index 02e921f8..f596c7b8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,9 @@
10/var/sessions/* 10/var/sessions/*
11!var/sessions/.gitkeep 11!var/sessions/.gitkeep
12!var/SymfonyRequirements.php 12!var/SymfonyRequirements.php
13/bin/*
14!/bin/console
15!/bin/symfony_requirements
13 16
14# Parameters 17# Parameters
15/app/config/parameters.yml 18/app/config/parameters.yml
diff --git a/.travis.yml b/.travis.yml
index d397c872..73f9491a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,7 +20,8 @@ php:
20 - 5.5 20 - 5.5
21 - 5.6 21 - 5.6
22 - 7.0 22 - 7.0
23 - hhvm 23 - 7.1
24 - nightly
24 25
25env: 26env:
26 - DB=mysql 27 - DB=mysql
@@ -30,13 +31,30 @@ env:
30matrix: 31matrix:
31 fast_finish: true 32 fast_finish: true
32 include: 33 include:
34 # driver for PostgreSQL currently unsupported by HHVM, requires 3rd party dependency
35 - php: hhvm-3.12
36 sudo: required
37 dist: trusty
38 group: edge
39 env: DB=mysql
40 addons:
41 apt:
42 packages:
43 - mysql-server-5.6
44 - mysql-client-core-5.6
45 - mysql-client-5.6
46 services:
47 - mysql
48 - php: hhvm-3.12
49 sudo: required
50 dist: trusty
51 group: edge
52 env: DB=sqlite
33 - php: 7.0 53 - php: 7.0
34 env: CS_FIXER=run VALIDATE_TRANSLATION_FILE=run DB=sqlite 54 env: CS_FIXER=run VALIDATE_TRANSLATION_FILE=run DB=sqlite
35 exclude:
36 - php: hhvm
37 env: DB=pgsql # driver for PostgreSQL currently unsupported by HHVM, requires 3rd party dependency
38 allow_failures: 55 allow_failures:
39 - php: hhvm 56 - php: hhvm-3.12
57 - php: nightly
40 58
41# exclude v1 branches 59# exclude v1 branches
42branches: 60branches:
@@ -44,8 +62,10 @@ branches:
44 - legacy 62 - legacy
45 63
46before_script: 64before_script:
47 - if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi; 65 - PHP=$TRAVIS_PHP_VERSION
48 - if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then phpenv config-rm xdebug.ini; fi; 66 - if [[ ! $PHP = hhvm* ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;
67 # xdebug isn't enable for PHP 7.1
68 - if [[ ! $PHP = hhvm* ]]; then phpenv config-rm xdebug.ini || echo "xdebug not available"; fi
49 - composer self-update --no-progress 69 - composer self-update --no-progress
50 - if [[ "$DB" = "pgsql" ]]; then psql -c 'create database wallabag_test;' -U postgres; fi; 70 - if [[ "$DB" = "pgsql" ]]; then psql -c 'create database wallabag_test;' -U postgres; fi;
51 71
@@ -55,6 +75,6 @@ before_install:
55script: 75script:
56 - travis_wait composer install --no-interaction --no-progress --prefer-dist -o 76 - travis_wait composer install --no-interaction --no-progress --prefer-dist -o
57 - ant prepare-$DB 77 - ant prepare-$DB
58 - bin/phpunit -v 78 - phpunit -v
59 - if [ "$CS_FIXER" = "run" ]; then php bin/php-cs-fixer fix src/ --verbose --dry-run ; fi; 79 - if [ "$CS_FIXER" = "run" ]; then php bin/php-cs-fixer fix src/ --verbose --dry-run ; fi;
60 - if [ "$VALIDATE_TRANSLATION_FILE" = "run" ]; then php bin/console lint:yaml src/Wallabag/CoreBundle/Resources/translations -v ; fi; 80 - if [ "$VALIDATE_TRANSLATION_FILE" = "run" ]; then php bin/console lint:yaml src/Wallabag/CoreBundle/Resources/translations -v ; fi;
diff --git a/.zappr.yaml b/.zappr.yaml
new file mode 100644
index 00000000..f90cd809
--- /dev/null
+++ b/.zappr.yaml
@@ -0,0 +1,26 @@
1# see https://zappr.opensource.zalan.do/
2autobranch: false
3commit: false
4approvals:
5 minimum: 1
6 ignore: pr_opener
7 pattern: "^(:\\+1:|ðŸ‘)$"
8 veto:
9 pattern: "^(:\\-1:|👎)$"
10 from:
11 orgs:
12 - wallabag
13 collaborators: true
14specification:
15 title:
16 minimum-length:
17 enabled: true
18 length: 8
19 body:
20 minimum-length:
21 enabled: true
22 length: 8
23 contains-url: false
24 contains-issue-number: false
25 template:
26 differs-from-body: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fcc9dfbb..a6f7e168 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,59 @@
2 2
3All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). 3All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
4 4
5## [2.0.7] - 2016-08-22
6
7### Added
8
9- [#2222](https://github.com/wallabag/wallabag/pull/2222) Added creation date and reading time on article view (Nicolas LÅ“uillet)
10- [#2134](https://github.com/wallabag/wallabag/pull/2134) Run tests on an uptodate HHVM (Jeremy Benoist)
11
12### Changed
13
14- [#2221](https://github.com/wallabag/wallabag/pull/2221) Replaced favorite word/icon with star one (Nicolas LÅ“uillet)
15
16### Fixed
17
18- [#2224](https://github.com/wallabag/wallabag/pull/2224) Avoid breaking import when fetching fail (Jeremy Benoist)
19- [#2216](https://github.com/wallabag/wallabag/pull/2216), [#2220](https://github.com/wallabag/wallabag/pull/2220) Enable CORS headers for OAUTH part (Rurik19)
20- [#2095](https://github.com/wallabag/wallabag/pull/2095) Fix form user display when 2FA is disabled (Nicolas LÅ“uillet)
21
22## [2.0.6] - 2016-08-10
23
24### Changed
25
26- [#2199](https://github.com/wallabag/wallabag/pull/2199) Handling socials links into a config file (Simon Alberny)
27- [#2172](https://github.com/wallabag/wallabag/pull/2172) Change the way to login user in tests (Jeremy Benoist)
28- [#2155](https://github.com/wallabag/wallabag/pull/2155) Use friendsofphp instead of fabpot for PHP CS Fixer (Jeremy Benoist)
29
30### Fixed
31
32- [#2200](https://github.com/wallabag/wallabag/pull/2200) Fixed typo in entry:notice:entry_saved (charno6)
33- [#2185](https://github.com/wallabag/wallabag/pull/2185) Fix 3rd-Party Apps links (Chrome & Firefox) (Thomas Citharel)
34- [#2165](https://github.com/wallabag/wallabag/pull/2165) Fix a few french translations typos (Thomas Citharel)
35- [#2157](https://github.com/wallabag/wallabag/pull/2157) Handle only upper or only lower reading filter (Jeremy Benoist)
36- [#2156](https://github.com/wallabag/wallabag/pull/2156) Try to find bad redirection after delete (Jeremy Benoist)
37
38## [2.0.5] - 2016-05-31
39
40### Added
41
42- [#2052](https://github.com/wallabag/wallabag/pull/2052) Add unread filter to entries pages (Dan Bartram)
43
44### Changed
45
46- [#2093](https://github.com/wallabag/wallabag/pull/2093) Replace vertical dots in material theme with horizontal dots (Nicolas LÅ“uillet)
47- [#2054](https://github.com/wallabag/wallabag/pull/2054) Update italian translation (Daniele Conca)
48- [#2068](https://github.com/wallabag/wallabag/pull/2068), [#2049](https://github.com/wallabag/wallabag/pull/2049) Update documentation (Josh Panter, Mario Vormstein)
49
50### Fixed
51
52- [#2122](https://github.com/wallabag/wallabag/pull/2122) Fix the deletion of Tags/Entries relation when delete an entry (Jeremy Benoist, Nicolas LÅ“uillet)
53- [#2095](https://github.com/wallabag/wallabag/pull/2095) Fix form user display when 2FA is disabled (Nicolas LÅ“uillet)
54- [#2092](https://github.com/wallabag/wallabag/pull/2092) API: Starred and archived clears if article is already exists (Rurik19)
55- [#2097](https://github.com/wallabag/wallabag/issues/2097) Fix image path in 2-factor authentification email (Baptiste Mille-Mathias)
56- [#2069](https://github.com/wallabag/wallabag/pull/2069) Do not specify language in Firefox addon link (Merouane Atig)
57
5## [2.0.4] - 2016-05-07 58## [2.0.4] - 2016-05-07
6 59
7### Added 60### Added
diff --git a/README.md b/README.md
index cbe4c831..6053e6d9 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
1[![Build Status](https://api.travis-ci.org/wallabag/wallabag.svg?branch=master)](https://travis-ci.org/wallabag/wallabag) 1[![Build Status](https://api.travis-ci.org/wallabag/wallabag.svg?branch=master)](https://travis-ci.org/wallabag/wallabag)
2[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/wallabag/wallabag/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/wallabag/wallabag/?branch=v2) 2[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/wallabag/wallabag/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/wallabag/wallabag/?branch=master)
3[![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/wallabag/wallabag) 3[![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/wallabag/wallabag)
4 4
5# What is wallabag? 5# What is wallabag?
@@ -10,13 +10,13 @@ More informations on our website: [wallabag.org](https://wallabag.org)
10 10
11# Install wallabag 11# Install wallabag
12 12
13If you don't have it yet, please [install composer](https://getcomposer.org/download/). 13If you don't have it yet, please [install composer](https://getcomposer.org/download/) or be sure to use Composer 1.2 (`composer selfupdate` can help you about that).
14Then you can install wallabag by executing the following commands: 14Then you can install wallabag by executing the following commands:
15 15
16``` 16```
17 git clone https://github.com/wallabag/wallabag.git 17 git clone https://github.com/wallabag/wallabag.git
18 cd wallabag 18 cd wallabag
19 git checkout 2.0.4 19 git checkout 2.0.7
20 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist 20 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
21 php bin/console wallabag:install --env=prod 21 php bin/console wallabag:install --env=prod
22 php bin/console server:run --env=prod 22 php bin/console server:run --env=prod
diff --git a/app/config/config.yml b/app/config/config.yml
index 689cccec..49b325a2 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -5,30 +5,32 @@ imports:
5 5
6framework: 6framework:
7 #esi: ~ 7 #esi: ~
8 translator: { fallback: "%locale%" } 8 translator:
9 secret: "%secret%" 9 enabled: true
10 fallback: "%locale%"
11 secret: "%secret%"
10 router: 12 router:
11 resource: "%kernel.root_dir%/config/routing.yml" 13 resource: "%kernel.root_dir%/config/routing.yml"
12 strict_requirements: ~ 14 strict_requirements: ~
13 form: ~ 15 form: ~
14 csrf_protection: ~ 16 csrf_protection: ~
15 validation: { enable_annotations: true } 17 validation:
18 enable_annotations: true
16 templating: 19 templating:
17 engines: ['twig'] 20 engines: ['twig']
18 #assets_version: SomeVersionScheme 21 default_locale: "%locale%"
19 default_locale: "%locale%" 22 trusted_hosts: ~
20 trusted_hosts: ~
21 trusted_proxies: ~ 23 trusted_proxies: ~
22 session: 24 session:
23 # handler_id set to null will use default session handler from php.ini 25 # handler_id set to null will use default session handler from php.ini
24 handler_id: session.handler.native_file 26 handler_id: session.handler.native_file
25 save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%" 27 save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
26 fragments: ~ 28 fragments: ~
27 http_method_override: true 29 http_method_override: true
28 assets: ~ 30 assets: ~
29 31
30wallabag_core: 32wallabag_core:
31 version: 2.0.4 33 version: 2.0.7
32 paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb" 34 paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
33 languages: 35 languages:
34 en: 'English' 36 en: 'English'
@@ -54,14 +56,14 @@ wallabag_import:
54 56
55# Twig Configuration 57# Twig Configuration
56twig: 58twig:
57 debug: "%kernel.debug%" 59 debug: "%kernel.debug%"
58 strict_variables: "%kernel.debug%" 60 strict_variables: "%kernel.debug%"
59 form_themes: 61 form_themes:
60 - "LexikFormFilterBundle:Form:form_div_layout.html.twig" 62 - "LexikFormFilterBundle:Form:form_div_layout.html.twig"
61 63
62# Assetic Configuration 64# Assetic Configuration
63assetic: 65assetic:
64 debug: "%kernel.debug%" 66 debug: "%kernel.debug%"
65 use_controller: false 67 use_controller: false
66 bundles: [ ] 68 bundles: [ ]
67 #java: /usr/bin/java 69 #java: /usr/bin/java
@@ -75,14 +77,14 @@ assetic:
75# Doctrine Configuration 77# Doctrine Configuration
76doctrine: 78doctrine:
77 dbal: 79 dbal:
78 driver: "%database_driver%" 80 driver: "%database_driver%"
79 host: "%database_host%" 81 host: "%database_host%"
80 port: "%database_port%" 82 port: "%database_port%"
81 dbname: "%database_name%" 83 dbname: "%database_name%"
82 user: "%database_user%" 84 user: "%database_user%"
83 password: "%database_password%" 85 password: "%database_password%"
84 charset: UTF8 86 charset: UTF8
85 path: "%database_path%" 87 path: "%database_path%"
86 server_version: 5.6 88 server_version: 5.6
87 89
88 orm: 90 orm:
@@ -108,10 +110,11 @@ doctrine_migrations:
108# Swiftmailer Configuration 110# Swiftmailer Configuration
109swiftmailer: 111swiftmailer:
110 transport: "%mailer_transport%" 112 transport: "%mailer_transport%"
111 host: "%mailer_host%" 113 host: "%mailer_host%"
112 username: "%mailer_user%" 114 username: "%mailer_user%"
113 password: "%mailer_password%" 115 password: "%mailer_password%"
114 spool: { type: memory } 116 spool:
117 type: memory
115 118
116fos_rest: 119fos_rest:
117 param_fetcher_listener: true 120 param_fetcher_listener: true
@@ -150,6 +153,11 @@ nelmio_cors:
150 '^/api/': 153 '^/api/':
151 allow_origin: ['*'] 154 allow_origin: ['*']
152 allow_headers: ['X-Custom-Auth'] 155 allow_headers: ['X-Custom-Auth']
156 allow_methods: ['POST', 'PUT', 'PATCH','GET', 'DELETE']
157 max_age: 3600
158 '^/oauth/':
159 allow_origin: ['*']
160 allow_headers: ['X-Custom-Auth']
153 allow_methods: ['POST', 'PUT', 'GET', 'DELETE'] 161 allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
154 max_age: 3600 162 max_age: 3600
155 '^/': 163 '^/':
@@ -169,17 +177,17 @@ liip_theme:
169 177
170 path_patterns: 178 path_patterns:
171 bundle_resource: 179 bundle_resource:
172 - %%bundle_path%%/Resources/views/themes/%%current_theme%%/%%template%% 180 - "%%bundle_path%%/Resources/views/themes/%%current_theme%%/%%template%%"
173 181
174fos_user: 182fos_user:
175 db_driver: orm 183 db_driver: orm
176 firewall_name: main 184 firewall_name: secured_area
177 user_class: Wallabag\UserBundle\Entity\User 185 user_class: Wallabag\UserBundle\Entity\User
178 registration: 186 registration:
179 confirmation: 187 confirmation:
180 enabled: %fosuser_confirmation% 188 enabled: "%fosuser_confirmation%"
181 from_email: 189 from_email:
182 address: %from_email% 190 address: "%from_email%"
183 sender_name: wallabag 191 sender_name: wallabag
184fos_oauth_server: 192fos_oauth_server:
185 db_driver: orm 193 db_driver: orm
@@ -197,8 +205,8 @@ scheb_two_factor:
197 cookie_lifetime: 2592000 205 cookie_lifetime: 2592000
198 206
199 email: 207 email:
200 enabled: %twofactor_auth% 208 enabled: "%twofactor_auth%"
201 sender_email: %twofactor_sender% 209 sender_email: "%twofactor_sender%"
202 digits: 6 210 digits: 6
203 template: WallabagUserBundle:Authentication:form.html.twig 211 template: WallabagUserBundle:Authentication:form.html.twig
204 mailer: wallabag_user.auth_code_mailer 212 mailer: wallabag_user.auth_code_mailer
diff --git a/app/config/config_dev.yml b/app/config/config_dev.yml
index 2813e369..0fa23dbf 100644
--- a/app/config/config_dev.yml
+++ b/app/config/config_dev.yml
@@ -5,7 +5,8 @@ framework:
5 router: 5 router:
6 resource: "%kernel.root_dir%/config/routing_dev.yml" 6 resource: "%kernel.root_dir%/config/routing_dev.yml"
7 strict_requirements: true 7 strict_requirements: true
8 profiler: { only_exceptions: false } 8 profiler:
9 only_exceptions: false
9 10
10web_profiler: 11web_profiler:
11 toolbar: true 12 toolbar: true
@@ -14,19 +15,19 @@ web_profiler:
14monolog: 15monolog:
15 handlers: 16 handlers:
16 main: 17 main:
17 type: stream 18 type: stream
18 path: "%kernel.logs_dir%/%kernel.environment%.log" 19 path: "%kernel.logs_dir%/%kernel.environment%.log"
19 level: debug 20 level: debug
20 channels: [!event] 21 channels: ['!event']
21 console: 22 console:
22 type: console 23 type: console
23 bubble: false 24 bubble: false
24 verbosity_levels: 25 verbosity_levels:
25 VERBOSITY_VERBOSE: INFO 26 VERBOSITY_VERBOSE: INFO
26 VERBOSITY_VERY_VERBOSE: DEBUG 27 VERBOSITY_VERY_VERBOSE: DEBUG
27 channels: [!event, !doctrine] 28 channels: ['!event', '!doctrine']
28 console_very_verbose: 29 console_very_verbose:
29 type: console 30 type: console
30 bubble: false 31 bubble: false
31 verbosity_levels: 32 verbosity_levels:
32 VERBOSITY_VERBOSE: NOTICE 33 VERBOSITY_VERBOSE: NOTICE
diff --git a/app/config/config_prod.yml b/app/config/config_prod.yml
index 342837a0..5a4dd69e 100644
--- a/app/config/config_prod.yml
+++ b/app/config/config_prod.yml
@@ -2,8 +2,8 @@ imports:
2 - { resource: config.yml } 2 - { resource: config.yml }
3 3
4#framework: 4#framework:
5# validation: 5# cache:
6# cache: apc 6# system: cache.adapter.apcu
7 7
8#doctrine: 8#doctrine:
9# orm: 9# orm:
@@ -14,12 +14,12 @@ imports:
14monolog: 14monolog:
15 handlers: 15 handlers:
16 main: 16 main:
17 type: fingers_crossed 17 type: fingers_crossed
18 action_level: error 18 action_level: error
19 handler: nested 19 handler: nested
20 nested: 20 nested:
21 type: stream 21 type: stream
22 path: "%kernel.logs_dir%/%kernel.environment%.log" 22 path: "%kernel.logs_dir%/%kernel.environment%.log"
23 level: debug 23 level: debug
24 console: 24 console:
25 type: console 25 type: console
diff --git a/app/config/routing.yml b/app/config/routing.yml
index 6a6aa6ac..40cc7165 100644
--- a/app/config/routing.yml
+++ b/app/config/routing.yml
@@ -4,8 +4,8 @@ wallabag_annotation:
4 4
5wallabag_import: 5wallabag_import:
6 resource: "@WallabagImportBundle/Controller/" 6 resource: "@WallabagImportBundle/Controller/"
7 type: annotation 7 type: annotation
8 prefix: /import 8 prefix: /import
9 9
10wallabag_api: 10wallabag_api:
11 resource: "@WallabagApiBundle/Resources/config/routing.yml" 11 resource: "@WallabagApiBundle/Resources/config/routing.yml"
diff --git a/app/config/routing_dev.yml b/app/config/routing_dev.yml
index 404f6a3b..95c1b026 100644
--- a/app/config/routing_dev.yml
+++ b/app/config/routing_dev.yml
@@ -1,14 +1,14 @@
1_wdt: 1_wdt:
2 resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" 2 resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
3 prefix: /_wdt 3 prefix: /_wdt
4 4
5_profiler: 5_profiler:
6 resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" 6 resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
7 prefix: /_profiler 7 prefix: /_profiler
8 8
9_errors: 9_errors:
10 resource: "@TwigBundle/Resources/config/routing/errors.xml" 10 resource: "@TwigBundle/Resources/config/routing/errors.xml"
11 prefix: /_error 11 prefix: /_error
12 12
13_main: 13_main:
14 resource: routing.yml 14 resource: routing.yml
diff --git a/app/config/security.yml b/app/config/security.yml
index 0748c06c..e24e03df 100644
--- a/app/config/security.yml
+++ b/app/config/security.yml
@@ -3,12 +3,14 @@ security:
3 FOS\UserBundle\Model\UserInterface: sha512 3 FOS\UserBundle\Model\UserInterface: sha512
4 4
5 role_hierarchy: 5 role_hierarchy:
6 ROLE_ADMIN: ROLE_USER 6 ROLE_ADMIN: ROLE_USER
7 ROLE_SUPER_ADMIN: [ ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ] 7 ROLE_SUPER_ADMIN: [ ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]
8 8
9 providers: 9 providers:
10 administrators: 10 administrators:
11 entity: { class: WallabagUserBundle:User, property: username } 11 entity:
12 class: WallabagUserBundle:User
13 property: username
12 fos_userbundle: 14 fos_userbundle:
13 id: fos_user.user_provider.username 15 id: fos_user.user_provider.username
14 16
@@ -31,7 +33,7 @@ security:
31 anonymous: true 33 anonymous: true
32 34
33 login_firewall: 35 login_firewall:
34 pattern: ^/login$ 36 pattern: ^/login$
35 anonymous: ~ 37 anonymous: ~
36 38
37 secured_area: 39 secured_area:
@@ -40,12 +42,12 @@ security:
40 provider: fos_userbundle 42 provider: fos_userbundle
41 csrf_token_generator: security.csrf.token_manager 43 csrf_token_generator: security.csrf.token_manager
42 44
43 anonymous: true 45 anonymous: true
44 remember_me: 46 remember_me:
45 secret: "%secret%" 47 secret: "%secret%"
46 lifetime: 31536000 48 lifetime: 31536000
47 path: / 49 path: /
48 domain: ~ 50 domain: ~
49 51
50 logout: 52 logout:
51 path: /logout 53 path: /logout
diff --git a/bin/doctrine b/bin/doctrine
deleted file mode 120000
index 0f72e36f..00000000
--- a/bin/doctrine
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/doctrine/orm/bin/doctrine \ No newline at end of file
diff --git a/bin/doctrine-dbal b/bin/doctrine-dbal
deleted file mode 120000
index 110e93c5..00000000
--- a/bin/doctrine-dbal
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/doctrine/dbal/bin/doctrine-dbal \ No newline at end of file
diff --git a/bin/doctrine-migrations b/bin/doctrine-migrations
deleted file mode 120000
index 7184da71..00000000
--- a/bin/doctrine-migrations
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/doctrine/migrations/bin/doctrine-migrations \ No newline at end of file
diff --git a/bin/doctrine.php b/bin/doctrine.php
deleted file mode 120000
index b22b74da..00000000
--- a/bin/doctrine.php
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/doctrine/orm/bin/doctrine.php \ No newline at end of file
diff --git a/bin/php-cs-fixer b/bin/php-cs-fixer
deleted file mode 120000
index 902e8f5f..00000000
--- a/bin/php-cs-fixer
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/fabpot/php-cs-fixer/php-cs-fixer \ No newline at end of file
diff --git a/bin/phpunit b/bin/phpunit
deleted file mode 120000
index 4ba32564..00000000
--- a/bin/phpunit
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/phpunit/phpunit/phpunit \ No newline at end of file
diff --git a/bin/security-checker b/bin/security-checker
deleted file mode 120000
index 85f6e8ed..00000000
--- a/bin/security-checker
+++ /dev/null
@@ -1 +0,0 @@
1../vendor/sensiolabs/security-checker/security-checker \ No newline at end of file
diff --git a/bin/symfony_requirements b/bin/symfony_requirements
index 7cd559a4..8825a964 100755
--- a/bin/symfony_requirements
+++ b/bin/symfony_requirements
@@ -13,7 +13,7 @@ echo '> PHP is using the following php.ini file:'.PHP_EOL;
13if ($iniPath) { 13if ($iniPath) {
14 echo_style('green', ' '.$iniPath); 14 echo_style('green', ' '.$iniPath);
15} else { 15} else {
16 echo_style('warning', ' WARNING: No configuration file (php.ini) used by PHP!'); 16 echo_style('yellow', ' WARNING: No configuration file (php.ini) used by PHP!');
17} 17}
18 18
19echo PHP_EOL.PHP_EOL; 19echo PHP_EOL.PHP_EOL;
diff --git a/composer.json b/composer.json
index a430c59e..c7830a14 100644
--- a/composer.json
+++ b/composer.json
@@ -43,7 +43,7 @@
43 "ext-iconv": "*", 43 "ext-iconv": "*",
44 "ext-tokenizer": "*", 44 "ext-tokenizer": "*",
45 "ext-pdo": "*", 45 "ext-pdo": "*",
46 "symfony/symfony": "3.0.*", 46 "symfony/symfony": "3.1.*",
47 "doctrine/orm": "^2.5", 47 "doctrine/orm": "^2.5",
48 "doctrine/doctrine-bundle": "^1.6", 48 "doctrine/doctrine-bundle": "^1.6",
49 "doctrine/doctrine-cache-bundle": "^1.2", 49 "doctrine/doctrine-cache-bundle": "^1.2",
@@ -74,7 +74,7 @@
74 "grandt/phpepub": "~4.0", 74 "grandt/phpepub": "~4.0",
75 "wallabag/php-mobi": "~1.0.0", 75 "wallabag/php-mobi": "~1.0.0",
76 "kphoen/rulerz-bundle": "~0.10", 76 "kphoen/rulerz-bundle": "~0.10",
77 "guzzlehttp/guzzle": "^5.2.0", 77 "guzzlehttp/guzzle": "^5.3.1",
78 "doctrine/doctrine-migrations-bundle": "^1.0", 78 "doctrine/doctrine-migrations-bundle": "^1.0",
79 "paragonie/random_compat": "~1.0", 79 "paragonie/random_compat": "~1.0",
80 "craue/config-bundle": "~1.4", 80 "craue/config-bundle": "~1.4",
@@ -85,10 +85,11 @@
85 }, 85 },
86 "require-dev": { 86 "require-dev": {
87 "doctrine/doctrine-fixtures-bundle": "~2.2", 87 "doctrine/doctrine-fixtures-bundle": "~2.2",
88 "doctrine/data-fixtures": "~1.1.1",
88 "sensio/generator-bundle": "^3.0", 89 "sensio/generator-bundle": "^3.0",
89 "phpunit/phpunit": "~4.4", 90 "phpunit/phpunit": "~4.4",
90 "symfony/phpunit-bridge": "^2.7", 91 "symfony/phpunit-bridge": "^3.0",
91 "fabpot/php-cs-fixer": "~1.9" 92 "friendsofphp/php-cs-fixer": "~1.9"
92 }, 93 },
93 "scripts": { 94 "scripts": {
94 "post-cmd": [ 95 "post-cmd": [
@@ -121,6 +122,9 @@
121 "psr-4": { "Wallabag\\": "src/Wallabag/" }, 122 "psr-4": { "Wallabag\\": "src/Wallabag/" },
122 "classmap": [ "app/AppKernel.php", "app/AppCache.php" ] 123 "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
123 }, 124 },
125 "autoload-dev": {
126 "psr-4": { "Tests\\": "tests/" }
127 },
124 "config": { 128 "config": {
125 "bin-dir": "bin" 129 "bin-dir": "bin"
126 }, 130 },
diff --git a/docs/de/developer/api.rst b/docs/de/developer/api.rst
new file mode 100644
index 00000000..f8911181
--- /dev/null
+++ b/docs/de/developer/api.rst
@@ -0,0 +1,270 @@
1API DoKumentation
2=================
3
4Dank dieser Dokumentation werden wir sehen, wie wir mit der wallabag API interagieren.
5
6Voraussetzungen
7---------------
8
9* wallabag frisch (oder nicht) installiert auf http://localhost:8000
10* ``httpie`` installiert auf deinem Computer (`siehe Projektwebsite <https://github.com/jkbrzt/httpie>`__). Beachte, dass du die Kommandos auch mit curl oder wget nutzen kannst.
11* alle API Methoden sind hier dokumentiert http://localhost:8000/api/doc
12
13Einen neuen API Client erstellen
14--------------------------------
15
16In deinem wallabag Account, kannst du einen neuen API Client unter dieser URL http://localhost:8000/developer/client/create erstellen.
17
18Gib dazu nur die Umleitungs-URL deiner Appliaktion an und erstelle deinen Client. Wenn deine Applikation eine Desktopapplikation ist, trage die URL, die dir am besten passt, ein.
19
20Du bekommst Informationen wie diese:
21
22::
23
24 Client ID:
25
26 1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc
27
28 Client secret:
29
30 636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4
31
32
33Einen Aktualisierungstoken erhalten
34-----------------------------------
35
36Für jeden API Aufruf brauchst du einen Token. Lass uns einen erstellen mit diesem Kommando (ersetze ``client_id``, ``client_secret``, ``username`` und ``password`` mit ihren Werten):
37
38::
39
40 http POST http://localhost:8000/oauth/v2/token \
41 grant_type=password \
42 client_id=1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc \
43 client_secret=636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4 \
44 username=wallabag \
45 password=wallabag
46
47Du bekommst folgendes zurück:
48
49::
50
51 HTTP/1.1 200 OK
52 Cache-Control: no-store, private
53 Connection: close
54 Content-Type: application/json
55 Date: Tue, 05 Apr 2016 08:44:33 GMT
56 Host: localhost:8000
57 Pragma: no-cache
58 X-Debug-Token: 19c8e0
59 X-Debug-Token-Link: /_profiler/19c8e0
60 X-Powered-By: PHP/7.0.4
61
62 {
63 "access_token": "ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA",
64 "expires_in": 3600,
65 "refresh_token": "OTNlZGE5OTJjNWQwYzc2NDI5ZGE5MDg3ZTNjNmNkYTY0ZWZhZDVhNDBkZTc1ZTNiMmQ0MjQ0OThlNTFjNTQyMQ",
66 "scope": null,
67 "token_type": "bearer"
68 }
69
70Wir werden mit dem ``access_token`` Wert in unseren nächsten Aufrufen arbeiten.
71
72cURL Beispiel:
73
74::
75
76 curl -s "https://localhost:8000/oauth/v2/token?grant_type=password&client_id=1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc&client_secret=636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4&username=wallabag&password=wallabag"
77
78Existierende Einträge erhalten
79------------------------------
80
81Dokumentation für diese Methode: http://localhost:8000/api/doc#get--api-entries.{_format}
82
83Da wir auf einer neuen wallabag Installation arbeiten, bekommen wir keine Ergebnisse mit diesem Kommando:
84
85::
86
87 http GET http://localhost:8000/api/entries.json \
88 "Authorization:Bearer ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
89
90gibt zurück:
91
92::
93
94 HTTP/1.1 200 OK
95 0: application/json
96 Cache-Control: no-cache
97 Connection: close
98 Content-Type: application/json
99 Date: Tue, 05 Apr 2016 08:51:32 GMT
100 Host: localhost:8000
101 Set-Cookie: PHPSESSID=nrogm748md610ovhu6j70c3q63; path=/; HttpOnly
102 X-Debug-Token: 4fbbc4
103 X-Debug-Token-Link: /_profiler/4fbbc4
104 X-Powered-By: PHP/7.0.4
105
106 {
107 "_embedded": {
108 "items": []
109 },
110 "_links": {
111 "first": {
112 "href": "http://localhost:8000/api/entries?page=1&perPage=30"
113 },
114 "last": {
115 "href": "http://localhost:8000/api/entries?page=1&perPage=30"
116 },
117 "self": {
118 "href": "http://localhost:8000/api/entries?page=1&perPage=30"
119 }
120 },
121 "limit": 30,
122 "page": 1,
123 "pages": 1,
124 "total": 0
125 }
126
127Das Array ``items`` ist leer.
128
129cURL Beispiel:
130
131::
132
133 curl --get "https://localhost:8000/api/entries.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
134
135Deinen ersten Eintrag hinzufügen
136--------------------------------
137
138Dokumentation für diese Methode: http://localhost:8000/api/doc#post--api-entries.{_format}
139
140::
141
142 http POST http://localhost:8000/api/entries.json \
143 "Authorization:Bearer ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA" \
144 url="http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html"
145
146gibt zurück:
147
148::
149
150 HTTP/1.1 200 OK
151 0: application/json
152 Cache-Control: no-cache
153 Connection: close
154 Content-Type: application/json
155 Date: Tue, 05 Apr 2016 09:07:54 GMT
156 Host: localhost:8000
157 Set-Cookie: PHPSESSID=bjie40ck72kp2pst3i71gf43a4; path=/; HttpOnly
158 X-Debug-Token: e01c51
159 X-Debug-Token-Link: /_profiler/e01c51
160 X-Powered-By: PHP/7.0.4
161
162 {
163 "_links": {
164 "self": {
165 "href": "/api/entries/1"
166 }
167 },
168 "content": "<p class=\"chapo\">Fonctionnant sur le même principe que Pocket, Instapaper ou Readability, le logiciel Wallabag permet de mémoriser des articles pour les lire plus tard. Sa nouvelle version apporte une multitude de nouvelles fonctionnalités.</p><p>Si vous utilisez Firefox comme navigateur web, vous avez peut-être constaté l’arrivée d’<a href=\"http://www.numerama.com/magazine/33292-update-firefox.html\">une fonctionnalité intitulée Pocket</a>. Disponible autrefois sous la forme d’un module complémentaire, et sous un autre nom (Read it Later), elle est depuis le mois de juin 2015 directement incluse au sein de Firefox.</p>\n<p>Concrètement, Pocket sert à garder en mémoire des contenus que vous croisez au fil de la navigation, comme des articles de presse ou des vidéos, afin de pouvoir les consulter plus tard. Pocket fonctionne un peu comme un système de favoris, mais en bien plus élaboré grâce à ses options supplémentaires.</p>\n<p>Mais <a href=\"https://en.wikipedia.org/wiki/Pocket_%28application%29#Firefox_integration\" target=\"_blank\">Pocket fait polémique</a>, car il s’agit d’un projet propriétaire qui est intégré dans un logiciel libre. C’est pour cette raison que des utilisateurs ont choisi de se tourner vers d’autres solutions, comme <strong>Wallabag</strong>, qui est l’équivalent libre de Pocket et d’autres systèmes du même genre, comme Instapaper et Readability.</p>\n<p>Et justement, Wallabag évolue. C’est ce dimanche que la <a href=\"https://www.wallabag.org/blog/2016/04/03/wallabag-v2\" target=\"_blank\">version 2.0.0 du logiciel</a> a été publiée par l’équipe en  charge de son développement et celle-ci contient de nombreux changements par rapport aux moutures précédentes (la <a href=\"http://doc.wallabag.org/fr/v2/\" target=\"_blank\">documentation est traduite</a> en français), lui permettant d’apparaître comme une alternative à Pocket, Instapaper et Readability.</p>\n<p><img class=\"aligncenter size-medium wp-image-160439\" src=\"http://www.numerama.com/content/uploads/2016/04/homepage-680x347.png\" alt=\"homepage\" width=\"680\" height=\"347\" srcset=\"//www.numerama.com/content/uploads/2016/04/homepage-680x347.png 680w, //www.numerama.com/content/uploads/2016/04/homepage-1024x523.png 1024w, //www.numerama.com/content/uploads/2016/04/homepage-270x138.png 270w, //www.numerama.com/content/uploads/2016/04/homepage.png 1286w\" sizes=\"(max-width: 680px) 100vw, 680px\"/></p>\n<p>Parmi les principaux changements que l’on peut retenir avec cette nouvelle version, notons la possibilité d’écrire des annotations dans les articles mémorisés, de filtrer les contenus selon divers critères (temps de lecture, nom de domaine, date de création, statut…), d’assigner des mots-clés aux entrées, de modifier le titre des articles, le support des flux RSS ou encore le support de plusieurs langues dont le français.</p>\n<p>D’autres options sont également à signaler, comme l’aperçu d’un article mémorisé (si l’option est disponible), un guide de démarrage rapide pour les débutants, un outil d’export dans divers formats (PDF, JSON, EPUB, MOBI, XML, CSV et TXT) et, surtout, la possibilité de migrer vers Wallabag depuis Pocket, afin de convaincre les usagers de se lancer.</p>\n \n \n <footer class=\"clearfix\" readability=\"1\"><p class=\"source\">\n Crédit photo de la une : <a href=\"https://www.flickr.com/photos/bookgrl/2388310523/\">Laura Taylor</a>\n </p>\n \n <p><a href=\"http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html?&amp;show_reader_reports\" target=\"_blank\" rel=\"nofollow\">Signaler une erreur dans le texte</a></p>\n \n</footer> <section class=\"related-article\"><header><h3>Articles liés</h3>\n </header><article class=\"post-grid format-article\"><a class=\"floatleft\" href=\"http://www.numerama.com/magazine/34444-firefox-prepare-l-enterrement-des-vieux-plugins.html\" title=\"Firefox prépare l'enterrement des vieux plugins\">\n <div class=\"cover-preview cover-tech\">\n <p>Lire</p>\n \n \n \n <img class=\"cover-preview_img\" src=\"http://c2.lestechnophiles.com/www.numerama.com/content/uploads/2015/10/cimetierecolleville.jpg?resize=200,135\" srcset=\"&#10; //c2.lestechnophiles.com/www.numerama.com/content/uploads/2015/10/cimetierecolleville.jpg?resize=200,135 200w,&#10; //c2.lestechnophiles.com/www.numerama.com/content/uploads/2015/10/cimetierecolleville.jpg?resize=100,67 100w,&#10; \" sizes=\"(min-width: 1001px) 200px, (max-width: 1000px) 100px\" alt=\"Firefox prépare l'enterrement des vieux plugins\"/></div>\n <h4> Firefox prépare l'enterrement des vieux plugins </h4>\n </a>\n <footer class=\"span12\">\n </footer></article><article class=\"post-grid format-article\"><a class=\"floatleft\" href=\"http://www.numerama.com/tech/131636-activer-navigation-privee-navigateur-web.html\" title=\"Comment activer la navigation privée sur son navigateur web\">\n <div class=\"cover-preview cover-tech\">\n <p>Lire</p>\n \n \n \n <img class=\"cover-preview_img\" src=\"http://c1.lestechnophiles.com/www.numerama.com/content/uploads/2015/11/Incognito.jpg?resize=200,135\" srcset=\"&#10; //c1.lestechnophiles.com/www.numerama.com/content/uploads/2015/11/Incognito.jpg?resize=200,135 200w,&#10; //c1.lestechnophiles.com/www.numerama.com/content/uploads/2015/11/Incognito.jpg?resize=100,67 100w,&#10; \" sizes=\"(min-width: 1001px) 200px, (max-width: 1000px) 100px\" alt=\"Comment activer la navigation privée sur son navigateur web\"/></div>\n <h4> Comment activer la navigation privée sur son navigateur web </h4>\n </a>\n <footer class=\"span12\">\n </footer></article><article class=\"post-grid format-article\"><a class=\"floatleft\" href=\"http://www.numerama.com/tech/144028-firefox-se-mettra-a-jour-regulierement.html\" title=\"Firefox se mettra à jour un peu moins régulièrement\">\n <div class=\"cover-preview cover-tech\">\n <p>Lire</p>\n \n \n \n <img class=\"cover-preview_img\" src=\"http://c0.lestechnophiles.com/www.numerama.com/content/uploads/2016/02/firefox-mobile.jpg?resize=200,135\" srcset=\"&#10; //c0.lestechnophiles.com/www.numerama.com/content/uploads/2016/02/firefox-mobile.jpg?resize=200,135 200w,&#10; //c0.lestechnophiles.com/www.numerama.com/content/uploads/2016/02/firefox-mobile.jpg?resize=100,67 100w,&#10; \" sizes=\"(min-width: 1001px) 200px, (max-width: 1000px) 100px\" alt=\"Firefox se mettra à jour un peu moins régulièrement\"/></div>\n <h4> Firefox se mettra à jour un peu moins régulièrement </h4>\n </a>\n <footer class=\"span12\">\n </footer></article>\n</section>\n",
169 "created_at": "2016-04-05T09:07:54+0000",
170 "domain_name": "www.numerama.com",
171 "id": 1,
172 "is_archived": 0,
173 "is_starred": 0,
174 "language": "fr-FR",
175 "mimetype": "text/html",
176 "preview_picture": "http://www.numerama.com/content/uploads/2016/04/post-it.jpg",
177 "reading_time": 2,
178 "tags": [],
179 "title": "Le Pocket libre Wallabag fait le plein de fonctionnalités - Tech - Numerama",
180 "updated_at": "2016-04-05T09:07:54+0000",
181 "url": "http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html",
182 "user_email": "",
183 "user_id": 1,
184 "user_name": "wallabag"
185 }
186
187Wenn du jetzt das vorherige Kommando (siehe **Existierende Einträge erhalten**), wirst du Daten erhalten.
188
189cURL Beispiel:
190
191::
192
193 curl "https://localhost:8000/api/entries.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA&url=http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html"
194
195Eintrag löschen
196-----------------
197
198Dokumentation für diese Methode: http://localhost:8000/api/doc#delete--api-entries-{entry}.{_format}
199
200::
201
202 http DELETE http://localhost:8000/api/entries/1.json \
203 "Authorization:Bearer ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
204
205gibt zurück:
206
207::
208
209 HTTP/1.1 200 OK
210 0: application/json
211 Cache-Control: no-cache
212 Connection: close
213 Content-Type: application/json
214 Date: Tue, 05 Apr 2016 09:19:07 GMT
215 Host: localhost:8000
216 Set-Cookie: PHPSESSID=jopgnfvmuc9a62b27sqm6iulr6; path=/; HttpOnly
217 X-Debug-Token: 887cef
218 X-Debug-Token-Link: /_profiler/887cef
219 X-Powered-By: PHP/7.0.4
220
221 {
222 "_links": {
223 "self": {
224 "href": "/api/entries/"
225 }
226 },
227 "annotations": [],
228 "content": "<p class=\"chapo\">Fonctionnant sur le même principe que Pocket, Instapaper ou Readability, le logiciel Wallabag permet de mémoriser des articles pour les lire plus tard. Sa nouvelle version apporte une multitude de nouvelles fonctionnalités.</p><p>Si vous utilisez Firefox comme navigateur web, vous avez peut-être constaté l’arrivée d’<a href=\"http://www.numerama.com/magazine/33292-update-firefox.html\">une fonctionnalité intitulée Pocket</a>. Disponible autrefois sous la forme d’un module complémentaire, et sous un autre nom (Read it Later), elle est depuis le mois de juin 2015 directement incluse au sein de Firefox.</p>\n<p>Concrètement, Pocket sert à garder en mémoire des contenus que vous croisez au fil de la navigation, comme des articles de presse ou des vidéos, afin de pouvoir les consulter plus tard. Pocket fonctionne un peu comme un système de favoris, mais en bien plus élaboré grâce à ses options supplémentaires.</p>\n<p>Mais <a href=\"https://en.wikipedia.org/wiki/Pocket_%28application%29#Firefox_integration\" target=\"_blank\">Pocket fait polémique</a>, car il s’agit d’un projet propriétaire qui est intégré dans un logiciel libre. C’est pour cette raison que des utilisateurs ont choisi de se tourner vers d’autres solutions, comme <strong>Wallabag</strong>, qui est l’équivalent libre de Pocket et d’autres systèmes du même genre, comme Instapaper et Readability.</p>\n<p>Et justement, Wallabag évolue. C’est ce dimanche que la <a href=\"https://www.wallabag.org/blog/2016/04/03/wallabag-v2\" target=\"_blank\">version 2.0.0 du logiciel</a> a été publiée par l’équipe en  charge de son développement et celle-ci contient de nombreux changements par rapport aux moutures précédentes (la <a href=\"http://doc.wallabag.org/fr/v2/\" target=\"_blank\">documentation est traduite</a> en français), lui permettant d’apparaître comme une alternative à Pocket, Instapaper et Readability.</p>\n<p><img class=\"aligncenter size-medium wp-image-160439\" src=\"http://www.numerama.com/content/uploads/2016/04/homepage-680x347.png\" alt=\"homepage\" width=\"680\" height=\"347\" srcset=\"//www.numerama.com/content/uploads/2016/04/homepage-680x347.png 680w, //www.numerama.com/content/uploads/2016/04/homepage-1024x523.png 1024w, //www.numerama.com/content/uploads/2016/04/homepage-270x138.png 270w, //www.numerama.com/content/uploads/2016/04/homepage.png 1286w\" sizes=\"(max-width: 680px) 100vw, 680px\"/></p>\n<p>Parmi les principaux changements que l’on peut retenir avec cette nouvelle version, notons la possibilité d’écrire des annotations dans les articles mémorisés, de filtrer les contenus selon divers critères (temps de lecture, nom de domaine, date de création, statut…), d’assigner des mots-clés aux entrées, de modifier le titre des articles, le support des flux RSS ou encore le support de plusieurs langues dont le français.</p>\n<p>D’autres options sont également à signaler, comme l’aperçu d’un article mémorisé (si l’option est disponible), un guide de démarrage rapide pour les débutants, un outil d’export dans divers formats (PDF, JSON, EPUB, MOBI, XML, CSV et TXT) et, surtout, la possibilité de migrer vers Wallabag depuis Pocket, afin de convaincre les usagers de se lancer.</p>\n \n \n <footer class=\"clearfix\" readability=\"1\"><p class=\"source\">\n Crédit photo de la une : <a href=\"https://www.flickr.com/photos/bookgrl/2388310523/\">Laura Taylor</a>\n </p>\n \n <p><a href=\"http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html?&amp;show_reader_reports\" target=\"_blank\" rel=\"nofollow\">Signaler une erreur dans le texte</a></p>\n \n</footer> <section class=\"related-article\"><header><h3>Articles liés</h3>\n </header><article class=\"post-grid format-article\"><a class=\"floatleft\" href=\"http://www.numerama.com/magazine/34444-firefox-prepare-l-enterrement-des-vieux-plugins.html\" title=\"Firefox prépare l'enterrement des vieux plugins\">\n <div class=\"cover-preview cover-tech\">\n <p>Lire</p>\n \n \n \n <img class=\"cover-preview_img\" src=\"http://c2.lestechnophiles.com/www.numerama.com/content/uploads/2015/10/cimetierecolleville.jpg?resize=200,135\" srcset=\"&#10; //c2.lestechnophiles.com/www.numerama.com/content/uploads/2015/10/cimetierecolleville.jpg?resize=200,135 200w,&#10; //c2.lestechnophiles.com/www.numerama.com/content/uploads/2015/10/cimetierecolleville.jpg?resize=100,67 100w,&#10; \" sizes=\"(min-width: 1001px) 200px, (max-width: 1000px) 100px\" alt=\"Firefox prépare l'enterrement des vieux plugins\"/></div>\n <h4> Firefox prépare l'enterrement des vieux plugins </h4>\n </a>\n <footer class=\"span12\">\n </footer></article><article class=\"post-grid format-article\"><a class=\"floatleft\" href=\"http://www.numerama.com/tech/131636-activer-navigation-privee-navigateur-web.html\" title=\"Comment activer la navigation privée sur son navigateur web\">\n <div class=\"cover-preview cover-tech\">\n <p>Lire</p>\n \n \n \n <img class=\"cover-preview_img\" src=\"http://c1.lestechnophiles.com/www.numerama.com/content/uploads/2015/11/Incognito.jpg?resize=200,135\" srcset=\"&#10; //c1.lestechnophiles.com/www.numerama.com/content/uploads/2015/11/Incognito.jpg?resize=200,135 200w,&#10; //c1.lestechnophiles.com/www.numerama.com/content/uploads/2015/11/Incognito.jpg?resize=100,67 100w,&#10; \" sizes=\"(min-width: 1001px) 200px, (max-width: 1000px) 100px\" alt=\"Comment activer la navigation privée sur son navigateur web\"/></div>\n <h4> Comment activer la navigation privée sur son navigateur web </h4>\n </a>\n <footer class=\"span12\">\n </footer></article><article class=\"post-grid format-article\"><a class=\"floatleft\" href=\"http://www.numerama.com/tech/144028-firefox-se-mettra-a-jour-regulierement.html\" title=\"Firefox se mettra à jour un peu moins régulièrement\">\n <div class=\"cover-preview cover-tech\">\n <p>Lire</p>\n \n \n \n <img class=\"cover-preview_img\" src=\"http://c0.lestechnophiles.com/www.numerama.com/content/uploads/2016/02/firefox-mobile.jpg?resize=200,135\" srcset=\"&#10; //c0.lestechnophiles.com/www.numerama.com/content/uploads/2016/02/firefox-mobile.jpg?resize=200,135 200w,&#10; //c0.lestechnophiles.com/www.numerama.com/content/uploads/2016/02/firefox-mobile.jpg?resize=100,67 100w,&#10; \" sizes=\"(min-width: 1001px) 200px, (max-width: 1000px) 100px\" alt=\"Firefox se mettra à jour un peu moins régulièrement\"/></div>\n <h4> Firefox se mettra à jour un peu moins régulièrement </h4>\n </a>\n <footer class=\"span12\">\n </footer></article>\n</section>\n",
229 "created_at": "2016-04-05T09:07:54+0000",
230 "domain_name": "www.numerama.com",
231 "is_archived": 0,
232 "is_starred": 0,
233 "language": "fr-FR",
234 "mimetype": "text/html",
235 "preview_picture": "http://www.numerama.com/content/uploads/2016/04/post-it.jpg",
236 "reading_time": 2,
237 "tags": [],
238 "title": "Le Pocket libre Wallabag fait le plein de fonctionnalités - Tech - Numerama",
239 "updated_at": "2016-04-05T09:07:54+0000",
240 "url": "http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html",
241 "user_email": "",
242 "user_id": 1,
243 "user_name": "wallabag"
244 }
245
246Und wenn du die existierenden Einträge nun listen willst (siehe **Existierende Einträge erhalten**), ist das Array wieder leer.
247
248cURL Beispiel:
249
250::
251
252 curl --request DELETE "https://localhost:8000/api/entries/1.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
253
254Andere Methoden
255---------------
256
257Wir werden nicht für jede API Methode Beispiele schreiben.
258
259Wirf einen Blick in die Liste http://localhost:8000/api/doc, um alle Methode kennenzulernen.
260
261
262Drittanbieter Ressourcen
263------------------------
264
265Einige Applikationen oder Bibliotheken nutzen unsere API. Hier ist eine nicht abschließende Aufzählung von ihnen:
266
267- `Java wrapper for the wallabag API <https://github.com/Strubbl/wallabag-java>`_ von Strubbl.
268- `.NET library for the wallabag v2 API <https://github.com/jlnostr/wallabag-api>`_ von Julian Oster.
269- `Python API for wallabag <https://github.com/foxmask/wallabag_api>`_ von FoxMaSk, für sein Projekt `Trigger Happy <https://blog.trigger-happy.eu/>`_.
270- `A plugin <https://github.com/joshp23/ttrss-to-wallabag-v2>`_ entworfen für `Tiny Tiny RSS <https://tt-rss.org/gitlab/fox/tt-rss/wikis/home>`_, das die wallabag v2 API nutzt. Von Josh Panter.
diff --git a/docs/de/developer/docker.rst b/docs/de/developer/docker.rst
new file mode 100644
index 00000000..c63194aa
--- /dev/null
+++ b/docs/de/developer/docker.rst
@@ -0,0 +1,57 @@
1Lasse wallabag in docker-compose laufen
2=======================================
3
4Um deine eigene Entwicklungsinstanz von wallabag laufen zu lassen,
5möchtest du vielleicht die vorkonfigurierten docker compose Dateien
6nutzen.
7
8Voraussetzungen
9---------------
10
11Stelle sicher `Docker
12<https://docs.docker.com/installation/ubuntulinux/>`__ und `Docker
13Compose <https://docs.docker.com/compose/install/>`__ auf deinem
14System verfügbar und aktuell zu haben.
15
16Wechsel des DBMS
17----------------
18
19Standardmäßig startet wallabag mit einer SQLite Datenbank.
20Da wallabag Unterstützung für Postgresql und MySQL bietet, gibt es
21auch docker Container für diese.
22
23In der ``docker-compose.yml`` kommentierst du für das gewählte DBMS
24aus:
25
26- die Container Definition (``postgres`` oder ``mariadb`` root
27 Level Block)
28- den Container Link in dem ``php`` Container
29- die Container Umgebungsdatei in dem ``php`` Container
30
31Um mit Symfony Kommandos auf deinem Host auszuführen (wie z.B.
32``wallabag:install``), sollst du außerdem:
33
34- die richtige Umgebungsdatei auf deiner Kommandozeile einlesen,
35 sodass Variablen wie ``SYMFONY__ENV__DATABASE_HOST`` existieren
36- eine Zeile ``127.0.0.1 rdbms`` in deiner ``hosts`` Datei auf dem
37 System erstellen
38
39wallabag laufen lassen
40----------------------
41
42#. Forke und klone das Projekt
43#. Bearbeite ``app/config/parameters.yml`` um ``database_*``
44 Eigenschaften mit den kommentierten zu ersetzen (mit Werten
45 mit ``env.`` Präfix)
46#. ``composer install`` die Projektabhängigkeiten
47#. ``php app/console wallabag:install``, um das Schema zu erstellen
48#. ``docker-compose up`` um die Container laufen zu lassen
49#. Schließlich öffne http://localhost:8080/, um dein frisch
50 installiertes wallabag zu finden.
51
52In den verschiedenen Schritten wirst du vielleicht in verschiendene
53Probleme laufen wie UNIX Berechtigungsprobleme, falschen Pfaden im
54generierten Cache, etc.…
55Operationen wie das Löschen der Cachedateien oder das Ändern der
56Dateibesitzer können öfter gebraucht werden, darum habe keine Angst
57sie anzupassen.
diff --git a/docs/de/developer/documentation.rst b/docs/de/developer/documentation.rst
new file mode 100644
index 00000000..41e19363
--- /dev/null
+++ b/docs/de/developer/documentation.rst
@@ -0,0 +1,10 @@
1Wirke an dieser Dokumentation mit
2=================================
3
4Quellen der Dokumentation sind hier zu finden https://github.com/wallabag/wallabag/tree/master/docs
5
6Wir nutzen `ReadTheDocs <https://readthedocs.org>`__, um sie zu generieren.
7
8Seiten werden in `reStructuredText <https://de.wikipedia.org/wiki/ReStructuredText>`__ geschrieben. Du kannst Onlinetools wie http://rst.aaroniles.net/ oder http://rst.ninjs.org/ nutzen, um eine Vorschau deiner Artikel zu betrachten.
9
10Wenn du eine neue Seite erstellst, vergiss nicht die `index.rst <https://raw.githubusercontent.com/wallabag/wallabag/master/docs/en/index.rst>`__ zu bearbeiten, um dort einen Link für die Seitenleiste hinzuzufügen.
diff --git a/docs/de/developer/maintenance.rst b/docs/de/developer/maintenance.rst
new file mode 100644
index 00000000..2a9070e1
--- /dev/null
+++ b/docs/de/developer/maintenance.rst
@@ -0,0 +1,32 @@
1Wartungsmodus
2=============
3
4Wenn du längere Aufgaben auf deiner wallabag Instanz ausführen willst, kannst du den Wartungsmodus aktivieren.
5Keiner wird dann Zugang zu deiner Instanz haben.
6
7Aktivieren des Wartungsmodus
8----------------------------
9
10Um den Wartungsmodus zu aktivieren, führe folgendes Kommando aus:
11
12::
13
14 bin/console lexik:maintenance:lock --no-interaction
15
16Du kannst deine IP Adresse in ``app/config/config.yml`` setzen, wenn du Zugriff zu wallabag haben willst, auch wenn der Wartungsmodus aktiv ist. Zum Beispiel:
17
18::
19
20 lexik_maintenance:
21 authorized:
22 ips: ['127.0.0.1']
23
24
25Deaktivieren des Wartungsmodus
26------------------------
27
28Um den Wartungsmodus zu deaktivieren, führe dieses Kommando aus:
29
30::
31
32 bin/console lexik:maintenance:unlock
diff --git a/docs/de/developer/translate.rst b/docs/de/developer/translate.rst
new file mode 100644
index 00000000..50e136ea
--- /dev/null
+++ b/docs/de/developer/translate.rst
@@ -0,0 +1,57 @@
1Ãœbersetze wallabag
2==================
3
4wallabag Webapplikation
5-----------------------
6
7Ãœbersetzungsdateien
8~~~~~~~~~~~~~~~~~~~
9
10.. note::
11
12 Da wallabag hauptsächlich von einem französischem Team entwickelt wird, betrachte
13 die französische Übersetzung als die aktuellste und kopiere sie, um deine eigene Übersetzung zu starten.
14
15Du kannst die Ãœbersetzungsdateien hier finden: https://github.com/wallabag/wallabag/tree/master/src/Wallabag/CoreBundle/Resources/translations.
16
17Du musst die ``messages.CODE.yml`` und ``validators.CODE.yml`` erstellen, wobei CODE
18der ISO 639-1 Code deiner Sprache ist (`siehe Wikipedia <https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes>`__).
19
20Andere Dateien zum Ãœbersetzen:
21
22- https://github.com/wallabag/wallabag/tree/master/app/Resources/CraueConfigBundle/translations.
23- https://github.com/wallabag/wallabag/tree/master/app/Resources/FOSUserBundle/translations.
24
25Du musst die ``THE_TRANSLATION_FILE.CODE.yml`` Dateien erstellen.
26
27Konfigurationsdatei
28~~~~~~~~~~~~~~~~~~~
29
30Du musst die `app/config/config.yml <https://github.com/wallabag/wallabag/blob/master/app/config/config.yml>`__ bearbeiten,
31um deine Sprache auf der Konfigurationsseite in wallabag anzuzeigen (um Nutzern zu erlauben zu dieser neuen Ãœbersetzung zu wechseln).
32
33Unter dem Abschnitt ``wallabag_core.languages`` musst du eine neue Zeile mit deiner Übersetzung hinzufügen. Zum Beispiel:
34
35::
36
37 wallabag_core:
38 ...
39 languages:
40 en: 'English'
41 fr: 'Français'
42
43
44Für die erste Spalte (``en``, ``fr``, etc.) musst du den ISO 639-1 Code deiner Sprache hinzufügen (siehe oben).
45
46Für die zweite Spalte trägst du den Namen deiner Sprache ein. Nur den.
47
48wallabag Dokumentation
49----------------------
50
51.. note::
52
53 Im Gegensatz zur Webapplikation ist die Hauptsprache für die Dokumentation Englisch.
54
55Documentationsdateien sind hier gespeichert: https://github.com/wallabag/wallabag/tree/master/docs
56
57Du musst die Ordnerstruktur des Ordners ``en`` beachten, wenn du deine eigene Ãœbersetzung startest.
diff --git a/docs/de/index.rst b/docs/de/index.rst
new file mode 100644
index 00000000..5311150f
--- /dev/null
+++ b/docs/de/index.rst
@@ -0,0 +1,52 @@
1wallabag Dokumentation
2======================
3
4.. image:: ../img/wallabag.png
5 :alt: wallabag Logo
6 :align: center
7
8**wallabag** ist eine Read-it-later Applikation: es speichert Websites,
9indem es nur den Inhalt behält. Elemente wie Navigation oder Werbung werden gelöscht.
10
11.. tip::
12
13 Diese Dokumentation ist über wallabag v2. Wenn du die Dokumentation für wallabag v1 lesen willst, `siehe dir bitte das hier an <https://github.com/wallabag/documentation>`__.
14
15Die Hauptdokumentation für diese Applikation ist in einigen Abschnitten organisiert:
16
17* :ref:`user-docs`
18* :ref:`dev-docs`
19
20.. _user-docs:
21
22.. toctree::
23 :maxdepth: 2
24 :caption: Nutzerdokumentation
25
26 user/faq
27 user/installation
28 user/upgrade
29 user/migration
30 user/import
31 user/create_account
32 user/login
33 user/configuration
34 user/first_article
35 user/errors_during_fetching
36 user/annotations
37 user/download_articles
38 user/filters
39 user/tags
40 user/android
41
42.. _dev-docs:
43
44.. toctree::
45 :maxdepth: 2
46 :caption: Entwicklerdokumentation
47
48 developer/api
49 developer/docker
50 developer/documentation
51 developer/translate
52 developer/maintenance
diff --git a/docs/de/user/android.rst b/docs/de/user/android.rst
new file mode 100644
index 00000000..8573bcb8
--- /dev/null
+++ b/docs/de/user/android.rst
@@ -0,0 +1,107 @@
1Android App
2===========
3
4
5Zweck dieses Dokuments
6----------------------
7
8Dieses Dokument beschreibt wie du deine Android App einrichtest, damit sie mit deiner Wallabaginstanz zusammenarbeitet. Es gibt hierbei keinen Unterschied im Vorgang - egal ob du Wallabag v1 oder v2 einsetzt.
9
10
11Schritte, um dein App zu einzurichten
12-------------------------------------
13
14Wenn du das erste Mal die App startest, siehst du den Willkommensbildschirm, wo du angewiesen wirst zunächst deine App mit deiner Wallabaginstanz einzurichten.
15
16.. image:: ../../img/user/android_welcome_screen.de.png
17 :alt: Willkommensbildschirm
18 :align: center
19
20Bestätige nur diese Nachricht und du wirst zum Einstellungsbildschirm weitergeleitet.
21
22.. image:: ../../img/user/android_configuration_screen.de.png
23 :alt: Einstellungsbildschirm
24 :align: center
25
26Trage deine Wallabagdaten ein. Du musst deine Wallabagadresse eintragen. Es ist wichtig, dass die URL nicht mit einem Schrägstrich endet. Füge auch deine Wallabagzugangsdaten in das Nutzer- und Passwortfeld ein.
27
28.. image:: ../../img/user/android_configuration_filled_in.de.png
29 :alt: Eingetragene Einstellungen
30 :align: center
31
32Nachdem du deine Daten eingetragen hast, drücke den Button Verbindung testen und warte auf das Fertigstellen des Tests.
33
34.. image:: ../../img/user/android_configuration_connection_test.de.png
35 :alt: Verbindungstest mit deinen Wallabagdaten
36 :align: center
37
38Der Verbindungstest sollte mit Erfolg ausgehen. Falls nicht, musst du zunächst deine Daten korrigieren bevor du zum nächsten Schritt gehst.
39
40.. image:: ../../img/user/android_configuration_connection_test_success.de.png
41 :alt: Verbindungstest war erfolgreich
42 :align: center
43
44Nach dem Verbindungstest erfolgreich war, kannst du den Button zum Feedzugangsdaten abholen drücken. Die App versucht nun sich bei deiner Wallabaginstanz einzuloggen und die Nutzer ID und den dazugehörigen Token für die Feeds zu laden.
45
46.. image:: ../../img/user/android_configuration_get_feed_credentials.de.png
47 :alt: Feedzugangsdaten abholen
48 :align: center
49
50Wenn der Prozess des Abholens deiner Feedzugangsdaten erfolgreich beendet wurde, siehst du eine Toastnachricht, dass die User ID und der Token automatisch in das Formular eingetragen wurden.
51
52.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.de.png
53 :alt: Feedzugangsdaten erfolgreich abgeholt
54 :align: center
55
56Jetzt scrollst du bis zum unteren Rand des Einstellungsbildschirms. Natürlich kannst du die Einstellungen dort deinen Wünschen anpassen. Schließe die Einrichtung mit dem Drücken des Speicherbuttons ab.
57
58.. image:: ../../img/user/android_configuration_scroll_bottom.de.png
59 :alt: unterer Rand des Einstellungsbildschirms
60 :align: center
61
62Nachdem du den Speicherbutton gedrückt hast, kommst du in den folgenden Bildschirm. Die App schlägt vor, eine initiale Synchronisation der Artikelfeeds durchzuführen. Hier ist es empfohlen, dies zu bestätigen und Ja zu drücken.
63
64.. image:: ../../img/user/android_configuration_saved_feed_update.de.png
65 :alt: Einstellung erstmals gespeichert
66 :align: center
67
68Schließlich nach der ersten erfolgreichen Synchronisation, wird dir die Liste der ungelesenen Artikel präsentiert.
69
70.. image:: ../../img/user/android_unread_feed_synced.de.png
71 :alt: Gefüllte Artikellist da Feeds erfolgreich synchronisiert sind
72 :align: center
73
74
75
76Bekannte Limitierungen
77---------------------
78
792FA
80~~~
81
82Zur Zeit unterstützt die App keine Zwei-Faktor Authentifizierung. Du solltest sie deaktivieren damit die App funktioniert.
83
84
85Begrenzte Anzahl Artikel mit Wallabag v2
86~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87
88In deiner Wallabaginstanz kannst du einstellen, wie viele Artikel Teil deiner RSS Feeds sind. Diese Option existierte in Wallabag v1 nicht, wo immer alle Artikel Teil des Feeds waren. Also wenn du die Anzahl der Artikel, die in der App angezeigt werden sollen, größer einstellst als die Anzahl Artikel in deinem Feed, wirst du nur die Anzahl an Artikel deines Feeds sehen.
89
90
91SSL/TLS Verschlüsselung
92~~~~~~~~~~~~~~~~~~~~~~~
93
94Wenn du deine Wallabaginstanz per HTTPS erreichen kannst, solltest du das so konfigurieren. Besonders dann, wenn deine HTTP URL nach HTTPS umleitet. Im Moment kann die App mit dieser Weiterleitung nicht korrekt umgehen.
95
96
97Referenzen
98----------
99
100`Quellcode der Android Applikation <https://github.com/wallabag/android-app>`_
101
102`Android Applikation auf F-Droid <https://f-droid.org/repository/browse/?fdfilter=wallabag&fdid=fr.gaulupeau.apps.InThePoche>`_
103
104`Android Applikation auf Google Play <https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche>`_
105
106`Support Chat auf English <https://gitter.im/wallabag/wallabag>`_
107
diff --git a/docs/de/user/annotations.rst b/docs/de/user/annotations.rst
new file mode 100644
index 00000000..4b4d58b0
--- /dev/null
+++ b/docs/de/user/annotations.rst
@@ -0,0 +1,24 @@
1Anmerkungen
2===========
3
4In jedem Artikel, den du liest, kannst du Anmerkungen hinzufügen. Es ist einfacher mit ein paar Bilder erklärt.
5
6Wähle den Teil des Artikels aus, den du kommentieren willst und klicke auf den Bleistift:
7
8.. image:: ../../img/user/annotations_1.png
9 :alt: Wähle den Text
10 :align: center
11
12Schreibe deinen Kommentar:
13
14.. image:: ../../img/user/annotations_2.png
15 :alt: Schreibe deinen Kommentar
16 :align: center
17
18Der Text ist nun hervorgehoben und du kannst deine Anmerkung lesen, wenn du den Mauspfeil darüber fährst.
19
20.. image:: ../../img/user/annotations_3.png
21 :alt: lese deine Anmerkung
22 :align: center
23
24Du kannst so viele Anmerkungen erstellen wie du möchtest.
diff --git a/docs/de/user/configuration.rst b/docs/de/user/configuration.rst
new file mode 100644
index 00000000..67695ff1
--- /dev/null
+++ b/docs/de/user/configuration.rst
@@ -0,0 +1,119 @@
1Konfiguration
2=============
3
4Nun, da du eingeloggt bist, ist es Zeit, deinen Account so zu konfigurieren,
5wie du möchtest.
6
7Klicke auf ``Konfiguration`` im Menü. Du hast fünf Karteireiter: ``Einstellungen``,
8``RSS``, ``Benutzer-Informationen``, ``Kennwort`` und ``Tagging-Regeln``.
9
10Einstellungen
11-------------
12
13Theme
14~~~~~
15
16wallabag ist anpassbar. Du kannst dein bevorzugtes Theme hier auswählen. Du kannst
17auch ein neues erstellen, ein extra Kapitel wird dem gewidmet sein. Das Standardtheme
18ist ``Material``, es ist das Theme, dass in den Dokumentationsbildschirmfotos genutzt wird.
19
20Artikel pro Seite
21~~~~~~~~~~~~~~~~~
22
23Du kannst die Anzahl der dargestellten Artikel pro Seite ändern.
24
25Lesegeschwindigkeit
26~~~~~~~~~~~~~~~~~~~
27
28wallabag berechnet die Lesezeit für jeden Artikel. Du kannst hier definieren, dank dieser Liste, ob du
29ein schneller oder langsamer Leser bist. wallabag wird die Lesezeit für jeden Artikel neu berechnen.
30
31Sprache
32~~~~~~~
33
34Du kannst die Sprache von der wallabag Benutzeroberfläche ändern. Du musst die ausloggen, damit diese
35Änderung Wirkung zeigt.
36
37RSS
38---
39
40wallabag stellt RSS Feeds für jeden Artikelstatus bereit: ungelesen, Favoriten und Archiv.
41
42Als erstes musst du einen persönlciehn Token erstellen: Klicke auf ``Token generieren``.
43Es ist möglich deinen Token zu ändern, indem du auf ``Token zurücksetzen`` klickst.
44
45Jetzt hast du drei Links, einen für jeden Status: Füge sie in deinem liebsten Feedreader hinzu.
46
47Du kannst auch definieren wie viele Artikel du in deinem RSS Feed (Standardwert: 50) haben willst.
48
49Benutzer-Informationen
50----------------------
51
52Du kannst deinen Namen ändern, deine E-Mail-Adresse und die Zwei-Faktor-Authentifizierung aktivieren.
53
54Zwei-Faktor-Authentifizierung
55~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56
57 Die Zwei-Faktor-Authentifizierung (2FA) dient dem Identitätsnachweis eines Nutzers mittels der
58 Kombination zweier verschiedener und insbesondere unabhängiger Komponenten (Faktoren).
59
60https://de.wikipedia.org/wiki/Zwei-Faktor-Authentifizierung
61
62Wenn du 2FA aktivierst, erhälst du jedes Mal, wenn du dich bei wallabag einloggen willst, einen Code per
63Mail. Du musst den Code in das folgende Formular eingeben.
64
65.. image:: ../../img/user/2FA_form.png
66 :alt: Zwei-Faktor-Authentifizierung
67 :align: center
68
69Wenn du nicht jedes Mal, wenn du dich einloggen willst, einen Code zugesendet bekommen möchtest, kannst du
70die Checkbox ``Ich bin an einem persönlichen Computer`` anhaken: wallabag wird sich an dich für 15 Tage
71erinnern.
72
73Passwort
74--------
75
76Du kannst dein Passwort hier ändern (8 Zeichen Minimum).
77
78Tagging-Regeln
79--------------
80
81Wenn du automatisch einen Tag zu einem neuen Artikel zuweisen lassen möchtest, ist dieser Teil der
82Konfiguration, was du suchst.
83
84Was ist mit Tagging-Regeln gemeint?
85~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
86
87Dies sind Regeln, die von wallabag genutzt werden, um neue Artikel automatisch zu taggen
88Jedes Mal, wenn ein neuer Artikel hinzugefügt wird, werden alle Tagging-Regeln genutzt, um deine
89konfigurierten Tags hinzuzufügen, folglich um dir den Aufwand zu sparen, die Artikel manuell einzuteilen.
90
91Wie benutze ich sie?
92~~~~~~~~~~~~~~~~~~~~
93
94Nehmen wir an, du möchtest neuen Artikeln einen Tag *schnell gelesen*, wenn du die Lesezeit kleiner als
953 Minuten ist.
96In diesem Fall solltest du in das Regelfeld "readingTime <= 3" eintragen und *schnell gelesen* in das Tags-Feld.
97Mehrere Tags können gleichzeitig hinzugefügt werden, wenn man sie mit einem Komma trennt:
98*schnell gelesen, Pflichtlektüre*.
99Komplexe Regeln können mit vordefinierten Operatoren geschrieben werden:
100Wenn *readingTime >= 5 AND domainName = "github.com"*, dann tagge als *lange zu lesen, github*.
101
102Welche Variablen und Operatoren kann ich zum Regeln schreiben nutzen?
103~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104
105Die folgenden Variabel und Operatoren können genutzt werden, um Tagging-Regeln zu erstellen:
106
107=========== ============================================== ======== ==========
108Variable Bedeutung Operator Bedeutung
109----------- ---------------------------------------------- -------- ----------
110title Titel des Artikels <= Kleiner gleich als…
111url URL des Artikels < Kleiner als…
112isArchived Ob der Artikel archiviert ist oder nicht => Größer gleich als…
113isStarred Ob der Artikel favorisiert ist oder nicht > Größer als…
114content Inhalt des Eintrags = Gleich zu…
115language Sprache des Eintrags != Nicht gleich zu…
116mimetype MIME-Typ des Eintrags OR Eine Regel oder die andere
117readingTime Die geschätzte Lesezeit in Minuten AND Eine Regel und die andere
118domainName Der Domain-Name des Eintrags matches Testet, dass ein Feld einer Suche (unabhängig von Groß- und Kleinschreibung) übereinstimmt. Z.B.: title matches "Fußball"
119=========== ============================================== ======== ==========
diff --git a/docs/de/user/create_account.rst b/docs/de/user/create_account.rst
new file mode 100644
index 00000000..ce1b02a4
--- /dev/null
+++ b/docs/de/user/create_account.rst
@@ -0,0 +1,25 @@
1Account erstellen
2=================
3
4Klicke auf der Loginseite auf den ``Registrieren`` Button-
5
6.. image:: ../../img/user/registration_form.png
7 :alt: Registrierungsformular
8 :align: center
9
10Du musst das Formular ausfüllen. Bitte stelle sicher, dass du eine gültige
11E-Mail-Adresse eingibst, wir werden dir eine Aktivierungsmail schicken.
12
13.. image:: ../../img/user/sent_email.png
14 :alt: E-Mail wurde gesendet, um Account zu aktivieren
15 :align: center
16
17Überprüfge deinen Posteingang, du hast jetzt eine neue Mail mit einem Link wie diesen
18``http://wallabag/register/confirm/Ba19wokGovN-DdBQNfg4YgRkUQWRP4-k2g0Bk-hBTX4``.
19Klicke auf den Link, um deinen Account zu aktivieren.
20
21Dein Account ist nun aktiviert.
22
23.. image:: ../../img/user/activated_account.png
24 :alt: Willkommen!
25 :align: center
diff --git a/docs/de/user/download_articles.rst b/docs/de/user/download_articles.rst
new file mode 100644
index 00000000..6f5384b2
--- /dev/null
+++ b/docs/de/user/download_articles.rst
@@ -0,0 +1,17 @@
1Artikel herunterladen
2=====================
3
4Du kannst jeden Artikel in verschiedenen Formaten herunterladen: ePUB, MOBI, PDF, XML, JSON, CSV.
5
6In der Artikelansicht, klickst du auf dieses Icon in der Seitenleiste:
7
8.. image:: ../../img/user/download_article.png
9 :alt: Artikel herunterladen
10 :align: center
11
12Du kannst auch eine ganze Kategorie (ungelesen, Favoriten, Archiv) in diesen Formaten herunterladen.
13Zum Beispiel, in der Ansicht **Ungelesen**, klickst du auf das Icon in der oberen Leiste:
14
15.. image:: ../../img/user/download_articles.png
16 :alt: Artikel herunterladen
17 :align: center
diff --git a/docs/de/user/errors_during_fetching.rst b/docs/de/user/errors_during_fetching.rst
new file mode 100644
index 00000000..b8e3e999
--- /dev/null
+++ b/docs/de/user/errors_during_fetching.rst
@@ -0,0 +1,28 @@
1Fehler während des Artikelladens
2================================
3
4Warum schlägt das Laden eines Artikels fehl?
5--------------------------------------------
6
7Das kann verschiedene Ursachen haben:
8
9- Netzwerkprobleme
10- wallabag kann den Inhalt aufgrund der Websitestruktur nicht laden
11
12Wie kann ich helfen das zu beheben?
13-----------------------------------
14
15- `indem du uns eine Mail mit der URL des Artikels sendest <mailto:hello\@wallabag.org>`_
16- indem du versuchst das Laden des Artikels durch Erstellen einer Datei für den Artikel
17 selbst zu beheben
18 Du kannst `dieses Tool <http://siteconfig.fivefilters.org/>`__ nutzen.
19
20Wie kann ich versuchen, einen Artikel erneut zu laden?
21------------------------------------------------------
22
23Wenn wallabag beim Laden eines Artikels fehlschlägt, kannst du auf den erneut laden Button
24klicken (der dritte in dem unteren Bild).
25
26.. image:: ../../img/user/refetch.png
27 :alt: Inhalt neu laden
28 :align: center
diff --git a/docs/de/user/faq.rst b/docs/de/user/faq.rst
new file mode 100644
index 00000000..1a199c1c
--- /dev/null
+++ b/docs/de/user/faq.rst
@@ -0,0 +1,45 @@
1Häufig gestellte Fragen
2==========================
3
4Während der Installation sehe ich den Fehler ``Error Output: sh: 1: @post-cmd: not found``
5------------------------------------------------------------------------------------------
6
7Es scheint, dass du ein Problem bei deiner ``composer`` Installation hast. Versuche es zu deinstallieren und neu zu installieren.
8
9`Lies die Dokumentation über composer, um zu erfahren wie es installiert wird
10<https://getcomposer.org/doc/00-intro.md>`__.
11
12Ich kann das Registrierungsformular nicht validieren
13----------------------------------------------------
14
15Stelle sicher, dass alle Felder ausgefüllt sind:
16
17* valide E-Mail-Adresse
18* das gleiche Passwort in zwei Feldern
19
20Ich erhalte meine Aktivierungsmail nicht
21----------------------------------------
22
23Bist du sicher, dass deine eingegebene E-Mail-Adresse korrekt war? Hast du deinen Spamordner überprüft?
24
25Wenn du dann immer noch nicht deine Aktivierungsmail siehst, stelle bitte sicher, dass du einen MTA
26korrekt installiert und eingerichtet hast. Prüfe, dass deine Firewallregel existiert, z.B. für firewalld:
27
28::
29 firewall-cmd --permanent --add-service=smtp
30 firewall-cmd --reload
31
32Schließlich, falls du SELinux aktiviert hast, setze folgende Regel:
33
34``setsebool -P httpd_can_sendmail 1``
35
36Wenn ich den Aktivierungslink klicke, bekomme ich die Nachricht ``Der Nutzer mit dem Bestätigungstoken "DtrOPfbQeVkWf6N" existiert nicht``
37------------------------------------------------------------------------------------------------------------------------------------------
38
39Du hast deinen Account schon aktiviert oder die URL der Aktivierungsmail ist falsch.
40
41Ich habe mein Passwort vergessen
42--------------------------------
43
44Du kannst dein Passwort zurücksetzen, indem du auf den Link ``Kennwort vergessen?`` auf der Loginseite klickst. Fülle dann das Formular mit deiner E-Mail-Adresse oder deinem Nutzernamen aus
45und du wirst eine E-Mail zum Passwort zurücksetzen erhalten.
diff --git a/docs/de/user/filters.rst b/docs/de/user/filters.rst
new file mode 100644
index 00000000..c9cda6b6
--- /dev/null
+++ b/docs/de/user/filters.rst
@@ -0,0 +1,49 @@
1Filter
2======
3
4Um Artikel leichter zu erreichen, kannst du sie filtern.
5Klicke auf das dritte Symbol in der oberen Leiste.
6
7.. image:: ../../img/user/topbar.png
8 :alt: Obere Leiste
9 :align: center
10
11Alle diese Filter können kombiniert werden.
12
13.. image:: ../../img/user/filters.png
14 :alt: Kombiniere alle Filter
15 :align: center
16
17Status
18------
19
20Nutze die Checkboxen, um einen archivierten oder favorisierten Artikel zu finden.
21
22Vorschaubild
23---------------
24
25Hake diesen Filter an, wenn du Artikel mit einem Vorschaubild erhalten willst.
26
27Sprache
28-------
29
30wallabag (via graby) kann die Artikelsprache erkennen. Es ist einfach für dich, Artikel
31in einer bestimmten Sprache zu filtern.
32
33Lesezeit
34--------
35
36wallabag schätzt wieviel Zeit du brauchst, um einen Artikel zu lesen. Mit diesem Filter
37kannst du zum Beispiel Artikel mit einer Lesezeit zwischen 2 und 5 Minuten finden.
38
39Domainname
40----------
41
42Dank dieses Filters, kannst ud Artikel von der gleichen Domain finden.
43Zum Beispiel tippst du in diesem Feld ``bbc.co.uk``, um Artikel dieser Website zu finden.
44
45Erstellungsdatum
46----------------
47
48Wenn du Artikel speicherst, merkt sich wallabag das aktuelle Datum. So praktisch, um Aritkel, die
49zwischen dem 1. und 31. Januar geschrieben sind, zu finden.
diff --git a/docs/de/user/first_article.rst b/docs/de/user/first_article.rst
new file mode 100644
index 00000000..b8ceda07
--- /dev/null
+++ b/docs/de/user/first_article.rst
@@ -0,0 +1,68 @@
1Speichere deinen ersten Artikel
2===============================
3
4Der Hauptzweck von wallabag ist es Webartikel zu speichern. Du hast viele Wege das zu tun.
5
6.. note::
7
8 Eine Schnellstartanleitung wird in der Anwendung angezeigt bis du deinen ersten
9 Artikel gespeichert hast.
10
11Durch Nutzung eines Bookmarklets
12--------------------------------
13
14Auf der ``How-To`` Seite, hast du einen Reiter ``Bookmarklet``. Ziehe und lasse den
15``bag it!`` Link in die Lesezeichenleiste deines Browser los.
16
17Jetzt kannst du immer wenn du einen Artikel im Web liest und ihn du ihn speichern
18willst, klicke auf den ``bag it!`` Link in deiner Lesezeichenleiste. Der Artikel
19wird gespeichert.
20
21Durch Nutzung des klassischen Formulars
22---------------------------------------
23
24In der oberen Leiste auf deinem Bildschirm, hast du drei Icons. Mit dem ersten, einem
25Pluszeichen, kannst du einfach neue Artikel speichern.
26
27.. image:: ../../img/user/topbar.png
28 :alt: obere Leiste
29 :align: center
30
31Klick darauf, um ein neues Feld anzeigen zu lassen, füge deine Artikel URL ein und
32drücke die ``Enter`` Taste. Der Artikel wird gespeichert.
33
34Durch Nutzung eines Browser Add-ons
35-----------------------------------
36
37Firefox
38~~~~~~~
39
40*Dieses Addon ist noch nicht für wallbag v2 verfügbar*.
41
42Chrome
43~~~~~~
44
45*Dieses Addon ist noch nicht für wallbag v2 verfügbar*.
46
47Durch Nutzung deiner Smartphone App
48-----------------------------------
49
50Android
51~~~~~~~
52
53*Diese Applikation ist noch nicht für wallbag v2 verfügbar*.
54
55Firefox OS
56~~~~~~~~~~
57
58*Diese Applikation ist noch nicht für wallbag v2 verfügbar*.
59
60Windows Phone
61~~~~~~~~~~~~~
62
63*Diese Applikation ist noch nicht für wallbag v2 verfügbar*.
64
65iOS
66~~~
67
68*Diese Applikation ist noch nicht für wallbag v2 verfügbar*.
diff --git a/docs/de/user/import.rst b/docs/de/user/import.rst
new file mode 100644
index 00000000..ecd3134b
--- /dev/null
+++ b/docs/de/user/import.rst
@@ -0,0 +1,46 @@
1Migration von einem Drittanbieter
2=================================
3
4Von Pocket
5-----------
6
7Erstelle eine neue Applikation in Pocket
8~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9
10Um deine Daten von Pocket zu importieren, nutzen wir die Pocket API. Du musst
11eine neue Applikation auf ihrer Entwicklerwebsite erstellen, um fortzufahren.
12
13* Erstelle eine neue Applikation `auf der Entwicklerwebsite <https://getpocket.com/developer/apps/new>`_
14* Fülle die erforderlichen Felder aus: Name, Beschreibung, Berechtigungen (nur **abrufen**), Plattform
15 (**web**), akzeptiere die Nutzungsbedingungen und reiche deine neue Applikation ein
16
17Pocket wird dir einen **Consumer Key** geben (z.B. `49961-985e4b92fe21fe4c78d682c1`).
18Du musst den ``pocket_consumer_key`` in dem Abschnitt ``Import`` in dem ``Interne Einstellungen`` Menü
19konfigurieren.
20
21Jetzt ist alles in Ordnung, um von Pocket zu migrieren.
22
23Importiere deine Daten in wallabag 2.x
24~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
26Klicke auf den ``Importieren`` Link im menü, auf ``Inhalte importieren`` in dem Pocketabschnitt und
27dann auf ``Verbinde mit Pocket und importieren Daten``.
28
29Du musst wallabag erlauben, mit deinem Pocketaccount zu interagieren.
30Deine Daten werden importiert. Datenimport kann ein sehr anspruchsvoller Prozess für deinen Server
31sein (wir müssen daran arbeiten, um diesen Import zu verbessern).
32
33Von Instapaper
34--------------
35
36*Funktion noch nicht implementiert in wallabag v2.*
37
38Von Readability
39---------------
40
41*Funktion noch nicht implementiert in wallabag v2.*
42
43Von einer HTML oder JSON Datei
44------------------------------
45
46*Funktion noch nicht implementiert in wallabag v2.*
diff --git a/docs/de/user/installation.rst b/docs/de/user/installation.rst
new file mode 100644
index 00000000..1b6710b7
--- /dev/null
+++ b/docs/de/user/installation.rst
@@ -0,0 +1,326 @@
1Installation von wallabag
2=========================
3
4Voraussetzungen
5---------------
6
7wallabag ist kompatibel mit PHP >= 5.5, inkl. PHP 7.
8
9Du benötigst die folgenden Extensions damit wallabag funktioniert. Einige von diesen sind vielleicht schon in deiner Version von PHP aktiviert, somit musst du eventuell
10nicht alle folgenden Pakete installieren.
11
12- php-session
13- php-ctype
14- php-dom
15- php-hash
16- php-simplexml
17- php-json
18- php-gd
19- php-mbstring
20- php-xml
21- php-tidy
22- php-iconv
23- php-curl
24- php-gettext
25- php-tokenizer
26
27wallabag nutzt PDO, um sich mit der Datenbank zu verbinden, darum benötigst du eines der folgenden Komponenten:
28
29- pdo_mysql
30- pdo_sqlite
31- pdo_pgsql
32
33und dessen dazugehörigen Datenbankserver.
34
35Installation
36------------
37
38Auf einem dedizierten Webserver (empfohlener Weg)
39~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40
41wallabag nutzt eine große Anzahl an Bibliotheken, um zu funktionieren. Diese Bibliotheken müssen mit einem Tool namens Composer installiert werden. Du musst es installieren sofern du es bisher noch nicht gemacht hast.
42
43Composer installieren:
44
45::
46
47 curl -s http://getcomposer.org/installer | php
48
49Du kannst eine spezifische Anleitung `hier <https://getcomposer.org/doc/00-intro.md>`__ finden:
50
51Um wallabag selbst zu installieren, musst du die folgenden Kommandos ausführen:
52
53::
54
55 git clone https://github.com/wallabag/wallabag.git
56 cd wallabag
57 git checkout 2.0.7
58 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
59 php bin/console wallabag:install --env=prod
60
61Um PHPs eingebauten Server zu starten und zu testen, ob alles korrekt installiert wurde, kannst du folgendes Kommando ausführen:
62
63::
64
65 php bin/console server:run --env=prod
66
67Und wallabag unter http://deineserverip:8000 erreichen
68
69.. tip::
70
71 Um Parameter mit Umgebungsvariable zu definieren, musst du die Variable mit dem ``SYMFONY__`` Präfix setzen. Zum Beispiel ``SYMFONY__DATABASE_DRIVER``. Du kannst einen Blick die `Symfony Dokumentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__ werfen.
72
73Auf einem geteilten Webhosting
74~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75
76Wir stellen ein Paket inkl. aller Abhängigkeiten bereit.
77Die Standardkonfiguration nutzt SQLite für die Datenbank. Wenn du diese Einstellung ändern willst, ändere bitte ``app/config/parameters.yml``.
78
79Wir haben bereits einen Nutzer erstellt: Login und Passwort sind ``wallabag``.
80
81.. caution:: Mit diesem Paket überprüft wallabag nicht die von der Applikation gebrauchten Exentions (diese Tests werden während ``composer install`` durchgeführt wenn du einen dedizierten Webserver hast, siehe oben).
82
83Führe dieses Kommando aus, um das neueste Paket herunterzuladen und zu entpacken:
84
85.. code-block:: bash
86
87 wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
88
89Jetzt lese die Dokumentation, um einen Virtualhost zu erstellen, dann greife auf dein wallabag zu.
90Wenn du die Datenbankkonfiguration eingestellt hast, MySQL oder PostgreSQL zu nutzen, musst du einen Nutzer über das folgende Kommando erstellen ``php bin/console wallabag:install --env=prod``.
91
92Installation mit Docker
93------------------------
94
95Wir stellen ein Docker Image zu Verfügung, um wallabag einfach zu installieren. Schaue in unser Repository in unserem `Docker Hub <https://hub.docker.com/r/wallabag/wallabag/>`__, um mehr Informationen zu erhalten.
96
97Kommando, um den Container zu starten
98~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99
100.. code-block:: bash
101
102 docker pull wallabag/wallabag
103
104Virtualhosts
105------------
106
107Konfiguration von Apache
108~~~~~~~~~~~~~~~~~~~~~~~
109
110Angenommen du willst wallabag in das Verzeichnis ``/var/www/wallabag`` installieren und du willst PHP als Apache Modul nutzen, dann ist hier ein vhost für wallabag:
111
112::
113
114 <VirtualHost *:80>
115 ServerName domain.tld
116 ServerAlias www.domain.tld
117
118 DocumentRoot /var/www/wallabag/web
119 <Directory /var/www/wallabag/web>
120 AllowOverride None
121 Order Allow,Deny
122 Allow from All
123
124 <IfModule mod_rewrite.c>
125 Options -MultiViews
126 RewriteEngine On
127 RewriteCond %{REQUEST_FILENAME} !-f
128 RewriteRule ^(.*)$ app.php [QSA,L]
129 </IfModule>
130 </Directory>
131
132 # uncomment the following lines if you install assets as symlinks
133 # or run into problems when compiling LESS/Sass/CoffeScript assets
134 # <Directory /var/www/wallabag>
135 # Options FollowSymlinks
136 # </Directory>
137
138 # optionally disable the RewriteEngine for the asset directories
139 # which will allow apache to simply reply with a 404 when files are
140 # not found instead of passing the request into the full symfony stack
141 <Directory /var/www/wallabag/web/bundles>
142 <IfModule mod_rewrite.c>
143 RewriteEngine Off
144 </IfModule>
145 </Directory>
146 ErrorLog /var/log/apache2/wallabag_error.log
147 CustomLog /var/log/apache2/wallabag_access.log combined
148 </VirtualHost>
149
150Nach dem du Apache neugeladen oder neugestartet hast, solltest du nun wallabag unter http://domain.tld erreichen.
151
152Konfiguration von Nginx
153~~~~~~~~~~~~~~~~~~~~~~~
154
155Angenommen du willst wallabag in das Verzeichnis ``/var/www/wallabag`` installieren, dann ist hier ein Rezept für wallabag:
156
157::
158
159 server {
160 server_name domain.tld www.domain.tld;
161 root /var/www/wallabag/web;
162
163 location / {
164 # try to serve file directly, fallback to app.php
165 try_files $uri /app.php$is_args$args;
166 }
167 location ~ ^/app\.php(/|$) {
168 fastcgi_pass unix:/var/run/php5-fpm.sock;
169 fastcgi_split_path_info ^(.+\.php)(/.*)$;
170 include fastcgi_params;
171 # When you are using symlinks to link the document root to the
172 # current version of your application, you should pass the real
173 # application path instead of the path to the symlink to PHP
174 # FPM.
175 # Otherwise, PHP's OPcache may not properly detect changes to
176 # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
177 # for more information).
178 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
179 fastcgi_param DOCUMENT_ROOT $realpath_root;
180 # Prevents URIs that include the front controller. This will 404:
181 # http://domain.tld/app.php/some-path
182 # Remove the internal directive to allow URIs like this
183 internal;
184 }
185
186 error_log /var/log/nginx/wallabag_error.log;
187 access_log /var/log/nginx/wallabag_access.log;
188 }
189
190Nach dem neuladen oder neustarten von nginx, solltest du nun wallabag unter http://domain.tld erreichen.
191
192.. tip::
193
194 When you want to import large file into wallabag, you need to add this line in your nginx configuration ``client_max_body_size XM; # allows file uploads up to X megabytes``.
195 Wenn du eine große Datei in wallabag importieren willst, solltest du diese Zeile zu deiner nginx Konfiguration hinzufügen ``client_max_body_size XM; # allows file uploads up to X megabytes``.
196
197Konfiguration von lighttpd
198~~~~~~~~~~~~~~~~~~~~~~~~~
199
200Angenommen du willst wallabag in das Verzeichnis ``/var/www/wallabag`` installieren, dann ist hier ein Rezept für wallabag (bearbeite deine ``lighttpd.conf`` und füge die Konfiguration dort ein):
201
202::
203
204 server.modules = (
205 "mod_fastcgi",
206 "mod_access",
207 "mod_alias",
208 "mod_compress",
209 "mod_redirect",
210 "mod_rewrite",
211 )
212 server.document-root = "/var/www/wallabag/web"
213 server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
214 server.errorlog = "/var/log/lighttpd/error.log"
215 server.pid-file = "/var/run/lighttpd.pid"
216 server.username = "www-data"
217 server.groupname = "www-data"
218 server.port = 80
219 server.follow-symlink = "enable"
220 index-file.names = ( "index.php", "index.html", "index.lighttpd.html")
221 url.access-deny = ( "~", ".inc" )
222 static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
223 compress.cache-dir = "/var/cache/lighttpd/compress/"
224 compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
225 include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
226 include_shell "/usr/share/lighttpd/create-mime.assign.pl"
227 include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
228 dir-listing.activate = "disable"
229
230 url.rewrite-if-not-file = (
231 "^/([^?]*)(?:\?(.*))?" => "/app.php?$1&$2",
232 "^/([^?]*)" => "/app.php?=$1",
233 )
234
235Rechte, um das Projektverzeichnis zu betreten
236---------------------------------------------
237
238Testumgebung
239~~~~~~~~~~~~
240
241Wenn wir nur wallabag testen wollen, führen wir nur das Kommando ``php bin/console server:run --env=prod`` aus, um unsere wallabag Instanz zu starten und alles wird geschmeidig laufen, weil der Nutzer, der das Projekt gestartet hat, den aktuellen Ordner ohne Probleme betreten kann.
242
243Produktionsumgebung
244~~~~~~~~~~~~~~~~~~~
245
246Sobald wir Apache oder Nginx nutzen, um unsere wallabag Instanz zu erreichen, und nicht das Kommando ``php bin/console server:run --env=prod`` nutzen, sollten wir dafür sorgen, die Rechte vernünftig zu vergeben, um die Ordner des Projektes zu schützen.
247
248Um dies zu machen, muss der Ordner, bekannt als ``DocumentRoot`` (bei Apache) oder ``root`` (bei Nginx), von dem Apache-/Nginx-Nutzer zugänglich sein. Sein Name ist meist ``www-data``, ``apache`` oder ``nobody`` (abhängig vom genutzten Linuxsystem).
249
250Der Ordner ``/var/www/wallabag/web`` musst dem letztgenannten zugänglich sein. Aber dies könnte nicht genug sein, wenn wir nur auf diesen Ordner achten, weil wir eine leere Seite sehen könnten oder einen Fehler 500, wenn wir die Homepage des Projekt öffnen.
251
252Dies kommt daher, dass wir die gleichen Rechte dem Ordner ``/var/www/wallabag/var`` geben müssen, so wie wir es für den Ordner ``/var/www/wallabag/web`` gemacht haben. Somit beheben wir das Problem mit dem folgenden Kommando:
253
254.. code-block:: bash
255
256 chown -R www-data:www-data /var/www/wallabag/var
257
258Es muss analog für die folgenden Ordner ausgeführt werden
259
260* /var/www/wallabag/bin/
261* /var/www/wallabag/app/config/
262* /var/www/wallabag/vendor/
263* /var/www/wallabag/data/
264
265durch Eingabe der Kommandos
266
267.. code-block:: bash
268
269 chown -R www-data:www-data /var/www/wallabag/bin
270 chown -R www-data:www-data /var/www/wallabag/app/config
271 chown -R www-data:www-data /var/www/wallabag/vendor
272 chown -R www-data:www-data /var/www/wallabag/data/
273
274ansonsten wirst du früher oder später folgenden Fehlermeldung sehen:
275
276.. code-block:: bash
277
278 Unable to write to the "bin" directory.
279 file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied
280 file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied
281
282Zusätzliche Regeln für SELinux
283~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
284
285Wenn SELinux in deinem System aktiviert ist, wirst du zusätzliche Kontexte konfigurieren müssen damit wallabag ordentlich funktioniert. Um zu testen, ob SELinux aktiviert ist, führe einfach folgendes aus:
286
287``getenforce``
288
289Dies wird ``Enforcing`` ausgeben, wenn SELinux aktiviert ist. Einen neuen Kontext zu erstellen, erfordert die folgende Syntax:
290
291``semanage fcontext -a -t <context type> <full path>``
292
293Zum Beispiel:
294
295``semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"``
296
297Dies wird rekursiv den httpd_sys_content_t Kontext auf das wallabag Verzeichnis und alle darunterliegenden Dateien und Ordner anwenden. Die folgenden Regeln werden gebraucht:
298
299+-----------------------------------+----------------------------+
300| Vollständiger Pfad | Kontext |
301+===================================+============================+
302| /var/www/wallabag(/.*)? | ``httpd_sys_content_t`` |
303+-----------------------------------+----------------------------+
304| /var/www/wallabag/data(/.*)? | ``httpd_sys_rw_content_t`` |
305+-----------------------------------+----------------------------+
306| /var/www/wallabag/var/logs(/.*)? | ``httpd_log_t`` |
307+-----------------------------------+----------------------------+
308| /var/www/wallabag/var/cache(/.*)? | ``httpd_cache_t`` |
309+-----------------------------------+----------------------------+
310
311Nach dem diese Kontexte erstellt wurden, tippe das folgende, um deine Regeln anzuwenden:
312
313``restorecon -R -v /var/www/wallabag``
314
315Du kannst deine Kontexte in einem Verzeichnis überprüfen, indem du ``ls -lZ`` tippst und alle deine aktuellen Regeln mit ``semanage fcontext -l -C`` überprüfst.
316
317Wenn du das vorkonfigurierte latest-v2-package installierst, dann ist eine weitere Regel während der Installation nötig:
318
319``semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wallabag/var"``
320
321Nachdem du erfolgreich dein wallabag erreichst und die Installation fertiggestellt hast, kann dieser Kontext entfernt werden:
322
323::
324
325 semanage fcontext -d -t httpd_sys_rw_content_t "/var/www/wallabag/var"
326 retorecon -R -v /var/www/wallabag/var
diff --git a/docs/de/user/login.rst b/docs/de/user/login.rst
new file mode 100644
index 00000000..cf1cdc4c
--- /dev/null
+++ b/docs/de/user/login.rst
@@ -0,0 +1,13 @@
1Login
2=====
3
4Dein Account ist nun aktiviert, Glückwünsch!
5
6Um dich bei wallabag einzuloggen, fülle das Formular auf der Loginseite aus.
7
8Wenn du an deinem persönlichen Computer arbeitest und verbunden bleiben willst,
9kannst du die Checkbox ``Angemeldet bleiben`` anhaken: wallabag wird sich für ein Jahr an deinen Login erinnern.
10
11.. image:: ../../img/user/login_form.png
12 :alt: Loginformular
13 :align: center
diff --git a/docs/de/user/migration.rst b/docs/de/user/migration.rst
new file mode 100644
index 00000000..bc8a61b0
--- /dev/null
+++ b/docs/de/user/migration.rst
@@ -0,0 +1,62 @@
1Migration von v1 oder v2
2========================
3
4Von wallabag 1.x
5-----------------
6
7Wenn du bisher wallabag v1.x genutzt hast, musst du deine Daten exportieren bevor du zu wallabag v2.x migrierst, weil die Applikation und ihre Datenbank sich stark geändert haben. In deiner alten wallabag Installation kannst du deine Daten auf der Konfigurationsseite exportieren.
8
9.. image:: ../../img/user/export_v1.png
10 :alt: Export von wallabag v1
11 :align: center
12
13.. note::
14 Wenn du mehrere Accounts auf der gleichen Instanz von wallabag hast, muss jeder Nutzer von v1 exportieren und in v2 seine Daten importieren.
15
16.. note::
17 Wenn du Probleme während des Exports oder Imports hast, scheue dich nicht davor `nach Hilfe zu fragen <https://www.wallabag.org/pages/support.html>`__.
18
19Wenn du eine JSON Datei mit deinen Artikeln erhalten hast, kannst du wallabag v2 installieren falls benötigt durch Befolgen `der Standardprozedur <http://doc.wallabag.org/en/master/user/installation.html>`__.
20
21Nachdem du einen Nutzerkonto auf deiner neuen wallabag v2 Instanz eingerichtet hast, kannst du zu dem Abschnitt `Import` springen und `Import von wallabag v1` auswählen. Wähle deine JSON Datei aus und lade sie hoch.
22
23.. image:: ../../img/user/import_wallabagv1.png
24 :alt: Import von wallabag v1
25 :align: center
26
27Import via command-line interface (CLI)
28~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
29
30Wenn du CLI Zugang zu deinem Webserver hast, kannst du dieses Kommando ausführen, um deine Aritkel vom wallabag v1 Export zu importieren:
31
32::
33
34 bin/console wallabag:import-v1 1 ~/Downloads/wallabag-export-1-2016-04-05.json --env=prod
35
36Bitte ersetze folgende Werte:
37
38* ``1`` ist die Nutzer ID in der Databank (Die ID von dem ersten erstellten Nutzer in wallabag ist 1)
39* ``~/Downloads/wallabag-export-1-2016-04-05.json`` ist der Pfad zu deinem wallabag v1 Export
40
41Du wirst eine solche Ausgabe erhalten:
42
43::
44
45 Start : 05-04-2016 11:36:07 ---
46 403 imported
47 0 already saved
48 End : 05-04-2016 11:36:09 ---
49
50Von wallabag 2.x
51----------------
52
53In der vorherigen wallabag Instanz, gehe zu `Alle Artikel` und exportiere diese Artikel als JSON.
54
55.. image:: ../../img/user/export_v2.png
56 :alt: Export von wallabag v2
57 :align: center
58
59In deiner neuen wallabag Instanz erstellst du ein Nutzerkonto und klickst auf den Link im Menü, um den Import fortzusetzen. Wähle Import von wallabag v2 aus und lade deine JSON Datei hoch.
60
61.. note::
62 Wenn du Probleme während des Exports oder Imports hast, scheue dich nicht davor `nach Hilfe zu fragen <https://www.wallabag.org/pages/support.html>`__.
diff --git a/docs/de/user/tags.rst b/docs/de/user/tags.rst
new file mode 100644
index 00000000..8ddc0f40
--- /dev/null
+++ b/docs/de/user/tags.rst
@@ -0,0 +1,2 @@
1Tags
2==== \ No newline at end of file
diff --git a/docs/de/user/upgrade.rst b/docs/de/user/upgrade.rst
new file mode 100644
index 00000000..13e3104f
--- /dev/null
+++ b/docs/de/user/upgrade.rst
@@ -0,0 +1,32 @@
1Wallabag updaten
2================
3
4Update auf einem dedizierten Webserver
5--------------------------------------
6
7Das neueste Release ist auf https://www.wallabag.org/pages/download-wallabag.html veröffentlicht. Um deine wallabag Installation auf die neueste Version upzudaten, führe die folgenden Kommandos in deinem wallabag Ordner aus (ersetze ``2.0.3`` mit der neuesten Releasenummer):
8
9::
10
11 git fetch origin
12 git fetch --tags
13 git checkout 2.0.3
14 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
15 php bin/console cache:clear --env=prod
16
17Update auf einem Shared Webhosting
18----------------------------------
19
20Sichere deine ``app/config/parameters.yml`` Datei.
21
22Lade das neueste Release von wallabag herunter:
23
24.. code-block:: bash
25
26 wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
27
28Entpacke das Archiv in deinen wallabag Ordner und ersetze ``app/config/parameters.yml`` mit deiner Datei.
29
30Wenn du SQLite nutzt, musst auch das ``data/`` Verzeichnis in die neue Installation kopieren.
31
32Leere den ``var/cache`` Ordner.
diff --git a/docs/en/user/android.rst b/docs/en/user/android.rst
index c13cf031..4271f037 100644
--- a/docs/en/user/android.rst
+++ b/docs/en/user/android.rst
@@ -13,61 +13,61 @@ Steps to configure your app
13 13
14When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first. 14When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first.
15 15
16.. image:: ../../img/user/android_welcome_screen.de.png 16.. image:: ../../img/user/android_welcome_screen.en.png
17 :alt: Welcome screen 17 :alt: Welcome screen
18 :align: center 18 :align: center
19 19
20Just confirm that message and you get redirected to the settings screen. 20Just confirm that message and you get redirected to the settings screen.
21 21
22.. image:: ../../img/user/android_configuration_screen.de.png 22.. image:: ../../img/user/android_configuration_screen.en.png
23 :alt: Settings screen 23 :alt: Settings screen
24 :align: center 24 :align: center
25 25
26Fill in your wallabag data. You need to enter your wallabag address. It is important that this URL does not end with a slash. Also add your wallabag credentials to the user name and password field. 26Fill in your wallabag data. You need to enter your wallabag address. It is important that this URL does not end with a slash. Also add your wallabag credentials to the user name and password field.
27 27
28.. image:: ../../img/user/android_configuration_filled_in.de.png 28.. image:: ../../img/user/android_configuration_filled_in.en.png
29 :alt: Filled in settings 29 :alt: Filled in settings
30 :align: center 30 :align: center
31 31
32After you have filled in your data, push the button Connection test and wait for the test to finish. 32After you have filled in your data, push the button Connection test and wait for the test to finish.
33 33
34.. image:: ../../img/user/android_configuration_connection_test.de.png 34.. image:: ../../img/user/android_configuration_connection_test.en.png
35 :alt: Connection test with your wallabag data 35 :alt: Connection test with your wallabag data
36 :align: center 36 :align: center
37 37
38The connection test shall finish with success. If not, you need to fix this first until you proceed. 38The connection test shall finish with success. If not, you need to fix this first until you proceed.
39 39
40.. image:: ../../img/user/android_configuration_connection_test_success.de.png 40.. image:: ../../img/user/android_configuration_connection_test_success.en.png
41 :alt: Connection test successful 41 :alt: Connection test successful
42 :align: center 42 :align: center
43 43
44After the connection test was successful, you can push the button to get your feed credentials. The app now tries to login to your wallabag instance and get the user id and the corresponding token for the feeds. 44After the connection test was successful, you can push the button to get your feed credentials. The app now tries to login to your wallabag instance and get the user id and the corresponding token for the feeds.
45 45
46.. image:: ../../img/user/android_configuration_get_feed_credentials.de.png 46.. image:: ../../img/user/android_configuration_get_feed_credentials.en.png
47 :alt: Getting the feed credentials 47 :alt: Getting the feed credentials
48 :align: center 48 :align: center
49 49
50When the process of getting your feed credentials finishes with success you see a toast message that the user id and the token were automatically filled in to the form. 50When the process of getting your feed credentials finishes with success you see a toast message that the user id and the token were automatically filled in to the form.
51 51
52.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.de.png 52.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
53 :alt: Getting feed credentials successful 53 :alt: Getting feed credentials successful
54 :align: center 54 :align: center
55 55
56Now you need to scroll to the bottom of the settings menu. Of course you can adjust the given settings to your needs. Finish the configuration of your app with pushing the save button. 56Now you need to scroll to the bottom of the settings menu. Of course you can adjust the given settings to your needs. Finish the configuration of your app with pushing the save button.
57 57
58.. image:: ../../img/user/android_configuration_scroll_bottom.de.png 58.. image:: ../../img/user/android_configuration_scroll_bottom.en.png
59 :alt: Bottom of the settings screen 59 :alt: Bottom of the settings screen
60 :align: center 60 :align: center
61 61
62After hitting the save button, you get the following screen. The app proposes to initiate a syncronisation process to update your feeds of articles. It is recommended to acknowledge this action and press Yes. 62After hitting the save button, you get the following screen. The app proposes to initiate a syncronisation process to update your feeds of articles. It is recommended to acknowledge this action and press Yes.
63 63
64.. image:: ../../img/user/android_configuration_saved_feed_update.de.png 64.. image:: ../../img/user/android_configuration_saved_feed_update.en.png
65 :alt: Settings saved the first time 65 :alt: Settings saved the first time
66 :align: center 66 :align: center
67 67
68Finally after the syncronisation finished successfully, you are presented the list of unread articles. 68Finally after the syncronisation finished successfully, you are presented the list of unread articles.
69 69
70.. image:: ../../img/user/android_unread_feed_synced.de.png 70.. image:: ../../img/user/android_unread_feed_synced.en.png
71 :alt: Filled article list cause feeds successfully syncronized 71 :alt: Filled article list cause feeds successfully syncronized
72 :align: center 72 :align: center
73 73
diff --git a/docs/en/user/configuration.rst b/docs/en/user/configuration.rst
index f681d874..f4c55dea 100644
--- a/docs/en/user/configuration.rst
+++ b/docs/en/user/configuration.rst
@@ -108,7 +108,7 @@ Variable Meaning Operator Meaning
108title Title of the entry <= Less than… 108title Title of the entry <= Less than…
109url URL of the entry < Strictly less than… 109url URL of the entry < Strictly less than…
110isArchived Whether the entry is archived or not => Greater than… 110isArchived Whether the entry is archived or not => Greater than…
111isStared Whether the entry is starred or not > Strictly greater than… 111isStarred Whether the entry is starred or not > Strictly greater than…
112content The entry's content = Equal to… 112content The entry's content = Equal to…
113language The entry's language != Not equal to… 113language The entry's language != Not equal to…
114mimetype The entry's mime-type OR One rule or another 114mimetype The entry's mime-type OR One rule or another
diff --git a/docs/en/user/faq.rst b/docs/en/user/faq.rst
index 1e36dc26..61303604 100644
--- a/docs/en/user/faq.rst
+++ b/docs/en/user/faq.rst
@@ -1,26 +1,39 @@
1Frequently Asked Questions 1Frequently Asked Questions
2========================== 2==========================
3 3
4During the installation, I've got this error ``Error Output: sh: 1: @post-cmd: not found`` 4During the installation, I got the error ``Error Output: sh: 1: @post-cmd: not found``
5------------------------------------------------------------------------------------------ 5--------------------------------------------------------------------------------------
6 6
7It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it. 7It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it.
8 8
9`Read the documentation about composer to know how to install it 9`Read the documentation about composer to know how to install it
10<https://getcomposer.org/doc/00-intro.md>`__. 10<https://getcomposer.org/doc/00-intro.md>`__.
11 11
12I can't valid the registration form 12I can't validate the registration form
13----------------------------------- 13--------------------------------------
14 14
15Make sure that all fields are well filled: 15Ensure that all fields are properly filled:
16 16
17* valid email address 17* valid email address
18* same passwords in two fields 18* same passwords in two fields
19 19
20I don't receive my activation email 20I'm not receiving my activation email
21----------------------------------- 21-------------------------------------
22 22
23Are you sure your email address was correct? Did you check your spams folder? 23Are you sure your email address was correct? Did you check your spam folder?
24
25If you still don't see the activation email, please ensure that you have
26installed and properly configured a mail transfer agent. Be sure to include a
27firewall rule for SMTP. E.g., if using firewalld:
28
29::
30
31 firewall-cmd --permanent --add-service=smtp
32 firewall-cmd --reload
33
34Lastly, if you have SELinux enabled, set the following rule:
35
36``setsebool -P httpd_can_sendmail 1``
24 37
25When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``. 38When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
26---------------------------------------------------------------------------------------------------------------------------------- 39----------------------------------------------------------------------------------------------------------------------------------
diff --git a/docs/en/user/installation.rst b/docs/en/user/installation.rst
index 6d804304..95df263a 100644
--- a/docs/en/user/installation.rst
+++ b/docs/en/user/installation.rst
@@ -23,13 +23,13 @@ You'll need the following extensions for wallabag to work. Some of these may alr
23- php-gettext 23- php-gettext
24- php-tokenizer 24- php-tokenizer
25 25
26wallabag uses PDO to connect to database, so you'll need one of: 26wallabag uses PDO to connect to the database, so you'll need one of the following:
27 27
28- pdo_mysql 28- pdo_mysql
29- pdo_sqlite 29- pdo_sqlite
30- pdo_pgsql 30- pdo_pgsql
31 31
32and it's corresponding database server. 32and its corresponding database server.
33 33
34Installation 34Installation
35------------ 35------------
@@ -37,7 +37,7 @@ Installation
37On a dedicated web server (recommended way) 37On a dedicated web server (recommended way)
38~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 39
40wallabag uses a big number of libraries in order to function. These libraries must be installed with a tool called Composer. You need to install it if you don't already have. 40wallabag uses a large number of libraries in order to function. These libraries must be installed with a tool called Composer. You need to install it if you have not already done so and be sure to use the 1.2 version (if you already have Composer, run a ``composer selfupdate``).
41 41
42Install Composer: 42Install Composer:
43 43
@@ -47,13 +47,13 @@ Install Composer:
47 47
48You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__: 48You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__:
49 49
50To install wallabag itself, you must run these two commands: 50To install wallabag itself, you must run the following commands:
51 51
52:: 52::
53 53
54 git clone https://github.com/wallabag/wallabag.git 54 git clone https://github.com/wallabag/wallabag.git
55 cd wallabag 55 cd wallabag
56 git checkout 2.0.4 56 git checkout 2.0.7
57 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist 57 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
58 php bin/console wallabag:install --env=prod 58 php bin/console wallabag:install --env=prod
59 59
@@ -67,17 +67,17 @@ And access wallabag at http://yourserverip:8000
67 67
68.. tip:: 68.. tip::
69 69
70 To define parameters with environment variables, you have to set these variables with ``SYMFONY__`` prefix. For example, ``SYMFONY__DATABASE_DRIVER``. You can have a look to the `Symfony documentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__. 70 To define parameters with environment variables, you have to set these variables with ``SYMFONY__`` prefix. For example, ``SYMFONY__DATABASE_DRIVER``. You can have a look at `Symfony documentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__.
71 71
72On a shared hosting 72On a shared hosting
73~~~~~~~~~~~~~~~~~~~ 73~~~~~~~~~~~~~~~~~~~
74 74
75We provide you a package with all dependancies inside. 75We provide a package with all dependencies inside.
76The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``. 76The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``.
77 77
78We already created a user: login and password are ``wallabag``. 78We already created a user: login and password are ``wallabag``.
79 79
80.. caution:: With this package, wallabag don't check mandatory extensions used in the application (theses checks are made during ``composer install`` when you have a dedicated web server, see above). 80.. caution:: With this package, wallabag doesn't check for mandatory extensions used in the application (theses checks are made during ``composer install`` when you have a dedicated web server, see above).
81 81
82Execute this command to download and extract the latest package: 82Execute this command to download and extract the latest package:
83 83
@@ -85,7 +85,7 @@ Execute this command to download and extract the latest package:
85 85
86 wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package 86 wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
87 87
88Now, read the following documentation to create your virtual host, then access to your wallabag. 88Now, read the following documentation to create your virtual host, then access your wallabag.
89If you changed the database configuration to use MySQL or PostgreSQL, you need to create a user via this command ``php bin/console wallabag:install --env=prod``. 89If you changed the database configuration to use MySQL or PostgreSQL, you need to create a user via this command ``php bin/console wallabag:install --env=prod``.
90 90
91Installation with Docker 91Installation with Docker
@@ -151,7 +151,7 @@ After reloading or restarting Apache, you should now be able to access wallabag
151Configuration on Nginx 151Configuration on Nginx
152~~~~~~~~~~~~~~~~~~~~~~ 152~~~~~~~~~~~~~~~~~~~~~~
153 153
154Assuming you install wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag : 154Assuming you installed wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag :
155 155
156:: 156::
157 157
@@ -226,7 +226,7 @@ Assuming you install wallabag in the /var/www/wallabag folder, here's the recipe
226 dir-listing.activate = "disable" 226 dir-listing.activate = "disable"
227 227
228 url.rewrite-if-not-file = ( 228 url.rewrite-if-not-file = (
229 "^/([^?])(?:\?(.))?" => "/app.php?$1&$2", 229 "^/([^?]*)(?:\?(.*))?" => "/app.php?$1&$2",
230 "^/([^?]*)" => "/app.php?=$1", 230 "^/([^?]*)" => "/app.php?=$1",
231 ) 231 )
232 232
@@ -258,7 +258,7 @@ It has to be the same for the following folders
258* /var/www/wallabag/bin/ 258* /var/www/wallabag/bin/
259* /var/www/wallabag/app/config/ 259* /var/www/wallabag/app/config/
260* /var/www/wallabag/vendor/ 260* /var/www/wallabag/vendor/
261* /var/www/wallabag/data/ 261* /var/www/wallabag/data/
262 262
263by entering 263by entering
264 264
@@ -269,10 +269,56 @@ by entering
269 chown -R www-data:www-data /var/www/wallabag/vendor 269 chown -R www-data:www-data /var/www/wallabag/vendor
270 chown -R www-data:www-data /var/www/wallabag/data/ 270 chown -R www-data:www-data /var/www/wallabag/data/
271 271
272otherwise, sooner or later you will meet this error messages 272otherwise, sooner or later you will see these error messages:
273 273
274.. code-block:: bash 274.. code-block:: bash
275 275
276 Unable to write to the "bin" directory. 276 Unable to write to the "bin" directory.
277 file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied 277 file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied
278 file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied 278 file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied
279
280Additional rules for SELinux
281~~~~~~~~~~~~~~~~~~~~~~~~~~~~
282
283If SELinux is enabled on your system, you will need to configure additional contexts in order for wallabag to function properly. To check if SELinux is enabled, simply enter the following:
284
285``getenforce``
286
287This will return ``Enforcing`` if SELinux is enabled. Creating a new context involves the following syntax:
288
289``semanage fcontext -a -t <context type> <full path>``
290
291For example:
292
293``semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"``
294
295This will recursively apply the httpd_sys_content_t context to the wallabag directory and all underlying files and folders. The following rules are needed:
296
297+-----------------------------------+----------------------------+
298| Full path | Context |
299+===================================+============================+
300| /var/www/wallabag(/.*)? | ``httpd_sys_content_t`` |
301+-----------------------------------+----------------------------+
302| /var/www/wallabag/data(/.*)? | ``httpd_sys_rw_content_t`` |
303+-----------------------------------+----------------------------+
304| /var/www/wallabag/var/logs(/.*)? | ``httpd_log_t`` |
305+-----------------------------------+----------------------------+
306| /var/www/wallabag/var/cache(/.*)? | ``httpd_cache_t`` |
307+-----------------------------------+----------------------------+
308
309After creating these contexts, enter the following in order to apply your rules:
310
311``restorecon -R -v /var/www/wallabag``
312
313You can check contexts in a directory by typing ``ls -lZ`` and you can see all of your current rules with ``semanage fcontext -l -C``.
314
315If you're installing the preconfigured latest-v2-package, then an additional rule is needed during the initial setup:
316
317``semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wallabag/var"``
318
319After you successfully access your wallabag and complete the initial setup, this context can be removed:
320
321::
322
323 semanage fcontext -d -t httpd_sys_rw_content_t "/var/www/wallabag/var"
324 retorecon -R -v /var/www/wallabag/var
diff --git a/docs/fr/user/configuration.rst b/docs/fr/user/configuration.rst
index 89305998..278f0022 100644
--- a/docs/fr/user/configuration.rst
+++ b/docs/fr/user/configuration.rst
@@ -110,7 +110,7 @@ Variable Sens Opérateur Sens
110title Titre de l'article <= Inférieur ou égal à … 110title Titre de l'article <= Inférieur ou égal à …
111url URL de l'article < Strictement inférieur à … 111url URL de l'article < Strictement inférieur à …
112isArchived Si l'article est archivé ou non => Supérieur ou égal à … 112isArchived Si l'article est archivé ou non => Supérieur ou égal à …
113isStared Si l'article est en favori ou non > Strictement supérieur à … 113isStarred Si l'article est en favori ou non > Strictement supérieur à …
114content Le contenu de l'article = Égal à … 114content Le contenu de l'article = Égal à …
115language La langue de l'article != Différent de … 115language La langue de l'article != Différent de …
116mimetype The type MIME de l'article OR Telle règle ou telle autre règle 116mimetype The type MIME de l'article OR Telle règle ou telle autre règle
diff --git a/docs/fr/user/installation.rst b/docs/fr/user/installation.rst
index 8f9a7932..d46f79a4 100644
--- a/docs/fr/user/installation.rst
+++ b/docs/fr/user/installation.rst
@@ -35,7 +35,7 @@ Installation
35Sur un serveur dédié (méthode conseillée) 35Sur un serveur dédié (méthode conseillée)
36~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 37
38wallabag utilise un grand nombre de bibliothèques pour fonctionner. Ces bibliothèques doivent être installées à l'aide d'un outil nommé Composer. Vous devez l'installer si ce n'est déjà fait. 38wallabag utilise un grand nombre de bibliothèques pour fonctionner. Ces bibliothèques doivent être installées à l'aide d'un outil nommé Composer. Vous devez l'installer si ce n'est déjà fait et vous assurer que vous utilisez bien la version 1.2 (si vous avez déjà Composer, faite un ``composer selfupdate``).
39 39
40Installation de Composer : 40Installation de Composer :
41 41
@@ -51,7 +51,7 @@ Pour installer wallabag, vous devez exécuter ces deux commandes :
51 51
52 git clone https://github.com/wallabag/wallabag.git 52 git clone https://github.com/wallabag/wallabag.git
53 cd wallabag 53 cd wallabag
54 git checkout 2.0.4 54 git checkout 2.0.7
55 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist 55 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
56 php bin/console wallabag:install --env=prod 56 php bin/console wallabag:install --env=prod
57 57
diff --git a/docs/img/user/android_configuration_connection_test.en.png b/docs/img/user/android_configuration_connection_test.en.png
new file mode 100644
index 00000000..479cd09a
--- /dev/null
+++ b/docs/img/user/android_configuration_connection_test.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_connection_test_success.en.png b/docs/img/user/android_configuration_connection_test_success.en.png
new file mode 100644
index 00000000..840f00cd
--- /dev/null
+++ b/docs/img/user/android_configuration_connection_test_success.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png b/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
new file mode 100644
index 00000000..df071b8b
--- /dev/null
+++ b/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_filled_in.en.png b/docs/img/user/android_configuration_filled_in.en.png
new file mode 100644
index 00000000..368ac515
--- /dev/null
+++ b/docs/img/user/android_configuration_filled_in.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_get_feed_credentials.en.png b/docs/img/user/android_configuration_get_feed_credentials.en.png
new file mode 100644
index 00000000..2a8958ff
--- /dev/null
+++ b/docs/img/user/android_configuration_get_feed_credentials.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_saved_feed_update.en.png b/docs/img/user/android_configuration_saved_feed_update.en.png
new file mode 100644
index 00000000..f1c06f17
--- /dev/null
+++ b/docs/img/user/android_configuration_saved_feed_update.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_screen.en.png b/docs/img/user/android_configuration_screen.en.png
new file mode 100644
index 00000000..945fd7c8
--- /dev/null
+++ b/docs/img/user/android_configuration_screen.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_scroll_bottom.en.png b/docs/img/user/android_configuration_scroll_bottom.en.png
new file mode 100644
index 00000000..11a6fc5a
--- /dev/null
+++ b/docs/img/user/android_configuration_scroll_bottom.en.png
Binary files differ
diff --git a/docs/img/user/android_unread_feed_synced.en.png b/docs/img/user/android_unread_feed_synced.en.png
new file mode 100644
index 00000000..8451557e
--- /dev/null
+++ b/docs/img/user/android_unread_feed_synced.en.png
Binary files differ
diff --git a/docs/img/user/android_welcome_screen.en.png b/docs/img/user/android_welcome_screen.en.png
new file mode 100644
index 00000000..a3741d50
--- /dev/null
+++ b/docs/img/user/android_welcome_screen.en.png
Binary files differ
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index e68df9de..38880908 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,24 +1,20 @@
1<?xml version="1.0" encoding="UTF-8"?> 1<?xml version="1.0" encoding="UTF-8"?>
2 2
3<phpunit backupGlobals="false" 3<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 backupStaticAttributes="false" 4 xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"
5 backupGlobals="false"
5 colors="true" 6 colors="true"
6 convertErrorsToExceptions="true"
7 convertNoticesToExceptions="true"
8 convertWarningsToExceptions="true"
9 processIsolation="false"
10 stopOnFailure="false"
11 syntaxCheck="false"
12 bootstrap="app/autoload.php" 7 bootstrap="app/autoload.php"
13 > 8>
14 9
15 <testsuites> 10 <testsuites>
16 <testsuite name="wallabag Test Suite"> 11 <testsuite name="wallabag Test Suite">
17 <directory>src/Wallabag/*Bundle/Tests</directory> 12 <directory>tests</directory>
18 </testsuite> 13 </testsuite>
19 </testsuites> 14 </testsuites>
20 15
21 <php> 16 <php>
17 <ini name="error_reporting" value="-1" />
22 <server name="KERNEL_DIR" value="app/" /> 18 <server name="KERNEL_DIR" value="app/" />
23 </php> 19 </php>
24 20
diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php
index 5202c524..af24e498 100644
--- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php
+++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php
@@ -110,8 +110,8 @@ class WallabagRestController extends FOSRestController
110 110
111 $url = $request->request->get('url'); 111 $url = $request->request->get('url');
112 $title = $request->request->get('title'); 112 $title = $request->request->get('title');
113 $isArchived = (int) $request->request->get('archive'); 113 $isArchived = $request->request->get('archive');
114 $isStarred = (int) $request->request->get('starred'); 114 $isStarred = $request->request->get('starred');
115 115
116 $entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($url, $this->getUser()->getId()); 116 $entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($url, $this->getUser()->getId());
117 117
@@ -172,8 +172,8 @@ class WallabagRestController extends FOSRestController
172 $this->validateUserAccess($entry->getUser()->getId()); 172 $this->validateUserAccess($entry->getUser()->getId());
173 173
174 $title = $request->request->get('title'); 174 $title = $request->request->get('title');
175 $isArchived = (int) $request->request->get('archive'); 175 $isArchived = $request->request->get('archive');
176 $isStarred = (int) $request->request->get('starred'); 176 $isStarred = $request->request->get('starred');
177 177
178 if (!is_null($title)) { 178 if (!is_null($title)) {
179 $entry->setTitle($title); 179 $entry->setTitle($title);
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index 69dfd4b1..ccdf9406 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -23,10 +23,16 @@ class EntryController extends Controller
23 { 23 {
24 try { 24 try {
25 $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); 25 $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
26
26 $em = $this->getDoctrine()->getManager(); 27 $em = $this->getDoctrine()->getManager();
27 $em->persist($entry); 28 $em->persist($entry);
28 $em->flush(); 29 $em->flush();
29 } catch (\Exception $e) { 30 } catch (\Exception $e) {
31 $this->get('logger')->error('Error while saving an entry', [
32 'exception' => $e,
33 'entry' => $entry,
34 ]);
35
30 return false; 36 return false;
31 } 37 }
32 38
@@ -60,11 +66,12 @@ class EntryController extends Controller
60 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()])); 66 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()]));
61 } 67 }
62 68
63 $this->updateEntry($entry); 69 $message = 'flashes.entry.notice.entry_saved';
64 $this->get('session')->getFlashBag()->add( 70 if (false === $this->updateEntry($entry)) {
65 'notice', 71 $message = 'flashes.entry.notice.entry_saved_failed';
66 'flashes.entry.notice.entry_saved' 72 }
67 ); 73
74 $this->get('session')->getFlashBag()->add('notice', $message);
68 75
69 return $this->redirect($this->generateUrl('homepage')); 76 return $this->redirect($this->generateUrl('homepage'));
70 } 77 }
@@ -350,7 +357,7 @@ class EntryController extends Controller
350 } 357 }
351 358
352 /** 359 /**
353 * Changes favorite status for an entry. 360 * Changes starred status for an entry.
354 * 361 *
355 * @param Request $request 362 * @param Request $request
356 * @param Entry $entry 363 * @param Entry $entry
@@ -399,7 +406,7 @@ class EntryController extends Controller
399 $url = $this->generateUrl( 406 $url = $this->generateUrl(
400 'view', 407 'view',
401 ['id' => $entry->getId()], 408 ['id' => $entry->getId()],
402 UrlGeneratorInterface::ABSOLUTE_URL 409 UrlGeneratorInterface::ABSOLUTE_PATH
403 ); 410 );
404 411
405 $em = $this->getDoctrine()->getManager(); 412 $em = $this->getDoctrine()->getManager();
@@ -411,8 +418,9 @@ class EntryController extends Controller
411 'flashes.entry.notice.entry_deleted' 418 'flashes.entry.notice.entry_deleted'
412 ); 419 );
413 420
414 // don't redirect user to the deleted entry 421 // don't redirect user to the deleted entry (check that the referer doesn't end with the same url)
415 $to = ($url !== $request->headers->get('referer') ? $request->headers->get('referer') : null); 422 $referer = $request->headers->get('referer');
423 $to = (1 !== preg_match('#'.$url.'$#i', $referer) ? $referer : null);
416 424
417 $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to); 425 $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to);
418 426
diff --git a/src/Wallabag/CoreBundle/Controller/FooterController.php b/src/Wallabag/CoreBundle/Controller/FooterController.php
new file mode 100644
index 00000000..fd93c436
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Controller/FooterController.php
@@ -0,0 +1,27 @@
1<?php
2
3namespace Wallabag\CoreBundle\Controller;
4
5use Symfony\Bundle\FrameworkBundle\Controller\Controller;
6
7class FooterController extends Controller
8{
9 /**
10 * Display the footer.
11 *
12 * @return \Symfony\Component\HttpFoundation\Response
13 */
14 public function indexAction()
15 {
16 $addonsUrl = $this->container->getParameter('addons_url');
17 $socialsUrl = $this->container->getParameter('socials_url');
18
19 return $this->render(
20 'WallabagCoreBundle::footer.html.twig',
21 [
22 'addonsUrl' => $addonsUrl,
23 'socialsUrl' => $socialsUrl,
24 ]
25 );
26 }
27}
diff --git a/src/Wallabag/CoreBundle/Controller/StaticController.php b/src/Wallabag/CoreBundle/Controller/StaticController.php
index b41302f8..2a57f06f 100644
--- a/src/Wallabag/CoreBundle/Controller/StaticController.php
+++ b/src/Wallabag/CoreBundle/Controller/StaticController.php
@@ -12,9 +12,11 @@ class StaticController extends Controller
12 */ 12 */
13 public function howtoAction() 13 public function howtoAction()
14 { 14 {
15 $addonsUrl = $this->container->getParameter('addons_url');
16
15 return $this->render( 17 return $this->render(
16 'WallabagCoreBundle:Static:howto.html.twig', 18 'WallabagCoreBundle:Static:howto.html.twig',
17 [] 19 ['addonsUrl' => $addonsUrl]
18 ); 20 );
19 } 21 }
20 22
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
index 5a376453..03be9667 100644
--- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
+++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
@@ -6,7 +6,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture;
6use Doctrine\Common\DataFixtures\OrderedFixtureInterface; 6use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
7use Doctrine\Common\Persistence\ObjectManager; 7use Doctrine\Common\Persistence\ObjectManager;
8use Wallabag\CoreBundle\Entity\Config; 8use Wallabag\CoreBundle\Entity\Config;
9use Wallabag\CoreBundle\Entity\TaggingRule;
10 9
11class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface 10class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
12{ 11{
@@ -16,12 +15,6 @@ class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
16 public function load(ObjectManager $manager) 15 public function load(ObjectManager $manager)
17 { 16 {
18 $adminConfig = new Config($this->getReference('admin-user')); 17 $adminConfig = new Config($this->getReference('admin-user'));
19 $taggingRule = new TaggingRule();
20
21 $taggingRule->setConfig($adminConfig);
22 $taggingRule->setRule('title matches "wallabag"');
23 $taggingRule->setTags(['wallabag']);
24 $manager->persist($taggingRule);
25 18
26 $adminConfig->setTheme('material'); 19 $adminConfig->setTheme('material');
27 $adminConfig->setItemsPerPage(30); 20 $adminConfig->setItemsPerPage(30);
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
index 2e1cc270..7efe6356 100644
--- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
+++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
@@ -28,6 +28,14 @@ class LoadTaggingRuleData extends AbstractFixture implements OrderedFixtureInter
28 28
29 $manager->persist($tr2); 29 $manager->persist($tr2);
30 30
31 $tr3 = new TaggingRule();
32
33 $tr3->setRule('title matches "wallabag"');
34 $tr3->setTags(['wallabag']);
35 $tr3->setConfig($this->getReference('admin-config'));
36
37 $manager->persist($tr3);
38
31 $manager->flush(); 39 $manager->flush();
32 } 40 }
33 41
diff --git a/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php b/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php
index 84599f0d..7d08b73b 100644
--- a/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php
+++ b/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php
@@ -25,6 +25,7 @@ class WallabagCoreExtension extends Extension
25 25
26 $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 26 $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
27 $loader->load('services.yml'); 27 $loader->load('services.yml');
28 $loader->load('parameters.yml');
28 } 29 }
29 30
30 public function getAlias() 31 public function getAlias()
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php
index 1271f1f5..ceae78b0 100644
--- a/src/Wallabag/CoreBundle/Entity/Entry.php
+++ b/src/Wallabag/CoreBundle/Entity/Entry.php
@@ -177,8 +177,16 @@ class Entry
177 private $user; 177 private $user;
178 178
179 /** 179 /**
180 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist", "remove"}) 180 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"})
181 * @ORM\JoinTable 181 * @ORM\JoinTable(
182 * name="entry_tag",
183 * joinColumns={
184 * @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
185 * },
186 * inverseJoinColumns={
187 * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
188 * }
189 * )
182 * 190 *
183 * @Groups({"entries_for_user", "export_all"}) 191 * @Groups({"entries_for_user", "export_all"})
184 */ 192 */
@@ -526,13 +534,18 @@ class Entry
526 } 534 }
527 } 535 }
528 536
529 $this->tags[] = $tag; 537 $this->tags->add($tag);
530 $tag->addEntry($this); 538 $tag->addEntry($this);
531 } 539 }
532 540
533 public function removeTag(Tag $tag) 541 public function removeTag(Tag $tag)
534 { 542 {
543 if (!$this->tags->contains($tag)) {
544 return;
545 }
546
535 $this->tags->removeElement($tag); 547 $this->tags->removeElement($tag);
548 $tag->removeEntry($this);
536 } 549 }
537 550
538 /** 551 /**
diff --git a/src/Wallabag/CoreBundle/Entity/Tag.php b/src/Wallabag/CoreBundle/Entity/Tag.php
index b4adbbd3..4b480ff1 100644
--- a/src/Wallabag/CoreBundle/Entity/Tag.php
+++ b/src/Wallabag/CoreBundle/Entity/Tag.php
@@ -98,9 +98,30 @@ class Tag
98 return $this->slug; 98 return $this->slug;
99 } 99 }
100 100
101 /**
102 * @param Entry $entry
103 */
101 public function addEntry(Entry $entry) 104 public function addEntry(Entry $entry)
102 { 105 {
103 $this->entries[] = $entry; 106 if ($this->entries->contains($entry)) {
107 return;
108 }
109
110 $this->entries->add($entry);
111 $entry->addTag($this);
112 }
113
114 /**
115 * @param Entry $entry
116 */
117 public function removeEntry(Entry $entry)
118 {
119 if (!$this->entries->contains($entry)) {
120 return;
121 }
122
123 $this->entries->removeElement($entry);
124 $entry->removeTag($this);
104 } 125 }
105 126
106 public function hasEntry($entry) 127 public function hasEntry($entry)
diff --git a/src/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformer.php b/src/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformer.php
index b712ad15..cb4bee83 100644
--- a/src/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformer.php
+++ b/src/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformer.php
@@ -16,7 +16,7 @@ class StringToListTransformer implements DataTransformerInterface
16 private $separator; 16 private $separator;
17 17
18 /** 18 /**
19 * @param string $separator The separator used in the list. 19 * @param string $separator The separator used in the list
20 */ 20 */
21 public function __construct($separator = ',') 21 public function __construct($separator = ',')
22 { 22 {
diff --git a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php
index 4cf22200..7d25cc80 100644
--- a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php
+++ b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php
@@ -21,7 +21,9 @@ class ConfigType extends AbstractType
21 { 21 {
22 $this->themes = array_combine( 22 $this->themes = array_combine(
23 $themes, 23 $themes,
24 array_map(function ($s) { return ucwords(strtolower(str_replace('-', ' ', $s))); }, $themes) 24 array_map(function ($s) {
25 return ucwords(strtolower(str_replace('-', ' ', $s)));
26 }, $themes)
25 ); 27 );
26 28
27 $this->languages = $languages; 29 $this->languages = $languages;
@@ -32,7 +34,6 @@ class ConfigType extends AbstractType
32 $builder 34 $builder
33 ->add('theme', ChoiceType::class, [ 35 ->add('theme', ChoiceType::class, [
34 'choices' => array_flip($this->themes), 36 'choices' => array_flip($this->themes),
35 'choices_as_values' => true,
36 'label' => 'config.form_settings.theme_label', 37 'label' => 'config.form_settings.theme_label',
37 ]) 38 ])
38 ->add('items_per_page', null, [ 39 ->add('items_per_page', null, [
@@ -49,7 +50,6 @@ class ConfigType extends AbstractType
49 ]) 50 ])
50 ->add('language', ChoiceType::class, [ 51 ->add('language', ChoiceType::class, [
51 'choices' => array_flip($this->languages), 52 'choices' => array_flip($this->languages),
52 'choices_as_values' => true,
53 'label' => 'config.form_settings.language_label', 53 'label' => 'config.form_settings.language_label',
54 ]) 54 ])
55 ->add('save', SubmitType::class, [ 55 ->add('save', SubmitType::class, [
diff --git a/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php b/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
index cd4d3490..3c597b5d 100644
--- a/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
+++ b/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
@@ -36,17 +36,26 @@ class EntryFilterType extends AbstractType
36 $builder 36 $builder
37 ->add('readingTime', NumberRangeFilterType::class, [ 37 ->add('readingTime', NumberRangeFilterType::class, [
38 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { 38 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
39 $value = $values['value']; 39 $lower = $values['value']['left_number'][0];
40 $upper = $values['value']['right_number'][0];
41
42 $min = (int) ($lower * $this->user->getConfig()->getReadingSpeed());
43 $max = (int) ($upper * $this->user->getConfig()->getReadingSpeed());
40 44
41 if (null === $value['left_number'][0] || null === $value['right_number'][0]) { 45 if (null === $lower && null === $upper) {
46 // no value? no filter
42 return; 47 return;
48 } elseif (null === $lower && null !== $upper) {
49 // only lower value is defined: query all entries with reading LOWER THAN this value
50 $expression = $filterQuery->getExpr()->lte($field, $max);
51 } elseif (null !== $lower && null === $upper) {
52 // only upper value is defined: query all entries with reading GREATER THAN this value
53 $expression = $filterQuery->getExpr()->gte($field, $min);
54 } else {
55 // both value are defined, perform a between
56 $expression = $filterQuery->getExpr()->between($field, $min, $max);
43 } 57 }
44 58
45 $min = (int) ($value['left_number'][0] * $this->user->getConfig()->getReadingSpeed());
46 $max = (int) ($value['right_number'][0] * $this->user->getConfig()->getReadingSpeed());
47
48 $expression = $filterQuery->getExpr()->between($field, $min, $max);
49
50 return $filterQuery->createCondition($expression); 59 return $filterQuery->createCondition($expression);
51 }, 60 },
52 'label' => 'entry.filters.reading_time.label', 61 'label' => 'entry.filters.reading_time.label',
@@ -87,6 +96,18 @@ class EntryFilterType extends AbstractType
87 ->add('isStarred', CheckboxFilterType::class, [ 96 ->add('isStarred', CheckboxFilterType::class, [
88 'label' => 'entry.filters.starred_label', 97 'label' => 'entry.filters.starred_label',
89 ]) 98 ])
99 ->add('isUnread', CheckboxFilterType::class, [
100 'label' => 'entry.filters.unread_label',
101 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
102 if (false === $values['value']) {
103 return;
104 }
105
106 $expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
107
108 return $filterQuery->createCondition($expression);
109 },
110 ])
90 ->add('previewPicture', CheckboxFilterType::class, [ 111 ->add('previewPicture', CheckboxFilterType::class, [
91 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { 112 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
92 if (false === $values['value']) { 113 if (false === $values['value']) {
@@ -101,7 +122,6 @@ class EntryFilterType extends AbstractType
101 ]) 122 ])
102 ->add('language', ChoiceFilterType::class, [ 123 ->add('language', ChoiceFilterType::class, [
103 'choices' => array_flip($this->repository->findDistinctLanguageByUser($this->user->getId())), 124 'choices' => array_flip($this->repository->findDistinctLanguageByUser($this->user->getId())),
104 'choices_as_values' => true,
105 'label' => 'entry.filters.language_label', 125 'label' => 'entry.filters.language_label',
106 ]) 126 ])
107 ; 127 ;
diff --git a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php
index 14ef4a64..239d09ae 100644
--- a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php
+++ b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php
@@ -25,7 +25,7 @@ class RuleBasedTagger
25 /** 25 /**
26 * Add tags from rules defined by the user. 26 * Add tags from rules defined by the user.
27 * 27 *
28 * @param Entry $entry Entry to tag. 28 * @param Entry $entry Entry to tag
29 */ 29 */
30 public function tag(Entry $entry) 30 public function tag(Entry $entry)
31 { 31 {
@@ -49,7 +49,7 @@ class RuleBasedTagger
49 * 49 *
50 * @param User $user 50 * @param User $user
51 * 51 *
52 * @return array<Entry> A list of modified entries. 52 * @return array<Entry> A list of modified entries
53 */ 53 */
54 public function tagAllForUser(User $user) 54 public function tagAllForUser(User $user)
55 { 55 {
@@ -75,7 +75,7 @@ class RuleBasedTagger
75 /** 75 /**
76 * Fetch a tag. 76 * Fetch a tag.
77 * 77 *
78 * @param string $label The tag's label. 78 * @param string $label The tag's label
79 * 79 *
80 * @return Tag 80 * @return Tag
81 */ 81 */
diff --git a/src/Wallabag/CoreBundle/Resources/config/parameters.yml b/src/Wallabag/CoreBundle/Resources/config/parameters.yml
new file mode 100644
index 00000000..abd9ab68
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Resources/config/parameters.yml
@@ -0,0 +1,12 @@
1parameters:
2 addons_url:
3 firefox: https://addons.mozilla.org/firefox/addon/wallabag-v2/
4 chrome: https://chrome.google.com/webstore/detail/wallabagit/peehlcgckcnclnjlndmoddifcicdnabm
5 f_droid: https://f-droid.org/app/fr.gaulupeau.apps.InThePoche
6 google_play: https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche
7 ios: https://itunes.apple.com/app/wallabag/id828331015?mt=8
8 windows: https://www.microsoft.com/store/apps/wallabag/9nblggh11646
9 socials_url:
10 twitter: https://twitter.com/wallabagapp
11 google_plus: https://plus.google.com/+WallabagOrg/posts
12 facebook: https://facebook.com/Wallabag
diff --git a/src/Wallabag/CoreBundle/Resources/public/themes/baggy/css/ratatouille.css b/src/Wallabag/CoreBundle/Resources/public/themes/baggy/css/ratatouille.css
index b203cbb8..605eb641 100644
--- a/src/Wallabag/CoreBundle/Resources/public/themes/baggy/css/ratatouille.css
+++ b/src/Wallabag/CoreBundle/Resources/public/themes/baggy/css/ratatouille.css
@@ -64,7 +64,7 @@ pre {
64 max-width: 61.25em;/*980px*/ 64 max-width: 61.25em;/*980px*/
65} 65}
66 66
67table, img { 67table, img, figure {
68 max-width: 100%; 68 max-width: 100%;
69 height :auto; 69 height :auto;
70} 70}
diff --git a/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css b/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css
index f0beab98..eb4eebd8 100755
--- a/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css
+++ b/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css
@@ -351,7 +351,8 @@ main ul.row {
351 max-width: 40em; 351 max-width: 40em;
352} 352}
353 353
354#article img { 354#article img,
355#article figure {
355 max-width: 100%; 356 max-width: 100%;
356 height: auto; 357 height: auto;
357} 358}
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
index 8d392063..c066aaf7 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'estimeret læsetid' 144 reading_time: 'estimeret læsetid'
145 reading_time_minutes: 'estimeret læsetid: %readingTime% min' 145 reading_time_minutes: 'estimeret læsetid: %readingTime% min'
146 reading_time_less_one_minute: 'estimeret læsetid: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'estimeret læsetid: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Marker som læst' 150 toogle_as_read: 'Marker som læst'
149 toogle_as_star: 'Skift favoritstatus' 151 toogle_as_star: 'Skift favoritstatus'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Status' 156 status_label: 'Status'
155 archived_label: 'Arkiveret' 157 archived_label: 'Arkiveret'
156 starred_label: 'Favorit' 158 starred_label: 'Favorit'
159 unread_label: 'Ulæst'
157 preview_picture_label: 'Har et vist billede' 160 preview_picture_label: 'Har et vist billede'
158 preview_picture_help: 'Forhåndsvis billede' 161 preview_picture_help: 'Forhåndsvis billede'
159 language_label: 'Sprog' 162 language_label: 'Sprog'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Tilbage' 178 back_to_homepage: 'Tilbage'
176 set_as_read: 'Marker som læst' 179 set_as_read: 'Marker som læst'
177 # set_as_unread: 'Mark as unread' 180 # set_as_unread: 'Mark as unread'
178 set_as_favorite: 'Marker som favorit' 181 set_as_starred: 'Marker som favorit'
179 view_original_article: 'Originalartikel' 182 view_original_article: 'Originalartikel'
180 # re_fetch_content: 'Re-fetch content' 183 # re_fetch_content: 'Re-fetch content'
181 delete: 'Slet' 184 delete: 'Slet'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Rediger titel' 193 edit_title: 'Rediger titel'
191 original_article: 'original' 194 original_article: 'original'
192 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations' 195 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
196 created_at: 'Oprettelsesdato'
193 new: 197 new:
194 page_title: 'Gem ny artikel' 198 page_title: 'Gem ny artikel'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 # entry_already_saved: 'Entry already saved on %date%' 401 # entry_already_saved: 'Entry already saved on %date%'
398 # entry_saved: 'Entry saved' 402 # entry_saved: 'Entry saved'
403 # entry_saved_failed: 'Failed to save entry'
399 # entry_updated: 'Entry updated' 404 # entry_updated: 'Entry updated'
400 # entry_reloaded: 'Entry reloaded' 405 # entry_reloaded: 'Entry reloaded'
401 # entry_reload_failed: 'Failed to reload entry' 406 # entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
index c7a89492..28d826b6 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'geschätzte Lesezeit' 144 reading_time: 'geschätzte Lesezeit'
145 reading_time_minutes: 'geschätzte Lesezeit: %readingTime% min' 145 reading_time_minutes: 'geschätzte Lesezeit: %readingTime% min'
146 reading_time_less_one_minute: 'geschätzte Lesezeit: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'geschätzte Lesezeit: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Gelesen-Status ändern' 150 toogle_as_read: 'Gelesen-Status ändern'
149 toogle_as_star: 'Favoriten-Status ändern' 151 toogle_as_star: 'Favoriten-Status ändern'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Status' 156 status_label: 'Status'
155 archived_label: 'Archiviert' 157 archived_label: 'Archiviert'
156 starred_label: 'Favorisiert' 158 starred_label: 'Favorisiert'
159 unread_label: 'Ungelesene'
157 preview_picture_label: 'Vorschaubild vorhanden' 160 preview_picture_label: 'Vorschaubild vorhanden'
158 preview_picture_help: 'Vorschaubild' 161 preview_picture_help: 'Vorschaubild'
159 language_label: 'Sprache' 162 language_label: 'Sprache'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Zurück' 178 back_to_homepage: 'Zurück'
176 set_as_read: 'Als gelesen markieren' 179 set_as_read: 'Als gelesen markieren'
177 set_as_unread: 'Als ungelesen markieren' 180 set_as_unread: 'Als ungelesen markieren'
178 set_as_favorite: 'Favorisieren' 181 set_as_starred: 'Favorisieren'
179 view_original_article: 'Original-Artikel' 182 view_original_article: 'Original-Artikel'
180 re_fetch_content: 'Inhalt neu laden' 183 re_fetch_content: 'Inhalt neu laden'
181 delete: 'Löschen' 184 delete: 'Löschen'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Titel ändern' 193 edit_title: 'Titel ändern'
191 original_article: 'original' 194 original_article: 'original'
192 annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %nbAnnotations% Anmerkungen' 195 annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %nbAnnotations% Anmerkungen'
196 created_at: 'Erstellungsdatum'
193 new: 197 new:
194 page_title: 'Neuen Artikel speichern' 198 page_title: 'Neuen Artikel speichern'
195 placeholder: 'https://website.de' 199 placeholder: 'https://website.de'
@@ -395,7 +399,8 @@ flashes:
395 entry: 399 entry:
396 notice: 400 notice:
397 entry_already_saved: 'Eintrag bereits am %date% gespeichert' 401 entry_already_saved: 'Eintrag bereits am %date% gespeichert'
398 entry_saved: 'Eintag gespeichert' 402 entry_saved: 'Eintrag gespeichert'
403 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Eintrag aktualisiert' 404 entry_updated: 'Eintrag aktualisiert'
400 entry_reloaded: 'Eintrag neugeladen' 405 entry_reloaded: 'Eintrag neugeladen'
401 entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen' 406 entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
index 1cc42404..c6633f5b 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
@@ -81,7 +81,7 @@ config:
81 archive: 'archived' 81 archive: 'archived'
82 rss_limit: 'Number of items in the feed' 82 rss_limit: 'Number of items in the feed'
83 form_user: 83 form_user:
84 two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion" 84 two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connection."
85 name_label: 'Name' 85 name_label: 'Name'
86 email_label: 'Email' 86 email_label: 'Email'
87 twoFactorAuthentication_label: 'Two factor authentication' 87 twoFactorAuthentication_label: 'Two factor authentication'
@@ -98,9 +98,9 @@ config:
98 faq: 98 faq:
99 title: 'FAQ' 99 title: 'FAQ'
100 tagging_rules_definition_title: 'What does « tagging rules » mean?' 100 tagging_rules_definition_title: 'What does « tagging rules » mean?'
101 tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.' 101 tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble of manually classifying your entries.'
102 how_to_use_them_title: 'How do I use them?' 102 how_to_use_them_title: 'How do I use them?'
103 how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »' 103 how_to_use_them_description: 'Let us assume you want to tag new entries as « <i>short reading</i> » when the reading time is under 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them with a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »'
104 variables_available_title: 'Which variables and operators can I use to write rules?' 104 variables_available_title: 'Which variables and operators can I use to write rules?'
105 variables_available_description: 'The following variables and operators can be used to create tagging rules:' 105 variables_available_description: 'The following variables and operators can be used to create tagging rules:'
106 meaning: 'Meaning' 106 meaning: 'Meaning'
@@ -140,13 +140,15 @@ entry:
140 archived: 'Archived entries' 140 archived: 'Archived entries'
141 filtered: 'Filtered entries' 141 filtered: 'Filtered entries'
142 list: 142 list:
143 number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.' 143 number_on_the_page: '{0} There are no entries.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
144 reading_time: 'estimated reading time' 144 reading_time: 'estimated reading time'
145 reading_time_minutes: 'estimated reading time: %readingTime% min' 145 reading_time_minutes: 'estimated reading time: %readingTime% min'
146 reading_time_less_one_minute: 'estimated reading time: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'estimated reading time: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Toggle mark as read' 150 toogle_as_read: 'Toggle mark as read'
149 toogle_as_star: 'Toggle favorite' 151 toogle_as_star: 'Toggle starred'
150 delete: 'Delete' 152 delete: 'Delete'
151 export_title: 'Export' 153 export_title: 'Export'
152 filters: 154 filters:
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Status' 156 status_label: 'Status'
155 archived_label: 'Archived' 157 archived_label: 'Archived'
156 starred_label: 'Starred' 158 starred_label: 'Starred'
159 unread_label: 'Unread'
157 preview_picture_label: 'Has a preview picture' 160 preview_picture_label: 'Has a preview picture'
158 preview_picture_help: 'Preview picture' 161 preview_picture_help: 'Preview picture'
159 language_label: 'Language' 162 language_label: 'Language'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Back' 178 back_to_homepage: 'Back'
176 set_as_read: 'Mark as read' 179 set_as_read: 'Mark as read'
177 set_as_unread: 'Mark as unread' 180 set_as_unread: 'Mark as unread'
178 set_as_favorite: 'Favorite' 181 set_as_starred: 'Toggle starred'
179 view_original_article: 'Original article' 182 view_original_article: 'Original article'
180 re_fetch_content: 'Re-fetch content' 183 re_fetch_content: 'Re-fetch content'
181 delete: 'Delete' 184 delete: 'Delete'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Edit title' 193 edit_title: 'Edit title'
191 original_article: 'original' 194 original_article: 'original'
192 annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations' 195 annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
196 created_at: 'Creation date'
193 new: 197 new:
194 page_title: 'Save new entry' 198 page_title: 'Save new entry'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -222,14 +226,14 @@ about:
222 bug_reports: 'Bug reports' 226 bug_reports: 'Bug reports'
223 support: '<a href="https://support.wallabag.org">On our support website</a> or <a href="https://github.com/wallabag/wallabag/issues">on GitHub</a>' 227 support: '<a href="https://support.wallabag.org">On our support website</a> or <a href="https://github.com/wallabag/wallabag/issues">on GitHub</a>'
224 helping: 228 helping:
225 description: 'wallabag is free and opensource. You can help us:' 229 description: 'wallabag is free and open source. You can help us:'
226 by_contributing: 'by contributing to the project:' 230 by_contributing: 'by contributing to the project:'
227 by_contributing_2: 'an issue lists all our needs' 231 by_contributing_2: 'an issue lists all our needs'
228 by_paypal: 'via Paypal' 232 by_paypal: 'via Paypal'
229 contributors: 233 contributors:
230 description: 'Thank you to contributors on wallabag web application' 234 description: 'Thank you to contributors on wallabag web application'
231 third_party: 235 third_party:
232 description: 'Here are the list of third-party libraries used in wallabag (with their licenses):' 236 description: 'Here is the list of third-party libraries used in wallabag (with their licenses):'
233 package: 'Package' 237 package: 'Package'
234 license: 'License' 238 license: 'License'
235 239
@@ -258,7 +262,7 @@ quickstart:
258 page_title: 'Quickstart' 262 page_title: 'Quickstart'
259 intro: 263 intro:
260 title: 'Welcome to wallabag!' 264 title: 'Welcome to wallabag!'
261 paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you." 265 paragraph_1: "We'll accompany you on your visit to wallabag and show you some features that might interest you."
262 paragraph_2: 'Follow us!' 266 paragraph_2: 'Follow us!'
263 configure: 267 configure:
264 title: 'Configure the application' 268 title: 'Configure the application'
@@ -290,7 +294,7 @@ quickstart:
290 title: 'Full documentation' 294 title: 'Full documentation'
291 annotate: 'Annotate your article' 295 annotate: 'Annotate your article'
292 export: 'Convert your articles into ePUB or PDF' 296 export: 'Convert your articles into ePUB or PDF'
293 search_filters: 'See how you can look for an article by using search engine and filters' 297 search_filters: 'See how you can look for an article by using the search engine and filters'
294 fetching_errors: 'What can I do if an article encounters errors during fetching?' 298 fetching_errors: 'What can I do if an article encounters errors during fetching?'
295 all_docs: 'And so many other articles!' 299 all_docs: 'And so many other articles!'
296 support: 300 support:
@@ -303,11 +307,11 @@ quickstart:
303tag: 307tag:
304 page_title: 'Tags' 308 page_title: 'Tags'
305 list: 309 list:
306 number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.' 310 number_on_the_page: '{0} There are no tags.|{1} There is one tag.|]1,Inf[ There are %count% tags.'
307 311
308import: 312import:
309 page_title: 'Import' 313 page_title: 'Import'
310 page_description: 'Welcome to wallabag importer. Please select your previous service that you want to migrate.' 314 page_description: 'Welcome to wallabag importer. Please select your previous service from which you want to migrate.'
311 action: 315 action:
312 import_contents: 'Import contents' 316 import_contents: 'Import contents'
313 form: 317 form:
@@ -317,7 +321,7 @@ import:
317 save_label: 'Upload file' 321 save_label: 'Upload file'
318 pocket: 322 pocket:
319 page_title: 'Import > Pocket' 323 page_title: 'Import > Pocket'
320 description: "This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag." 324 description: "This importer will import all of your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag."
321 config_missing: 325 config_missing:
322 description: "Pocket import isn't configured." 326 description: "Pocket import isn't configured."
323 admin_message: 'You need to define %keyurls%a pocket_consumer_key%keyurle%.' 327 admin_message: 'You need to define %keyurls%a pocket_consumer_key%keyurle%.'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 entry_already_saved: 'Entry already saved on %date%' 401 entry_already_saved: 'Entry already saved on %date%'
398 entry_saved: 'Entry saved' 402 entry_saved: 'Entry saved'
403 entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Entry updated' 404 entry_updated: 'Entry updated'
400 entry_reloaded: 'Entry reloaded' 405 entry_reloaded: 'Entry reloaded'
401 entry_reload_failed: 'Failed to reload entry' 406 entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
index e8461247..266b4af5 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
@@ -135,7 +135,7 @@ config:
135 135
136entry: 136entry:
137 page_titles: 137 page_titles:
138 unread: 'Artúclos no leídos' 138 unread: 'Artículos no leídos'
139 starred: 'Artículos favoritos' 139 starred: 'Artículos favoritos'
140 archived: 'Artículos archivados' 140 archived: 'Artículos archivados'
141 filtered: 'Artículos filtrados' 141 filtered: 'Artículos filtrados'
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'tiempo estimado de lectura' 144 reading_time: 'tiempo estimado de lectura'
145 reading_time_minutes: 'tiempo estimado de lectura: %readingTime% min' 145 reading_time_minutes: 'tiempo estimado de lectura: %readingTime% min'
146 reading_time_less_one_minute: 'tiempo estimado de lectura: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'tiempo estimado de lectura: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Marcar como leído/ no leído' 150 toogle_as_read: 'Marcar como leído/ no leído'
149 toogle_as_star: 'Marcar como favorito/ no favorito' 151 toogle_as_star: 'Marcar como favorito/ no favorito'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Estatus' 156 status_label: 'Estatus'
155 archived_label: 'Archivado' 157 archived_label: 'Archivado'
156 starred_label: 'Favorito' 158 starred_label: 'Favorito'
159 unread_label: 'Sin leer'
157 preview_picture_label: 'Hay una foto' 160 preview_picture_label: 'Hay una foto'
158 preview_picture_help: 'Foto de preview' 161 preview_picture_help: 'Foto de preview'
159 language_label: 'Idioma' 162 language_label: 'Idioma'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Regrese a la página principal' 178 back_to_homepage: 'Regrese a la página principal'
176 set_as_read: 'Marcar como leído' 179 set_as_read: 'Marcar como leído'
177 set_as_unread: 'Marcar como no leído' 180 set_as_unread: 'Marcar como no leído'
178 set_as_favorite: 'Marcar como favorito' 181 set_as_starred: 'Marcar como favorito'
179 view_original_article: 'Artículo original' 182 view_original_article: 'Artículo original'
180 re_fetch_content: 'Redescargar el contenido' 183 re_fetch_content: 'Redescargar el contenido'
181 delete: 'Suprimir' 184 delete: 'Suprimir'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Modificar el título' 193 edit_title: 'Modificar el título'
191 original_article: 'original' 194 original_article: 'original'
192 annotations_on_the_entry: '{0} Sin anotaciones|{1} Una anotación|]1,Inf[ %nbAnnotations% anotaciones' 195 annotations_on_the_entry: '{0} Sin anotaciones|{1} Una anotación|]1,Inf[ %nbAnnotations% anotaciones'
196 created_at: 'Fecha de creación'
193 new: 197 new:
194 page_title: 'Guardar un nuevo artículo' 198 page_title: 'Guardar un nuevo artículo'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 entry_already_saved: 'Entrada ya guardada por %fecha%' 401 entry_already_saved: 'Entrada ya guardada por %fecha%'
398 entry_saved: 'Entrada guardada' 402 entry_saved: 'Entrada guardada'
403 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Entrada actualizada' 404 entry_updated: 'Entrada actualizada'
400 entry_reloaded: 'Entrada recargada' 405 entry_reloaded: 'Entrada recargada'
401 entry_reload_failed: 'Entrada recargada reprobada' 406 entry_reload_failed: 'Entrada recargada reprobada'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
index d34ff8ff..c2350019 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
@@ -96,8 +96,8 @@ config:
96 rule_label: 'قانون' 96 rule_label: 'قانون'
97 tags_label: 'برچسب‌ها' 97 tags_label: 'برچسب‌ها'
98 faq: 98 faq:
99 title: 'پرسش‌های متداول' 99 title: 'پرسش‌های متداول'
100 tagging_rules_definition_title: 'برچسب‌گذاری خودکار یعنی چه؟' 100 tagging_rules_definition_title: 'برچسب‌گذاری خودکار یعنی چه؟'
101 # tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.' 101 # tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.'
102 # how_to_use_them_title: 'How do I use them?' 102 # how_to_use_them_title: 'How do I use them?'
103 # how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »' 103 # how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »'
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'زمان تخمینی برای خواندن' 144 reading_time: 'زمان تخمینی برای خواندن'
145 reading_time_minutes: 'زمان تخمینی برای خواندن: %readingTime% min' 145 reading_time_minutes: 'زمان تخمینی برای خواندن: %readingTime% min'
146 reading_time_less_one_minute: 'زمان تخمینی برای خواندن: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'زمان تخمینی برای خواندن: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'خوانده‌شده/خوانده‌نشده' 150 toogle_as_read: 'خوانده‌شده/خوانده‌نشده'
149 toogle_as_star: 'برگزیده/نابرگزیده' 151 toogle_as_star: 'برگزیده/نابرگزیده'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'وضعیت' 156 status_label: 'وضعیت'
155 archived_label: 'بایگانی‌شده' 157 archived_label: 'بایگانی‌شده'
156 starred_label: 'برگزیده' 158 starred_label: 'برگزیده'
159 unread_label: 'خوانده‌نشده'
157 preview_picture_label: 'دارای عکس پیش‌نمایش' 160 preview_picture_label: 'دارای عکس پیش‌نمایش'
158 preview_picture_help: 'پیش‌نمایش عکس' 161 preview_picture_help: 'پیش‌نمایش عکس'
159 language_label: 'زبان' 162 language_label: 'زبان'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'بازگشت' 178 back_to_homepage: 'بازگشت'
176 set_as_read: 'خوانده‌شده' 179 set_as_read: 'خوانده‌شده'
177 set_as_unread: 'به عنوان خوانده‌نشده علامت بزن' 180 set_as_unread: 'به عنوان خوانده‌نشده علامت بزن'
178 set_as_favorite: 'برگزیده' 181 set_as_starred: 'برگزیده'
179 view_original_article: 'مقالهٔ اصلی' 182 view_original_article: 'مقالهٔ اصلی'
180 re_fetch_content: 'مقاله‌ها را دوباره دریاÙت Ú©Ù†' 183 re_fetch_content: 'مقاله‌ها را دوباره دریاÙت Ú©Ù†'
181 delete: 'پاک کردن' 184 delete: 'پاک کردن'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'ویرایش عنوان' 193 edit_title: 'ویرایش عنوان'
191 original_article: 'اصلی' 194 original_article: 'اصلی'
192 annotations_on_the_entry: '{0} بدون حاشیه|{1} یک حاشیه|]1,Inf[ %nbحاشیه% annotations' 195 annotations_on_the_entry: '{0} بدون حاشیه|{1} یک حاشیه|]1,Inf[ %nbحاشیه% annotations'
196 created_at: 'زمان ساخت'
193 new: 197 new:
194 page_title: 'ذخیرهٔ مقالهٔ تازه' 198 page_title: 'ذخیرهٔ مقالهٔ تازه'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -383,30 +387,31 @@ developer:
383flashes: 387flashes:
384 config: 388 config:
385 notice: 389 notice:
386 config_saved: 'پیکربندی ذخیره شد. برخی از تنظیمات پس از این که قطع شدید اعمال می‌شود.' 390 config_saved: 'پیکربندی ذخیره شد. برخی از تنظیمات پس از این که قطع شدید اعمال می‌شود.'
387 password_updated: 'رمز به‌روز شد' 391 password_updated: 'رمز به‌روز شد'
388 password_not_updated_demo: "در حالت نمایشی نمی‌توانید رمز کاربر را عوض کنید." 392 password_not_updated_demo: "در حالت نمایشی نمی‌توانید رمز کاربر را عوض کنید."
389 user_updated: 'اطلاعات به‌روز شد' 393 user_updated: 'اطلاعات به‌روز شد'
390 rss_updated: 'اطلاعات آر-اس-اس به‌روز شد' 394 rss_updated: 'اطلاعات آر-اس-اس به‌روز شد'
391 tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد' 395 tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد'
392 tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد' 396 tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد'
393 user_added: 'کابر "%username%" اÙزوده شد' 397 user_added: 'کابر "%username%" اÙزوده شد'
394 rss_token_updated: 'کد آر-اس-اس به‌روز شد' 398 rss_token_updated: 'کد آر-اس-اس به‌روز شد'
395 entry: 399 entry:
396 notice: 400 notice:
397 entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود' 401 entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود'
398 entry_saved: 'مقاله ذخیره شد' 402 entry_saved: 'مقاله ذخیره شد'
399 entry_updated: 'مقاله به‌روز شد' 403 # entry_saved_failed: 'Failed to save entry'
400 entry_reloaded: 'مقاله به‌روز شد' 404 entry_updated: 'مقاله به‌روز شد'
401 entry_reload_failed: 'به‌روزرسانی مقاله شکست خورد' 405 entry_reloaded: 'مقاله به‌روز شد'
402 entry_archived: 'مقاله بایگانی شد' 406 entry_reload_failed: 'به‌روزرسانی مقاله شکست خورد'
403 entry_unarchived: 'مقاله از بایگانی درآمد' 407 entry_archived: 'مقاله بایگانی شد'
404 entry_starred: 'مقاله برگزیده شد' 408 entry_unarchived: 'مقاله از بایگانی درآمد'
405 entry_unstarred: 'مقاله نابرگزیده شد' 409 entry_starred: 'مقاله برگزیده شد'
406 entry_deleted: 'مقاله پاک شد' 410 entry_unstarred: 'مقاله نابرگزیده شد'
411 entry_deleted: 'مقاله پاک شد'
407 tag: 412 tag:
408 notice: 413 notice:
409 tag_added: 'برچسب اÙزوده شد' 414 tag_added: 'برچسب اÙزوده شد'
410 import: 415 import:
411 notice: 416 notice:
412 failed: 'درون‌ریزی شکست خورد. لطÙاً دوباره تلاش کنید.' 417 failed: 'درون‌ریزی شکست خورد. لطÙاً دوباره تلاش کنید.'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index 80ba0546..25d9ec59 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'durée de lecture' 144 reading_time: 'durée de lecture'
145 reading_time_minutes: 'durée de lecture: %readingTime% min' 145 reading_time_minutes: 'durée de lecture: %readingTime% min'
146 reading_time_less_one_minute: 'durée de lecture: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'durée de lecture: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Marquer comme lu/non lu' 150 toogle_as_read: 'Marquer comme lu/non lu'
149 toogle_as_star: 'Marquer comme favori' 151 toogle_as_star: 'Marquer comme favori'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Status' 156 status_label: 'Status'
155 archived_label: 'Lus' 157 archived_label: 'Lus'
156 starred_label: 'Favoris' 158 starred_label: 'Favoris'
159 unread_label: 'Non lus'
157 preview_picture_label: 'A une photo' 160 preview_picture_label: 'A une photo'
158 preview_picture_help: 'Photo' 161 preview_picture_help: 'Photo'
159 language_label: 'Langue' 162 language_label: 'Langue'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Retour' 178 back_to_homepage: 'Retour'
176 set_as_read: 'Marquer comme lu' 179 set_as_read: 'Marquer comme lu'
177 set_as_unread: 'Marquer comme non lu' 180 set_as_unread: 'Marquer comme non lu'
178 set_as_favorite: 'Mettre en favori' 181 set_as_starred: 'Mettre en favori'
179 view_original_article: 'Article original' 182 view_original_article: 'Article original'
180 re_fetch_content: 'Recharger le contenu' 183 re_fetch_content: 'Recharger le contenu'
181 delete: 'Supprimer' 184 delete: 'Supprimer'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Modifier le titre' 193 edit_title: 'Modifier le titre'
191 original_article: 'original' 194 original_article: 'original'
192 annotations_on_the_entry: '{0} Aucune annotation|{1} Une annotation|]1,Inf[ %nbAnnotations% annotations' 195 annotations_on_the_entry: '{0} Aucune annotation|{1} Une annotation|]1,Inf[ %nbAnnotations% annotations'
196 created_at: 'Date de création'
193 new: 197 new:
194 page_title: 'Sauvegarder un nouvel article' 198 page_title: 'Sauvegarder un nouvel article'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -267,12 +271,12 @@ quickstart:
267 tagging_rules: 'Écrivez des règles pour classer automatiquement vos articles' 271 tagging_rules: 'Écrivez des règles pour classer automatiquement vos articles'
268 admin: 272 admin:
269 title: 'Administration' 273 title: 'Administration'
270 description: "En tant qu'adminitrasteur sur wallabag, vous avez des privilèges qui vous permette de :" 274 description: "En tant qu'administrateur sur wallabag, vous avez des privilèges qui vous permettent de :"
271 new_user: 'Créer un nouvel utilisateur' 275 new_user: 'Créer un nouvel utilisateur'
272 analytics: 'Configurer les statistiques' 276 analytics: 'Configurer les statistiques'
273 sharing: 'Activer des paramètres de partages' 277 sharing: 'Activer des paramètres de partages'
274 export: 'Configurer les export' 278 export: "Configurer les formats d'export"
275 import: 'Configurer les import' 279 import: "Configurer l'import"
276 first_steps: 280 first_steps:
277 title: 'Premiers pas' 281 title: 'Premiers pas'
278 new_article: 'Ajoutez votre premier article' 282 new_article: 'Ajoutez votre premier article'
@@ -288,7 +292,7 @@ quickstart:
288 create_application: 'Créer votre application tierce' 292 create_application: 'Créer votre application tierce'
289 docs: 293 docs:
290 title: 'Documentation complète' 294 title: 'Documentation complète'
291 annotate: 'Annotater votre article' 295 annotate: 'Annoter votre article'
292 export: 'Convertissez vos articles en ePub ou en PDF' 296 export: 'Convertissez vos articles en ePub ou en PDF'
293 search_filters: "Apprenez à utiliser le moteur de recherche et les filtres pour retrouver l'article qui vous intéresse" 297 search_filters: "Apprenez à utiliser le moteur de recherche et les filtres pour retrouver l'article qui vous intéresse"
294 fetching_errors: "Que faire si mon article n'est pas correctement récupéré ?" 298 fetching_errors: "Que faire si mon article n'est pas correctement récupéré ?"
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 entry_already_saved: 'Article déjà sauvergardé le %date%' 401 entry_already_saved: 'Article déjà sauvergardé le %date%'
398 entry_saved: 'Article enregistré' 402 entry_saved: 'Article enregistré'
403 entry_saved_failed: "L'enregistrement a échoué"
399 entry_updated: 'Article mis à jour' 404 entry_updated: 'Article mis à jour'
400 entry_reloaded: 'Article rechargé' 405 entry_reloaded: 'Article rechargé'
401 entry_reload_failed: "Le rechargement de l'article a échoué" 406 entry_reload_failed: "Le rechargement de l'article a échoué"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
index 4f3ac090..231ba759 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'tempo di lettura stimato' 144 reading_time: 'tempo di lettura stimato'
145 reading_time_minutes: 'tempo di lettura stimato: %readingTime% min' 145 reading_time_minutes: 'tempo di lettura stimato: %readingTime% min'
146 reading_time_less_one_minute: 'tempo di lettura stimato: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'tempo di lettura stimato: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'originale' 149 original_article: 'originale'
148 toogle_as_read: 'Segna come da leggere' 150 toogle_as_read: 'Segna come da leggere'
149 toogle_as_star: 'Segna come non preferito' 151 toogle_as_star: 'Segna come non preferito'
@@ -175,7 +177,7 @@ entry:
175 back_to_homepage: 'Indietro' 177 back_to_homepage: 'Indietro'
176 set_as_read: 'Segna come già letto' 178 set_as_read: 'Segna come già letto'
177 set_as_unread: 'Segna come da leggere' 179 set_as_unread: 'Segna come da leggere'
178 set_as_favorite: 'Segna come preferito' 180 set_as_starred: 'Segna come preferito'
179 view_original_article: 'Contenuto originale' 181 view_original_article: 'Contenuto originale'
180 re_fetch_content: 'Ri-ottieni pagina' 182 re_fetch_content: 'Ri-ottieni pagina'
181 delete: 'Elimina' 183 delete: 'Elimina'
@@ -190,6 +192,7 @@ entry:
190 edit_title: 'Modifica titolo' 192 edit_title: 'Modifica titolo'
191 original_article: 'originale' 193 original_article: 'originale'
192 annotations_on_the_entry: '{0} Nessuna annotazione|{1} Una annotazione|]1,Inf[ %nbAnnotations% annotazioni' 194 annotations_on_the_entry: '{0} Nessuna annotazione|{1} Una annotazione|]1,Inf[ %nbAnnotations% annotazioni'
195 created_at: 'Data di creazione'
193 new: 196 new:
194 page_title: 'Salva un nuovo contenuto' 197 page_title: 'Salva un nuovo contenuto'
195 placeholder: 'http://website.com' 198 placeholder: 'http://website.com'
@@ -396,6 +399,7 @@ flashes:
396 notice: 399 notice:
397 entry_already_saved: 'Contenuto già salvato in data %date%' 400 entry_already_saved: 'Contenuto già salvato in data %date%'
398 entry_saved: 'Contenuto salvato' 401 entry_saved: 'Contenuto salvato'
402 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Contenuto aggiornato' 403 entry_updated: 'Contenuto aggiornato'
400 entry_reloaded: 'Contenuto ricaricato' 404 entry_reloaded: 'Contenuto ricaricato'
401 entry_reload_failed: 'Errore nel ricaricamento del contenuto' 405 entry_reload_failed: 'Errore nel ricaricamento del contenuto'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
index 46f58bbf..6e71b850 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'durada de lectura' 144 reading_time: 'durada de lectura'
145 reading_time_minutes: 'durada de lectura : %readingTime% min' 145 reading_time_minutes: 'durada de lectura : %readingTime% min'
146 reading_time_less_one_minute: 'durada de lectura : <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'durada de lectura : <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Marcar coma legit/pas legit' 150 toogle_as_read: 'Marcar coma legit/pas legit'
149 toogle_as_star: 'Marcar coma favorit' 151 toogle_as_star: 'Marcar coma favorit'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Estatus' 156 status_label: 'Estatus'
155 archived_label: 'Legits' 157 archived_label: 'Legits'
156 starred_label: 'Favorits' 158 starred_label: 'Favorits'
159 unread_label: 'Pas legits'
157 preview_picture_label: 'A una fotò' 160 preview_picture_label: 'A una fotò'
158 preview_picture_help: 'Fotò' 161 preview_picture_help: 'Fotò'
159 language_label: 'Lenga' 162 language_label: 'Lenga'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Tornar' 178 back_to_homepage: 'Tornar'
176 set_as_read: 'Marcar coma legit' 179 set_as_read: 'Marcar coma legit'
177 set_as_unread: 'Marcar coma pas legit' 180 set_as_unread: 'Marcar coma pas legit'
178 set_as_favorite: 'Metre en favori' 181 set_as_starred: 'Metre en favori'
179 view_original_article: 'Article original' 182 view_original_article: 'Article original'
180 re_fetch_content: 'Tornar cargar lo contengut' 183 re_fetch_content: 'Tornar cargar lo contengut'
181 delete: 'Suprimir' 184 delete: 'Suprimir'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Modificar lo títol' 193 edit_title: 'Modificar lo títol'
191 original_article: 'original' 194 original_article: 'original'
192 annotations_on_the_entry: "{0} Pas cap d'anotacion|{1} Una anotacion|]1,Inf[ %nbAnnotations% anotacions" 195 annotations_on_the_entry: "{0} Pas cap d'anotacion|{1} Una anotacion|]1,Inf[ %nbAnnotations% anotacions"
196 created_at: 'Data de creacion'
193 new: 197 new:
194 page_title: 'Enregistrar un novèl article' 198 page_title: 'Enregistrar un novèl article'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 entry_already_saved: 'Article ja salvargardat lo %date%' 401 entry_already_saved: 'Article ja salvargardat lo %date%'
398 entry_saved: 'Article enregistrat' 402 entry_saved: 'Article enregistrat'
403 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Article mes a jorn' 404 entry_updated: 'Article mes a jorn'
400 entry_reloaded: 'Article recargat' 405 entry_reloaded: 'Article recargat'
401 entry_reload_failed: "Fracàs de l'actualizacion de l'article" 406 entry_reload_failed: "Fracàs de l'actualizacion de l'article"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
index 292749ed..2db26cf1 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'szacunkowy czas czytania' 144 reading_time: 'szacunkowy czas czytania'
145 reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min' 145 reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min'
146 reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'oryginał' 149 original_article: 'oryginał'
148 toogle_as_read: 'Oznacz jako przeczytane' 150 toogle_as_read: 'Oznacz jako przeczytane'
149 toogle_as_star: 'Oznacz jako ulubione' 151 toogle_as_star: 'Oznacz jako ulubione'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Status' 156 status_label: 'Status'
155 archived_label: 'Zarchiwizowane' 157 archived_label: 'Zarchiwizowane'
156 starred_label: 'Oznaczone gwiazdkÄ…' 158 starred_label: 'Oznaczone gwiazdkÄ…'
159 unread_label: 'Nieprzeczytane'
157 preview_picture_label: 'Posiada podglÄ…d obrazu' 160 preview_picture_label: 'Posiada podglÄ…d obrazu'
158 preview_picture_help: 'PodglÄ…d obrazu' 161 preview_picture_help: 'PodglÄ…d obrazu'
159 language_label: 'Język' 162 language_label: 'Język'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Cofnij' 178 back_to_homepage: 'Cofnij'
176 set_as_read: 'Oznacz jako przeczytane' 179 set_as_read: 'Oznacz jako przeczytane'
177 set_as_unread: 'Oznacz jako nieprzeczytane' 180 set_as_unread: 'Oznacz jako nieprzeczytane'
178 set_as_favorite: 'Ulubione' 181 set_as_starred: 'Ulubione'
179 view_original_article: 'Oryginalny artykuł' 182 view_original_article: 'Oryginalny artykuł'
180 re_fetch_content: 'Pobierz ponownie treść' 183 re_fetch_content: 'Pobierz ponownie treść'
181 delete: 'Usuń' 184 delete: 'Usuń'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Edytuj tytuł' 193 edit_title: 'Edytuj tytuł'
191 original_article: 'oryginalny' 194 original_article: 'oryginalny'
192 annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %nbAnnotations% adnotacji' 195 annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %nbAnnotations% adnotacji'
196 created_at: 'Czas stworzenia'
193 new: 197 new:
194 page_title: 'Zapisz nowy wpis' 198 page_title: 'Zapisz nowy wpis'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 entry_already_saved: 'Wpis już został dodany %date%' 401 entry_already_saved: 'Wpis już został dodany %date%'
398 entry_saved: 'Wpis zapisany' 402 entry_saved: 'Wpis zapisany'
403 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Wpis zaktualizowany' 404 entry_updated: 'Wpis zaktualizowany'
400 entry_reloaded: 'Wpis ponownie załadowany' 405 entry_reloaded: 'Wpis ponownie załadowany'
401 entry_reload_failed: 'Błąd ponownego załadowania' 406 entry_reload_failed: 'Błąd ponownego załadowania'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
index 45040f35..d8f09bc9 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'timp estimat de citire' 144 reading_time: 'timp estimat de citire'
145 reading_time_minutes: 'timp estimat de citire: %readingTime% min' 145 reading_time_minutes: 'timp estimat de citire: %readingTime% min'
146 reading_time_less_one_minute: 'timp estimat de citire: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'timp estimat de citire: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'original' 149 original_article: 'original'
148 toogle_as_read: 'Comută marcat ca citit' 150 toogle_as_read: 'Comută marcat ca citit'
149 toogle_as_star: 'Comută marcat ca favorit' 151 toogle_as_star: 'Comută marcat ca favorit'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Status' 156 status_label: 'Status'
155 archived_label: 'Arhivat' 157 archived_label: 'Arhivat'
156 starred_label: 'Steluțe' 158 starred_label: 'Steluțe'
159 unread_label: 'Necitite'
157 preview_picture_label: 'Are o imagine de previzualizare' 160 preview_picture_label: 'Are o imagine de previzualizare'
158 preview_picture_help: 'Previzualizare imagine' 161 preview_picture_help: 'Previzualizare imagine'
159 language_label: 'Limbă' 162 language_label: 'Limbă'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'ÃŽnapoi' 178 back_to_homepage: 'ÃŽnapoi'
176 set_as_read: 'Marchează ca citit' 179 set_as_read: 'Marchează ca citit'
177 # set_as_unread: 'Mark as unread' 180 # set_as_unread: 'Mark as unread'
178 set_as_favorite: 'Favorit' 181 set_as_starred: 'Favorit'
179 view_original_article: 'Articol original' 182 view_original_article: 'Articol original'
180 # re_fetch_content: 'Re-fetch content' 183 # re_fetch_content: 'Re-fetch content'
181 delete: 'Șterge' 184 delete: 'Șterge'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Editează titlul' 193 edit_title: 'Editează titlul'
191 original_article: 'original' 194 original_article: 'original'
192 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations' 195 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
196 created_at: 'Data creării'
193 new: 197 new:
194 page_title: 'Salvează un nou articol' 198 page_title: 'Salvează un nou articol'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 # entry_already_saved: 'Entry already saved on %date%' 401 # entry_already_saved: 'Entry already saved on %date%'
398 # entry_saved: 'Entry saved' 402 # entry_saved: 'Entry saved'
403 # entry_saved_failed: 'Failed to save entry'
399 # entry_updated: 'Entry updated' 404 # entry_updated: 'Entry updated'
400 # entry_reloaded: 'Entry reloaded' 405 # entry_reloaded: 'Entry reloaded'
401 # entry_reload_failed: 'Failed to reload entry' 406 # entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
index 8a095a5b..074d13e2 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
@@ -144,6 +144,8 @@ entry:
144 reading_time: 'tahmini okuma süresi' 144 reading_time: 'tahmini okuma süresi'
145 reading_time_minutes: 'tahmini okuma süresi: %readingTime% min' 145 reading_time_minutes: 'tahmini okuma süresi: %readingTime% min'
146 reading_time_less_one_minute: 'tahmini okuma süresi: <small class="inferieur">&lt;</small> 1 min' 146 reading_time_less_one_minute: 'tahmini okuma süresi: <small class="inferieur">&lt;</small> 1 min'
147 reading_time_minutes_short: '%readingTime% min'
148 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
147 original_article: 'orijinal' 149 original_article: 'orijinal'
148 toogle_as_read: 'Okundu/okunmadı olarak işaretle' 150 toogle_as_read: 'Okundu/okunmadı olarak işaretle'
149 toogle_as_star: 'Favorilere ekle/çıkar' 151 toogle_as_star: 'Favorilere ekle/çıkar'
@@ -154,6 +156,7 @@ entry:
154 status_label: 'Durum' 156 status_label: 'Durum'
155 archived_label: 'ArÅŸiv' 157 archived_label: 'ArÅŸiv'
156 starred_label: 'Favori' 158 starred_label: 'Favori'
159 unread_label: 'Okunmayan'
157 preview_picture_label: 'Resim önizlemesi varsa' 160 preview_picture_label: 'Resim önizlemesi varsa'
158 preview_picture_help: 'Resim önizlemesi' 161 preview_picture_help: 'Resim önizlemesi'
159 language_label: 'Dil' 162 language_label: 'Dil'
@@ -175,7 +178,7 @@ entry:
175 back_to_homepage: 'Back' 178 back_to_homepage: 'Back'
176 set_as_read: 'Okundu olarak iÅŸaretle' 179 set_as_read: 'Okundu olarak iÅŸaretle'
177 set_as_unread: 'Okunmadı olarak işaretle' 180 set_as_unread: 'Okunmadı olarak işaretle'
178 set_as_favorite: 'Favorilere ekle/çıkar' 181 set_as_starred: 'Favorilere ekle/çıkar'
179 view_original_article: 'Orijinal makale' 182 view_original_article: 'Orijinal makale'
180 re_fetch_content: 'İçeriği yenile' 183 re_fetch_content: 'İçeriği yenile'
181 delete: 'Sil' 184 delete: 'Sil'
@@ -190,6 +193,7 @@ entry:
190 edit_title: 'Başlığı düzenle' 193 edit_title: 'Başlığı düzenle'
191 original_article: 'orijinal' 194 original_article: 'orijinal'
192 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations' 195 # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
196 created_at: 'OluÅŸturulma tarihi'
193 new: 197 new:
194 page_title: 'Yeni makaleyi kaydet' 198 page_title: 'Yeni makaleyi kaydet'
195 placeholder: 'http://website.com' 199 placeholder: 'http://website.com'
@@ -396,6 +400,7 @@ flashes:
396 notice: 400 notice:
397 entry_already_saved: 'Entry already saved on %date%' 401 entry_already_saved: 'Entry already saved on %date%'
398 entry_saved: 'Makale kaydedildi' 402 entry_saved: 'Makale kaydedildi'
403 # entry_saved_failed: 'Failed to save entry'
399 # entry_updated: 'Entry updated' 404 # entry_updated: 'Entry updated'
400 entry_reloaded: 'Makale içeriği yenilendi' 405 entry_reloaded: 'Makale içeriği yenilendi'
401 # entry_reload_failed: 'Failed to reload entry' 406 # entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
index c51f90d2..a8abe8d3 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
@@ -134,7 +134,8 @@
134 </fieldset> 134 </fieldset>
135 {% endif %} 135 {% endif %}
136 136
137 {{ form_rest(form.user) }} 137 {{ form_widget(form.user._token) }}
138 {{ form_widget(form.user.save) }}
138 </form> 139 </form>
139 140
140 <h2>{{ 'config.tab_menu.password'|trans }}</h2> 141 <h2>{{ 'config.tab_menu.password'|trans }}</h2>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
index a2caaebf..778625ae 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
@@ -54,6 +54,11 @@
54 </div> 54 </div>
55 55
56 <div class="input-field"> 56 <div class="input-field">
57 {{ form_widget(form.isUnread) }}
58 {{ form_label(form.isUnread) }}
59 </div>
60
61 <div class="input-field">
57 {{ form_widget(form.previewPicture) }} 62 {{ form_widget(form.previewPicture) }}
58 {{ form_label(form.previewPicture) }} 63 {{ form_label(form.previewPicture) }}
59 </div> 64 </div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
index 5a800332..d7374dc7 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
@@ -14,7 +14,7 @@
14 <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon icon-link"><span>{{ entry.domainName|removeWww }}</span></a></li> 14 <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon icon-link"><span>{{ entry.domainName|removeWww }}</span></a></li>
15 <li><a title="{{ 'entry.view.left_menu.re_fetch_content'|trans }}" class="tool icon icon-reload" href="{{ path('reload_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span></a></li> 15 <li><a title="{{ 'entry.view.left_menu.re_fetch_content'|trans }}" class="tool icon icon-reload" href="{{ path('reload_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span></a></li>
16 <li><a title="{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}</span></a></li> 16 <li><a title="{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}</span></a></li>
17 <li><a title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_favorite'|trans }}</span></a></li> 17 <li><a title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span></a></li>
18 <li><a id="nav-btn-add-tag" title="{{ 'entry.view.left_menu.add_a_tag'|trans }}"><span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span></a></li> 18 <li><a id="nav-btn-add-tag" title="{{ 'entry.view.left_menu.add_a_tag'|trans }}"><span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span></a></li>
19 <li><a title="{{ 'entry.view.left_menu.delete'|trans }}" class="tool delete icon icon-trash" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.delete'|trans }}</span></a></li> 19 <li><a title="{{ 'entry.view.left_menu.delete'|trans }}" class="tool delete icon icon-trash" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.delete'|trans }}</span></a></li>
20 {% if craue_setting('share_twitter') %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="Tweet"><span>Tweet</span></a></li>{% endif %} 20 {% if craue_setting('share_twitter') %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="Tweet"><span>Tweet</span></a></li>{% endif %}
@@ -29,6 +29,19 @@
29 <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{{ 'entry.view.left_menu.problem.label'|trans }}" class="tool bad-display icon icon-delete"><span>{{ 'entry.view.left_menu.problem.label'|trans }}</span></a></li> 29 <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{{ 'entry.view.left_menu.problem.label'|trans }}" class="tool bad-display icon icon-delete"><span>{{ 'entry.view.left_menu.problem.label'|trans }}</span></a></li>
30 </ul> 30 </ul>
31 </div> 31 </div>
32 <div class="link mdi-action-today">
33 {{ 'entry.view.created_at'|trans }}: {{ entry.createdAt|date('Y-m-d') }}
34 </div>
35
36 <div class="link mdi-action-query-builder">
37 {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
38 {% if readingTime > 0 %}
39 {{ 'entry.list.reading_time_minutes'|trans({'%readingTime%': readingTime|round})|capitalize }}
40 {% else %}
41 {{ 'entry.list.reading_time_less_one_minute'|trans|raw }}
42 {% endif %}
43 </div>
44
32 {% set nbAnnotations = entry.annotations | length %} 45 {% set nbAnnotations = entry.annotations | length %}
33 <span class="tool link mdi-communication-comment"> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span> 46 <span class="tool link mdi-communication-comment"> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span>
34 <aside class="tags"> 47 <aside class="tags">
@@ -72,7 +85,7 @@
72 $("body").css("cursor", "auto"); 85 $("body").css("cursor", "auto");
73 });*/ 86 });*/
74 87
75 // toggle favorite property of current article 88 // toggle starred property of current article
76 /* $('#setFav').click(function(){ 89 /* $('#setFav').click(function(){
77 $("body").css("cursor", "wait"); 90 $("body").css("cursor", "wait");
78 $.ajax( { url: '{{ path('star_entry', { 'id': entry.id }) }}' }).done( 91 $.ajax( { url: '{{ path('star_entry', { 'id': entry.id }) }}' }).done(
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig
index eab092c7..b529a0ac 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/howto.html.twig
@@ -11,14 +11,14 @@
11 </ul> 11 </ul>
12 <h3>{{ 'howto.top_menu.browser_addons'|trans }}</h3> 12 <h3>{{ 'howto.top_menu.browser_addons'|trans }}</h3>
13 <ul> 13 <ul>
14 <li><a href="https://addons.mozilla.org/firefox/addon/wallabag-v2/" target="_blank">{{ 'howto.browser_addons.firefox'|trans }}</a></li> 14 <li><a href="{{ addonsUrl.firefox }}" target="_blank">{{ 'howto.browser_addons.firefox'|trans }}</a></li>
15 <li><a href="https://chrome.google.com/webstore/detail/wallabag/bepdcjnnkglfjehplaogpoonpffbdcdj" target="_blank">{{ 'howto.browser_addons.chrome'|trans }}</a></li> 15 <li><a href="{{ addonsUrl.chrome }}" target="_blank">{{ 'howto.browser_addons.chrome'|trans }}</a></li>
16 </ul> 16 </ul>
17 <h3>{{ 'howto.top_menu.mobile_apps'|trans }}</h3> 17 <h3>{{ 'howto.top_menu.mobile_apps'|trans }}</h3>
18 <ul> 18 <ul>
19 <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" target="_blank">{{ 'howto.mobile_apps.android.via_f_droid'|trans }}</a> / <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" target="_blank">{{ 'howto.mobile_apps.android.via_google_play'|trans }}</a></li> 19 <li>Android: <a href="{{ addonsUrl.f_droid }}" target="_blank">{{ 'howto.mobile_apps.android.via_f_droid'|trans }}</a> / <a href="{{ addonsUrl.google_play }}" target="_blank">{{ 'howto.mobile_apps.android.via_google_play'|trans }}</a></li>
20 <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" target="_blank">{{ 'howto.mobile_apps.ios'|trans }}</a></li> 20 <li>iOS: <a href="{{ addonsUrl.ios }}" target="_blank">{{ 'howto.mobile_apps.ios'|trans }}</a></li>
21 <li>Windows Phone: <a href="http://www.windowsphone.com/en-US/store/app/wallabag/d5226cf1-f422-4e00-996c-88e9c5233332" target="_blank">{{ 'howto.mobile_apps.windows'|trans }}</a></li> 21 <li>Windows Phone: <a href="{{ addonsUrl.windows }}" target="_blank">{{ 'howto.mobile_apps.windows'|trans }}</a></li>
22 </ul> 22 </ul>
23 <h3>{{ 'howto.top_menu.bookmarklet'|trans }}</h3> 23 <h3>{{ 'howto.top_menu.bookmarklet'|trans }}</h3>
24 <p> 24 <p>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
index 5a90f227..afd5b499 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
@@ -158,7 +158,7 @@
158 {% endif %} 158 {% endif %}
159 159
160 {{ form_widget(form.user.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }} 160 {{ form_widget(form.user.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
161 {{ form_rest(form.user) }} 161 {{ form_widget(form.user._token) }}
162 </form> 162 </form>
163 </div> 163 </div>
164 164
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
index 5f49062f..2110b889 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
@@ -77,7 +77,7 @@
77 <ul class="tools links right"> 77 <ul class="tools links right">
78 <li> 78 <li>
79 <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text {% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"></a> 79 <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text {% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"></a>
80 <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text {% if entry.isStarred == 0 %}mdi-action-favorite-outline{% else %}mdi-action-favorite{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"></a> 80 <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text {% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"></a>
81 <a title="{{ 'entry.list.delete'|trans }}" class="tool grey-text delete mdi-action-delete " href="{{ path('delete_entry', { 'id': entry.id }) }}"></a> 81 <a title="{{ 'entry.list.delete'|trans }}" class="tool grey-text delete mdi-action-delete " href="{{ path('delete_entry', { 'id': entry.id }) }}"></a>
82 </li> 82 </li>
83 </ul> 83 </ul>
@@ -126,6 +126,11 @@
126 {{ form_label(form.isStarred) }} 126 {{ form_label(form.isStarred) }}
127 </div> 127 </div>
128 128
129 <div class="input-field col s6 with-checkbox">
130 {{ form_widget(form.isUnread) }}
131 {{ form_label(form.isUnread) }}
132 </div>
133
129 <div class="col s12"> 134 <div class="col s12">
130 <label>{{ 'entry.filters.preview_picture_help'|trans }}</label> 135 <label>{{ 'entry.filters.preview_picture_help'|trans }}</label>
131 </div> 136 </div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
index e89aea3a..2ee615aa 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
@@ -24,8 +24,8 @@
24 </a> 24 </a>
25 </li> 25 </li>
26 <li> 26 <li>
27 <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav"> 27 <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
28 <i class="{% if entry.isStarred == 0 %}mdi-action-favorite-outline{% else %}mdi-action-favorite{% endif %} small"></i> 28 <i class="{% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %} small"></i>
29 </a> 29 </a>
30 </li> 30 </li>
31 <li> 31 <li>
@@ -70,9 +70,9 @@
70 </li> 70 </li>
71 71
72 <li class="bold hide-on-med-and-down"> 72 <li class="bold hide-on-med-and-down">
73 <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav"> 73 <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
74 <i class="{% if entry.isStarred == 0 %}mdi-action-favorite-outline{% else %}mdi-action-favorite{% endif %} small"></i> 74 <i class="{% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %} small"></i>
75 <span>{{ 'entry.view.left_menu.set_as_favorite'|trans }}</span> 75 <span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span>
76 </a> 76 </a>
77 <div class="collapsible-body"></div> 77 <div class="collapsible-body"></div>
78 </li> 78 </li>
@@ -193,6 +193,15 @@
193 <h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1> 193 <h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1>
194 </header> 194 </header>
195 <aside> 195 <aside>
196 <span class="link mdi-action-today" title="{{ 'entry.view.created_at'|trans }}"> {{ entry.createdAt|date('Y-m-d') }}</span>
197 {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
198 <span class="link mdi-action-query-builder">
199 {% if readingTime > 0 %}
200 {{ 'entry.list.reading_time_minutes_short'|trans({'%readingTime%': readingTime|round}) }}
201 {% else %}
202 {{ 'entry.list.reading_time_less_one_minute_short'|trans|raw }}
203 {% endif %}
204 </span>
196 <a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link mdi-content-link"> <span>{{ entry.domainName|removeWww }}</span></a> 205 <a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link mdi-content-link"> <span>{{ entry.domainName|removeWww }}</span></a>
197 <span class="tool link mdi-communication-comment"> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span> 206 <span class="tool link mdi-communication-comment"> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span>
198 <div id="list"> 207 <div id="list">
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig
index 4354a6b7..6a177d6b 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/howto.html.twig
@@ -18,17 +18,17 @@
18 <div class="col s12"> 18 <div class="col s12">
19 <h5>{{ 'howto.top_menu.browser_addons'|trans }}</h5> 19 <h5>{{ 'howto.top_menu.browser_addons'|trans }}</h5>
20 <ul> 20 <ul>
21 <li><a href="https://addons.mozilla.org/firefox/addon/wallabag-v2/" target="_blank">{{ 'howto.browser_addons.firefox'|trans }}</a></li> 21 <li><a href="{{ addonsUrl.firefox }}" target="_blank">{{ 'howto.browser_addons.firefox'|trans }}</a></li>
22 <li><a href="https://chrome.google.com/webstore/detail/wallabag/bepdcjnnkglfjehplaogpoonpffbdcdj" target="_blank">{{ 'howto.browser_addons.chrome'|trans }}</a></li> 22 <li><a href="{{ addonsUrl.chrome }}" target="_blank">{{ 'howto.browser_addons.chrome'|trans }}</a></li>
23 </ul> 23 </ul>
24 </div> 24 </div>
25 25
26 <div class="col s12"> 26 <div class="col s12">
27 <h5>{{ 'howto.top_menu.mobile_apps'|trans }}</h5> 27 <h5>{{ 'howto.top_menu.mobile_apps'|trans }}</h5>
28 <ul> 28 <ul>
29 <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" target="_blank">{{ 'howto.mobile_apps.android.via_f_droid'|trans }}</a> / <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" target="_blank">{{ 'howto.mobile_apps.android.via_google_play'|trans }}</a></li> 29 <li>Android: <a href="{{ addonsUrl.f_droid }}" target="_blank">{{ 'howto.mobile_apps.android.via_f_droid'|trans }}</a> / <a href="{{ addonsUrl.google_play }}" target="_blank">{{ 'howto.mobile_apps.android.via_google_play'|trans }}</a></li>
30 <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" target="_blank">{{ 'howto.mobile_apps.ios'|trans }}</a></li> 30 <li>iOS: <a href="{{ addonsUrl.ios }}" target="_blank">{{ 'howto.mobile_apps.ios'|trans }}</a></li>
31 <li>Windows Phone: <a href="http://www.windowsphone.com/en-US/store/app/wallabag/d5226cf1-f422-4e00-996c-88e9c5233332" target="_blank">{{ 'howto.mobile_apps.windows'|trans }}</a></li> 31 <li>Windows Phone: <a href="{{ addonsUrl.windows }}" target="_blank">{{ 'howto.mobile_apps.windows'|trans }}</a></li>
32 </ul> 32 </ul>
33 </div> 33 </div>
34 34
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/footer.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/footer.html.twig
new file mode 100644
index 00000000..7cb19966
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/footer.html.twig
@@ -0,0 +1,41 @@
1<footer class="page-footer cyan darken-2">
2 <div class="container">
3 <div class="row">
4 <div class="col l6 s12">
5 <h5 class="white-text">{{ 'footer.wallabag.elsewhere'|trans }}</h5>
6 <p class="grey-text text-lighten-4">
7 <a target="_blank" class="grey-text text-lighten-3" href="{{ addonsUrl.google_play }}" title="Android">
8 <span class="icon-android"></span>
9 </a>
10 <a target="_blank" class="grey-text text-lighten-3" href="{{ addonsUrl.ios }}" title="iOS">
11 <span class="icon-apple"></span>
12 </a>
13 <a target="_blank" class="grey-text text-lighten-3" href="{{ addonsUrl.firefox }}" title="Firefox">
14 <span class="icon-firefox"></span>
15 </a>
16 <a target="_blank" class="grey-text text-lighten-3" href="{{ addonsUrl.chrome }}" title="Chrome">
17 <span class="icon-chrome"></span>
18 </a>
19 </p>
20 </div>
21 <div class="col l4 offset-l2 s12">
22 <h5 class="white-text">{{ 'footer.wallabag.social'|trans }}</h5>
23 <a target="_blank" class="grey-text text-lighten-3" href="{{ socialsUrl.twitter }}" title="Twitter">
24 <span class="icon-twitter"></span>
25 </a>
26 <a target="_blank" class="grey-text text-lighten-3" href="{{ socialsUrl.google_plus }}" title="Google+">
27 <span class="icon-google-plus2"></span>
28 </a>
29 <a target="_blank" class="grey-text text-lighten-3" href="{{ socialsUrl.facebook }}" title="Facebook">
30 <span class="icon-facebook2"></span>
31 </a>
32 </div>
33 </div>
34 </div>
35 <div class="footer-copyright">
36 <div class="container">
37 <p>{{ 'footer.wallabag.powered_by'|trans }} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a></p>
38 <a class="grey-text text-lighten-4 right" href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans }}</a>
39 </div>
40 </div>
41</footer>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
index 630cbd66..0573e8e5 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
@@ -123,45 +123,5 @@
123{% endblock %} 123{% endblock %}
124 124
125{% block footer %} 125{% block footer %}
126 <footer class="page-footer cyan darken-2"> 126 {{ render(controller("WallabagCoreBundle:Footer:index")) }}
127 <div class="container">
128 <div class="row">
129 <div class="col l6 s12">
130 <h5 class="white-text">{{ 'footer.wallabag.elsewhere'|trans }}</h5>
131 <p class="grey-text text-lighten-4">
132 <a target="_blank" class="grey-text text-lighten-3" href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="Android">
133 <span class="icon-android"></span>
134 </a>
135 <a target="_blank" class="grey-text text-lighten-3" href="https://itunes.apple.com/app/id828331015" title="iOS">
136 <span class="icon-apple"></span>
137 </a>
138 <a target="_blank" class="grey-text text-lighten-3" href="https://addons.mozilla.org/firefox/addon/wallabag/" title="Firefox">
139 <span class="icon-firefox"></span>
140 </a>
141 <a target="_blank" class="grey-text text-lighten-3" href="https://chrome.google.com/webstore/detail/wallabagit/peehlcgckcnclnjlndmoddifcicdnabm" title="Chrome">
142 <span class="icon-chrome"></span>
143 </a>
144 </p>
145 </div>
146 <div class="col l4 offset-l2 s12">
147 <h5 class="white-text">{{ 'footer.wallabag.social'|trans }}</h5>
148 <a target="_blank" class="grey-text text-lighten-3" href="https://twitter.com/wallabagapp" title="Twitter">
149 <span class="icon-twitter"></span>
150 </a>
151 <a target="_blank" class="grey-text text-lighten-3" href="https://plus.google.com/+WallabagOrg/posts" title="Google+">
152 <span class="icon-google-plus2"></span>
153 </a>
154 <a target="_blank" class="grey-text text-lighten-3" href="https://facebook.com/Wallabag" title="Facebook">
155 <span class="icon-facebook2"></span>
156 </a>
157 </div>
158 </div>
159 </div>
160 <div class="footer-copyright">
161 <div class="container">
162 <p>{{ 'footer.wallabag.powered_by'|trans }} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a></p>
163 <a class="grey-text text-lighten-4 right" href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans }}</a>
164 </div>
165 </div>
166 </footer>
167{% endblock %} 127{% endblock %}
diff --git a/src/Wallabag/CoreBundle/Tests/WallabagCoreTestCase.php b/src/Wallabag/CoreBundle/Tests/WallabagCoreTestCase.php
deleted file mode 100644
index 05450c0b..00000000
--- a/src/Wallabag/CoreBundle/Tests/WallabagCoreTestCase.php
+++ /dev/null
@@ -1,51 +0,0 @@
1<?php
2
3namespace Wallabag\CoreBundle\Tests;
4
5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6
7abstract class WallabagCoreTestCase extends WebTestCase
8{
9 private $client = null;
10
11 public function getClient()
12 {
13 return $this->client;
14 }
15
16 public function setUp()
17 {
18 parent::setUp();
19
20 $this->client = static::createClient();
21 }
22
23 public function logInAs($username)
24 {
25 $crawler = $this->client->request('GET', '/login');
26 $form = $crawler->filter('button[type=submit]')->form();
27 $data = [
28 '_username' => $username,
29 '_password' => 'mypassword',
30 ];
31
32 $this->client->submit($form, $data);
33 }
34
35 /**
36 * Return the user id of the logged in user.
37 * You should be sure that you called `logInAs` before.
38 *
39 * @return int
40 */
41 public function getLoggedInUserId()
42 {
43 $token = static::$kernel->getContainer()->get('security.token_storage')->getToken();
44
45 if (null !== $token) {
46 return $token->getUser()->getId();
47 }
48
49 throw new \RuntimeException('No logged in User.');
50 }
51}
diff --git a/src/Wallabag/ImportBundle/Import/AbstractImport.php b/src/Wallabag/ImportBundle/Import/AbstractImport.php
new file mode 100644
index 00000000..14377a35
--- /dev/null
+++ b/src/Wallabag/ImportBundle/Import/AbstractImport.php
@@ -0,0 +1,47 @@
1<?php
2
3namespace Wallabag\ImportBundle\Import;
4
5use Psr\Log\LoggerInterface;
6use Psr\Log\NullLogger;
7use Doctrine\ORM\EntityManager;
8use Wallabag\CoreBundle\Helper\ContentProxy;
9use Wallabag\CoreBundle\Entity\Entry;
10
11abstract class AbstractImport implements ImportInterface
12{
13 protected $em;
14 protected $logger;
15 protected $contentProxy;
16
17 public function __construct(EntityManager $em, ContentProxy $contentProxy)
18 {
19 $this->em = $em;
20 $this->logger = new NullLogger();
21 $this->contentProxy = $contentProxy;
22 }
23
24 public function setLogger(LoggerInterface $logger)
25 {
26 $this->logger = $logger;
27 }
28
29 /**
30 * Fetch content from the ContentProxy (using graby).
31 * If it fails return false instead of the updated entry.
32 *
33 * @param Entry $entry Entry to update
34 * @param string $url Url to grab content for
35 * @param array $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
36 *
37 * @return Entry|false
38 */
39 protected function fetchContent(Entry $entry, $url, array $content = [])
40 {
41 try {
42 return $this->contentProxy->updateEntry($entry, $url, $content);
43 } catch (\Exception $e) {
44 return false;
45 }
46 }
47}
diff --git a/src/Wallabag/ImportBundle/Import/PocketImport.php b/src/Wallabag/ImportBundle/Import/PocketImport.php
index 29361a32..798cfdae 100644
--- a/src/Wallabag/ImportBundle/Import/PocketImport.php
+++ b/src/Wallabag/ImportBundle/Import/PocketImport.php
@@ -2,7 +2,6 @@
2 2
3namespace Wallabag\ImportBundle\Import; 3namespace Wallabag\ImportBundle\Import;
4 4
5use Psr\Log\LoggerInterface;
6use Psr\Log\NullLogger; 5use Psr\Log\NullLogger;
7use Doctrine\ORM\EntityManager; 6use Doctrine\ORM\EntityManager;
8use GuzzleHttp\Client; 7use GuzzleHttp\Client;
@@ -12,12 +11,9 @@ use Wallabag\CoreBundle\Entity\Entry;
12use Wallabag\CoreBundle\Helper\ContentProxy; 11use Wallabag\CoreBundle\Helper\ContentProxy;
13use Craue\ConfigBundle\Util\Config; 12use Craue\ConfigBundle\Util\Config;
14 13
15class PocketImport implements ImportInterface 14class PocketImport extends AbstractImport
16{ 15{
17 private $user; 16 private $user;
18 private $em;
19 private $contentProxy;
20 private $logger;
21 private $client; 17 private $client;
22 private $consumerKey; 18 private $consumerKey;
23 private $skippedEntries = 0; 19 private $skippedEntries = 0;
@@ -34,11 +30,6 @@ class PocketImport implements ImportInterface
34 $this->logger = new NullLogger(); 30 $this->logger = new NullLogger();
35 } 31 }
36 32
37 public function setLogger(LoggerInterface $logger)
38 {
39 $this->logger = $logger;
40 }
41
42 /** 33 /**
43 * {@inheritdoc} 34 * {@inheritdoc}
44 */ 35 */
@@ -219,14 +210,20 @@ class PocketImport implements ImportInterface
219 } 210 }
220 211
221 $entry = new Entry($this->user); 212 $entry = new Entry($this->user);
222 $entry = $this->contentProxy->updateEntry($entry, $url); 213 $entry = $this->fetchContent($entry, $url);
214
215 // jump to next entry in case of problem while getting content
216 if (false === $entry) {
217 ++$this->skippedEntries;
218 continue;
219 }
223 220
224 // 0, 1, 2 - 1 if the item is archived - 2 if the item should be deleted 221 // 0, 1, 2 - 1 if the item is archived - 2 if the item should be deleted
225 if ($pocketEntry['status'] == 1 || $this->markAsRead) { 222 if ($pocketEntry['status'] == 1 || $this->markAsRead) {
226 $entry->setArchived(true); 223 $entry->setArchived(true);
227 } 224 }
228 225
229 // 0 or 1 - 1 If the item is favorited 226 // 0 or 1 - 1 If the item is starred
230 if ($pocketEntry['favorite'] == 1) { 227 if ($pocketEntry['favorite'] == 1) {
231 $entry->setStarred(true); 228 $entry->setStarred(true);
232 } 229 }
diff --git a/src/Wallabag/ImportBundle/Import/WallabagImport.php b/src/Wallabag/ImportBundle/Import/WallabagImport.php
index 65803823..a1cc085b 100644
--- a/src/Wallabag/ImportBundle/Import/WallabagImport.php
+++ b/src/Wallabag/ImportBundle/Import/WallabagImport.php
@@ -2,19 +2,12 @@
2 2
3namespace Wallabag\ImportBundle\Import; 3namespace Wallabag\ImportBundle\Import;
4 4
5use Psr\Log\LoggerInterface;
6use Psr\Log\NullLogger;
7use Doctrine\ORM\EntityManager;
8use Wallabag\CoreBundle\Entity\Entry; 5use Wallabag\CoreBundle\Entity\Entry;
9use Wallabag\UserBundle\Entity\User; 6use Wallabag\UserBundle\Entity\User;
10use Wallabag\CoreBundle\Helper\ContentProxy;
11 7
12abstract class WallabagImport implements ImportInterface 8abstract class WallabagImport extends AbstractImport
13{ 9{
14 protected $user; 10 protected $user;
15 protected $em;
16 protected $logger;
17 protected $contentProxy;
18 protected $skippedEntries = 0; 11 protected $skippedEntries = 0;
19 protected $importedEntries = 0; 12 protected $importedEntries = 0;
20 protected $filepath; 13 protected $filepath;
@@ -35,18 +28,6 @@ abstract class WallabagImport implements ImportInterface
35 '', 28 '',
36 ]; 29 ];
37 30
38 public function __construct(EntityManager $em, ContentProxy $contentProxy)
39 {
40 $this->em = $em;
41 $this->logger = new NullLogger();
42 $this->contentProxy = $contentProxy;
43 }
44
45 public function setLogger(LoggerInterface $logger)
46 {
47 $this->logger = $logger;
48 }
49
50 /** 31 /**
51 * We define the user in a custom call because on the import command there is no logged in user. 32 * We define the user in a custom call because on the import command there is no logged in user.
52 * So we can't retrieve user from the `security.token_storage` service. 33 * So we can't retrieve user from the `security.token_storage` service.
@@ -159,12 +140,18 @@ abstract class WallabagImport implements ImportInterface
159 140
160 $data = $this->prepareEntry($importedEntry, $this->markAsRead); 141 $data = $this->prepareEntry($importedEntry, $this->markAsRead);
161 142
162 $entry = $this->contentProxy->updateEntry( 143 $entry = $this->fetchContent(
163 new Entry($this->user), 144 new Entry($this->user),
164 $importedEntry['url'], 145 $importedEntry['url'],
165 $data 146 $data
166 ); 147 );
167 148
149 // jump to next entry in case of problem while getting content
150 if (false === $entry) {
151 ++$this->skippedEntries;
152 continue;
153 }
154
168 if (array_key_exists('tags', $data)) { 155 if (array_key_exists('tags', $data)) {
169 $this->contentProxy->assignTagsToEntry( 156 $this->contentProxy->assignTagsToEntry(
170 $entry, 157 $entry,
diff --git a/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php b/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php
deleted file mode 100644
index 403fe9b0..00000000
--- a/src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
1<?php
2
3namespace Wallabag\ImportBundle\Tests\Controller;
4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
6
7class PocketControllerTest extends WallabagCoreTestCase
8{
9 public function testImportPocket()
10 {
11 $this->logInAs('admin');
12 $client = $this->getClient();
13
14 $crawler = $client->request('GET', '/import/pocket');
15
16 $this->assertEquals(200, $client->getResponse()->getStatusCode());
17 $this->assertEquals(1, $crawler->filter('button[type=submit]')->count());
18 }
19
20 public function testImportPocketAuthBadToken()
21 {
22 $this->logInAs('admin');
23 $client = $this->getClient();
24
25 $crawler = $client->request('GET', '/import/pocket/auth');
26
27 $this->assertEquals(302, $client->getResponse()->getStatusCode());
28 }
29
30 public function testImportPocketAuth()
31 {
32 $this->markTestSkipped('PocketImport: Find a way to properly mock a service.');
33
34 $this->logInAs('admin');
35 $client = $this->getClient();
36
37 $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
38 ->disableOriginalConstructor()
39 ->getMock();
40
41 $pocketImport
42 ->expects($this->once())
43 ->method('getRequestToken')
44 ->willReturn('token');
45
46 $client->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
47
48 $crawler = $client->request('GET', '/import/pocket/auth');
49
50 $this->assertEquals(301, $client->getResponse()->getStatusCode());
51 $this->assertContains('getpocket.com/auth/authorize', $client->getResponse()->headers->get('location'));
52 }
53
54 public function testImportPocketCallbackWithBadToken()
55 {
56 $this->logInAs('admin');
57 $client = $this->getClient();
58
59 $crawler = $client->request('GET', '/import/pocket/callback');
60
61 $this->assertEquals(302, $client->getResponse()->getStatusCode());
62 $this->assertContains('import/pocket', $client->getResponse()->headers->get('location'));
63 $this->assertEquals('flashes.import.notice.failed', $client->getContainer()->get('session')->getFlashBag()->peek('notice')[0]);
64 }
65}
diff --git a/src/Wallabag/UserBundle/Resources/views/TwoFactor/email_auth_code.html.twig b/src/Wallabag/UserBundle/Resources/views/TwoFactor/email_auth_code.html.twig
index c44fcfb7..3731f13b 100644
--- a/src/Wallabag/UserBundle/Resources/views/TwoFactor/email_auth_code.html.twig
+++ b/src/Wallabag/UserBundle/Resources/views/TwoFactor/email_auth_code.html.twig
@@ -74,7 +74,7 @@
74 74
75 <table cellpadding="0" cellspacing="0" border="0" align="center" id="card"> 75 <table cellpadding="0" cellspacing="0" border="0" align="center" id="card">
76 <tr> 76 <tr>
77 <td style="padding: 20px;" width="96px" valign="top"><img class="image_fix" src="{{ wallabag_url }}/themes/material/img/logo-other_themes.png" alt="logo" title="{{ wallabag_url }}" style="width: 96px; height: 96px;" /></td> 77 <td style="padding: 20px;" width="96px" valign="top"><img class="image_fix" src="{{ asset('bundles/wallabagcore/themes/material/img/logo-other_themes.png') }}" alt="logo" title="{{ wallabag_url }}" style="width: 96px; height: 96px;" /></td>
78 <td style="padding: 20px; padding-left: 0;" valign="top" id="cell_desc"> 78 <td style="padding: 20px; padding-left: 0;" valign="top" id="cell_desc">
79 <h1>wallabag</h1> 79 <h1>wallabag</h1>
80 <h5>{{ "auth_code.on"|trans({}, 'wallabag_user') }} {{ wallabag_url }}</h5> 80 <h5>{{ "auth_code.on"|trans({}, 'wallabag_user') }} {{ wallabag_url }}</h5>
diff --git a/src/Wallabag/AnnotationBundle/Tests/Controller/AnnotationControllerTest.php b/tests/Wallabag/AnnotationBundle/Controller/AnnotationControllerTest.php
index 3eba7193..70849f74 100644
--- a/src/Wallabag/AnnotationBundle/Tests/Controller/AnnotationControllerTest.php
+++ b/tests/Wallabag/AnnotationBundle/Controller/AnnotationControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\AnnotationBundle\Tests\Controller; 3namespace Tests\AnnotationBundle\Controller;
4 4
5use Wallabag\AnnotationBundle\Tests\WallabagAnnotationTestCase; 5use Tests\Wallabag\AnnotationBundle\WallabagAnnotationTestCase;
6 6
7class AnnotationControllerTest extends WallabagAnnotationTestCase 7class AnnotationControllerTest extends WallabagAnnotationTestCase
8{ 8{
diff --git a/src/Wallabag/AnnotationBundle/Tests/WallabagAnnotationTestCase.php b/tests/Wallabag/AnnotationBundle/WallabagAnnotationTestCase.php
index a9035acc..82790a5c 100644
--- a/src/Wallabag/AnnotationBundle/Tests/WallabagAnnotationTestCase.php
+++ b/tests/Wallabag/AnnotationBundle/WallabagAnnotationTestCase.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\AnnotationBundle\Tests; 3namespace Tests\Wallabag\AnnotationBundle;
4 4
5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6use Symfony\Component\BrowserKit\Cookie; 6use Symfony\Component\BrowserKit\Cookie;
diff --git a/src/Wallabag/ApiBundle/Tests/Controller/WallabagRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php
index 2f2d92ee..c39cc357 100644
--- a/src/Wallabag/ApiBundle/Tests/Controller/WallabagRestControllerTest.php
+++ b/tests/Wallabag/ApiBundle/Controller/WallabagRestControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\ApiBundle\Tests\Controller; 3namespace Tests\Wallabag\ApiBundle\Controller;
4 4
5use Wallabag\ApiBundle\Tests\WallabagApiTestCase; 5use Tests\Wallabag\ApiBundle\WallabagApiTestCase;
6 6
7class WallabagRestControllerTest extends WallabagApiTestCase 7class WallabagRestControllerTest extends WallabagApiTestCase
8{ 8{
@@ -423,4 +423,91 @@ class WallabagRestControllerTest extends WallabagApiTestCase
423 423
424 $this->assertEquals($this->client->getContainer()->getParameter('wallabag_core.version'), $content); 424 $this->assertEquals($this->client->getContainer()->getParameter('wallabag_core.version'), $content);
425 } 425 }
426
427 public function testSaveIsArchivedAfterPost()
428 {
429 $entry = $this->client->getContainer()
430 ->get('doctrine.orm.entity_manager')
431 ->getRepository('WallabagCoreBundle:Entry')
432 ->findOneBy(['user' => 1, 'isArchived' => true]);
433
434 if (!$entry) {
435 $this->markTestSkipped('No content found in db.');
436 }
437
438 $this->client->request('POST', '/api/entries.json', [
439 'url' => $entry->getUrl(),
440 ]);
441
442 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
443
444 $content = json_decode($this->client->getResponse()->getContent(), true);
445
446 $this->assertEquals(true, $content['is_archived']);
447 }
448
449 public function testSaveIsStarredAfterPost()
450 {
451 $entry = $this->client->getContainer()
452 ->get('doctrine.orm.entity_manager')
453 ->getRepository('WallabagCoreBundle:Entry')
454 ->findOneBy(['user' => 1, 'isStarred' => true]);
455
456 if (!$entry) {
457 $this->markTestSkipped('No content found in db.');
458 }
459
460 $this->client->request('POST', '/api/entries.json', [
461 'url' => $entry->getUrl(),
462 ]);
463
464 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
465
466 $content = json_decode($this->client->getResponse()->getContent(), true);
467
468 $this->assertEquals(true, $content['is_starred']);
469 }
470
471 public function testSaveIsArchivedAfterPatch()
472 {
473 $entry = $this->client->getContainer()
474 ->get('doctrine.orm.entity_manager')
475 ->getRepository('WallabagCoreBundle:Entry')
476 ->findOneBy(['user' => 1, 'isArchived' => true]);
477
478 if (!$entry) {
479 $this->markTestSkipped('No content found in db.');
480 }
481
482 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
483 'title' => $entry->getTitle().'++',
484 ]);
485
486 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
487
488 $content = json_decode($this->client->getResponse()->getContent(), true);
489
490 $this->assertEquals(true, $content['is_archived']);
491 }
492
493 public function testSaveIsStarredAfterPatch()
494 {
495 $entry = $this->client->getContainer()
496 ->get('doctrine.orm.entity_manager')
497 ->getRepository('WallabagCoreBundle:Entry')
498 ->findOneBy(['user' => 1, 'isStarred' => true]);
499
500 if (!$entry) {
501 $this->markTestSkipped('No content found in db.');
502 }
503 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
504 'title' => $entry->getTitle().'++',
505 ]);
506
507 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
508
509 $content = json_decode($this->client->getResponse()->getContent(), true);
510
511 $this->assertEquals(true, $content['is_starred']);
512 }
426} 513}
diff --git a/src/Wallabag/ApiBundle/Tests/WallabagApiTestCase.php b/tests/Wallabag/ApiBundle/WallabagApiTestCase.php
index 13d72d2c..cf9b3347 100644
--- a/src/Wallabag/ApiBundle/Tests/WallabagApiTestCase.php
+++ b/tests/Wallabag/ApiBundle/WallabagApiTestCase.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\ApiBundle\Tests; 3namespace Tests\Wallabag\ApiBundle;
4 4
5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6use Symfony\Component\BrowserKit\Cookie; 6use Symfony\Component\BrowserKit\Cookie;
diff --git a/src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php b/tests/Wallabag/CoreBundle/Command/InstallCommandTest.php
index 0673d581..089a1c5f 100644
--- a/src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php
+++ b/tests/Wallabag/CoreBundle/Command/InstallCommandTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Command; 3namespace Tests\Wallabag\CoreBundle\Command;
4 4
5use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand; 5use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand;
6use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand; 6use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand;
@@ -9,8 +9,8 @@ use Symfony\Component\Console\Input\ArrayInput;
9use Symfony\Component\Console\Output\NullOutput; 9use Symfony\Component\Console\Output\NullOutput;
10use Symfony\Component\Console\Tester\CommandTester; 10use Symfony\Component\Console\Tester\CommandTester;
11use Wallabag\CoreBundle\Command\InstallCommand; 11use Wallabag\CoreBundle\Command\InstallCommand;
12use Wallabag\CoreBundle\Tests\Mock\InstallCommandMock; 12use Tests\Wallabag\CoreBundle\Mock\InstallCommandMock;
13use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 13use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
14 14
15class InstallCommandTest extends WallabagCoreTestCase 15class InstallCommandTest extends WallabagCoreTestCase
16{ 16{
@@ -28,16 +28,32 @@ class InstallCommandTest extends WallabagCoreTestCase
28 * 28 *
29 * http://stackoverflow.com/a/14374832/569101 29 * http://stackoverflow.com/a/14374832/569101
30 */ 30 */
31 $this->markTestSkipped('PostgreSQL spotted: can find a good way to drop current database, skipping.'); 31 $this->markTestSkipped('PostgreSQL spotted: can\'t find a good way to drop current database, skipping.');
32 } 32 }
33 } 33 }
34 34
35 /**
36 * Ensure next tests will have a clean database
37 */
35 public static function tearDownAfterClass() 38 public static function tearDownAfterClass()
36 { 39 {
37 $application = new Application(static::$kernel); 40 $application = new Application(static::$kernel);
38 $application->setAutoExit(false); 41 $application->setAutoExit(false);
39 42
40 $code = $application->run(new ArrayInput([ 43 $application->run(new ArrayInput([
44 'command' => 'doctrine:schema:drop',
45 '--no-interaction' => true,
46 '--force' => true,
47 '--env' => 'test',
48 ]), new NullOutput());
49
50 $application->run(new ArrayInput([
51 'command' => 'doctrine:schema:create',
52 '--no-interaction' => true,
53 '--env' => 'test',
54 ]), new NullOutput());
55
56 $application->run(new ArrayInput([
41 'command' => 'doctrine:fixtures:load', 57 'command' => 'doctrine:fixtures:load',
42 '--no-interaction' => true, 58 '--no-interaction' => true,
43 '--env' => 'test', 59 '--env' => 'test',
diff --git a/src/Wallabag/CoreBundle/Tests/Command/TagAllCommandTest.php b/tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php
index 4f544c1d..ec31708f 100644
--- a/src/Wallabag/CoreBundle/Tests/Command/TagAllCommandTest.php
+++ b/tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php
@@ -1,11 +1,11 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Command; 3namespace Tests\Wallabag\CoreBundle\Command;
4 4
5use Symfony\Bundle\FrameworkBundle\Console\Application; 5use Symfony\Bundle\FrameworkBundle\Console\Application;
6use Symfony\Component\Console\Tester\CommandTester; 6use Symfony\Component\Console\Tester\CommandTester;
7use Wallabag\CoreBundle\Command\TagAllCommand; 7use Wallabag\CoreBundle\Command\TagAllCommand;
8use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 8use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
9 9
10class TagAllCommandTest extends WallabagCoreTestCase 10class TagAllCommandTest extends WallabagCoreTestCase
11{ 11{
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
index 8cdedfda..7193f9b0 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class ConfigControllerTest extends WallabagCoreTestCase 7class ConfigControllerTest extends WallabagCoreTestCase
8{ 8{
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/DeveloperControllerTest.php b/tests/Wallabag/CoreBundle/Controller/DeveloperControllerTest.php
index fc220b85..79452ace 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/DeveloperControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/DeveloperControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class DeveloperControllerTest extends WallabagCoreTestCase 7class DeveloperControllerTest extends WallabagCoreTestCase
8{ 8{
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
index df4c34cd..5c739c78 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6use Wallabag\CoreBundle\Entity\Entry; 6use Wallabag\CoreBundle\Entity\Entry;
7 7
8class EntryControllerTest extends WallabagCoreTestCase 8class EntryControllerTest extends WallabagCoreTestCase
@@ -163,7 +163,7 @@ class EntryControllerTest extends WallabagCoreTestCase
163 /** 163 /**
164 * This test will require an internet connection. 164 * This test will require an internet connection.
165 */ 165 */
166 public function testPostNewThatWillBeTaggued() 166 public function testPostNewThatWillBeTagged()
167 { 167 {
168 $this->logInAs('admin'); 168 $this->logInAs('admin');
169 $client = $this->getClient(); 169 $client = $this->getClient();
@@ -181,8 +181,7 @@ class EntryControllerTest extends WallabagCoreTestCase
181 $client->submit($form, $data); 181 $client->submit($form, $data);
182 182
183 $this->assertEquals(302, $client->getResponse()->getStatusCode()); 183 $this->assertEquals(302, $client->getResponse()->getStatusCode());
184 184 $this->assertContains('/', $client->getResponse()->getTargetUrl());
185 $client->followRedirect();
186 185
187 $em = $client->getContainer() 186 $em = $client->getContainer()
188 ->get('doctrine.orm.entity_manager'); 187 ->get('doctrine.orm.entity_manager');
@@ -196,6 +195,35 @@ class EntryControllerTest extends WallabagCoreTestCase
196 195
197 $em->remove($entry); 196 $em->remove($entry);
198 $em->flush(); 197 $em->flush();
198
199 // and now re-submit it to test the cascade persistence for tags after entry removal
200 // related https://github.com/wallabag/wallabag/issues/2121
201 $crawler = $client->request('GET', '/new');
202
203 $this->assertEquals(200, $client->getResponse()->getStatusCode());
204
205 $form = $crawler->filter('form[name=entry]')->form();
206
207 $data = [
208 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
209 ];
210
211 $client->submit($form, $data);
212
213 $this->assertEquals(302, $client->getResponse()->getStatusCode());
214 $this->assertContains('/', $client->getResponse()->getTargetUrl());
215
216 $entry = $em
217 ->getRepository('WallabagCoreBundle:Entry')
218 ->findOneByUrl($url);
219
220 $tags = $entry->getTags();
221
222 $this->assertCount(1, $tags);
223 $this->assertEquals('wallabag', $tags[0]->getLabel());
224
225 $em->remove($entry);
226 $em->flush();
199 } 227 }
200 228
201 public function testArchive() 229 public function testArchive()
@@ -471,6 +499,60 @@ class EntryControllerTest extends WallabagCoreTestCase
471 $this->assertCount(1, $crawler->filter('div[class=entry]')); 499 $this->assertCount(1, $crawler->filter('div[class=entry]'));
472 } 500 }
473 501
502 public function testFilterOnReadingTimeOnlyUpper()
503 {
504 $this->logInAs('admin');
505 $client = $this->getClient();
506
507 $crawler = $client->request('GET', '/unread/list');
508
509 $form = $crawler->filter('button[id=submit-filter]')->form();
510
511 $data = [
512 'entry_filter[readingTime][right_number]' => 22,
513 ];
514
515 $crawler = $client->submit($form, $data);
516
517 $this->assertCount(2, $crawler->filter('div[class=entry]'));
518 }
519
520 public function testFilterOnReadingTimeOnlyLower()
521 {
522 $this->logInAs('admin');
523 $client = $this->getClient();
524
525 $crawler = $client->request('GET', '/unread/list');
526
527 $form = $crawler->filter('button[id=submit-filter]')->form();
528
529 $data = [
530 'entry_filter[readingTime][left_number]' => 22,
531 ];
532
533 $crawler = $client->submit($form, $data);
534
535 $this->assertCount(4, $crawler->filter('div[class=entry]'));
536 }
537
538 public function testFilterOnUnreadStatus()
539 {
540 $this->logInAs('admin');
541 $client = $this->getClient();
542
543 $crawler = $client->request('GET', '/all/list');
544
545 $form = $crawler->filter('button[id=submit-filter]')->form();
546
547 $data = [
548 'entry_filter[isUnread]' => true,
549 ];
550
551 $crawler = $client->submit($form, $data);
552
553 $this->assertCount(4, $crawler->filter('div[class=entry]'));
554 }
555
474 public function testFilterOnCreationDate() 556 public function testFilterOnCreationDate()
475 { 557 {
476 $this->logInAs('admin'); 558 $this->logInAs('admin');
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/ExportControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php
index 76c98055..b22156c3 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/ExportControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class ExportControllerTest extends WallabagCoreTestCase 7class ExportControllerTest extends WallabagCoreTestCase
8{ 8{
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php b/tests/Wallabag/CoreBundle/Controller/RssControllerTest.php
index 87a01b8e..fb6fe06a 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/RssControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class RssControllerTest extends WallabagCoreTestCase 7class RssControllerTest extends WallabagCoreTestCase
8{ 8{
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/SecurityControllerTest.php b/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php
index 2910fa4f..03355f5a 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/SecurityControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class SecurityControllerTest extends WallabagCoreTestCase 7class SecurityControllerTest extends WallabagCoreTestCase
8{ 8{
@@ -36,7 +36,7 @@ class SecurityControllerTest extends WallabagCoreTestCase
36 $em->persist($user); 36 $em->persist($user);
37 $em->flush(); 37 $em->flush();
38 38
39 $this->logInAs('admin'); 39 $this->logInAsUsingHttp('admin');
40 $crawler = $client->request('GET', '/config'); 40 $crawler = $client->request('GET', '/config');
41 $this->assertContains('scheb_two_factor.trusted', $crawler->filter('body')->extract(['_text'])[0]); 41 $this->assertContains('scheb_two_factor.trusted', $crawler->filter('body')->extract(['_text'])[0]);
42 42
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/SettingsControllerTest.php b/tests/Wallabag/CoreBundle/Controller/SettingsControllerTest.php
index fd698b3e..9b8b5702 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/SettingsControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/SettingsControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7/** 7/**
8 * The controller `SettingsController` does not exist. 8 * The controller `SettingsController` does not exist.
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/StaticControllerTest.php b/tests/Wallabag/CoreBundle/Controller/StaticControllerTest.php
index 6d7976c4..98a37b50 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/StaticControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/StaticControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class StaticControllerTest extends WallabagCoreTestCase 7class StaticControllerTest extends WallabagCoreTestCase
8{ 8{
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php
index 8af37ea4..58450e5f 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Controller; 3namespace Tests\Wallabag\CoreBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class TagControllerTest extends WallabagCoreTestCase 7class TagControllerTest extends WallabagCoreTestCase
8{ 8{
@@ -39,6 +39,12 @@ class TagControllerTest extends WallabagCoreTestCase
39 $client->submit($form, $data); 39 $client->submit($form, $data);
40 $this->assertEquals(302, $client->getResponse()->getStatusCode()); 40 $this->assertEquals(302, $client->getResponse()->getStatusCode());
41 41
42 // be sure to reload the entry
43 $entry = $client->getContainer()
44 ->get('doctrine.orm.entity_manager')
45 ->getRepository('WallabagCoreBundle:Entry')
46 ->findOneByUsernameAndNotArchived('admin');
47
42 $this->assertEquals(1, count($entry->getTags())); 48 $this->assertEquals(1, count($entry->getTags()));
43 49
44 # tag already exists and already assigned 50 # tag already exists and already assigned
diff --git a/src/Wallabag/CoreBundle/Tests/EventListener/LocaleListenerTest.php b/tests/Wallabag/CoreBundle/EventListener/LocaleListenerTest.php
index b4c022d5..2a7f9390 100644
--- a/src/Wallabag/CoreBundle/Tests/EventListener/LocaleListenerTest.php
+++ b/tests/Wallabag/CoreBundle/EventListener/LocaleListenerTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\EventListener; 3namespace Tests\Wallabag\CoreBundle\EventListener;
4 4
5use Symfony\Component\EventDispatcher\EventDispatcher; 5use Symfony\Component\EventDispatcher\EventDispatcher;
6use Symfony\Component\HttpFoundation\Request; 6use Symfony\Component\HttpFoundation\Request;
diff --git a/src/Wallabag/CoreBundle/Tests/EventListener/RegistrationConfirmedListenerTest.php b/tests/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListenerTest.php
index 7039dc61..e45722fa 100644
--- a/src/Wallabag/CoreBundle/Tests/EventListener/RegistrationConfirmedListenerTest.php
+++ b/tests/Wallabag/CoreBundle/EventListener/RegistrationConfirmedListenerTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\EventListener; 3namespace Tests\Wallabag\CoreBundle\EventListener;
4 4
5use FOS\UserBundle\Event\FilterUserResponseEvent; 5use FOS\UserBundle\Event\FilterUserResponseEvent;
6use FOS\UserBundle\FOSUserEvents; 6use FOS\UserBundle\FOSUserEvents;
diff --git a/src/Wallabag/CoreBundle/Tests/EventListener/UserLocaleListenerTest.php b/tests/Wallabag/CoreBundle/EventListener/UserLocaleListenerTest.php
index d9ffe30e..e9ac7c1d 100644
--- a/src/Wallabag/CoreBundle/Tests/EventListener/UserLocaleListenerTest.php
+++ b/tests/Wallabag/CoreBundle/EventListener/UserLocaleListenerTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\EventListener; 3namespace Tests\Wallabag\CoreBundle\EventListener;
4 4
5use Symfony\Component\HttpFoundation\Request; 5use Symfony\Component\HttpFoundation\Request;
6use Symfony\Component\HttpFoundation\Session\Session; 6use Symfony\Component\HttpFoundation\Session\Session;
diff --git a/src/Wallabag/CoreBundle/Tests/Form/DataTransformer/StringToListTransformerTest.php b/tests/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformerTest.php
index 6b1e8613..0ec98c1f 100644
--- a/src/Wallabag/CoreBundle/Tests/Form/DataTransformer/StringToListTransformerTest.php
+++ b/tests/Wallabag/CoreBundle/Form/DataTransformer/StringToListTransformerTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Form\DataTransformer; 3namespace Tests\Wallabag\CoreBundle\Form\DataTransformer;
4 4
5use Wallabag\CoreBundle\Form\DataTransformer\StringToListTransformer; 5use Wallabag\CoreBundle\Form\DataTransformer\StringToListTransformer;
6 6
diff --git a/src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php b/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
index 9d7b0f36..7abb0737 100644
--- a/src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php
+++ b/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Helper; 3namespace Tests\Wallabag\CoreBundle\Helper;
4 4
5use Psr\Log\NullLogger; 5use Psr\Log\NullLogger;
6use Wallabag\CoreBundle\Helper\ContentProxy; 6use Wallabag\CoreBundle\Helper\ContentProxy;
diff --git a/src/Wallabag/CoreBundle/Tests/Helper/RedirectTest.php b/tests/Wallabag/CoreBundle/Helper/RedirectTest.php
index f4aecc80..f339f75e 100644
--- a/src/Wallabag/CoreBundle/Tests/Helper/RedirectTest.php
+++ b/tests/Wallabag/CoreBundle/Helper/RedirectTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Helper; 3namespace Tests\Wallabag\CoreBundle\Helper;
4 4
5use Wallabag\CoreBundle\Helper\Redirect; 5use Wallabag\CoreBundle\Helper\Redirect;
6 6
diff --git a/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php b/tests/Wallabag/CoreBundle/Helper/RuleBasedTaggerTest.php
index e9025b45..17b08c2a 100644
--- a/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php
+++ b/tests/Wallabag/CoreBundle/Helper/RuleBasedTaggerTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Helper; 3namespace Tests\Wallabag\CoreBundle\Helper;
4 4
5use Wallabag\CoreBundle\Entity\Config; 5use Wallabag\CoreBundle\Entity\Config;
6use Wallabag\CoreBundle\Entity\Entry; 6use Wallabag\CoreBundle\Entity\Entry;
diff --git a/src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php b/tests/Wallabag/CoreBundle/Mock/InstallCommandMock.php
index ff9cdafd..5806bd4d 100644
--- a/src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php
+++ b/tests/Wallabag/CoreBundle/Mock/InstallCommandMock.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Mock; 3namespace Tests\Wallabag\CoreBundle\Mock;
4 4
5use Wallabag\CoreBundle\Command\InstallCommand; 5use Wallabag\CoreBundle\Command\InstallCommand;
6 6
diff --git a/src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php b/tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php
index ee10938a..e29b58b5 100644
--- a/src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php
+++ b/tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Command; 3namespace Tests\Wallabag\CoreBundle\Command;
4 4
5use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; 5use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
6use Symfony\Component\HttpFoundation\Request; 6use Symfony\Component\HttpFoundation\Request;
diff --git a/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php b/tests/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriberTest.php
index e5eafab1..4ae76703 100644
--- a/src/Wallabag/CoreBundle/Tests/Subscriber/TablePrefixSubscriberTest.php
+++ b/tests/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriberTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Subscriber; 3namespace Tests\Wallabag\CoreBundle\Subscriber;
4 4
5use Doctrine\Common\EventManager; 5use Doctrine\Common\EventManager;
6use Doctrine\ORM\Event\LoadClassMetadataEventArgs; 6use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
diff --git a/src/Wallabag/CoreBundle/Tests/Twig/WallabagExtensionTest.php b/tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php
index 9af8fad8..8ec2a75a 100644
--- a/src/Wallabag/CoreBundle/Tests/Twig/WallabagExtensionTest.php
+++ b/tests/Wallabag/CoreBundle/Twig/WallabagExtensionTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\CoreBundle\Tests\Twig; 3namespace Tests\Wallabag\CoreBundle\Twig;
4 4
5use Wallabag\CoreBundle\Twig\WallabagExtension; 5use Wallabag\CoreBundle\Twig\WallabagExtension;
6 6
diff --git a/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php
new file mode 100644
index 00000000..c0055888
--- /dev/null
+++ b/tests/Wallabag/CoreBundle/WallabagCoreTestCase.php
@@ -0,0 +1,83 @@
1<?php
2
3namespace Tests\Wallabag\CoreBundle;
4
5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6use Symfony\Component\BrowserKit\Cookie;
7
8abstract class WallabagCoreTestCase extends WebTestCase
9{
10 private $client = null;
11
12 public function getClient()
13 {
14 return $this->client;
15 }
16
17 public function setUp()
18 {
19 parent::setUp();
20
21 $this->client = static::createClient();
22 }
23
24 /**
25 * Login a user without making a HTTP request.
26 * If we make a HTTP request we lose ability to mock service in the container.
27 *
28 * @param string $username User to log in
29 */
30 public function logInAs($username)
31 {
32 $container = $this->client->getContainer();
33 $session = $container->get('session');
34
35 $userManager = $container->get('fos_user.user_manager');
36 $loginManager = $container->get('fos_user.security.login_manager');
37 $firewallName = $container->getParameter('fos_user.firewall_name');
38
39 $user = $userManager->findUserBy(array('username' => $username));
40 $loginManager->loginUser($firewallName, $user);
41
42 $session->set('_security_'.$firewallName, serialize($container->get('security.token_storage')->getToken()));
43 $session->save();
44
45 $cookie = new Cookie($session->getName(), $session->getId());
46 $this->client->getCookieJar()->set($cookie);
47 }
48
49 /**
50 * Instead of `logInAs` this method use a HTTP request to log in the user.
51 * Could be better for some tests.
52 *
53 * @param string $username User to log in
54 */
55 public function logInAsUsingHttp($username)
56 {
57 $crawler = $this->client->request('GET', '/login');
58 $form = $crawler->filter('button[type=submit]')->form();
59 $data = [
60 '_username' => $username,
61 '_password' => 'mypassword',
62 ];
63
64 $this->client->submit($form, $data);
65 }
66
67 /**
68 * Return the user id of the logged in user.
69 * You should be sure that you called `logInAs` before.
70 *
71 * @return int
72 */
73 public function getLoggedInUserId()
74 {
75 $token = static::$kernel->getContainer()->get('security.token_storage')->getToken();
76
77 if (null !== $token) {
78 return $token->getUser()->getId();
79 }
80
81 throw new \RuntimeException('No logged in User.');
82 }
83}
diff --git a/src/Wallabag/ImportBundle/Tests/Controller/ImportControllerTest.php b/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php
index 9f38fa82..96b5300b 100644
--- a/src/Wallabag/ImportBundle/Tests/Controller/ImportControllerTest.php
+++ b/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Controller; 3namespace Tests\Wallabag\ImportBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 6
7class ImportControllerTest extends WallabagCoreTestCase 7class ImportControllerTest extends WallabagCoreTestCase
8{ 8{
diff --git a/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php b/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php
new file mode 100644
index 00000000..e0e61df8
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/Controller/PocketControllerTest.php
@@ -0,0 +1,108 @@
1<?php
2
3namespace Tests\Wallabag\ImportBundle\Controller;
4
5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6
7class PocketControllerTest extends WallabagCoreTestCase
8{
9 public function testImportPocket()
10 {
11 $this->logInAs('admin');
12 $client = $this->getClient();
13
14 $crawler = $client->request('GET', '/import/pocket');
15
16 $this->assertEquals(200, $client->getResponse()->getStatusCode());
17 $this->assertEquals(1, $crawler->filter('button[type=submit]')->count());
18 }
19
20 public function testImportPocketAuthBadToken()
21 {
22 $this->logInAs('admin');
23 $client = $this->getClient();
24
25 $client->request('GET', '/import/pocket/auth');
26
27 $this->assertEquals(302, $client->getResponse()->getStatusCode());
28 }
29
30 public function testImportPocketAuth()
31 {
32 $this->logInAs('admin');
33 $client = $this->getClient();
34
35 $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
36 ->disableOriginalConstructor()
37 ->getMock();
38
39 $pocketImport
40 ->expects($this->once())
41 ->method('getRequestToken')
42 ->willReturn('token');
43
44 static::$kernel->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
45
46 $client->request('GET', '/import/pocket/auth');
47
48 $this->assertEquals(301, $client->getResponse()->getStatusCode());
49 $this->assertContains('getpocket.com/auth/authorize', $client->getResponse()->headers->get('location'));
50 }
51
52 public function testImportPocketCallbackWithBadToken()
53 {
54 $this->logInAs('admin');
55 $client = $this->getClient();
56
57 $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
58 ->disableOriginalConstructor()
59 ->getMock();
60
61 $pocketImport
62 ->expects($this->once())
63 ->method('authorize')
64 ->willReturn(false);
65
66 static::$kernel->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
67
68 $client->request('GET', '/import/pocket/callback');
69
70 $this->assertEquals(302, $client->getResponse()->getStatusCode());
71 $this->assertContains('/', $client->getResponse()->headers->get('location'), 'Import is ok, redirect to homepage');
72 $this->assertEquals('flashes.import.notice.failed', $client->getContainer()->get('session')->getFlashBag()->peek('notice')[0]);
73 }
74
75 public function testImportPocketCallback()
76 {
77 $this->logInAs('admin');
78 $client = $this->getClient();
79
80 $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
81 ->disableOriginalConstructor()
82 ->getMock();
83
84 $pocketImport
85 ->expects($this->once())
86 ->method('authorize')
87 ->willReturn(true);
88
89 $pocketImport
90 ->expects($this->once())
91 ->method('setMarkAsRead')
92 ->with(false)
93 ->willReturn($pocketImport);
94
95 $pocketImport
96 ->expects($this->once())
97 ->method('import')
98 ->willReturn(true);
99
100 static::$kernel->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
101
102 $client->request('GET', '/import/pocket/callback');
103
104 $this->assertEquals(302, $client->getResponse()->getStatusCode());
105 $this->assertContains('/', $client->getResponse()->headers->get('location'), 'Import is ok, redirect to homepage');
106 $this->assertEquals('flashes.import.notice.summary', $client->getContainer()->get('session')->getFlashBag()->peek('notice')[0]);
107 }
108}
diff --git a/src/Wallabag/ImportBundle/Tests/Controller/WallabagV1ControllerTest.php b/tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php
index f7de3fef..c1025b41 100644
--- a/src/Wallabag/ImportBundle/Tests/Controller/WallabagV1ControllerTest.php
+++ b/tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Controller; 3namespace Tests\Wallabag\ImportBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6use Symfony\Component\HttpFoundation\File\UploadedFile; 6use Symfony\Component\HttpFoundation\File\UploadedFile;
7 7
8class WallabagV1ControllerTest extends WallabagCoreTestCase 8class WallabagV1ControllerTest extends WallabagCoreTestCase
diff --git a/src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php b/tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php
index 15251ae7..d8d2c8bf 100644
--- a/src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php
+++ b/tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Controller; 3namespace Tests\Wallabag\ImportBundle\Controller;
4 4
5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase; 5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6use Symfony\Component\HttpFoundation\File\UploadedFile; 6use Symfony\Component\HttpFoundation\File\UploadedFile;
7 7
8class WallabagV2ControllerTest extends WallabagCoreTestCase 8class WallabagV2ControllerTest extends WallabagCoreTestCase
diff --git a/src/Wallabag/ImportBundle/Tests/Import/ImportChainTest.php b/tests/Wallabag/ImportBundle/Import/ImportChainTest.php
index 702d2a9b..32568ce5 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/ImportChainTest.php
+++ b/tests/Wallabag/ImportBundle/Import/ImportChainTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Import; 3namespace Tests\Wallabag\ImportBundle\Import;
4 4
5use Wallabag\ImportBundle\Import\ImportChain; 5use Wallabag\ImportBundle\Import\ImportChain;
6 6
diff --git a/src/Wallabag/ImportBundle/Tests/Import/ImportCompilerPassTest.php b/tests/Wallabag/ImportBundle/Import/ImportCompilerPassTest.php
index b22fcfbc..71a007a9 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/ImportCompilerPassTest.php
+++ b/tests/Wallabag/ImportBundle/Import/ImportCompilerPassTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Import; 3namespace Tests\Wallabag\ImportBundle\Import;
4 4
5use Symfony\Component\DependencyInjection\ContainerBuilder; 5use Symfony\Component\DependencyInjection\ContainerBuilder;
6use Wallabag\ImportBundle\Import\ImportCompilerPass; 6use Wallabag\ImportBundle\Import\ImportCompilerPass;
diff --git a/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php b/tests/Wallabag/ImportBundle/Import/PocketImportTest.php
index cb171572..8534e1c8 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php
+++ b/tests/Wallabag/ImportBundle/Import/PocketImportTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Import; 3namespace Tests\Wallabag\ImportBundle\Import;
4 4
5use Wallabag\UserBundle\Entity\User; 5use Wallabag\UserBundle\Entity\User;
6use Wallabag\CoreBundle\Entity\Entry; 6use Wallabag\CoreBundle\Entity\Entry;
@@ -390,4 +390,55 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
390 $this->assertContains('PocketImport: Failed to import', $records[0]['message']); 390 $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
391 $this->assertEquals('ERROR', $records[0]['level_name']); 391 $this->assertEquals('ERROR', $records[0]['level_name']);
392 } 392 }
393
394 public function testImportWithExceptionFromGraby()
395 {
396 $client = new Client();
397
398 $mock = new Mock([
399 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
400 new Response(200, ['Content-Type' => 'application/json'], Stream::factory('
401 {
402 "status": 1,
403 "list": {
404 "229279689": {
405 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview"
406 }
407 }
408 }
409 ')),
410 ]);
411
412 $client->getEmitter()->attach($mock);
413
414 $pocketImport = $this->getPocketImport();
415
416 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
417 ->disableOriginalConstructor()
418 ->getMock();
419
420 $entryRepo->expects($this->once())
421 ->method('findByUrlAndUserId')
422 ->will($this->onConsecutiveCalls(false, true));
423
424 $this->em
425 ->expects($this->once())
426 ->method('getRepository')
427 ->willReturn($entryRepo);
428
429 $entry = new Entry($this->user);
430
431 $this->contentProxy
432 ->expects($this->once())
433 ->method('updateEntry')
434 ->will($this->throwException(new \Exception()));
435
436 $pocketImport->setClient($client);
437 $pocketImport->authorize('wunderbar_code');
438
439 $res = $pocketImport->import();
440
441 $this->assertTrue($res);
442 $this->assertEquals(['skipped' => 1, 'imported' => 0], $pocketImport->getSummary());
443 }
393} 444}
diff --git a/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php b/tests/Wallabag/ImportBundle/Import/WallabagV1ImportTest.php
index 8c967e1b..bdc47dac 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
+++ b/tests/Wallabag/ImportBundle/Import/WallabagV1ImportTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Import; 3namespace Tests\Wallabag\ImportBundle\Import;
4 4
5use Wallabag\ImportBundle\Import\WallabagV1Import; 5use Wallabag\ImportBundle\Import\WallabagV1Import;
6use Wallabag\UserBundle\Entity\User; 6use Wallabag\UserBundle\Entity\User;
diff --git a/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php b/tests/Wallabag/ImportBundle/Import/WallabagV2ImportTest.php
index e287d8e2..4a45e0f0 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
+++ b/tests/Wallabag/ImportBundle/Import/WallabagV2ImportTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\ImportBundle\Tests\Import; 3namespace Tests\Wallabag\ImportBundle\Import;
4 4
5use Wallabag\ImportBundle\Import\WallabagV2Import; 5use Wallabag\ImportBundle\Import\WallabagV2Import;
6use Wallabag\UserBundle\Entity\User; 6use Wallabag\UserBundle\Entity\User;
@@ -143,4 +143,44 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
143 $this->assertContains('WallabagImport: user is not defined', $records[0]['message']); 143 $this->assertContains('WallabagImport: user is not defined', $records[0]['message']);
144 $this->assertEquals('ERROR', $records[0]['level_name']); 144 $this->assertEquals('ERROR', $records[0]['level_name']);
145 } 145 }
146
147 public function testImportEmptyFile()
148 {
149 $wallabagV2Import = $this->getWallabagV2Import();
150 $wallabagV2Import->setFilepath(__DIR__.'/../fixtures/wallabag-v2-empty.json');
151
152 $res = $wallabagV2Import->import();
153
154 $this->assertFalse($res);
155 $this->assertEquals(['skipped' => 0, 'imported' => 0], $wallabagV2Import->getSummary());
156 }
157
158 public function testImportWithExceptionFromGraby()
159 {
160 $wallabagV2Import = $this->getWallabagV2Import();
161 $wallabagV2Import->setFilepath(__DIR__.'/../fixtures/wallabag-v2.json');
162
163 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
164 ->disableOriginalConstructor()
165 ->getMock();
166
167 $entryRepo->expects($this->exactly(24))
168 ->method('findByUrlAndUserId')
169 ->will($this->onConsecutiveCalls(false, true, false));
170
171 $this->em
172 ->expects($this->any())
173 ->method('getRepository')
174 ->willReturn($entryRepo);
175
176 $this->contentProxy
177 ->expects($this->exactly(2))
178 ->method('updateEntry')
179 ->will($this->throwException(new \Exception()));
180
181 $res = $wallabagV2Import->import();
182
183 $this->assertTrue($res);
184 $this->assertEquals(['skipped' => 24, 'imported' => 0], $wallabagV2Import->getSummary());
185 }
146} 186}
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/test.html b/tests/Wallabag/ImportBundle/fixtures/test.html
index e69de29b..e69de29b 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/test.html
+++ b/tests/Wallabag/ImportBundle/fixtures/test.html
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/test.txt b/tests/Wallabag/ImportBundle/fixtures/test.txt
index e69de29b..e69de29b 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/test.txt
+++ b/tests/Wallabag/ImportBundle/fixtures/test.txt
diff --git a/tests/Wallabag/ImportBundle/fixtures/unnamed.png b/tests/Wallabag/ImportBundle/fixtures/unnamed.png
new file mode 100644
index 00000000..e6dd9caa
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/fixtures/unnamed.png
Binary files differ
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1-read.json b/tests/Wallabag/ImportBundle/fixtures/wallabag-v1-read.json
index c4d1cf58..c4d1cf58 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1-read.json
+++ b/tests/Wallabag/ImportBundle/fixtures/wallabag-v1-read.json
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json b/tests/Wallabag/ImportBundle/fixtures/wallabag-v1.json
index f298469f..f298469f 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json
+++ b/tests/Wallabag/ImportBundle/fixtures/wallabag-v1.json
diff --git a/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2-read.json b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-read.json
index 3fa0bddf..3fa0bddf 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2-read.json
+++ b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-read.json
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2.json
index 37c59668..37c59668 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
+++ b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2.json
diff --git a/src/Wallabag/UserBundle/Tests/Mailer/AuthCodeMailerTest.php b/tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php
index 00967051..f670c925 100644
--- a/src/Wallabag/UserBundle/Tests/Mailer/AuthCodeMailerTest.php
+++ b/tests/Wallabag/UserBundle/Mailer/AuthCodeMailerTest.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\UserBundle\Tests\Mailer; 3namespace Tests\Wallabag\UserBundle\Mailer;
4 4
5use Wallabag\UserBundle\Entity\User; 5use Wallabag\UserBundle\Entity\User;
6use Wallabag\UserBundle\Mailer\AuthCodeMailer; 6use Wallabag\UserBundle\Mailer\AuthCodeMailer;
diff --git a/var/SymfonyRequirements.php b/var/SymfonyRequirements.php
index 841338f4..0a5de546 100644
--- a/var/SymfonyRequirements.php
+++ b/var/SymfonyRequirements.php
@@ -681,10 +681,17 @@ class SymfonyRequirements extends RequirementCollection
681 681
682 if (class_exists('Symfony\Component\Intl\Intl')) { 682 if (class_exists('Symfony\Component\Intl\Intl')) {
683 $this->addRecommendation( 683 $this->addRecommendation(
684 \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), 684 \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(),
685 sprintf('intl ICU version installed on your system (%s) should match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), 685 sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()),
686 'In most cases you should be fine, but please verify there is no inconsistencies between data provided by Symfony and the intl extension. See https://github.com/symfony/symfony/issues/15007 for an example of inconsistencies you might run into.' 686 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.'
687 ); 687 );
688 if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) {
689 $this->addRecommendation(
690 \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(),
691 sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()),
692 'To avoid internationalization data incosistencies upgrade the symfony/intl component.'
693 );
694 }
688 } 695 }
689 696
690 $this->addPhpIniRecommendation( 697 $this->addPhpIniRecommendation(
diff --git a/web/app.php b/web/app.php
index 5c5ee03b..4c2c4650 100644
--- a/web/app.php
+++ b/web/app.php
@@ -8,16 +8,6 @@ use Symfony\Component\HttpFoundation\Request;
8$loader = require __DIR__.'/../app/autoload.php'; 8$loader = require __DIR__.'/../app/autoload.php';
9include_once __DIR__.'/../var/bootstrap.php.cache'; 9include_once __DIR__.'/../var/bootstrap.php.cache';
10 10
11// Enable APC for autoloading to improve performance.
12// You should change the ApcClassLoader first argument to a unique prefix
13// in order to prevent cache key conflicts with other applications
14// also using APC.
15/*
16$apcLoader = new Symfony\Component\ClassLoader\ApcClassLoader(sha1(__FILE__), $loader);
17$loader->unregister();
18$apcLoader->register(true);
19*/
20
21$kernel = new AppKernel('prod', false); 11$kernel = new AppKernel('prod', false);
22$kernel->loadClassCache(); 12$kernel->loadClassCache();
23//$kernel = new AppCache($kernel); 13//$kernel = new AppCache($kernel);