Compare commits

..

132 Commits

Author SHA1 Message Date
6f136f4df2 remove unnecessary spaces 2015-04-07 23:07:02 +02:00
dfc1d3e8f3 fix bug with utf8mb4 2015-04-05 00:27:20 +02:00
47424de64e git fix #1159 and bring icons to all themes (dirty icons) 2015-03-18 22:42:26 +01:00
3ff449c13a Merge pull request #1158 from bohni/dev
double closing parentheses
2015-03-14 19:58:25 +01:00
d1c5afda64 double closing parentheses 2015-03-14 19:04:50 +01:00
7f8f8271e4 redo the whole lot of commits I've deleted while trying Gitlab/Framasoft mirroring 2015-03-14 00:22:11 +01:00
f5618feb73 fix #1154 2015-03-13 23:33:49 +01:00
3d2b9e2e23 fix #1133 2015-03-13 22:53:58 +01:00
92659b8e7f many translations improved and corrected 2015-03-13 22:48:54 +01:00
329104c31d add translations 2015-03-13 17:35:32 +01:00
ae27d0ffca fix little problems and bring previous features to all themes 2015-03-13 17:08:14 +01:00
f76dab12c9 fix for #1153, a couple of improvements and fixed bugs 2015-03-13 16:49:20 +01:00
ab87a7fe69 tag cloud is present, #1122 is implemented 2015-03-08 14:47:22 +01:00
512ff18015 implement #1122 2015-03-08 02:36:37 +01:00
5e10eee8fc Merge branch 'dev' of github.com:wallabag/wallabag into dev 2015-03-08 00:23:10 +01:00
8a66458ba2 mark read and go to next now in the right direction 2015-03-08 00:22:47 +01:00
e139258bb1 added toolbar at the bottom too, let's give it a try 2015-03-08 00:15:10 +01:00
c34a8956e1 implement swipe gestures on mobile to go to next and previous articles 2015-03-07 23:59:27 +01:00
00dc7622fb change system for #1123 and keyboard arrows shortcuts 2015-03-07 22:52:03 +01:00
696ead7b46 Merge pull request #1151 from TomasVotruba/patch-2
composer: min PHP 5.3 added
2015-03-07 22:37:57 +01:00
ba7cd64043 composer: min PHP 5.3 added
Ref: https://github.com/wallabag/wallabag/pull/1150
2015-03-07 20:42:16 +01:00
3b21caa261 remove unnecessary lines (again) 2015-03-07 13:48:40 +01:00
00483a1e0e remove unnecessary line 2015-03-07 13:44:47 +01:00
e9540cad02 autoclose was not declared 2015-03-07 13:39:16 +01:00
0ae1e652c9 fix for #1121 2015-03-04 11:03:41 +01:00
210a2ddaf0 forgotten pictures 2015-03-02 19:00:57 +01:00
059a338034 implement #1123 2015-03-02 00:15:49 +01:00
b692691d7d update jquery to version 2.1.3 2015-03-01 22:11:35 +01:00
5395d7f8f5 fix eventual bugs when user exists in database and connection doesn't work 2015-03-01 21:56:01 +01:00
6269df8df9 fix pdf being saved at root, now in cache/ folder 2015-03-01 20:36:10 +01:00
9e5dc91c03 Merge branch 'dev' of github.com:wallabag/wallabag into dev 2015-02-19 01:39:47 +01:00
8cebef88ec fix for #1102, eventually #1041 2015-02-19 01:39:31 +01:00
056a3c6cdc remove old code 2015-02-19 01:21:30 +01:00
520a573c50 update year of copyright 2015-02-18 19:18:23 +01:00
df89c6f71a Change message type from success to error
See #1096
2015-02-18 19:16:42 +01:00
aa245deedc Merge branch 'dev' of github.com:wallabag/wallabag into dev 2015-02-17 11:03:31 +01:00
d61e86a3d3 fix #1093 2015-02-17 11:03:17 +01:00
336797f309 adapt for php < 5.4
Still not obsolete. :(
2015-02-16 16:57:16 +01:00
cdee5e6570 much better fix for #1082 2015-02-16 15:18:24 +01:00
467503fb2a added warnings on install script on file permissions if writing fails 2015-02-16 12:56:39 +01:00
6b60741600 alternative random function to fix #1082 2015-02-16 00:43:18 +01:00
d523c99399 Delete en_EN language (GB and US are available) 2015-02-15 21:17:50 +01:00
313355cdca updated Windows app link 2015-02-15 21:14:54 +01:00
0a749cff88 1.9.0 version 2015-02-14 16:27:59 +01:00
c35753dd3e support GB english 2015-02-14 16:23:39 +01:00
8df902951b update improvements 2015-02-14 16:15:17 +01:00
650928831b PR #988 done 2015-02-14 15:22:20 +01:00
50b752c21e set registration to false 2015-02-14 15:12:56 +01:00
054c9d8838 (definitely) fixed utf8mb4 and check if user already exists in database before installing first user 2015-02-14 15:12:02 +01:00
7780b8cb37 Merge pull request #1021 from wallabag/register
working on registration support
2015-02-14 13:46:05 +01:00
952faeeb31 forgot this file 2015-02-14 12:36:00 +01:00
698eda739e mainly css improvements 2015-02-14 12:35:22 +01:00
f2321633b9 couple improvements, translations 2015-02-13 19:39:48 +01:00
0eae6d14b8 Merge branch 'dev' into register 2015-02-13 19:15:31 +01:00
dc6ec98758 just a reminder 2015-02-13 19:14:56 +01:00
31556b05d0 Merge pull request #1022 from wallabag/sendmailatregistration
Send email at registration
2015-02-13 19:13:01 +01:00
6cb5e1c9f5 improvements to internal registration and translations 2015-02-13 19:10:22 +01:00
57068585c0 Merge branch 'dev' into sendmailatregistration 2015-02-13 17:14:08 +01:00
af13787e74 fix #1078 2015-02-13 17:13:11 +01:00
d7d88631e1 Merge pull request #1015 from wallabag/savewithtags
Savewithtags
2015-02-10 22:23:48 +01:00
9fdd88436d fixed bug 2015-02-10 22:21:42 +01:00
1394c0bd64 great improvements to tagging when saving a link system <3 2015-02-10 02:28:53 +01:00
2e4e94a7a4 Merge branch 'dev' into savewithtags 2015-02-10 01:28:24 +01:00
28c42eb1d8 Merge pull request #1053 from erixtekila/dev
Fix fetched entries when localized
2015-02-10 01:23:30 +01:00
cefdc12380 changed description text place in about screen 2015-02-10 01:16:50 +01:00
11ef4de52d added a final screen 2015-02-10 01:14:28 +01:00
8d7ec54658 improvements for the installer 2015-02-10 00:32:38 +01:00
b65d65be31 Merge pull request #1067 from vpmalley/dev
added site config for github gists, jungle-world.com and toolinux.com
2015-02-09 11:41:18 +01:00
3250b6a7a7 fixing display of jungle-world article (issue # 1034) 2015-02-08 18:46:49 -05:00
c76211de3f adding site config for toolinux.com 2015-02-08 17:21:29 -05:00
7f31a3ed24 fixing gist parsing 2015-02-08 15:58:24 -05:00
d0ea3544ca add evernote icon 2015-02-05 17:04:14 +01:00
fde4cf0616 Fix fetched entries when localized 2015-02-05 14:19:03 +01:00
5e26c91024 renamed wallabag_compatibility_test since it doesn't do that anymore 2015-02-05 00:05:43 +01:00
571b99e804 added evernote support 2015-02-04 23:50:33 +01:00
1c91178932 fix autoclose (#984) and bookmarklet mode 2015-02-04 23:37:37 +01:00
3fb0d44a67 Merge branch 'dev' of github.com:wallabag/wallabag into dev 2015-02-04 22:18:28 +01:00
976d6935ed fix UTF8MB4 problems, make an option, add info and also change documentation links 2015-02-04 22:18:13 +01:00
96861c5db9 Merge pull request #1042 from edent/en-gb
Added en-GB
2015-02-02 16:57:07 +01:00
96a3707895 Added en-GB translation
Added a translation for British English.

This also tidies up some of the language issues - as well as spelling "favourite" correctly ;-)
2015-02-02 15:37:08 +00:00
23423f8d69 fixed random on default theme 2015-02-01 12:27:34 +01:00
8f209e8a26 Merge branch 'dev' into savewithtags 2015-02-01 12:23:30 +01:00
fae15c9f84 Merge pull request #968 from wallabag/reloadarticle
added reload function
2015-02-01 12:22:35 +01:00
89637c2a1d added reload icon and fixed a bug where random could redirect to deleted articles 2015-02-01 12:22:14 +01:00
d4b6e20e2f merge 2015-02-01 12:05:10 +01:00
3831c1525c Merge pull request #964 from wallabag/randomarticle
implemented random button
2015-02-01 12:01:39 +01:00
522841c77e added some icomoon fonts (lots \!) and integrated random button for now 2015-02-01 12:01:04 +01:00
c416cab8c9 Merge branch 'dev' into randomarticle 2015-02-01 11:33:41 +01:00
b05f482dd2 Merge branch 'dev' into reloadarticle 2015-02-01 11:27:10 +01:00
bc6f5a8086 Merge pull request #1026 from wallabag/checkpdo
New installation process
2015-02-01 00:44:40 +01:00
9834d87e97 final adjustments 2015-02-01 00:44:13 +01:00
89e8812494 merge 2015-01-31 23:50:40 +01:00
dd0d7ad9a1 add informations on databases systems 2015-01-31 23:44:20 +01:00
22f19b23a6 view improvements & check if at least one pdo driver is available 2015-01-31 23:35:45 +01:00
8880d88b4e Merge pull request #1031 from jlnostr/dev
Update german localisation.
2015-01-27 19:33:16 +01:00
f8100e0d05 Update german localisation. 2015-01-27 18:05:44 +01:00
364953ede5 Merge pull request #1030 from wallabag/revert-1028-master
Revert "Update german localisation."
2015-01-27 01:00:22 +01:00
a1d6e03407 Revert "Update german localisation." 2015-01-27 00:59:38 +01:00
4fd0b5d886 Merge pull request #1028 from jlnostr/master
Update german localisation.
2015-01-27 00:59:31 +01:00
ca056e7fd1 changes for 1026 for PDO exceptions 2015-01-27 00:41:25 +01:00
40377add14 Forgot to update the .mo file. Fixed. 2015-01-26 21:33:29 +01:00
0bb1f5c5c2 Update german localisation. 2015-01-26 21:14:26 +01:00
3829c54bc5 fix for special caracters in .mobi filenames 2015-01-26 17:44:52 +01:00
42ac69337f fix for spaces in .mobi filenames 2015-01-26 00:16:14 +01:00
369e00e60b add a information message to fill all the fields 2015-01-25 22:56:11 +01:00
c1e90b9e8f some improvements 2015-01-25 22:42:31 +01:00
444f140639 wow. Many changes to installation script. Much easier. 2015-01-25 17:43:58 +01:00
1be071f9f0 fix syntax errors 2015-01-24 15:43:45 +01:00
3e1daa4c90 allow to send confirmation emails when creating a new user 2015-01-24 15:09:18 +01:00
e25972f830 Merge branch 'dev' of github.com:wallabag/wallabag into dev 2015-01-24 14:35:36 +01:00
a3a9e75e62 correct a bug when email was not sended when creating a new user 2015-01-24 14:35:03 +01:00
1fbef3bfb5 resetting debug to false 2015-01-24 12:54:58 +01:00
121691e900 working on registration support 2015-01-23 16:34:56 +01:00
0d36d2af95 Merge pull request #1019 from wallabag/revert-1018-fix-share-email-body-dev
Revert "URL encode 'via @wallabagapp' email body"
2015-01-22 06:17:41 +01:00
e56ef77464 Revert "URL encode 'via @wallabagapp' email body" 2015-01-22 06:17:33 +01:00
4c76ad6edf Merge pull request #1018 from shtrom/fix-share-email-body-dev
URL encode 'via @wallabagapp' email body
2015-01-22 00:52:56 +01:00
64364606dd URL encode 'via @wallabagapp' email body
Signed-off-by: Olivier Mehani <olivier.mehani@nicta.com.au>
2015-01-22 10:36:21 +11:00
308fca6b78 forgotted default theme 2015-01-21 23:08:04 +01:00
14d98f0611 can add tags from the saving link popup 2015-01-21 23:04:35 +01:00
cdde19d609 Merge pull request #1013 from wallabag/importtags
Importtags
2015-01-20 00:07:57 +01:00
9a490ad63a from spaces to commas 2015-01-20 00:02:21 +01:00
fa921eac00 Merge branch 'kaffeeringe-patch-1' into dev 2015-01-19 23:32:01 +01:00
1cedeb681f (kind of) fix for #1011 and little corrections for PDF export 2015-01-19 23:19:09 +01:00
3052cfb7ca Add Tags on Import
I fixed it! And it works for me. 

But: I am not too good with programming. So better check the code ;-)
2015-01-18 21:49:05 +01:00
5537bb3216 remove autoload section in composer.json 2015-01-16 21:09:22 +01:00
b6ab520058 Merge pull request #1004 from wallabag/packagist
Fixed #993: add wallabag to packagist
2015-01-16 20:36:03 +01:00
4cc328edf0 Fixed #993: add wallabag to packagist 2015-01-16 20:35:25 +01:00
e51487f932 implemented ?random url 2014-12-22 16:19:29 +01:00
f3917b1ee4 Merge branch 'dev' into randomarticle 2014-12-22 14:33:01 +01:00
3dcd85c075 merge 2014-12-19 21:08:44 +01:00
44b95cb81d added reload function 2014-12-13 22:56:30 +01:00
311baf86be implemented random button 2014-12-07 23:36:35 +01:00
2673 changed files with 189500 additions and 94710 deletions

View File

@ -1,10 +0,0 @@
{
"presets": [
[
"@babel/preset-env",
{
"modules": false
}
]
]
}

View File

@ -1,7 +0,0 @@
{
"github-oauth": {
"github.com": "PLEASE DO NOT USE THIS TOKEN IN YOUR OWN PROJECTS/FORKS",
"github.com": "This token is reserved for testing the wallabag/wallabag repository",
"github.com": "73d9411c719a0a56259dbfa16673793b39973091"
}
}

View File

@ -1,20 +0,0 @@
; top-most EditorConfig file
root = true
; Unix-style newlines
[*]
end_of_line = LF
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
insert_final_newline = true
[*.{js,css}]
indent_style = space
indent_size = 2
[*akefile]
indent_style = tab
[.github/**.yml]
indent_size = 2

77
.env
View File

@ -1,77 +0,0 @@
# In all environments, the following files are loaded if they exist,
# the latter taking precedence over the former:
#
# * .env contains default values for the environment variables needed by the app
# * .env.local uncommitted file with local overrides
# * .env.$APP_ENV committed environment-specific defaults
# * .env.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env files.
#
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
# https://symfony.com/doc/current/configuration/secrets.html
#
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
DOMAIN_NAME=https://your-wallabag-instance.wallabag.org
SERVER_NAME="Your wallabag instance"
# two factor stuff
TWOFACTOR_AUTH=true
TWOFACTOR_SENDER=no-reply@wallabag.org
# fosuser stuff
FOSUSER_REGISTRATION=true
FOSUSER_CONFIRMATION=true
# how long the access token should live in seconds for the API
FOS_OAUTH_SERVER_ACCESS_TOKEN_LIFETIME=3600
# how long the refresh token should life in seconds for the API
FOS_OAUTH_SERVER_REFRESH_TOKEN_LIFETIME=1209600
FROM_EMAIL=no-reply@wallabag.org
RSS_LIMIT=50
LOCALE=en
DATABASE_TABLE_PREFIX=wallabag_
# redis stuff
REDIS_SCHEME=tcp
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PATH=null
REDIS_PASSWORD=null
###> doctrine/doctrine-bundle ###
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
DATABASE_URL="sqlite:///%kernel.project_dir%/data/db/wallabag.sqlite"
# DATABASE_URL="mysql://root:@127.0.0.1:3306/wallabag?serverVersion=8&charset=utf8mb4"
# DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=14&charset=utf8"
###< doctrine/doctrine-bundle ###
###> nelmio/cors-bundle ###
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
###< nelmio/cors-bundle ###
###> php-amqplib/rabbitmq-bundle ###
RABBITMQ_URL=amqp://guest:guest@localhost:5672
###< php-amqplib/rabbitmq-bundle ###
###> sentry/sentry-symfony ###
SENTRY_DSN=
###< sentry/sentry-symfony ###
###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=b6b54475f34a3238dec16508c4903ca0
#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
#TRUSTED_HOSTS='^(localhost|example\.com)$'
###< symfony/framework-bundle ###
###> symfony/mailer ###
MAILER_DSN=smtp://127.0.0.1
###< symfony/mailer ###

View File

@ -1,7 +0,0 @@
# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
DATABASE_URL="mysql://root:root@127.0.0.1:3306/wallabag_test?serverVersion=8&charset=utf8mb4"

View File

@ -1,7 +0,0 @@
# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
DATABASE_URL="mysql://root:root@127.0.0.1:3306/wallabag_test?serverVersion=8&charset=utf8mb4"

View File

@ -1,7 +0,0 @@
# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
DATABASE_URL="postgresql://wallabag:wallabagrocks@localhost:5432/wallabag_test?serverVersion=14&charset=utf8"

View File

@ -1,7 +0,0 @@
# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
DATABASE_URL="sqlite:///%test_database_path%"

View File

@ -1,14 +0,0 @@
{
"extends": "airbnb-base",
"parser": "@babel/eslint-parser",
"env": {
"browser": true,
"es6": true
},
"globals": {
"Routing": true
},
"rules": {
"import/no-extraneous-dependencies": ["error", {"devDependencies": true, "optionalDependencies": true, "peerDependencies": true}]
}
}

8
.gitattributes vendored
View File

@ -1,8 +0,0 @@
/.editorconfig export-ignore
/.gitattributes export-ignore
/.github export-ignore
/.gitignore export-ignore
/phpstan.neon export-ignore
/phpstan-baseline.neon export-ignore
/phpunit.xml.dist export-ignore
/tests export-ignore

View File

@ -1,61 +0,0 @@
# How to contribute
## Test it locally
### Using Docker
- Clone the repository
- Ensure your Docker daemon is running
- Copy `docker/php/env.example` to `docker/php/env` and customize
- Launch `docker-compose run --rm php composer install` to bootstrap php dependencies
- Launch `docker-compose run --rm php bin/console wallabag:install` to bootstrap your installation
- Launch `docker-compose run --rm php yarn install` to bootstrap dependencies for the frontend
- Launch `docker-compose run --rm php yarn build:dev` to build assets for the frontend
- Launch `docker-compose up -d` to start the stack
You'll then have:
- a PHP daemon with standalone web server
- a Redis database (to handle imports)
- a SQLite database to store articles
You can now access your wallabag instance using that url: `http://127.0.0.1:8000`
If you want to test using an other database than SQLite, uncomment the `postgres` or `mariadb` code from the `docker-compose.yml` file at the root of the repo. Also uncomment related line in the `php` section so the database will be linked to your PHP instance.
### Using your own PHP server
- Ensure you are running PHP >= 7.4.
- Clone the repository
- Launch `composer install`
- If you got some errors, fix them (they might be related to some missing PHP extension from your machine)
- Then `php bin/console wallabag:install`
- If you got some errors, fix them (they might be related to some missing PHP extension from your machine)
- Run `php bin/console server:run`
You can now access your wallabag instance using that url: `http://127.0.0.1:8000`
## You found a bug
Please [open a new issue](https://github.com/wallabag/wallabag/issues/new).
To fix the bug quickly, we need some infos: please answer to the questions in the issue form.
If you have the skills, look for errors into PHP, server and application logs (see `var/logs`).
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
Please fork wallabag and work with **the master branch**.
## Run Tests and PHP formatter
All pull requests need to pass the tests and the code needs match the style guide.
To run the tests locally run:
- when testing using Docker: `docker-compose run --rm php make test`
- otherwise: `make test`
To run the PHP formatter:
- when testing using Docker: `docker-compose run --rm php bin/php-cs-fixer fix`
- otherwise: `php bin/php-cs-fixer fix`

2
.github/FUNDING.yml vendored
View File

@ -1,2 +0,0 @@
# github: [nicosomb, j0k3r, tcitworld, Kdecherf]
liberapay: wallabag

View File

@ -1,30 +0,0 @@
---
name: Fetching content
about: If wallabag can't extract content for an URL
title: Wrong display in wallabag (HOST)
labels: Site Config
assignees: ''
---
<!--
Thank you for reporting a fetching issue.
Please fill in as much of the template below as you're able.
-->
**Before submitting the issue, please read:**
If wallabag can't parse / extract content for a given link, please first read the documentation about it:
http://doc.wallabag.org/en/user/errors_during_fetching.html#how-can-i-help-to-fix-that
We have a lot of requests about fetching config issue. It'll help us A LOT if you give a try to fix it on your own following the doc.
If you failed to fix it yourself, tick the following boxes:
- [ ] I've tried myself without success
- [ ] I've replaced `HOST` in the issue title with the host of the URL that can't be fetched (ie: `nytimes.com`, `20minutes.fr`, `bbc.com`, etc.)
**Content related:**
- URL: [full url of the content]
- wallabag version: [e.g. 2.4.0]
**Describe what's wrong:**
A clear and concise description of what you expected to happen.

View File

@ -1,43 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
<!--
Thank you for reporting an issue.
Please fill in as much of the template below as you're able.
Version: if you know it, otherwise use the git revision
Installation: How did you install wallabag? Using git clone, the docker image, an installer, downloading the package, etc.
PHP version: The version of PHP you are using
OS: The host running wallabag
Database: The storage system your instance is using (SQLite, MySQL/MariaDB or PostgreSQL) with the version
Parameters: Paste the content of your app/config/parameters.yml (hide sensitive stuff if you want)
-->
### Environment
* **Version**:
* **Installation**:
* **PHP version**:
* **OS**:
* **Database**:
* **Parameters**:
<details>
<summary>My <code>app/config/parameters.yml</code> is:</summary>
```
PASTE HERE
```
</details>
### What steps will reproduce the bug?
<!--
Enter details about your bug and how to reproduce it
-->

View File

@ -1,26 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: Feature
assignees: ''
---
<!--
Thank you for suggesting an idea to make wallabag better.
Please fill in as much of the template below as you're able.
-->
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -1,5 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Want to ask something?
url: https://gitter.im/wallabag/wallabag
about: Use Gitter to ask questions.

View File

@ -1,23 +0,0 @@
| Q | A
| ------------- | ---
| Bug fix? | yes/no
| New feature? | yes/no
| BC breaks? | yes/no
| Deprecations? | yes/no
| Tests pass? | yes/no
| Documentation | yes/no
| Translation | yes/no
| CHANGELOG.md | yes/no
| License | MIT
<!--
Please list the issues your PR fixes using special keywords, see
https://help.github.com/articles/closing-issues-using-keywords/
Fixes #…
-->
<!--
- Please fill in this template according to the PR you're about to submit.
- Replace this comment by a description of what your PR is solving.
-->

View File

@ -1,35 +0,0 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
time: "04:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
ignore:
- dependency-name: materialize-css
versions:
- "> 0.98.2"
- package-ecosystem: composer
directory: "/"
schedule:
interval: daily
time: "04:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
- j0k3r
- tcitworld
- Kdecherf
ignore:
- dependency-name: lcobucci/jwt
versions:
- ">= 4.2.0"
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
time: "04:00"
timezone: Europe/Paris
open-pull-requests-limit: 10

Binary file not shown.

Before

Width:  |  Height:  |  Size: 837 KiB

7
.github/release.yml vendored
View File

@ -1,7 +0,0 @@
changelog:
exclude:
labels:
- Dependencies
authors:
- dependabot
- weblate

View File

@ -1,44 +0,0 @@
name: "Assets"
on:
pull_request:
push:
branches:
- master
- 2.*
permissions:
contents: read
jobs:
js:
name: "Building assets"
runs-on: "ubuntu-20.04"
steps:
- name: "Checkout"
uses: "actions/checkout@v3"
- name: "Install Node"
uses: actions/setup-node@v3
with:
node-version: "16"
- name: "Install dependencies with Yarn"
run: "yarn install"
- name: "Build dev assets"
run: "yarn run build:dev"
- name: "Build prod assets"
run: "yarn run build:prod"
- name: "Validate no change were created"
run: |
GITDIFF=`git diff`
if [ "$GITDIFF" == "" ]; then
exit 0
else
git diff
exit 1
fi

View File

@ -1,54 +0,0 @@
name: "CS"
on:
pull_request:
push:
branches:
- master
- 2.*
permissions:
contents: read
jobs:
coding-standards:
name: "CS Fixer, PHPStan & TwigCS"
runs-on: "ubuntu-20.04"
steps:
- name: "Checkout"
uses: "actions/checkout@v3"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
php-version: "7.4"
tools: cs2pr, pecl
extensions: pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
ini-values: "date.timezone=Europe/Paris"
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v2"
with:
composer-options: "--optimize-autoloader --prefer-dist"
- name: "Run PHP CS Fixer"
run: "bin/php-cs-fixer fix --verbose --dry-run --format=checkstyle | cs2pr"
- name: "Generate test cache for PHPStan"
run: "php bin/console cache:clear --env=test"
- name: "Install PHPUnit for PHPStan"
run: "php bin/simple-phpunit install"
- name: "Run PHPStan"
run: "php bin/phpstan analyse --no-progress --error-format=checkstyle | cs2pr"
- name: "Run TwigCS"
run: "php bin/twigcs --severity=error --display=blocking --reporter checkstyle templates/ | cs2pr"
- name: "Run ergebnis/composer-normalize"
run: "composer normalize --dry-run --no-check-lock"

View File

@ -1,153 +0,0 @@
name: "CI"
on:
pull_request:
push:
branches:
- master
- 2.*
env:
PGPASSWORD: wallabagrocks
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
phpunit:
name: "PHP ${{ matrix.php }} using ${{ matrix.database }}"
runs-on: "ubuntu-20.04"
services:
rabbitmq:
image: rabbitmq:3-alpine
ports:
- 5672:5672
redis:
image: redis:6-alpine
ports:
- 6379:6379
strategy:
fail-fast: false
matrix:
php:
- "7.4"
- "8.0"
- "8.1"
- "8.2"
database:
- "sqlite"
- "mysql"
- "pgsql"
steps:
- name: "Checkout"
uses: "actions/checkout@v3"
with:
fetch-depth: 2
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
php-version: "${{ matrix.php }}"
coverage: none
tools: pecl
extensions: json, pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
ini-values: "date.timezone=Europe/Paris"
- name: "Setup MySQL"
if: "${{ matrix.database == 'mysql' }}"
run: |
sudo systemctl start mysql.service
sudo mysql -u root -proot -h 127.0.0.1 -e "CREATE DATABASE wallabag_test"
- name: "Setup PostgreSQL"
if: "${{ matrix.database == 'pgsql' }}"
run: |
sudo systemctl start postgresql
sudo -u postgres psql -d template1 -c "CREATE USER wallabag WITH PASSWORD 'wallabagrocks' CREATEDB"
createdb -h localhost -p 5432 -U wallabag wallabag_test
pg_isready -d wallabag_test -h localhost -p 5432 -U wallabag
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v2"
with:
composer-options: "--optimize-autoloader --prefer-dist"
- name: "Prepare database"
run: "make prepare DB=${{ matrix.database }}"
- name: "Prepare fixtures"
run: "make fixtures"
- name: "Run PHPUnit"
run: "php bin/simple-phpunit -v"
phpunit_no_prefix:
name: "PHP ${{ matrix.php }} using ${{ matrix.database }} without prefix"
runs-on: "ubuntu-20.04"
services:
rabbitmq:
image: rabbitmq:3-alpine
ports:
- 5672:5672
redis:
image: redis:6-alpine
ports:
- 6379:6379
strategy:
fail-fast: true
matrix:
php:
- "8.2"
database:
- "sqlite"
- "mysql"
- "pgsql"
steps:
- name: "Checkout"
uses: "actions/checkout@v3"
with:
fetch-depth: 2
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
php-version: "${{ matrix.php }}"
coverage: none
tools: pecl
extensions: json, pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
ini-values: "date.timezone=Europe/Paris"
- name: "Remove database prefix"
run: |
pip install --user yq
yq -Y --in-place '.parameters.database_table_prefix = ""' app/config/parameters.yml.dist
- name: "Setup MySQL"
if: "${{ matrix.database == 'mysql' }}"
run: |
sudo systemctl start mysql.service
sudo mysql -u root -proot -h 127.0.0.1 -e "CREATE DATABASE wallabag_test"
- name: "Setup PostgreSQL"
if: "${{ matrix.database == 'pgsql' }}"
run: |
sudo systemctl start postgresql
sudo -u postgres psql -d template1 -c "CREATE USER wallabag WITH PASSWORD 'wallabagrocks' CREATEDB"
createdb -h localhost -p 5432 -U wallabag wallabag_test
pg_isready -d wallabag_test -h localhost -p 5432 -U wallabag
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v2"
with:
composer-options: "--optimize-autoloader --prefer-dist"
- name: "Prepare database"
run: "make prepare DB=${{ matrix.database }}"
- name: "Prepare fixtures"
run: "make fixtures"
- name: "Run PHPUnit"
run: "php bin/simple-phpunit -v"

View File

@ -1,25 +0,0 @@
name: Auto-merge Dependabot JS
on: pull_request_target
permissions:
pull-requests: write
contents: write
jobs:
dependabot:
runs-on: ubuntu-latest
if: ${{ github.actor == 'dependabot[bot]' }}
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v1.6.0
with:
github-token: '${{ secrets.GITHUB_TOKEN }}'
- name: Approve and merge minor updates
if: ${{ steps.metadata.outputs.package-ecosystem == 'npm_and_yarn' && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }}
run: |
gh pr review --approve "$PR_URL"
gh pr merge --auto --merge "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,44 +0,0 @@
name: "Translations"
on:
pull_request:
push:
branches:
- master
- 2.*
permissions:
contents: read
jobs:
translations:
name: "Translations"
runs-on: "ubuntu-20.04"
strategy:
matrix:
php:
- "7.4"
steps:
- name: "Checkout"
uses: "actions/checkout@v3"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
php-version: "${{ matrix.php }}"
tools: pecl
extensions: pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
ini-values: "date.timezone=Europe/Paris"
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "Install dependencies with Composer"
uses: "ramsey/composer-install@v2"
with:
composer-options: "--optimize-autoloader --prefer-dist"
- name: "Validate translations"
run: "php bin/console lint:yaml translations -v"

View File

@ -1,39 +0,0 @@
name: "Upload release package"
on:
release:
types:
- created
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
php:
- "7.4"
steps:
- name: "Checkout"
uses: "actions/checkout@v3"
- name: "Install PHP"
uses: "shivammathur/setup-php@v2"
with:
coverage: "none"
php-version: "${{ matrix.php }}"
tools: pecl
extensions: pdo, pdo_mysql, pdo_sqlite, pdo_pgsql, curl, imagick, pgsql, gd, tidy
ini-values: "date.timezone=Europe/Paris"
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create the package
run: make release VERSION=${{ github.event.release.tag_name }}
- name: Upload the package to the release
uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: /tmp/wllbg-release/wallabag-${{ github.event.release.tag_name }}.tar.gz

79
.gitignore vendored
View File

@ -1,70 +1,9 @@
# Cache, log & sessions
/var/*
!/var/cache
/var/cache/*
!var/cache/.gitkeep
!/var/log
/var/log/*
!var/log/.gitkeep
!/var/sessions
/var/sessions/*
!var/sessions/.gitkeep
/bin/*
!/bin/console
# Parameters
/app/config/parameters.yml
# Assets and user uploads
public/uploads/
/public/bundles/*
!/public/bundles/.gitkeep
/public/assets/images/*
!public/assets/images/.gitkeep
/public/wallassets/*.dev.js
# Build
/app/build
/build
/coverage
# Development
docker/php/env
# Composer PHAR
/composer.phar
# Data for wallabag
data/db/wallabag*.sqlite
# assets stuff
node_modules/
bin
# Test-generated files
admin-export.json
specialexport.json
/data/site-credentials-secret-key.txt
# Custom CSS file
public/custom.css
###> friendsofphp/php-cs-fixer ###
/.php-cs-fixer.php
/.php-cs-fixer.cache
###< friendsofphp/php-cs-fixer ###
###> symfony/phpunit-bridge ###
.phpunit.result.cache
/phpunit.xml
###< symfony/phpunit-bridge ###
###> symfony/framework-bundle ###
/.env.local
/.env.local.php
/.env.*.local
/config/secrets/prod/prod.decrypt.private.php
/public/bundles/
/var/
/vendor/
###< symfony/framework-bundle ###
.DS_Store
assets/*
cache/*
vendor
composer.phar
db/poche.sqlite
inc/poche/config.inc.php
inc/3rdparty/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/
.vagrant

1
.nvmrc
View File

@ -1 +0,0 @@
16

View File

@ -1,52 +0,0 @@
<?php
$config = new PhpCsFixer\Config();
return $config
->setRiskyAllowed(true)
->setRules([
'@Symfony' => true,
'@Symfony:risky' => true,
'array_syntax' => [
'syntax' => 'short'
],
'combine_consecutive_unsets' => true,
'heredoc_to_nowdoc' => true,
'no_extra_blank_lines' => [
'tokens' => [
'break',
'continue',
'extra',
'return',
'throw',
'use',
'parenthesis_brace_block',
'square_brace_block',
'curly_brace_block'
],
],
'no_unreachable_default_argument_value' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'ordered_class_elements' => true,
'ordered_imports' => true,
'php_unit_strict' => true,
'phpdoc_order' => true,
// 'psr_autoloading' => true,
'strict_comparison' => true,
'strict_param' => true,
'concat_space' => [
'spacing' => 'one'
],
])
->setFinder(
PhpCsFixer\Finder::create()
->exclude([
'node_modules',
'vendor',
'var',
'web'
])
->in(__DIR__)
)
->setCacheFile('.php-cs-fixer.cache')
;

File diff suppressed because it is too large Load Diff

View File

@ -1,76 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at hello@wallabag.org. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

30
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,30 @@
# How to contribute
## You found a bug
Please [open a new issue](https://github.com/wallabag/wallabag/issues/new).
To fix the bug quickly, we need some infos:
* your wallabag version (on top of the ./index.php file, and also on config page)
* your webserver installation :
* type of hosting (shared or dedicaced)
* in case of a dedicaced 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 problem on the `wallabag_compatibility_test.php` page
* any particular details which could be related
If relevant :
* 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 :
* enable DEBUG mode and look the output at cache/log.txt
* look for errors into php and server logs
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
Please fork wallabag and work with **the dev branch** only. **Do not work on master branch**.
[Don't forget to read our guidelines](https://github.com/wallabag/wallabag/blob/dev/GUIDELINES.md).

View File

@ -1,19 +1,19 @@
Copyright (c) 2013-current Nicolas Lœuillet
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Copyright (c) 2013-2014 Nicolas Lœuillet
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -1,3 +1,17 @@
wallabag is mainly developed by [Nicolas Lœuillet](https://github.com/nicosomb), [@j0k3r](https://github.com/j0k3r), [@tcitworld](https://github.com/tcitworld) and [@Kdecherf](https://github.com/Kdecherf) under the MIT License.
wallabag is based on :
* PHP Readability https://bitbucket.org/fivefilters/php-readability
* Full Text RSS http://code.fivefilters.org/full-text-rss/src
* logo by Maylis Agniel https://github.com/wallabag/logo
* icons http://icomoon.io
* PHP Simple HTML DOM Parser (for Pocket import) http://simplehtmldom.sourceforge.net/
* Session https://github.com/tontof/kriss_feed/blob/master/src/class/Session.php
* Twig http://twig.sensiolabs.org
* Flash messages https://github.com/plasticbrain/PHP-Flash-Messages
* Pagination https://github.com/daveismyname/pagination
* PHPePub https://github.com/Grandt/PHPePub/
Thank you [to others contributors](https://github.com/wallabag/wallabag/graphs/contributors).
wallabag is mainly developed by Nicolas Lœuillet under the MIT License
Thank you so much to @tcitworld and @mariroz.
Contributors : https://github.com/wallabag/wallabag/graphs/contributors

View File

@ -1,62 +0,0 @@
SHELL=bash
TMP_FOLDER=/tmp
RELEASE_FOLDER=wllbg-release
# ensure the ENV variable is well defined
AVAILABLE_ENV := prod dev test
ifneq ($(filter $(ENV),$(AVAILABLE_ENV)),)
# all good
else
# not good, force it to "prod"
override ENV = prod
endif
help: ## Display this help menu
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
clean: ## Clear the application cache
rm -rf var/cache/*
install: ## Install wallabag with the latest version
@./scripts/install.sh $(ENV)
update: ## Update the wallabag installation to the latest version
@./scripts/update.sh $(ENV)
dev: ENV=dev
dev: build ## Install the latest dev version
@./scripts/dev.sh
run: ## Run the wallabag built-in server
@php bin/console server:run --env=dev
build: ## Run webpack
@yarn install
@yarn build:$(ENV)
prepare: clean ## Prepare database for testsuite
ifdef DB
cp .env.test.$(DB) .env.test
endif
-php bin/console doctrine:database:drop --force --env=test
php bin/console doctrine:database:create --env=test
php bin/console doctrine:migrations:migrate --no-interaction --env=test -vv
fixtures: ## Load fixtures into database
php bin/console doctrine:fixtures:load --no-interaction --env=test
test: prepare fixtures ## Launch wallabag testsuite
XDEBUG_MODE=off php -dmemory_limit=-1 bin/simple-phpunit -v
release: ## Create a package. Need a VERSION parameter (eg: `make release VERSION=master`).
ifndef VERSION
$(error VERSION is not set)
endif
@./scripts/release.sh $(VERSION) $(TMP_FOLDER) $(RELEASE_FOLDER) $(ENV)
deploy: ## Deploy wallabag
@bundle exec cap staging deploy
.PHONY: help clean prepare install fixtures update build test release deploy run dev
.DEFAULT_GOAL := install

53
GUIDELINES.md Normal file
View File

@ -0,0 +1,53 @@
# Guidelines for wallabag
If you want to contribute to wallabag, you have some rules to respect. These rules were defined by [PHP Framework Interop Group](http://www.php-fig.org).
## Basic Coding Standard (PSR-1)
This section of the standard comprises what should be considered the standard coding elements that are required to ensure a high level of technical interoperability between shared PHP code.
* Files MUST use only `<?php` and `<?=` tags.
* Files MUST use only UTF-8 without BOM for PHP code.
* Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both.
* Namespaces and classes MUST follow [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md).
* Class names MUST be declared in `StudlyCaps`.
* Class constants MUST be declared in all upper case with underscore separators.
* Method names MUST be declared in `camelCase`.
You can read details on [PHP FIG website](http://www.php-fig.org/psr/psr-1/).
## Coding Style Guide (PSR-2)
This guide extends and expands on PSR-1, the basic coding standard.
The intent of this guide is to reduce cognitive friction when scanning code from different authors. It does so by enumerating a shared set of rules and expectations about how to format PHP code.
The style rules herein are derived from commonalities among the various member projects. When various authors collaborate across multiple projects, it helps to have one set of guidelines to be used among all those projects. Thus, the benefit of this guide is not in the rules themselves, but in the sharing of those rules.
* Code MUST follow PSR-1.
* Code MUST use 4 spaces for indenting, not tabs.
* There MUST NOT be a hard limit on line length; the soft limit MUST be 120 characters; lines SHOULD be 80 characters or less.
* There MUST be one blank line after the `namespace` declaration, and there MUST be one blank line after the block of `use` declarations.
* Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.
* Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.
* Visibility MUST be declared on all properties and methods; `abstract` and `final` MUST be declared before the visibility; `static` MUST be declared after the visibility.
* Control structure keywords MUST have one space after them; method and function calls MUST NOT.
* Opening braces for control structures MUST go on the same line, and closing braces MUST go on the next line after the body.
* Opening parentheses for control structures MUST NOT have a space after them, and closing parentheses for control structures MUST NOT have a space before.
You can read details on [PHP FIG website](http://www.php-fig.org/psr/psr-2/).

View File

@ -1,2 +0,0 @@
.DEFAULT:
gmake $@

View File

@ -1,62 +1,9 @@
# wallabag
# what is wallabag ?
wallabag is a self hostable application allowing you to not miss any content anymore. Click, save, read it when you can. It extracts content so that you can read it when you have time.
![CI](https://github.com/wallabag/wallabag/workflows/CI/badge.svg)
[![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/wallabag/wallabag)
[![Donation Status](https://img.shields.io/liberapay/goal/wallabag.svg?logo=liberapay)](https://liberapay.com/wallabag/donate)
[![Translation status](https://hosted.weblate.org/widgets/wallabag/-/svg-badge.svg)](https://hosted.weblate.org/engage/wallabag/?utm_source=widget)
![License](https://img.shields.io/github/license/wallabag/wallabag)
wallabag is a web application allowing you to save web pages for later reading.
Click, save and read it when you want. It extracts content so that you won't be distracted by pop-ups and cie.
You can install it on your own server, or you can create an account on [wallabag.it](https://wallabag.it).
![wallabag](./.github/images/screenshot.png)
* Website: [wallabag.org](https://wallabag.org)
* Android app: [wallabag/android-app](https://github.com/wallabag/android-app)
* iOS app: [wallabag/ios-app](https://github.com/wallabag/ios-app)
* Browser extension: [wallabag/wallabagger](https://github.com/wallabag/wallabagger)
* GNOME (Linux) app: [read-it-later](https://gitlab.gnome.org/World/read-it-later) (not maintained by this project)
* All resources about wallabag ecosystem are listed here: https://github.com/wallabag/wallabag/wiki/wallabag-ecosystem
## Documentation
The documentation is available at https://doc.wallabag.org.
You can contribute to it through its dedicated repository, available here: https://github.com/wallabag/doc.
## Installation
Please read [the documentation to see the wallabag requirements](https://doc.wallabag.org/en/admin/installation/requirements.html).
Then you can install wallabag by executing the following commands:
```bash
git clone https://github.com/wallabag/wallabag.git
cd wallabag && make install
```
Now, [configure a virtual host](https://doc.wallabag.org/en/admin/installation/virtualhosts.html) to use your wallabag.
### Other methods
Refer to the [installation documentation](https://doc.wallabag.org/en/admin/installation/installation.html) for other installation methods.
## Translation
This project uses [Weblate](https://weblate.org/) for translation.
Feel free to help us [translating wallabag](https://hosted.weblate.org/projects/wallabag/).
## Contributing
To learn more about developing wallabag, please refer to the [contribution guide](./.github/CONTRIBUTING.md).
Content extraction relies on [Graby](https://github.com/j0k3r/graby), [php-readability](https://github.com/j0k3r/php-readability) and [ftr-site-config](https://github.com/fivefilters/ftr-site-config).
More informations on our website: [wallabag.org](http://wallabag.org)
## License
Copyright © 2013-current Nicolas Lœuillet <nicolas@loeuillet.org>
Copyright © 2013-2015 Nicolas Lœuillet <nicolas@loeuillet.org>
This work is free. You can redistribute it and/or modify it under the
terms of the MIT License. See the [COPYING.md](./COPYING.md) file for more details.
terms of the MIT License. See the COPYING file for more details.

View File

@ -1,38 +0,0 @@
## Definition
A release is mostly a git tag of http://github.com/wallabag/wallabag, following [semantic versioning](http://semver.org).
### Steps to release
During this documentation, we assume the release is `$LAST_WALLABAG_RELEASE` (like 2.3.4).
#### Prepare the release
- Update these files with new information
- `config/wallabag.yaml` (`wallabag.version`)
- `CHANGELOG.md`
- Create a PR named "Prepare $LAST_WALLABAG_RELEASE release".
- Wait for test to be ok, merge it.
#### Create a new release on GitHub
- [Create the new release on GitHub](https://github.com/wallabag/wallabag/releases/new) by targetting the `master` branch or any appropriate branch (for instance backports).
- Update [website](https://github.com/wallabag/website) to change MD5 sum and create the release blog post (based on the changelog).
- Update Dockerfile https://github.com/wallabag/docker (and create a new tag)
- Put the next patch version suffixed with `-dev` in `config/wallabag.yaml` (`wallabag.version`)
- Drink a :beer:!
### Target PHP version
`composer.lock` is _always_ built for a particular version, by default the one it is generated (with `composer update`).
If the PHP version used to generate the .lock isn't a widely available one (like PHP 8), a more common one should
be locally specified in `composer.lock`:
```json
"config": {
"platform": {
"php": "7.4.29",
"ext-something": "4.0"
}
}
```

View File

@ -1,5 +0,0 @@
# Security Policy
## Reporting a Vulnerability
Please report security issues to `hello@wallabag.org`

67
TRANSLATION.md Executable file
View File

@ -0,0 +1,67 @@
# How to manage translations for wallabag
This guide will describe the procedure of translation management of the wallabag web application.
All translations are made using [gettext](http://en.wikipedia.org/wiki/Gettext) system and tools.
You will need the [Poedit](http://www.poedit.net/download.php) editor to update, edit and create your translation files easily. However, you can also handle translations also without it: all can be done using gettext tools and your favorite plain text editor only. This guide, however, describes editing with Poedit. If you want to use gettext only, please refer to the xgettext manual page to update po files from sources (see also how it is used by Poedit below) and use msgunfmt tool to compile .mo files manually.
You need to know, that translation phrases are stored in **".po"** files (for example: `locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po`), which are then complied in **".mo"** files using **msgfmt** gettext tool or by Poedit, which will run msgfmt for you in background.
**It's assumed, that you have wallabag installed locally on your computer or on the server you have access to.**
## To change existing translation you will need to do:
### 1. Clear cache
You can do this using **http://your-wallabag-host.com/?empty-cache** link (replace http://your-wallabag-host.com/ with real url of your wallabag application)
OR
from command line:
go to root of your installation of wallabag project and run next command:
`rm -rf ./cache/*`
(this may require root privileges if you run, for example Apache web server with mod_php)
### 2. Generate php files from all twig templates
Do this using next command:
`php ./locale/tools/fillCache.php`
OR
from your browser: **http://your-wallabag-host.com/locale/tools/fillCache.php** (this may require removal of .htaccess file in locale/ directory).
### 3. Configure your Poedit
Open Poedit editor, open Edit->Preferences. Go to "Parsers" tab, click on PHP and press "Edit" button. Make sure your "Parser command:" looks like
`xgettext --no-location --force-po -o %o %C %K %F`
Usually it is required to add "--no-location" to default value.
### 4. Open .po file you want to edit in Poedit and change its settings
Open, for example `locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po` file in your Poedit.
Go to "Catalog"->"Settings..." menu. Then go to "Path" tab and add path to wallabag installation in your local file system. This step can't be omitted as you will not be able to update phrases otherwise.
You can also check "project into" tab to be sure, that "Language" is set correctly (this will allow you to spell check your translation).
### 5. Update opened .po file from sources
Once you have set your path correctly, you are able to update phrases from sources. Press "Update catalog - synchronize it with sources" button or go to "Catalog"->"Update from sources" menu.
As a result you will see confirmation popup with two tabs: "New strings" and "Obsolete strings". Please review and accept changes (or press "Undo" if you see too many obsolete strings, as Poedit will remove them all - in this case please make sure all previous steps are performed w/o errors).
### 6. Translate and save your .po file
If you have any difficulties on this step, please consult with Poedit manual.
Every time you save your .po file, Poedit will also compile appropriate .mo file by default (of course, if not disabled in preferences).
You are now almost done.
### 7. Clear cache again
This step may be required if your web server runs php scripts in name of, say, www user (i.e. Apache with mod_php, not cgi).
##To create new translation
You just have to copy the folder corresponding to the language you want to translate from, change language in the project settings and for the folder and files names. Then start replacing all existing translations with your own.

71
Vagrantfile vendored Normal file
View File

@ -0,0 +1,71 @@
$script_sqlite = <<SCRIPT
apt-get update
apt-get install -y apache2 php5 php5-sqlite php5-xdebug
apt-get clean -y
echo "ServerName localhost" >> /etc/apache2/apache2.conf
service apache2 restart
rm -f /var/www/html/index.html
date > /etc/vagrant_provisioned_at
SCRIPT
$script_mysql = <<SCRIPT
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y apache2 php5 php5-mysql php5-xdebug mysql-server mysql-client
apt-get clean -y
echo "ServerName localhost" >> /etc/apache2/apache2.conf
service apache2 restart
service mysql restart
echo "create database wallabag;" | mysql -u root
rm -f /var/www/html/index.html
date > /etc/vagrant_provisioned_at
SCRIPT
$script_postgres = <<SCRIPT
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y apache2 php5 php5-pgsql php5-xdebug postgresql postgresql-contrib
apt-get clean -y
echo "ServerName localhost" >> /etc/apache2/apache2.conf
service apache2 restart
service postgresql restart
rm -f /var/www/html/index.html
date > /etc/vagrant_provisioned_at
SCRIPT
Vagrant.configure("2") do |config|
config.vm.define "sqlite" do |m|
m.vm.box = "ubuntu/trusty64"
m.vm.provision "shell", inline: $script_sqlite
m.vm.synced_folder ".", "/var/www/html", owner: "www-data", group: "www-data"
end
config.vm.define "mysql" do |m|
m.vm.box = "ubuntu/trusty64"
m.vm.provision "shell", inline: $script_mysql
m.vm.synced_folder ".", "/var/www/html", owner: "www-data", group: "www-data"
end
config.vm.define "postgres" do |m|
m.vm.box = "ubuntu/trusty64"
m.vm.provision "shell", inline: $script_postgres
m.vm.synced_folder ".", "/var/www/html", owner: "www-data", group: "www-data"
end
config.vm.define "debian7" do |m|
m.vm.box = "chef/debian-7.6"
m.vm.provision "shell", inline: $script_sqlite
m.vm.synced_folder ".", "/var/www", owner: "www-data", group: "www-data"
end
config.vm.define "debian6" do |m|
m.vm.box = "chef/debian-6.0.10"
m.vm.provision "shell", inline: $script_sqlite
m.vm.synced_folder ".", "/var/www", owner: "www-data", group: "www-data"
end
config.vm.network :forwarded_port, guest: 80, host: 8003
#config.vm.network "public_network", :bridge => "en0: Wi-Fi (AirPort)"
end

View File

@ -1,424 +0,0 @@
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
- { resource: wallabag.yml }
parameters:
# Allows to use the live reload feature for changes in assets
use_webpack_dev_server: false
craue_config.cache_adapter.class: Craue\ConfigBundle\CacheAdapter\SymfonyCacheComponentAdapter
framework:
#esi: ~
translator:
enabled: true
fallback: "%locale%"
default_path: '%kernel.project_dir%/translations'
secret: "%secret%"
router:
resource: "%kernel.project_dir%/app/config/routing.yml"
strict_requirements: ~
form: ~
csrf_protection: ~
validation:
enable_annotations: true
templating:
engines: ['twig']
default_locale: "%locale%"
trusted_hosts: ~
session:
# handler_id set to null will use default session handler from php.ini
handler_id: session.handler.native_file
save_path: "%kernel.project_dir%/var/sessions/%kernel.environment%"
fragments: ~
http_method_override: true
assets: ~
mailer:
dsn: "%mailer_dsn%"
# Twig Configuration
twig:
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
form_themes:
- "@LexikFormFilter/Form/form_div_layout.html.twig"
exception_controller: Wallabag\CoreBundle\Controller\ExceptionController:showAction
globals:
registration_enabled: '%fosuser_registration%'
# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: "%database_charset%"
path: "%database_path%"
unix_socket: "%database_socket%"
types:
json_array: Wallabag\CoreBundle\Doctrine\JsonArrayType
orm:
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
default:
auto_mapping: true
stof_doctrine_extensions:
default_locale: "%locale%"
translation_fallback: true
orm:
default:
tree: true
sluggable: true
doctrine_migrations:
migrations_paths:
'Application\Migrations': "%kernel.project_dir%/app/DoctrineMigrations"
storage:
table_storage:
table_name: 'migration_versions'
version_column_name: 'version'
version_column_length: 192
executed_at_column_name: 'executed_at'
fos_rest:
param_fetcher_listener: true
body_listener: true
view:
mime_types:
csv:
- 'text/csv'
- 'text/plain'
pdf:
- 'application/pdf'
epub:
- 'application/epub+zip'
mobi:
- 'application/x-mobipocket-ebook'
view_response_listener: 'force'
formats:
xml: true
json: true
txt: true
csv: true
pdf: true
epub: true
mobi: true
failed_validation: HTTP_BAD_REQUEST
routing_loader: false
format_listener:
enabled: true
rules:
- { path: "^/api/entries/([0-9]+)/export.(.*)", priorities: ['epub', 'mobi', 'pdf', 'txt', 'csv'], fallback_format: json, prefer_extension: false }
- { path: "^/api", priorities: ['json', 'xml'], fallback_format: json, prefer_extension: false }
- { path: "^/annotations", priorities: ['json', 'xml'], fallback_format: json, prefer_extension: false }
# for an unknown reason, EACH REQUEST goes to FOS\RestBundle\EventListener\FormatListener
# so we need to add custom rule for custom api export but also for all other routes of the application...
- { path: '^/', priorities: ['text/html', '*/*'], fallback_format: html, prefer_extension: false }
nelmio_api_doc:
areas:
default:
disable_default_routes: true
documentation:
info:
title: wallabag API documentation
description: This is the API documentation of wallabag
version: 2.x
components:
securitySchemes:
Bearer:
type: apiKey
description: 'Value: Bearer {jwt}'
name: Authorization
in: header
security:
- Bearer: []
nelmio_cors:
defaults:
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
expose_headers: []
max_age: 0
hosts: []
#origin_regex: false
paths:
'^/api/':
allow_origin: ['*']
allow_headers: ['Authorization','content-type']
allow_methods: ['POST', 'PUT', 'PATCH','GET', 'DELETE']
max_age: 3600
'^/oauth/':
allow_origin: ['*']
allow_headers: ['Authorization','content-type']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
'^/':
#origin_regex: true
allow_origin: ['*']
allow_headers: ['Authorization','content-type']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
hosts: ['^api\.']
fos_user:
db_driver: orm
firewall_name: secured_area
user_class: Wallabag\UserBundle\Entity\User
registration:
confirmation:
enabled: "%fosuser_confirmation%"
from_email:
address: "%from_email%"
sender_name: wallabag
service:
mailer: Wallabag\UserBundle\Mailer\UserMailer
fos_oauth_server:
db_driver: orm
client_class: Wallabag\ApiBundle\Entity\Client
access_token_class: Wallabag\ApiBundle\Entity\AccessToken
refresh_token_class: Wallabag\ApiBundle\Entity\RefreshToken
auth_code_class: Wallabag\ApiBundle\Entity\AuthCode
service:
user_provider: fos_user.user_provider.username_email
options:
refresh_token_lifetime: "%fos_oauth_server_refresh_token_lifetime%"
access_token_lifetime: "%fos_oauth_server_access_token_lifetime%"
scheb_two_factor:
trusted_device:
enabled: true
cookie_name: wllbg_trusted_computer
lifetime: 2592000
backup_codes:
enabled: true
google:
enabled: true
issuer: "%server_name%"
template: "@WallabagUser/Authentication/form.html.twig"
email:
enabled: true
sender_email: "%twofactor_sender%"
digits: 6
template: "@WallabagUser/Authentication/form.html.twig"
mailer: Wallabag\UserBundle\Mailer\AuthCodeMailer
kphoen_rulerz:
targets:
doctrine: true
old_sound_rabbit_mq:
connections:
default:
host: "%rabbitmq_host%"
port: "%rabbitmq_port%"
user: "%rabbitmq_user%"
password: "%rabbitmq_password%"
vhost: /
lazy: true
producers:
import_pocket:
connection: default
exchange_options:
name: 'wallabag.import.pocket'
type: topic
import_readability:
connection: default
exchange_options:
name: 'wallabag.import.readability'
type: topic
import_pinboard:
connection: default
exchange_options:
name: 'wallabag.import.pinboard'
type: topic
import_delicious:
connection: default
exchange_options:
name: 'wallabag.import.delicious'
type: topic
import_instapaper:
connection: default
exchange_options:
name: 'wallabag.import.instapaper'
type: topic
import_wallabag_v1:
connection: default
exchange_options:
name: 'wallabag.import.wallabag_v1'
type: topic
import_wallabag_v2:
connection: default
exchange_options:
name: 'wallabag.import.wallabag_v2'
type: topic
import_elcurator:
connection: default
exchange_options:
name: 'wallabag.import.elcurator'
type: topic
import_firefox:
connection: default
exchange_options:
name: 'wallabag.import.firefox'
type: topic
import_chrome:
connection: default
exchange_options:
name: 'wallabag.import.chrome'
type: topic
consumers:
import_pocket:
connection: default
exchange_options:
name: 'wallabag.import.pocket'
type: topic
queue_options:
name: 'wallabag.import.pocket'
callback: wallabag_import.consumer.amqp.pocket
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_readability:
connection: default
exchange_options:
name: 'wallabag.import.readability'
type: topic
queue_options:
name: 'wallabag.import.readability'
callback: wallabag_import.consumer.amqp.readability
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_instapaper:
connection: default
exchange_options:
name: 'wallabag.import.instapaper'
type: topic
queue_options:
name: 'wallabag.import.instapaper'
callback: wallabag_import.consumer.amqp.instapaper
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_pinboard:
connection: default
exchange_options:
name: 'wallabag.import.pinboard'
type: topic
queue_options:
name: 'wallabag.import.pinboard'
callback: wallabag_import.consumer.amqp.pinboard
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_delicious:
connection: default
exchange_options:
name: 'wallabag.import.delicious'
type: topic
queue_options:
name: 'wallabag.import.delicious'
callback: wallabag_import.consumer.amqp.delicious
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_wallabag_v1:
connection: default
exchange_options:
name: 'wallabag.import.wallabag_v1'
type: topic
queue_options:
name: 'wallabag.import.wallabag_v1'
callback: wallabag_import.consumer.amqp.wallabag_v1
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_wallabag_v2:
connection: default
exchange_options:
name: 'wallabag.import.wallabag_v2'
type: topic
queue_options:
name: 'wallabag.import.wallabag_v2'
callback: wallabag_import.consumer.amqp.wallabag_v2
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_elcurator:
connection: default
exchange_options:
name: 'wallabag.import.elcurator'
type: topic
queue_options:
name: 'wallabag.import.elcurator'
callback: wallabag_import.consumer.amqp.elcurator
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_firefox:
connection: default
exchange_options:
name: 'wallabag.import.firefox'
type: topic
queue_options:
name: 'wallabag.import.firefox'
callback: wallabag_import.consumer.amqp.firefox
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
import_chrome:
connection: default
exchange_options:
name: 'wallabag.import.chrome'
type: topic
queue_options:
name: 'wallabag.import.chrome'
callback: wallabag_import.consumer.amqp.chrome
qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
fos_js_routing:
routes_to_expose:
- homepage
- starred
- archive
- all
- tag
- config
- import
- developer
- howto
- fos_user_security_logout
- new
jms_serializer:
handlers:
# to be removed if we switch to (default) ISO8601 datetime instead of ATOM
# see: https://github.com/schmittjoh/JMSSerializerBundle/pull/494
datetime:
default_format: "Y-m-d\\TH:i:sO" # ATOM
# see https://github.com/symfony/symfony-standard/pull/1133
sensio_framework_extra:
router:
annotations: false
httplug:
clients:
wallabag_core:
factory: Wallabag\CoreBundle\Helper\HttpClientFactory
config:
defaults:
timeout: 10
plugins: ['httplug.plugin.logger']
wallabag_core.entry.download_images:
factory: 'httplug.factory.auto'
plugins: ['httplug.plugin.logger']
wallabag_import.pocket.client:
factory: 'httplug.factory.auto'
plugins:
- 'httplug.plugin.logger'
- header_defaults:
headers:
'content-type': 'application/json'
'X-Accept': 'application/json'
discovery:
client: false
# define custom entity so we can override length attribute to fix utf8mb4 issue
craue_config:
entity_name: Wallabag\CoreBundle\Entity\InternalSetting

View File

@ -1,67 +0,0 @@
# This file is a "template" of what your parameters.yml file should look like
parameters:
# Uncomment these settings or manually update your parameters.yml
# to use docker-compose
#
# database_driver: %env.database_driver%
# database_host: %env.database_host%
# database_port: %env.database_port%
# database_name: %env.database_name%
# database_user: %env.database_user%
# database_password: %env.database_password%
database_driver: pdo_mysql
database_host: 127.0.0.1
database_port: ~
database_name: wallabag
database_user: root
database_password: ~
# For SQLite, database_path should be "%kernel.project_dir%/data/db/wallabag.sqlite"
database_path: null
database_table_prefix: wallabag_
database_socket: null
# with PostgreSQL and SQLite, you must set "utf8"
database_charset: utf8mb4
domain_name: https://your-wallabag-instance.wallabag.org
server_name: "Your wallabag instance"
mailer_dsn: smtp://127.0.0.1
locale: en
# A secret key that's used to generate certain security-related tokens
secret: CHANGE_ME_TO_SOMETHING_SECRET_AND_RANDOM
# two factor stuff
twofactor_sender: no-reply@wallabag.org
# fosuser stuff
fosuser_registration: true
fosuser_confirmation: true
# how long the access token should live in seconds for the API
fos_oauth_server_access_token_lifetime: 3600
# how long the refresh token should life in seconds for the API
fos_oauth_server_refresh_token_lifetime: 1209600
from_email: no-reply@wallabag.org
rss_limit: 50
# RabbitMQ processing
rabbitmq_host: localhost
rabbitmq_port: 5672
rabbitmq_user: guest
rabbitmq_password: guest
rabbitmq_prefetch_count: 10
# Redis processing
redis_scheme: tcp
redis_host: localhost
redis_port: 6379
redis_path: null
redis_password: null
# sentry logging
sentry_dsn: ~

0
data/db/.gitignore → assets/.gitignore vendored Normal file → Executable file
View File

View File

@ -1,13 +0,0 @@
/* Rules for sizing the icon. */
.material-icons.md-18 { font-size: 18px; }
.material-icons.md-24 { font-size: 24px; }
.material-icons.md-36 { font-size: 36px; }
.material-icons.md-48 { font-size: 48px; }
/* Rules for using icons as black on a light background. */
.material-icons.md-dark { color: rgb(0 0 0 / 54%); }
.material-icons.md-dark.md-inactive { color: rgb(0 0 0 / 26%); }
/* Rules for using icons as white on a dark background. */
.material-icons.md-light { color: rgb(255 255 255 / 100%); }
.material-icons.md-light.md-inactive { color: rgb(255 255 255 / 30%); }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 B

View File

@ -1,261 +0,0 @@
<svg height="770" width="800" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g transform="translate(21.42857 -101.6479)"><image height="770" width="800" x="-21.42857" xlink:href="data:image/png;base64,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" y="101.6479"/><path d="m482.45517 806.8979c-21.575-30.1125-55.23748-77.12866-74.80551-104.48035-19.98598-27.9359-36.2457-49.73896-37.10125-49.75-.87914-.0113-32.32337 42.25713-74.37706 99.98035-40.06973 55-73.18741 100-73.59485 100-1.1396 0-144.46068-100.94983-144.829571-102.01235-.178476-.51406 32.221521-48.07611 72.000001-105.69344 39.77847-57.61732 72.3245-105.66675 72.3245-106.77649 0-1.78957-12.89022-6.31508-114-40.0232-62.7-20.90302-114.613999-38.24519-115.364443-38.53815-1.043816-.4075 4.925559-20.38013 25.402971-84.99452 14.722078-46.45402 27.100359-84.84113 27.507293-85.3047.406933-.46357 54.900599 16.97442 121.097029 38.75107 66.19643 21.77666 120.91108 39.59345 121.5881 39.59285.67702-.00059 1.44284-1.01357 1.70181-2.25107.25898-1.2375.83006-57.6 1.26906-125.25s1.16224-123.5625 1.6072-124.25c.63709-.98436 19.23178-1.24675 87.5-1.23469 47.68004.008 87.18776.34593 87.79493.75.76529.50931 2.07325 37.70117 4.26357 121.23469 3.5965 137.16189 3.67401 139 5.86123 139 .84816 0 53.3106-17.56056 116.58321-39.02347 63.2726-21.46291 115.34958-38.67541 115.72663-38.25 1.27822 1.44219 53.1745 170.39371 52.53554 171.03267-.34901.34901-53.15524 18.43347-117.34717 40.18769-88.30357 29.92548-116.78951 39.96068-117.02855 41.22754-.17651.93542 30.19001 46.31568 68.80279 102.8201 38.0153 55.63011 68.97925 101.56053 68.80877 102.06759-.39157 1.16463-142.63129 105.93788-143.82081 105.93788-.48298 0-18.53042-24.6375-40.10542-54.75z" fill="#fff"/></g></svg>

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 995 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

View File

@ -1,119 +0,0 @@
/* jQuery */
import $ from 'jquery';
/* Annotations */
import annotator from 'annotator';
import ClipboardJS from 'clipboard';
import 'mathjax/es5/tex-svg';
/* Fonts */
import 'material-design-icons-iconfont/dist/material-design-icons.css';
import 'lato-font/css/lato-font.css';
import './global.scss';
/* Shortcuts */
import './js/shortcuts/entry';
import './js/shortcuts/main';
/* Hightlight */
import './js/highlight';
import { savePercent, retrievePercent } from './js/tools';
/* ==========================================================================
Annotations & Remember position
========================================================================== */
$(document).ready(() => {
if ($('article').length) {
const app = new annotator.App();
app.include(annotator.ui.main, {
element: document.querySelector('article'),
});
const authorization = {
permits() { return true; },
};
app.registry.registerUtility(authorization, 'authorizationPolicy');
const x = JSON.parse($('#annotationroutes').html());
app.include(annotator.storage.http, $.extend({}, x, {
onError(msg, xhr) {
if (!Object.prototype.hasOwnProperty.call(xhr, 'responseJSON')) {
annotator.notification.banner('An error occurred', 'error');
return;
}
$.each(xhr.responseJSON.children, (k, v) => {
if (v.errors) {
$.each(v.errors, (n, errorText) => {
annotator.notification.banner(errorText, 'error');
});
}
});
},
}));
app.start().then(() => {
app.annotations.load({ entry: x.entryId });
});
$(window).scroll(() => {
const scrollTop = $(window).scrollTop();
const docHeight = $(document).height();
const scrollPercent = (scrollTop) / (docHeight);
const scrollPercentRounded = Math.round(scrollPercent * 100) / 100;
savePercent(x.entryId, scrollPercentRounded);
});
retrievePercent(x.entryId);
$(window).resize(() => {
retrievePercent(x.entryId, true);
});
}
document.querySelectorAll('[data-handler=tag-rename]').forEach((item) => {
const current = item;
current.wallabag_edit_mode = false;
current.onclick = (event) => {
const target = event.currentTarget;
if (target.wallabag_edit_mode === false) {
$(target.parentNode.querySelector('[data-handle=tag-link]')).addClass('hidden');
$(target.parentNode.querySelector('[data-handle=tag-rename-form]')).removeClass('hidden');
target.parentNode.querySelector('[data-handle=tag-rename-form] input').focus();
target.querySelector('.material-icons').innerHTML = 'done';
target.wallabag_edit_mode = true;
} else {
target.parentNode.querySelector('[data-handle=tag-rename-form]').submit();
}
};
});
// mimic radio button because emailTwoFactor is a boolean
$('#update_user_googleTwoFactor').on('change', () => {
$('#update_user_emailTwoFactor').prop('checked', false);
});
$('#update_user_emailTwoFactor').on('change', () => {
$('#update_user_googleTwoFactor').prop('checked', false);
});
// same mimic for super admin
$('#user_googleTwoFactor').on('change', () => {
$('#user_emailTwoFactor').prop('checked', false);
});
$('#user_emailTwoFactor').on('change', () => {
$('#user_googleTwoFactor').prop('checked', false);
});
// handle copy to clipboard for developer stuff
const clipboard = new ClipboardJS('.btn');
clipboard.on('success', (e) => {
e.clearSelection();
});
});

View File

@ -1,4 +0,0 @@
top['bookmarklet-url@wallabag.org'] = '<!DOCTYPE html><html><head><title>bag it!</title>'
+ '<link rel="icon" href="tpl/img/favicon.ico" />'
+ '</head><body><script>window.onload=function(){window.setTimeout'
+ '(function(){history.back();},250);};</script></body></html>';

View File

@ -1,8 +0,0 @@
import 'highlight.js/styles/atom-one-light.css';
import hljs from 'highlight.js';
window.addEventListener('load', () => {
document.querySelectorAll('pre').forEach((element) => {
hljs.highlightElement(element);
});
});

View File

@ -1,15 +0,0 @@
import Mousetrap from 'mousetrap';
/* Shortcuts */
/* Go to */
Mousetrap.bind('g u', () => { window.location.href = Routing.generate('homepage'); });
Mousetrap.bind('g s', () => { window.location.href = Routing.generate('starred'); });
Mousetrap.bind('g r', () => { window.location.href = Routing.generate('archive'); });
Mousetrap.bind('g a', () => { window.location.href = Routing.generate('all'); });
Mousetrap.bind('g t', () => { window.location.href = Routing.generate('tag'); });
Mousetrap.bind('g c', () => { window.location.href = Routing.generate('config'); });
Mousetrap.bind('g i', () => { window.location.href = Routing.generate('import'); });
Mousetrap.bind('g d', () => { window.location.href = Routing.generate('developer'); });
Mousetrap.bind('?', () => { window.location.href = Routing.generate('howto'); });
Mousetrap.bind('g l', () => { window.location.href = Routing.generate('fos_user_security_logout'); });

View File

@ -1,36 +0,0 @@
import $ from 'jquery';
import './shortcuts/main';
import './shortcuts/entry';
/* Allows inline call qr-code call */
import jrQrcode from 'jr-qrcode'; // eslint-disable-line
function supportsLocalStorage() {
try {
return 'localStorage' in window && window.localStorage !== null;
} catch (e) {
return false;
}
}
function savePercent(id, percent) {
if (!supportsLocalStorage()) { return false; }
localStorage[`wallabag.article.${id}.percent`] = percent;
return true;
}
function retrievePercent(id, resized) {
if (!supportsLocalStorage()) { return false; }
const bheight = $(document).height();
const percent = localStorage[`wallabag.article.${id}.percent`];
const scroll = bheight * percent;
if (!resized) {
$('html,body').animate({ scrollTop: scroll }, 'fast');
}
return true;
}
export { savePercent, retrievePercent };

View File

@ -1 +0,0 @@
import './share.scss';

View File

@ -1,426 +0,0 @@
/* -------------------------- Reset ------------------- */
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
b,
u,
i,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
}
blockquote,
q {
quotes: none;
}
blockquote::before,
blockquote::after,
q::before,
q::after {
content: "";
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* -------------------------- General properties ------------------- */
body {
background-color: white;
color: #444;
font-family: Georgia;
line-height: 1.7;
-ms-content-zooming: none;
margin-bottom: 64px;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: 600;
margin: 0.2em 0;
}
article h1,
article h2,
article h3,
article h4,
article h5,
article h6 {
text-align: left;
line-height: 1.3;
}
h1 {
font-size: 1.4em;
}
h2 {
font-size: 1.3em;
}
h3,
h4 {
font-size: 1.2em;
}
h5,
h6 {
font-size: 1.1em;
}
p {
margin-bottom: 0.75em;
}
b,
strong {
font-weight: bold;
}
i,
em {
font-style: italic;
}
a {
color: #444;
text-decoration: underline;
}
a:active,
a:hover {
outline: 0;
}
p,
ul,
ol,
dl {
margin: 0 0 1.75em;
}
ul,
ol {
padding-left: 1.25em;
}
li {
padding-bottom: 0.2em;
line-height: 1.6;
}
li p:last-child,
li li:last-child {
margin-bottom: -0.2em;
}
ul li:last-child,
ol li:last-child {
padding-bottom: 0;
}
iframe,
video {
max-width: 100%;
height: auto;
}
mark {
padding: 0 0.2em;
}
mark a {
text-decoration: none;
}
blockquote {
font-style: italic;
border-left: 0.25em solid black;
margin-left: -20px;
padding-left: 17px;
margin-bottom: 0.5em;
margin-top: 0.5em;
}
blockquote cite {
text-transform: uppercase;
font-size: 0.8em;
font-style: normal;
}
blockquote cite::before {
content: "";
margin-right: 0.5em;
}
img {
display: block;
height: auto;
margin-bottom: 0.5em;
max-width: 100%;
}
figure {
margin: 0;
}
figure figcaption {
display: block;
margin-top: 0.3em;
font-style: italic;
font-size: 0.8em;
}
button {
display: none !important;
}
hr {
display: block;
height: 1px;
border: solid #666;
border-width: 1px 0 0;
margin: 1.6em 0;
padding: 0;
}
small {
font-size: 0.7em;
}
dl {
margin: 1.6em 0;
}
dl dt {
float: left;
width: 11.25em;
overflow: hidden;
clear: left;
text-align: right;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: bold;
margin-bottom: 1em;
}
dl dd {
margin-left: 12.5em;
margin-bottom: 1em;
}
pre {
box-sizing: border-box;
margin: 4em 0;
border: 0.0625em solid #efefef;
width: 100%;
padding: 1em;
font-family: Consolas, monospace;
white-space: pre;
overflow: auto;
}
pre code {
font-size: 0.8em;
line-height: 1.6em;
white-space: pre-wrap;
background: transparent;
border: none;
padding: 0;
vertical-align: inherit;
}
code {
padding: 0.125em 0.375em;
margin: 0 0.2em;
font-family: Consolas, monospace;
font-size: 0.8em;
white-space: pre;
border: 1px solid lightgray;
overflow: auto;
}
audio,
video {
max-width: 43.75em;
}
::selection,
mark {
background: #666;
color: white;
}
table {
border-collapse: collapse;
margin-bottom: 2em;
width: 100%;
}
th,
td {
padding: 0.25em;
text-align: left;
}
thead tr {
text-transform: uppercase;
font-size: 0.85em;
letter-spacing: 1px;
font-family: "Segoe UI", sans-serif;
font-weight: 600;
}
tbody tr:nth-child(2n+1) {
background: rgb(0 0 0 / 10%);
}
tbody {
border: solid #999;
border-width: 1px 0;
}
figure {
text-align: center;
}
figure > * {
margin: 0 auto;
}
header {
text-align: center;
}
.shared-by {
margin-bottom: 1em;
}
/* --------------------- Responsive design ------------------------- */
@media (max-width: 719px) {
header > *:not(.preview),
article {
padding: 0 1em;
}
}
@media (min-width: 720px) {
blockquote {
margin-left: -1.4375em;
padding-left: 1.25em;
}
header {
margin-top: 32px;
}
.block {
margin-left: auto;
margin-right: auto;
max-width: 43.75em;
padding: 0 1.25em;
}
}

View File

@ -1,261 +0,0 @@
/* ==========================================================================
Article
========================================================================== */
#article {
font-size: 20px;
margin: 0 auto;
max-width: 45em;
padding: 5px 20px;
background-color: #fff;
box-shadow: 0 0 10px #ccc;
article {
color: #424242;
font-size: 18px;
line-height: 1.7em;
overflow-wrap: break-word;
h1,
h2,
h3,
h4,
h5,
h6 {
color: #212121;
strong {
font-weight: 500;
}
}
h6 {
font-size: 1.2rem;
}
h5 {
font-size: 1.6rem;
}
h4 {
font-size: 1.9rem;
}
h3 {
font-size: 2.2rem;
}
h2 {
font-size: 2.5rem;
}
h1 {
font-size: 2.7rem;
}
a {
border-bottom: 1px dotted $blue-accent-color;
text-decoration: none;
}
a:hover {
border-bottom-style: solid;
}
ul {
padding-left: 30px;
}
ul,
ul li {
list-style-type: disc;
}
blockquote {
font-style: italic;
}
strong {
font-weight: bold;
}
}
img,
figure {
max-width: 100%;
height: auto;
}
pre {
box-sizing: border-box;
margin: 0 0 1.75em;
border: #e3f2fd 1px solid;
width: 100%;
padding: 10px;
font-family: monospace;
font-size: 0.8em;
white-space: pre;
overflow: auto;
background: #f5f5f5;
border-radius: 3px;
}
> header > h1 {
font-size: 2em;
margin: 2.1rem 0 0.68rem;
}
.entry-info {
.tools {
display: flex;
margin: 8px 5px 5px;
flex-wrap: wrap;
.stats {
margin: 0;
font-size: 0.7em;
li {
display: inline-flex;
vertical-align: middle;
margin: 3px 5px;
i.material-icons {
color: #3e3e3e;
margin-right: 3px;
font-size: 18px;
}
}
a {
color: #000;
text-decoration: none;
}
}
.tags {
display: flex;
margin: 0;
align-items: center;
gap: 5px;
}
}
.chip {
display: flex;
margin: 0;
padding: 0;
height: 25px;
line-height: 25px;
align-items: center;
background-color: transparent;
a,
i {
color: #fff;
}
i.material-icons {
font-size: 16px;
vertical-align: sub;
}
}
.chip-label {
padding-left: 10px;
padding-right: 5px;
background-color: #9e9e9e;
border-radius: 6px 0 0 6px;
}
.chip-action {
padding: 0 5px;
background-color: #868686;
border-radius: 0 6px 6px 0;
}
.chip-label,
.chip-action {
min-width: 30px;
text-align: center;
}
.chip-label:hover,
.chip-label:active,
.chip-label:focus,
.chip-action:hover,
.chip-action:active,
.chip-action:focus {
background-color: #5e5e5e;
}
}
}
.entry-info {
margin-bottom: 40px;
}
.reader-mode {
width: 70px !important;
transition: width 0.2s ease;
.collapsible-body {
height: 0;
overflow: hidden;
}
span {
opacity: 0;
transition: opacity 0.2s ease;
}
&:hover {
width: 260px !important;
span {
opacity: 1;
}
}
.collapsible-body {
height: auto;
li a i.material-icons {
margin: auto 5px auto -8px;
}
}
}
.progress {
position: fixed;
top: 0;
width: 100%;
height: 3px;
margin: 0;
z-index: 9999;
}
@media only screen and (max-width: 640px) {
.entry-info {
margin-bottom: 20px;
}
#article .entry-info .tools {
margin-left: 0;
margin-right: 0;
}
#article .entry-info .tools .tags {
gap: 10px;
}
#article .entry-info .chip {
height: 32px;
line-height: 32px;
}
#article .entry-info .chip-label,
#article .entry-info .chip-action {
min-width: 40px;
}
}

