Compare commits

..

161 Commits
2.0.1 ... 2.0.5

Author SHA1 Message Date
81b53d9812 Release wallabag 2.0.5 2016-05-31 21:49:52 +02:00
1584067028 Merge pull request #2118 from wallabag/prepare-205
Prepare wallabag 2.0.5
2016-05-31 21:45:01 +02:00
17dfff6918 Prepare wallabag 2.0.5 2016-05-31 21:18:22 +02:00
f329e769fd Merge pull request #2122 from wallabag/fix-tags-deletion
Fix the deletion of Tags/Entries relation when delete an entry
2016-05-31 11:31:16 +02:00
3be047456d Change ManyToMany between entry & tag
Following https://gist.github.com/Ocramius/3121916

Be sure to remove the related entity when removing an entity.

Let say you have Entry -> EntryTag -> Tag.
If you remove the entry:

 - before that commit, the EntryTag will stay (at least using SQLite).
 - with that commit, the related entity is removed
2016-05-31 10:01:03 +02:00
39ba51ca1a Display a message when saving an entry failed
When saving an entry fail because of database error we previously just returned `false`.
Now we got an error in the log and the displayed notice to the user is updated too.
2016-05-30 14:32:43 +02:00
2c045a210a Move fixtures to the right place 2016-05-30 14:18:47 +02:00
f41c840b8c Fix the deletion of Tags/Entries relation when delete an entry
Fix #2121
2016-05-28 13:38:59 +02:00
839475776b Merge pull request #2052 from danbartram/feature-filter-unread
Add unread filter to entries pages
2016-05-27 09:57:51 +02:00
7b67f785ff Merge pull request #2112 from Poorchop/docs-proposal
Docs proposal
2016-05-26 20:50:11 +02:00
c15a150d2e Merge pull request #2111 from wallabag/translate-android-docu-pics-to-english
add screenshots of android docu in English
2016-05-24 13:41:56 +02:00
92491227c1 add screenshots of android docu in English 2016-05-23 21:16:53 +02:00
b5fa6607a9 Update installation instructions
-Fix grammar
-Add SELinux section
2016-05-23 13:22:12 -04:00
4127d7ad1b Update FAQ
-Fix grammar
-Add notes about MTA, firewall, and SELinux
2016-05-23 13:18:20 -04:00
2857aaa994 Merge pull request #2109 from Poorchop/grammar
Improve English translation
2016-05-23 07:50:47 +02:00
8fef96ee9f Improve English translation 2016-05-23 01:04:17 -04:00
9f95b14dec Merge pull request #2097 from bmillemathias/issue_2045
Fix image path in 2-factor authentification email
2016-05-19 09:19:01 +02:00
151f046f61 Merge pull request #2098 from wallabag/cs-2092
CS
2016-05-19 09:18:16 +02:00
6922168420 CS 2016-05-19 07:41:54 +02:00
e7658cb009 Merge pull request #2092 from Rurik19/issue2089
Starred and Archived clears if article is already exists
2016-05-19 07:39:30 +02:00
2dcb1dbf05 Forgot a double quote 2016-05-19 01:51:50 +02:00
871f667a55 Fix image path in 2-factor authentification email
Fix the broken url to image ressource hosted on wallabag.org
2016-05-18 21:18:41 +02:00
d30ec39008 Merge pull request #2093 from wallabag/replace-dots-material
Replace vertical dots in material theme with horizontal dots
2016-05-18 14:58:50 +02:00
8baf3d4bda Merge pull request #2094 from wallabag/update-contributing
Update CONTRIBUTING file
2016-05-18 14:58:45 +02:00
953305e904 Update CONTRIBUTING file
Fix #2059
2016-05-18 14:33:06 +02:00
9b40422594 Replace vertical dots in material theme with horizontal dots 2016-05-18 14:29:41 +02:00
bba271e619 Tests for issue #2089 2016-05-18 15:37:07 +05:00
614a0bfd86 PATCH also clears starred and archived signs 2016-05-18 15:28:49 +05:00
873e380658 Starred and Archived clears if article is already exists 2016-05-18 10:30:33 +05:00
cac3f603cf Merge pull request #2069 from merwan/patch-1
Do not specify language in Firefox addon link
2016-05-13 14:15:01 +02:00
5f2971e1d4 Do not specify language in Firefox addon link 2016-05-13 11:58:10 +02:00
f7e714bde7 Merge pull request #2068 from mariovor/documentation/datadb
Added information about permissions on data/
2016-05-13 09:16:35 +02:00
458854f1e4 Added information about permissions on data/ 2016-05-12 19:21:27 +02:00
e0f953a5a6 Added information about permissions on data/db 2016-05-12 19:10:23 +02:00
12f8631e8a Merge pull request #2054 from wallabag/jamiroconca-craueconfigbundle-update-1
Update CraueConfigBundle.it.yml
2016-05-11 09:15:24 +02:00
9b8d1d8bbf Update CraueConfigBundle.it.yml 2016-05-11 00:23:36 +02:00
30334567a3 Add unread filter test to EntryControllerTest
Add a new test to the EntryControllerTest collection which checks that
only entries which have not been archived (and are treated as "unread")
are retrieved.
2016-05-09 19:48:28 +01:00
e2f2f61001 Merge pull request #2049 from joshp23/patch-1
Update api.rst
2016-05-09 20:00:40 +02:00
4ca4d1b3b1 Update api.rst 2016-05-09 11:27:27 -04:00
733b2cf19b Add unread filter to entries pages
Add the ability to filter for unread pages in the filters menu.
2016-05-09 14:56:52 +01:00
acd3c26a74 Update api.rst
I just used google translate for this bit ... I really don't know any French ;)
2016-05-09 08:51:45 -04:00
b1fcd47a5c Merge pull request #2044 from joshp23/patch-1
Update api.rst
2016-05-09 04:39:59 +02:00
d948ee531e Update api.rst
Added my plugin, renamed the resource section for better english. Propose that the third party resource section have it's own page.
2016-05-08 18:04:14 -04:00
1875afaeff Merge pull request #2038 from foxmask/master
new details in the doc about the rights access again;)
2016-05-08 08:47:48 +02:00
ab46a256f4 new details in the doc about the rgihts access again;) 2016-05-07 22:55:19 +02:00
de20470ee1 Merge pull request #2035 from wallabag/prepare-204
Prepare wallabag 2.0.4
2016-05-07 19:58:31 +02:00
8f705d62af Update changelog 2016-05-07 18:54:23 +02:00
3c8be33500 Merge pull request #2023 from wallabag/fix-validators-translation
Fix translation for validators
2016-05-07 15:28:30 +02:00
961ec4ec86 Prepare wallabag 2.0.4 2016-05-07 13:26:55 +02:00
1221f5315d Fix translation for validators
Fix #2003
2016-05-07 13:24:14 +02:00
1556c925a4 Merge pull request #2016 from wallabag/update-documentation
Update documentation
2016-05-07 11:10:21 +02:00
f54de6817e Merge pull request #2020 from wallabag/fix-number-entries-per-tag
Fix number of entries in tag/list
2016-05-07 11:09:37 +02:00
dcd74397d6 Merge pull request #2024 from wallabag/jamiroconca-patch-messages-it
Update messages.it.yml
2016-05-07 11:08:40 +02:00
a0640406b4 Update messages.it.yml
other translations added
2016-05-05 17:32:49 +02:00
8cae66fa74 Merge pull request #2029 from wallabag/change-readme
Change Travis/Scrutinizer pictures in README
2016-05-05 15:43:17 +02:00
02222d9070 Change Travis/Scrutinizer pictures in README 2016-05-05 15:21:12 +02:00
613bff2d82 Merge pull request #2028 from wallabag/docu-for-android-app
Docu for android app
2016-05-05 14:38:17 +02:00
e0f4f25fd6 Change documentation about Pocket import
Fix wallabag/docker#8
2016-05-05 13:55:39 +02:00
c6b1112b11 android docu: Wallabag > wallabag (no uppercase) 2016-05-05 11:24:04 +02:00
3bd50951be add first draft of Android app documentation 2016-05-04 23:25:49 +02:00
7c1f64c967 Add documentation to know how to contribute to the documentation :trollface: 2016-05-04 14:42:14 +02:00
bb7a39d1ed Update messages.it.yml 2016-05-04 11:59:07 +02:00
d9926005b1 Rename getEntriesByUser method to getEntriesByUserId 2016-05-04 11:42:52 +02:00
8b563fc04e Fix lighttpd documentation 2016-05-04 11:40:13 +02:00
8ae9a3f52f Merge pull request #2022 from wallabag/fix-pagination-bar
Fix pagination bar on small devices
2016-05-04 10:18:08 +02:00
9039103c37 Add Third resources for wallabag API 2016-05-04 06:52:26 +02:00
09e5b9391e Add pagination bar at the bottom of the page
Fix #2021
2016-05-03 21:44:57 +02:00
e7cd089fa6 Fix pagination bar on small devices
Fix #2008
2016-05-03 21:27:07 +02:00
12c697562e Fix number of entries in tag/list
Fix #2006
2016-05-03 21:12:40 +02:00
fa04bddd01 Move some parts in FAQ 2016-05-03 20:51:23 +02:00
e546a2d6eb Add LigHTTPd documentation
Fix #1931
2016-05-03 20:39:49 +02:00
9b57bac8b9 Merge pull request #2017 from jamiroconca/patch-1
Create messages.it.yml
2016-05-03 20:31:09 +02:00
7f76f416d1 Merge pull request #2018 from jamiroconca/patch-2
Update config.yml, add italian as available language
2016-05-03 20:30:49 +02:00
27b96824fc Merge pull request #2019 from jamiroconca/patch-3
Create CraueConfigBundle.it.yml
2016-05-03 20:30:39 +02:00
760875af67 Create CraueConfigBundle.it.yml
baseline italian translations
2016-05-03 18:31:16 +02:00
8b09c6edfb Update config.yml
add italian as available language
2016-05-03 18:24:14 +02:00
439c7e41a3 Create messages.it.yml
baseline for italian translations (cloned from english)
2016-05-03 18:16:36 +02:00
bba9907d1f Update documentation 2016-05-03 15:50:13 +02:00
97c8eb3c23 Merge pull request #2013 from wallabag/fix-display-all-tags
Fix tags listing
2016-05-03 10:07:34 +02:00
e9023a16eb Remove useless method 2016-05-03 09:39:34 +02:00
2142c714ef Merge pull request #1976 from wallabag/fix-filter-readingTime
Fix filter reading time
2016-05-03 09:05:31 +02:00
045859a2b5 Merge pull request #2005 from wallabag/fix-readingspeed-not-defined
Fix reading speed not defined when user was created via config page
2016-05-03 09:04:02 +02:00
2a007fe43d Fix tags listing
Fix #1994
* Remove unused method in tag repository
2016-05-02 21:32:47 +02:00
c4c062cce0 Add test to check reading time filter 2016-05-02 21:14:23 +02:00
8389074180 Add test for creation of new user in config page 2016-05-02 20:19:57 +02:00
ba9fee0855 Merge pull request #2012 from biva/patch-2
integrate upgrade.rst
2016-05-02 20:08:04 +02:00
b8f35b6b27 Merge pull request #2011 from biva/patch-1
upgrade.rst (Creation of an upgrade page in the documentation)
2016-05-02 20:06:43 +02:00
06bf24103b integrate upgrade.rst 2016-05-02 18:31:52 +02:00
12d3bbccbd upgrade.rst
Creation of an upgrade page in the documentation
2016-05-02 13:29:38 +02:00
deb5d97667 Merge pull request #2010 from wallabag/set-title-via-post-api
Set the title via POST /api/entries
2016-05-02 13:22:45 +02:00
51a15609b3 Set the title via POST /api/entries
Fix #2009
2016-05-02 12:50:42 +02:00
823397f2d6 Fix reading speed not defined when user was created via config page
Fix #2004
2016-04-30 15:06:31 +02:00
f0de35d2ee Merge pull request #2001 from wallabag/fix-old-branch-name-urls
Fix old branch name urls
2016-04-30 14:02:16 +02:00
66bbaaae4d same with fr 2016-04-30 13:00:05 +02:00
d3ffd65a06 doc url still in v2 form 2016-04-30 12:59:17 +02:00
46bbbbf4a9 Merge pull request #1992 from jami7/patch-10
Update CraueConfigBundle.es.yml
2016-04-28 09:17:35 +02:00
4c05e8b18f Update CraueConfigBundle.es.yml 2016-04-27 20:58:51 -10:00
4c295cb928 Merge pull request #1985 from foxmask/master
Rights access to the folders of the project
2016-04-27 07:19:31 +02:00
87b8461ed8 fixed typo 2016-04-26 15:30:43 +02:00
9ddf49ba24 Rights access to the folder of the project 2016-04-26 09:58:57 +02:00
edf3e88d88 Merge pull request #1977 from wallabag/es-translation
Es translation
2016-04-25 14:12:50 +02:00
10cc2785a0 Fix indentations in ES translation 2016-04-24 20:53:11 +02:00
acc371a129 Update messages.es.yml 2016-04-24 20:48:16 +02:00
ef37b9af71 Update messages.es.yml 2016-04-24 20:48:16 +02:00
d6a9e139dc Fix tests 2016-04-24 20:46:25 +02:00
d8f8a59010 Fix wrong reading time when apply filters 2016-04-24 20:24:23 +02:00
f97653c895 Merge pull request #1970 from wallabag/typo-api-doc
Fix typos in API documentation
2016-04-23 14:57:06 +02:00
58f0d0bdeb Fix typos in API documentation 2016-04-23 14:12:55 +02:00
3cfbe3c7e8 Merge pull request #1969 from wallabag/doc-3rd-resources-api
Create 3rd Resources chapter in API documentation
2016-04-23 13:53:05 +02:00
8c2affe680 Create 3rd Resources chapter in API documentation 2016-04-23 13:21:08 +02:00
c9bdd9a83f Merge pull request #1967 from wallabag/add-faq-documentation
Add FAQ page in documentation
2016-04-23 10:57:25 +02:00
0e9339c46c Add FAQ page in documentation 2016-04-23 10:36:25 +02:00
9c0bc04cfe Merge pull request #1965 from wallabag/prepare-203
Prepare release 2.0.3
2016-04-22 18:40:48 +02:00
dafde7fb2f Prepare release 2.0.3 2016-04-22 18:08:16 +02:00
9481187896 Merge pull request #1962 from wallabag/update-api-documentation
Update API documentation with cURL examples
2016-04-22 08:38:04 +02:00
1c90663b79 Update API documentation with cURL examples 2016-04-21 18:48:17 +02:00
7d5b4631d0 Merge pull request #1948 from wallabag/prepare-202
Prepare release 2.0.2
2016-04-21 09:44:44 +02:00
9f151b469f Update changelog 2016-04-21 08:42:41 +02:00
45919a295e Merge pull request #1957 from wallabag/fix-gotoaccount-button-translation
Fix translation for Go to your account button after subscription
2016-04-21 08:37:36 +02:00
2499cdbf29 Fix translation for Go to your account button after subscription
Fix #1956
2016-04-20 15:53:20 +02:00
868e76af10 Merge pull request #1945 from ddeimeke/master
Added some curl examples
2016-04-20 10:10:46 +02:00
f88530de68 Merge pull request #1954 from wallabag/update-links-doc
Update links in documentation
2016-04-19 20:25:36 +02:00
4a25bef077 Update links in documentation 2016-04-19 20:03:34 +02:00
24f65a838c Merge pull request #1953 from maxi62330/master
Actualisation des liens morts (Documentation de traduction)
2016-04-19 19:54:44 +02:00
89bafa95ed Actualisation des liens morts (Documentation de traduction) 2016-04-19 19:25:04 +02:00
18bb5a90d5 Prepare release 2.0.2 2016-04-19 10:01:29 +02:00
938a16c0f6 Added some curl examples 2016-04-19 08:00:07 +02:00
ca8d61b958 Merge pull request #1942 from wallabag/optimize-import
Optimize import
2016-04-18 22:13:48 +02:00
23feba63bb Merge pull request #1944 from wallabag/travis-rename-branches
Update Travis configuration with branches renaming
2016-04-18 22:12:52 +02:00
3320d39418 Update Travis configuration with branches renaming 2016-04-18 21:46:36 +02:00
23d24b1750 Add tests 2016-04-18 15:29:57 +02:00
dc12084d93 Add doctrine clear after flush, thanks to @BitOne talk at Symfony Live 2016-04-18 14:48:18 +02:00
0907a72c64 Merge pull request #1938 from wallabag/hide-pagination
Display pagination only if we have more than one page
2016-04-18 09:41:56 +02:00
188b74b6df Display pagination only if we have more than one page 2016-04-18 09:03:21 +02:00
71601c171f Merge pull request #1935 from jami7/patch-8
Update messages.es.yml
2016-04-17 08:03:36 +02:00
5c2c1a6434 Update messages.es.yml 2016-04-16 14:04:39 -10:00
7fdecbb73c Merge pull request #1933 from wallabag/hide-pagination
Hide pagination if we only have one entry to display
2016-04-16 08:36:24 +02:00
1f034a3316 Hide pagination if we only have one entry to display 2016-04-16 07:19:30 +02:00
d1f4996b77 Merge pull request #1925 from wallabag/fix-redirect-without-referer
Redirect to homepage if referer is null
2016-04-15 17:52:33 +02:00
5180302650 Merge pull request #1929 from wallabag/change-guid-rss
Change guid and link in RSS feeds to give original entry URL
2016-04-15 17:51:56 +02:00
2d899e8d30 Change guid and link in RSS feeds to give original entry URL
Fix #1926
2016-04-15 16:07:34 +02:00
345d74268b Fix redirect when delete entry 2016-04-15 15:39:00 +02:00
4086e0782e Fix tests 2016-04-15 09:58:29 +02:00
af497a641c Redirect to homepage if referer is null
Fix #1924
2016-04-15 07:58:01 +02:00
f2e5fdc366 Merge pull request #1916 from wallabag/cleanup
Convert array + phpDoc
2016-04-13 09:43:14 +02:00
a417b86923 Merge pull request #1918 from wallabag/improve-pagination
Improve pagination when user has lot of entries
2016-04-13 09:42:18 +02:00
18078ded12 Fix indentation 2016-04-13 09:20:01 +02:00
245e2e2cae Merge pull request #1919 from wallabag/cleanup-composerjson
Remove useless dependancy
2016-04-12 22:20:05 +02:00
86732aa01c Move test parameters out of parameters.yml
The end user doesn't care to about the test database.
2016-04-12 22:14:22 +02:00
c31ea8a409 Remove useless dependancy 2016-04-12 21:47:16 +02:00
c95e39c51a Lost in translation pager 2016-04-12 20:38:56 +02:00
63995be5ee Fix display for Next/Previous link when they are disabled 2016-04-12 18:03:40 +02:00
1880da7420 Restore old behavior for OutOfRangeCurrentPageException 2016-04-12 16:40:18 +02:00
76cd8dbb05 Fix tests 2016-04-12 16:32:01 +02:00
624a7c6df1 Improve pagination when user has lot of entries
Fix #1905
* Usage of whiteoctober/WhiteOctoberPagerfantaBundle
2016-04-12 16:04:17 +02:00
80bd17f00d Merge pull request #1911 from wallabag/title-on-title-entry
add title hover on entry titles
2016-04-12 14:54:59 +02:00
1b8b3859c0 Add title hover on entry titles 2016-04-12 14:30:42 +02:00
443cff9840 Fix MySQL tests on HHVM 2016-04-12 12:37:10 +02:00
4094ea4771 Convert array + phpDoc
Thanks for https://github.com/thomasbachem/php-short-array-syntax-converter
2016-04-12 12:25:29 +02:00
7eccbda99f Merge pull request #1915 from wallabag/doc-links
Fix doc links
2016-04-12 11:24:11 +02:00
8846ad0a90 Fix doc links 2016-04-12 10:51:46 +02:00
181 changed files with 3160 additions and 1443 deletions

View File