View File

@ -1,345 +0,0 @@
/* ==========================================================================
Cards
========================================================================== */
main {
#content {
padding: 0 0.5rem;
}
}
@mixin mixin-reading-time {
.reading-time {
display: inline-flex;
vertical-align: middle;
.card-reading-time,
.card-created-at {
display: inline-flex;
}
span {
margin-right: 5px;
}
@content;
}
}
.card {
.card-content {
padding-bottom: 12px;
flex-grow: 1;
}
.card-content .card-title,
.card-reveal .card-title {
line-height: 22.8px;
max-height: 80px;
font-size: 19px;
font-family: roberto, "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.card-stacked .card-content .card-title {
display: inline-block;
}
.card-content .activator,
.card-reveal .activator {
cursor: pointer;
font-family: "Material Icons";
}
.card-content i.right,
.card-reveal i.right {
margin-left: 0;
}
.card-content .original {
line-height: 24px;
font-size: 15px;
}
.card-entry-labels {
position: absolute;
top: 10px;
z-index: 90;
max-width: 50%;
}
.card-entry-labels-hidden {
margin: 2.5px auto;
}
.card-entry-labels-hidden li {
display: inline-block;
background-color: $blue-accent-color;
margin: 0 5px;
padding: 5px 12px;
border-radius: 3px;
color: #fff;
max-height: 2em;
max-width: calc(100% - 15px);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-action {
padding: 10px 10px 10px 15px;
ul.links {
margin: 0;
font-size: 24px;
line-height: 24px;
}
a {
color: #fff;
margin: 0;
}
a:hover {
color: #fff;
}
.tool {
display: flex;
margin-right: 0 !important;
}
@include mixin-reading-time;
}
.card-image {
height: 10em;
}
.card-fullimage {
height: 13.5em;
}
&.sw {
max-width: 370px;
margin-left: auto;
margin-right: auto;
}
}
.card-body {
display: flex;
flex-grow: 1;
flex-direction: column;
}
a.original:not(.waves-effect) {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
display: block;
}
.card .card-image .preview,
.card .card-fullimage .preview,
.card-stacked .preview {
height: 100%;
background: no-repeat 50%/cover;
background-color: #efefef;
display: block;
&--default {
background-size: contain;
}
}
.card-entry-labels li,
.card-tag-labels li {
margin: 10px 10px 10px auto;
padding: 5px 12px 5px 16px !important;
background-color: $blue-accent-color;
border-radius: 3px;
color: #fff;
cursor: default;
line-height: 20px;
}
.card-entry-labels li {
text-overflow: ellipsis;
white-space: nowrap;
border-radius: 0 3px 3px 0;
overflow: hidden;
}
.card-tag-labels li {
display: flex;
}
.card-entry-tags a,
.card-entry-labels a,
.card-tag-labels a,
.card-entry-labels-hidden a,
#list .chip a {
text-decoration: none;
font-weight: normal;
color: #fff;
}
.card-tag-link {
width: calc(100% - 24px);
line-height: 1.3;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.card-tag-form {
display: flex;
min-width: 100px;
flex-grow: 1;
}
.card-tag-form input {
margin-bottom: 0;
height: 1.8rem;
}
.card-tag-icon {
display: flex;
}
.card-tag-delete {
margin-left: 10px;
}
.card-tag-labels {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
}
.card-tag-labels li {
margin: 10px;
align-items: center;
}
.card-stacked {
display: flex;
flex-flow: row wrap;
&:hover ul.tools-list {
display: inline;
text-align: right;
}
.card-preview {
max-width: 100px;
max-height: 50px;
margin-right: 10px;
flex: 1;
}
div.metadata {
overflow: hidden;
height: 1.5em;
display: flex;
ul.tags {
margin-left: 4px;
}
.chip {
background-color: $blue-accent-color;
padding: 0 7px;
margin: auto 1px;
border-radius: 6px;
line-height: 22px;
height: 22px;
a,
i {
color: #fff;
}
i.material-icons {
float: right;
font-size: 20px;
line-height: 32px;
padding-left: 8px;
}
}
@include mixin-reading-time {
padding: 0 5px;
flex-wrap: wrap;
margin-left: auto;
i.material-icons {
font-size: 20px;
}
}
}
div.card-content {
flex: 4;
}
ul.tools-list {
flex: 1;
display: none;
flex-basis: 5em;
align-self: flex-end;
float: right;
max-width: 8em;
}
.tags {
display: inline-block;
}
}
.card.archived,
.card-stacked.archived {
opacity: 0.5;
}
#content .collection .collection-item {
min-height: 65px;
height: auto;
}
.quickstart .card .card-action a,
.quickstart .card .card-action a:hover {
color: #fff !important;
}
.settings .tabs-container {
padding-bottom: 15px;
}
.settings .settings-checkbox-col {
padding: 0;
}
.settings .settings-checkbox-label {
margin-bottom: 20px;
height: 3rem;
}
.entries-row {
display: grid;
margin: 0.4rem 0 0;
padding: 0 0.75rem;
gap: 20px;
}
.entry-card {
display: flex;
margin: 0;
height: 100%;
flex-direction: column;
}
.tools {
display: flex;
gap: 10px;
}