@ -3,22 +3,11 @@
## You found a bug ## You found a bug
Please [open a new issue](https://github.com/wallabag/wallabag/issues/new). Please [open a new issue](https://github.com/wallabag/wallabag/issues/new).
To fix the bug quickly, we need some infos: To fix the bug quickly, we need some infos: please answer to the questions in the issue form.
* your wallabag version (in `app/config/config.yml`, see `wallabag_core.version`)
* your webserver installation :
* type of hosting (shared or dedicated)
* in case of a dedicated server, the server and OS used
* the php version used, eventually `phpinfo()`
* which storage system you choose at install (SQLite, MySQL/MariaDB or PostgreSQL)
* any particular details which could be related
If relevant : If you have the skills, look for errors into php, server and application (see `var/logs`) logs.
* the link you want to save and which causes problem
* the file you want to import into wallabag, or just an extract
If you have the skills, look for errors into php, server and application (see `var/logs`) logs
Note : If you have large portions of text, use [Github's Gist service](https://gist.github.com/) or other pastebin-like. Note : If you have large portions of text, use [Github's Gist service](https://gist.github.com/) or other pastebin-like.
## You want to fix a bug or to add a feature ## You want to fix a bug or to add a feature
Please fork wallabag and work with **the v2 branch** only. **Do not work on master branch**. Please fork wallabag and work with **the master branch**.

View File

@ -41,8 +41,7 @@ matrix:
# exclude v1 branches # exclude v1 branches
branches: branches:
except: except:
- master - legacy
- dev
before_script: before_script:
- if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi; - if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;

View File

@ -2,6 +2,84 @@
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
## [2.0.5] - 2016-05-31
### Added
- [#2052](https://github.com/wallabag/wallabag/pull/2052) Add unread filter to entries pages (Dan Bartram)
### Changed
- [#2093](https://github.com/wallabag/wallabag/pull/2093) Replace vertical dots in material theme with horizontal dots (Nicolas Lœuillet)
- [#2054](https://github.com/wallabag/wallabag/pull/2054) Update italian translation (Daniele Conca)
- [#2068](https://github.com/wallabag/wallabag/pull/2068), [#2049](https://github.com/wallabag/wallabag/pull/2049) Update documentation (Josh Panter, Mario Vormstein)
### Fixed
- [#2122](https://github.com/wallabag/wallabag/pull/2122) Fix the deletion of Tags/Entries relation when delete an entry (Jeremy Benoist, Nicolas Lœuillet)
- [#2095](https://github.com/wallabag/wallabag/pull/2095) Fix form user display when 2FA is disabled (Nicolas Lœuillet)
- [#2092](https://github.com/wallabag/wallabag/pull/2092) API: Starred and archived clears if article is already exists (Rurik19)
- [#2097](https://github.com/wallabag/wallabag/issues/2097) Fix image path in 2-factor authentification email (Baptiste Mille-Mathias)
- [#2069](https://github.com/wallabag/wallabag/pull/2069) Do not specify language in Firefox addon link (Merouane Atig)
## [2.0.4] - 2016-05-07
### Added
- [#2016](https://github.com/wallabag/wallabag/pull/2016) Big updates in [our documentation](http://doc.wallabag.org/en/master/) (Nicolas Lœuillet)
- [#2028](https://github.com/wallabag/wallabag/pull/2028) Documentation about android application (Strubbl)
- [#2019](https://github.com/wallabag/wallabag/pull/2019) Italian translation (Daniele Conca)
- [#2011](https://github.com/wallabag/wallabag/pull/2011) Documentation about wallabag upgrade (biva)
- [#1985](https://github.com/wallabag/wallabag/pull/1985) Documentation about rights access (FoxMaSk)
- [#1969](https://github.com/wallabag/wallabag/pull/1969) Third resources for API in documentation (Nicolas Lœuillet)
- [#1967](https://github.com/wallabag/wallabag/pull/1967) FAQ page in documentation (Nicolas Lœuillet)
### Changed
- [#1977](https://github.com/wallabag/wallabag/pull/1977) Spanish documentation (jami7)
### Fixed
- [#2023](https://github.com/wallabag/wallabag/pull/2023) Fix translation for validators (Nicolas Lœuillet)
- [#2020](https://github.com/wallabag/wallabag/pull/2020) Fix number of entries in tag/list (Nicolas Lœuillet)
- [#2022](https://github.com/wallabag/wallabag/pull/2022) Fix pagination bar on small devices (Nicolas Lœuillet)
- [#2013](https://github.com/wallabag/wallabag/pull/2013) Fix tag listing (Nicolas Lœuillet)
- [#1976](https://github.com/wallabag/wallabag/pull/1976) Fix filter reading time (Nicolas Lœuillet)
- [#2005](https://github.com/wallabag/wallabag/pull/2005) Fix reading speed not defined when user was created via config page (Nicolas Lœuillet)
- [#2010](https://github.com/wallabag/wallabag/pull/2010) Set the title via POST /api/entries (Nicolas Lœuillet)
## [2.0.3] - 2016-04-22
### Added
- [#1962](https://github.com/wallabag/wallabag/pull/1962) cURL examples in documentation about API (Dirk Deimeke)
### Fixed
- Forgot `composer.lock` file in 2.0.2 release so some users may encounter `Fatal error: Out of memory` error during installation
## [2.0.2] - 2016-04-21
### Added
- [#1945](https://github.com/wallabag/wallabag/pull/1945) cURL examples in documentation about API (Dirk Deimeke)
- [#1911](https://github.com/wallabag/wallabag/pull/1911) Add title hover on entry titles (Thomas Citharel)
### Changed
- [#1944](https://github.com/wallabag/wallabag/pull/1944), [#1953](https://github.com/wallabag/wallabag/pull/1953), [#1954](https://github.com/wallabag/wallabag/pull/1954) Due to branches renaming, update documentation and configuration (maxi62330, Nicolas Lœuillet)
- [#1942](https://github.com/wallabag/wallabag/pull/1942) Optimize import (Nicolas Lœuillet)
- [#1935](https://github.com/wallabag/wallabag/pull/1935) Update spanish translation (jami7)
- [#1929](https://github.com/wallabag/wallabag/pull/1929) Change guid and link in RSS feeds to give original entry URL (Nicolas Lœuillet)
- [#1918](https://github.com/wallabag/wallabag/pull/1918) Improve pagination when user has lot of entries (Nicolas Lœuillet)
- [#1916](https://github.com/wallabag/wallabag/pull/1916) Change PHP arrays and move test parameters in a separated file (Jeremy Benoist)
### Fixed
- [#1957](https://github.com/wallabag/wallabag/pull/1957) Fix translation for `Go to your account` button (Nicolas Lœuillet)
- [#1925](https://github.com/wallabag/wallabag/pull/1925) Redirect to homepage if refered is null (Nicolas Lœuillet)
- [#1912](https://github.com/wallabag/wallabag/pull/1912) Fix 500 Internal Server Error -> "Setting piwik_enabled couldn't be found" (Jeremy Benoist)
## [2.0.1] - 2016-04-11 ## [2.0.1] - 2016-04-11
### Added ### Added

View File

@ -1,5 +1,5 @@
[![Build Status](https://travis-ci.org/wallabag/wallabag.svg?branch=v2)](https://travis-ci.org/wallabag/wallabag) [![Build Status](https://api.travis-ci.org/wallabag/wallabag.svg?branch=master)](https://travis-ci.org/wallabag/wallabag)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/wallabag/wallabag/badges/quality-score.png?b=v2)](https://scrutinizer-ci.com/g/wallabag/wallabag/?branch=v2) [![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)
[![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/wallabag/wallabag) [![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/wallabag/wallabag)
# What is wallabag? # What is wallabag?
@ -16,7 +16,7 @@ Then you can install wallabag by executing the following commands:
``` ```
git clone https://github.com/wallabag/wallabag.git git clone https://github.com/wallabag/wallabag.git
cd wallabag cd wallabag
git checkout 2.0.1 git checkout 2.0.5
SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
php bin/console wallabag:install --env=prod php bin/console wallabag:install --env=prod
php bin/console server:run --env=prod php bin/console server:run --env=prod

View File

@ -22,19 +22,22 @@ class AppKernel extends Kernel
new Nelmio\ApiDocBundle\NelmioApiDocBundle(), new Nelmio\ApiDocBundle\NelmioApiDocBundle(),
new Nelmio\CorsBundle\NelmioCorsBundle(), new Nelmio\CorsBundle\NelmioCorsBundle(),
new Liip\ThemeBundle\LiipThemeBundle(), new Liip\ThemeBundle\LiipThemeBundle(),
new Wallabag\CoreBundle\WallabagCoreBundle(),
new Wallabag\ApiBundle\WallabagApiBundle(),
new Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle(), new Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle(),
new Lexik\Bundle\FormFilterBundle\LexikFormFilterBundle(), new Lexik\Bundle\FormFilterBundle\LexikFormFilterBundle(),
new FOS\OAuthServerBundle\FOSOAuthServerBundle(), new FOS\OAuthServerBundle\FOSOAuthServerBundle(),
new Wallabag\UserBundle\WallabagUserBundle(),
new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(), new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
new Scheb\TwoFactorBundle\SchebTwoFactorBundle(), new Scheb\TwoFactorBundle\SchebTwoFactorBundle(),
new KPhoen\RulerZBundle\KPhoenRulerZBundle(), new KPhoen\RulerZBundle\KPhoenRulerZBundle(),
new Wallabag\ImportBundle\WallabagImportBundle(),
new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(), new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
new Craue\ConfigBundle\CraueConfigBundle(), new Craue\ConfigBundle\CraueConfigBundle(),
new Lexik\Bundle\MaintenanceBundle\LexikMaintenanceBundle(), new Lexik\Bundle\MaintenanceBundle\LexikMaintenanceBundle(),
new WhiteOctober\PagerfantaBundle\WhiteOctoberPagerfantaBundle(),
// wallabag bundles
new Wallabag\CoreBundle\WallabagCoreBundle(),
new Wallabag\ApiBundle\WallabagApiBundle(),
new Wallabag\UserBundle\WallabagUserBundle(),
new Wallabag\ImportBundle\WallabagImportBundle(),
new Wallabag\AnnotationBundle\WallabagAnnotationBundle(), new Wallabag\AnnotationBundle\WallabagAnnotationBundle(),
]; ];

View File

@ -1,6 +1,6 @@
download_pictures: Descagar imagenes download_pictures: Descargar imágenes
carrot: Activar compartir con Carrot carrot: Activar compartir con Carrot
diaspora_url: Diaspora URL, si el servicio esta activado diaspora_url: Diaspora URL, si el servicio está activado
export_epub: Activar exportación a ePub export_epub: Activar exportación a ePub
export_mobi: Activar exportación a .mobi export_mobi: Activar exportación a .mobi
export_pdf: Activar exportación a PDF export_pdf: Activar exportación a PDF
@ -14,7 +14,7 @@ share_diaspora: Activar compartir con Diaspora
share_mail: Activar compartir con email share_mail: Activar compartir con email
share_shaarli: Activar compartir con Shaarli share_shaarli: Activar compartir con Shaarli
share_twitter: Activar compartir con Twitter share_twitter: Activar compartir con Twitter
show_printlink: Mostrar un link para imprimir contenido show_printlink: Mostrar un enlace para imprimir contenido
wallabag_support_url: URL de soporte de wallabag wallabag_support_url: URL de soporte de wallabag
wallabag_url: URL de *tu* instancia de wallabag wallabag_url: URL de *tu* instancia de wallabag
entry: "artículo" entry: "artículo"

View File

@ -0,0 +1,29 @@
download_pictures: Scarica le immagini sul tuo server
carrot: Abilita la condivisione con Carrot
diaspora_url: Diaspora URL, se il servizio è abilitato
export_epub: Abilita esportazione ePub
export_mobi: Abilita esportazione .mobi
export_pdf: Abilita esportazione PDF
export_csv: Abilita esportazione CSV
export_json: Abilita esportazione JSON
export_txt: Abilita esportazione TXT
export_xml: Abilita esportazione XML
pocket_consumer_key: Consumer key per Pocket per importare i contenuti (https://getpocket.com/developer/docs/authentication)
shaarli_url: Shaarli URL, se il servizio è abilitato
share_diaspora: Abilita la condivisione con Diaspora
share_mail: Abilita la condivisione per email
share_shaarli: Abilita la condivisione con Shaarli
share_twitter: Abilita la condivisione con Twitter
show_printlink: Mostra un collegamento per stampare il contenuto
wallabag_support_url: URL di supporto per wallabag
wallabag_url: URL della *tua* installazione di wallabag
entry: "contenuto"
export: "esporta"
import: "importa"
misc: "misc"
modify_settings: "applica"
piwik_host: Host del tuo sito in Piwik
piwik_site_id: ID del tuo sito in Piwik
piwik_enabled: Abilita Piwik
demo_mode_enabled: "Abilita modalità demo ? (usato solo per la demo pubblica di wallabag)"
demo_mode_username: "Utente Demo"

View File

@ -1,2 +1,2 @@
set :branch, 'v2' set :branch, 'master'
set :deploy_to, '/var/www/v2.wallabag.org/web/' set :deploy_to, '/var/www/v2.wallabag.org/web/'

View File

@ -28,7 +28,7 @@ framework:
assets: ~ assets: ~
wallabag_core: wallabag_core:
version: 2.0.1 version: 2.0.5
paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb" paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
languages: languages:
en: 'English' en: 'English'
@ -41,6 +41,7 @@ wallabag_core:
da: 'Dansk' da: 'Dansk'
es: 'Español' es: 'Español'
oc: 'Occitan' oc: 'Occitan'
it: 'Italiano'
items_on_page: 12 items_on_page: 12
theme: material theme: material
language: en language: en

View File

@ -1,5 +1,6 @@
imports: imports:
- { resource: config_dev.yml } - { resource: config_dev.yml }
- { resource: parameters_test.yml }
framework: framework:
test: ~ test: ~

View File

@ -19,14 +19,6 @@ parameters:
database_path: "%kernel.root_dir%/../data/db/wallabag.sqlite" database_path: "%kernel.root_dir%/../data/db/wallabag.sqlite"
database_table_prefix: wallabag_ database_table_prefix: wallabag_
test_database_driver: pdo_sqlite
test_database_host: 127.0.0.1
test_database_port: ~
test_database_name: ~
test_database_user: ~
test_database_password: ~
test_database_path: "%kernel.root_dir%/../data/db/wallabag_test.sqlite"
mailer_transport: smtp mailer_transport: smtp
mailer_host: 127.0.0.1 mailer_host: 127.0.0.1
mailer_user: ~ mailer_user: ~

View File

@ -0,0 +1,8 @@
parameters:
test_database_driver: pdo_sqlite
test_database_host: 127.0.0.1
test_database_port: null
test_database_name: null
test_database_user: null
test_database_password: null
test_database_path: '%kernel.root_dir%/../data/db/wallabag_testYO.sqlite'

View File

@ -6,7 +6,7 @@ services:
filesystem_cache: filesystem_cache:
class: Doctrine\Common\Cache\FilesystemCache class: Doctrine\Common\Cache\FilesystemCache
arguments: arguments:
- %kernel.cache_dir%/doctrine/metadata - "%kernel.cache_dir%/doctrine/metadata"
twig.extension.text: twig.extension.text:
class: Twig_Extensions_Extension_Text class: Twig_Extensions_Extension_Text

View File

@ -1,37 +0,0 @@
# This file is a "template" of what your parameters.yml file should look like
parameters:
database_driver: pdo_sqlite
database_host: 127.0.0.1
database_port: ~
database_name: symfony
database_user: root
database_password: ~
database_path: "%kernel.root_dir%/../data/db/wallabag.sqlite"
database_table_prefix: wallabag_
test_database_driver: pdo_mysql
test_database_host: localhost
test_database_port: 3306
test_database_name: wallabag_test
test_database_user: root
test_database_password: ~
test_database_path: ~
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: ~
mailer_password: ~
locale: en
# A secret key that's used to generate certain security-related tokens
secret: ThisTokenIsNotSoSecretChangeIt
# two factor stuff
twofactor_auth: true
twofactor_sender: no-reply@wallabag.org
# fosuser stuff
fosuser_confirmation: true
from_email: no-reply@wallabag.org

View File

@ -1,37 +0,0 @@
# This file is a "template" of what your parameters.yml file should look like
parameters:
database_driver: pdo_sqlite
database_host: 127.0.0.1
database_port: ~
database_name: symfony
database_user: root
database_password: ~
database_path: "%kernel.root_dir%/../data/db/wallabag.sqlite"
database_table_prefix: wallabag_
test_database_driver: pdo_pgsql
test_database_host: localhost
test_database_port:
test_database_name: wallabag_test
test_database_user: travis
test_database_password: ~
test_database_path: ~
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: ~
mailer_password: ~
locale: en
# A secret key that's used to generate certain security-related tokens
secret: ThisTokenIsNotSoSecretChangeIt
# two factor stuff
twofactor_auth: true
twofactor_sender: no-reply@wallabag.org
# fosuser stuff
fosuser_confirmation: true
from_email: no-reply@wallabag.org

View File

@ -1,37 +0,0 @@
# This file is a "template" of what your parameters.yml file should look like
parameters:
database_driver: pdo_sqlite
database_host: 127.0.0.1
database_port: ~
database_name: symfony
database_user: root
database_password: ~
database_path: "%kernel.root_dir%/../data/db/wallabag.sqlite"
database_table_prefix: wallabag_
test_database_driver: pdo_sqlite
test_database_host: localhost
test_database_port:
test_database_name: ~
test_database_user: ~
test_database_password: ~
test_database_path: "%kernel.root_dir%/../data/db/wallabag_test.sqlite"
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: ~
mailer_password: ~
locale: en
# A secret key that's used to generate certain security-related tokens
secret: ThisTokenIsNotSoSecretChangeIt
# two factor stuff
twofactor_auth: true
twofactor_sender: no-reply@wallabag.org
# fosuser stuff
fosuser_confirmation: true
from_email: no-reply@wallabag.org

View File

@ -0,0 +1,8 @@
parameters:
test_database_driver: pdo_mysql
test_database_host: localhost
test_database_port: 3306
test_database_name: wallabag_test
test_database_user: root
test_database_password: ~
test_database_path: ~

View File

@ -0,0 +1,8 @@
parameters:
test_database_driver: pdo_pgsql
test_database_host: localhost
test_database_port:
test_database_name: wallabag_test
test_database_user: travis
test_database_password: ~
test_database_path: ~

View File

@ -0,0 +1,8 @@
parameters:
test_database_driver: pdo_sqlite
test_database_host: localhost
test_database_port:
test_database_name: ~
test_database_user: ~
test_database_password: ~
test_database_path: "%kernel.root_dir%/../data/db/wallabag_testHU.sqlite"

View File

@ -42,8 +42,8 @@
<target name="db_mysql" description="Run test for MySQL"> <target name="db_mysql" description="Run test for MySQL">
<delete dir="${basedir}/app/config/parameters.yml"/> <delete dir="${basedir}/app/config/parameters.yml"/>
<exec executable="cp"> <exec executable="cp">
<arg value="${basedir}/app/config/tests/parameters.yml.dist.mysql"/> <arg value="${basedir}/app/config/tests/parameters_test.mysql.yml"/>
<arg value="${basedir}/app/config/parameters.yml"/> <arg value="${basedir}/app/config/parameters_test.yml"/>
</exec> </exec>
<exec executable="php"> <exec executable="php">
@ -56,8 +56,8 @@
<target name="db_sqlite" description="Run test for SQLite"> <target name="db_sqlite" description="Run test for SQLite">
<delete dir="${basedir}/app/config/parameters.yml"/> <delete dir="${basedir}/app/config/parameters.yml"/>
<exec executable="cp"> <exec executable="cp">
<arg value="${basedir}/app/config/tests/parameters.yml.dist.sqlite"/> <arg value="${basedir}/app/config/tests/parameters_test.sqlite.yml"/>
<arg value="${basedir}/app/config/parameters.yml"/> <arg value="${basedir}/app/config/parameters_test.yml"/>
</exec> </exec>
<exec executable="php"> <exec executable="php">
@ -70,8 +70,8 @@
<target name="db_pgsql" description="Run test for PostgreSQL"> <target name="db_pgsql" description="Run test for PostgreSQL">
<delete dir="${basedir}/app/config/parameters.yml"/> <delete dir="${basedir}/app/config/parameters.yml"/>
<exec executable="cp"> <exec executable="cp">
<arg value="${basedir}/app/config/tests/parameters.yml.dist.pgsql"/> <arg value="${basedir}/app/config/tests/parameters_test.pgsql.yml"/>
<arg value="${basedir}/app/config/parameters.yml"/> <arg value="${basedir}/app/config/parameters_test.yml"/>
</exec> </exec>
<exec executable="php"> <exec executable="php">

View File

@ -58,7 +58,6 @@
"friendsofsymfony/rest-bundle": "~1.4", "friendsofsymfony/rest-bundle": "~1.4",
"jms/serializer-bundle": "~1.0", "jms/serializer-bundle": "~1.0",
"nelmio/api-doc-bundle": "~2.7", "nelmio/api-doc-bundle": "~2.7",
"ezyang/htmlpurifier": "~4.6",
"mgargano/simplehtmldom": "~1.5", "mgargano/simplehtmldom": "~1.5",
"tecnickcom/tcpdf": "~6.2", "tecnickcom/tcpdf": "~6.2",
"simplepie/simplepie": "~1.3.1", "simplepie/simplepie": "~1.3.1",
@ -81,7 +80,8 @@
"craue/config-bundle": "~1.4", "craue/config-bundle": "~1.4",
"mnapoli/piwik-twig-extension": "^1.0", "mnapoli/piwik-twig-extension": "^1.0",
"lexik/maintenance-bundle": "~2.1", "lexik/maintenance-bundle": "~2.1",
"ocramius/proxy-manager": "1.*" "ocramius/proxy-manager": "1.*",
"white-october/pagerfanta-bundle": "^1.0"
}, },
"require-dev": { "require-dev": {
"doctrine/doctrine-fixtures-bundle": "~2.2", "doctrine/doctrine-fixtures-bundle": "~2.2",

397
composer.lock generated
View File

@ -4,8 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"hash": "ba30b73585f433f82b458cbc382ad137", "hash": "13098bd7c43a673e99a14d6ed8148962",
"content-hash": "241710c2b913269e8e7dff9edb379cef", "content-hash": "ed86235df64938684b50427919c0aea7",
"packages": [ "packages": [
{ {
"name": "behat/transliterator", "name": "behat/transliterator",
@ -1004,50 +1004,6 @@
], ],
"time": "2016-01-05 21:34:58" "time": "2016-01-05 21:34:58"
}, },
{
"name": "ezyang/htmlpurifier",
"version": "v4.7.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "ae1828d955112356f7677c465f94f7deb7d27a40"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40",
"reference": "ae1828d955112356f7677c465f94f7deb7d27a40",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
"type": "library",
"autoload": {
"psr-0": {
"HTMLPurifier": "library/"
},
"files": [
"library/HTMLPurifier.composer.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL"
],
"authors": [
{
"name": "Edward Z. Yang",
"email": "admin@htmlpurifier.org",
"homepage": "http://ezyang.com"
}
],
"description": "Standards compliant HTML filter written in PHP",
"homepage": "http://htmlpurifier.org/",
"keywords": [
"html"
],
"time": "2015-08-05 01:03:42"
},
{ {
"name": "friendsofsymfony/oauth-server-bundle", "name": "friendsofsymfony/oauth-server-bundle",
"version": "1.5.2", "version": "1.5.2",
@ -1122,16 +1078,16 @@
}, },
{ {
"name": "friendsofsymfony/oauth2-php", "name": "friendsofsymfony/oauth2-php",
"version": "1.2.0", "version": "1.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FriendsOfSymfony/oauth2-php.git", "url": "https://github.com/FriendsOfSymfony/oauth2-php.git",
"reference": "4ae0a2aa85566146ef6f0f7169854c49e0c9243a" "reference": "fa2aecb1fca2a03fd5f9aca19fe9adb9dfff928c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FriendsOfSymfony/oauth2-php/zipball/4ae0a2aa85566146ef6f0f7169854c49e0c9243a", "url": "https://api.github.com/repos/FriendsOfSymfony/oauth2-php/zipball/fa2aecb1fca2a03fd5f9aca19fe9adb9dfff928c",
"reference": "4ae0a2aa85566146ef6f0f7169854c49e0c9243a", "reference": "fa2aecb1fca2a03fd5f9aca19fe9adb9dfff928c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1144,7 +1100,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1.x-dev" "dev-master": "1.2.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -1172,7 +1128,7 @@
"oauth", "oauth",
"oauth2" "oauth2"
], ],
"time": "2015-12-21 11:32:17" "time": "2016-03-31 14:24:17"
}, },
{ {
"name": "friendsofsymfony/rest-bundle", "name": "friendsofsymfony/rest-bundle",
@ -1266,12 +1222,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git", "url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git",
"reference": "16b04c49af05dd3fb381e4abe04f0e5e231ac76d" "reference": "d1fccc6335b74beca94525551cacc06b256ed261"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/16b04c49af05dd3fb381e4abe04f0e5e231ac76d", "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/d1fccc6335b74beca94525551cacc06b256ed261",
"reference": "16b04c49af05dd3fb381e4abe04f0e5e231ac76d", "reference": "d1fccc6335b74beca94525551cacc06b256ed261",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1327,7 +1283,7 @@
"keywords": [ "keywords": [
"User management" "User management"
], ],
"time": "2016-03-08 11:05:28" "time": "2016-05-27 12:14:43"
}, },
{ {
"name": "gedmo/doctrine-extensions", "name": "gedmo/doctrine-extensions",
@ -2178,16 +2134,16 @@
}, },
{ {
"name": "hoa/math", "name": "hoa/math",
"version": "1.16.01.29", "version": "1.16.05.22",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/hoaproject/Math.git", "url": "https://github.com/hoaproject/Math.git",
"reference": "1997df8aeb2b2f8706cfef3b2c2c665efc2689fa" "reference": "f3bcd84f4c6e3ba1c994969bd5163336500f20c8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/hoaproject/Math/zipball/1997df8aeb2b2f8706cfef3b2c2c665efc2689fa", "url": "https://api.github.com/repos/hoaproject/Math/zipball/f3bcd84f4c6e3ba1c994969bd5163336500f20c8",
"reference": "1997df8aeb2b2f8706cfef3b2c2c665efc2689fa", "reference": "f3bcd84f4c6e3ba1c994969bd5163336500f20c8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2239,7 +2195,7 @@
"sampler", "sampler",
"set" "set"
], ],
"time": "2016-01-29 15:25:18" "time": "2016-05-22 14:07:26"
}, },
{ {
"name": "hoa/protocol", "name": "hoa/protocol",
@ -2742,16 +2698,16 @@
}, },
{ {
"name": "j0k3r/graby", "name": "j0k3r/graby",
"version": "1.3.0", "version": "1.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/j0k3r/graby.git", "url": "https://github.com/j0k3r/graby.git",
"reference": "461731eb9c2db848ec102b473703cb6f4220f589" "reference": "d4b8d3c4f55c8f7fbf5bccd8822c321bf6b9a147"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/j0k3r/graby/zipball/461731eb9c2db848ec102b473703cb6f4220f589", "url": "https://api.github.com/repos/j0k3r/graby/zipball/d4b8d3c4f55c8f7fbf5bccd8822c321bf6b9a147",
"reference": "461731eb9c2db848ec102b473703cb6f4220f589", "reference": "d4b8d3c4f55c8f7fbf5bccd8822c321bf6b9a147",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2766,7 +2722,8 @@
"php": ">=5.4", "php": ">=5.4",
"simplepie/simplepie": "^1.3.1", "simplepie/simplepie": "^1.3.1",
"smalot/pdfparser": "~0.9.24", "smalot/pdfparser": "~0.9.24",
"symfony/options-resolver": "~2.6|~3.0" "symfony/options-resolver": "~2.6|~3.0",
"true/punycode": "~2.0"
}, },
"require-dev": { "require-dev": {
"satooshi/php-coveralls": "~0.6" "satooshi/php-coveralls": "~0.6"
@ -2794,20 +2751,20 @@
} }
], ],
"description": "Graby helps you extract article content from web pages", "description": "Graby helps you extract article content from web pages",
"time": "2016-02-12 08:30:42" "time": "2016-04-24 18:43:00"
}, },
{ {
"name": "j0k3r/graby-site-config", "name": "j0k3r/graby-site-config",
"version": "1.0.16", "version": "1.0.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/j0k3r/graby-site-config.git", "url": "https://github.com/j0k3r/graby-site-config.git",
"reference": "553fb65e75f2df9514f606758f105855994abaec" "reference": "a401b6ee2f3e4b20315b7ba2e1be03ff5ecb0a5a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/j0k3r/graby-site-config/zipball/553fb65e75f2df9514f606758f105855994abaec", "url": "https://api.github.com/repos/j0k3r/graby-site-config/zipball/a401b6ee2f3e4b20315b7ba2e1be03ff5ecb0a5a",
"reference": "553fb65e75f2df9514f606758f105855994abaec", "reference": "a401b6ee2f3e4b20315b7ba2e1be03ff5ecb0a5a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2830,7 +2787,7 @@
} }
], ],
"description": "Graby site config files", "description": "Graby site config files",
"time": "2016-04-10 19:15:54" "time": "2016-05-31 15:44:51"
}, },
{ {
"name": "j0k3r/php-readability", "name": "j0k3r/php-readability",
@ -3430,16 +3387,16 @@
}, },
{ {
"name": "lexik/form-filter-bundle", "name": "lexik/form-filter-bundle",
"version": "v5.0.0", "version": "v5.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/lexik/LexikFormFilterBundle.git", "url": "https://github.com/lexik/LexikFormFilterBundle.git",
"reference": "dbc3c81600d2334a3408b37dccc3627d2019472c" "reference": "1eb8f523a607f5c2fac947af363ceb8beca5a57c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/lexik/LexikFormFilterBundle/zipball/dbc3c81600d2334a3408b37dccc3627d2019472c", "url": "https://api.github.com/repos/lexik/LexikFormFilterBundle/zipball/1eb8f523a607f5c2fac947af363ceb8beca5a57c",
"reference": "dbc3c81600d2334a3408b37dccc3627d2019472c", "reference": "1eb8f523a607f5c2fac947af363ceb8beca5a57c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3486,7 +3443,7 @@
"filter", "filter",
"form" "form"
], ],
"time": "2016-01-11 17:05:05" "time": "2016-04-20 08:53:41"
}, },
{ {
"name": "lexik/maintenance-bundle", "name": "lexik/maintenance-bundle",
@ -3737,16 +3694,16 @@
}, },
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "1.18.2", "version": "1.19.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Seldaek/monolog.git", "url": "https://github.com/Seldaek/monolog.git",
"reference": "064b38c16790249488e7a8b987acf1c9d7383c09" "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/064b38c16790249488e7a8b987acf1c9d7383c09", "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5f56ed5212dc509c8dc8caeba2715732abb32dbf",
"reference": "064b38c16790249488e7a8b987acf1c9d7383c09", "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3811,7 +3768,7 @@
"logging", "logging",
"psr-3" "psr-3"
], ],
"time": "2016-04-02 13:12:58" "time": "2016-04-12 18:29:35"
}, },
{ {
"name": "neitanod/forceutf8", "name": "neitanod/forceutf8",
@ -4368,16 +4325,16 @@
}, },
{ {
"name": "react/promise", "name": "react/promise",
"version": "v2.4.0", "version": "v2.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/promise.git", "url": "https://github.com/reactphp/promise.git",
"reference": "f942da7b505d1a294284ab343d05df42d02ad6d9" "reference": "8025426794f1944de806618671d4fa476dc7626f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/promise/zipball/f942da7b505d1a294284ab343d05df42d02ad6d9", "url": "https://api.github.com/repos/reactphp/promise/zipball/8025426794f1944de806618671d4fa476dc7626f",
"reference": "f942da7b505d1a294284ab343d05df42d02ad6d9", "reference": "8025426794f1944de806618671d4fa476dc7626f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4408,24 +4365,24 @@
} }
], ],
"description": "A lightweight implementation of CommonJS Promises/A for PHP", "description": "A lightweight implementation of CommonJS Promises/A for PHP",
"time": "2016-03-31 13:10:33" "time": "2016-05-03 17:50:52"
}, },
{ {
"name": "scheb/two-factor-bundle", "name": "scheb/two-factor-bundle",
"version": "v2.2.0", "version": "v2.2.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/scheb/two-factor-bundle.git", "url": "https://github.com/scheb/two-factor-bundle.git",
"reference": "524faa717bdc3c8823e045e8fd8c23b6a2b4dcac" "reference": "d975936b9c3c98788c15508c188c89b71def8924"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/scheb/two-factor-bundle/zipball/524faa717bdc3c8823e045e8fd8c23b6a2b4dcac", "url": "https://api.github.com/repos/scheb/two-factor-bundle/zipball/d975936b9c3c98788c15508c188c89b71def8924",
"reference": "524faa717bdc3c8823e045e8fd8c23b6a2b4dcac", "reference": "d975936b9c3c98788c15508c188c89b71def8924",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"paragonie/random_compat": "~1.0", "paragonie/random_compat": "~1.0|~2.0",
"sonata-project/google-authenticator": "~1.0", "sonata-project/google-authenticator": "~1.0",
"symfony/symfony": "~2.6|~3.0" "symfony/symfony": "~2.6|~3.0"
}, },
@ -4459,20 +4416,20 @@
"two-factor", "two-factor",
"two-step" "two-step"
], ],
"time": "2016-03-21 14:47:17" "time": "2016-05-24 09:03:10"
}, },
{ {
"name": "sensio/distribution-bundle", "name": "sensio/distribution-bundle",
"version": "v5.0.5", "version": "v5.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sensiolabs/SensioDistributionBundle.git", "url": "https://github.com/sensiolabs/SensioDistributionBundle.git",
"reference": "3a160355bb1364da55ed9e415c1aa1fa8d457b6f" "reference": "ffe306d09c1f2bad721237f63b2169d1b78253d0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/3a160355bb1364da55ed9e415c1aa1fa8d457b6f", "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/ffe306d09c1f2bad721237f63b2169d1b78253d0",
"reference": "3a160355bb1364da55ed9e415c1aa1fa8d457b6f", "reference": "ffe306d09c1f2bad721237f63b2169d1b78253d0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4511,7 +4468,7 @@
"configuration", "configuration",
"distribution" "distribution"
], ],
"time": "2016-03-15 16:21:41" "time": "2016-04-25 20:50:31"
}, },
{ {
"name": "sensio/framework-extra-bundle", "name": "sensio/framework-extra-bundle",
@ -4829,16 +4786,16 @@
}, },
{ {
"name": "swiftmailer/swiftmailer", "name": "swiftmailer/swiftmailer",
"version": "v5.4.1", "version": "v5.4.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git", "url": "https://github.com/swiftmailer/swiftmailer.git",
"reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421" "reference": "d8db871a54619458a805229a057ea2af33c753e8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421", "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/d8db871a54619458a805229a057ea2af33c753e8",
"reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421", "reference": "d8db871a54619458a805229a057ea2af33c753e8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4878,7 +4835,7 @@
"mail", "mail",
"mailer" "mailer"
], ],
"time": "2015-06-06 14:19:39" "time": "2016-05-01 08:45:47"
}, },
{ {
"name": "symfony/assetic-bundle", "name": "symfony/assetic-bundle",
@ -4952,20 +4909,20 @@
}, },
{ {
"name": "symfony/monolog-bundle", "name": "symfony/monolog-bundle",
"version": "v2.10.0", "version": "2.11.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/monolog-bundle.git", "url": "https://github.com/symfony/monolog-bundle.git",
"reference": "82fd8f36e2cccbe94faf237403c48052d4d4b77e" "reference": "e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/82fd8f36e2cccbe94faf237403c48052d4d4b77e", "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00",
"reference": "82fd8f36e2cccbe94faf237403c48052d4d4b77e", "reference": "e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"monolog/monolog": "~1.12", "monolog/monolog": "~1.18",
"php": ">=5.3.2", "php": ">=5.3.2",
"symfony/config": "~2.3|~3.0", "symfony/config": "~2.3|~3.0",
"symfony/dependency-injection": "~2.3|~3.0", "symfony/dependency-injection": "~2.3|~3.0",
@ -4980,7 +4937,7 @@
"type": "symfony-bundle", "type": "symfony-bundle",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "2.9.x-dev" "dev-master": "2.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -5008,20 +4965,20 @@
"log", "log",
"logging" "logging"
], ],
"time": "2016-03-13 15:55:56" "time": "2016-04-13 16:21:01"
}, },
{ {
"name": "symfony/polyfill-intl-icu", "name": "symfony/polyfill-intl-icu",
"version": "v1.1.1", "version": "v1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-icu.git", "url": "https://github.com/symfony/polyfill-intl-icu.git",
"reference": "8328069d9f5322f0e7b3c3518485acfdc94c3942" "reference": "0f8dc2c45f69f8672379e9210bca4a115cd5146f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/8328069d9f5322f0e7b3c3518485acfdc94c3942", "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/0f8dc2c45f69f8672379e9210bca4a115cd5146f",
"reference": "8328069d9f5322f0e7b3c3518485acfdc94c3942", "reference": "0f8dc2c45f69f8672379e9210bca4a115cd5146f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5034,7 +4991,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1-dev" "dev-master": "1.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5066,20 +5023,20 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2016-02-26 16:18:12" "time": "2016-05-18 14:26:46"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.1.1", "version": "v1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "1289d16209491b584839022f29257ad859b8532d" "reference": "dff51f72b0706335131b00a7f49606168c582594"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
"reference": "1289d16209491b584839022f29257ad859b8532d", "reference": "dff51f72b0706335131b00a7f49606168c582594",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5091,7 +5048,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1-dev" "dev-master": "1.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5125,20 +5082,20 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2016-01-20 09:13:37" "time": "2016-05-18 14:26:46"
}, },
{ {
"name": "symfony/polyfill-php56", "name": "symfony/polyfill-php56",
"version": "v1.1.1", "version": "v1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php56.git", "url": "https://github.com/symfony/polyfill-php56.git",
"reference": "4d891fff050101a53a4caabb03277284942d1ad9" "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/4d891fff050101a53a4caabb03277284942d1ad9", "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a",
"reference": "4d891fff050101a53a4caabb03277284942d1ad9", "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5148,7 +5105,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1-dev" "dev-master": "1.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5181,30 +5138,30 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2016-01-20 09:13:37" "time": "2016-05-18 14:26:46"
}, },
{ {
"name": "symfony/polyfill-php70", "name": "symfony/polyfill-php70",
"version": "v1.1.1", "version": "v1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php70.git", "url": "https://github.com/symfony/polyfill-php70.git",
"reference": "386c1be9cad3ab531425211919e78c37971be4ce" "reference": "a42f4b6b05ed458910f8af4c4e1121b0101b2d85"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/386c1be9cad3ab531425211919e78c37971be4ce", "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/a42f4b6b05ed458910f8af4c4e1121b0101b2d85",
"reference": "386c1be9cad3ab531425211919e78c37971be4ce", "reference": "a42f4b6b05ed458910f8af4c4e1121b0101b2d85",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"paragonie/random_compat": "~1.0", "paragonie/random_compat": "~1.0|~2.0",
"php": ">=5.3.3" "php": ">=5.3.3"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1-dev" "dev-master": "1.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5240,20 +5197,20 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2016-01-28 22:42:02" "time": "2016-05-18 14:26:46"
}, },
{ {
"name": "symfony/polyfill-util", "name": "symfony/polyfill-util",
"version": "v1.1.1", "version": "v1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-util.git", "url": "https://github.com/symfony/polyfill-util.git",
"reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4" "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99",
"reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5262,7 +5219,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1-dev" "dev-master": "1.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5292,7 +5249,7 @@
"polyfill", "polyfill",
"shim" "shim"
], ],
"time": "2016-01-20 09:13:37" "time": "2016-05-18 14:26:46"
}, },
{ {
"name": "symfony/swiftmailer-bundle", "name": "symfony/swiftmailer-bundle",
@ -5353,16 +5310,16 @@
}, },
{ {
"name": "symfony/symfony", "name": "symfony/symfony",
"version": "v3.0.4", "version": "v3.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/symfony.git", "url": "https://github.com/symfony/symfony.git",
"reference": "4e17cb2ecb3fd637097ebeb871fc0e2cbdd5e7ff" "reference": "a821ed51b87f5ceda834140e5f0c06e9547a86d4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/symfony/zipball/4e17cb2ecb3fd637097ebeb871fc0e2cbdd5e7ff", "url": "https://api.github.com/repos/symfony/symfony/zipball/a821ed51b87f5ceda834140e5f0c06e9547a86d4",
"reference": "4e17cb2ecb3fd637097ebeb871fc0e2cbdd5e7ff", "reference": "a821ed51b87f5ceda834140e5f0c06e9547a86d4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5445,7 +5402,11 @@
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Symfony\\Bridge\\": "src/Symfony/Bridge/", "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/",
"Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/",
"Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/",
"Symfony\\Bridge\\Swiftmailer\\": "src/Symfony/Bridge/Swiftmailer/",
"Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/",
"Symfony\\Bundle\\": "src/Symfony/Bundle/", "Symfony\\Bundle\\": "src/Symfony/Bundle/",
"Symfony\\Component\\": "src/Symfony/Component/" "Symfony\\Component\\": "src/Symfony/Component/"
}, },
@ -5475,7 +5436,7 @@
"keywords": [ "keywords": [
"framework" "framework"
], ],
"time": "2016-03-30 10:41:14" "time": "2016-05-09 22:13:31"
}, },
{ {
"name": "tecnickcom/tcpdf", "name": "tecnickcom/tcpdf",
@ -5540,6 +5501,52 @@
], ],
"time": "2015-09-12 10:08:34" "time": "2015-09-12 10:08:34"
}, },
{
"name": "true/punycode",
"version": "v2.0.3",
"source": {
"type": "git",
"url": "https://github.com/true/php-punycode.git",
"reference": "6853ce218b6115ec749607e14ac51338920c9d81"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/true/php-punycode/zipball/6853ce218b6115ec749607e14ac51338920c9d81",
"reference": "6853ce218b6115ec749607e14ac51338920c9d81",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "~4.7",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"TrueBV\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Renan Gonçalves",
"email": "renan.saddam@gmail.com"
}
],
"description": "A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)",
"homepage": "https://github.com/true/php-punycode",
"keywords": [
"idna",
"punycode"
],
"time": "2016-05-23 08:20:50"
},
{ {
"name": "twig/extensions", "name": "twig/extensions",
"version": "v1.3.0", "version": "v1.3.0",
@ -5594,16 +5601,16 @@
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v1.24.0", "version": "v1.24.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "3e5aa30ebfbafd5951fb1b01e338e1800ce7e0e8" "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/3e5aa30ebfbafd5951fb1b01e338e1800ce7e0e8", "url": "https://api.github.com/repos/twigphp/Twig/zipball/3566d311a92aae4deec6e48682dc5a4528c4a512",
"reference": "3e5aa30ebfbafd5951fb1b01e338e1800ce7e0e8", "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5651,7 +5658,7 @@
"keywords": [ "keywords": [
"templating" "templating"
], ],
"time": "2016-01-25 21:22:18" "time": "2016-05-30 09:11:59"
}, },
{ {
"name": "wallabag/php-mobi", "name": "wallabag/php-mobi",
@ -5700,17 +5707,69 @@
"time": "2015-10-16 08:42:42" "time": "2015-10-16 08:42:42"
}, },
{ {
"name": "willdurand/hateoas", "name": "white-october/pagerfanta-bundle",
"version": "2.9.1", "version": "v1.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/willdurand/Hateoas.git", "url": "https://github.com/whiteoctober/WhiteOctoberPagerfantaBundle.git",
"reference": "1add9a4448793cf40b52544136532b9752e06d7b" "reference": "ada62843d9ba0d3aa61d0dcc7becdb25a2e2f545"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/willdurand/Hateoas/zipball/1add9a4448793cf40b52544136532b9752e06d7b", "url": "https://api.github.com/repos/whiteoctober/WhiteOctoberPagerfantaBundle/zipball/ada62843d9ba0d3aa61d0dcc7becdb25a2e2f545",
"reference": "1add9a4448793cf40b52544136532b9752e06d7b", "reference": "ada62843d9ba0d3aa61d0dcc7becdb25a2e2f545",
"shasum": ""
},
"require": {
"pagerfanta/pagerfanta": "1.0.*",
"symfony/framework-bundle": "~2.3|~3.0",
"symfony/property-access": "~2.3|~3.0",
"symfony/twig-bundle": "~2.3|~3.0"
},
"require-dev": {
"phpunit/phpunit": "~3.7",
"symfony/symfony": "~2.3|~3.0"
},
"type": "symfony-bundle",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"WhiteOctober\\PagerfantaBundle\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Pablo Díez",
"email": "pablodip@gmail.com"
}
],
"description": "Bundle to use Pagerfanta with Symfony2",
"keywords": [
"page",
"paging"
],
"time": "2016-03-16 19:24:56"
},
{
"name": "willdurand/hateoas",
"version": "2.10.0",
"source": {
"type": "git",
"url": "https://github.com/willdurand/Hateoas.git",
"reference": "ada89d867e47040f8c4be3be2c8e7930a3d01189"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/willdurand/Hateoas/zipball/ada89d867e47040f8c4be3be2c8e7930a3d01189",
"reference": "ada89d867e47040f8c4be3be2c8e7930a3d01189",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5738,7 +5797,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "2.9-dev" "dev-master": "2.10-dev"
} }
}, },
"autoload": { "autoload": {
@ -5761,7 +5820,7 @@
} }
], ],
"description": "A PHP library to support implementing representations for HATEOAS REST web services", "description": "A PHP library to support implementing representations for HATEOAS REST web services",
"time": "2016-01-26 15:39:06" "time": "2016-05-19 11:30:35"
}, },
{ {
"name": "willdurand/hateoas-bundle", "name": "willdurand/hateoas-bundle",
@ -5907,27 +5966,27 @@
}, },
{ {
"name": "zendframework/zend-code", "name": "zendframework/zend-code",
"version": "2.6.2", "version": "2.6.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/zendframework/zend-code.git", "url": "https://github.com/zendframework/zend-code.git",
"reference": "c4e8f976a772cfb14b47dabd69b5245a423082b4" "reference": "95033f061b083e16cdee60530ec260d7d628b887"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/zendframework/zend-code/zipball/c4e8f976a772cfb14b47dabd69b5245a423082b4", "url": "https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887",
"reference": "c4e8f976a772cfb14b47dabd69b5245a423082b4", "reference": "95033f061b083e16cdee60530ec260d7d628b887",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.5", "php": "^5.5 || 7.0.0 - 7.0.4 || ^7.0.6",
"zendframework/zend-eventmanager": "^2.6|^3.0" "zendframework/zend-eventmanager": "^2.6 || ^3.0"
}, },
"require-dev": { "require-dev": {
"doctrine/annotations": "~1.0", "doctrine/annotations": "~1.0",
"fabpot/php-cs-fixer": "1.7.*", "fabpot/php-cs-fixer": "1.7.*",
"phpunit/phpunit": "~4.0", "phpunit/phpunit": "^4.8.21",
"zendframework/zend-stdlib": "~2.7" "zendframework/zend-stdlib": "^2.7 || ^3.0"
}, },
"suggest": { "suggest": {
"doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
@ -5955,7 +6014,7 @@
"code", "code",
"zf2" "zf2"
], ],
"time": "2016-01-05 05:58:37" "time": "2016-04-20 17:26:42"
}, },
{ {
"name": "zendframework/zend-eventmanager", "name": "zendframework/zend-eventmanager",

View File

View File

@ -69,6 +69,12 @@ You'll have this in return:
We'll work with the ``access_token`` value in our next calls. We'll work with the ``access_token`` value in our next calls.
cURL example:
::
curl -s "https://localhost:8000/oauth/v2/token?grant_type=password&client_id=1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc&client_secret=636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4&username=wallabag&password=wallabag"
Getting existing entries Getting existing entries
------------------------ ------------------------
@ -120,6 +126,12 @@ returns:
The ``items`` array is empty. The ``items`` array is empty.
cURL example:
::
curl --get "https://localhost:8000/api/entries.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
Adding your first entry Adding your first entry
----------------------- -----------------------
@ -174,6 +186,12 @@ returns
Now, if you execute the previous command (see **Get existing entries**), you'll have data. Now, if you execute the previous command (see **Get existing entries**), you'll have data.
cURL example:
::
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"
Deleting an entry Deleting an entry
----------------- -----------------
@ -227,9 +245,25 @@ returns
And if you want to list the existing entries (see **Get existing entries**), the array is empty. And if you want to list the existing entries (see **Get existing entries**), the array is empty.
cURL example:
::
curl --request DELETE "https://localhost:8000/api/entries/1.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
Other methods Other methods
------------- -------------
We won't write samples for each API method. We won't write samples for each API method.
Have a look on the listing here: http://localhost:8000/api/doc to know each method. Have a look on the listing here: http://localhost:8000/api/doc to know each method.
Third party resources
---------------
Some applications or libraries use our API. Here is a non-exhaustive list of them:
- `Java wrapper for the wallabag API <https://github.com/Strubbl/wallabag-java>`_ by Strubbl.
- `.NET library for the wallabag v2 API <https://github.com/jlnostr/wallabag-api>`_ by Julian Oster.
- `Python API for wallabag <https://github.com/foxmask/wallabag_api>`_ by FoxMaSk, for his project `Trigger Happy <https://blog.trigger-happy.eu/>`_.
- `A plugin <https://github.com/joshp23/ttrss-to-wallabag-v2>`_ designed for `Tiny Tiny RSS <https://tt-rss.org/gitlab/fox/tt-rss/wikis/home>`_ that makes use of the wallabag v2 API. By Josh Panter.

View File

@ -0,0 +1,12 @@
Contribute to this documentation
================================
Sources of our documentation are here https://github.com/wallabag/wallabag/tree/master/docs
We use `ReadTheDocs
<https://readthedocs.org>`__ to generate it.
Pages are written in `Restructured Text
<https://en.wikipedia.org/wiki/ReStructuredText>`__ format. You can use online tools like http://rst.aaroniles.net/ or http://rst.ninjs.org/ to preview your articles.
If you create a new page, don't forget to edit the `index.rst <https://raw.githubusercontent.com/wallabag/wallabag/master/docs/en/index.rst>`__ file to add a link in the sidebar.

View File

@ -12,15 +12,15 @@ Translation files
As wallabag is mainly developed by a French team, please consider that french As wallabag is mainly developed by a French team, please consider that french
translation is the most updated one and please copy it to create your own translation. translation is the most updated one and please copy it to create your own translation.
You can find translation files here: https://github.com/wallabag/wallabag/tree/v2/src/Wallabag/CoreBundle/Resources/translations. You can find translation files here: https://github.com/wallabag/wallabag/tree/master/src/Wallabag/CoreBundle/Resources/translations.
You have to create ``messages.CODE.yml``, where CODE You have to create ``messages.CODE.yml`` and ``validators.CODE.yml``, where CODE
is the ISO 639-1 code of your language (`see wikipedia <https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes>`__). is the ISO 639-1 code of your language (`see wikipedia <https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes>`__).
Other files to translate: Other files to translate:
- https://github.com/wallabag/wallabag/tree/v2/app/Resources/CraueConfigBundle/translations. - https://github.com/wallabag/wallabag/tree/master/app/Resources/CraueConfigBundle/translations.
- https://github.com/wallabag/wallabag/tree/v2/app/Resources/FOSUserBundle/translations. - https://github.com/wallabag/wallabag/tree/master/app/Resources/FOSUserBundle/translations.
You have to create ``THE_TRANSLATION_FILE.CODE.yml`` files. You have to create ``THE_TRANSLATION_FILE.CODE.yml`` files.
@ -28,7 +28,7 @@ Configuration file
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
You have to edit `app/config/config.yml You have to edit `app/config/config.yml
<https://github.com/wallabag/wallabag/blob/v2/app/config/config.yml>`__ to display <https://github.com/wallabag/wallabag/blob/master/app/config/config.yml>`__ to display
your language on Configuration page of wallabag (to allow users to switch to this new translation). your language on Configuration page of wallabag (to allow users to switch to this new translation).
Under the ``wallabag_core.languages`` section, you have to add a new line with Under the ``wallabag_core.languages`` section, you have to add a new line with
@ -55,6 +55,6 @@ wallabag documentation
Contrary to the web application, the main language for documentation is english. Contrary to the web application, the main language for documentation is english.
Documentation files are stored here: https://github.com/wallabag/wallabag/tree/v2/docs Documentation files are stored here: https://github.com/wallabag/wallabag/tree/master/docs
You need to respect the ``en`` folder structure when you create your own translation. You need to respect the ``en`` folder structure when you create your own translation.

View File

@ -8,7 +8,7 @@ wallabag documentation
**wallabag** is a read-it-later application: it saves a web page by **wallabag** is a read-it-later application: it saves a web page by
keeping content only. Elements like navigation or ads are deleted. keeping content only. Elements like navigation or ads are deleted.
.. note:: .. tip::
This documentation is about wallabag v2. If you want to read documentation for wallabag v1, `please have a look here <https://github.com/wallabag/documentation>`__. This documentation is about wallabag v2. If you want to read documentation for wallabag v1, `please have a look here <https://github.com/wallabag/documentation>`__.
@ -23,18 +23,21 @@ The main documentation for this application is organized into a couple sections:
:maxdepth: 2 :maxdepth: 2
:caption: User documentation :caption: User documentation
user/faq
user/installation user/installation
user/upgrade
user/migration user/migration
user/import
user/create_account user/create_account
user/login user/login
user/configuration user/configuration
user/first_article user/first_article
user/errors_during_fetching user/errors_during_fetching
user/annotations user/annotations
user/import
user/download_articles user/download_articles
user/filters user/filters
user/tags user/tags
user/android
.. _dev-docs: .. _dev-docs:
@ -44,5 +47,6 @@ The main documentation for this application is organized into a couple sections:
developer/api developer/api
developer/docker developer/docker
developer/documentation
developer/translate developer/translate
developer/maintenance developer/maintenance

107
docs/en/user/android.rst Normal file
View File

@ -0,0 +1,107 @@
Android App
===========
Purpose of this document
------------------------
This document describes how you can setup your Android application to work with your wallabag instance. There is no difference in this procedure for wallabag v1 or v2.
Steps to configure your app
---------------------------
When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first.
.. image:: ../../img/user/android_welcome_screen.en.png
:alt: Welcome screen
:align: center
Just confirm that message and you get redirected to the settings screen.
.. image:: ../../img/user/android_configuration_screen.en.png
:alt: Settings screen
:align: center
Fill 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.
.. image:: ../../img/user/android_configuration_filled_in.en.png
:alt: Filled in settings
:align: center
After you have filled in your data, push the button Connection test and wait for the test to finish.
.. image:: ../../img/user/android_configuration_connection_test.en.png
:alt: Connection test with your wallabag data
:align: center
The connection test shall finish with success. If not, you need to fix this first until you proceed.
.. image:: ../../img/user/android_configuration_connection_test_success.en.png
:alt: Connection test successful
:align: center
After 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.
.. image:: ../../img/user/android_configuration_get_feed_credentials.en.png
:alt: Getting the feed credentials
:align: center
When 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.
.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
:alt: Getting feed credentials successful
:align: center
Now 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.
.. image:: ../../img/user/android_configuration_scroll_bottom.en.png
:alt: Bottom of the settings screen
:align: center
After 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.
.. image:: ../../img/user/android_configuration_saved_feed_update.en.png
:alt: Settings saved the first time
:align: center
Finally after the syncronisation finished successfully, you are presented the list of unread articles.
.. image:: ../../img/user/android_unread_feed_synced.en.png
:alt: Filled article list cause feeds successfully syncronized
:align: center
Known limitations
----
2FA
~~~
Currently the does not support two-factor authentication. You should disable that to get the app working.
Limited amount of articles with wallabag v2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In your wallabag web instance you can configure how many items are part of the RSS feed. This option did not exist in wallabag v1, where all articles were part of the feed. So if you set the amount of articles being displayed greater than the number of items being content of your RSS feed, you will only see the number of items in your RSS feed.
SSL/TLS encryption
~~~~~~~~~~~~~~~~~~
If you can reach your wallabag web instance via HTTPS, you should use that. Especially if your HTTP URL redirects you to the HTTPS one. Currently, the app cannot handle that redirect properly.
References
----------
`Source code of the Android application <https://github.com/wallabag/android-app>`_
`Android Application on F-Droid <https://f-droid.org/repository/browse/?fdfilter=wallabag&fdid=fr.gaulupeau.apps.InThePoche>`_
`Android Application on Google Play <https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche>`_
`Support chat <https://gitter.im/wallabag/wallabag>`_

View File

@ -23,24 +23,3 @@ Your account is now activated.
.. image:: ../../img/user/activated_account.png .. image:: ../../img/user/activated_account.png
:alt: Welcome on board! :alt: Welcome on board!
:align: center :align: center
Frequently asked questions
--------------------------
I can't valid the registration form
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Make sure that all fields are well filled:
* valid email address
* same passwords in two fields
I don't receive my activation email
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Are you sure your email address was correct? Did you check your spams folder?
When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You already enabled your account or the URL of the activation email is wrong.

View File

@ -12,9 +12,9 @@ There may be several reasons:
How can I help to fix that? How can I help to fix that?
--------------------------- ---------------------------
- `by sending us an email with the article's URL <mailto:hello@wallabag.org>`_ - `by sending us an email with the article's URL <mailto:hello\@wallabag.org>`_
- by trying to fix this article by yourself :) by creating a file for the article. - by trying to fix this article by yourself :) by creating a file for the article.
You can use this tool http://siteconfig.fivefilters.org/. You can use `this tool <http://siteconfig.fivefilters.org/>`__.
How can I try to re-fetch this article? How can I try to re-fetch this article?
--------------------------------------- ---------------------------------------

48
docs/en/user/faq.rst Normal file
View File

@ -0,0 +1,48 @@
Frequently Asked Questions
==========================
During the installation, I got the error ``Error Output: sh: 1: @post-cmd: not found``
--------------------------------------------------------------------------------------
It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it.
`Read the documentation about composer to know how to install it
<https://getcomposer.org/doc/00-intro.md>`__.
I can't validate the registration form
--------------------------------------
Ensure that all fields are properly filled:
* valid email address
* same passwords in two fields
I'm not receiving my activation email
-------------------------------------
Are you sure your email address was correct? Did you check your spam folder?
If you still don't see the activation email, please ensure that you have
installed and properly configured a mail transfer agent. Be sure to include a
firewall rule for SMTP. E.g., if using firewalld:
::
firewall-cmd --permanent --add-service=smtp
firewall-cmd --reload
Lastly, if you have SELinux enabled, set the following rule:
``setsebool -P httpd_can_sendmail 1``
When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
----------------------------------------------------------------------------------------------------------------------------------
You already enabled your account or the URL of the activation email is wrong.
I forgot my password
--------------------
You can reset your password by clicking on ``Forgot your password?`` link,
on the login page. Then, fill the form with your email address or your username,
you'll receive an email to reset your password.

View File

@ -1,42 +1,5 @@
Migrate to wallabag Migrate from a third service
=================== ============================
From wallabag
-------------
Export your data from your wallabag 1.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
On your config page, click on ``JSON export`` in the ``Export your wallabag data`` section.
.. image:: ../../img/user/export_wllbg_1.png
:alt: Export from wallabag 1.x
:align: center
You will have a ``wallabag-export-1-1970-01-01.json`` file.
Export your data from your wallabag 2.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
On the export sidebar, click on ``JSON``.
.. image:: ../../img/user/export_wllbg_2.png
:alt: Export from wallabag 2.x
:align: center
You will have a ``Unread articles.json`` file.
Import your data into wallabag 2.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Click on ``Import`` link in the menu, choose the right wallabag version,
select your export file on your computer and import it.
.. image:: ../../img/user/import_wllbg.png
:alt: Import from wallabag 1.x
:align: center
All your wallabag articles will be imported.
From Pocket From Pocket
----------- -----------
@ -53,7 +16,7 @@ a new application on their developer website to continue.
and submit your new application and submit your new application
Pocket will give you a **Consumer Key** (for example, `49961-985e4b92fe21fe4c78d682c1`). Pocket will give you a **Consumer Key** (for example, `49961-985e4b92fe21fe4c78d682c1`).
You need to configure the ``pocket_consumer_key`` into the ``app/config/parameters.yml`` file in wallabag. You need to configure the ``pocket_consumer_key`` into the ``Import`` section in the ``Internal settings`` menu.
Now, all is fine to migrate from Pocket. Now, all is fine to migrate from Pocket.