View File

@ -1,144 +0,0 @@
.dark-theme {
body {
background-color: #101010;
}
#article,
.card,
.card-panel,
.card .card-reveal,
.card-stacked .preview:not(.preview--default),
.card .preview:not(.preview--default),
.collapsible-header,
.collection,
.dropdown-content,
.side-nav,
.side-nav .collapsible-body,
.side-nav.fixed .collapsible-body,
.tabs {
background-color: #131716;
}
table.striped > tbody > tr:nth-child(2n+1),
.dropdown-content li {
background-color: #232323;
}
.dropdown-content li:hover,
.dropdown-content li.active,
.dropdown-content li.selected,
.pagination li:not(.active) a:hover,
.pagination li:not(.active) a:active,
.pagination li:not(.active) a:focus {
background-color: #2c2c2c;
}
.dropdown-content .divider {
background-color: #383838;
}
.collection {
border-color: transparent;
}
.collection .collection-item {
border-color: #121212;
}
.card:hover,
.collection .collection-item:hover {
background-color: #272727;
}
#content,
#article article,
#article article h1,
#article article h2,
#article article h3,
#article article h4,
#article article h5,
#article article h6,
.dropdown-content li > a,
.nav-panels .input-field input:focus,
.results-item,
.side-nav li > a,
.side-nav li > a > i.material-icons {
color: #dfdfdf;
}
.cyan,
.cyan.darken-1,
.cyan.darken-2,
.nav-panel-add,
.nav-panel-search {
background-color: #1d1d1d !important;
}
.grey-text.text-darken-4,
.nav-panel-item .add,
.nav-panel-item .search,
.nav-panels .close {
color: #dfdfdf !important;
}
.side-nav li.active {
background-color: #2f2f2f;
}
.side-nav li:not(.logo) > a:hover,
.side-nav .collapsible-header:hover,
.side-nav.fixed .collapsible-header:hover {
background-color: #1d1d1d;
}
#article {
box-shadow: 0 0 10px #1d1d1d;
}
.card,
.collection .collection-item {
background-color: #1d1d1d;
}
.card-action {
background-color: transparent;
}
.logo img,
.preview.preview--default,
.typo-logo {
filter: invert(100%);
}
.border-bottom,
.collapsible,
.collapsible-body,
.collapsible-header {
border-color: #222;
}
.pagination li.active {
background-color: #666;
}
.hljs,
#article pre {
color: #abb2bf;
background-color: #282c34;
}
nav input {
color: #abb2bf;
}
.input-field.nav-panel-add.disabled,
.input-field.nav-panel-add.disabled input {
background-color: transparent;
}
@media only screen and (min-width: 992px) {
#article {
background-color: #101010;
}
}
}

View File

@ -1,181 +0,0 @@
/* ==========================================================================
* Entries
* ========================================================================== */
.mass-action-toggle {
display: inline-flex;
background-color: transparent;
border: none;
cursor: pointer;
&:focus {
background-color: transparent;
}
}
.mass-action {
margin: 10px 5px 10px 20px;
}
.mass-action-group {
display: flex;
padding: 3px;
gap: 10px;
}
.mass-action-button {
height: 24px;
line-height: 24px;
padding: 0 0.5rem;
i {
font-size: 1rem;
}
}
.entry-checkbox {
margin: 10px 15px 10px 5px;
.card & {
float: right;
margin-right: 0;
padding: 10px;
}
}
.entries .entry-checkbox-input,
.mass-action .entry-checkbox-input {
position: relative;
left: 0;
width: 20px;
min-height: 25px;
height: 100%;
vertical-align: middle;
opacity: initial;
z-index: 10;
}
.toggle-checkbox:not(:checked) + .mass-action,
.toggle-checkbox:not(:checked) + .mass-action-tags,
.toggle-checkbox:not(:checked) ~ .entries .entry-checkbox,
.toggle-checkbox:checked ~ .entries .card-preview {
display: none;
}
.mass-action-tags {
display: flex;
align-items: center;
gap: 10px;
.mass-action-tags-input {
margin: 0;
}
}
.entries {
list-style: none;
}
.collection {
margin: 5px 15px 0;
padding: 0;
.collection-item {
padding: 7px;
height: 65px;
}
}
.results {
display: flex;
padding: 1rem 1rem 0;
flex-wrap: wrap;
justify-content: space-between;
.nb-results {
display: inline-flex;
}
}
.results-item {
color: #444;
}
.pagination {
ul {
display: flex;
margin: 0;
flex-wrap: wrap;
justify-content: space-around;
.prev.disabled,
.next.disabled {
display: none;
}
}
li {
padding: 0;
&:not(.active) a:hover,
&:not(.active) a:active,
&:not(.active) a:focus {
background-color: #e6e6e6;
}
&:not(:last-of-type) {
margin-right: 10px;
}
}
span,
a {
padding: 0 10px;
height: 30px;
display: block;
line-height: 30px;
}
.disabled {
margin-right: 10px;
margin-left: 10px;
}
li.active span {
padding: 0 10px;
height: 30px;
display: block;
color: #fff;
}
}
.footer-text {
margin: 0.7rem 0.5rem;
}
.hidden {
display: none;
}
.picker__date-display {
display: none;
}
footer {
&.page-footer {
margin-top: 10px;
padding-top: 0;
}
.row {
margin-bottom: 10px;
}
}
@media screen and (min-width: 993px) {
.mass-action {
display: flex;
align-items: center;
gap: 30px;
}
}