View File

@ -23,18 +23,21 @@ You'll need the following extensions for wallabag to work. Some of these may alr
- php-gettext - php-gettext
- php-tokenizer - php-tokenizer
wallabag uses PDO to connect to database, so you'll need one of: wallabag uses PDO to connect to the database, so you'll need one of the following:
- pdo_mysql - pdo_mysql
- pdo_sqlite - pdo_sqlite
- pdo_pgsql - pdo_pgsql
and it's corresponding database server. and its corresponding database server.
Installation Installation
------------ ------------
wallabag 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. On a dedicated web server (recommended way)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wallabag 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.
Install Composer: Install Composer:
@ -42,19 +45,19 @@ Install Composer:
curl -s http://getcomposer.org/installer | php curl -s http://getcomposer.org/installer | php
You can find specific instructions here : __ https://getcomposer.org/doc/00-intro.md You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__:
To install wallabag itself, you must run these two commands: To install wallabag itself, you must run the following commands:
:: ::
git clone https://github.com/wallabag/wallabag.git git clone https://github.com/wallabag/wallabag.git
cd wallabag cd wallabag
git checkout 2.0.1 git checkout 2.0.5
SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
php bin/console wallabag:install --env=prod php bin/console wallabag:install --env=prod
To start php's build-in server and test if everything did install correctly, you can do: To start PHP's build-in server and test if everything did install correctly, you can do:
:: ::
@ -62,15 +65,48 @@ To start php's build-in server and test if everything did install correctly, you
And access wallabag at http://yourserverip:8000 And access wallabag at http://yourserverip:8000
.. note:: .. tip::
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 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>`__.
<http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__.
Installing on Apache On a shared hosting
-------------------- ~~~~~~~~~~~~~~~~~~~
Assuming you install wallabag in the /var/www/wallabag folder and that you want to use php as an Apache module, here's a vhost for wallabag: We provide a package with all dependencies inside.
The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``.
We already created a user: login and password are ``wallabag``.
.. 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).
Execute this command to download and extract the latest package:
.. code-block:: bash
wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
Now, read the following documentation to create your virtual host, then access your wallabag.
If 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``.
Installation with Docker
------------------------
We provide you a Docker image to install wallabag easily. Have a look to our repository on `Docker Hub <https://hub.docker.com/r/wallabag/wallabag/>`__ to have more information.
Command to launch container
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
docker pull wallabag/wallabag
Virtual hosts
-------------
Configuration on Apache
~~~~~~~~~~~~~~~~~~~~~~~
Assuming you install wallabag in the ``/var/www/wallabag`` folder and that you want to use PHP as an Apache module, here's a vhost for wallabag:
:: ::
@ -112,10 +148,10 @@ Assuming you install wallabag in the /var/www/wallabag folder and that you want
After reloading or restarting Apache, you should now be able to access wallabag at http://domain.tld. After reloading or restarting Apache, you should now be able to access wallabag at http://domain.tld.
Installing on Nginx Configuration on Nginx
------------------- ~~~~~~~~~~~~~~~~~~~~~~
Assuming you install wallabag in the /var/www/wallabag folder, here's the recipe for wallabag : Assuming you installed wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag :
:: ::
@ -152,6 +188,137 @@ Assuming you install wallabag in the /var/www/wallabag folder, here's the recipe
After reloading or restarting nginx, you should now be able to access wallabag at http://domain.tld. After reloading or restarting nginx, you should now be able to access wallabag at http://domain.tld.
.. note:: .. tip::
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``. 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``.
Configuration on lighttpd
~~~~~~~~~~~~~~~~~~~~~~~~~
Assuming you install wallabag in the /var/www/wallabag folder, here's the recipe for wallabag (edit your ``lighttpd.conf`` file and paste this configuration into it):
::
server.modules = (
"mod_fastcgi",
"mod_access",
"mod_alias",
"mod_compress",
"mod_redirect",
"mod_rewrite",
)
server.document-root = "/var/www/wallabag/web"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
server.port = 80
server.follow-symlink = "enable"
index-file.names = ( "index.php", "index.html", "index.lighttpd.html")
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
dir-listing.activate = "disable"
url.rewrite-if-not-file = (
"^/([^?])(?:\?(.))?" => "/app.php?$1&$2",
"^/([^?]*)" => "/app.php?=$1",
)
Rights access to the folders of the project
-------------------------------------------
Test environment
~~~~~~~~~~~~~~~~
When we just want to test wallabag, we just run the command ``php bin/console server:run --env=prod`` to start our wallabag instance and everything will go smoothly because the user who started the project can access to the current folder naturally, without any problem.
Production environment
~~~~~~~~~~~~~~~~~~~~~~
As soon as we use Apache or Nginx to access to our wallabag instance, and not from the command ``php bin/console server:run --env=prod`` to start it, we should take care to grant the good rights on the good folders to keep safe all the folders of the project.
To do so, the folder name, known as ``DocumentRoot`` (for apache) or ``root`` (for Nginx), has to be absolutely accessible by the Apache/Nginx user. Its name is generally ``www-data``, ``apache`` or ``nobody`` (depending on linux system used).
So the folder ``/var/www/wallabag/web`` has to be accessible by this last one. But this could be not enough if we just care about this folder, because we could meet a blank page or get an error 500 when trying to access to the homepage of the project.
This is due to the fact that we will need to grant the same rights access on the folder ``/var/www/wallabag/var`` like those we gave on the folder ``/var/www/wallabag/web``. Thus, we fix this problem with the following command:
.. code-block:: bash
chown -R www-data:www-data /var/www/wallabag/var
It has to be the same for the following folders
* /var/www/wallabag/bin/
* /var/www/wallabag/app/config/
* /var/www/wallabag/vendor/
* /var/www/wallabag/data/
by entering
.. code-block:: bash
chown -R www-data:www-data /var/www/wallabag/bin
chown -R www-data:www-data /var/www/wallabag/app/config
chown -R www-data:www-data /var/www/wallabag/vendor
chown -R www-data:www-data /var/www/wallabag/data/
otherwise, sooner or later you will see these error messages:
.. code-block:: bash
Unable to write to the "bin" directory.
file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied
file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied
Additional rules for SELinux
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If 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:
``getenforce``
This will return ``Enforcing`` if SELinux is enabled. Creating a new context involves the following syntax:
``semanage fcontext -a -t <context type> <full path>``
For example:
``semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"``
This will recursively apply the httpd_sys_content_t context to the wallabag directory and all underlying files and folders. The following rules are needed:
+-----------------------------------+----------------------------+
| Full path | Context |
+===================================+============================+
| /var/www/wallabag(/.*)? | ``httpd_sys_content_t`` |
+-----------------------------------+----------------------------+
| /var/www/wallabag/data(/.*)? | ``httpd_sys_rw_content_t`` |
+-----------------------------------+----------------------------+
| /var/www/wallabag/var/logs(/.*)? | ``httpd_log_t`` |
+-----------------------------------+----------------------------+
| /var/www/wallabag/var/cache(/.*)? | ``httpd_cache_t`` |
+-----------------------------------+----------------------------+
After creating these contexts, enter the following in order to apply your rules:
``restorecon -R -v /var/www/wallabag``
You can check contexts in a directory by typing ``ls -lZ`` and you can see all of your current rules with ``semanage fcontext -l -C``.
If you're installing the preconfigured latest-v2-package, then an additional rule is needed during the initial setup:
``semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wallabag/var"``
After you successfully access your wallabag and complete the initial setup, this context can be removed:
::
semanage fcontext -d -t httpd_sys_rw_content_t "/var/www/wallabag/var"
retorecon -R -v /var/www/wallabag/var