View File

@ -1,15 +0,0 @@
/* ==========================================================================
* Filters slider
* ========================================================================== */
#filters {
button {
padding: 0;
width: 100%;
}
div.with-checkbox {
height: 3rem;
margin-top: 0;
}
}

View File

@ -1,13 +0,0 @@
/* ==========================================================================
* Fonts
* ========================================================================== */
/**
* Icomoon
*/
@font-face {
font-family: icomoon;
src: url("~icomoon-free-npm/Font/IcoMoon-Free.ttf");
font-weight: normal;
font-style: normal;
}

View File

@ -1,186 +0,0 @@
/* ==========================================================================
* Icons
* ========================================================================== */
/**
*
* Material icons
*
*/
.material-icons {
font-family: "Material Icons";
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
width: 1em;
height: 1em;
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
user-select: none;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizelegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: "liga";
.md-18 {
font-size: 18px;
}
.md-24 {
font-size: 24px;
}
.md-36 {
font-size: 36px;
}
.md-48 {
font-size: 48px;
}
.md-dark {
color: rgb(0 0 0 / 54%);
.md-inactive {
color: rgb(0 0 0 / 26%);
}
}
.md-light {
color: rgb(255 255 255 / 100%);
.md-inactive {
color: rgb(255 255 255 / 30%);
}
}
}
/**
*
* Icomoon icons
*
*/
[class^="icon-"]::before,
[class*=" icon-"]::before {
font-family: icomoon;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
background-size: 24px;
/* Enable Ligatures ================ */
letter-spacing: 0;
font-feature-settings: "liga";
}
.icon-eye::before {
content: "\e9ce";
}
.icon-no-eye::before {
content: "\e9d1";
}
.icon-calendar::before {
content: "\e953";
}
.icon-mail::before {
content: "\ea86";
}
.icon-time::before {
content: "\e952";
}
a.icon-image {
background-repeat: no-repeat;
padding-right: 0.4em !important;
padding-left: 0 !important;
margin-left: 25px;
&::before {
content: "";
display: block;
width: 24px;
height: 24px;
float: left;
margin: 7px 1.5px 0 0;
}
&.diaspora::before {
background: url("../../_global/img/icons/diaspora-icon--black.png") no-repeat center/80%;
}
&.unmark::before {
background: url("../../_global/img/icons/unmark-icon--black.png") no-repeat center/80%;
}
&.shaarli::before {
background: url("../../_global/img/icons/shaarli.png") no-repeat center/80%;
}
&.scuttle::before {
background: url("../../_global/img/icons/scuttle.png") no-repeat center/80%;
}
}
.icon-google-plus2::before {
content: "\ea89";
}
.icon-facebook2::before {
content: "\ea8d";
}
.icon-twitter::before {
content: "\ea96";
}
.icon-apple::before {
content: "\eabf";
}
.icon-android::before {
content: "\eac1";
}
.icon-chrome::before {
content: "\eae5";
}
.icon-firefox::before {
content: "\eae6";
}
.icon-link::before {
content: "\e9cb";
}
footer [class^="icon-"],
footer [class*=" icon-"] {
font-size: 2em;
transition: text-shadow 0.2s ease;
padding-right: 10px;
}
footer [class^="icon-"]:hover,
footer [class*=" icon-"]:hover {
text-shadow: 0 0 10px rgb(0 0 0 / 30%);
}

View File

@ -1,18 +0,0 @@
@import "variables";
/* Style */
@import "article";
@import "cards";
@import "entries";
@import "filters";
@import "layout";
@import "nav";
@import "sidenav";
@import "various";
@import "dark_theme";
/* Tools */
@import "fonts";
@import "icons";
@import "print";
@import "media_queries";

View File

@ -1,52 +0,0 @@
/* ==========================================================================
Layout
========================================================================== */
body {
display: flex;
min-height: 100vh;
flex-direction: column;
background: #fafafa;
&.login main {
padding: 0;
min-height: 100vh;
}
}
.border-bottom {
border-bottom: 1px solid #ddd;
}
a {
color: $blue-accent-color;
}
main,
#content,
.valign-wrapper {
height: 100%;
}
.typo-logo {
max-width: 150px;
}
#main {
flex: 1 0 auto;
.logo {
a {
height: 100pt;
}
img {
height: 100pt;
width: 100pt;
}
&:hover {
background: transparent;
}
}
}

View File

@ -1,193 +0,0 @@
/* ==========================================================================
Media queries
========================================================================== */
@media only screen and (min-width: 450px) {
.entries-row {
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
}
}
@media only screen and (min-width: 992px) {
nav,
.index main,
footer {
padding-left: 240px;
}
.pagination {
margin-left: auto;
}
}
@media screen and (min-width: 993px) {
.entry #content {
padding-left: 70px;
}
}
@media only screen and (max-width: 992px) {
header,
main,
footer,
nav {
padding-left: 0;
}
table {
display: block;
overflow: auto;
}
iframe {
max-width: 100%;
height: auto;
}
.nav-panels .action {
padding-right: 0.75rem;
}
.nav-panel-top {
padding: 6px 0;
}
.nav-panel-buttom {
justify-content: space-between;
}
#article {
max-width: 35em;
margin-left: auto;
margin-right: auto;
padding-bottom: 100px;
font-size: 18px;
> header > h1 {
font-size: 1.33em;
}
}
.reader-mode {
width: 240px !important;
span {
opacity: 1;
}
}
.tabs {
display: inline-block;
height: auto;
}
.tab {
min-width: 100%;
}
.indicator {
display: none;
}
.pagination li {
margin-bottom: 0.5rem;
&.prev,
&.next {
width: auto;
}
}
.drag-target + .drag-target {
height: 50%;
}
.drag-target + .drag-target + .drag-target {
top: 50%;
}
}
@media only screen and (min-width: 1200px) and (max-width: 1650px) {
.row .col.l3 {
width: 33.3333%;
margin-left: 0;
}
}
@media only screen and (min-width: 993px) and (max-width: 1200px) {
.row {
.col.l1 {
width: 25%;
margin-left: 0;
}
.col.l2 {
width: 33.3333%;
margin-left: 0;
}
.col.l3 {
width: 41.6667%;
margin-left: 0;
}
.col.l4 {
width: 50%;
margin-left: 0;
}
.col.l5 {
width: 58.333%;
margin-left: 0;
}
.col.l6 {
width: 66.6667%;
margin-left: 0;
}
.col.l7 {
width: 75%;
margin-left: 0;
}
.col.l8 {
width: 83.3333%;
margin-left: 0;
}
.col.l9 {
width: 91.6667%;
margin-left: 0;
}
.col.l10 {
width: 100%;
margin-left: 0;
}
}
}
@media only screen and (max-width: 350px) {
.nb-results {
display: none;
}
main ul.row {
padding: 0;
}
.row .col {
padding: 0;
}
.card-stacked div.metadata .reading-time {
display: none;
}
}
@media only print {
body {
display: block;
}
}