View File

@ -11,13 +11,3 @@ you can check the ``Keep me logged in`` checkbox: wallabag will remember you for
.. image:: ../../img/user/login_form.png .. image:: ../../img/user/login_form.png
:alt: Login form :alt: Login form
:align: center :align: center
Frequently asked questions
--------------------------
I forgot my password
~~~~~~~~~~~~~~~~~~~~
You can reset your password by clicking on ``Forgot your password?`` link,
on the login page. Then, fill the form with your email address or your username,
you'll receive an email to reset your password.

View File

@ -1,5 +1,5 @@
Migrate wallabag Migrate from v1 or v2
================ =====================
From wallabag 1.x From wallabag 1.x
----------------- -----------------
@ -16,7 +16,7 @@ If you were using wallabag v1.x, you need to export your data before migrating t
.. note:: .. note::
If you encounter issues during the export or the import, don't hesitate to `ask for support <https://www.wallabag.org/pages/support.html>`__. If you encounter issues during the export or the import, don't hesitate to `ask for support <https://www.wallabag.org/pages/support.html>`__.
When you have retrieved the json file containing your entries, you can install wallabag v2 if needed by following `the standard procedure <http://doc.wallabag.org/en/v2/user/installation.html>`__. When you have retrieved the json file containing your entries, you can install wallabag v2 if needed by following `the standard procedure <http://doc.wallabag.org/en/master/user/installation.html>`__.
After creating an user account on your new wallabag v2 instance, you must head over to the `Import` section and select `Import from wallabag v1`. Select your json file and upload it. After creating an user account on your new wallabag v2 instance, you must head over to the `Import` section and select `Import from wallabag v1`. Select your json file and upload it.

32
docs/en/user/upgrade.rst Normal file
View File

@ -0,0 +1,32 @@
Upgrade wallabag
================
Upgrade on a dedicated web server
---------------------------------
The last release is published on https://www.wallabag.org/pages/download-wallabag.html. In order to upgrade your wallabag installation and get the last version, run the following commands in you wallabag folder (replace ``2.0.3`` by the last release number):
::
git fetch origin
git fetch --tags
git checkout 2.0.3
SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
php bin/console cache:clear --env=prod
Upgrade on a shared hosting
---------------------------
Backup your ``app/config/parameters.yml`` file.
Download the last release of wallabag:
.. code-block:: bash
wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
Extract the archive in your wallabag folder and replace ``app/config/parameters.yml`` with yours.
If you use SQLite, you must also copy your ``data/`` folder inside the new installation.
Empty ``var/cache`` folder.

View File

@ -7,7 +7,7 @@ Pré-requis
---------- ----------
* wallabag fraichement installé et disponible à http://localhost:8000 * wallabag fraichement installé et disponible à http://localhost:8000
* ``httpie`` installé sur votre ordinateur (`voir le site du projet <https://github.com/jkbrzt/httpie>`__). Vous pouvez également adapter les commandes en utilisant curl ou wget. * ``httpie`` installé sur votre ordinateur (`voir le site du projet <https://github.com/jkbrzt/httpie>`__). Vous pouvez également adapter les commandes en utilisant curl ou wget.
* toutes les méthodes de l'API documentées ici http://localhost:8000/api/doc * toutes les méthodes de l'API documentées ici http://localhost:8000/api/doc
Créer un nouveau client d'API Créer un nouveau client d'API
@ -69,6 +69,12 @@ Vous obtiendrez :
Nous allons utiliser la valeur de ``access_token`` dans nos prochains appels. Nous allons utiliser la valeur de ``access_token`` dans nos prochains appels.
Exemple cURL :
::
curl -s "https://localhost:8000/oauth/v2/token?grant_type=password&client_id=1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc&client_secret=636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4&username=wallabag&password=wallabag"
Récupérer les articles existants Récupérer les articles existants
-------------------------------- --------------------------------
@ -120,6 +126,12 @@ retournera :
Le tableau ``items`` est vide. Le tableau ``items`` est vide.
Exemple cURL :
::
curl --get "https://localhost:8000/api/entries.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
Créer votre premier article Créer votre premier article
--------------------------- ---------------------------
@ -174,6 +186,12 @@ retournera :
Maintenant, si vous exécutez la précédente commande (voir **Récupérer les articles existants**), vous obtiendrez quelque chose. Maintenant, si vous exécutez la précédente commande (voir **Récupérer les articles existants**), vous obtiendrez quelque chose.
Exemple cURL :
::
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"
Supprimer un article Supprimer un article
-------------------- --------------------
@ -227,9 +245,25 @@ retournera :
Et si vous voulez voir la liste des articles existants (voir **Récupérer les articles existants**), le tableau sera vide. Et si vous voulez voir la liste des articles existants (voir **Récupérer les articles existants**), le tableau sera vide.
Exemple cURL :
::
curl --request DELETE "https://localhost:8000/api/entries/1.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA"
Autres méthodes Autres méthodes
--------------- ---------------
Nous n'écrirons pas d'exemples pour toutes les méthodes de l'API. Nous n'écrirons pas d'exemples pour toutes les méthodes de l'API.
Jetez un œil à la liste complète ici http://localhost:8000/api/doc pour connaitre chaque méthode. Jetez un œil à la liste complète ici http://localhost:8000/api/doc pour connaitre chaque méthode.
Ressources tierces
------------------
Certaines applications ou bibliothèques utilisent notre API. En voici une liste non exhaustive :
- `Java wrapper for the wallabag API <https://github.com/Strubbl/wallabag-java>`_ par Strubbl.
- `.NET library for the wallabag v2 API <https://github.com/jlnostr/wallabag-api>`_ par Julian Oster.
- `Python API for wallabag <https://github.com/foxmask/wallabag_api>`_ par FoxMaSk, pour son projet `Trigger Happy <https://blog.trigger-happy.eu/>`_.
- `Un plugin <https://github.com/joshp23/ttrss-to-wallabag-v2>`_ conçu pour `Tiny Tiny RSS <https://tt-rss.org/gitlab/fox/tt-rss/wikis/home>`_ qui utilise l'API wallabag v2. Par Josh Panter.

View File

@ -0,0 +1,12 @@
Contribuer à cette documentation
================================
Les sources de notre documentation sont ici https://github.com/wallabag/wallabag/tree/master/docs
Nous utilisons `ReadTheDocs
<https://readthedocs.org>`__ pour la générer.
Les pages sont écrites au format `Restructured Text
<https://fr.wikipedia.org/wiki/ReStructuredText>`__. Vous pouvez utiliser des outils en ligne comme http://rst.aaroniles.net/ ou http://rst.ninjs.org/ pour prévisualiser vos articles.
Si vous créez une nouvelle page, n'oubliez pas d'éditer le fichier `index.rst <https://raw.githubusercontent.com/wallabag/wallabag/master/docs/en/index.rst>`__ pour ajouter un lien dans la barre latérale.

View File

@ -13,15 +13,15 @@ Fichiers de traductions
cette traduction qui est considérée comme la plus récente. Merci de vous baser cette traduction qui est considérée comme la plus récente. Merci de vous baser
sur celle-ci pour créer votre traduction. sur celle-ci pour créer votre traduction.
Les principaux fichiers de traduction se trouvent ici : https://github.com/wallabag/wallabag/tree/v2/src/Wallabag/CoreBundle/Resources/translations. Les principaux fichiers de traduction se trouvent ici : https://github.com/wallabag/wallabag/tree/master/src/Wallabag/CoreBundle/Resources/translations.
Vous devez créer le fichier ``messages.CODE.yml``, Vous devez créer les fichiers ``messages.CODE.yml`` et ``validators.CODE.yml``,
où CODE est le code ISO 639-1 de votre langue (`cf wikipedia <https://fr.wikipedia.org/wiki/Liste_des_codes_ISO_639-1>`__). où CODE est le code ISO 639-1 de votre langue (`cf wikipedia <https://fr.wikipedia.org/wiki/Liste_des_codes_ISO_639-1>`__).
Autres fichiers à traduire : Autres fichiers à traduire :
- https://github.com/wallabag/wallabag/tree/v2/app/Resources/CraueConfigBundle/translations. - https://github.com/wallabag/wallabag/tree/master/app/Resources/CraueConfigBundle/translations.
- https://github.com/wallabag/wallabag/tree/v2/app/Resources/FOSUserBundle/translations. - https://github.com/wallabag/wallabag/tree/master/app/Resources/FOSUserBundle/translations.
Vous devez créer les fichiers ``LE_FICHIER_DE_TRADUCTION.CODE.yml``. Vous devez créer les fichiers ``LE_FICHIER_DE_TRADUCTION.CODE.yml``.
@ -29,7 +29,7 @@ Fichier de configuration
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
Vous devez éditer `app/config/config.yml Vous devez éditer `app/config/config.yml
<https://github.com/wallabag/wallabag/blob/v2/app/config/config.yml>`__ pour <https://github.com/wallabag/wallabag/blob/master/app/config/config.yml>`__ pour
afficher votre langue dans la page Configuration de wallabag (pour permettre aux afficher votre langue dans la page Configuration de wallabag (pour permettre aux
utilisateurs de choisir cette nouvelle traduction). utilisateurs de choisir cette nouvelle traduction).
@ -57,6 +57,6 @@ Documentation de wallabag
Contrairement à l'application, la langue principale de la documentation est l'anglais Contrairement à l'application, la langue principale de la documentation est l'anglais
Les fichiers de documentation se trouvent ici : https://github.com/wallabag/wallabag/tree/v2/docs Les fichiers de documentation se trouvent ici : https://github.com/wallabag/wallabag/tree/master/docs
Vous devez respecter la structure du dossier ``en`` quand vous crééz votre traduction. Vous devez respecter la structure du dossier ``en`` quand vous crééz votre traduction.

View File

@ -9,7 +9,7 @@ Documentation de wallabag
simplement darchiver une page web en ne conservant que le contenu. Les simplement darchiver une page web en ne conservant que le contenu. Les
éléments superflus (menu, publicité, etc.) sont supprimés. éléments superflus (menu, publicité, etc.) sont supprimés.
.. note:: .. tip::
Vous vous trouvez sur la documentation de wallabag v2. Si vous voulez lire la documentation de wallabag v1, `vous pouvez jeter un œil ici <https://github.com/wallabag/documentation>`__. Vous vous trouvez sur la documentation de wallabag v2. Si vous voulez lire la documentation de wallabag v1, `vous pouvez jeter un œil ici <https://github.com/wallabag/documentation>`__.
@ -24,15 +24,17 @@ La documentation principale de cette application est découpée en plusieurs sec
:maxdepth: 2 :maxdepth: 2
:caption: Documentation utilisateur :caption: Documentation utilisateur
user/faq
user/installation user/installation
user/upgrade
user/migration user/migration
user/import
user/create_account user/create_account
user/login user/login
user/configuration user/configuration
user/first_article user/first_article
user/errors_during_fetching user/errors_during_fetching
user/annotations user/annotations
user/import
user/download_articles user/download_articles
user/filters user/filters
user/tags user/tags
@ -45,5 +47,6 @@ La documentation principale de cette application est découpée en plusieurs sec
developer/api developer/api
developer/docker developer/docker
developer/documentation
developer/translate developer/translate
developer/maintenance developer/maintenance

View File

@ -23,24 +23,3 @@ Votre compte est maintenant actif.
.. image:: ../../img/user/activated_account.png .. image:: ../../img/user/activated_account.png
:alt: Bienvenue à bord ! :alt: Bienvenue à bord !
:align: center :align: center
Foire aux questions
-------------------
Je ne peux pas valider le formulaire de création de compte
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Soyez sur d'avoir bien renseigné tous les champs :
* une adresse email valide
* le même mot de passe dans les deux champs
Je n'ai pas reçu mon email d'activation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Êtes-vous sur d'avoir renseigné votre bonne adresse ? Avez-vous vérifié le dossier de spams ?
Quand je clique sur le lien d'activation, j'ai ce message : ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Vous avez déjà activé votre compte ou l'URL d'activation n'est pas correcte.

View File

@ -12,9 +12,9 @@ Il peut y avoir plusieurs raisons :
Comment puis-je aider pour réparer ça ? Comment puis-je aider pour réparer ça ?
--------------------------------------- ---------------------------------------
- `en nous envoyant un email avec l'URL de l'article <mailto:hello@wallabag.org>`_ - `en nous envoyant un email avec l'URL de l'article <mailto:hello\@wallabag.org>`_
- en essayant de réparer cet article par vous-même :) en créant un fichier pour l'article. - en essayant de réparer cet article par vous-même :) en créant un fichier pour l'article.
Vous pouvez utiliser cet outil http://siteconfig.fivefilters.org/. Vous pouvez utiliser `cet outil <http://siteconfig.fivefilters.org/>`__.
Comment puis-je réessayer de récupérer le contenu ? Comment puis-je réessayer de récupérer le contenu ?
--------------------------------------------------- ---------------------------------------------------

35
docs/fr/user/faq.rst Normal file
View File

@ -0,0 +1,35 @@
Foire Aux Questions
===================
Durant l'installation, je rencontre cette erreur ``Error Output: sh: 1: @post-cmd: not found``
----------------------------------------------------------------------------------------------
Il semblerait que vous ayiez un problème avec votre installation de ``composer``. Essayez de le désinstaller puis de le réinstaller.
`Vous pouvez lire la documentation de composer pour savoir comment l'installer
<https://getcomposer.org/doc/00-intro.md>`__.
Je ne peux pas valider le formulaire de création de compte
----------------------------------------------------------
Soyez sur d'avoir bien renseigné tous les champs :
* une adresse email valide
* le même mot de passe dans les deux champs
Je n'ai pas reçu mon email d'activation
---------------------------------------
Êtes-vous sur d'avoir renseigné votre bonne adresse ? Avez-vous vérifié le dossier de spams ?
Quand je clique sur le lien d'activation, j'ai ce message : ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
----------------------------------------------------------------------------------------------------------------------------------
Vous avez déjà activé votre compte ou l'URL d'activation n'est pas correcte.
J'ai oublié mon mot de passe
----------------------------
Vous pouvez réinitialiser votre mot de passe en cliquant sur ``Mot de passe oublié ?``,
sur la page de connexion. Ensuite, renseignez votre adresse email ou votre nom d'utilisateur,
un email vous sera envoyé.

View File

@ -1,42 +1,5 @@
Migrer à wallabag Migrer depuis un service externe
================= ================================
Depuis wallabag
---------------
Exportez vos données de wallabag 1.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sur la page de configuration, cliquez sur ``Export JSON`` dans la section ``Exportez vos données wallabag``.
.. image:: ../../img/user/export_wllbg_1.png
:alt: Export depuis wallabag 1.x
:align: center
Vous obtiendrez un fichier ``wallabag-export-1-1970-01-01.json``.
Exportez vos données de wallabag 2.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dans la barre latérale de téléchargement, cliquez sur ``JSON``.
.. image:: ../../img/user/export_wllbg_2.png
:alt: Export depuis wallabag 2.x
:align: center
Vous obtiendrez un fichier ``Unread articles.json``.
Importez vos données wallabag 2.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cliquez sur le lien ``Importer`` dans le menu, choisissez la version de wallabag correspondante,
sélectionnez votre fichier d'export sur votre ordinateur et importez-le.
.. image:: ../../img/user/import_wllbg.png
:alt: Import depuis wallabag 1.x
:align: center
Tous vos articles wallabag seront importés.
Depuis Pocket Depuis Pocket
------------- -------------
@ -53,7 +16,7 @@ Vous devez créer une nouvelle application sur leur site dédié aux développeu
termes d'utilisation du service et soumettez votre application termes d'utilisation du service et soumettez votre application
Pocket vous fournira une **Consumer Key** (par exemple, `49961-985e4b92fe21fe4c78d682c1`). Pocket vous fournira une **Consumer Key** (par exemple, `49961-985e4b92fe21fe4c78d682c1`).
Vous devez configurer la ``pocket_consumer_key`` dans le fichier ``app/config/parameters.yml``. Vous devez configurer la ``pocket_consumer_key`` dans la section ``Import`` du menu ``Configuration interne``.
Maintenant, tout est bien configuré pour migrer depuis Pocket. Maintenant, tout est bien configuré pour migrer depuis Pocket.

View File

@ -32,6 +32,9 @@ wallabag utilise PDO afin de se connecter à une base de données, donc vous aur
Installation Installation
------------ ------------
Sur un serveur dédié (méthode conseillée)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wallabag 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. wallabag 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.
Installation de Composer : Installation de Composer :
@ -40,7 +43,7 @@ Installation de Composer :
curl -s http://getcomposer.org/installer | php curl -s http://getcomposer.org/installer | php
Vous pouvez trouver des instructions spécifiques ici (en anglais) : __ https://getcomposer.org/doc/00-intro.md Vous pouvez trouver des instructions spécifiques `ici (en anglais) <https://getcomposer.org/doc/00-intro.md>`__ :
Pour installer wallabag, vous devez exécuter ces deux commandes : Pour installer wallabag, vous devez exécuter ces deux commandes :
@ -48,7 +51,7 @@ Pour installer wallabag, vous devez exécuter ces deux commandes :
git clone https://github.com/wallabag/wallabag.git git clone https://github.com/wallabag/wallabag.git
cd wallabag cd wallabag
git checkout 2.0.1 git checkout 2.0.5
SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
php bin/console wallabag:install --env=prod php bin/console wallabag:install --env=prod
@ -60,15 +63,47 @@ Pour démarrer le serveur interne à php et vérifier que tout s'est installé c
Et accéder wallabag à l'adresse http://lipdevotreserveur:8000 Et accéder wallabag à l'adresse http://lipdevotreserveur:8000
.. note:: .. tip::
Pour définir des paramètres via des variables d'environnement, vous pouvez les spécifier avec le préfixe ``SYMFONY__``. Par exemple, ``SYMFONY__DATABASE_DRIVER``. Vous pouvez lire `documentation Symfony <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__ pour en savoir plus.
Pour définir des paramètres via des variables d'environnement, vous pouvez les spécifier avec le préfixe ``SYMFONY__``. Par exemple, ``SYMFONY__DATABASE_DRIVER``. Vous pouvez lire `documentation Symfony Sur un serveur mutualisé
<http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__ pour en savoir plus. ~~~~~~~~~~~~~~~~~~~~~~~~
Installation avec Apache Nous mettons à votre disposition une archive avec toutes les dépendances à l'intérieur.
La configuration par défaut utilise SQLite pour la base de données. Si vous souhaitez changer ces paramètres, vous devez modifier le fichier ``app/config/parameters.yml``.
Nous avons déjà créé un utilisateur : le login et le mot de passe sont ``wallabag``.
.. caution:: Avec cette archive, wallabag ne vérifie pas si les extensions obligatoires sont présentes sur votre serveur pour bien fonctionner (ces vérifications sont faites durant le ``composer install`` quand vous avez un serveur dédié, voir ci-dessus).
Exécutez cette commande pour télécharger et décompresser l'archive :
.. code-block:: bash
wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
Maintenant, lisez la documentation ci-dessous pour crééer un virtual host. Accédez ensuite à votre installation de wallabag.
Si vous avez changé la configuration pour modifier le type de stockage (MySQL ou PostgreSQL), vous devrez vous créer un utilisateur via la commande ``php bin/console wallabag:install --env=prod``.
Installation avec Docker
------------------------ ------------------------
En imaginant que vous vouliez installer wallabag dans le dossier /var/www/wallabag et que vous utilisiez php comme un module Apache, voici un vhost pour wallabag : Nous vous proposons une image Docker pour installer wallabag facilement. Allez voir du côté de `Docker Hub <https://hub.docker.com/r/wallabag/wallabag/>`__ pour plus d'informations.
Commande pour démarrer le containeur
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
docker pull wallabag/wallabag
Virtual hosts
-------------
Configuration avec Apache
~~~~~~~~~~~~~~~~~~~~~~~~~
En imaginant que vous vouliez installer wallabag dans le dossier ``/var/www/wallabag`` et que vous utilisiez PHP comme un module Apache, voici un vhost pour wallabag :
:: ::
@ -110,10 +145,10 @@ En imaginant que vous vouliez installer wallabag dans le dossier /var/www/wallab
Après que vous ayez rechargé/redémarré Apache, vous devriez pouvoir avoir accès à wallabag à l'adresse http://domain.tld. Après que vous ayez rechargé/redémarré Apache, vous devriez pouvoir avoir accès à wallabag à l'adresse http://domain.tld.
Installation avec Nginx Configuration avec Nginx
----------------------- ~~~~~~~~~~~~~~~~~~~~~~~~
En imaginant que vous vouliez installer wallabag dans le dossier /var/www/wallabag, voici un fichier de configuration Nginx pour wallabag : En imaginant que vous vouliez installer wallabag dans le dossier ``/var/www/wallabag``, voici un fichier de configuration Nginx pour wallabag :
:: ::
@ -150,6 +185,90 @@ En imaginant que vous vouliez installer wallabag dans le dossier /var/www/wallab
Après que vous ayez rechargé/redémarré Nginx, vous devriez pouvoir avoir accès à wallabag à l'adresse http://domain.tld. Après que vous ayez rechargé/redémarré Nginx, vous devriez pouvoir avoir accès à wallabag à l'adresse http://domain.tld.
.. note:: .. tip::
Si vous voulez importer un fichier important dans wallabag, vous devez ajouter cette ligne dans votre configuration nginx ``client_max_body_size XM; # allows file uploads up to X megabytes``. Si vous voulez importer un fichier important dans wallabag, vous devez ajouter cette ligne dans votre configuration nginx ``client_max_body_size XM; # allows file uploads up to X megabytes``.
Configuration avec lighttpd
~~~~~~~~~~~~~~~~~~~~~~~~~~~
En imaginant que vous vouliez installer wallabag dans le dossier ``/var/www/wallabag``, voici un fichier de configuration pour wallabag (éditez votre fichier ``lighttpd.conf`` collez-y cette configuration) :
::
server.modules = (
"mod_fastcgi",
"mod_access",
"mod_alias",
"mod_compress",
"mod_redirect",
"mod_rewrite",
)
server.document-root = "/var/www/wallabag/web"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
server.port = 80
server.follow-symlink = "enable"
index-file.names = ( "index.php", "index.html", "index.lighttpd.html")
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
dir-listing.activate = "disable"
url.rewrite-if-not-file = (
"^/([^?])(?:\?(.))?" => "/app.php?$1&$2",
"^/([^?]*)" => "/app.php?=$1",
)
Droits d'accès aux dossiers du projet
-------------------------------------
Environnement de test
~~~~~~~~~~~~~~~~~~~~~
Quand nous souhaitons juste tester wallabag, nous lançons simplement la commande ``php bin/console server:run --env=prod`` pour démarrer l'instance wallabag et tout se passe correctement car l'utilisateur qui a démarré le projet a accès naturellement au repertoire courant, tout va bien.
Environnement de production
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dès lors que nous utilisons Apache ou Nginx pour accéder à notre instance wallabag, et non plus la commande ``php bin/console server:run --env=prod`` pour la démarrer, il faut prendre garde à octroyer les bons droits aux bons dossiers afin de préserver la sécurité de l'ensemble des fichiers fournis par le projet.
Aussi, le dossier, connu sous le nom de ``DocumentRoot`` (pour apache) ou ``root`` (pour Nginx), doit être impérativement accessible par l'utilisateur de Apache ou Nginx. Le nom de cet utilisateur est généralement ``www-data``, ``apache`` ou ``nobody`` (selon les systèmes linux utilisés).
Donc le dossier ``/var/www/wallabag/web`` doit être accessible par ce dernier. Mais cela ne suffira pas si nous nous contentons de ce dossier, et nous pourrions avoir, au mieux une page blanche en accédant à la page d'accueil du projet, au pire une erreur 500.
Cela est dû au fait qu'il faut aussi octroyer les mêmes droits d'accès au dossier ``/var/www/wallabag/var`` que ceux octroyés au dossier ``/var/www/wallabag/web``. Ainsi, on règle le problème par la commande suivante :
.. code-block:: bash
chown -R www-data:www-data /var/www/wallabag/var
Il en est de même pour les dossiers suivants :
* /var/www/wallabag/bin/
* /var/www/wallabag/app/config/
* /var/www/wallabag/vendor/
en tapant
.. code-block:: bash
chown -R www-data:www-data /var/www/wallabag/bin
chown -R www-data:www-data /var/www/wallabag/app/config
chown -R www-data:www-data /var/www/wallabag/vendor
sinon lors de la mise à jour vous finirez par rencontrer les erreurs suivantes :
.. code-block:: bash
Unable to write to the "bin" directory.
file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied
file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied

View File

@ -11,13 +11,3 @@ vous pouvez cocher la case ``Restez connecté`` : wallabag se souviendra de vous
.. image:: ../../img/user/login_form.png .. image:: ../../img/user/login_form.png
:alt: Formulaire de connexion :alt: Formulaire de connexion
:align: center :align: center
Foire aux questions
-------------------
J'ai oublié mon mot de passe
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Vous pouvez réinitialiser votre mot de passe en cliquant sur ``Mot de passe oublié ?``,
sur la page de connexion. Ensuite, renseignez votre adresse email ou votre nom d'utilisateur,
un email vous sera envoyé.

View File

@ -1,5 +1,5 @@
Migrer wallabag Migrer depuis la v1 ou la v2
=============== ============================
Depuis wallabag 1.x Depuis wallabag 1.x
------------------- -------------------
@ -16,7 +16,7 @@ Si vous utilisiez wallabag v1.x, vous devez exporter vos données avant de migre
.. note:: .. note::
S'il vous arrive des problèmes durant l'export ou l'import, n'hésitez pas à `demander de l'aide <https://www.wallabag.org/pages/support.html>`__. S'il vous arrive des problèmes durant l'export ou l'import, n'hésitez pas à `demander de l'aide <https://www.wallabag.org/pages/support.html>`__.
Une fois que vous avez récupéré le fichier json contenant vos données, vous pouvez installer wallabag v2 si c'est nécessaire en suivant `la procédure standard <http://doc.wallabag.org/fr/v2/user/installation.html>`__. Une fois que vous avez récupéré le fichier json contenant vos données, vous pouvez installer wallabag v2 si c'est nécessaire en suivant `la procédure standard <http://doc.wallabag.org/fr/master/user/installation.html>`__.
Une fois que vous avez créé un compte utilisateur sur votre nouvelle instance de wallabag v2, rendez-vous dans la section `Import`. Vous devez choisir l'import depuis wallabag v1 puis sélectionner votre fichier json récupéré précédemment. Une fois que vous avez créé un compte utilisateur sur votre nouvelle instance de wallabag v2, rendez-vous dans la section `Import`. Vous devez choisir l'import depuis wallabag v1 puis sélectionner votre fichier json récupéré précédemment.

32
docs/fr/user/upgrade.rst Normal file
View File

@ -0,0 +1,32 @@
Mettre à jour wallabag
======================
Mise à jour sur un serveur dédié
--------------------------------
La dernière version de wallabag est publiée à cette adresse : https://www.wallabag.org/pages/download-wallabag.html. Pour mettre à jour votre installation de wallabag, exécutez les commandes suivantes dans votre répertoire d'installation (remplacez ``2.0.3`` par le numéro de la dernière version) :
::
git fetch origin
git fetch --tags
git checkout 2.0.3
SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
php bin/console cache:clear --env=prod
Mise à jour sur un hébergement mutualisé
----------------------------------------
Effectuez une sauvegarde du fichier ``app/config/parameters.yml``.
Téléchargez la dernière version de wallabag :
.. code-block:: bash
wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
Décompressez l'archive dans votre répertoire d'installation et remplacez le fichier ``app/config/parameters.yml`` avec le votre.
Si vous utilisez SQLite, vous devez également conserver le contenu du répertoire ``data/``.
Videz le répertoire ``var/cache``.

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -30,7 +30,7 @@ class WallabagAnnotationController extends FOSRestController
->getRepository('WallabagAnnotationBundle:Annotation') ->getRepository('WallabagAnnotationBundle:Annotation')
->findAnnotationsByPageId($entry->getId(), $this->getUser()->getId()); ->findAnnotationsByPageId($entry->getId(), $this->getUser()->getId());
$total = count($annotationRows); $total = count($annotationRows);
$annotations = array('total' => $total, 'rows' => $annotationRows); $annotations = ['total' => $total, 'rows' => $annotationRows];
$json = $this->get('serializer')->serialize($annotations, 'json'); $json = $this->get('serializer')->serialize($annotations, 'json');
@ -141,6 +141,6 @@ class WallabagAnnotationController extends FOSRestController
*/ */
private function renderJsonResponse($json, $code = 200) private function renderJsonResponse($json, $code = 200)
{ {
return new Response($json, $code, array('application/json')); return new Response($json, $code, ['application/json']);
} }
} }

View File

@ -35,13 +35,13 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
->getRepository('WallabagCoreBundle:Entry') ->getRepository('WallabagCoreBundle:Entry')
->findOneByUsernameAndNotArchived('admin'); ->findOneByUsernameAndNotArchived('admin');
$headers = array('CONTENT_TYPE' => 'application/json'); $headers = ['CONTENT_TYPE' => 'application/json'];
$content = json_encode(array( $content = json_encode([
'text' => 'my annotation', 'text' => 'my annotation',
'quote' => 'my quote', 'quote' => 'my quote',
'ranges' => array('start' => '', 'startOffset' => 24, 'end' => '', 'endOffset' => 31), 'ranges' => ['start' => '', 'startOffset' => 24, 'end' => '', 'endOffset' => 31],
)); ]);
$crawler = $this->client->request('POST', 'annotations/'.$entry->getId().'.json', array(), array(), $headers, $content); $crawler = $this->client->request('POST', 'annotations/'.$entry->getId().'.json', [], [], $headers, $content);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -69,11 +69,11 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
$this->logInAs('admin'); $this->logInAs('admin');
$headers = array('CONTENT_TYPE' => 'application/json'); $headers = ['CONTENT_TYPE' => 'application/json'];
$content = json_encode(array( $content = json_encode([
'text' => 'a modified annotation', 'text' => 'a modified annotation',
)); ]);
$crawler = $this->client->request('PUT', 'annotations/'.$annotation->getId().'.json', array(), array(), $headers, $content); $crawler = $this->client->request('PUT', 'annotations/'.$annotation->getId().'.json', [], [], $headers, $content);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$content = json_decode($this->client->getResponse()->getContent(), true); $content = json_decode($this->client->getResponse()->getContent(), true);
@ -99,11 +99,11 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
$this->logInAs('admin'); $this->logInAs('admin');
$headers = array('CONTENT_TYPE' => 'application/json'); $headers = ['CONTENT_TYPE' => 'application/json'];
$content = json_encode(array( $content = json_encode([
'text' => 'a modified annotation', 'text' => 'a modified annotation',
)); ]);
$crawler = $this->client->request('DELETE', 'annotations/'.$annotation->getId().'.json', array(), array(), $headers, $content); $crawler = $this->client->request('DELETE', 'annotations/'.$annotation->getId().'.json', [], [], $headers, $content);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$content = json_decode($this->client->getResponse()->getContent(), true); $content = json_decode($this->client->getResponse()->getContent(), true);

View File

@ -26,10 +26,10 @@ abstract class WallabagAnnotationTestCase extends WebTestCase
{ {
$crawler = $this->client->request('GET', '/login'); $crawler = $this->client->request('GET', '/login');
$form = $crawler->filter('button[type=submit]')->form(); $form = $crawler->filter('button[type=submit]')->form();
$data = array( $data = [
'_username' => $username, '_username' => $username,
'_password' => 'mypassword', '_password' => 'mypassword',
); ];
$this->client->submit($form, $data); $this->client->submit($form, $data);
} }
@ -48,7 +48,7 @@ abstract class WallabagAnnotationTestCase extends WebTestCase
$loginManager = $container->get('fos_user.security.login_manager'); $loginManager = $container->get('fos_user.security.login_manager');
$firewallName = $container->getParameter('fos_user.firewall_name'); $firewallName = $container->getParameter('fos_user.firewall_name');
$this->user = $userManager->findUserBy(array('username' => 'admin')); $this->user = $userManager->findUserBy(['username' => 'admin']);
$loginManager->loginUser($firewallName, $this->user); $loginManager->loginUser($firewallName, $this->user);
// save the login token into the session and put it in a cookie // save the login token into the session and put it in a cookie

View File