View File

@ -1,182 +0,0 @@
/* ==========================================================================
Nav
========================================================================== */
nav {
height: auto;
line-height: initial;
}
nav {
input {
color: #aaa;
}
ul a:hover {
background-color: initial;
}
}
.nav-panel-item .button-collapse {
margin-left: 0;
margin-right: 0.5rem;
padding-left: 0.5rem;
padding-right: 0.5rem;
height: auto;
line-height: 1;
background-color: transparent;
border: none;
}
.nav-panel-item {
display: flex;
padding: 0.6rem 0.4rem 0.6rem 0.75rem;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
a {
padding: 10px 15px;
}
}
.nav-panel-item .material-icons {
height: auto;
line-height: 1;
}
.nav-input {
display: none;
}
.nav-panel-buttom {
display: flex;
flex-grow: 1;
justify-content: flex-end;
}
.nav-panel-item .add,
.nav-panel-item .search,
.nav-panels .close {
color: #444 !important;
}
.nav-panels {
transition: background 0.2s ease;
.action {
margin: 0;
font-size: 2.1rem;
}
.input-field input {
display: block;
line-height: inherit;
height: 3rem;
}
.input-field input:focus {
border: 0;
box-shadow: none;
color: #444;
}
}
.nav-panel-top {
display: flex;
align-items: center;
}
.input-field {
&.nav-panel-item label {
left: 1rem;
}
&.nav-panel-item .close {
color: transparent;
cursor: pointer;
font-size: 2rem;
transition: 0.3s color;
}
&.nav-panel-item {
display: flex;
flex: 1;
flex-wrap: nowrap;
align-items: center;
}
&.nav-panel-add.disabled,
&.nav-panel-add.disabled input {
background-color: whitesmoke;
}
}
.nav-panel-add,
.nav-panel-search {
background-color: white;
}
.nav-form-button {
padding: 0;
background-color: transparent;
border: none;
&:focus {
background-color: inherit;
}
}
.nav-form-button,
.nav-panel-item .close {
margin: 0 1%;
}
.button-filters {
display: none;
}
.button-export {
display: none;
}
.entry-nav-top--sticky {
position: sticky;
top: 0;
}
.dropdown-content {
width: 100%;
li {
min-height: auto;
padding-right: 15px;
}
li > a {
display: flex;
padding: 14px 10px;
align-items: center;
white-space: initial;
}
}
@media (min-width: 993px) {
.toggle-add-url-container {
flex-grow: 1;
}
.toggle-add-url {
display: flex;
width: 100%;
justify-content: end;
}
.button-collapse {
display: none;
}
.dropdown-content {
min-width: 300px;
width: initial;
}
}

View File

@ -1,70 +0,0 @@
@media print {
/* ### Layout ### */
body {
font-family: serif;
background-color: #fff;
}
@page {
margin: 1cm;
}
img {
max-width: 100% !important;
}
/* ### Content ### */
/* Hide useless blocks */
body > header,
body > footer,
.entry-tools,
header div,
.messages,
.entry + .results,
.left-bar,
.progress,
.hide-on-large-only,
.entry-info,
.title-edit {
display: none !important;
}
main {
padding-left: 0 !important;
}
.article {
margin: inherit !important;
}
article {
border: none !important;
}
/* Add URL after links */
.vieworiginal a::after {
content: " (" attr(href) ")";
}
/* Add explanation after abbr */
abbr[title]::after {
content: " (" attr(title) ")";
}
/* Change border on current pager item */
.pagination span.current {
border-style: dashed;
}
#main {
width: 100%;
margin: 0;
padding: 0;
}
#article {
width: 100%;
}
}

View File

@ -1,50 +0,0 @@
/* ==========================================================================
Side-nav
========================================================================== */
.side-nav {
width: 240px;
li {
padding: 0;
&.logo > a:hover {
background: initial;
}
& > a > i.material-icons.theme-toggle-icon {
float: none;
margin-left: 0;
}
}
a {
margin: 0;
}
&.fixed a {
font-size: 13px;
line-height: 44px;
height: 44px;
}
.collapsible-header,
&.fixed .collapsible-header {
height: 45px;
line-height: 44px;
padding: 0 20px;
}
> li.logo {
line-height: 0;
text-align: center;
}
}
.bold > a {
font-weight: bold;
}
.items-number {
float: right;
}

View File

@ -1,5 +0,0 @@
/* ==========================================================================
Variables
========================================================================== */
$blue-accent-color: #00acc1;

View File

@ -1,33 +0,0 @@
/* ==========================================================================
* Various
* ========================================================================== */
div.settings div.file-field {
/* force height on non-input field in the settings page */
div,
ul {
margin-top: 40px;
}
/* but avoid to kill all file input */
div {
margin-top: inherit;
}
}
.input-field label.active {
font-size: 1rem;
}
nav .input-field input {
margin: 0;
padding-left: 0.5rem;
}
.tabs {
display: flex;
}
.tab {
flex: 1;
}

View File

@ -1,237 +0,0 @@
import $ from 'jquery';
/* Materialize imports */
import 'materialize-css/dist/css/materialize.css';
import 'materialize-css/dist/js/materialize';
/* Global imports */
import '../_global/index';
/* Tools */
import { initExport, initFilters, initRandom } from './js/tools';
/* Import shortcuts */
import './js/shortcuts/main';
import './js/shortcuts/entry';
/* Theme style */
import './css/index.scss';
const mobileMaxWidth = 993;
(function darkTheme() {
const rootEl = document.querySelector('html');
const themeDom = {
darkClass: 'dark-theme',
toggleClass(el) {
return el.classList.toggle(this.darkClass);
},
addClass(el) {
return el.classList.add(this.darkClass);
},
removeClass(el) {
return el.classList.remove(this.darkClass);
},
};
const themeCookie = {
values: {
light: 'light',
dark: 'dark',
},
name: 'theme',
getValue(isDarkTheme) {
return isDarkTheme ? this.values.dark : this.values.light;
},
setCookie(isDarkTheme) {
const value = this.getValue(isDarkTheme);
document.cookie = `${this.name}=${value};samesite=Lax;path=/;max-age=31536000`;
},
removeCookie() {
document.cookie = `${this.name}=auto;samesite=Lax;path=/;max-age=0`;
},
exists() {
return document.cookie.split(';').some((cookie) => cookie.trim().startsWith(`${this.name}=`));
},
};
const preferedColorScheme = {
choose() {
const themeCookieExists = themeCookie.exists();
if (this.isAvailable() && !themeCookieExists) {
const isPreferedColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)').matches === true;
if (!themeCookieExists) {
themeDom[isPreferedColorSchemeDark ? 'addClass' : 'removeClass'](rootEl);
}
}
},
isAvailable() {
return typeof window.matchMedia === 'function';
},
init() {
if (!this.isAvailable()) {
return false;
}
this.choose();
window.matchMedia('(prefers-color-scheme: dark)').addListener(() => {
this.choose();
});
return true;
},
};
const addDarkThemeListeners = () => {
$(document).ready(() => {
const lightThemeButtons = document.querySelectorAll('.js-theme-toggle[data-theme="light"]');
[...lightThemeButtons].map((lightThemeButton) => {
lightThemeButton.addEventListener('click', (e) => {
e.preventDefault();
themeDom.removeClass(rootEl);
themeCookie.setCookie(false);
});
return true;
});
const darkThemeButtons = document.querySelectorAll('.js-theme-toggle[data-theme="dark"]');
[...darkThemeButtons].map((darkThemeButton) => {
darkThemeButton.addEventListener('click', (e) => {
e.preventDefault();
themeDom.addClass(rootEl);
themeCookie.setCookie(true);
});
return true;
});
const autoThemeButtons = document.querySelectorAll('.js-theme-toggle[data-theme="auto"]');
[...autoThemeButtons].map((autoThemeButton) => {
autoThemeButton.addEventListener('click', (e) => {
e.preventDefault();
themeCookie.removeCookie();
preferedColorScheme.choose();
});
return true;
});
});
};
preferedColorScheme.init();
addDarkThemeListeners();
}());
const stickyNav = () => {
const nav = $('.js-entry-nav-top');
$('[data-toggle="actions"]').click(() => {
nav.toggleClass('entry-nav-top--sticky');
});
};
const articleScroll = () => {
const articleEl = $('#article');
if (articleEl.length > 0) {
$(window).scroll(() => {
const s = $(window).scrollTop();
const d = $(document).height();
const c = $(window).height();
const articleElBottom = articleEl.offset().top + articleEl.height();
const scrollPercent = (s / (d - c)) * 100;
$('.progress .determinate').css('width', `${scrollPercent}%`);
const fixedActionBtn = $('.js-fixed-action-btn');
const toggleScrollDataName = 'toggle-auto';
if ((s + c) > articleElBottom) {
fixedActionBtn.data(toggleScrollDataName, true);
fixedActionBtn.openFAB();
} else if (fixedActionBtn.data(toggleScrollDataName) === true) {
fixedActionBtn.data(toggleScrollDataName, false);
fixedActionBtn.closeFAB();
}
});
}
};
$(document).ready(() => {
// sideNav
$('.button-collapse').sideNav();
$('select').material_select();
$('.collapsible').collapsible({
accordion: false,
});
$('.datepicker').pickadate({
selectMonths: true,
selectYears: 15,
formatSubmit: 'yyyy-mm-dd',
hiddenName: false,
format: 'yyyy-mm-dd',
container: 'body',
});
$('.dropdown-trigger').dropdown({ hover: false });
initFilters();
initExport();
initRandom();
stickyNav();
articleScroll();
const toggleNav = (toShow, toFocus) => {
$('.nav-panel-actions').hide(100);
$(toShow).show(100);
$(toFocus).focus();
};
$('#nav-btn-add-tag').on('click', () => {
$('.nav-panel-add-tag').toggle(100);
$('.nav-panel-menu').addClass('hidden');
if (window.innerWidth < mobileMaxWidth) {
$('.side-nav').sideNav('hide');
}
$('#tag_label').focus();
return false;
});
$('#nav-btn-add').on('click', () => {
toggleNav('.nav-panel-add', '#entry_url');
return false;
});
const materialAddForm = $('.nav-panel-add');
materialAddForm.on('submit', () => {
materialAddForm.addClass('disabled');
$('input#entry_url', materialAddForm).prop('readonly', true).trigger('blur');
});
$('#nav-btn-search').on('click', () => {
toggleNav('.nav-panel-search', '#search_entry_term');
return false;
});
$('.close').on('click', (e) => {
$(e.target).parent('.nav-panel-item').hide(100);
$('.nav-panel-actions').show(100);
return false;
});
const mainCheckboxes = document.querySelectorAll('[data-js="checkboxes-toggle"]');
if (mainCheckboxes.length) {
[...mainCheckboxes].forEach((el) => {
el.addEventListener('click', () => {
const checkboxes = document.querySelectorAll(el.dataset.toggle);
[...checkboxes].forEach((checkbox) => {
const checkboxClone = checkbox;
checkboxClone.checked = el.checked;
});
});
});
}
$('form[name="form_mass_action"] input[name="tags"]').on('keydown', (e) => {
if (e.key === 'Enter') {
e.preventDefault();
$('form[name="form_mass_action"] button[name="tag"]').trigger('click');
}
});
});

View File

@ -1,26 +0,0 @@
import Mousetrap from 'mousetrap';
import $ from 'jquery';
$(document).ready(() => {
if ($('#article').length > 0) {
/* open original article */
Mousetrap.bind('o', () => {
$('ul.side-nav a.original i')[0].click();
});
/* mark as favorite */
Mousetrap.bind('f', () => {
$('ul.side-nav a.favorite i')[0].click();
});
/* mark as read */
Mousetrap.bind('a', () => {
$('ul.side-nav a.markasread i')[0].click();
});
/* delete */
Mousetrap.bind('del', () => {
$('ul.side-nav a.delete i')[0].click();
});
}
});

View File