@ -109,8 +109,9 @@ class WallabagRestController extends FOSRestController
$this->validateAuthentication(); $this->validateAuthentication();
$url = $request->request->get('url'); $url = $request->request->get('url');
$isArchived = (int) $request->request->get('archive'); $title = $request->request->get('title');
$isStarred = (int) $request->request->get('starred'); $isArchived = $request->request->get('archive');
$isStarred = $request->request->get('starred');
$entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($url, $this->getUser()->getId()); $entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($url, $this->getUser()->getId());
@ -121,6 +122,10 @@ class WallabagRestController extends FOSRestController
); );
} }
if (!is_null($title)) {
$entry->setTitle($title);
}
$tags = $request->request->get('tags', ''); $tags = $request->request->get('tags', '');
if (!empty($tags)) { if (!empty($tags)) {
$this->get('wallabag_core.content_proxy')->assignTagsToEntry($entry, $tags); $this->get('wallabag_core.content_proxy')->assignTagsToEntry($entry, $tags);
@ -167,8 +172,8 @@ class WallabagRestController extends FOSRestController
$this->validateUserAccess($entry->getUser()->getId()); $this->validateUserAccess($entry->getUser()->getId());
$title = $request->request->get('title'); $title = $request->request->get('title');
$isArchived = (int) $request->request->get('archive'); $isArchived = $request->request->get('archive');
$isStarred = (int) $request->request->get('starred'); $isStarred = $request->request->get('starred');
if (!is_null($title)) { if (!is_null($title)) {
$entry->setTitle($title); $entry->setTitle($title);
@ -384,6 +389,6 @@ class WallabagRestController extends FOSRestController
*/ */
private function renderJsonResponse($json) private function renderJsonResponse($json)
{ {
return new Response($json, 200, array('application/json')); return new Response($json, 200, ['application/json']);
} }
} }

View File

@ -13,7 +13,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase
$entry = $this->client->getContainer() $entry = $this->client->getContainer()
->get('doctrine.orm.entity_manager') ->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry') ->getRepository('WallabagCoreBundle:Entry')
->findOneBy(array('user' => 1, 'isArchived' => false)); ->findOneBy(['user' => 1, 'isArchived' => false]);
if (!$entry) { if (!$entry) {
$this->markTestSkipped('No content found in db.'); $this->markTestSkipped('No content found in db.');
@ -44,7 +44,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase
$entry = $this->client->getContainer() $entry = $this->client->getContainer()
->get('doctrine.orm.entity_manager') ->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry') ->getRepository('WallabagCoreBundle:Entry')
->findOneBy(array('user' => 2, 'isArchived' => false)); ->findOneBy(['user' => 2, 'isArchived' => false]);
if (!$entry) { if (!$entry) {
$this->markTestSkipped('No content found in db.'); $this->markTestSkipped('No content found in db.');
@ -79,7 +79,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase
public function testGetStarredEntries() public function testGetStarredEntries()
{ {
$this->client->request('GET', '/api/entries', array('star' => 1, 'sort' => 'updated')); $this->client->request('GET', '/api/entries', ['star' => 1, 'sort' => 'updated']);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -101,7 +101,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase
public function testGetArchiveEntries() public function testGetArchiveEntries()
{ {
$this->client->request('GET', '/api/entries', array('archive' => 1)); $this->client->request('GET', '/api/entries', ['archive' => 1]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -149,10 +149,11 @@ class WallabagRestControllerTest extends WallabagApiTestCase
public function testPostEntry() public function testPostEntry()
{ {
$this->client->request('POST', '/api/entries.json', array( $this->client->request('POST', '/api/entries.json', [
'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', 'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html',
'tags' => 'google', 'tags' => 'google',
)); 'title' => 'New title for my article',
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -162,17 +163,18 @@ class WallabagRestControllerTest extends WallabagApiTestCase
$this->assertEquals('http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', $content['url']); $this->assertEquals('http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', $content['url']);
$this->assertEquals(false, $content['is_archived']); $this->assertEquals(false, $content['is_archived']);
$this->assertEquals(false, $content['is_starred']); $this->assertEquals(false, $content['is_starred']);
$this->assertEquals('New title for my article', $content['title']);
$this->assertEquals(1, $content['user_id']); $this->assertEquals(1, $content['user_id']);
$this->assertCount(1, $content['tags']); $this->assertCount(1, $content['tags']);
} }
public function testPostSameEntry() public function testPostSameEntry()
{ {
$this->client->request('POST', '/api/entries.json', array( $this->client->request('POST', '/api/entries.json', [
'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', 'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html',
'archive' => '1', 'archive' => '1',
'tags' => 'google, apple', 'tags' => 'google, apple',
)); ]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -187,11 +189,11 @@ class WallabagRestControllerTest extends WallabagApiTestCase
public function testPostArchivedAndStarredEntry() public function testPostArchivedAndStarredEntry()
{ {
$this->client->request('POST', '/api/entries.json', array( $this->client->request('POST', '/api/entries.json', [
'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', 'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html',
'archive' => '1', 'archive' => '1',
'starred' => '1', 'starred' => '1',
)); ]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -206,11 +208,11 @@ class WallabagRestControllerTest extends WallabagApiTestCase
public function testPostArchivedAndStarredEntryWithoutQuotes() public function testPostArchivedAndStarredEntryWithoutQuotes()
{ {
$this->client->request('POST', '/api/entries.json', array( $this->client->request('POST', '/api/entries.json', [
'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', 'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html',
'archive' => 0, 'archive' => 0,
'starred' => 1, 'starred' => 1,
)); ]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -236,12 +238,12 @@ class WallabagRestControllerTest extends WallabagApiTestCase
// hydrate the tags relations // hydrate the tags relations
$nbTags = count($entry->getTags()); $nbTags = count($entry->getTags());
$this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array( $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
'title' => 'New awesome title', 'title' => 'New awesome title',
'tags' => 'new tag '.uniqid(), 'tags' => 'new tag '.uniqid(),
'starred' => '1', 'starred' => '1',
'archive' => '0', 'archive' => '0',
)); ]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -268,12 +270,12 @@ class WallabagRestControllerTest extends WallabagApiTestCase
// hydrate the tags relations // hydrate the tags relations
$nbTags = count($entry->getTags()); $nbTags = count($entry->getTags());
$this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array( $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
'title' => 'New awesome title', 'title' => 'New awesome title',
'tags' => 'new tag '.uniqid(), 'tags' => 'new tag '.uniqid(),
'starred' => 1, 'starred' => 1,
'archive' => 0, 'archive' => 0,
)); ]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -298,9 +300,9 @@ class WallabagRestControllerTest extends WallabagApiTestCase
$this->markTestSkipped('No content found in db.'); $this->markTestSkipped('No content found in db.');
} }
$tags = array(); $tags = [];
foreach ($entry->getTags() as $tag) { foreach ($entry->getTags() as $tag) {
$tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel(), 'slug' => $tag->getSlug()); $tags[] = ['id' => $tag->getId(), 'label' => $tag->getLabel(), 'slug' => $tag->getSlug()];
} }
$this->client->request('GET', '/api/entries/'.$entry->getId().'/tags'); $this->client->request('GET', '/api/entries/'.$entry->getId().'/tags');
@ -323,7 +325,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase
$newTags = 'tag1,tag2,tag3'; $newTags = 'tag1,tag2,tag3';
$this->client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags)); $this->client->request('POST', '/api/entries/'.$entry->getId().'/tags', ['tags' => $newTags]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode()); $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@ -337,7 +339,7 @@ class WallabagRestControllerTest extends WallabagApiTestCase
->getRepository('WallabagCoreBundle:Entry') ->getRepository('WallabagCoreBundle:Entry')
->find($entry->getId()); ->find($entry->getId());
$tagsInDB = array(); $tagsInDB = [];
foreach ($entryDB->getTags()->toArray() as $tag) { foreach ($entryDB->getTags()->toArray() as $tag) {
$tagsInDB[$tag->getId()] = $tag->getLabel(); $tagsInDB[$tag->getId()] = $tag->getLabel();
} }
@ -421,4 +423,91 @@ class WallabagRestControllerTest extends WallabagApiTestCase
$this->assertEquals($this->client->getContainer()->getParameter('wallabag_core.version'), $content); $this->assertEquals($this->client->getContainer()->getParameter('wallabag_core.version'), $content);
} }
public function testSaveIsArchivedAfterPost()
{
$entry = $this->client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneBy(['user' => 1, 'isArchived' => true]);
if (!$entry) {
$this->markTestSkipped('No content found in db.');
}
$this->client->request('POST', '/api/entries.json', [
'url' => $entry->getUrl(),
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$content = json_decode($this->client->getResponse()->getContent(), true);
$this->assertEquals(true, $content['is_archived']);
}
public function testSaveIsStarredAfterPost()
{
$entry = $this->client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneBy(['user' => 1, 'isStarred' => true]);
if (!$entry) {
$this->markTestSkipped('No content found in db.');
}
$this->client->request('POST', '/api/entries.json', [
'url' => $entry->getUrl(),
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$content = json_decode($this->client->getResponse()->getContent(), true);
$this->assertEquals(true, $content['is_starred']);
}
public function testSaveIsArchivedAfterPatch()
{
$entry = $this->client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneBy(['user' => 1, 'isArchived' => true]);
if (!$entry) {
$this->markTestSkipped('No content found in db.');
}
$this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
'title' => $entry->getTitle().'++',
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$content = json_decode($this->client->getResponse()->getContent(), true);
$this->assertEquals(true, $content['is_archived']);
}
public function testSaveIsStarredAfterPatch()
{
$entry = $this->client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneBy(['user' => 1, 'isStarred' => true]);
if (!$entry) {
$this->markTestSkipped('No content found in db.');
}
$this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
'title' => $entry->getTitle().'++',
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$content = json_decode($this->client->getResponse()->getContent(), true);
$this->assertEquals(true, $content['is_starred']);
}
} }

View File

@ -36,7 +36,7 @@ abstract class WallabagApiTestCase extends WebTestCase
$loginManager = $container->get('fos_user.security.login_manager'); $loginManager = $container->get('fos_user.security.login_manager');
$firewallName = $container->getParameter('fos_user.firewall_name'); $firewallName = $container->getParameter('fos_user.firewall_name');
$this->user = $userManager->findUserBy(array('username' => 'admin')); $this->user = $userManager->findUserBy(['username' => 'admin']);
$loginManager->loginUser($firewallName, $this->user); $loginManager->loginUser($firewallName, $this->user);
// save the login token into the session and put it in a cookie // save the login token into the session and put it in a cookie

View File

@ -468,7 +468,7 @@ class InstallCommand extends ContainerAwareCommand
try { try {
return in_array($databaseName, $schemaManager->listDatabases()); return in_array($databaseName, $schemaManager->listDatabases());
} catch (\Doctrine\DBAL\Exception\ConnectionException $e) { } catch (\Doctrine\DBAL\Exception\DriverException $e) {
// it means we weren't able to get database list, assume the database doesn't exist // it means we weren't able to get database list, assume the database doesn't exist
return false; return false;

View File

@ -32,7 +32,7 @@ class ConfigController extends Controller
$user = $this->getUser(); $user = $this->getUser();
// handle basic config detail (this form is defined as a service) // handle basic config detail (this form is defined as a service)
$configForm = $this->createForm(ConfigType::class, $config, array('action' => $this->generateUrl('config'))); $configForm = $this->createForm(ConfigType::class, $config, ['action' => $this->generateUrl('config')]);
$configForm->handleRequest($request); $configForm->handleRequest($request);
if ($configForm->isValid()) { if ($configForm->isValid()) {
@ -52,7 +52,7 @@ class ConfigController extends Controller
} }
// handle changing password // handle changing password
$pwdForm = $this->createForm(ChangePasswordType::class, null, array('action' => $this->generateUrl('config').'#set4')); $pwdForm = $this->createForm(ChangePasswordType::class, null, ['action' => $this->generateUrl('config').'#set4']);
$pwdForm->handleRequest($request); $pwdForm->handleRequest($request);
if ($pwdForm->isValid()) { if ($pwdForm->isValid()) {
@ -71,10 +71,10 @@ class ConfigController extends Controller
} }
// handle changing user information // handle changing user information
$userForm = $this->createForm(UserInformationType::class, $user, array( $userForm = $this->createForm(UserInformationType::class, $user, [
'validation_groups' => array('Profile'), 'validation_groups' => ['Profile'],
'action' => $this->generateUrl('config').'#set3', 'action' => $this->generateUrl('config').'#set3',
)); ]);
$userForm->handleRequest($request); $userForm->handleRequest($request);
if ($userForm->isValid()) { if ($userForm->isValid()) {
@ -89,7 +89,7 @@ class ConfigController extends Controller
} }
// handle rss information // handle rss information
$rssForm = $this->createForm(RssType::class, $config, array('action' => $this->generateUrl('config').'#set2')); $rssForm = $this->createForm(RssType::class, $config, ['action' => $this->generateUrl('config').'#set2']);
$rssForm->handleRequest($request); $rssForm->handleRequest($request);
if ($rssForm->isValid()) { if ($rssForm->isValid()) {
@ -106,7 +106,7 @@ class ConfigController extends Controller
// handle tagging rule // handle tagging rule
$taggingRule = new TaggingRule(); $taggingRule = new TaggingRule();
$newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, array('action' => $this->generateUrl('config').'#set5')); $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $this->generateUrl('config').'#set5']);
$newTaggingRule->handleRequest($request); $newTaggingRule->handleRequest($request);
if ($newTaggingRule->isValid()) { if ($newTaggingRule->isValid()) {
@ -126,10 +126,10 @@ class ConfigController extends Controller
$newUser = $userManager->createUser(); $newUser = $userManager->createUser();
// enable created user by default // enable created user by default
$newUser->setEnabled(true); $newUser->setEnabled(true);
$newUserForm = $this->createForm(NewUserType::class, $newUser, array( $newUserForm = $this->createForm(NewUserType::class, $newUser, [
'validation_groups' => array('Profile'), 'validation_groups' => ['Profile'],
'action' => $this->generateUrl('config').'#set6', 'action' => $this->generateUrl('config').'#set6',
)); ]);
$newUserForm->handleRequest($request); $newUserForm->handleRequest($request);
if ($newUserForm->isValid() && $this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN')) { if ($newUserForm->isValid() && $this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN')) {
@ -140,6 +140,7 @@ class ConfigController extends Controller
$config->setItemsPerPage($this->getParameter('wallabag_core.items_on_page')); $config->setItemsPerPage($this->getParameter('wallabag_core.items_on_page'));
$config->setRssLimit($this->getParameter('wallabag_core.rss_limit')); $config->setRssLimit($this->getParameter('wallabag_core.rss_limit'));
$config->setLanguage($this->getParameter('wallabag_core.language')); $config->setLanguage($this->getParameter('wallabag_core.language'));
$config->setReadingSpeed($this->getParameter('wallabag_core.reading_speed'));
$em->persist($config); $em->persist($config);
@ -147,27 +148,27 @@ class ConfigController extends Controller
$this->get('session')->getFlashBag()->add( $this->get('session')->getFlashBag()->add(
'notice', 'notice',
$this->get('translator')->trans('flashes.config.notice.user_added', array('%username%' => $newUser->getUsername())) $this->get('translator')->trans('flashes.config.notice.user_added', ['%username%' => $newUser->getUsername()])
); );
return $this->redirect($this->generateUrl('config').'#set6'); return $this->redirect($this->generateUrl('config').'#set6');
} }
return $this->render('WallabagCoreBundle:Config:index.html.twig', array( return $this->render('WallabagCoreBundle:Config:index.html.twig', [
'form' => array( 'form' => [
'config' => $configForm->createView(), 'config' => $configForm->createView(),
'rss' => $rssForm->createView(), 'rss' => $rssForm->createView(),
'pwd' => $pwdForm->createView(), 'pwd' => $pwdForm->createView(),
'user' => $userForm->createView(), 'user' => $userForm->createView(),
'new_user' => $newUserForm->createView(), 'new_user' => $newUserForm->createView(),
'new_tagging_rule' => $newTaggingRule->createView(), 'new_tagging_rule' => $newTaggingRule->createView(),
), ],
'rss' => array( 'rss' => [
'username' => $user->getUsername(), 'username' => $user->getUsername(),
'token' => $config->getRssToken(), 'token' => $config->getRssToken(),
), ],
'twofactor_auth' => $this->getParameter('twofactor_auth'), 'twofactor_auth' => $this->getParameter('twofactor_auth'),
)); ]);
} }
/** /**
@ -187,7 +188,7 @@ class ConfigController extends Controller
$em->flush(); $em->flush();
if ($request->isXmlHttpRequest()) { if ($request->isXmlHttpRequest()) {
return new JsonResponse(array('token' => $config->getRssToken())); return new JsonResponse(['token' => $config->getRssToken()]);
} }
$this->get('session')->getFlashBag()->add( $this->get('session')->getFlashBag()->add(
@ -229,7 +230,7 @@ class ConfigController extends Controller
* Retrieve config for the current user. * Retrieve config for the current user.
* If no config were found, create a new one. * If no config were found, create a new one.
* *
* @return Wallabag\CoreBundle\Entity\Config * @return Config
*/ */
private function getConfig() private function getConfig()
{ {

View File

@ -21,9 +21,9 @@ class DeveloperController extends Controller
{ {
$clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll(); $clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll();
return $this->render('WallabagCoreBundle:Developer:index.html.twig', array( return $this->render('WallabagCoreBundle:Developer:index.html.twig', [
'clients' => $clients, 'clients' => $clients,
)); ]);
} }
/** /**
@ -43,7 +43,7 @@ class DeveloperController extends Controller
$clientForm->handleRequest($request); $clientForm->handleRequest($request);
if ($clientForm->isValid()) { if ($clientForm->isValid()) {
$client->setAllowedGrantTypes(array('token', 'authorization_code', 'password', 'refresh_token')); $client->setAllowedGrantTypes(['token', 'authorization_code', 'password', 'refresh_token']);
$em->persist($client); $em->persist($client);
$em->flush(); $em->flush();
@ -52,15 +52,15 @@ class DeveloperController extends Controller
'flashes.developer.notice.client_created' 'flashes.developer.notice.client_created'
); );
return $this->render('WallabagCoreBundle:Developer:client_parameters.html.twig', array( return $this->render('WallabagCoreBundle:Developer:client_parameters.html.twig', [
'client_id' => $client->getPublicId(), 'client_id' => $client->getPublicId(),
'client_secret' => $client->getSecret(), 'client_secret' => $client->getSecret(),
)); ]);
} }
return $this->render('WallabagCoreBundle:Developer:client.html.twig', array( return $this->render('WallabagCoreBundle:Developer:client.html.twig', [
'form' => $clientForm->createView(), 'form' => $clientForm->createView(),
)); ]);
} }
/** /**

View File

@ -23,10 +23,16 @@ class EntryController extends Controller
{ {
try { try {
$entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$em->persist($entry); $em->persist($entry);
$em->flush(); $em->flush();
} catch (\Exception $e) { } catch (\Exception $e) {
$this->get('logger')->error('Error while saving an entry', [
'exception' => $e,
'entry' => $entry,
]);
return false; return false;
} }
@ -54,24 +60,25 @@ class EntryController extends Controller
if (false !== $existingEntry) { if (false !== $existingEntry) {
$this->get('session')->getFlashBag()->add( $this->get('session')->getFlashBag()->add(
'notice', 'notice',
$this->get('translator')->trans('flashes.entry.notice.entry_already_saved', array('%date%' => $existingEntry->getCreatedAt()->format('d-m-Y'))) $this->get('translator')->trans('flashes.entry.notice.entry_already_saved', ['%date%' => $existingEntry->getCreatedAt()->format('d-m-Y')])
); );
return $this->redirect($this->generateUrl('view', array('id' => $existingEntry->getId()))); return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()]));
} }
$this->updateEntry($entry); $message = 'flashes.entry.notice.entry_saved';
$this->get('session')->getFlashBag()->add( if (false === $this->updateEntry($entry)) {
'notice', $message = 'flashes.entry.notice.entry_saved_failed';
'flashes.entry.notice.entry_saved' }
);
$this->get('session')->getFlashBag()->add('notice', $message);
return $this->redirect($this->generateUrl('homepage')); return $this->redirect($this->generateUrl('homepage'));
} }
return $this->render('WallabagCoreBundle:Entry:new_form.html.twig', array( return $this->render('WallabagCoreBundle:Entry:new_form.html.twig', [
'form' => $form->createView(), 'form' => $form->createView(),
)); ]);
} }
/** /**
@ -131,12 +138,12 @@ class EntryController extends Controller
'flashes.entry.notice.entry_updated' 'flashes.entry.notice.entry_updated'
); );
return $this->redirect($this->generateUrl('view', array('id' => $entry->getId()))); return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
} }
return $this->render('WallabagCoreBundle:Entry:edit.html.twig', array( return $this->render('WallabagCoreBundle:Entry:edit.html.twig', [
'form' => $form->createView(), 'form' => $form->createView(),
)); ]);
} }
/** /**
@ -257,17 +264,17 @@ class EntryController extends Controller
$entries->setCurrentPage($page); $entries->setCurrentPage($page);
} catch (OutOfRangeCurrentPageException $e) { } catch (OutOfRangeCurrentPageException $e) {
if ($page > 1) { if ($page > 1) {
return $this->redirect($this->generateUrl($type, array('page' => $entries->getNbPages())), 302); return $this->redirect($this->generateUrl($type, ['page' => $entries->getNbPages()]), 302);
} }
} }
return $this->render( return $this->render(
'WallabagCoreBundle:Entry:entries.html.twig', 'WallabagCoreBundle:Entry:entries.html.twig',
array( [
'form' => $form->createView(), 'form' => $form->createView(),
'entries' => $entries, 'entries' => $entries,
'currentPage' => $page, 'currentPage' => $page,
) ]
); );
} }
@ -286,7 +293,7 @@ class EntryController extends Controller
return $this->render( return $this->render(
'WallabagCoreBundle:Entry:entry.html.twig', 'WallabagCoreBundle:Entry:entry.html.twig',
array('entry' => $entry) ['entry' => $entry]
); );
} }
@ -314,7 +321,7 @@ class EntryController extends Controller
$message $message
); );
return $this->redirect($this->generateUrl('view', array('id' => $entry->getId()))); return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
} }
/** /**
@ -344,7 +351,9 @@ class EntryController extends Controller
$message $message
); );
return $this->redirect($request->headers->get('referer')); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
return $this->redirect($redirectUrl);
} }
/** /**
@ -374,7 +383,9 @@ class EntryController extends Controller
$message $message
); );
return $this->redirect($request->headers->get('referer')); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
return $this->redirect($redirectUrl);
} }
/** /**
@ -394,7 +405,7 @@ class EntryController extends Controller
// to avoid redirecting to the deleted entry. Ugh. // to avoid redirecting to the deleted entry. Ugh.
$url = $this->generateUrl( $url = $this->generateUrl(
'view', 'view',
array('id' => $entry->getId()), ['id' => $entry->getId()],
UrlGeneratorInterface::ABSOLUTE_URL UrlGeneratorInterface::ABSOLUTE_URL
); );
@ -408,7 +419,11 @@ class EntryController extends Controller
); );
// don't redirect user to the deleted entry // don't redirect user to the deleted entry
return $this->redirect($url !== $request->headers->get('referer') ? $request->headers->get('referer') : $this->generateUrl('homepage')); $to = ($url !== $request->headers->get('referer') ? $request->headers->get('referer') : null);
$redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to);
return $this->redirect($redirectUrl);
} }
/** /**
@ -426,11 +441,11 @@ class EntryController extends Controller
/** /**
* Check for existing entry, if it exists, redirect to it with a message. * Check for existing entry, if it exists, redirect to it with a message.
* *
* @param $entry * @param Entry $entry
* *
* @return array|bool * @return Entry|bool
*/ */
private function checkIfEntryAlreadyExists($entry) private function checkIfEntryAlreadyExists(Entry $entry)
{ {
return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId());
} }

View File

@ -16,12 +16,15 @@ class ExportController extends Controller
/** /**
* Gets one entry content. * Gets one entry content.
* *
* @param Entry $entry * @param Entry $entry
* @param string $format
* *
* @Route("/export/{id}.{format}", name="export_entry", requirements={ * @Route("/export/{id}.{format}", name="export_entry", requirements={
* "format": "epub|mobi|pdf|json|xml|txt|csv", * "format": "epub|mobi|pdf|json|xml|txt|csv",
* "id": "\d+" * "id": "\d+"
* }) * })
*
* @return \Symfony\Component\HttpFoundation\Response
*/ */
public function downloadEntryAction(Entry $entry, $format) public function downloadEntryAction(Entry $entry, $format)
{ {
@ -38,10 +41,15 @@ class ExportController extends Controller
/** /**
* Export all entries for current user. * Export all entries for current user.
* *
* @param string $format
* @param string $category
*
* @Route("/export/{category}.{format}", name="export_entries", requirements={ * @Route("/export/{category}.{format}", name="export_entries", requirements={
* "format": "epub|mobi|pdf|json|xml|txt|csv", * "format": "epub|mobi|pdf|json|xml|txt|csv",
* "category": "all|unread|starred|archive" * "category": "all|unread|starred|archive"
* }) * })
*
* @return \Symfony\Component\HttpFoundation\Response
*/ */
public function downloadEntriesAction($format, $category) public function downloadEntriesAction($format, $category)
{ {

View File

@ -87,9 +87,9 @@ class RssController extends Controller
$perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit');
$entries->setMaxPerPage($perPage); $entries->setMaxPerPage($perPage);
return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', [
'type' => $type, 'type' => $type,
'entries' => $entries, 'entries' => $entries,
)); ]);
} }
} }

View File

@ -14,7 +14,7 @@ class StaticController extends Controller
{ {
return $this->render( return $this->render(
'WallabagCoreBundle:Static:howto.html.twig', 'WallabagCoreBundle:Static:howto.html.twig',
array() []
); );
} }
@ -25,10 +25,10 @@ class StaticController extends Controller
{ {
return $this->render( return $this->render(
'WallabagCoreBundle:Static:about.html.twig', 'WallabagCoreBundle:Static:about.html.twig',
array( [
'version' => $this->getParameter('wallabag_core.version'), 'version' => $this->getParameter('wallabag_core.version'),
'paypal_url' => $this->getParameter('wallabag_core.paypal_url'), 'paypal_url' => $this->getParameter('wallabag_core.paypal_url'),
) ]
); );
} }
@ -39,7 +39,7 @@ class StaticController extends Controller
{ {
return $this->render( return $this->render(
'WallabagCoreBundle:Static:quickstart.html.twig', 'WallabagCoreBundle:Static:quickstart.html.twig',
array() []
); );
} }
} }

View File

@ -13,6 +13,7 @@ class TagController extends Controller
{ {
/** /**
* @param Request $request * @param Request $request
* @param Entry $entry
* *
* @Route("/new-tag/{entry}", requirements={"entry" = "\d+"}, name="new_tag") * @Route("/new-tag/{entry}", requirements={"entry" = "\d+"}, name="new_tag")
* *
@ -38,13 +39,13 @@ class TagController extends Controller
'flashes.tag.notice.tag_added' 'flashes.tag.notice.tag_added'
); );
return $this->redirect($this->generateUrl('view', array('id' => $entry->getId()))); return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
} }
return $this->render('WallabagCoreBundle:Tag:new_form.html.twig', array( return $this->render('WallabagCoreBundle:Tag:new_form.html.twig', [
'form' => $form->createView(), 'form' => $form->createView(),
'entry' => $entry, 'entry' => $entry,
)); ]);
} }
/** /**
@ -64,7 +65,9 @@ class TagController extends Controller
} }
$em->flush(); $em->flush();
return $this->redirect($request->headers->get('referer')); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
return $this->redirect($redirectUrl);
} }
/** /**
@ -78,13 +81,13 @@ class TagController extends Controller
{ {
$tags = $this->getDoctrine() $tags = $this->getDoctrine()
->getRepository('WallabagCoreBundle:Tag') ->getRepository('WallabagCoreBundle:Tag')
->findTags($this->getUser()->getId()); ->findAllTags($this->getUser()->getId());
return $this->render( return $this->render(
'WallabagCoreBundle:Tag:tags.html.twig', 'WallabagCoreBundle:Tag:tags.html.twig',
array( [
'tags' => $tags, 'tags' => $tags,
) ]
); );
} }
} }

View File

@ -6,7 +6,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\Persistence\ObjectManager;
use Wallabag\CoreBundle\Entity\Config; use Wallabag\CoreBundle\Entity\Config;
use Wallabag\CoreBundle\Entity\TaggingRule;
class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
{ {
@ -16,12 +15,6 @@ class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
public function load(ObjectManager $manager) public function load(ObjectManager $manager)
{ {
$adminConfig = new Config($this->getReference('admin-user')); $adminConfig = new Config($this->getReference('admin-user'));
$taggingRule = new TaggingRule();
$taggingRule->setConfig($adminConfig);
$taggingRule->setRule('title matches "wallabag"');
$taggingRule->setTags(['wallabag']);
$manager->persist($taggingRule);
$adminConfig->setTheme('material'); $adminConfig->setTheme('material');
$adminConfig->setItemsPerPage(30); $adminConfig->setItemsPerPage(30);

View File

@ -16,18 +16,26 @@ class LoadTaggingRuleData extends AbstractFixture implements OrderedFixtureInter
{ {
$tr1 = new TaggingRule(); $tr1 = new TaggingRule();
$tr1->setRule('content matches "spurs"'); $tr1->setRule('content matches "spurs"');
$tr1->setTags(array('sport')); $tr1->setTags(['sport']);
$tr1->setConfig($this->getReference('admin-config')); $tr1->setConfig($this->getReference('admin-config'));
$manager->persist($tr1); $manager->persist($tr1);
$tr2 = new TaggingRule(); $tr2 = new TaggingRule();
$tr2->setRule('content matches "basket"'); $tr2->setRule('content matches "basket"');
$tr2->setTags(array('sport')); $tr2->setTags(['sport']);
$tr2->setConfig($this->getReference('admin-config')); $tr2->setConfig($this->getReference('admin-config'));
$manager->persist($tr2); $manager->persist($tr2);
$tr3 = new TaggingRule();
$tr3->setRule('title matches "wallabag"');
$tr3->setTags(['wallabag']);
$tr3->setConfig($this->getReference('admin-config'));
$manager->persist($tr3);
$manager->flush(); $manager->flush();
} }

View File

@ -177,8 +177,16 @@ class Entry
private $user; private $user;
/** /**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist", "remove"}) * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"})
* @ORM\JoinTable * @ORM\JoinTable(
* name="entry_tag",
* joinColumns={
* @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
* }
* )
* *
* @Groups({"entries_for_user", "export_all"}) * @Groups({"entries_for_user", "export_all"})
*/ */
@ -526,13 +534,18 @@ class Entry
} }
} }
$this->tags[] = $tag; $this->tags->add($tag);
$tag->addEntry($this); $tag->addEntry($this);
} }
public function removeTag(Tag $tag) public function removeTag(Tag $tag)
{ {
if (!$this->tags->contains($tag)) {
return;
}
$this->tags->removeElement($tag); $this->tags->removeElement($tag);
$tag->removeEntry($this);
} }
/** /**

View File

@ -98,9 +98,30 @@ class Tag
return $this->slug; return $this->slug;
} }
/**
* @param Entry $entry
*/
public function addEntry(Entry $entry) public function addEntry(Entry $entry)
{ {
$this->entries[] = $entry; if ($this->entries->contains($entry)) {
return;
}
$this->entries->add($entry);
$entry->addTag($this);
}
/**
* @param Entry $entry
*/
public function removeEntry(Entry $entry)
{
if (!$this->entries->contains($entry)) {
return;
}
$this->entries->removeElement($entry);
$entry->removeTag($this);
} }
public function hasEntry($entry) public function hasEntry($entry)
@ -117,4 +138,16 @@ class Tag
{ {
return $this->entries; return $this->entries;
} }
public function getEntriesByUserId($userId)
{
$filteredEntries = new ArrayCollection();
foreach ($this->entries as $entry) {
if ($entry->getUser()->getId() === $userId) {
$filteredEntries->add($entry);
}
}
return $filteredEntries;
}
} }

View File

@ -36,9 +36,9 @@ class LocaleListener implements EventSubscriberInterface
public static function getSubscribedEvents() public static function getSubscribedEvents()
{ {
return array( return [
// must be registered before the default Locale listener // must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)), KernelEvents::REQUEST => [['onKernelRequest', 17]],
); ];
} }
} }

View File

@ -28,9 +28,9 @@ class RegistrationConfirmedListener implements EventSubscriberInterface
public static function getSubscribedEvents() public static function getSubscribedEvents()
{ {
return array( return [
FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate', FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate',
); ];
} }
public function authenticate(FilterUserResponseEvent $event, $eventName = null, EventDispatcherInterface $eventDispatcher = null) public function authenticate(FilterUserResponseEvent $event, $eventName = null, EventDispatcherInterface $eventDispatcher = null)

View File

@ -15,28 +15,28 @@ class ChangePasswordType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('old_password', PasswordType::class, array( ->add('old_password', PasswordType::class, [
'constraints' => new UserPassword(array('message' => 'validator.password_wrong_value')), 'constraints' => new UserPassword(['message' => 'validator.password_wrong_value']),
'label' => 'config.form_password.old_password_label', 'label' => 'config.form_password.old_password_label',
)) ])
->add('new_password', RepeatedType::class, array( ->add('new_password', RepeatedType::class, [
'type' => PasswordType::class, 'type' => PasswordType::class,
'invalid_message' => 'validator.password_must_match', 'invalid_message' => 'validator.password_must_match',
'required' => true, 'required' => true,
'first_options' => array('label' => 'config.form_password.new_password_label'), 'first_options' => ['label' => 'config.form_password.new_password_label'],
'second_options' => array('label' => 'config.form_password.repeat_new_password_label'), 'second_options' => ['label' => 'config.form_password.repeat_new_password_label'],
'constraints' => array( 'constraints' => [
new Constraints\Length(array( new Constraints\Length([
'min' => 8, 'min' => 8,
'minMessage' => 'validator.password_too_short', 'minMessage' => 'validator.password_too_short',
)), ]),
new Constraints\NotBlank(), new Constraints\NotBlank(),
), ],
'label' => 'config.form_password.new_password_label', 'label' => 'config.form_password.new_password_label',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'config.form.save', 'label' => 'config.form.save',
)) ])
; ;
} }

View File

@ -14,8 +14,8 @@ class ClientType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('redirect_uris', UrlType::class, array('required' => true, 'label' => 'developer.client.form.redirect_uris_label')) ->add('redirect_uris', UrlType::class, ['required' => true, 'label' => 'developer.client.form.redirect_uris_label'])
->add('save', SubmitType::class, array('label' => 'developer.client.form.save_label')) ->add('save', SubmitType::class, ['label' => 'developer.client.form.save_label'])
; ;
$builder->get('redirect_uris') $builder->get('redirect_uris')
@ -24,7 +24,7 @@ class ClientType extends AbstractType
return $originalUri; return $originalUri;
}, },
function ($submittedUri) { function ($submittedUri) {
return array($submittedUri); return [$submittedUri];
} }
)) ))
; ;
@ -32,9 +32,9 @@ class ClientType extends AbstractType
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\ApiBundle\Entity\Client', 'data_class' => 'Wallabag\ApiBundle\Entity\Client',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -10,8 +10,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class ConfigType extends AbstractType class ConfigType extends AbstractType
{ {
private $themes = array(); private $themes = [];
private $languages = array(); private $languages = [];
/** /**
* @param array $themes Themes come from the LiipThemeBundle (liip_theme.themes) * @param array $themes Themes come from the LiipThemeBundle (liip_theme.themes)
@ -30,39 +30,39 @@ class ConfigType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('theme', ChoiceType::class, array( ->add('theme', ChoiceType::class, [
'choices' => array_flip($this->themes), 'choices' => array_flip($this->themes),
'choices_as_values' => true, 'choices_as_values' => true,
'label' => 'config.form_settings.theme_label', 'label' => 'config.form_settings.theme_label',
)) ])
->add('items_per_page', null, array( ->add('items_per_page', null, [
'label' => 'config.form_settings.items_per_page_label', 'label' => 'config.form_settings.items_per_page_label',
)) ])
->add('reading_speed', ChoiceType::class, array( ->add('reading_speed', ChoiceType::class, [
'label' => 'config.form_settings.reading_speed.label', 'label' => 'config.form_settings.reading_speed.label',
'choices' => array( 'choices' => [
'config.form_settings.reading_speed.100_word' => '0.5', 'config.form_settings.reading_speed.100_word' => '0.5',
'config.form_settings.reading_speed.200_word' => '1', 'config.form_settings.reading_speed.200_word' => '1',
'config.form_settings.reading_speed.300_word' => '1.5', 'config.form_settings.reading_speed.300_word' => '1.5',
'config.form_settings.reading_speed.400_word' => '2', 'config.form_settings.reading_speed.400_word' => '2',
), ],
)) ])
->add('language', ChoiceType::class, array( ->add('language', ChoiceType::class, [
'choices' => array_flip($this->languages), 'choices' => array_flip($this->languages),
'choices_as_values' => true, 'choices_as_values' => true,
'label' => 'config.form_settings.language_label', 'label' => 'config.form_settings.language_label',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'config.form.save', 'label' => 'config.form.save',
)) ])
; ;
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\CoreBundle\Entity\Config', 'data_class' => 'Wallabag\CoreBundle\Entity\Config',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -14,30 +14,30 @@ class EditEntryType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('title', TextType::class, array( ->add('title', TextType::class, [
'required' => true, 'required' => true,
'label' => 'entry.edit.title_label', 'label' => 'entry.edit.title_label',
)) ])
->add('is_public', CheckboxType::class, array( ->add('is_public', CheckboxType::class, [
'required' => false, 'required' => false,
'label' => 'entry.edit.is_public_label', 'label' => 'entry.edit.is_public_label',
)) ])
->add('url', TextType::class, array( ->add('url', TextType::class, [
'disabled' => true, 'disabled' => true,
'required' => false, 'required' => false,
'label' => 'entry.edit.url_label', 'label' => 'entry.edit.url_label',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'entry.edit.save_label', 'label' => 'entry.edit.save_label',
)) ])
; ;
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\CoreBundle\Entity\Entry', 'data_class' => 'Wallabag\CoreBundle\Entity\Entry',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -34,28 +34,42 @@ class EntryFilterType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('readingTime', NumberRangeFilterType::class, array( ->add('readingTime', NumberRangeFilterType::class, [
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
$value = $values['value'];
if (null === $value['left_number'][0] || null === $value['right_number'][0]) {
return;
}
$min = (int) ($value['left_number'][0] * $this->user->getConfig()->getReadingSpeed());
$max = (int) ($value['right_number'][0] * $this->user->getConfig()->getReadingSpeed());
$expression = $filterQuery->getExpr()->between($field, $min, $max);
return $filterQuery->createCondition($expression);
},
'label' => 'entry.filters.reading_time.label', 'label' => 'entry.filters.reading_time.label',
)) ])
->add('createdAt', DateRangeFilterType::class, array( ->add('createdAt', DateRangeFilterType::class, [
'left_date_options' => array( 'left_date_options' => [
'attr' => array( 'attr' => [
'placeholder' => 'dd/mm/yyyy', 'placeholder' => 'dd/mm/yyyy',
), ],
'format' => 'dd/MM/yyyy', 'format' => 'dd/MM/yyyy',
'widget' => 'single_text', 'widget' => 'single_text',
), ],
'right_date_options' => array( 'right_date_options' => [
'attr' => array( 'attr' => [
'placeholder' => 'dd/mm/yyyy', 'placeholder' => 'dd/mm/yyyy',
), ],
'format' => 'dd/MM/yyyy', 'format' => 'dd/MM/yyyy',
'widget' => 'single_text', 'widget' => 'single_text',
), ],
'label' => 'entry.filters.created_at.label', 'label' => 'entry.filters.created_at.label',
) ]
) )
->add('domainName', TextFilterType::class, array( ->add('domainName', TextFilterType::class, [
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
$value = $values['value']; $value = $values['value'];
if (strlen($value) <= 2 || empty($value)) { if (strlen($value) <= 2 || empty($value)) {
@ -66,14 +80,26 @@ class EntryFilterType extends AbstractType
return $filterQuery->createCondition($expression); return $filterQuery->createCondition($expression);
}, },
'label' => 'entry.filters.domain_label', 'label' => 'entry.filters.domain_label',
)) ])
->add('isArchived', CheckboxFilterType::class, array( ->add('isArchived', CheckboxFilterType::class, [
'label' => 'entry.filters.archived_label', 'label' => 'entry.filters.archived_label',
)) ])
->add('isStarred', CheckboxFilterType::class, array( ->add('isStarred', CheckboxFilterType::class, [
'label' => 'entry.filters.starred_label', 'label' => 'entry.filters.starred_label',
)) ])
->add('previewPicture', CheckboxFilterType::class, array( ->add('isUnread', CheckboxFilterType::class, [
'label' => 'entry.filters.unread_label',
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
if (false === $values['value']) {
return;
}
$expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
return $filterQuery->createCondition($expression);
},
])
->add('previewPicture', CheckboxFilterType::class, [
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
if (false === $values['value']) { if (false === $values['value']) {
return; return;
@ -84,12 +110,12 @@ class EntryFilterType extends AbstractType
return $filterQuery->createCondition($expression); return $filterQuery->createCondition($expression);
}, },
'label' => 'entry.filters.preview_picture_label', 'label' => 'entry.filters.preview_picture_label',
)) ])
->add('language', ChoiceFilterType::class, array( ->add('language', ChoiceFilterType::class, [
'choices' => array_flip($this->repository->findDistinctLanguageByUser($this->user->getId())), 'choices' => array_flip($this->repository->findDistinctLanguageByUser($this->user->getId())),
'choices_as_values' => true, 'choices_as_values' => true,
'label' => 'entry.filters.language_label', 'label' => 'entry.filters.language_label',
)) ])
; ;
} }
@ -100,9 +126,9 @@ class EntryFilterType extends AbstractType
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'csrf_protection' => false, 'csrf_protection' => false,
'validation_groups' => array('filtering'), 'validation_groups' => ['filtering'],
)); ]);
} }
} }

View File

@ -12,18 +12,18 @@ class NewEntryType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('url', UrlType::class, array( ->add('url', UrlType::class, [
'required' => true, 'required' => true,
'label' => 'entry.new.form_new.url_label', 'label' => 'entry.new.form_new.url_label',
)) ])
; ;
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\CoreBundle\Entity\Entry', 'data_class' => 'Wallabag\CoreBundle\Entity\Entry',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -12,15 +12,15 @@ class NewTagType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('label', TextType::class, array('required' => true)) ->add('label', TextType::class, ['required' => true])
; ;
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\CoreBundle\Entity\Tag', 'data_class' => 'Wallabag\CoreBundle\Entity\Tag',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -17,38 +17,38 @@ class NewUserType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('username', TextType::class, array( ->add('username', TextType::class, [
'required' => true, 'required' => true,
'label' => 'config.form_new_user.username_label', 'label' => 'config.form_new_user.username_label',
)) ])
->add('plainPassword', RepeatedType::class, array( ->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class, 'type' => PasswordType::class,
'invalid_message' => 'validator.password_must_match', 'invalid_message' => 'validator.password_must_match',
'first_options' => array('label' => 'config.form_new_user.password_label'), 'first_options' => ['label' => 'config.form_new_user.password_label'],
'second_options' => array('label' => 'config.form_new_user.repeat_new_password_label'), 'second_options' => ['label' => 'config.form_new_user.repeat_new_password_label'],
'constraints' => array( 'constraints' => [
new Constraints\Length(array( new Constraints\Length([
'min' => 8, 'min' => 8,
'minMessage' => 'validator.password_too_short', 'minMessage' => 'validator.password_too_short',
)), ]),
new Constraints\NotBlank(), new Constraints\NotBlank(),
), ],
'label' => 'config.form_new_user.plain_password_label', 'label' => 'config.form_new_user.plain_password_label',
)) ])
->add('email', EmailType::class, array( ->add('email', EmailType::class, [
'label' => 'config.form_new_user.email_label', 'label' => 'config.form_new_user.email_label',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'config.form.save', 'label' => 'config.form.save',
)) ])
; ;
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\UserBundle\Entity\User', 'data_class' => 'Wallabag\UserBundle\Entity\User',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -12,20 +12,20 @@ class RssType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('rss_limit', null, array( ->add('rss_limit', null, [
'label' => 'config.form_rss.rss_limit', 'label' => 'config.form_rss.rss_limit',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'config.form.save', 'label' => 'config.form.save',
)) ])
; ;
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\CoreBundle\Entity\Config', 'data_class' => 'Wallabag\CoreBundle\Entity\Config',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -14,19 +14,19 @@ class TaggingRuleType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('rule', TextType::class, array( ->add('rule', TextType::class, [
'required' => true, 'required' => true,
'label' => 'config.form_rules.rule_label', 'label' => 'config.form_rules.rule_label',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'config.form.save', 'label' => 'config.form.save',
)) ])
; ;
$tagsField = $builder $tagsField = $builder
->create('tags', TextType::class, array( ->create('tags', TextType::class, [
'label' => 'config.form_rules.tags_label', 'label' => 'config.form_rules.tags_label',
)) ])
->addModelTransformer(new StringToListTransformer(',')); ->addModelTransformer(new StringToListTransformer(','));
$builder->add($tagsField); $builder->add($tagsField);
@ -34,9 +34,9 @@ class TaggingRuleType extends AbstractType
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\CoreBundle\Entity\TaggingRule', 'data_class' => 'Wallabag\CoreBundle\Entity\TaggingRule',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -15,19 +15,19 @@ class UserInformationType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('name', TextType::class, array( ->add('name', TextType::class, [
'label' => 'config.form_user.name_label', 'label' => 'config.form_user.name_label',
)) ])
->add('email', EmailType::class, array( ->add('email', EmailType::class, [
'label' => 'config.form_user.email_label', 'label' => 'config.form_user.email_label',
)) ])
->add('twoFactorAuthentication', CheckboxType::class, array( ->add('twoFactorAuthentication', CheckboxType::class, [
'required' => false, 'required' => false,
'label' => 'config.form_user.twoFactorAuthentication_label', 'label' => 'config.form_user.twoFactorAuthentication_label',
)) ])
->add('save', SubmitType::class, array( ->add('save', SubmitType::class, [
'label' => 'config.form.save', 'label' => 'config.form.save',
)) ])
->remove('username') ->remove('username')
->remove('plainPassword') ->remove('plainPassword')
; ;
@ -40,9 +40,9 @@ class UserInformationType extends AbstractType
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'Wallabag\UserBundle\Entity\User', 'data_class' => 'Wallabag\UserBundle\Entity\User',
)); ]);
} }
public function getBlockPrefix() public function getBlockPrefix()

View File

@ -82,10 +82,10 @@ class ContentProxy
try { try {
$this->tagger->tag($entry); $this->tagger->tag($entry);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->error('Error while trying to automatically tag an entry.', array( $this->logger->error('Error while trying to automatically tag an entry.', [
'entry_url' => $url, 'entry_url' => $url,
'error_msg' => $e->getMessage(), 'error_msg' => $e->getMessage(),
)); ]);
} }
return $entry; return $entry;

Some files were not shown because too many files have changed in this diff Show More