@ -1,92 +0,0 @@
import Mousetrap from 'mousetrap';
import $ from 'jquery';
function toggleFocus(cardToToogleFocus) {
if (cardToToogleFocus) {
$(cardToToogleFocus).toggleClass('z-depth-4');
}
}
$(document).ready(() => {
const cards = $('#content').find('.card');
const cardNumber = cards.length;
let cardIndex = 0;
/* If we come from next page */
if (window.location.hash === '#prev') {
cardIndex = cardNumber - 1;
}
let card = cards[cardIndex];
const pagination = $('.pagination');
/* Show nothing on quickstart */
if ($('#content > div.quickstart').length > 0) {
return;
}
/* Show nothing on login/register page */
if ($('#username').length > 0 || $('#fos_user_registration_form_username').length > 0) {
return;
}
/* Show nothing on login/register page */
if ($('#username').length > 0 || $('#fos_user_registration_form_username').length > 0) {
return;
}
/* Focus current card */
toggleFocus(card);
/* Actions */
Mousetrap.bind('g n', () => {
$('#nav-btn-add').trigger('click');
return false;
});
Mousetrap.bind('s', () => {
$('#nav-btn-search').trigger('click');
return false;
});
Mousetrap.bind('esc', () => {
$('.close').trigger('click');
});
/* Select right card. If there's a next page, go to next page */
Mousetrap.bind('right', () => {
if (cardIndex >= 0 && cardIndex < cardNumber - 1) {
toggleFocus(card);
cardIndex += 1;
card = cards[cardIndex];
toggleFocus(card);
return;
}
if (pagination.length > 0 && pagination.find('li.next:not(.disabled)').length > 0 && cardIndex === cardNumber - 1) {
window.location.href = window.location.origin + $(pagination).find('li.next a').attr('href');
}
});
/* Select previous card. If there's a previous page, go to next page */
Mousetrap.bind('left', () => {
if (cardIndex > 0 && cardIndex < cardNumber) {
toggleFocus(card);
cardIndex -= 1;
card = cards[cardIndex];
toggleFocus(card);
return;
}
if (pagination.length > 0 && $(pagination).find('li.prev:not(.disabled)').length > 0 && cardIndex === 0) {
window.location.href = `${window.location.origin + $(pagination).find('li.prev a').attr('href')}#prev`;
}
});
Mousetrap.bind('enter', () => {
if (typeof card !== 'object') {
return;
}
const url = $(card).find('.card-title a').attr('href');
if (typeof url === 'string' && url.length > 0) {
window.location.href = window.location.origin + url;
}
});
});

View File

@ -1,36 +0,0 @@
import $ from 'jquery';
function initFilters() {
// no display if filters not available
if ($('div').is('#filters')) {
$('#button_filters').show();
$('.js-filters-action').sideNav({ edge: 'right' });
$('#clear_form_filters').on('click', () => {
$('#filters input').val('');
$('#filters :checked').removeAttr('checked');
return false;
});
}
}
function initExport() {
// no display if export not available
if ($('div').is('#export')) {
$('#button_export').show();
$('.js-export-action').sideNav({ edge: 'right' });
}
}
function initRandom() {
// no display if export (ie: entries) not available
if ($('div').is('#export')) {
$('#button_random').show();
}
}
export {
initExport,
initFilters,
initRandom,
};

View File

@ -1,42 +0,0 @@
#!/usr/bin/env php
<?php
use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\ErrorHandler\Debug;
if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL;
}
set_time_limit(0);
require dirname(__DIR__).'/vendor/autoload.php';
if (!class_exists(Application::class)) {
throw new LogicException('You need to add "symfony/framework-bundle" as a Composer dependency.');
}
$input = new ArgvInput();
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) {
putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env);
}
if ($input->hasParameterOption('--no-debug', true)) {
putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0');
}
require dirname(__DIR__).'/config/bootstrap.php';
if ($_SERVER['APP_DEBUG']) {
umask(0000);
if (class_exists(Debug::class)) {
Debug::enable();
}
}
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$application = new Application($kernel);
$application->run($input);

1
cache/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
!.htaccess

2
cache/.htaccess vendored Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all

14
check_essentials.php Normal file
View File

@ -0,0 +1,14 @@
<?php
// PHP 5.3 minimum
if (version_compare(PHP_VERSION, '5.3.3', '<')) {
die('This software require PHP 5.3.3 minimum');
}
// Short tags must be enabled for PHP < 5.4
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
if (! ini_get('short_open_tag')) {
die('This software require to have short tags enabled, check your php.ini => "short_open_tag = On"');
}
}

12
check_setup.php Executable file
View File

@ -0,0 +1,12 @@
<?php
// Check if /cache is writeable
if (! is_writable('cache')) {
die('The directory "cache" must be writeable by your web server user');
}
// install folder still present, need to install wallabag
if (is_dir('install')) {
require('install/index.php');
exit;
}

View File

@ -1,213 +1,31 @@
{
"name": "wallabag/wallabag",
"description": "open source self hostable read-it-later web application",
"license": "MIT",
"type": "project",
"keywords": [
"poche",
"wallabag",
"read-it-later",
"read it later"
],
"description": "open source self hostable read-it-later web application",
"keywords": ["read-it-later","read it later"],
"homepage": "https://github.com/wallabag/wallabag",
"license": "MIT",
"authors": [
{
"name": "Nicolas Lœuillet",
"email": "nicolas@loeuillet.org",
"homepage": "https://nicolas.loeuillet.org",
"homepage": "http://www.cdetc.fr",
"role": "Developer"
},
{
"name": "Thomas Citharel",
"homepage": "https://tcit.fr",
"role": "Developer"
},
{
"name": "Jérémy Benoist",
"homepage": "https://www.j0k3r.net",
"role": "Developer"
},
{
"name": "Kevin Decherf",
"homepage": "https://kdecherf.com/",
"homepage": "http://tcit.fr",
"role": "Developer"
}
],
"homepage": "https://github.com/wallabag/wallabag",
"support": {
"email": "hello@wallabag.org",
"issues": "https://github.com/wallabag/wallabag/issues"
},
"require": {
"php": ">=7.4",
"ext-ctype": "*",
"ext-curl": "*",
"ext-dom": "*",
"ext-filter": "*",
"ext-gd": "*",
"ext-hash": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-mbstring": "*",
"ext-pcre": "*",
"ext-pdo": "*",
"ext-session": "*",
"ext-simplexml": "*",
"ext-tidy": "*",
"ext-tokenizer": "*",
"ext-xml": "*",
"babdev/pagerfanta-bundle": "^3.7",
"bdunogier/guzzle-site-authenticator": "^1.0.0",
"craue/config-bundle": "^2.3.0",
"defuse/php-encryption": "^2.1",
"doctrine/collections": "^1.6",
"doctrine/common": "^3.0",
"doctrine/dbal": "^3.3",
"doctrine/doctrine-bundle": "^2.0",
"doctrine/doctrine-migrations-bundle": "^3.2",
"doctrine/event-manager": "^1.1",
"doctrine/migrations": "^3.2",
"doctrine/orm": "^2.6",
"doctrine/persistence": "^3.0",
"egulias/email-validator": "^3.2",
"enshrined/svg-sanitize": "^0.15.4",
"friendsofsymfony/jsrouting-bundle": "^2.2",
"friendsofsymfony/oauth-server-bundle": "dev-master#dc8ff343363cf794d30eb1a123610d186a43f162",
"friendsofsymfony/rest-bundle": "~3.4",
"friendsofsymfony/user-bundle": "^3.1",
"guzzlehttp/guzzle": "^5.3.1",
"guzzlehttp/psr7": "^2.5",
"html2text/html2text": "^4.1",
"j0k3r/graby": "^2.0",
"javibravo/simpleue": "^2.0",
"jms/serializer": "^3.17",
"jms/serializer-bundle": "~5.0",
"kphoen/rulerz": "^0.21",
"kphoen/rulerz-bundle": "~0.13",
"laminas/laminas-code": "^4.7",
"laminas/laminas-diactoros": "^2.3",
"lcobucci/jwt": "~4.1.5",
"lexik/form-filter-bundle": "^7.0",
"mgargano/simplehtmldom": "~1.5",
"mnapoli/piwik-twig-extension": "^3.0",
"nelmio/api-doc-bundle": "^4.10",
"nelmio/cors-bundle": "~2.2",
"ocramius/proxy-manager": "^2.1.1",
"pagerfanta/doctrine-orm-adapter": "^3.7",
"pagerfanta/twig": "^3.7",
"php-amqplib/php-amqplib": "^3.4",
"php-amqplib/rabbitmq-bundle": "^2.11",
"php-http/client-common": "^2.4",
"php-http/discovery": "^1.14",
"php-http/guzzle5-adapter": "^2.0",
"php-http/httplug": "^2.3",
"php-http/httplug-bundle": "^1.14",
"php-http/message": "^1.13",
"php-http/message-factory": "^1.0",
"pragmarx/recovery": "^0.2.0",
"predis/predis": "^2.0.3",
"psr/http-message": "^1.0",
"psr/log": "^1.1",
"scheb/2fa-backup-code": "^5.13",
"scheb/2fa-bundle": "^5.13",
"scheb/2fa-email": "^5.13",
"scheb/2fa-google-authenticator": "^5.13",
"scheb/2fa-qr-code": "^5.13",
"scheb/2fa-trusted-device": "^5.13",
"sensio/framework-extra-bundle": "^6.2",
"sentry/sentry-symfony": "4.9.2",
"stof/doctrine-extensions-bundle": "^1.2",
"symfony/asset": "4.4.*",
"symfony/config": "4.4.*",
"symfony/dom-crawler": "4.4.*",
"symfony/flex": "^1.19",
"symfony/form": "4.4.*",
"symfony/mailer": "4.4.*",
"symfony/monolog-bundle": "^3.8",
"symfony/proxy-manager-bridge": "^4.4",
"symfony/security-bundle": "4.4.*",
"symfony/templating": "4.4.*",
"symfony/translation": "4.4.*",
"symfony/twig-bundle": "4.4.*",
"symfony/validator": "4.4.*",
"tecnickcom/tcpdf": "^6.3.0",
"twig/extra-bundle": "^3.4",
"twig/string-extra": "^3.4",
"twig/twig": "^3.4.3",
"wallabag/php-mobi": "~1.0",
"wallabag/phpepub": "^4.0.10",
"willdurand/hateoas": "^3.8",
"willdurand/hateoas-bundle": "~2.1"
},
"require-dev": {
"dama/doctrine-test-bundle": "^7.1",
"doctrine/doctrine-fixtures-bundle": "^3.4",
"ergebnis/composer-normalize": "^2.28",
"friendsofphp/php-cs-fixer": "~3.4",
"friendsoftwig/twigcs": "^6.0",
"m6web/redis-mock": "^5.0",
"php-http/mock-client": "^1.0",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-doctrine": "^1.3",
"phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-symfony": "^1.2",
"symfony/browser-kit": "4.4.*",
"symfony/css-selector": "4.4.*",
"symfony/dotenv": "4.4.*",
"symfony/maker-bundle": "^1.18",
"symfony/phpunit-bridge": "~6.0",
"symfony/stopwatch": "4.4.*",
"symfony/web-profiler-bundle": "4.4.*"
},
"conflict": {
"symfony/symfony": "*"
},
"suggest": {
"ext-imagick": "To keep GIF animation when downloading image is enabled"
},
"minimum-stability": "dev",
"prefer-stable": true,
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"config": {
"allow-plugins": {
"phpstan/extension-installer": true,
"symfony/flex": true,
"php-http/discovery": true,
"ergebnis/composer-normalize": true
},
"bin-dir": "bin",
"platform": {
"php": "7.4.29"
},
"sort-packages": true
},
"extra": {
"symfony": {
"allow-contrib": true,
"docker": false,
"require": "4.4.*"
}
},
"scripts": {
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
],
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
}
"php": ">=5.3.3",
"twig/twig": "1.*",
"twig/extensions": "1.0.*",
"umpirsky/twig-gettext-extractor": "1.1.*"
}
}

17564
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +0,0 @@
<?php
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__) . '/vendor/autoload.php';
if (!class_exists(Dotenv::class)) {
throw new LogicException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
}
// Load cached env vars if the .env.local.php file exists
// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2)
if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') && (!isset($env['APP_ENV']) || ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'])) {
(new Dotenv(false))->populate($env);
} else {
// load all the .env files
(new Dotenv(false))->loadEnv(dirname(__DIR__) . '/.env');
}
$_SERVER += $_ENV;
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV'];
$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], \FILTER_VALIDATE_BOOLEAN) ? '1' : '0';

View File

@ -1,34 +0,0 @@
<?php
return [
BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true],
BD\GuzzleSiteAuthenticatorBundle\BDGuzzleSiteAuthenticatorBundle::class => ['all' => true],
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
Craue\ConfigBundle\CraueConfigBundle::class => ['all' => true],
DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true],
Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
FOS\JsRoutingBundle\FOSJsRoutingBundle::class => ['all' => true],
FOS\OAuthServerBundle\FOSOAuthServerBundle::class => ['all' => true],
FOS\RestBundle\FOSRestBundle::class => ['all' => true],
FOS\UserBundle\FOSUserBundle::class => ['all' => true],
KPhoen\RulerZBundle\KPhoenRulerZBundle::class => ['all' => true],
Lexik\Bundle\FormFilterBundle\LexikFormFilterBundle::class => ['all' => true],
Nelmio\ApiDocBundle\NelmioApiDocBundle::class => ['all' => true],
Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true],
OldSound\RabbitMqBundle\OldSoundRabbitMqBundle::class => ['all' => true],
Http\HttplugBundle\HttplugBundle::class => ['all' => true],
Scheb\TwoFactorBundle\SchebTwoFactorBundle::class => ['all' => true],
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
Sentry\SentryBundle\SentryBundle::class => ['prod' => true],
Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true],
Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle::class => ['all' => true],
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
];

View File

@ -1,4 +0,0 @@
# For full configuration see https://github.com/willdurand/BazingaHateoasBundle/blob/master/Resources/doc/index.md#reference-configuration
bazinga_hateoas:
twig_extension:
enabled: true

View File

@ -1,19 +0,0 @@
framework:
cache:
# Unique name of your app: used to compute stable namespaces for cache keys.
#prefix_seed: your_vendor_name/app_name
# The "app" cache stores to the filesystem by default.
# The data in this cache should persist between deploys.
# Other options include:
# Redis
#app: cache.adapter.redis
#default_redis_provider: redis://localhost
# APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
#app: cache.adapter.apcu
# Namespaced pools use the above "app" backend by default
#pools:
#my.dedicated.cache: null

View File

@ -1,3 +0,0 @@
# define custom entity so we can override length attribute to fix utf8mb4 issue
craue_config:
entity_name: App\Entity\InternalSetting

View File

@ -1,9 +0,0 @@
framework:
router:
strict_requirements: true
profiler:
only_exceptions: false
mailer:
# see https://mailcatcher.me/
dsn: smtp://127.0.0.1:1025

View File

@ -1,7 +0,0 @@
jms_serializer:
visitors:
json_serialization:
options:
- JSON_PRETTY_PRINT
- JSON_UNESCAPED_SLASHES
- JSON_PRESERVE_ZERO_FRACTION

View File

@ -1,19 +0,0 @@
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
channels: ["!event"]
# uncomment to get logging in your browser
# you may have to allow bigger header sizes in your Web server configuration
#firephp:
# type: firephp
# level: info
#chromephp:
# type: chromephp
# level: info
console:
type: console
process_psr_3_messages: false
channels: ["!event", "!doctrine", "!console"]

View File

@ -1,3 +0,0 @@
web_profiler:
toolbar: true
intercept_redirects: false

View File

@ -1,34 +0,0 @@
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
types:
json_array: App\Doctrine\JsonArrayType
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
# doctrine:
# dbal:
# url: '%env(resolve:DATABASE_URL)%'
# # IMPORTANT: You MUST configure your server version,
# # either here or in the DATABASE_URL env var (see .env file)
# #server_version: '14'
# orm:
# auto_generate_proxy_classes: true
# naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
# auto_mapping: true
# mappings:
# App:
# is_bundle: false
# dir: '%kernel.project_dir%/src/Entity'
# prefix: 'App\Entity'
# alias: App

View File

@ -1,12 +0,0 @@
doctrine_migrations:
migrations_paths:
# namespace is arbitrary but should be different from App\Migrations
# as migrations classes should NOT be autoloaded
'DoctrineMigrations': '%kernel.project_dir%/migrations'
enable_profiler: false
storage:
table_storage:
table_name: 'migration_versions'
version_column_name: 'version'
version_column_length: 192
executed_at_column_name: 'executed_at'

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