Compare commits

...

1015 Commits

Author SHA1 Message Date
Andy Miller
d96b023d72 Merge branch 'release/1.7.41.1' 2023-05-10 08:34:58 -06:00
Andy Miller
b34f70f91d prepare for release 2023-05-10 08:34:45 -06:00
Andy Miller
9da8cad7fe truncator fix 2023-05-10 08:34:09 -06:00
Andy Miller
e4a30f5966 Merge branch 'release/1.7.41' 2023-05-09 12:44:53 -06:00
Andy Miller
814a050858 Merge tag '1.7.41' into develop
Release v1.7.41
2023-05-09 12:44:53 -06:00
Andy Miller
b6179bd2de prepare for release 2023-05-09 12:44:44 -06:00
Andy Miller
e5ac37e3cf FILTER_SANITIZE_STRING + Toolbox 1.6.5 2023-05-09 12:13:46 -06:00
Andy Miller
66463ddff3 more FILTER_SANITIZE_STRING fixes 2023-05-09 12:13:32 -06:00
Andy Miller
956c2993ae more filter fixes 2023-05-09 11:22:28 -06:00
Andy Miller
3cf67cb2fd deprecation fix 2023-05-09 11:18:36 -06:00
Andy Miller
36afa9d848 won’t work internally in Parsedown 2023-05-08 19:31:37 -06:00
Andy Miller
694ab76d1e added parse_url to the list of Grav Twig functions 2023-05-08 19:03:29 -06:00
Andy Miller
369c2e9ffa remove filter_input in favor of htmlspecialchars + strip_tags 2023-05-08 18:42:52 -06:00
Andy Miller
95ae35216a various cast fixes 2023-05-08 18:41:19 -06:00
Andy Miller
9c0477fa52 fix dynamic class value 2023-05-08 18:41:04 -06:00
Andy Miller
e1ab15e323 another cast fix 2023-05-08 17:44:52 -06:00
Andy Miller
ff77d58acb more casting fixes 2023-05-08 17:37:42 -06:00
Andy Miller
adfbd5730b changelog updated 2023-05-08 17:31:26 -06:00
Andy Miller
bf175983ec various deprecated fixes 2023-05-08 17:31:15 -06:00
Andy Miller
470b69c775 Use new groupNames method 2023-05-08 17:27:54 -06:00
Andy Miller
60648c43db Update to latest getgrav/image package 2023-05-08 17:27:43 -06:00
Andy Miller
75cd4f4306 Various casting fixes for deprecated messages 2023-05-08 17:27:03 -06:00
Andy Miller
2412115f41 TwigDeferredExtension updates 2023-05-08 17:26:22 -06:00
Andy Miller
598836d656 fix parsedown dynamic properties 2023-05-08 12:39:35 -06:00
Andy Miller
e1019c4420 remove FILTER_SANITIZE_STRING as deprecated 2023-05-08 12:21:09 -06:00
Djamil Legato
a8a6c0c520 Better and generic ignore pattern for security.yaml (fixes #3706) 2023-04-06 10:29:35 -07:00
Andy Miller
685d76231a Merge branch 'release/1.7.40' 2023-03-22 11:30:00 -06:00
Andy Miller
0f9b9f780f Merge tag '1.7.40' into develop
Release 1.7.40
2023-03-22 11:30:00 -06:00
Andy Miller
1e2792874d prepare for release 2023-03-22 11:29:52 -06:00
Andy Miller
0a061ce95e bugfix for timestamp logic 2023-03-22 10:18:07 -06:00
Andy Miller
d82ee029e1 updated changelog 2023-03-22 10:09:06 -06:00
Andy Miller
3b83c8204d Merge branch 'develop' of github.com:getgrav/grav into develop 2023-03-22 10:07:18 -06:00
Andy Miller
9ab7a4759a Added timestamp: true|false option for assets 2023-03-22 10:07:14 -06:00
Vilius Šumskas
c261d0d3f7 Fix force_ssl redirect in case of undefined hostname (#3702) 2023-03-17 08:53:45 -06:00
Andy Miller
940415dddb updated changelog 2023-03-07 10:47:55 -07:00
Andy Miller
60506e6f34 fixed duplicate page paths 2023-03-07 10:45:01 -07:00
Djamil Legato
bd7a74d79e Coerce ignore validation to array to cover both array/non-array values 2023-03-06 11:01:15 -08:00
Djamil Legato
5fcf690918 Fixed BlueprintSchema:flattenData to properly handle ignored fields 2023-03-06 10:40:36 -08:00
Anael Mobilia
904ec46a9f Update robots.txt reflecting actual folders (#3625)
* Update robots.txt

"grav" folder no longer exists

* Add folders now existing
2023-03-06 10:21:03 -07:00
Vilius Šumskas
259c148edb Fix whoami command usage (#3695)
Passing process as a string is deprecated since Symfony 4.2.
2023-03-06 10:19:23 -07:00
Rotzbua
0ae980062f Remove outdated setting xcache (#3615)
Already removed in commit ba2c37c216
2023-03-06 10:18:57 -07:00
Ari Cooper Davis
a888f19ad1 Fix LogViewer regex to reduce greediness (#3684) 2023-03-06 09:25:12 -07:00
Andy Miller
479b89134d Update composer.json 2023-02-23 18:46:44 -07:00
Andy Miller
d0d083d985 not just 7.3! 2023-02-23 18:01:01 -07:00
Andy Miller
396b412dda Merge tag '1.7.39.4' into develop
Release v1.7.39.4
2023-02-22 09:20:28 -07:00
Andy Miller
8be02e44c6 Merge branch 'release/1.7.39.4' 2023-02-22 09:20:27 -07:00
Andy Miller
ec115a6a64 prepare for release 2023-02-22 09:20:07 -07:00
Andy Miller
3b92c1aca4 updated changelog 2023-02-22 09:19:24 -07:00
Andy Miller
2d9df03766 Revert "move account info under account section"
This reverts commit 1fae4504a2.
2023-02-22 09:16:54 -07:00
Andy Miller
f086f84ff2 Merge branch 'release/1.7.39.3' 2023-02-21 15:12:34 -07:00
Andy Miller
a2b23ad80e Merge tag '1.7.39.3' into develop
Release 1.7.39.3
2023-02-21 15:12:34 -07:00
Andy Miller
88350d9090 prepare for release 2023-02-21 15:12:24 -07:00
Andy Miller
b2f27fbdf2 cleaner fix for template bug 2023-02-21 12:55:50 -07:00
Andy Miller
72b769aa63 fix for rendering specific templates fixes #3698 2023-02-21 09:39:14 -07:00
Andy Miller
8a7e38751a Merge branch 'release/1.7.39.2' 2023-02-20 14:31:42 -07:00
Andy Miller
3e6c719441 Merge tag '1.7.39.2' into develop
Release v1.7.39.2
2023-02-20 14:31:42 -07:00
Andy Miller
8efb000801 prepare for release 2023-02-20 14:31:30 -07:00
Andy Miller
6d6e92048e flex accounts session fix 2023-02-20 14:02:13 -07:00
Andy Miller
8c365d45a4 Merge branch 'release/1.7.39.1'
# Conflicts:
#	CHANGELOG.md
2023-02-20 11:52:11 -07:00
Andy Miller
ee6448c307 prepare for release 2023-02-20 11:51:36 -07:00
Andy Miller
f8c9e9ada4 css fix for phpdebugbar 2023-02-20 11:49:47 -07:00
Andy Miller
87ab3ae4a7 Fix for debugbar rendering 2023-02-20 10:01:30 -07:00
Andy Miller
68dc461bc0 Merge tag '1.7.39' into develop
Release v1.7.39
2023-02-19 14:52:00 -07:00
Andy Miller
4dd98610a4 Merge branch 'release/1.7.39' 2023-02-19 14:51:59 -07:00
Andy Miller
0358e55aed Merge branch 'master' into develop 2023-02-19 14:51:07 -07:00
Andy Miller
9e5ed10925 typo in types 2023-02-19 14:50:16 -07:00
Andy Miller
3b7eb198cf Merge tag '1.7.39' into develop
Release v1.7.39
2023-02-19 14:44:21 -07:00
Andy Miller
81ed7379a9 Merge branch 'release/1.7.39' 2023-02-19 14:44:21 -07:00
Andy Miller
e1950e985b prepare for release 2023-02-19 14:44:10 -07:00
Andy Miller
84c61af807 updated changelog 2023-02-19 14:43:34 -07:00
Andy Miller
93755c7329 fix UtilsTest for PHPUnit 10 2023-02-19 13:48:13 -07:00
Andy Miller
5329918e2f Merge branch 'develop' of github.com:getgrav/grav into develop 2023-02-19 13:27:58 -07:00
Andy Miller
efd7726646 update packages 2023-02-19 13:27:52 -07:00
Rotzbua
4c762c0ac3 add php 8.2 to test (#3662)
now released https://www.php.net/releases/8.2/en.php
2023-02-19 13:27:19 -07:00
Andy Miller
81a911572c more PHP 8.2 fixes 2023-02-19 13:26:17 -07:00
Andy Miller
c56bb86b61 php 8.2 fixes 2023-02-19 12:07:58 -07:00
Andy Miller
ea010f19f0 Fix for bad rendering of modules 2023-02-17 16:00:46 -07:00
Andy Miller
1fae4504a2 move account info under account section 2023-02-15 15:24:03 -07:00
Andy Miller
d99c84d9f8 empty date to avoid confusion 2023-02-10 15:26:15 -07:00
Andy Miller
c732bfaeef Merge branch 'develop' of github.com:getgrav/grav into develop 2023-01-11 16:16:57 -07:00
Andy Miller
4f0fee684a fix for email validation 2023-01-11 16:16:52 -07:00
Daniel Mason
884faa91bb Update php-fpm socket file to use generic socket file instead of pinning to version (#3669) 2023-01-02 16:19:05 -07:00
Andy Miller
8c261a05cc Merge tag '1.7.38' into develop
Release v1.7.38
2023-01-02 11:24:06 -07:00
Andy Miller
95aa57ca50 Merge branch 'release/1.7.38' 2023-01-02 11:24:05 -07:00
Andy Miller
0bc0e58707 prepare for release 2023-01-02 11:23:56 -07:00
Andy Miller
a86e0d4b96 Update copyright date 2023-01-02 11:09:32 -07:00
Andy Miller
44c819b021 Added new onBeforeSessionStart() Event 2023-01-02 10:46:32 -07:00
Andy Miller
3f13d81c6f Get around a bug where messages were not always being set on session during redirect 2023-01-01 13:10:58 -07:00
Andy Miller
720a965c7e update changelog 2022-12-02 12:23:04 -07:00
Alex
f0e263a404 GitHub Workflows security hardening (#3624)
* build: harden build.yaml permissions

Signed-off-by: Alex <aleksandrosansan@gmail.com>

* build: harden trigger-skeletons.yml permissions

Signed-off-by: Alex <aleksandrosansan@gmail.com>

* build: harden tests.yaml permissions

Signed-off-by: Alex <aleksandrosansan@gmail.com>

Signed-off-by: Alex <aleksandrosansan@gmail.com>
2022-11-30 17:13:49 -08:00
Andy Miller
ad33a63ad2 Revert "dont’ fail hard if pages recurse with same path"
This reverts commit 9c5b8b6496.

# Conflicts:
#	system/src/Grav/Common/Page/Pages.php
2022-10-25 18:20:08 -06:00
Andy Miller
f7b7f3337d fix 2022-10-25 18:01:42 -06:00
Andy Miller
983fcc5e40 Merge branch 'develop' of github.com:getgrav/grav into develop 2022-10-25 17:47:08 -06:00
Andy Miller
9c5b8b6496 dont’ fail hard if pages recurse with same path 2022-10-25 17:47:03 -06:00
Djamil Legato
71fc4eb16b Added .env and .gravenv to gitignore, most likely you don't want them pushed 2022-10-10 14:32:25 -07:00
Andy Miller
ea2858ea2b Merge branch 'develop' of github.com:getgrav/grav into develop 2022-10-05 15:10:37 -06:00
Andy Miller
d080578e83 Upgrade composer to 2.4.2 - fixes #3627 2022-10-05 15:10:32 -06:00
Andy Miller
8427eb6d3e Upgrade composer to 2.4.2 - fixes #3637 2022-10-05 15:09:58 -06:00
Andy Miller
e3a342dabd Merge tag '1.7.37.1' into develop
Release v1.7.37.1
2022-10-05 15:06:23 -06:00
Andy Miller
00b13d1093 Merge branch 'release/1.7.37.1' 2022-10-05 15:06:22 -06:00
Andy Miller
7e5ff71623 prepare for release 2022-10-05 15:06:11 -06:00
Andy Miller
72ba7ccab6 Merge tag '1.7.37' into develop
Release v1.7.37
2022-10-05 11:31:48 -06:00
Andy Miller
ea9c9fdca8 Merge branch 'release/1.7.37' 2022-10-05 11:31:48 -06:00
Andy Miller
5e379bfa39 prepare for release 2022-10-05 11:31:38 -06:00
Matias Griese
fb1e31d0e4 Force user index file to be updated to fix email addresses [getgrav/grav-plugin-login#229] 2022-10-05 19:16:18 +03:00
Andy Miller
8e6b823833 massive change! 2022-10-05 06:38:32 -06:00
Andy Miller
6fcc4ec5d0 Added Pages:: getSimplePagesHash() method 2022-10-05 06:34:16 -06:00
Andy Miller
3e9866920b updated changelog 2022-10-04 17:59:01 -06:00
Andy Miller
3a00ca0457 temp workaround for windows issue - Fixes #2299 2022-10-04 17:55:21 -06:00
Andy Miller
2f6e4b1ad8 Merge branch 'feature/multiple-page-paths' into develop 2022-10-04 11:46:08 -06:00
Andy Miller
01d627e8f7 composer update 2022-10-04 11:45:41 -06:00
Andy Miller
51a386e252 Fix bad default page stream 2022-09-22 17:40:35 -06:00
Andy Miller
30502e8042 fixed composer.json 2022-09-22 12:38:27 -06:00
Andy Miller
01264ef70d initial commit 2022-09-22 12:36:36 -06:00
Andy Miller
de642df06e Added new onPageHeaders() event 2022-09-13 14:28:58 -06:00
Andy Miller
dd8945124e Merge branch 'release/1.7.36' 2022-09-08 11:59:58 -06:00
Andy Miller
0b6428ec29 Merge tag '1.7.36' into develop
Release v1.7.36
2022-09-08 11:59:58 -06:00
Andy Miller
840862c26d prepare for release 2022-09-08 11:59:44 -06:00
Matias Griese
f799a71001 Fixed loggin with a capitalised email address when using old users [getgrav/grav-plugin-login#229] 2022-09-05 21:14:37 +03:00
Matias Griese
3f10c05840 Added support for flex-ignore@ to hide all the nested fields in the blueprint 2022-09-02 19:36:22 +03:00
Matias Griese
dbca0b451c Typo 2022-09-02 19:02:32 +03:00
Matias Griese
6882037b85 Added authorize-*@: support for Flex blueprints 2022-09-02 13:16:19 +03:00
Matias Griese
5d2dc6c329 Composer update 2022-08-18 13:24:34 +03:00
Andy Miller
e9f28ab824 Merge tag '1.7.35' into develop
Release v1.7.35
2022-08-04 15:29:36 -06:00
Andy Miller
186eb8ae6c Merge branch 'release/1.7.35' 2022-08-04 15:29:35 -06:00
Andy Miller
2258adcb05 prepare for release 2022-08-04 15:29:22 -06:00
Andy Miller
20c4cdefe8 minor vendor updates 2022-07-26 12:16:23 -06:00
Matias Griese
aba6382f2e Added variables $environment (string), $request (PSR-7 ServerRequestInterface|null) and $uri (PSR-7 Uri|null) to be used in setup.php 2022-06-30 12:56:31 +03:00
Matias Griese
32dd550178 Fixed FlexDirectory::reloadIndex() to actually get the items from the filesystem 2022-06-29 21:32:50 +03:00
Matias Griese
ec3175fc89 Changelog update 2022-06-29 13:11:14 +03:00
Matias Griese
dac1614306 Composer update 2022-06-29 13:10:26 +03:00
Matias Griese
37e92e4f55 Merge branch 'feature/api' of github.com:getgrav/grav into develop 2022-06-29 13:07:19 +03:00
Matias Griese
1b0c3d1fce Fix phpstan error 2022-06-29 13:06:43 +03:00
Matias Griese
00cb9c3540 Make the new relationships code to work in PHP 7.3 2022-06-29 12:45:16 +03:00
Paweł Bogusławski
b9800b7c35 Allow to configure syslog tag (#3596)
* Allow to configure syslog tag

Author-Change-Id: IB#1120629

* Update InitializeProcessor.php
2022-06-15 10:38:59 -06:00
Matias Griese
b5ab00639b Merge branch 'develop' of github.com:getgrav/grav into feature/api 2022-06-15 14:38:39 +03:00
Andy Miller
cf38cccda1 Merge branch 'release/1.7.34' 2022-06-14 11:09:32 -06:00
Andy Miller
024964eafb Merge tag '1.7.34' into develop
Release v1.7.34
2022-06-14 11:09:32 -06:00
Andy Miller
f8d736b24a prepare for release 2022-06-14 11:09:20 -06:00
Matias Griese
62c4f3c768 Ignore phpstan error 2022-06-14 20:08:04 +03:00
Matias Griese
31920bb153 Composer update 2022-06-14 19:57:42 +03:00
Matias Griese
b18b49a239 Fixed login and user search by email not being case-insensitive when using Flex Users 2022-06-14 10:43:46 +03:00
Matias Griese
9d6a2dba09 Fixed Twig |filter() allowing code execution 2022-06-13 21:11:33 +03:00
Matias Griese
de4af5dbcc Fixed bin/grav install command with arbitrary destination folder name 2022-06-13 20:38:16 +03:00
Matias Griese
f31541250f Fixed broken phpstan tests 2022-06-13 19:29:42 +03:00
Matias Griese
f570cea3bd Fixed alias class references 2022-06-13 19:19:00 +03:00
Matias Griese
0b54a7b4bc Ignore upcoming media.json file in media 2022-06-13 18:22:03 +03:00
Matias Griese
f464492582 Composer update 2022-06-10 11:51:28 +03:00
Matias Griese
81aa4601e4 Changelog update 2022-06-06 11:37:10 +03:00
Yankl-Peretz Blum
6b57f29511 Add Eastern Yiddish
'yi' actually refers to a macrolanguage. The only language in current use in this category is Eastern Yiddish, with language code 'ydd'
2022-06-06 11:14:17 +03:00
yankl
74296a80d0 Add back Yiddish to Language Codes 2022-06-06 11:14:17 +03:00
Matias Griese
8dbc394ae7 Composer update 2022-05-20 16:42:06 +03:00
Matias Griese
89709a7190 Merge branch 'develop' of github.com:getgrav/grav into feature/api
 Conflicts:
	CHANGELOG.md
	composer.lock
2022-05-20 16:41:30 +03:00
Matias Griese
e6320fa327 Changelog update (typo) 2022-05-20 16:40:54 +03:00
Matias Griese
3bf979bd0f Changelog update 2022-05-20 15:57:03 +03:00
Matias Griese
6fa96ca554 Regression: Fixed saving page with a new language causing cache corruption [#2282] 2022-05-20 15:55:38 +03:00
Matias Griese
60ce105fa5 Improved flash media handling in MediaIdentifier 2022-05-20 11:58:09 +03:00
Matias Griese
ec16b5184e Fixed creating empty uploaded file 2022-05-20 10:59:53 +03:00
Matias Griese
a7a9b5d132 Fixed a potential fatal error when using watermark in images 2022-05-13 17:04:56 +03:00
Matias Griese
460ca49f9b Composer update 2022-05-06 17:34:00 +03:00
Matias Griese
32a486f1d4 Added ToManyRelationship::getNthIdentifier() 2022-05-05 11:03:06 +03:00
Matias Griese
1237f0a6d6 Added support for multipart/form-data content type in PUT and PATCH requests 2022-05-04 14:45:59 +03:00
Matias Griese
9ec3e7d731 Minor fix on account relationships 2022-05-03 16:28:02 +03:00
Matias Griese
d6dcd96301 Added relationships support for user accounts 2022-05-03 13:18:57 +03:00
Matias Griese
2957077935 Added relationship logic for flex 2022-05-03 10:27:50 +03:00
Matias Griese
6ba1cff114 Added classes for defining relationships 2022-04-28 13:55:25 +03:00
Matias Griese
6218a4b366 Revert accidental PHP requirement update 2022-04-26 12:30:34 +03:00
Matias Griese
28c4305d46 Composer update 2022-04-26 09:09:14 +03:00
Andy Miller
a2413718f3 Merge branch 'release/1.7.33' 2022-04-25 14:52:04 -06:00
Andy Miller
767a17bf50 Merge tag '1.7.33' into develop
Release v1.7.33
2022-04-25 14:52:04 -06:00
Andy Miller
d75c87ca5e prepare for release 2022-04-25 14:51:51 -06:00
Andy Miller
c2a8145f2c prepare for release 2022-04-25 14:50:34 -06:00
Matias Griese
26e4768bc5 Fixed default collection ordering in pages admin 2022-04-25 18:27:21 +03:00
Matias Griese
4464f29169 Composer update 2022-04-19 10:56:41 +03:00
Matias Griese
2ea39309b6 Composer update 2022-03-31 11:30:35 +03:00
Matias Griese
1c0ed43afa Fixed XSS check not detecting onX events without quotes 2022-03-30 13:26:11 +03:00
Matias Griese
a092aed4ed When saving yaml and markdown, create also a cached version of the file and recompile it in opcache 2022-03-30 12:00:59 +03:00
Matias Griese
7c2b21fb60 Fixed missing changes in yaml & markdown files if saved multiple times during the same second because of a caching issue 2022-03-29 21:35:02 +03:00
Andy Miller
e1ca3c2f70 Merge tag '1.7.32' into develop
Release v1.7.32
2022-03-28 11:36:58 -06:00
Andy Miller
0da5ccb3e1 Merge branch 'release/1.7.32' 2022-03-28 11:36:57 -06:00
Andy Miller
2830ba9120 prepare for release 2022-03-28 11:36:48 -06:00
Matias Griese
5a355fb94e Fixed page search not working with selected language [#3316] 2022-03-25 10:33:05 +02:00
Matias Griese
b0add67cdd Flex search() optimizations 2022-03-25 10:32:34 +02:00
Matias Griese
236c38e65d Changelog update 2022-03-23 15:49:12 +02:00
Matias Griese
c9c23c6c4f Better fix for system.cache.gzip: true 2022-03-23 15:47:45 +02:00
Matias Griese
8f0443a73d Fixed phpstan issues, composer update 2022-03-23 13:05:54 +02:00
Matias Griese
c9271c80a7 Create method cleanOutputBuffers() and use it 2022-03-23 10:49:19 +02:00
Andy Miller
62d9db7650 gzip fixes for downloading 2022-03-22 17:30:55 -06:00
Matias Griese
4f7dad2872 Changelog update 2022-03-21 12:21:12 +02:00
Andy Miller
57d6be0f78 Expose parse_url via parseurl() Twig function 2022-03-20 19:02:36 -06:00
Andy Miller
ae55b4794f Fix for multi-lang issues with Security report 2022-03-20 18:22:12 -06:00
Andy Miller
d82851af10 changelog updated 2022-03-18 13:18:54 -06:00
Andy Miller
730231b8b7 Merge branch 'develop' of github.com:getgrav/grav into develop 2022-03-18 13:15:44 -06:00
Andy Miller
82015d4ae7 gzip enabled breaking in close() 2022-03-18 13:15:37 -06:00
Matias Griese
4376c8ce57 Better multi-byte support for replace_last() filter 2022-03-18 20:39:10 +02:00
Matias Griese
aa1e1bc0ad Optimization for Utils::url() 2022-03-18 20:38:33 +02:00
Matias Griese
35d4d00429 Better fix for multilang URLs in Utils::url() 2022-03-17 16:55:34 +02:00
Matias Griese
3e7f67f589 Set default maximum length for text fields 2022-03-17 13:04:06 +02:00
Matias Griese
c08341046b Added |replace_last(search, replace) filter 2022-03-17 12:15:05 +02:00
Andy Miller
010753bdd6 typo 2022-03-16 14:29:05 -06:00
Andy Miller
d36bc4b8a2 Fix for multilang URLs in Utils::url() 2022-03-16 14:28:07 -06:00
Andy Miller
847f09a2ac Merge branch 'release/1.7.31' 2022-03-14 11:34:43 -06:00
Andy Miller
28469a6bf6 Merge tag '1.7.31' into develop
Release v1.7.31
2022-03-14 11:34:43 -06:00
Andy Miller
0d19bc6e97 prepare for release 2022-03-14 11:34:33 -06:00
Matias Griese
492cc1d2f1 Added XSS check for uploaded SVG files before they get stored (in Form plugin) 2022-03-14 18:55:56 +02:00
Matias Griese
4d4efb31e3 Escape root url pattern in Utils::url() 2022-03-09 12:25:46 +02:00
Andy Miller
c7bc5f5b59 hash for multiavatar only 2022-03-08 14:00:06 -07:00
Andy Miller
41b8fbb0e0 Update changelog + Accounts in sidebar 2022-03-08 10:45:44 -07:00
Djamil Legato
e60ba13d75 Fixed issue with URL method not escaping subpaths slashes 2022-03-08 09:32:28 -08:00
Matias Griese
e0deeeb551 Make new avatar logic more robust 2022-03-08 19:15:46 +02:00
Matias Griese
499b25aad8 Composer update 2022-03-08 19:07:55 +02:00
Andy Miller
9fd580c49b Alternative Multiavatar Approach (#3551)
* Support multiavatar by default

* Support custom hash string
2022-03-08 09:45:41 -07:00
Andy Miller
e09bae918c fix for empty $root 2022-03-05 11:20:54 -07:00
Andy Miller
0abde01442 better fix 2022-03-05 09:22:12 -07:00
Andy Miller
03f71fa49d rolled back but fixed the Utils::url() functionality 2022-03-04 15:37:03 -07:00
Andy Miller
4f92568171 Added system config option legacy_url_root_behavior 2022-03-03 13:16:48 -07:00
Andy Miller
b80fcca0cf fixes for Utils::url() 2022-03-03 12:35:17 -07:00
Andy Miller
879eb27540 updated changelog 2022-03-03 11:21:36 -07:00
Andy Miller
7b7235297e Merge branch 'develop' of github.com:getgrav/grav into develop 2022-03-03 11:21:06 -07:00
Andy Miller
34ab8408fa fix for url() function breaking when path contains root 2022-03-03 11:21:03 -07:00
Matias Griese
f19297d5f7 Added XSS check for uploaded SVG files before they get stored 2022-03-02 13:37:51 +02:00
Matias Griese
78b8051627 Fixed avatar save location when account:// stream points to custom directory 2022-03-02 12:24:27 +02:00
Djamil Legato
3dd0cabeac Fixed entity sanitization for XSS detection 2022-02-23 14:57:36 -08:00
Matias Griese
b992d7f185 Composer update 2022-02-22 11:33:27 +02:00
Matias Griese
a7e82f279a Fixed non-standard video html atributes generated by {{ media.html() }} [#3540] 2022-02-22 11:30:33 +02:00
Matias Griese
6d0d6c22d3 Fixed new Utils::pathinfo() and Utils::basename() being too strict for legacy use [#3542] 2022-02-22 09:46:29 +02:00
Matias Griese
7e52112b21 Fixed phpstan issues (All level 2, Framework level 5) 2022-02-19 12:01:50 +02:00
xaver
a900b89795 Remove variable duplicate (#3539) 2022-02-18 08:39:20 -07:00
Xaver Maierhofer
cad8510dae Merge index exceptions with same handling 2022-02-16 15:52:26 +02:00
Matias Griese
7cafeb2870 Composer update 2022-02-16 09:53:11 +02:00
Matias Griese
b3b5fca16c Fixed 'mbstring' extension is not loaded error, use Polyfill instead [#3504] 2022-02-14 09:38:22 +02:00
Matias Griese
ec884997ef Improve vector image code [#3533] 2022-02-12 10:49:52 +02:00
Matias Griese
3a45748ce6 Added auto_sizes support for SVG vector images [#3533] 2022-02-12 10:41:34 +02:00
Xaver Maierhofer
c4e10cf59f Add Vector image auto_sizes support 2022-02-12 10:26:18 +02:00
Matias Griese
2c252c43b4 Composer update 2022-02-08 12:15:17 +02:00
Matias Griese
382756f79b Fixed pimple link #3527 2022-02-08 08:40:59 +02:00
Andy Miller
11013cbb57 Merge branch 'release/1.7.30' 2022-02-07 12:12:11 -07:00
Andy Miller
2377be9a2b Merge tag '1.7.30' into develop
Release v1.7.30
2022-02-07 12:12:11 -07:00
Andy Miller
b1938c9790 prepare for release 2022-02-07 12:12:03 -07:00
Rotzbua
5d842349e5 add composer suggestion for exif extension 2022-02-07 13:43:23 +02:00
Rotzbua
0323a898cb Normalize variable names 2022-02-07 11:20:16 +02:00
Rotzbua
d275532cf8 Fix documentation of return type 2022-02-07 11:20:16 +02:00
Matias Griese
7306f164e9 Fixed groups filter not matching against readableName [getgrav/grav-plugin-admin#2224] 2022-02-07 10:30:25 +02:00
Matias Griese
3ca58e9ae1 Composer update 2022-02-07 10:11:45 +02:00
Matias Griese
88219fbf0e Fixed accounts filter only matches against email address [getgrav/grav-plugin-admin#2224] 2022-02-07 10:07:00 +02:00
Djamil Legato
5eefc91781 Fixed "Page Authors" field in Security tab, wrongly loading and saving the value (fixes #3525) 2022-02-04 11:23:09 -08:00
Matias Griese
67ef9b221a Fixed error while deleting retina image in admin 2022-02-04 19:58:23 +02:00
Matias Griese
c82a35cea0 Added twig filter |field_parent to get parent field name 2022-02-03 19:51:46 +02:00
Matias Griese
840441bc9b Composer update 2022-02-03 19:50:02 +02:00
Andy Miller
9556e47874 Merge branch 'release/1.7.29.1' 2022-01-31 11:52:21 -07:00
Andy Miller
45fd533186 Merge tag '1.7.29.1' into develop
Release v1.7.29.1
2022-01-31 11:52:21 -07:00
Andy Miller
5248519c37 prepare for release 2022-01-31 11:52:12 -07:00
Matias Griese
5b9a0fb237 Fixed Call to undefined method error when upgrading from Grav 1.6 [#3523] 2022-01-31 11:26:35 +02:00
Matias Griese
389ffe1c7a Composer update 2022-01-31 11:20:09 +02:00
Andy Miller
7b39a1bd8f Merge branch 'release/1.7.29' 2022-01-28 13:08:43 -07:00
Andy Miller
4c5c5925b2 Merge tag '1.7.29' into develop
Release v1.7.29
2022-01-28 13:08:43 -07:00
Andy Miller
96df7deaf4 prepare for release 2022-01-28 13:08:36 -07:00
Matias Griese
7666651324 Fixed error on thumbnail image creation 2022-01-28 19:13:26 +02:00
Djamil Legato
b9db2f3322 Fixed MimeType for gzip (application/x-gzip) 2022-01-27 16:24:50 -08:00
Matias Griese
84a1ab6ca5 Added unicode-safe Utils::basename() and Utils::pathinfo() methods and use them everywhere 2022-01-26 13:54:33 +02:00
Matias Griese
3b89377570 Improved Filesystem::basename() and Filesystem::pathinfo() to be UTF-8 safe 2022-01-26 13:16:35 +02:00
Matias Griese
c3c31880b0 Added support for registering assets from HtmlBlock 2022-01-26 11:06:05 +02:00
Andy Miller
52449246e5 Merge branch 'release/1.7.28' 2022-01-24 11:40:47 -07:00
Andy Miller
b03de18304 Merge tag '1.7.28' into develop
Release v1.7.28
2022-01-24 11:40:47 -07:00
Andy Miller
9bb6f5366e prepare for release 2022-01-24 11:40:25 -07:00
Matias Griese
d126d1b656 Composer update 2022-01-21 11:32:29 +02:00
Matias Griese
6f2fa9311a Fixed XSS check not detecting escaped &#58 2022-01-18 12:34:52 +02:00
Matias Griese
61061220d7 Compoer update, fixed phpstan errors 2022-01-17 09:37:59 +02:00
Matias Griese
aa7e64f2b7 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	CHANGELOG.md
2022-01-14 11:25:40 +02:00
Matias Griese
b58210de1a Added HtmlBlock support for {% style %}, {% script %} and {% link %} tags 2022-01-14 11:25:21 +02:00
Andy Miller
0bb52c75ce page-level override for redirect_default_route 2022-01-13 06:20:38 -07:00
Matias Griese
da6b41f8a6 Added twig tag for links: {% link icon 'theme://images/favicon.png' priority: 20 with { type: 'image/png' } %} 2022-01-13 13:06:19 +02:00
Matias Griese
1ab2f7083c Added module support for twig script tag: {% script module 'theme://js/module.mjs' %} 2022-01-13 12:52:23 +02:00
Matias Griese
707710d679 Added links and modules support to HtmlBlock class 2022-01-13 12:24:05 +02:00
Andy Miller
bab83ed977 Merge branch 'release/1.7.27.1' 2022-01-12 15:26:38 -07:00
Andy Miller
c103efea22 Merge tag '1.7.27.1' into develop
Release v1.7.27.1
2022-01-12 15:26:38 -07:00
Andy Miller
3e784a2f15 prepare for release 2022-01-12 15:26:29 -07:00
Andy Miller
21f76a1e34 Fixed typo causing ; to join files in CSS 2022-01-12 15:23:28 -07:00
Andy Miller
a8c4e730f6 Merge branch 'release/1.7.27' 2022-01-12 12:31:42 -07:00
Andy Miller
c1a9a7d648 Merge tag '1.7.27' into develop
Release v1.7.27
2022-01-12 12:31:42 -07:00
Andy Miller
d329df2bb0 prepare for release 2022-01-12 12:31:34 -07:00
Andy Miller
f90232e511 typo 2022-01-12 12:29:43 -07:00
Andy Miller
57bd3c9cb5 fixed js module import when pipelined 2022-01-12 12:21:18 -07:00
Andy Miller
419692b9e4 Merge branch 'develop' of github.com:getgrav/grav into develop 2022-01-12 11:10:16 -07:00
Andy Miller
b422d9585c small size for field 2022-01-12 11:10:12 -07:00
Matias Griese
67b9623d6c Numeric sort for sizes: MediaObjectTrait::getAlternatives() 2022-01-12 13:29:18 +02:00
Matias Griese
bda6b26896 Added Medium::getAlternatives() to be able to list all the retina sizes 2022-01-12 12:00:41 +02:00
Andy Miller
9b2af98b0b Merge branch 'develop' of github.com:getgrav/grav into develop 2022-01-11 12:03:22 -07:00
Andy Miller
b07bf96ad9 Support for YubiKey OTP 2-Factor authenticator 2022-01-11 12:03:13 -07:00
Rotzbua
fb2c4f48f7 add php 8.1 to test (#3504)
now released https://www.php.net/releases/8.1/en.php
2022-01-11 09:55:45 -07:00
pmoreno.rodriguez
308383b093 Update README.md (#3517)
Changed the Twig Templating address to https://twig.symfony.com/.
2022-01-11 09:55:24 -07:00
Matias Griese
f8f5502c40 Added Media::getRoute() and Media::getRawRoute() methods to get page route if available 2022-01-11 14:34:35 +02:00
Matias Griese
55b45fcf2f Fixed scaled image medium filename when using non-existing retina file 2022-01-10 22:12:09 +02:00
Matias Griese
bd471cb61b Added Utils::getExtensionsByMime() method to get all the registered extensions for the specific mime type 2022-01-10 19:40:00 +02:00
Andy Miller
2ac38d39ea updated changelog 2022-01-09 21:24:45 -07:00
Andy Miller
7bb8d10b22 Asset blueprint refactor 2022-01-09 21:23:19 -07:00
Andy Miller
f9fcdd6c51 Revert "simplify asset collections in a single array"
This reverts commit 756b088ada.

# Conflicts:
#	system/src/Grav/Common/Assets.php
2022-01-09 21:12:39 -07:00
Andy Miller
3febaaa802 minor method typo 2022-01-09 17:03:03 -07:00
Andy Miller
178cc9c5ea Merge branch 'feature/js-module-assets' into develop 2022-01-09 16:23:37 -07:00
Andy Miller
8d51911873 updated changelog 2022-01-09 16:22:35 -07:00
Andy Miller
99ceb40c5f improvements 2022-01-09 16:14:20 -07:00
Andy Miller
8767bfb9b0 refactoring and generic link support 2022-01-09 15:51:00 -07:00
Andy Miller
756b088ada simplify asset collections in a single array 2022-01-09 14:35:16 -07:00
Andy Miller
c962201bae initial js module support in assets 2022-01-09 13:29:40 -07:00
Matias Griese
2335271472 Second attempt to fix CLI --env, now works with bin/plugins 2022-01-07 21:42:25 +02:00
Matias Griese
47d7927bac Improved onPageFallBackUrl event 2022-01-06 18:10:24 +02:00
Matias Griese
d15542e553 SVG files do not have higher quality alternative 2022-01-06 16:01:53 +02:00
Matias Griese
e6447f7203 Improved Utils::download() method to allow overrides on download name, mime and expires header 2022-01-06 15:36:29 +02:00
Djamil Legato
fbcaf991aa cleanup 2022-01-05 12:00:12 -08:00
Matias Griese
cc8ec10098 Fixed CLI --env and --lang options having no effect if they aren't added before all the other options 2022-01-05 19:52:57 +02:00
Andy Miller
92824f44e6 Merge branch 'release/1.7.26.1' 2022-01-04 11:01:33 -07:00
Andy Miller
c4eefc13a7 Merge tag '1.7.26.1' into develop
Release v1.7.26.1
2022-01-04 11:01:33 -07:00
Andy Miller
d541808604 prepare for release 2022-01-04 11:01:21 -07:00
Matias Griese
231c8a0f4c Fixed UserObject::getAccess() after cloning the object 2022-01-04 18:47:45 +02:00
Andy Miller
ea39587329 Merge branch 'release/1.7.26' 2022-01-03 09:50:49 -07:00
Andy Miller
8f3ac75afd Merge tag '1.7.26' into develop
Release v1.7.26
2022-01-03 09:50:49 -07:00
Andy Miller
b40b543790 prepare for release 2022-01-03 09:50:34 -07:00
Andy Miller
3b7921b698 updated copyright year 2022-01-03 09:14:00 -07:00
Matias Griese
6af1ee48a5 Fixed PHP 8.1 issue in Media, minor optimization 2022-01-03 16:38:11 +02:00
Matias Griese
4519971a76 Fixed Flex directory configuration creating environment configuration when it should not 2021-12-22 21:28:26 +02:00
Matias Griese
26295d5cf2 Fixed FlexIndex::call() to return null instead of failing to call undefined method 2021-12-20 14:46:20 +02:00
Andy Miller
bfc9e26f26 renamed method 2021-12-18 17:53:19 -07:00
Andy Miller
d939b1e563 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-12-18 17:46:59 -07:00
Andy Miller
8343cfb278 new Plugin::upstreamConfigVar 2021-12-18 17:46:55 -07:00
Matias Griese
290a28109e When symlinking Grav install, include also tests 2021-12-17 19:42:02 +02:00
Matias Griese
5bec5db5e1 Fixed Plugin::config() returning null in some cases 2021-12-16 14:25:51 +02:00
Matias Griese
a6fb0a14f0 Fix bad docblocks 2021-12-16 13:59:13 +02:00
Matias Griese
7cb62ddc75 Merge remote-tracking branch 'origin/develop' into develop 2021-12-16 13:55:43 +02:00
Matias Griese
0f85b831b5 Minor fixes 2021-12-16 13:55:36 +02:00
dani
530e6a4399 Update pages.yaml
i believe this is a mistake, the unclosed `<small>` tag is rendering the entire form this way.
2021-12-16 11:16:58 +02:00
dani
c7700c2e16 Update es.yaml
missing accents
2021-12-16 11:16:58 +02:00
Matias Griese
89acc59ac3 Improved UserObject cloning 2021-12-16 10:57:10 +02:00
Matias Griese
9a25c88471 Merge remote-tracking branch 'origin/develop' into develop 2021-12-16 08:49:57 +02:00
Matias Griese
4ccbdafe8a Update Toolbox library for PHP 8.1 support 2021-12-16 08:49:45 +02:00
Djamil Legato
74096e836f Updated OpenCollective tiers 2021-12-15 12:19:01 -08:00
Matias Griese
1c51bf8a66 Added UserObject::$isAuthorizedCallable to allow $user->isAuthorized() customization 2021-12-15 18:00:50 +02:00
Matias Griese
a4beb9b8bd Fixed UserObject::$authorizeCallable binding to the user object 2021-12-15 18:00:27 +02:00
Matias Griese
484a41e42a Added second parameter to UserObject::isMyself() method 2021-12-15 13:28:03 +02:00
Matias Griese
def62ec2a2 Fixed message about user groups not being cached 2021-12-15 12:48:02 +02:00
Matias Griese
fae431bc39 Composer update 2021-12-14 17:13:55 +02:00
Matias Griese
25bc1edf31 Update Twig optimization to reflect upstream code 2021-12-10 16:20:19 +02:00
Matias Griese
945b90fa46 Changelog update 2021-12-10 12:46:55 +02:00
Matias Griese
420a4e3566 Add comment into TwigEnvironment 2021-12-09 21:18:10 +02:00
Matias Griese
f2a7833933 Restore debug info for flex 2021-12-09 21:12:47 +02:00
Matias Griese
491252476d Fixed Twig being very slow when templates do not exist 2021-12-09 21:09:23 +02:00
Matias Griese
6ed453890d Disabled pretty debug info for Flex as it slows down Twig rendering 2021-12-09 15:45:25 +02:00
Matias Griese
432f0eb9e5 Fixed some deprecation notices in flex 2021-12-09 15:07:37 +02:00
Matias Griese
236c068d70 Improve typehints 2021-12-09 14:06:58 +02:00
dani
3f3503e0f3 Update external.yaml (#3493) 2021-12-08 22:27:38 -07:00
Matias Griese
bc70c9b93c Added session.secure_https to system blueprint 2021-12-08 17:40:30 +02:00
Matias Griese
90f5ff7c74 Use secure session cookies in HTTPS by default (system.session.secure_https: true) 2021-12-08 17:38:16 +02:00
Matias Griese
3bfbb1a4ef Composer 2 checks for minimum PHP version, remove duplicated checks 2021-12-08 15:17:28 +02:00
Matias Griese
1f3f1828c2 Block .json files in web server configs 2021-12-08 15:07:42 +02:00
Matias Griese
6c7064db93 Fix phpstan issues 2021-12-08 14:34:38 +02:00
Matias Griese
9df7b35c65 DomIterator keys were off-by-one 2021-12-08 12:49:13 +02:00
Matias Griese
5552ea2d70 Replace unmaintained DOMIterators by our own versions (fixes PHP 8.1 warnings) 2021-12-08 12:34:54 +02:00
Matias Griese
6079562c90 More minor fixes for PHP 8.1 2021-12-08 10:58:38 +02:00
Matias Griese
a56453cf0a Update clockwork 2021-12-08 10:15:26 +02:00
Matias Griese
c2f394de17 Minor fix 2021-12-07 16:46:42 +02:00
Matias Griese
878de339e5 Improved FileSystem::pathinfoInternal() 2021-12-07 13:56:19 +02:00
Matias Griese
86cfba3bc9 Minor fix 2021-12-07 13:47:35 +02:00
Matias Griese
ad1e20abb7 Fixed phpstan level 4 issues in Framework 2021-12-07 13:34:36 +02:00
Matias Griese
2165743810 Fixed phpstan level 2 issues in Framework 2021-12-07 13:20:57 +02:00
Matias Griese
f3789bb17e Changelog update 2021-12-07 13:14:07 +02:00
Matias Griese
8f2f5e3373 Fixed RequestHandlers NotFoundException having empty request 2021-12-07 13:13:35 +02:00
Matias Griese
70c0dc6419 Improve Framework code 2021-12-07 13:10:19 +02:00
Matias Griese
5b84213fce Improved Framework File classes 2021-12-07 13:08:05 +02:00
Matias Griese
3ad68d6d5a Improve flex classes 2021-12-07 13:03:09 +02:00
Matias Griese
627a1510dc Simplify exception handling for Framework Cache classses 2021-12-07 12:52:42 +02:00
Matias Griese
042d4a4603 Improved ACL classes 2021-12-07 12:50:59 +02:00
Matias Griese
b2cfc4ef5f Fixed bad key lookup in FlexRelatedDirectoryTrait::getCollectionByProperty() 2021-12-07 12:47:09 +02:00
Matias Griese
1c148ab6fb Composer update 2021-12-07 12:43:54 +02:00
Matias Griese
cf6159ffe3 Fixed PHP 8.1 deprecated warning 2021-12-07 12:43:40 +02:00
Matias Griese
f04f13723d Silence PHP 8.1 deprecation notices for Twig 1 2021-12-03 14:52:52 +02:00
Matias Griese
5fd4f5f3eb Composer update 2021-12-03 13:12:25 +02:00
Matias Griese
512c2e5d9d Better typehints for Framework classes 2021-12-02 21:22:10 +02:00
Matias Griese
da3e32f945 PHP 8.1: Use strict parameters in Session class 2021-12-02 15:05:29 +02:00
Matias Griese
ae74f29b69 Minor fixes for Grav updater 2021-12-02 14:32:06 +02:00
Matias Griese
ecb2d31df0 PHP 8.1 2021-12-02 13:52:51 +02:00
Matias Griese
2355d799f2 PHP 8.1 fixes 2021-12-02 12:05:41 +02:00
Matias Griese
589f75b60d Phpstan test updates 2021-12-01 17:03:41 +02:00
Matias Griese
6aebbc2be4 Also Grav::exit() and Grav::redirect() never returns (typehint) 2021-12-01 16:45:45 +02:00
Matias Griese
fb4bce36cb Grav::close() never returns (typehint) 2021-12-01 16:25:39 +02:00
Matias Griese
3321f49253 Interface fixes 2021-12-01 15:46:36 +02:00
Matias Griese
5c6fd0453b Changelog update 2021-12-01 15:02:27 +02:00
Matias Griese
179dec4c3b More phpstan fixes 2021-12-01 14:59:22 +02:00
Matias Griese
d59a4c63db Added translated() method to PageTranslateInterface 2021-12-01 14:57:27 +02:00
Matias Griese
4c3daf6e6f PHP 8.1 return type fixes 2021-11-30 21:20:17 +02:00
Matias Griese
c220b6e0c2 ControllerResponseTrait: Redirect response should be json if the extension is .json 2021-11-30 19:08:49 +02:00
Matias Griese
e4f79dbfce Minor fixes 2021-11-30 19:02:42 +02:00
Matias Griese
d220812f5e Minor code improvements 2021-11-30 18:59:44 +02:00
Matias Griese
d4a23c1fbe Fixed assert 2021-11-30 18:54:03 +02:00
Matias Griese
a57c18f63f Fixed some phpstan errors 2021-11-30 15:26:21 +02:00
Matias Griese
8256af5cfa Fix some phpstan level 2 errors 2021-11-30 14:49:50 +02:00
Matias Griese
eae3668aee Fixed phpstan issue 2021-11-30 14:09:14 +02:00
Matias Griese
8d04330dc5 Upgraded 2021-11-30 13:56:36 +02:00
Matias Griese
b7ab1df4e3 Toolbox update 2021-11-25 21:57:04 +02:00
Matias Griese
664c95e95a Composer update 2021-11-25 11:28:25 +02:00
Matias Griese
a8d292a0d9 Added third $name parameter to Blueprint::flattenData() method, useful for flattening repeating data 2021-11-25 11:07:20 +02:00
Andy Miller
6e9f6e8f7a php 8.1 compatibility 2021-11-17 10:40:38 -07:00
Andy Miller
d0604a055f Merge branch 'feature/php-81' into develop 2021-11-17 10:40:03 -07:00
Matias Griese
193475a0b6 Made Grav::redirect() to accept Route class 2021-11-17 10:49:39 +02:00
Andy Miller
47b444a742 pimple fix 2021-11-16 19:57:34 -07:00
Andy Miller
3c3b44d6de Merge branch 'release/1.7.25' 2021-11-16 10:34:56 -07:00
Andy Miller
88c2b40ec7 Merge tag '1.7.25' into develop
Release v1.7.25
2021-11-16 10:34:56 -07:00
Andy Miller
88ffa163c4 prepare for release 2021-11-16 10:34:46 -07:00
Matias Griese
956ed013cf Improved redirects: send redirect response in JSON if the request was in JSON 2021-11-12 12:08:13 +02:00
Matias Griese
061ebf06c6 Composer update 2021-11-12 11:02:24 +02:00
Matias Griese
e6911ce24a Improved form validation JSON responses to contain list of failed fields with their error messages 2021-11-12 09:36:54 +02:00
Matias Griese
d9c9f6a5eb Fixed form validation exceptions to use 400 Bad Request instead of 500 Internal Server Error 2021-11-12 09:35:26 +02:00
Matias Griese
2a04628459 Added FlexObject::getDiff() to see difference to the saved object 2021-11-11 20:06:24 +02:00
Matias Griese
33b473c290 Fixed FlexObject::getChanges() always returning empty array 2021-11-11 15:48:18 +02:00
Matias Griese
58b48c2f26 Do not escape ValidationException 2021-11-09 19:12:39 +02:00
Matias Griese
ad003a0fc4 Updated phpstan to v1.0 2021-11-04 08:55:53 +02:00
Matias Griese
8f9c417c04 Fixed path traversal vulnerability when using bin/grav server 2021-11-03 14:06:42 +02:00
Matias Griese
8bbf7a849b Fixed |t(variable) twig filter in admin 2021-11-03 13:10:10 +02:00
Matias Griese
a723bcdb46 Fixed unescaped error messages in JSON error responses 2021-11-03 11:50:23 +02:00
Matias Griese
3d0d836d92 Composer update 2021-11-02 15:27:53 +02:00
Andy Miller
67ea6c8066 Merge branch 'develop' of github.com:getgrav/grav into develop
# Conflicts:
#	CHANGELOG.md
2021-10-29 10:53:40 -06:00
Andy Miller
cd1dc5b43d better vardump variable 2021-10-29 10:53:01 -06:00
Matias Griese
1d1c10f0a6 Added method Page::initialize() 2021-10-27 14:59:23 +03:00
Matias Griese
125f2a8662 Improved page cloning 2021-10-27 14:24:16 +03:00
Matias Griese
4046fed60f Changelog update 2021-10-27 14:23:39 +03:00
Andy Miller
78ca2f68cc Merge tag '1.7.24' into develop
Release v1.7.24
2021-10-26 13:45:45 -06:00
Andy Miller
18fcf80b4f Merge branch 'release/1.7.24' 2021-10-26 13:45:44 -06:00
Andy Miller
4db28bf47e prepare for release 2021-10-26 13:45:30 -06:00
Andy Miller
917aa9407d updated vendor libs 2021-10-26 13:44:43 -06:00
Andy Miller
6fc2bc4f91 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-10-26 11:39:19 -06:00
Andy Miller
7dc6b71252 whitespace 2021-10-26 11:39:15 -06:00
Matias Griese
53c7f4c119 Changelog update 2021-10-26 19:25:41 +03:00
Matias Griese
af4243aff2 User authorize() now checks user groups before superuser, allowing deny rules to work 2021-10-26 19:22:56 +03:00
Matias Griese
afc69a3229 Fixed XSS detection with &colon; 2021-10-25 20:37:59 +03:00
Matias Griese
17dfd130b6 Changelog update 2021-10-22 15:08:28 +03:00
Matias Griese
05101650ce Merge remote-tracking branch 'origin/develop' into develop 2021-10-22 15:07:51 +03:00
Matias Griese
715477586c Added support to disable a form, making it readonly 2021-10-22 15:07:42 +03:00
Ricardo Verdugo
fd61f82f5a Watermark Media Action (#3308)
* added gregwar merge media action and watermark media function

* remove the dump left by accident

* added scaling to the watermark

Co-authored-by: Ricardo <ricardo@urbansquid.london>
Co-authored-by: Andy Miller <1084697+rhukster@users.noreply.github.com>
2021-10-21 06:31:33 -06:00
Matias Griese
8b0a6906c7 Composer update 2021-10-20 20:27:11 +03:00
Matias Griese
be44bf0b55 Fixed deprecated warnings on ArrayAccess in PHP 8.1 2021-10-20 18:56:21 +03:00
Matias Griese
d2536379e5 Changelog update (#3464) 2021-10-20 12:31:27 +03:00
Nicolas Busseneau
08d7ad80df fix session_store_active functionality
At the moment and since 1.7.19, the `system.languages.session_store_active`
setting has no effect.

Session must be initialized before URI for `$language->setActiveFromUri($uri)`
(called from `$this->initializeUri($config) -> $uri->init()`) to
properly retrieve / store `active_language` in Session.

This was previously detected in #3269 as per the code comment, but got
reversed in 2e9fe80e33.
2021-10-20 12:24:10 +03:00
Matias Griese
33a5709903 Fixed a bug in PermissionsReader in PHP 7.3 2021-10-20 10:24:00 +03:00
Andreas Becker
280cbc2330 Update LanguageCodes.php (#3469)
Adding 
my - Myanmar Burmese
sw - Swahili
lo - Lao
km - Khmer
2021-10-18 20:59:21 -06:00
Andy Miller
746e75b9e4 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-10-07 08:16:38 -06:00
Andy Miller
11decd5889 Use client now 2021-10-07 08:16:14 -06:00
Matias Griese
be136d3ce4 Added support for custom form field options validation with validate: options: key|ignore 2021-10-07 14:00:17 +03:00
Matias Griese
60fd4ec516 Added UserObject::isMyself() method to check if flex user is currently logged in 2021-10-07 12:49:14 +03:00
Matias Griese
b136480669 Composer update 2021-10-06 10:40:31 +03:00
Andy Miller
07bd1e03d0 Better backwards compatibility 2021-10-01 11:42:41 -06:00
Andy Miller
75ef1341eb Added new HTTP\Client class for more general use 2021-09-30 17:39:49 -06:00
Andy Miller
ed6b60429c Merge branch 'release/1.7.23' 2021-09-29 14:22:22 -06:00
Andy Miller
2edb12bc18 Merge tag '1.7.23' into develop
Release v1.7.23
2021-09-29 14:22:22 -06:00
Andy Miller
5843e226c3 prepare for release 2021-09-29 14:22:03 -06:00
Andy Miller
4fc73fdc35 update to latest dom-sanitizer 2021-09-29 14:20:42 -06:00
Andy Miller
78fbc787a4 Updated vendor libs + changelog 2021-09-29 10:59:20 -06:00
Andy Miller
8af71742a0 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-09-29 10:58:20 -06:00
Andy Miller
22e550820d updated language strings 2021-09-29 10:57:42 -06:00
Matias Griese
372f81a09e Added BlueprintSchema::getNestedRules() method 2021-09-29 08:38:42 +03:00
Matias Griese
22f5ba4bb1 Changelog update 2021-09-24 15:14:34 +03:00
Matias Griese
028e247df8 Fixed form reset causing image uploads to fail when using Flex 2021-09-24 15:09:27 +03:00
Matias Griese
4038c0649c Fixed some phpstan issues (all code level 1, Framework level 3) 2021-09-24 13:28:32 +03:00
Matias Griese
8aee574069 Phpstan fixes 2021-09-24 13:18:26 +03:00
Matias Griese
c220aa746a Phpstan fix for Deferred Twig extension compat mode 2021-09-24 12:26:05 +03:00
Matias Griese
da00dd9eec Further attempt to fix :0 port [#3439] 2021-09-24 12:24:14 +03:00
Matias Griese
30b55ae150 Phpstan fixes 2021-09-24 12:19:41 +03:00
Matias Griese
6b70826961 Add variable-length argument list to GravExtension::translate() 2021-09-24 10:58:05 +03:00
Djamil Legato
ae8dfde69d Added true unique Utils::uniqueId() / {{ unique_id() }}utilities with length, prefix, and suffix support. 2021-09-23 21:40:21 -07:00
Andy Miller
63661a40e3 updated clean command 2021-09-23 19:24:57 -06:00
Andy Miller
b76ee25d49 replaced svg-sanitizer with dom-sanitizer 2021-09-23 19:22:24 -06:00
Andy Miller
3f7c7692ab Merge branch 'develop' of github.com:getgrav/grav into develop 2021-09-23 19:19:08 -06:00
Andy Miller
e34d896278 remove svg-sanitizer 2021-09-23 19:19:02 -06:00
Andy Miller
3e90baef02 only require PHP 7.3 2021-09-23 19:10:15 -06:00
Matias Griese
7ed87f87e0 Use composer 2 in Github workflows 2021-09-23 14:06:26 +03:00
Matias Griese
35af0aa4b0 Changelog update 2021-09-21 13:44:15 +03:00
Matias Griese
370b0674bd Fixed Folder::move() throwing an error when target folder is changed by only appending characters to the end [#3445] 2021-09-21 13:42:18 +03:00
Matias Griese
e0c3e28809 Added method Pages::referrerRoute() to get the referrer route and language 2021-09-20 17:09:32 +03:00
Matias Griese
53302ac082 Changelog update #3411 2021-09-20 15:55:35 +03:00
Matias Griese
9ff605e08b Uri::referrer() docblock update 2021-09-20 15:52:27 +03:00
Matias Griese
5593327dbc Uri::referrer() now accepts third parameter, if set to true, it returns route without base or language code 2021-09-20 15:39:09 +03:00
Matias Griese
31b0510bbd Composer update 2021-09-20 10:18:50 +03:00
Matias Griese
beba9c029d Better Twig 3 support 2021-09-17 15:46:10 +03:00
Matias Griese
243053659c Update to customized version of Twig DeferredExtension, improve Twig 2 compatibility 2021-09-17 15:39:16 +03:00
Andy Miller
f2d30e3680 Merge branch 'release/1.7.22' 2021-09-16 13:49:46 -06:00
Andy Miller
76d881bac1 Merge tag '1.7.22' into develop
Release v1.7.22
2021-09-16 13:49:46 -06:00
Andy Miller
c5fd282653 prepare for release 2021-09-16 13:49:38 -06:00
Matias Griese
d276af6fa9 Register plugin autoloaders into plugin objects 2021-09-16 18:22:09 +03:00
Matias Griese
ba19ce4919 Fixed conflicting $_original variable in Flex Pages 2021-09-15 12:40:06 +03:00
Andy Miller
d86a7a1653 Merge tag '1.7.21' into develop
Release v1.7.21
2021-09-14 12:59:37 -06:00
Andy Miller
f3c82f85c8 Merge branch 'release/1.7.21' 2021-09-14 12:59:36 -06:00
Andy Miller
b17eaba8bf prepare for release 2021-09-14 12:59:29 -06:00
Matias Griese
0600d6a4d8 Merge remote-tracking branch 'origin/develop' into develop 2021-09-14 18:28:16 +03:00
Matias Griese
c51fb1779b Fixed Session::setFlashCookieObject() to use the same options as the main session cookie 2021-09-14 18:28:07 +03:00
Andy Miller
34b7a28fbe update changelog 2021-09-13 17:42:30 -06:00
Andy Miller
a446152631 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-09-13 17:41:08 -06:00
Andy Miller
61c2abee35 use a simple cron text field as custom one was confusing 2021-09-13 17:40:55 -06:00
Andy Miller
c1d520f1cf Add date/time to text file output of scheduler 2021-09-13 17:40:39 -06:00
Matias Griese
3bd9e44155 Remove extra space #3432 2021-09-13 16:51:06 +03:00
Matias Griese
7311517d65 Fixed incorrect port :0 with nginx unix socket setup [#3439] 2021-09-13 12:34:42 +03:00
Matias Griese
4568a197e7 Fixed excessive security.yaml file creation [#3432] 2021-09-13 11:53:12 +03:00
Matias Griese
350134b256 Renamed conflicting $object->getOriginal() to $object->getOriginalData() 2021-09-10 19:09:56 +03:00
Matias Griese
1350cf5675 Added $object->getOriginal() to get flex objects data before it was modified with update() 2021-09-09 14:14:42 +03:00
Matias Griese
21db2e7d4a Added support for flex-required@: not exists and flex-required@: '!exists' in blueprints 2021-09-09 14:14:16 +03:00
Matias Griese
cda08242f1 Added file upload/remove support for Flex Forms 2021-09-08 14:34:15 +03:00
Matias Griese
fc8936986f Cast data.search.options to array 2021-09-07 18:28:36 +03:00
Matias Griese
ec37fd065f Throwing exceptions from Twig templates fires onDisplayErrorPage.[code] event allowing better error pages 2021-09-03 18:39:41 +03:00
Matias Griese
47875a4525 Added route and request to onPageNotFound event 2021-09-03 12:23:48 +03:00
Matias Griese
61adb1e6cf More robust way to check number step [#3433] 2021-09-02 20:34:17 +03:00
Matias Griese
907e46631c Added |yaml filter to convert input to YAML 2021-09-02 20:02:07 +03:00
Matias Griese
aedf8cda47 Changelog update [#3433] 2021-09-02 10:57:10 +03:00
Matias Griese
7a1f5539ed Fixed validation of number type 2021-09-02 10:55:27 +03:00
Matias Griese
49087e9a53 Fixed escaping in PageIndex::getLevelListing() 2021-09-02 10:20:26 +03:00
Andy Miller
a128c7f18d Merge branch 'release/1.7.20' 2021-09-01 10:39:40 -06:00
Andy Miller
c6704d8129 Merge tag '1.7.20' into develop
Release v1.7.20
2021-09-01 10:39:40 -06:00
Andy Miller
c43b375d3b prepare for release 2021-09-01 10:39:23 -06:00
Matias Griese
9523bab910 Merge remote-tracking branch 'origin/develop' into develop 2021-08-31 22:25:15 +03:00
Matias Griese
a8fe62a829 Added support for task and action inside JSON request body 2021-08-31 22:25:02 +03:00
Andy Miller
4708a46ec9 Merge branch 'release/1.7.19' 2021-08-31 13:08:46 -06:00
Andy Miller
7a99aaa53f Merge tag '1.7.19' into develop
Release v1.7.19
2021-08-31 13:08:46 -06:00
Andy Miller
e54e488f80 Merge tag '1.7.19' into develop
Release v1.7.19
2021-08-31 12:21:42 -06:00
Andy Miller
bf471cc3fa Merge branch 'release/1.7.19' 2021-08-31 12:21:42 -06:00
Andy Miller
fd8c44ba90 prepare for release 2021-08-31 12:21:31 -06:00
Matias Griese
f9e7f1c08e Flex: Use str_replace() and not strtr() 2021-08-30 09:55:21 +03:00
Andy Miller
8042caee57 fixed svgImageFunction() 2021-08-27 10:26:00 -06:00
Matias Griese
3f3f63f411 Fixed Flex object types not implementing MediaInterface 2021-08-25 18:50:08 +03:00
Matias Griese
292687ea00 Fixed wrong form issue with flex objects after cache clear 2021-08-25 18:31:58 +03:00
Andy Miller
aa47cb7b97 ignore cli/security.yaml 2021-08-18 14:04:21 -06:00
Djamil Legato
794237bf30 Minor indentation config tweaks 2021-08-18 09:31:15 -07:00
Rotzbua
de3aa16aca add mime for .avif image format
new image format developed by google

references:
https://codelabs.developers.google.com/codelabs/avif#0
https://caniuse.com/avif
2021-08-18 11:19:38 +03:00
Rotzbua
34d001cbef fix typo mime type of .aif (#3423)
mime type should be `audio/aiff`
reference: https://en.wikipedia.org/wiki/Audio_Interchange_File_Format
2021-08-13 10:58:35 -04:00
Andy Miller
21bd51aef9 remove sensio 2021-08-13 09:59:03 -04:00
Matias Griese
f45afd1f54 Added support for multiple mime-types per file extension [#3422] 2021-08-13 13:05:32 +03:00
Matias Griese
c975f894ae Composer update 2021-08-11 09:07:57 +03:00
Matias Griese
a9b59596d8 Fixed flex-options@ in blueprints duplicating items in array 2021-08-10 12:38:07 +03:00
Matias Griese
9333fcc1d6 Generalize FolderStorage templating 2021-08-09 21:38:01 +03:00
Matias Griese
b3426f86a3 Merge remote-tracking branch 'origin/develop' into develop 2021-08-09 19:36:23 +03:00
Matias Griese
b3e9682511 Generalize FolderStorage templating 2021-08-09 19:36:14 +03:00
Rotzbua
b3af6c9920 Change mime-type to text/javascript (#3415)
Recommended by whatwg and draft-ietf-dispatch-javascript-mjs-09 (obsoletes RFC4329)
2021-07-31 14:29:22 -06:00
Matias Griese
2e9fe80e33 Initialize $grav['uri] before session 2021-07-30 09:31:33 +03:00
Matias Griese
def389356e Added UserObject::$authorizeCallable to allow $user->authorize() customization 2021-07-29 23:09:25 +03:00
Matias Griese
c5dfa65994 Fixed FlexDirectoryForm serialization 2021-07-29 22:14:45 +03:00
Matias Griese
c9159695aa Fixed FlexForm serialization 2021-07-29 19:59:42 +03:00
Matias Griese
17d1786e5c Fixed broken Twig try tag when catch has not been defined or is empty 2021-07-29 16:12:14 +03:00
Matias Griese
5437d2db1a Fixed Flex Object missing key field value when using FolderStorage 2021-07-28 14:31:55 +03:00
Matias Griese
e390e9901e Allow customization of security.yaml 2021-07-28 14:29:10 +03:00
Matias Griese
7c946c59f8 Include request in onPageTask and onPageAction events (defaults to null) 2021-07-26 17:27:30 +03:00
Matias Griese
506c74de55 Include active form in onPageTask and onPageAction events (defaults to null) 2021-07-26 14:39:40 +03:00
Matias Griese
ab9783102e Fixed broken environment:// stream when it doesn't have configuration 2021-07-23 21:51:17 +03:00
Matias Griese
a8a8cce25f Fixed GPM not using non-standard cache path [#3410] 2021-07-23 09:39:21 +03:00
Matias Griese
d62e869044 Add changelog [#3398] 2021-07-22 17:17:15 +03:00
Karmalakas
6dd5e0fd20 Change key setting in a loop
#531
2021-07-22 17:13:42 +03:00
Karmalakas
c57a29c23f Add setCurrent() method to Page Collection
#531
2021-07-22 17:13:42 +03:00
Matias Griese
2866a51326 Added meta support for UploadedFile class 2021-07-22 17:01:55 +03:00
Matias Griese
21f5488d3b Make MediaUploadTrait::getUploadSettings() public 2021-07-22 17:00:16 +03:00
Matias Griese
7b1a188cfe Fixed error in loadDirectoryConfig() if configuration hasn't been saved [#3409] 2021-07-22 16:59:42 +03:00
Matias Griese
fdcf7026d2 Changelog for #3408 2021-07-20 10:48:22 +03:00
Andy Miller
b8ada23e2b fixes #3408 2021-07-19 22:35:57 -06:00
Andy Miller
5def813a2e Merge branch 'release/1.7.18' 2021-07-19 12:16:38 -06:00
Andy Miller
551a8251f9 Merge tag '1.7.18' into develop
Release v1.7.18
2021-07-19 12:16:38 -06:00
Andy Miller
951ce6f9f8 prepare for release 2021-07-19 12:15:54 -06:00
Matias Griese
c9448870fa Fixed open_basedir() error with some forms 2021-07-08 14:00:53 +03:00
Andy Miller
1d552ab603 updated changelog 2021-07-06 17:46:08 -06:00
Andy Miller
e39d01e139 Support cloudflare + better x-forwarded-for 2021-07-06 17:44:49 -06:00
Robert Bak
d4805bc709 Fixes issue with Symfony local server detection (#3400)
I was just doing the same thing!
2021-07-06 14:40:12 -06:00
Matias Griese
35db2f61f7 Added method FlexObject::resetBlueprints() 2021-07-06 21:39:14 +03:00
Andy Miller
8af1229f65 qurantine bad SVGs 2021-07-01 15:36:26 -06:00
Matias Griese
9aa6f5b1f7 Fixed Failed to save entry: Forbidden when moving a page to a visible page [#3389] 2021-07-01 14:45:24 +03:00
Matias Griese
da8e374443 Fixed Admin becoming unusable when GPM cannot be reached [#3383] 2021-06-24 17:04:04 +03:00
Matias Griese
95851e8f52 Improve page search to include slug [#3316] 2021-06-24 15:34:14 +03:00
Matias Griese
d2350b6786 Fixed error when using Flex SimpleStorage with no entries 2021-06-23 14:45:56 +03:00
Matias Griese
08a2abb713 Added support for loading Flex Directory configuration from main configuration 2021-06-16 21:35:43 +03:00
Andy Miller
ac62f54aa5 Merge branch 'release/1.7.17' 2021-06-15 13:11:35 -06:00
Andy Miller
fb189a3ce4 Merge tag '1.7.17' into develop
Release v1.7.17
2021-06-15 13:11:35 -06:00
Andy Miller
7e41938317 prepare for release 2021-06-15 13:11:26 -06:00
Andy Miller
d90b28a399 fix jquery in tests 2021-06-15 10:20:57 -06:00
Andy Miller
90f5635478 Switch to JQuery 3.x rather than 2.x 2021-06-15 10:15:12 -06:00
Djamil Legato
acf8724402 Added tests for new params support in collections (#3358) 2021-06-14 16:03:22 -07:00
Djamil Legato
f1c623c14b Fixed mutability issue when adding multiple assets with different params (#3358) 2021-06-14 11:55:14 -07:00
Djamil Legato
ee40ad59f2 Ensure simple second argument for priority is also supported in multi-collections with params (fixes #3358) 2021-06-14 10:25:16 -07:00
Matias Griese
845fac8adf Fixed permission check when moving a page [#3382] 2021-06-10 16:27:30 +03:00
Matias Griese
896695b30f Interface FlexDirectoryInterface now extends FlexAuthorizeInterface 2021-06-10 13:55:12 +03:00
Matias Griese
fbfa88739d Changelog update 2021-06-10 13:19:47 +03:00
Matias Griese
ea191602da Fixed missing styles when CSS/JS Pipeline is used and assets/ folder is missing 2021-06-10 13:16:20 +03:00
Matias Griese
564287eb21 Composer update 2021-06-10 09:23:41 +03:00
Matias Griese
28790197aa File frontmatter.yaml isn't part of media, ignore it 2021-06-08 09:28:30 +03:00
Djamil Legato
1db66fd43d Ported support for multi-parameter assignment in asset collection to method add (fixes #3358) 2021-06-04 11:21:17 -07:00
Djamil Legato
8d506db73c Added support specifying custom attributes to assets in a collection (fixes #3358) 2021-06-03 15:59:01 -07:00
Djamil Legato
c288d4bd0b Allow to unset an asset attribute by specifying null (ie, ’defer’ => null) 2021-06-03 15:51:24 -07:00
Djamil Legato
39247ac7ef Updated blueprints inline-docs for clear_images_by_default 2021-06-02 23:35:04 -07:00
Andy Miller
47b5b10bf4 Merge tag '1.7.16' into develop
Release v1.7.16
2021-06-02 12:23:38 -06:00
Andy Miller
ad1cf15d7c Merge branch 'release/1.7.16' 2021-06-02 12:23:37 -06:00
Andy Miller
6339d9f3cd prepare for release 2021-06-02 12:23:27 -06:00
Andy Miller
fc36a76fc0 updated changelog 2021-06-02 12:22:42 -06:00
phmg701
18d7fd4c7d Adding the addFrame method to ImageMedium (#3323)
* Update ImageMediaTrait.php

Add needed magic actions to enable image frame creation.

* Update ImageMedium.php

Adds addFrame method that can be (recursively) called from Twig.
2021-06-01 16:38:40 -06:00
Djamil Legato
76e44a1043 More regex fixes for URI 2021-06-01 15:16:39 -07:00
Andy Miller
4c0d107562 stupid fix for homebrew PHP 7.4.18+ 2021-06-01 14:25:52 -06:00
Djamil Legato
d359120d81 Fixed SRI trying to calculate remote assets, only ever set integrity for local files. Use the SRI provided by the remote source and manually add it in the addJs/addCss call for remote support. (fixes #3358)
Also Fixed wrong SRI paths invoked when Grav instance as a sub folder
2021-05-27 12:26:25 -07:00
Matias Griese
278671deec Fixed flex pages using wrong type in onBlueprintCreated event [#3157] 2021-05-27 14:18:12 +03:00
Matias Griese
e28360f86a Fixed flex pages search using only folder name [#3316] 2021-05-27 13:17:24 +03:00
Matias Griese
75cef03644 Improve error on bad nested form data [#3364] 2021-05-26 11:43:20 +03:00
Matias Griese
33be6946f7 Fixed the first visible child page getting ordering number 999999. [#3365] 2021-05-26 11:16:31 +03:00
Andy Miller
7f23b088a4 set clear_images_by_default to false by default 2021-05-25 11:27:13 -06:00
Matias Griese
c56f9f3277 Fixed pathinfo() twig filter in PHP 7 2021-05-24 10:01:24 +03:00
Matias Griese
6198d5abf3 Improve Plugin and Theme initialization to fix PHP8 bug [#3368] 2021-05-22 12:28:15 +03:00
Andy Miller
3f8c51cc01 Merge tag '1.7.15' into develop
Release v1.7.15
2021-05-19 13:22:30 -06:00
Andy Miller
b693ed4071 Merge branch 'release/1.7.15' 2021-05-19 13:22:29 -06:00
Andy Miller
5621f5cdb0 prepare for release 2021-05-19 13:22:18 -06:00
Andy Miller
83f2097f40 trim extra line breaks 2021-05-18 21:58:37 -06:00
Matias Griese
879de1d95e Rename property for onOutputGenerated and onOutputRendered events 2021-05-12 14:52:41 +03:00
Matias Griese
ec018f40aa Minor update for onOutputGenerated and onOutputRendered events 2021-05-12 14:51:11 +03:00
Matias Griese
0866753617 Added page and content properties to onOutputGenerated and onOutputRendered events 2021-05-12 14:49:34 +03:00
Matias Griese
5f66f2c4a9 Fixed uploading images into Flex Object if field destination is not set 2021-05-12 10:36:25 +03:00
Matias Griese
40f08a7f8b Flex: Mark uploaded media as uploaded 2021-05-10 20:08:18 +03:00
Matias Griese
c274337fed Minor fix on user avatar upload 2021-05-10 18:03:56 +03:00
Matias Griese
7d01977a89 Fixed missing and commonly used methods when using system.twig.undefined_functions = false 2021-05-10 12:27:11 +03:00
Matias Griese
d058c1d4fc Fixed copying page without changing the slug 2021-05-10 11:43:16 +03:00
Matias Griese
1a28155f1c Update docblocks to return the actual type [#3350] 2021-05-07 13:26:24 +03:00
Matias Griese
7ca7d8e045 Allow optional start date in page collections [#3350] 2021-05-07 13:23:38 +03:00
Thibaut HENIN
ec98ddc2df Improve PageCollectionInterface::dateRange signature and documentation. Report changes into implementations. 2021-05-07 13:19:09 +03:00
Thibaut HENIN
72b520745a Simplify Collection::dateRange (same structure as PageCollection::dateRange) 2021-05-07 13:19:09 +03:00
Thibaut HENIN
9b4f0ca951 Fix dateRange when startDate is not provided (value of 0) 2021-05-07 13:19:09 +03:00
Matias Griese
a761df80db Fixed markdown media operations not working when using image:// stream [#3333] [#3349] 2021-05-07 13:09:34 +03:00
Matias Griese
9059904c1a Fixed fatal error with some markdown links 2021-05-07 11:53:32 +03:00
Matias Griese
568e728d20 Fixed twig deprecated TwigFilter messages [#3348] 2021-05-06 15:02:54 +03:00
Andy Miller
e56d414357 better uploader to allow rebuilds 2021-05-05 15:14:45 -06:00
Andy Miller
668f8ccdbf Merge branch 'release/1.7.14' 2021-04-29 10:22:27 -06:00
Andy Miller
9281be57fc Merge tag '1.7.14' into develop
Release v1.7.14
2021-04-29 10:22:27 -06:00
Andy Miller
d1e58eb95e prepare for release 2021-04-29 10:22:16 -06:00
Matias Griese
9f5a15f00a Updating a theme should always keep the custom files 2021-04-29 15:37:44 +03:00
Matias Griese
3aa47043c9 Added option to set flash folder in FlexForm 2021-04-28 13:58:08 +03:00
Matias Griese
8532db70d2 Merge remote-tracking branch 'origin/develop' into develop 2021-04-28 12:44:33 +03:00
Matias Griese
f8106a48ae Added MediaUploadTrait::checkFileMetadata() method 2021-04-28 12:44:21 +03:00
Ricardo
2813934d21 fix for when no valid link attributes are present 2021-04-26 21:20:19 +01:00
Matias Griese
defb793b0b Hide phpstan deprecation errors on Doctrine Cache 2021-04-26 10:54:39 +03:00
Matias Griese
1fd2162d4f Fixed broken exif_imagetype() twig function, composer update 2021-04-26 10:50:35 +03:00
Matias Griese
094a1bd5ee Changelog update 2021-04-26 09:56:39 +03:00
Matias Griese
2cf7a5f281 Fixed broken numeric language codes in Flex Pages [#2131] 2021-04-26 09:53:21 +03:00
Andy Miller
2ed451130c Merge branch 'release/1.7.13' 2021-04-23 12:55:38 -06:00
Andy Miller
4d1f88627a Merge tag '1.7.13' into develop
Release v1.7.13
2021-04-23 12:55:38 -06:00
Andy Miller
ed7e51480b prepare for release 2021-04-23 12:55:28 -06:00
Matias Griese
3e91be9a4d Added support for getting translated collection of Flex Pages using $collection->withTranslated('de') 2021-04-23 15:14:02 +03:00
Matias Griese
3e9bfad78f Added support for user provided folder in Flex $page->copy() 2021-04-23 15:10:43 +03:00
Matias Griese
fd34fce3c1 Fixed a bug in Flex Object refresh() method 2021-04-22 13:49:11 +03:00
Matias Griese
0cf684300d Fixed text field maxlength validation newline issue [#3324] 2021-04-22 11:44:11 +03:00
Djamil Legato
fe1c808dfd Have folder field for pages blueprints use the new folder-slug filed type 2021-04-20 15:53:51 -07:00
Andy Miller
aa8c67061c typo 2021-04-20 14:47:12 -06:00
Andy Miller
8e8de1eeec minor improvement in XSS invalid_protocol regex - #3298 2021-04-20 14:36:53 -06:00
Djamil Legato
b9fb284a52 Moved gregwar/Image and gregwar/Cache in-house to official getgrav/Image and getgrav/Cache packagist packages. This will help environments with very strict proxy setups that don't allow VCS setup. (fixes #3289) 2021-04-19 23:15:22 -07:00
Matias Griese
5efe447861 Fixed The "Grav/Common/Twig/TwigExtension" extension is not enabled when using markdown twig tag [#3317] 2021-04-19 10:20:26 +03:00
Andy Miller
b9ab491cbb Merge branch 'release/1.7.12' 2021-04-15 12:03:43 -06:00
Andy Miller
fb8d76922a Merge tag '1.7.12' into develop
Release v1.7.12
2021-04-15 12:03:43 -06:00
Andy Miller
1a97986bd2 prepare for release 2021-04-15 12:03:32 -06:00
Matias Griese
a2bb650518 Improve JSON support for the request 2021-04-15 15:28:22 +03:00
Matias Griese
f4398a0867 Fixed adding tags in admin after upgrading Grav [#3315] 2021-04-14 23:13:45 +03:00
Matias Griese
b44a1ce939 Fixed absolute path support for Windows [#3297] 2021-04-14 17:04:40 +03:00
Andy Miller
59fb9b2202 fixed changelog link 2021-04-13 12:44:54 -06:00
Andy Miller
86ba7333ad Merge branch 'release/1.7.11' 2021-04-13 12:27:56 -06:00
Andy Miller
7e7eac0c75 Merge tag '1.7.11' into develop
Release v1.7.11
2021-04-13 12:27:56 -06:00
Andy Miller
ad50017235 prepare for release 2021-04-13 12:27:42 -06:00
Matias Griese
aeb2e3a715 Add back alias for moved class 2021-04-13 21:11:05 +03:00
Matias Griese
3d10282567 Merge remote-tracking branch 'security/advisory-fix-1' into develop 2021-04-13 20:51:21 +03:00
Matias Griese
9e89666a24 Composer update, rename clearcache 2021-04-13 20:41:35 +03:00
Matias Griese
953cf65223 Added some documentation #3297 2021-04-13 12:40:08 +03:00
Matias Griese
371eb76b2b Typo #3297 2021-04-13 12:12:05 +03:00
Matias Griese
75c63704f6 Further improve defined paths #3297 2021-04-13 12:05:01 +03:00
Matias Griese
16dab2c9f1 Redirect /admin/groups to /admin/accounts/groups and blacklist it for admin controller 2021-04-12 18:38:12 +03:00
Matias Griese
7fdaf62684 Restrict filesystem Twig functions to accept only local filesystem and grav streams 2021-04-12 16:07:36 +03:00
Matias Griese
312c11b8da Allow GRAV_WEBROOT to be devined in env, USER_DIR is always under webroot 2021-04-10 11:14:11 +03:00
Matias Griese
2ef4c28401 Added configuration options to allow PHP methods to be used in Twig functions 2021-04-09 21:31:45 +03:00
Matias Griese
27dc8ffb45 Fixed fatal error if system.pages.types is not an array [#2984](https://github.com/getgrav/grav/issues/2984) 2021-04-09 14:45:05 +03:00
Matias Griese
c5296cd7e0 Fixed system.languages.session_store_active not having any effect [#3269] 2021-04-09 13:11:08 +03:00
Matias Griese
029b408915 Fixed fatal error when using markdown links with image:// stream [#3285] 2021-04-09 12:53:05 +03:00
Matias Griese
4fdff81762 Changelog update 2021-04-09 11:40:37 +03:00
Matias Griese
f3e4f9d311 Fixed deleting page with language code not removing the folder if it was the last language [#3305] 2021-04-09 11:13:51 +03:00
Matias Griese
74a667bbef Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	CHANGELOG.md
2021-04-09 10:34:18 +03:00
Matias Griese
7f8263318e Minor code cleanup in Utils 2021-04-09 10:33:32 +03:00
Djamil Legato
e0fc832621 Better GPM detection of unauthorized installations 2021-04-08 21:21:27 -07:00
Matias Griese
34aea14ff9 Fixed nxinx appending repeating ?url= in some redirects 2021-04-08 10:24:55 +03:00
Andy Miller
284d9ea22b Merge branch 'release/1.7.10' 2021-04-06 11:16:10 -06:00
Andy Miller
1e2d86f054 Merge tag '1.7.10' into develop
Releaese 1.7.10
2021-04-06 11:16:10 -06:00
Andy Miller
aa81350b6f prepare for release 2021-04-06 11:16:02 -06:00
pamtbaau
e02d298ff4 Add option images.defaults.size to set default height/width (#3272)
* Add option images.defaults.size to set default height/width

- Add option to config/system.yaml
- Add option to blueprints/config/system.yaml
- Add ImageSizeTrait.php
- Add ImageSizeTrait to ImageMedium.php
- Add Unit tests

* moved width/height to rendering phase

* Add test: height/width should be of resized image.

* Added optional apsect-ratio variable

* more improvements

* Added aspectRatio and retinaScale image functions

* remove use for old trait

* reset the CLS variables after calling reset on the image

Co-authored-by: Andy Miller <rhuk@mac.com>
2021-04-05 11:21:03 -06:00
Matias Griese
67f172b741 Phpstan fixes 2021-03-31 22:11:55 +03:00
Matias Griese
e97fe9de86 Fixed phpstan generics 2021-03-31 22:11:11 +03:00
Matias Griese
770bf15342 Composer update 2021-03-31 22:09:19 +03:00
Matias Griese
38b1556ee0 Fix unit test #2184 2021-03-31 21:29:59 +03:00
Matias Griese
0af33850a6 Fixed incorrect routing if url path looks like a domain name [#2184] 2021-03-31 20:08:39 +03:00
Matias Griese
edafa68414 Revert "Plugin class phpstan fix"
This reverts commit f78debe7
2021-03-31 14:29:50 +03:00
Matias Griese
f78debe768 Plugin class phpstan fix 2021-03-31 14:02:57 +03:00
Matias Griese
4f0f7876a8 Better support absolute GRAV_SYSTEM_PATH [#3297] 2021-03-31 10:26:46 +03:00
Matias Griese
2a4376b7cb Fixed undefined variable (regression) 2021-03-31 08:55:19 +03:00
Andy Miller
1d3d2a0bf9 Merge branch 'develop' of github.com:getgrav/grav into develop
# Conflicts:
#	CHANGELOG.md
2021-03-30 11:53:44 -06:00
Andy Miller
bbddb0a036 system blueprints not getting scanned. Fixes #3296 2021-03-30 11:53:27 -06:00
Matias Griese
a8e6aedd04 Fixed missing onAdminAfterDelete event call in Flex Pages 2021-03-30 19:14:49 +03:00
Matias Griese
1b9fd6276e Added initial support for running Grav library from outside the webroot [#3297] 2021-03-30 16:58:19 +03:00
Matias Griese
e229ab191f Improved password handling when saving a user 2021-03-26 10:53:14 +02:00
Matias Griese
42084ea0cb Fixed UserIndex not implementing UserCollectionInterface 2021-03-23 12:58:11 +02:00
Matias Griese
35468bb417 Minor docblock fix 2021-03-23 10:31:10 +02:00
Matias Griese
9eb20e37c8 Fixed Folder::move() deleting the folder if you move folder into itself, created empty file instead 2021-03-23 10:16:26 +02:00
Matias Griese
fa819064ef Improve move page into itself check 2021-03-23 09:45:31 +02:00
Matias Griese
eb89c00bd5 Fixed PageStorage detecting files as pages 2021-03-23 09:20:21 +02:00
Matias Griese
0491bd1a76 Fixed moving page to itself causing the page folder to be lost (converted to an empty file) 2021-03-23 09:18:43 +02:00
Matias Griese
802ae5b712 Ignore errors when using set_time_limit also in GPM\Response classes [#3023] 2021-03-20 08:48:30 +02:00
Andy Miller
38a393d605 ignore error during set_time_limit in Archiver - fixes #3023 2021-03-19 17:22:50 -06:00
Andy Miller
ba8b91ad29 Merge branch 'release/1.7.9' 2021-03-19 14:14:58 -06:00
Andy Miller
4b88122ab2 Merge tag '1.7.9' into develop
Release 1.7.9
2021-03-19 14:14:58 -06:00
Andy Miller
0a9b0c107f prepare for release 2021-03-19 14:14:50 -06:00
Matias Griese
ff1bc03361 Merge remote-tracking branch 'origin/develop' into develop 2021-03-19 21:56:28 +02:00
Matias Griese
3967862f10 Found the cause of #3280 in Windows 2021-03-19 21:55:56 +02:00
Andy Miller
70ab9b4b1b updated the security email 2021-03-19 11:53:10 -06:00
Matias Griese
50682d73dc Fixed redirects using wrong redirect code 2021-03-19 17:35:55 +02:00
Matias Griese
3926a61528 Fixed the list of pages not showing up in admin [#3280] 2021-03-19 10:31:21 +02:00
Matias Griese
9082cd5b17 Fixed the list of pages not showing up in admin [#3280] 2021-03-19 09:59:15 +02:00
Matias Griese
1c24f9f473 Fixed Flex Page CRUD ACL when creating a new page (needs Flex Objects plugin update) 2021-03-18 16:24:24 +02:00
Matias Griese
0d1c63f0fd Fixed Page::activeChild() throwing an error [#3276] 2021-03-18 11:17:11 +02:00
Matias Griese
29a4c66364 Changelog update for #3266 2021-03-17 22:31:21 +02:00
Matias Griese
73bb1f3046 Merge branch 'develop' of github.com:getgrav/grav into bugfix/redirects-2435
 Conflicts:
	CHANGELOG.md
2021-03-17 22:23:36 +02:00
Matias Griese
86169bbf7c Changelog update 2021-03-17 22:20:35 +02:00
Matias Griese
bde65bf056 Merge remote-tracking branch 'origin/develop' into develop 2021-03-17 22:07:59 +02:00
Matias Griese
0ab7d3ca63 Fixed broken media upload in Flex with @self/path, @page and @theme destinations [#3275] 2021-03-17 22:07:48 +02:00
Matias Griese
644a54e441 Added Utils::getPathFromToken() method which works also with Flex Objects 2021-03-17 21:54:26 +02:00
Matias Griese
62ff25f96d Fixed onAdminSave original page having empty header [#3259] 2021-03-17 21:33:57 +02:00
Djamil Legato
dabb4402a7 Handle skeletons rebuild manually only 2021-03-17 12:27:19 -07:00
Matias Griese
4ae9c42cc6 Composer update 2021-03-17 21:12:15 +02:00
Andy Miller
be3d49163d Merge branch 'release/1.7.8' 2021-03-17 11:44:48 -06:00
Andy Miller
0cf39a07f5 Merge tag '1.7.8' into develop
Release v1.7.8
2021-03-17 11:44:48 -06:00
Andy Miller
8697a79df0 prepare for release 2021-03-17 11:44:31 -06:00
Matias Griese
f5e6a1f3de Fixed onAdminSave original page having empty header [#3259] 2021-03-15 19:12:14 +02:00
Matias Griese
7a0ec5f51c Composer update 2021-03-15 19:07:09 +02:00
Matias Griese
dfcda95642 Fixed Path cannot be empty when viewing non-existent log file [#3270] 2021-03-15 19:06:58 +02:00
Matias Griese
047ae7b033 Fixed Uncaught ValueError: Path cannot be empty when failing to upload a file [#3265] 2021-03-15 19:06:51 +02:00
Matias Griese
fad681430e Composer update 2021-03-15 19:05:33 +02:00
Matias Griese
4f1af3709e Fixed Path cannot be empty when viewing non-existent log file [#3270] 2021-03-15 18:50:28 +02:00
Matias Griese
2681a8196b Fixed Uncaught ValueError: Path cannot be empty when failing to upload a file [#3265] 2021-03-12 12:45:41 +02:00
Matias Griese
25e7f6c5e8 Method $pages->find() should never redirect 2021-03-12 11:45:00 +02:00
Matias Griese
a67a538dfd Fixed site redirect with redirect code failing when redirecting to sub-pages [#3035] 2021-03-11 18:39:18 +02:00
Matias Griese
6dd7044786 Also support language redirects [#3130] 2021-03-11 17:43:04 +02:00
Matias Griese
16eaba1774 Also support system.pages.append_url_extension [#3130] 2021-03-11 17:07:30 +02:00
Matias Griese
054805349c Remove bad redirect code from configuration options, translate 2021-03-11 16:27:31 +02:00
Matias Griese
ec661d2c15 Fixed page.html returning duplicated content with system.pages.redirect_default_route turned on [#3130] 2021-03-11 16:19:57 +02:00
Matias Griese
58533c495c Added full blueprint support and Theme::getFormFieldTypes() just like in plugins 2021-03-11 12:34:37 +02:00
NicoHood
5c1c68c553 Fixed Uri::isValidExtension() returning false positives 2021-03-10 18:38:15 +02:00
NicoHood
a9c01926e8 Fix page extension validation 2021-03-10 15:27:04 +02:00
Matias Griese
8ef52d87f5 Composer update, minor phpstan fix 2021-03-10 15:12:18 +02:00
Matias Griese
35296f9f82 Changelog update 2021-03-10 15:00:11 +02:00
pamtbaau
898759b3b9 Add unit tests for system.images.defaults.loading 2021-03-10 14:58:58 +02:00
pamtbaau
7cbd067daf Fix Markdown image attr. 'loading' 2021-03-10 14:58:58 +02:00
Miguel Sales Pereira
3b6f5353fd Add SRI integrity hash to assets (#3256)
* Added default setting to enable/disable assets SRI

* Added system options to enable/disable assets SRI

* Added integrityHash function to create asset SRI

* Output SRI integrity hash on CSS assets

* Output SRI integrity hash for JS assets

* Updated integrityHash visibility (protected => public)

* Add SRI integrity hash to CSS and JS pipelines

* Made integrityHash static
2021-03-08 10:51:51 -07:00
Matias Griese
47bc6b0411 Fixed disappearing pages on save if pages:// stream resolves to multiple folders where the preferred folder doesn't exist 2021-03-08 18:29:47 +02:00
Matias Griese
b56ff0c31c Improve memory management for flex 2021-03-08 18:28:04 +02:00
Matias Griese
5376ce0909 Fixed FlexIndex::sortBy(['key' => 'ASC']) having no effect 2021-03-05 19:25:11 +02:00
Matias Griese
807df2ac55 Fixed default Flex Pages collection ordering to order by filesystem path 2021-03-05 16:03:28 +02:00
Matias Griese
2727f92a53 Fixed Grav using blueprints and form fields from disabled plugins 2021-03-05 15:08:57 +02:00
Matias Griese
1297114b3e Make sure that variable is defined in PageIndex::getLevelListing() 2021-03-04 17:10:02 +02:00
Matias Griese
1ba35f0bc3 Fixed missing Flex Pages in site if multi-language support has been enabled 2021-03-04 15:12:57 +02:00
Matias Griese
f5a6f51abc Fixed missing method translated() in Flex Pages 2021-03-04 14:34:39 +02:00
Djamil Legato
8431452f73 Update SECURITY.md 2021-03-03 10:52:33 -08:00
Matias Griese
27aff76b20 Optimized saving visible/ordered pages when there are a lot of siblings [#3231] 2021-03-01 14:47:51 +02:00
Matias Griese
e767e00a82 Clearing cache now deletes all clockwork files 2021-02-26 13:47:09 +02:00
Matias Griese
aab17ca79a Reduce memory use in Flex 2021-02-26 12:58:09 +02:00
Matias Griese
94876d1019 Optimized Flex Pages for speed 2021-02-25 22:10:59 +02:00
Matias Griese
7d7726e345 Flex Pages optimizations (part 2) 2021-02-25 21:08:22 +02:00
Matias Griese
d16a65ebd7 Flex Pages optimizations 2021-02-25 17:39:41 +02:00
Matias Griese
e802d0098f Added ControllerResponseTrait::createDownloadResponse() method 2021-02-25 14:03:58 +02:00
Djamil Legato
62fd24bcfb More quietness tests 2021-02-24 16:07:40 -08:00
Djamil Legato
02185145c9 I really do want this silent! 2021-02-24 16:04:40 -08:00
Djamil Legato
4acb0f15ad Try silencing cURL again 2021-02-24 15:36:20 -08:00
Djamil Legato
c8d0b4dd3f Silence curl 2021-02-24 15:34:05 -08:00
Djamil Legato
4802bce06d Trigger develop branches of skeletons instead of master 2021-02-24 15:32:58 -08:00
Djamil Legato
5bec0ee6b6 Typo 2021-02-24 15:29:00 -08:00
Djamil Legato
a938a3a350 Update trigger-skeletons.yml 2021-02-24 15:26:01 -08:00
Djamil Legato
04567817b2 Created workflow to trigger rebuild of all grav skeletons 2021-02-24 15:00:56 -08:00
Andy Miller
061a65f730 Merge branch 'release/1.7.7' 2021-02-23 15:02:18 -07:00
Andy Miller
470894577d Merge tag '1.7.7' into develop
Release 1.7.7
2021-02-23 15:02:18 -07:00
Andy Miller
7db4da4154 prepare for release 2021-02-23 15:02:08 -07:00
Matias Griese
78b5f6ef5c Fixed typo #3233 2021-02-22 18:53:57 +02:00
Matias Griese
340f478bfa Improved Pagination class to allow custom pagination query parameter 2021-02-22 14:51:14 +02:00
Matias Griese
2108af8f36 Added Utils::arrayToQueryParams() to convert an array into query params 2021-02-22 14:49:23 +02:00
Djamil Legato
1728b6c8bf Updated changelog 2021-02-19 13:42:27 -08:00
Djamil Legato
bbfd514342 Removed special space character 2021-02-19 13:41:20 -08:00
Matias Griese
e42ae65355 Fixed avatar of the user not being saved 2021-02-19 11:29:17 +02:00
Andy Miller
a58298bb01 Merge branch 'release/1.7.6' 2021-02-17 11:36:45 -07:00
Andy Miller
0e8e00ddd7 Merge tag '1.7.6' into develop
Release v1.7.6
2021-02-17 11:36:45 -07:00
Andy Miller
e492dfe12c prepare for release 2021-02-17 11:36:35 -07:00
Matias Griese
7f533c7121 Composer update 2021-02-17 20:12:29 +02:00
Matias Griese
7e4c189136 Fixed bug in page content with both markdown and twig enabled [#3223] 2021-02-17 16:07:05 +02:00
Matias Griese
a591b657fa Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	CHANGELOG.md
2021-02-17 11:02:08 +02:00
Matias Griese
7ec8fd2003 Added option for FlexForm constructor to reset the form 2021-02-17 11:01:47 +02:00
Andy Miller
20e22f015a fixed some issues with chinese langs 2021-02-16 18:02:21 -07:00
Andy Miller
cec781ad72 updated changelog 2021-02-16 17:42:35 -07:00
Andy Miller
9faf42c5da updated languages 2021-02-16 17:41:10 -07:00
Andy Miller
bf895820b3 minor composer update 2021-02-16 14:39:23 -07:00
Andy Miller
f4180584d6 updated changelog 2021-02-16 12:53:33 -07:00
Stephan Strate
66c653b6f5 read all language files from theme stream (#3226) 2021-02-16 12:50:51 -07:00
Matias Griese
5f596fb4fd Fixed UserObject after interface change 2021-02-16 21:22:04 +02:00
Matias Griese
a1306d9eb4 Fixed broken attachment image in Flex Objects Admin when destination: self@ used [#3225] 2021-02-16 12:44:30 +02:00
Matias Griese
2195bf2307 Fixed modular content with missing template file ending up using non-modular template [#3218] 2021-02-11 13:43:23 +02:00
Matias Griese
c4296121b1 Reverse subject <-> pattern parameter order in new twig methods 2021-02-11 11:24:30 +02:00
Matias Griese
3871196246 Merge branch 'feature/twig_preg_match_split' of https://github.com/thexmanxyz/grav into thexmanxyz-feature/twig_preg_match_split
# Conflicts:
#	system/src/Grav/Common/Twig/TwigExtension.php
2021-02-11 11:17:14 +02:00
Matias Griese
c626b1599e Fixed root page to always contain trailing slash [#3127] 2021-02-11 10:46:13 +02:00
Matias Griese
129fd7fdad Added Plugins::getPlugins() and Plugins::getPlugin($name) to make it easier to access plugin instances [#2277] 2021-02-11 10:10:50 +02:00
Matias Griese
49fca0da2b Added support for setting session domain [#2040] 2021-02-10 18:46:43 +02:00
Matias Griese
8c00a0bc00 Fixed behavior of opposite filters in Pages::getCollection() to match Grav 1.6 [#3216] 2021-02-10 10:58:17 +02:00
Czcibor Bohusz-Dobosz
45cea4fc4b Fixed removing inclusive filters in getCollection 2021-02-10 10:31:42 +02:00
Andy Miller
13f8b65e08 manually merged new attribute() method #3065 2021-02-09 13:09:31 -07:00
Matias Griese
6ed28c5fb8 Composer update with phpstan fix 2021-02-09 21:56:08 +02:00
Matias Griese
b534fbb364 Changelog update 2021-02-09 21:44:20 +02:00
Tina Burschka
1cfcf1ded0 Flattr requires name instead property. 2021-02-09 21:42:32 +02:00
Matias Griese
87a01bbe0a Fixed trailing slash redirect to use 301 status code [#3127] 2021-02-09 21:36:54 +02:00
Matias Griese
5a9477a402 Only redirect GET/HEAD if system.pages.redirect_trailing_slash is true and request has a trailing slash 2021-02-09 21:23:23 +02:00
Matias Griese
bd97e817c2 Merge branch 'NicoHood-asset_order_fix' into develop 2021-02-09 21:10:15 +02:00
Matias Griese
1fcc049db7 Merge branch 'asset_order_fix' of https://github.com/NicoHood/grav into NicoHood-asset_order_fix 2021-02-09 21:09:48 +02:00
Matias Griese
92fdaed81b Fix for $blueprint->flattenData() on list properties 2021-02-09 20:35:53 +02:00
Matias Griese
feee0e62cc Merge remote-tracking branch 'origin/develop' into develop 2021-02-08 21:27:55 +02:00
Matias Griese
3ee9e65f2d Added second parameter to $blueprint->flattenData() to include every field, including those which have no data 2021-02-08 21:27:47 +02:00
Andy Miller
f004451740 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-02-08 11:45:26 -07:00
Andy Miller
9964285cae Fixed issue with content-security-policy not being properly supported with http-equiv + support single quotes 2021-02-08 11:45:22 -07:00
Matias Griese
6b25a9f00c Fixed wrong values in Admin pages list [#3214] 2021-02-08 18:46:47 +02:00
Matias Griese
99c870c5cc Changelog update 2021-02-08 16:54:56 +02:00
Matias Griese
e520cf949a Fixed save error when editing accounts that have been created with capital letters in their username [#3211] 2021-02-08 16:46:30 +02:00
Matias Griese
96aac79eb2 Fixed broken min/max validation for field type: int 2021-02-08 14:40:51 +02:00
Matias Griese
11d0103f0d Fixed lowering uppercase characters in usernames when saving from frontend [#2565] 2021-02-08 14:21:10 +02:00
Matias Griese
c7dcb9144c Added $grav->getVersion() or grav.version in twig to get the current Grav version [#3142] 2021-02-08 13:47:23 +02:00
Matias Griese
8ea4216672 Added ability to filter enabled or disabled with bin/gpm index [#3187] 2021-02-08 13:40:39 +02:00
Matias Griese
79640283f3 Merge branch 'feature/gpm-index-enhancements' of https://github.com/jgonyea/grav into jgonyea-feature/gpm-index-enhancements 2021-02-08 13:18:10 +02:00
Matias Griese
1347c76594 Fixed error on bin/gpm plugin uninstall [#3207] 2021-02-08 12:51:55 +02:00
Matias Griese
7d95fb7169 Changelog update 2021-02-08 12:43:04 +02:00
Matias Griese
d710205355 Merge branch 'pierrejoye-develop' into develop 2021-02-08 12:41:41 +02:00
Matias Griese
afc5f5a13f Merge branch 'develop' of https://github.com/pierrejoye/grav into pierrejoye-develop 2021-02-08 12:40:49 +02:00
Djamil Legato
d91e91128c Removed Travis tests badge in favor of GitHub Actions 2021-02-07 17:31:58 -08:00
travis00001
3d73e92058 update system blueprint to include Redis Database ID (#3209) 2021-02-07 09:34:10 -08:00
Andy Miller
aa8778a0fb added optional password/database attributes 2021-02-06 14:39:21 -07:00
travis00001
51cc9cd13e Support selecting Redis database ID (#3208) 2021-02-06 13:35:50 -07:00
Matias Griese
c3ebd529c1 Improved session fixation handling in PHP 7.4+ (cookie fix for invalidate) 2021-02-05 21:38:11 +02:00
Matias Griese
322d310843 Improved session fixation handling in PHP 7.4+ (use only one cookie) 2021-02-05 21:28:52 +02:00
Matias Griese
09f5c0ffc1 Improved session fixation handling in PHP 7.4+ (handle unsupported id change) 2021-02-05 20:12:51 +02:00
Matias Griese
7d6ed94e2d Improved session fixation handling in PHP 7.4+ (better version) 2021-02-05 20:07:23 +02:00
Matias Griese
1292f40710 Improved session fixation handling in PHP 7.4+ (cannot fix it in PHP 7.3 due to PHP bug) 2021-02-05 19:44:05 +02:00
Matias Griese
830fa40bb7 Fixed Flex Pages using only default language in frontend 2021-02-05 15:19:47 +02:00
Djamil Legato
25f8b787b6 Oh, don’t mind me… just bringing Grav to 2021! 🎆 2021-02-04 21:09:42 -08:00
Djamil Legato
ca6600bebf Updated COC to Contributor Covenant COC v2 2021-02-04 20:46:32 -08:00
Djamil Legato
100babc11b Updated bundled composer.phar binary to latest version 2.0.9 2021-02-04 20:42:23 -08:00
Matias Griese
ef00b0d14d Added abstract FlexObject, FlexCollection and FlexIndex classes to \Grav\Common\Flex namespace 2021-02-04 13:13:20 +02:00
Andy Miller
359f6c82c5 Merge branch 'develop' of github.com:getgrav/grav into develop
# Conflicts:
#	CHANGELOG.md
2021-02-02 14:37:29 -07:00
Andy Miller
a376c37a91 backup + security CLI commands not styling colors Fixes #3198 2021-02-02 14:36:48 -07:00
Matias Griese
16f610bfdf Working fix for page save failing because of uploaded images [#3191] 2021-02-02 07:54:16 +02:00
Andy Miller
02e41ae7ce Merge tag '1.7.5' into develop
Release v1.7.5
2021-02-01 21:36:24 -07:00
Andy Miller
ae9b096ab0 Merge branch 'release/1.7.5' 2021-02-01 21:36:23 -07:00
Andy Miller
84d0b5e35d prepare for release 2021-02-01 21:36:14 -07:00
Andy Miller
a0fd46edb8 revert #3191 fix - breaking save 2021-02-01 21:35:34 -07:00
Andy Miller
b681a86646 Revert "Fixed page save failing because of uploaded images [#3191]"
This reverts commit 2c866f3c10.

# Conflicts:
#	CHANGELOG.md
2021-02-01 21:33:26 -07:00
Pierre Joye
6c3c068485 add test for multiple parts using folder 2021-02-02 07:27:54 +07:00
Pierre Joye
caf431d22e add faker for multiple parts with folder 2021-02-02 07:27:21 +07:00
Pierre Joye
2044a649ba add another test with subfolder 2021-02-02 07:25:58 +07:00
Andy Miller
7def7af8ff comment out slack 2021-02-01 15:50:16 -07:00
Andy Miller
e85121f35a comment out composer update / validate 2021-02-01 15:48:32 -07:00
Andy Miller
dbfc108fec Merge branch 'release/1.7.4' 2021-02-01 15:35:00 -07:00
Andy Miller
4e01de183f Merge tag '1.7.4' into develop
Release v1.7.4
2021-02-01 15:35:00 -07:00
Andy Miller
e8612833c3 prepare for release 2021-02-01 15:34:50 -07:00
Matias Griese
953b500fa0 Merge remote-tracking branch 'origin/develop' into develop 2021-02-01 19:15:02 +02:00
Matias Griese
1aa15b24a2 Fixed expert mode issue 2021-02-01 19:14:53 +02:00
NicoHood
b6d720791a Set twig autoescaping to true
I think this value get overwritten anyways. Maybe we should remove it completely?
2021-02-01 18:48:47 +02:00
Matias Griese
21c6b56a27 Fixed incorrect config lookup for loading in ImageLoadingTrait [#3192] 2021-02-01 18:11:01 +02:00
Pierre Joye
b20838531c Resolved merge conflict 2021-02-01 22:43:28 +07:00
Matias Griese
2c866f3c10 Fixed page save failing because of uploaded images [#3191] 2021-02-01 16:19:10 +02:00
Matias Griese
3d510a338e Fixed untranslated module pages showing up in the menu 2021-02-01 15:40:54 +02:00
Matias Griese
95c4438091 Fixed page redirect to the first visible child page 2021-02-01 15:24:09 +02:00
Matias Griese
76e887e3fb Fixed wrong ordering in page collections if intl extension has been enabled [#3167] 2021-02-01 14:59:03 +02:00
Matias Griese
72b1a18744 Fixed cache clear on GPM uninstall command [#3172] 2021-02-01 14:44:29 +02:00
Matias Griese
679a27a5ff Updated CleanCommand 2021-02-01 12:16:48 +02:00
Matias Griese
55241864bc Removed fzaninotto/faker library 2021-02-01 11:27:08 +02:00
Matias Griese
a8a960d10b Updated unit tests 2021-02-01 11:14:53 +02:00
Pierre Joye
4ce3ff52bf Add the test translated pages 2021-01-31 07:21:44 +07:00
Pierre Joye
10be5d5a7c fix text if language is found and is part as enabled languages 2021-01-31 07:14:33 +07:00
Pierre Joye
711d7b122d Add fixture for translatedLanguages 2021-01-30 21:22:39 +07:00
Pierre Joye
ea758e9dca Add test for this translatedLanguages 2021-01-30 20:50:20 +07:00
Jeremy Gonyea
ee379a512a Added ability to filter enabled or disabled with bin/gpm index 2021-01-29 23:06:20 -05:00
Andy Miller
ea519c66f2 Switch back to GITHUB_TOKEN for tests 2021-01-29 17:59:42 -07:00
Matias Griese
51bff9f1f0 Simplify GPM class 2021-01-29 13:40:09 +02:00
Matias Griese
aeb9777972 Improved GPM error handling 2021-01-29 11:31:44 +02:00
Matias Griese
3b61aedc66 Composer update 2021-01-29 10:13:29 +02:00
Pierre Joye
cb2c9616d7 Initialize route and raw_route, fix empty route as values 2021-01-29 14:48:20 +07:00
Matias Griese
a35b9b1279 Fixed onBlueprintCreated event being called multiple times in Flex Pages 2021-01-28 20:12:33 +02:00
Karmalakas
0ba23ca278 Fix Lithuanian nativeName (#3141)
That deleted second word literally means _language_, which is completely unnecessary in language choosing context (like for all other languages)
2021-01-26 11:15:34 -07:00
Matias Griese
2a67b5b827 Fixed saving page in expert mode [#3174] 2021-01-26 11:08:43 +02:00
Matias Griese
0918419191 Added FlexForm::setSubmitMethod() to customize form submit action [#3174] 2021-01-26 11:05:33 +02:00
Matias Griese
a4481bfd33 Fixed cannot change image format [#3173] 2021-01-25 15:25:02 +02:00
Matias Griese
fcf24a40e2 Fixed login: visibility_requires_access not working [#3176] 2021-01-25 15:09:49 +02:00
Matias Griese
59a70e0077 Fix phpstan tests for gantry 2021-01-22 20:39:41 +02:00
Matias Griese
5037941897 Fixed bin/gpm uninstall script not working because of bad typehint [#3172] 2021-01-22 20:39:26 +02:00
Matias Griese
3dfbe8e49c Composer update 2021-01-22 12:57:10 +02:00
Matias Griese
1cd34736ed Added Composer SemVer library 2021-01-22 12:56:06 +02:00
Andy Miller
1b6e4d4300 Merge branch 'release/1.7.3' 2021-01-21 15:19:11 -07:00
Andy Miller
b598f8f972 Merge tag '1.7.3' into develop
Release v1.7.3
2021-01-21 15:19:11 -07:00
Andy Miller
7c145c7b1e prepare for release 2021-01-21 15:19:01 -07:00
Matias Griese
38030c348d Fixed installer bugs, reverted GPM config post-install hook for now 2021-01-21 23:45:42 +02:00
Matias Griese
625aa3f1bd Fixed a bug in post-install methods 2021-01-21 23:00:34 +02:00
Andy Miller
8e337647a2 Merge tag '1.7.2' into develop
Release v1.7.2
2021-01-21 11:57:17 -07:00
Andy Miller
7cfc8dc00e Merge branch 'release/1.7.2' 2021-01-21 11:57:16 -07:00
Andy Miller
30195b6c9e prepare for release 2021-01-21 11:57:00 -07:00
Matias Griese
a628cb6775 Typo 2021-01-21 16:21:35 +02:00
Matias Griese
531ce433fe Added support for running post-install scripts in bin/gpm selfupgrade if Grav was updated manually 2021-01-21 16:18:58 +02:00
Matias Griese
849097921a Fixed GPM releases on testing if updating from Grav 1.7 RCs [#3163] 2021-01-21 16:17:04 +02:00
Matias Griese
c8af0d8a38 Fixed Unsupported option "curl" passed to "Symfony\Component\HttpClient\CurlHttpClient" in bin/gpm selfupdate [#3165] 2021-01-21 15:20:27 +02:00
Matias Griese
9a1ab6ee0b Support force in environment:// stream 2021-01-21 14:59:02 +02:00
Matias Griese
04615b3a17 Fixed Clockwork debugger in sub-folder multi-site setups 2021-01-21 14:23:10 +02:00
Matias Griese
70ff5c2e94 Fixed broken stream initialization if environment:// paths aren't streams 2021-01-21 13:52:33 +02:00
Matias Griese
b82d51e3cc Added support for bin/grav install -p myplugin or -t mytheme and hebe.json file support 2021-01-21 12:26:32 +02:00
Andy Miller
4d26acfd66 change testing -> stable in system.yaml 2021-01-20 12:55:20 -07:00
Andy Miller
42f976c82a Merge branch 'release/1.7.1' 2021-01-20 12:03:35 -07:00
Andy Miller
6477d13bea Merge tag '1.7.1' into develop
Release v1.7.1
2021-01-20 12:03:35 -07:00
Andy Miller
ba1e106aaf prepare for release 2021-01-20 12:03:21 -07:00
Andy Miller
5f9fa481cb better getPageFormat() 2021-01-20 10:23:19 -07:00
Matias Griese
84554ae71f Fixed page metadata being double-escaped [#3121] 2021-01-20 18:53:38 +02:00
Matias Griese
5f9c434aea Fixed lighttpd.conf access-deny rule [#1876] 2021-01-20 15:50:07 +02:00
Matias Griese
a0c3140e6d Fixed twig parsing errors in pages where twig is parsed after markdown [#3162] 2021-01-20 15:36:48 +02:00
Matias Griese
440fa263c2 Oops, fixed bug #3160 2021-01-20 15:22:02 +02:00
Matias Griese
f5b10564ca Fixed bin/gpm selfupgrade error on Call to undefined method [#3160] 2021-01-20 14:03:04 +02:00
Matias Griese
eb98597220 Flex Pages: Fixed fatal error when trying to move a page to Root (/) [#3161] 2021-01-20 12:24:40 +02:00
Matias Griese
6992d52767 Fixed bin/gpm selfupgrade failing to report failed Grav update [#3116] 2021-01-20 10:33:11 +02:00
Matias Griese
3a31d54600 Fixed bin/gpm index erroring out [#3158] 2021-01-20 09:58:31 +02:00
Andy Miller
3d5b54515a Fix for non-standard extension via Page::template_format() 2021-01-19 15:21:07 -07:00
Matias Griese
b9f1741ea1 Fixed fatal error when site.taxonomies contains a bad value 2021-01-20 00:05:56 +02:00
Andy Miller
0fa5273c56 Merge tag '1.7.0' into develop
Release v1.7.0
2021-01-19 13:13:22 -07:00
Andy Miller
916b7cfc44 Merge branch 'release/1.7.0' 2021-01-19 13:13:21 -07:00
Andy Miller
317efc182a Prepare for release 2021-01-19 13:13:10 -07:00
Andy Miller
4bcfcfc4f8 Merge tag '1.7.0' into develop
Release v1.7.0
2021-01-19 12:54:16 -07:00
Andy Miller
02b3b9a4d7 Merge branch 'release/1.7.0' 2021-01-19 12:54:16 -07:00
Andy Miller
57d0fc3774 switch to 0.2.3 2021-01-19 12:45:23 -07:00
Andy Miller
2d1bca11df use github secrets token 2021-01-19 12:28:01 -07:00
Andy Miller
ac0de93139 Merge tag '1.7.0' into develop
Release v1.7.0
2021-01-19 12:10:16 -07:00
Andy Miller
9e39860868 Merge branch 'release/1.7.0' 2021-01-19 12:10:15 -07:00
Andy Miller
b13a4d331c Prepare for release 2021-01-19 12:10:05 -07:00
Andy Miller
065cd5b7b7 Prepare for release 2021-01-19 12:08:10 -07:00
Andy Miller
1d34b5389e wrong workflow! 2021-01-19 08:37:10 -07:00
Andy Miller
23df7cc90d Try different token 2021-01-19 08:34:59 -07:00
Andy Miller
c9a5d5a406 Merge branch '1.7' of github.com:getgrav/grav into 1.7 2021-01-19 08:33:46 -07:00
Andy Miller
a5d2c86e59 set token 2021-01-19 08:33:42 -07:00
Andy Miller
f095cc760b fix periods 2021-01-19 08:33:34 -07:00
Matias Griese
c256b0675d Updated README.md, removed UPGRADE-1.7.md 2021-01-19 11:27:14 +02:00
Matias Griese
a7af12d026 Added support for locking the start and limit in a Page Collection 2021-01-19 11:14:55 +02:00
Matias Griese
d7995e9be4 Fixed page collection pagination not behaving as it did in Grav 1.6 2021-01-19 10:48:04 +02:00
Matias Griese
af2f4b66b9 Fixed ERR_TOO_MANY_REDIRECTS with HTTPS = 'On' [#3155] 2021-01-18 20:38:58 +02:00
Matias Griese
15464aa10c Fixed ignore parent in BlueprintSchema 2021-01-18 20:22:08 +02:00
Matias Griese
7cfc02e7d9 Use PHP 7.3 in build 2021-01-18 20:10:13 +02:00
Matias Griese
c6b0a50e4e Composer update 2021-01-18 20:09:50 +02:00
Matias Griese
ac4f093590 Fixed streams in setup.php being overridden by system/streams.yaml [#2450] 2021-01-18 11:20:21 +02:00
Matias Griese
a03746145b Merge branch 'develop' of github.com:getgrav/grav into 1.7 2021-01-15 22:29:49 +02:00
Matias Griese
3a3b84af61 Fixed page collections containing dummy items for untranslated default language [#2985] 2021-01-15 22:21:39 +02:00
Matias Griese
3ba68bf5c5 Fixed multiple issues with system.language.translations: false 2021-01-15 20:36:58 +02:00
NicoHood
42daf75124 Fix documentation for asset array variable 2021-01-15 15:04:10 +01:00
Matias Griese
454e9c1d8e Fixed Flex Pages cache not invalidating if saving an old Page object [#3152] 2021-01-15 15:44:49 +02:00
Nico
ee9fb4aeec Add german translations for GRAV.YES and GRAV.NO 2021-01-15 09:52:29 +02:00
Matias Griese
ba2c224d5d Changelog update 2021-01-14 22:53:26 +02:00
Matias Griese
515eab7dad Fixed ordering when changing parent of new page 2021-01-14 22:43:20 +02:00
Matias Griese
18b0e01a3e Fixed version history issue 2021-01-14 20:50:40 +02:00
Matias Griese
57c6414d1c Fixed PageObject::getRoute() with pages which have no route 2021-01-14 20:49:37 +02:00
Matias Griese
fdfcaaeb39 Merge branch 'develop' of github.com:getgrav/grav into 1.7
 Conflicts:
	system/src/Grav/Common/Processors/ConfigurationProcessor.php
2021-01-14 17:16:27 +02:00
Matias Griese
561b91894c Fixed version history 2021-01-14 17:13:58 +02:00
Andy Miller
aea01a3937 missed a change in regular pages 2021-01-11 16:32:10 -07:00
Andy Miller
9b34178332 Merge branch 'develop' into 1.7
# Conflicts:
#	composer.lock
#	system/defines.php
#	system/src/Grav/Common/Page/Medium/ImageMedium.php
#	system/src/Grav/Common/Page/Page.php
#	system/src/Grav/Common/Twig/TwigExtension.php
2021-01-11 16:29:39 -07:00
Matias Griese
eced8facb8 Merge remote-tracking branch 'origin/1.7' into 1.7 2021-01-12 00:51:52 +02:00
Matias Griese
074e13325e Fixed Inflector methods when translation is missing GRAV.INFLECTOR_* translations 2021-01-12 00:51:43 +02:00
angusmcb
d7378f87c5 Added 'format' to magic actions for images (#3144) 2021-01-11 15:49:37 -07:00
Andy Miller
4091c16e97 don’t use array_support 2021-01-11 15:36:03 -07:00
Andy Miller
56408b37ac Fix for string->array conversion with translations: false admin#1896 2021-01-11 15:10:25 -07:00
Nico
fd18eeb62c Add grav twig extensions to its own evaluate and evaluate_twig filters (#3139)
I wanted to use `evaluate_twig()` with a template the uses `theme_var()` or also a simpler twig function `string`. I made them available with this simple call.
2021-01-11 12:47:43 -07:00
Nico
cbd4ed311f Set twig_first setting to the correct default (#3138)
I've also verified this via code, the correct default is `false`. It is also documented here:
https://learn.getgrav.org/16/basics/grav-configuration#pages
2021-01-11 12:46:37 -07:00
Andy Miller
8122703e3b Initialize pages + themes so email will work 2021-01-11 11:40:43 -07:00
Andy Miller
2920b6143b improve scheduler 2021-01-11 11:30:18 -07:00
Matias Griese
8870463afc Composer update 2021-01-11 10:49:50 +02:00
NicoHood
f8972f812a Fix asset unit test 2021-01-09 22:02:01 +01:00
Matias Griese
23fa2324a8 Minor tweaks on phpstan 2021-01-09 09:58:03 +02:00
Matias Griese
0df1082778 Keep on fixing CLI commands 2021-01-07 12:39:38 +02:00
Matias Griese
6647b8da3c Composer update 2021-01-07 11:59:37 +02:00
Matias Griese
f0b9411e19 Fix Console::addOption() breaking --env and --lang 2021-01-06 20:27:46 +02:00
Matias Griese
5c1cc5cdd7 Changelog update 2021-01-06 19:36:52 +02:00
Matias Griese
df9eb60ffa Remove duplicated --env in yamllinter console command 2021-01-06 19:23:32 +02:00
Matias Griese
9893792768 Improve all console commands 2021-01-06 19:13:19 +02:00
Matias Griese
379033aae4 Further improve CLI commands 2021-01-06 13:45:19 +02:00
Matias Griese
193ab52a35 Better --env support for bin/grav and bin/gpm console commands 2021-01-06 13:11:43 +02:00
Matias Griese
9eb6662db8 Changelog update 2021-01-06 11:12:36 +02:00
Matias Griese
5e48146f59 Simplify QFN 2021-01-05 18:50:28 +02:00
Matias Griese
627702a3a1 Merge remote-tracking branch 'origin/1.7' into 1.7 2021-01-05 12:02:00 +02:00
Matias Griese
d9ee6de3d0 Phpstan phpdoc improvements 2021-01-05 11:59:19 +02:00
Andy Miller
14df5a6d5f updated robots.txt 2021-01-04 13:41:32 -07:00
NicoHood
a809fb8c41 Fix #2781 asset manager pipeline order. Patch taken from @pamtbaau 2021-01-03 13:42:26 +01:00
Andy Miller
2738107b1e composer update for matthiasmullie/minify 2020-12-28 11:04:24 -07:00
Andy Miller
e53f26ca13 composer update for matthiasmullie/minify 2020-12-28 11:03:45 -07:00
thekenshow
d3e80d62e5 Fixed Link to XSS Security Docs (#3115)
* Fixed Link to XSS Security Docs

Was linking to .local server.

* Fixed link reference

Co-authored-by: Djamil Legato <djamil+github@djamil.it>
2020-12-28 08:13:29 -08:00
Andy Miller
b7aa20ed88 vendor updates 2020-12-24 11:33:37 -07:00
Andy Miller
26da4a1aa3 Updated minify library to include calc() fix 2020-12-24 11:32:23 -07:00
Matias Griese
4345a629f1 Added FlexCollection::getDistinctValues() to get all the assigned values from the field 2020-12-23 21:05:58 +02:00
Matias Griese
5bb4ca7822 Fixed Clockwork missing dumped arrays and objects 2020-12-23 21:03:36 +02:00
Matias Griese
79ee06f518 Fixed Clockwork missing dumped arrays and objects 2020-12-23 20:21:55 +02:00
Matias Griese
bc2435efe9 Fixed Flex sorting issues 2020-12-23 19:23:53 +02:00
Matias Griese
504a29f496 Added support for relative paths in PageObject::getLevelListing() [#3110] 2020-12-23 14:09:55 +02:00
Matias Griese
0948e9db9d Fixed Filesystem::normalize() with dot-dot paths 2020-12-23 13:46:49 +02:00
Matias Griese
c298464314 Composer update 2020-12-23 11:44:30 +02:00
Matias Griese
67a00a799c Return value fixes for Session class 2020-12-23 11:40:32 +02:00
Matias Griese
589c9e4445 Enabled ETag setting by default for 304 responses 2020-12-22 18:43:13 +02:00
Matias Griese
d1925c8935 Fixed pages with session messages should never be cached [#3108] 2020-12-22 18:06:28 +02:00
Matias Griese
2923658bb9 Use PHP 7.4 serialization 2020-12-22 15:12:09 +02:00
Matias Griese
c333da60d6 Fixed unserialize Framework\File classes 2020-12-22 15:10:33 +02:00
Matias Griese
cf62db1329 Fixed unserialize in MarkdownFormatter class 2020-12-22 13:53:19 +02:00
Matias Griese
625a39a892 Merge remote-tracking branch 'origin/1.7' into 1.7 2020-12-18 20:53:47 +02:00
Matias Griese
ffc93a77a9 Make it possible to use an absolute path when loading a blueprint 2020-12-18 20:53:38 +02:00
Andy Miller
0cee2b6a97 hide errors with exif 2020-12-17 21:12:15 -07:00
Matias Griese
a24ec2c433 Better fix for system.custom_base_url, which does not affect other urls 2020-12-17 10:02:55 +02:00
Matias Griese
e5727462e7 Fixed port issue with system.custom_base_url 2020-12-16 20:54:56 +02:00
Matias Griese
c1cb4e192f Added support for overriding configuration by using environment variables 2020-12-16 16:38:15 +02:00
Andy Miller
b0c12063a1 should skip release of prerelease 2020-12-15 11:12:54 -07:00
Andy Miller
d4a20c71c2 Merge branch 'release/1.6.31' 2020-12-14 21:28:53 -07:00
Andy Miller
ec68068b97 Merge tag '1.6.31' into develop
Release v1.6.31
2020-12-14 21:28:53 -07:00
Andy Miller
d9c1445542 prepare for release 2020-12-14 21:28:42 -07:00
Djamil Legato
6a4686d17b Update composer first thing 2020-12-10 11:19:27 -08:00
thex
490662152a added twig extension for preg_match and preg_split 2020-01-08 12:19:22 +01:00
603 changed files with 24325 additions and 9799 deletions

View File

@@ -7,11 +7,11 @@ root = true
[*]
charset = utf-8
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
# 2 space indentation
[*.{yaml,yml}]
[*.{yaml,yml,vue,js,css}]
indent_size = 2

View File

@@ -4,20 +4,31 @@ on:
release:
types: [published]
permissions: {}
jobs:
build:
permissions:
contents: write # for release creation (svenstaro/upload-release-action)
if: "!github.event.release.prerelease"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Extract Tag
run: echo "PACKAGE_VERSION=${{ github.ref }}" >> $GITHUB_ENV
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.1
php-version: 7.3
extensions: opcache, gd
tools: composer:v2
coverage: none
env:
COMPOSER_TOKEN: ${{ secrets.GLOBAL_TOKEN }}
- name: Install Dependencies
run: |
@@ -36,15 +47,19 @@ jobs:
run: |
bash ./build-grav.sh
- name: Upload Grav Release Assets
id: upload-release-asset
uses: alexellis/upload-assets@0.2.2
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Upload packages to release
uses: svenstaro/upload-release-action@v2
with:
asset_paths: '["./grav-dist/*.zip"]'
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ env.PACKAGE_VERSION }}
file: ./grav-dist/*.zip
overwrite: true
file_glob: true
slack:
permissions:
actions: read # to list jobs for workflow run (technote-space/workflow-conclusion-action)
name: Slack
needs: build
runs-on: ubuntu-latest
@@ -59,6 +74,6 @@ jobs:
author_name: 'Github Action Build'
text: '🚚 Automated Build Failure'
env:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_TOKEN: ${{ secrets.GLOBAL_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: env.WORKFLOW_CONCLUSION == 'failure'

View File

@@ -2,9 +2,12 @@ name: PHP Tests
on:
push:
branches: [ 1.7 ]
branches: [ develop ]
pull_request:
branches: [ 1.7 ]
branches: [ develop ]
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
@@ -14,7 +17,7 @@ jobs:
strategy:
matrix:
php: [ 8.0, 7.4, 7.3]
php: [8.2, 8.1, 8.0, 7.4, 7.3]
os: [ubuntu-latest]
steps:
@@ -25,10 +28,16 @@ jobs:
with:
php-version: ${{ matrix.php }}
extensions: opcache, gd
tools: composer:v2
coverage: none
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Validate composer.json and composer.lock
run: composer validate
# - name: Update composer
# run: composer update
#
# - name: Validate composer.json and composer.lock
# run: composer validate
- name: Get composer cache directory
id: composer-cache
@@ -47,21 +56,21 @@ jobs:
- name: Run test suite
run: vendor/bin/codecept run
slack:
name: Slack
needs: unit-tests
runs-on: ubuntu-latest
if: always()
steps:
- uses: technote-space/workflow-conclusion-action@v2
- uses: 8398a7/action-slack@v3
with:
status: failure
fields: repo,message,author,action
icon_emoji: ':octocat:'
author_name: 'Github Action Tests (1.7)'
text: '💥 Automated Test Failure'
env:
GITHUB_TOKEN: ${{ github.token }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: env.WORKFLOW_CONCLUSION == 'failure'
# slack:
# name: Slack
# needs: unit-tests
# runs-on: ubuntu-latest
# if: always()
# steps:
# - uses: technote-space/workflow-conclusion-action@v2
# - uses: 8398a7/action-slack@v3
# with:
# status: failure
# fields: repo,message,author,action
# icon_emoji: ':octocat:'
# author_name: 'Github Action Tests'
# text: '💥 Automated Test Failure'
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
# if: env.WORKFLOW_CONCLUSION == 'failure'

48
.github/workflows/trigger-skeletons.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: Trigger Skeletons Build
on:
workflow_dispatch:
inputs:
version:
description: 'Which Grav release to use'
required: true
default: 'latest'
admin:
description: 'Create also a package with Admin'
required: true
default: true
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
build:
runs-on: ubuntu-latest
env:
WORKFLOW: "build-skeleton.yml"
AUTH: ":${{secrets.GLOBAL_TOKEN}}"
steps:
- uses: actions/checkout@v2
- name: Make it rain ☔️
run: |
SKELETONS=`curl -s "${{secrets.SKELETONS_JSON_LIST}}"`
echo "$SKELETONS" | jq -cr '.[]' | while read SKELETON; do
KEY=$(echo "$SKELETON" | jq -cr 'keys[0]')
VERSION=$(echo "$SKELETON" | jq -cr '.[]')
URL="https://api.github.com/repos/${KEY}/actions/workflows/${WORKFLOW}/dispatches"
curl -X POST \
-u "${AUTH}" \
-H "Accept: application/vnd.github.everest-preview+json" \
-H "Content-Type: application/json" \
-sS \
${URL} \
--data '{ "ref": "develop",
"inputs": {
"tag": "'"$VERSION"'",
"version": "'"$INPUT_VERSION"'",
"admin": "'"$INPUT_ADMIN"'"
}
}' > /dev/null
echo "Dispatched Worfklow for ${KEY}@$VERSION"
done

7
.gitignore vendored
View File

@@ -25,8 +25,11 @@ user/plugins/*
!user/plugins/.*
user/themes/*
!user/themes/.*
user/localhost/config/security.yaml
user/config/security.yaml
user/**/config/security.yaml
# Environments
.env
.gravenv
# OS Generated
.DS_Store*

View File

@@ -59,9 +59,9 @@ RewriteRule .* index.php [L]
# Block all direct access for these folders
RewriteRule ^(\.git|cache|bin|logs|backup|webserver-configs|tests)/(.*) error [F]
# Block access to specific file types for these system folders
RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
# Block access to specific file types for these user folders
RewriteRule ^(user)/(.*)\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
RewriteRule ^(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
# Block all direct access to .md files:
RewriteRule \.md$ error [F]
# Block all direct access to files and folders beginning with a dot

View File

@@ -1,3 +1,728 @@
# v1.7.41.1
## 05/10/2023
1. [](#bugfix)
* Fixed certain UTF-8 characters breaking `Truncator` class [#3716](https://github.com/getgrav/grav/issues/3716)
# v1.7.41
## 05/09/2023
1. [](#improved)
* Removed `FILTER_SANITIZE_STRING` input filter in favor of `htmlspecialchars(strip_tags())` for PHP 8.2+
* Added `GRAV_SANITIZE_STRING` constant to replace `FILTER_SANITIZE_STRING` for PHP 8.2+
* Support non-deprecated style dynamic properties in `Parsedown` class via `ParseDownGravTrait` for PHP 8.2+
* Modified `Truncator` to not use deprecated `mb_convert_encoding()` for PHP 8.2+
* Fixed passing null into `mb_strpos()` deprecated for PHP 8.2+
* Updated internal `TwigDeferredExtension` to be PHP 8.2+ compatible
* Upgraded `getgrav/image` fork to take advantage of various PHP 8.2+ fixes
* Use `UserGroupObject::groupNames` method in blueprints for PHP 8.2+
* Comment out `files-upload` deprecated message as this is not going to be removed
* Added various public `Twig` class variables used by admin to address deprecated messages for PHP 8.2+
* Added `parse_url` to list of PHP functions supported in Twig Extension
* Added support for dynamic functions in `Parsedown` to stop deprecation messages in PHP 8.2+
# v1.7.40
## 03/22/2023
1. [](#new)
* Added a new `timestamp: true|false` option for individual assets
1. [](#improved)
* Removed outdated `xcache` setting [#3615](https://github.com/getgrav/grav/pull/3615)
* Updated `robots.txt` [#3625](https://github.com/getgrav/grav/pull/3625)
1. [](#bugfix)
* Fixed `force_ssl` redirect in case of undefined hostname [#3702](https://github.com/getgrav/grav/pull/3702)
* Fixed an issue with duplicate identical page paths
* Fixed `BlueprintSchema:flattenData` to properly handle ignored fields
* Fixed LogViewer regex greediness [#3684](https://github.com/getgrav/grav/pull/3684)
* Fixed `whoami` command [#3695](https://github.com/getgrav/grav/pull/3695)
# v1.7.39.4
## 02/22/2023
1. [](#bugfix)
* Reverted a reorganization of `account.yaml` that caused username to be disabled [admin#2344](https://github.com/getgrav/grav-plugin-admin/issues/2344)
# v1.7.39.3
## 02/21/2023
1. [](#bugfix)
* Fix for overzealous modular page template rendering fix in 1.7.39 causing Feed plugin to break [#3689](https://github.com/getgrav/grav/issues/3689)
# v1.7.39.2
## 02/20/2023
1. [](#bugfix)
* Fix for invalid session breaking Flex Accounts (when switching from Regular to Flex)
# v1.7.39.1
## 02/20/2023
1. [](#bugfix)
* Fix for broken image CSS with the latest version of DebugBar
# v1.7.39
## 02/19/2023
1. [](#improved)
* Vendor library updates to latest versions
1. [](#bugfix)
* Various PHP 8.2 fixes
* Fixed an issue with modular pages rendering thew wrong template when dynamically changing the page
* Fixed an issue with `email` validation that was failing on UTF-8 characters. Following best practices and now only check for `@` and length.
* Fixed PHPUnit tests to remove deprecation warnings
# v1.7.38
## 01/02/2023
1. [](#new)
* New `onBeforeSessionStart()` event to be used to store data lost during session regeneration (e.g. login)
1. [](#improved)
* Vendor library updates to latest versions
* Updated `bin/composer.phar` to latest `2.4.4` version [#3627](https://github.com/getgrav/grav/issues/3627)
1. [](#bugfix)
* Don't fail hard if pages recurse with same path
* Github workflows security hardening [#3624](https://github.com/getgrav/grav/pull/3624)
# v1.7.37.1
## 10/05/2022
1. [](#bugfix)
* Fixed a bad return type [#3630](https://github.com/getgrav/grav/issues/3630)
# v1.7.37
## 10/05/2022
1. [](#new)
* Added new `onPageHeaders()` event to allow for header modification as needed
* Added a `system.pages.dirs` configuration option to allow for configurable paths, and multiple page paths
* Added new `Pages::getSimplePagesHash` which is useful for caching pages specific data
* Updated to latest vendor libraries
1. [](#bugfix)
* An attempt to workaround windows reading locked file issue [getgrav/grav-plugin-admin#2299](https://github.com/getgrav/grav-plugin-admin/issues/2299)
* Force user index file to be updated to fix email addresses [getgrav/grav-plugin-login#229](https://github.com/getgrav/grav-plugin-login/issues/229)
# v1.7.36
## 09/08/2022
1. [](#new)
* Added `authorize-*@:` support for Flex blueprints, e.g. `authorize-disabled@: not delete` disables the field if user does not have access to delete object
* Added support for `flex-ignore@` to hide all the nested fields in the blueprint
1. [](#bugfix)
* Fixed login with a capitalised email address when using old users [getgrav/grav-plugin-login#229](https://github.com/getgrav/grav-plugin-login/issues/229)
# v1.7.35
## 08/04/2022
1. [](#new)
* Added support for `multipart/form-data` content type in PUT and PATCH requests
* Added support for object relationships
* Added variables `$environment` (string), `$request` (PSR-7 ServerRequestInterface|null) and `$uri` (PSR-7 Uri|null) to be used in `setup.php`
1. [](#improved)
* Minor vendor updates
# v1.7.34
## 06/14/2022
1. [](#new)
* Added back Yiddish to Language Codes [#3336](https://github.com/getgrav/grav/pull/3336)
* Ignore upcoming `media.json` file in media
1. [](#bugfix)
* Regression: Fixed saving page with a new language causing cache corruption [getgrav/grav-plugin-admin#2282](https://github.com/getgrav/grav-plugin-admin/issues/2282)
* Fixed a potential fatal error when using watermark in images
* Fixed `bin/grav install` command with arbitrary destination folder name
* Fixed Twig `|filter()` allowing code execution
* Fixed login and user search by email not being case-insensitive when using Flex Users
# v1.7.33
## 04/25/2022
1. [](#improved)
* When saving yaml and markdown, create also a cached version of the file and recompile it in opcache
2. [](#bugfix)
* Fixed missing changes in **yaml** & **markdown** files if saved multiple times during the same second because of a caching issue
* Fixed XSS check not detecting onX events without quotes
* Fixed default collection ordering in pages admin
# v1.7.32
## 03/28/2022
1. [](#new)
* Added `|replace_last(search, replace)` filter
* Added `parseurl` Twig function to expose PHP's `parse_url` function
2. [](#improved)
* Added multi-language support for page routes in `Utils::url()`
* Set default maximum length for text fields
- `password`: 256
- `email`: 320
- `text`, `url`, `hidden`, `commalist`: 2048
- `text` (multiline), `textarea`: 65536
3. [](#bugfix)
* Fixed issue with `system.cache.gzip: true` resulted in "Fetch Failed" for PHP 8.0.17 and PHP 8.1.4 [PHP issue #8218](https://github.com/php/php-src/issues/8218)
* Fix for multi-lang issues with Security Report
* Fixed page search not working with selected language [#3316](https://github.com/getgrav/grav/issues/3316)
# v1.7.31
## 03/14/2022
1. [](#new)
* Added new local Multiavatar (local generation). **This will be default in Grav 1.8**
* Added support to get image size for SVG vector images [#3533](https://github.com/getgrav/grav/pull/3533)
* Added XSS check for uploaded SVG files before they get stored
* Fixed phpstan issues (All level 2, Framework level 5)
2. [](#improved)
* Moved Accounts out of Experimental section of System configuration to new "Accounts" tab
3. [](#bugfix)
* Fixed `'mbstring' extension is not loaded` error, use Polyfill instead [#3504](https://github.com/getgrav/grav/pull/3504)
* Fixed new `Utils::pathinfo()` and `Utils::basename()` being too strict for legacy use [#3542](https://github.com/getgrav/grav/issues/3542)
* Fixed non-standard video html atributes generated by `{{ media.html() }}` [#3540](https://github.com/getgrav/grav/issues/3540)
* Fixed entity sanitization for XSS detection
* Fixed avatar save location when `account://` stream points to custom directory
* Fixed bug in `Utils::url()` when path contains part of root
# v1.7.30
## 02/07/2022
1. [](#new)
* Added twig filter `|field_parent` to get parent field name
2. [](#bugfix)
* Fixed error while deleting retina image in admin
* Fixed "Page Authors" field in Security tab, wrongly loading and saving the value [#3525](https://github.com/getgrav/grav/issues/3525)
* Fixed accounts filter only matches against email address [getgrav/grav-plugin-admin#2224](https://github.com/getgrav/grav-plugin-admin/issues/2224)
# v1.7.29.1
## 01/31/2022
1. [](#bugfix)
* Fixed `Call to undefined method` error when upgrading from Grav 1.6 [#3523](https://github.com/getgrav/grav/issues/3523)
# v1.7.29
## 01/28/2022
1. [](#new)
* Added support for registering assets from `HtmlBlock`
* Added unicode-safe `Utils::basename()` and `Utils::pathinfo()` methods
2. [](#improved)
* Improved `Filesystem::basename()` and `Filesystem::pathinfo()` to be unicode-safe
* Made path handling unicode-safe, use new `Utils::basename()` and `Utils::pathinfo()` everywhere
3. [](#bugfix)
* Fixed error on thumbnail image creation
* Fixed MimeType for `gzip` (`application/x-gzip`)
# v1.7.28
## 01/24/2022
1. [](#new)
* Added links and modules support to `HtmlBlock` class
* Added module support for twig script tag: `{% script module 'theme://js/module.mjs' %}`
* Added twig tag for links: `{% link icon 'theme://images/favicon.png' priority: 20 with { type: 'image/png' } %}`
* Added `HtmlBlock` support for `{% style %}`, `{% script %}` and `{% link %}` tags
* Support for page-level `redirect_default_route` frontmatter header override
3. [](#bugfix)
* Fixed XSS check not detecting escaped `&#58`
# v1.7.27.1
## 01/12/2022
3. [](#bugfix)
* Fixed a typo in CSS Asset pipeline that was erroneously joining files with `;`
# v1.7.27
## 01/12/2022
1. [](#new)
* Support for `YubiKey OTP` 2-Factor authenticator
* Added support for generic `assets.link()` for external references. No pipeline support
* Added support for `assets.addJsModule()` with full pipeline support
* Added `Utils::getExtensionsByMime()` method to get all the registered extensions for the specific mime type
* Added `Media::getRoute()` and `Media::getRawRoute()` methods to get page route if available
* Added `Medium::getAlternatives()` to be able to list all the retina sizes
2. [](#improved)
* Improved `Utils::download()` method to allow overrides on download name, mime and expires header
* Improved `onPageFallBackUrl` event
* Reorganized the Asset system configuration blueprint for clarity
3. [](#bugfix)
* Fixed CLI `--env` and `--lang` options having no effect if they aren't added before all the other options
* Fixed scaled image medium filename when using non-existing retina file
* Fixed an issue with JS `imports` and pipelining Assets
# v1.7.26.1
## 01/04/2022
3. [](#bugfix)
* Fixed `UserObject::getAccess()` after cloning the object
# v1.7.26
## 01/03/2022
1. [](#new)
* Made `Grav::redirect()` to accept `Route` class
* Added `translated()` method to `PageTranslateInterface`
* Added second parameter to `UserObject::isMyself()` method
* Added `UserObject::$isAuthorizedCallable` to allow `$user->isAuthorized()` customization
* Use secure session cookies in HTTPS by default (`system.session.secure_https: true`)
* Added new `Plugin::inheritedConfigOption()` function to access plugin specific functions for page overrides
2. [](#improved)
* Upgraded vendor libs for PHP 8.1 compatibility
* Upgraded to **composer v2.1.14** for PHP 8.1 compatibility
* Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data
* `ControllerResponseTrait`: Redirect response should be json if the extension is .json
* When symlinking Grav install, include also tests
* Updated copyright year to `2022`
3. [](#bugfix)
* Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()`
* Fixed RequestHandlers `NotFoundException` having empty request
* Block `.json` files in web server configs
* Disabled pretty debug info for Flex as it slows down Twig rendering
* Fixed Twig being very slow when template overrides do not exist
* Fixed `UserObject::$authorizeCallable` binding to the user object
* Fixed `FlexIndex::call()` to return null instead of failing to call undefined method
* Fixed Flex directory configuration creating environment configuration when it should not
# v1.7.25
## 11/16/2021
1. [](#new)
* Updated phpstan to v1.0
* Added `FlexObject::getDiff()` to see difference to the saved object
2. [](#improved)
* Use Symfony `dump` instead of PHP's `vardump` in side the `{{ vardump(x) }}` Twig vardump function
* Added `route` and `request` to `onPagesInitialized` event
* Improved page cloning, added method `Page::initialize()`
* Improved `FlexObject::getChanges()`: return changed lists and arrays as whole instead of just changed keys/values
* Improved form validation JSON responses to contain list of failed fields with their error messages
* Improved redirects: send redirect response in JSON if the request was in JSON
3. [](#bugfix)
* Fixed path traversal vulnerability when using `bin/grav server`
* Fixed unescaped error messages in JSON error responses
* Fixed `|t(variable)` twig filter in admin
* Fixed `FlexObject::getChanges()` always returning empty array
* Fixed form validation exceptions to use `400 Bad Request` instead of `500 Internal Server Error`
# v1.7.24
## 10/26/2021
1. [](#new)
* Added support for image watermarks
* Added support to disable a form, making it readonly
2. [](#improved)
* Flex `$user->authorize()` now checks user groups before `admin.super`, allowing deny rules to work properly
3. [](#bugfix)
* Fixed a bug in `PermissionsReader` in PHP 7.3
* Fixed `session_store_active` language option (#3464)
* Fixed deprecated warnings on `ArrayAccess` in PHP 8.1
* Fixed XSS detection with `&colon;`
# v1.7.23
## 09/29/2021
1. [](#new)
* Added method `Pages::referrerRoute()` to get the referrer route and language
* Added true unique `Utils::uniqueId()` / `{{ unique_id() }}` utilities with length, prefix, and suffix support
* Added `UserObject::isMyself()` method to check if flex user is currently logged in
* Added support for custom form field options validation with `validate: options: key|ignore`
2. [](#improved)
* Replaced GPL `SVG-Sanitizer` with MIT licensed `DOM-Sanitizer`
* `Uri::referrer()` now accepts third parameter, if set to `true`, it returns route without base or language code [#3411](https://github.com/getgrav/grav/issues/3411)
* Updated vendor libs with latest
* Updated with latest language strings via Crowdin.com
3. [](#bugfix)
* Fixed `Folder::move()` throwing an error when target folder is changed by only appending characters to the end [#3445](https://github.com/getgrav/grav/issues/3445)
* Fixed some phpstan issues (all code back to level 1, Framework level 3)
* Fixed form reset causing image uploads to fail when using Flex
# v1.7.22
## 09/16/2021
1. [](#new)
* Register plugin autoloaders into plugin objects
2. [](#improved)
* Improve Twig 2 compatibility
* Update to customized version of Twig DeferredExtension (Twig 1/2 compatible)
3. [](#bugfix)
* Fixed conflicting `$_original` variable in `Flex Pages`
# v1.7.21
## 09/14/2021
1. [](#new)
* Added `|yaml` filter to convert input to YAML
* Added `route` and `request` to `onPageNotFound` event
* Added file upload/remove support for `Flex Forms`
* Added support for `flex-required@: not exists` and `flex-required@: '!exists'` in blueprints
* Added `$object->getOriginalData()` to get flex objects data before it was modified with `update()`
* Throwing exceptions from Twig templates fires `onDisplayErrorPage.[code]` event allowing better error pages
2. [](#improved)
* Use a simplified text-based `cron` field for scheduler
* Add timestamp to logging output of scheduler jobs to see when they ran
3. [](#bugfix)
* Fixed escaping in PageIndex::getLevelListing()
* Fixed validation of `number` type [#3433](https://github.com/getgrav/grav/issues/3433)
* Fixed excessive `security.yaml` file creation [#3432](https://github.com/getgrav/grav/issues/3432)
* Fixed incorrect port :0 with nginx unix socket setup [#3439](https://github.com/getgrav/grav/issues/3439)
* Fixed `Session::setFlashCookieObject()` to use the same options as the main session cookie
# v1.7.20
## 09/01/2021
2. [](#improved)
* Added support for `task` and `action` inside JSON request body
# v1.7.19
## 08/31/2021
1. [](#new)
* Include active form and request in `onPageTask` and `onPageAction` events (defaults to `null`)
* Added `UserObject::$authorizeCallable` to allow `$user->authorize()` customization
2. [](#improved)
* Added meta support for `UploadedFile` class
* Added support for multiple mime-types per file extension [#3422](https://github.com/getgrav/grav/issues/3422)
* Added `setCurrent()` method to Page Collection [#3398](https://github.com/getgrav/grav/pull/3398)
* Initialize `$grav['uri']` before session
3. [](#bugfix)
* Fixed `Warning: Undefined array key "SERVER_SOFTWARE" in index.php` [#3408](https://github.com/getgrav/grav/issues/3408)
* Fixed error in `loadDirectoryConfig()` if configuration hasn't been saved [#3409](https://github.com/getgrav/grav/issues/3409)
* Fixed GPM not using non-standard cache path [#3410](https://github.com/getgrav/grav/issues/3410)
* Fixed broken `environment://` stream when it doesn't have configuration
* Fixed `Flex Object` missing key field value when using `FolderStorage`
* Fixed broken Twig try tag when catch has not been defined or is empty
* Fixed `FlexForm` serialization
* Fixed form validation for numeric values in PHP 8
* Fixed `flex-options@` in blueprints duplicating items in array
* Fixed wrong form issue with flex objects after cache clear
* Fixed Flex object types not implementing `MediaInterface`
* Fixed issue with `svgImageFunction()` that was causing broken output
# v1.7.18
## 07/19/2021
1. [](#improved)
* Added support for loading Flex Directory configuration from main configuration
* Move SVGs that cannot be sanitized to quarantine folder under `log://quarantine`
* Added support for CloudFlare-forwarded client IP in the `URI::ip()` method
1. [](#bugfix)
* Fixed error when using Flex `SimpleStorage` with no entries
* Fixed page search to include slug field [#3316](https://github.com/getgrav/grav/issues/3316)
* Fixed Admin becoming unusable when GPM cannot be reached [#3383](https://github.com/getgrav/grav/issues/3383)
* Fixed `Failed to save entry: Forbidden` when moving a page to a visible page [#3389](https://github.com/getgrav/grav/issues/3389)
* Better support for Symfony local server on linux [#3400](https://github.com/getgrav/grav/pull/3400)
* Fixed `open_basedir()` error with some forms
# v1.7.17
## 06/15/2021
1. [](#new)
* Interface `FlexDirectoryInterface` now extends `FlexAuthorizeInterface`
1. [](#improved)
* Allow to unset an asset attribute by specifying null (ie, `'defer': null`)
* Support specifying custom attributes to assets in a collection [Read more](https://learn.getgrav.org/17/themes/asset-manager#collections-with-attributes?target=_blank) [#3358](https://github.com/getgrav/grav/issues/3358)
* File `frontmatter.yaml` isn't part of media, ignore it
* Switched default `JQuery` collection to use 3.x rather than 2.x
1. [](#bugfix)
* Fixed missing styles when CSS/JS Pipeline is used and `asset://` folder is missing
* Fixed permission check when moving a page [#3382](https://github.com/getgrav/grav/issues/3382)
# v1.7.16
## 06/02/2021
1. [](#new)
* Added 'addFrame()' method to ImageMedium [#3323](https://github.com/getgrav/grav/pull/3323)
1. [](#improved)
* Set `cache.clear_images_by_default` to `false` by default
* Improve error on bad nested form data [#3364](https://github.com/getgrav/grav/issues/3364)
1. [](#bugfix)
* Improve Plugin and Theme initialization to fix PHP8 bug [#3368](https://github.com/getgrav/grav/issues/3368)
* Fixed `pathinfo()` twig filter in PHP7
* Fixed the first visible child page getting ordering number `999999.` [#3365](https://github.com/getgrav/grav/issues/3365)
* Fixed flex pages search using only folder name [#3316](https://github.com/getgrav/grav/issues/3316)
* Fixed flex pages using wrong type in `onBlueprintCreated` event [#3157](https://github.com/getgrav/grav/issues/3157)
* Fixed wrong SRI paths invoked when Grav instance as a sub folder [#3358](https://github.com/getgrav/grav/issues/3358)
* Fixed SRI trying to calculate remote assets, only ever set integrity for local files. Use the SRI provided by the remote source and manually add it in the `addJs/addCss` call for remote support. [#3358](https://github.com/getgrav/grav/issues/3358)
* Fix for weird regex issue with latest PHP versions on Intel Macs causing params to not parse properly in URI object
# v1.7.15
## 05/19/2021
1. [](#improved)
* Allow optional start date in page collections [#3350](https://github.com/getgrav/grav/pull/3350)
* Added `page` and `output` properties to `onOutputGenerated` and `onOutputRendered` events
1. [](#bugfix)
* Fixed twig deprecated TwigFilter messages [#3348](https://github.com/getgrav/grav/issues/3348)
* Fixed fatal error with some markdown links [getgrav/grav-premium-issues#95](https://github.com/getgrav/grav-premium-issues/issues/95)
* Fixed markdown media operations not working when using `image://` stream [#3333](https://github.com/getgrav/grav/issues/3333) [#3349](https://github.com/getgrav/grav/issues/3349)
* Fixed copying page without changing the slug [getgrav/grav-plugin-admin#2135](https://github.com/getgrav/grav-plugin-admin/issues/2139)
* Fixed missing and commonly used methods when using `system.twig.undefined_functions = false` [getgrav/grav-plugin-admin#2138](https://github.com/getgrav/grav-plugin-admin/issues/2138)
* Fixed uploading images into Flex Object if field destination is not set
# v1.7.14
## 04/29/2021
1. [](#new)
* Added `MediaUploadTrait::checkFileMetadata()` method
1. [](#improved)
* Updating a theme should always keep the custom files [getgrav/grav-plugin-admin#2135](https://github.com/getgrav/grav-plugin-admin/issues/2135)
1. [](#bugfix)
* Fixed broken numeric language codes in Flex Pages [#3332](https://github.com/getgrav/grav/issues/3332)
* Fixed broken `exif_imagetype()` twig function
# v1.7.13
## 04/23/2021
1. [](#new)
* Added support for getting translated collection of Flex Pages using `$collection->withTranslated('de')`
1. [](#improved)
* Moved `gregwar/Image` and `gregwar/Cache` in-house to official `getgrav/Image` and `getgrav/Cache` packagist packages. This will help environments with very strict proxy setups that don't allow VCS setup. [#3289](https://github.com/getgrav/grav/issues/3289)
* Improved XSS Invalid Protocol detection regex [#3298](https://github.com/getgrav/grav/issues/3298)
* Added support for user provided folder in Flex `$page->copy()`
1. [](#bugfix)
* Fixed `The "Grav/Common/Twig/TwigExtension" extension is not enabled` when using markdown twig tag [#3317](https://github.com/getgrav/grav/issues/3317)
* Fixed text field maxlength validation newline issue [#3324](https://github.com/getgrav/grav/issues/3324)
* Fixed a bug in Flex Object `refresh()` method
# v1.7.12
## 04/15/2021
1. [](#improved)
* Improve JSON support for the request
1. [](#bugfix)
* Fixed absolute path support for Windows [#3297](https://github.com/getgrav/grav/issues/3297)
* Fixed adding tags in admin after upgrading Grav [#3315](https://github.com/getgrav/grav/issues/3315)
# v1.7.11
## 04/13/2021
1. [](#new)
* Added configuration options to allow PHP methods to be used in Twig functions (`system.twig.safe_functions`) and filters (`system.twig.safe_filters`)
* Deprecated using PHP methods in Twig without them being in the safe lists
* Prevent dangerous PHP methods from being used as Twig functions and filters
* Restrict filesystem Twig functions to accept only local filesystem and grav streams
1. [](#improved)
* Better GPM detection of unauthorized installations
1. [](#bugfix)
* **IMPORTANT** Fixed security vulnerability with Twig allowing dangerous PHP functions by default [GHSA-g8r4-p96j-xfxc](https://github.com/getgrav/grav/security/advisories/GHSA-g8r4-p96j-xfxc)
* Fixed nxinx appending repeating `?_url=` in some redirects
* Fixed deleting page with language code not removing the folder if it was the last language [#3305](https://github.com/getgrav/grav/issues/3305)
* Fixed fatal error when using markdown links with `image://` stream [#3285](https://github.com/getgrav/grav/issues/3285)
* Fixed `system.languages.session_store_active` not having any effect [#3269](https://github.com/getgrav/grav/issues/3269)
* Fixed fatal error if `system.pages.types` is not an array [#2984](https://github.com/getgrav/grav/issues/2984)
# v1.7.10
## 04/06/2021
1. [](#new)
* Added initial support for running Grav library from outside the webroot [#3297](https://github.com/getgrav/grav/issues/3297)
1. [](#improved)
* Improved password handling when saving a user
1. [](#bugfix)
* Ignore errors when using `set_time_limit` in `Archiver` and `GPM\Response` classes [#3023](https://github.com/getgrav/grav/issues/3023)
* Fixed `Folder::move()` deleting the folder if you move folder into itself, created empty file instead
* Fixed moving `Flex Page` to itself causing the page to be lost [#3227](https://github.com/getgrav/grav/issues/3227)
* Fixed `PageStorage` from detecting files as pages
* Fixed `UserIndex` not implementing `UserCollectionInterface`
* Fixed missing `onAdminAfterDelete` event call in `Flex Pages`
* Fixed system templates not getting scanned [#3296](https://github.com/getgrav/grav/issues/3296)
* Fixed incorrect routing if url path looks like a domain name [#2184](https://github.com/getgrav/grav/issues/2184)
# v1.7.9
## 03/19/2021
1. [](#new)
* Added `Media::hide()` method to hide files from media
* Added `Utils::getPathFromToken()` method which works also with `Flex Objects`
* Added `FlexMediaTrait::getMediaField()`, which can be used to access custom media set in the blueprint fields
* Added `FlexMediaTrait::getFieldSettings()`, which can be used to get media field settings
1. [](#improved)
* Method `Utils::getPagePathFromToken()` now calls the more generic `Utils::getPathFromToken()`
* Updated `SECURITY.md` to use security@getgrav.org
1. [](#bugfix)
* Fixed broken media upload in `Flex` with `@self/path`, `@page` and `@theme` destinations [#3275](https://github.com/getgrav/grav/issues/3275)
* Fixed media fields excluding newly deleted files before saving the object
* Fixed method `$pages->find()` should never redirect [#3266](https://github.com/getgrav/grav/pull/3266)
* Fixed `Page::activeChild()` throwing an error [#3276](https://github.com/getgrav/grav/issues/3276)
* Fixed `Flex Page` CRUD ACL when creating a new page (needs Flex Objects plugin update) [grav-plugin-flex-objects#115](https://github.com/trilbymedia/grav-plugin-flex-objects/issues/115)
* Fixed the list of pages not showing up in admin [#3280](https://github.com/getgrav/grav/issues/3280)
* Fixed text field min/max validation for UTF8 characters [#3281](https://github.com/getgrav/grav/issues/3281)
* Fixed redirects using wrong redirect code
# v1.7.8
## 03/17/2021
1. [](#new)
* Added `ControllerResponseTrait::createDownloadResponse()` method
* Added full blueprint support to theme if you move existing files in `blueprints/` to `blueprints/pages/` folder [#3255](https://github.com/getgrav/grav/issues/3255)
* Added support for `Theme::getFormFieldTypes()` just like in plugins
1. [](#improved)
* Optimized `Flex Pages` for speed
* Optimized saving visible/ordered pages when there are a lot of siblings [#3231](https://github.com/getgrav/grav/issues/3231)
* Clearing cache now deletes all clockwork files
* Improved `system.pages.redirect_default_route` and `system.pages.redirect_trailing_slash` configuration options to accept redirect code
1. [](#bugfix)
* Fixed clockwork error when clearing cache
* Fixed missing method `translated()` in `Flex Pages`
* Fixed missing `Flex Pages` in site if multi-language support has been enabled
* Fixed Grav using blueprints and form fields from disabled plugins
* Fixed `FlexIndex::sortBy(['key' => 'ASC'])` having no effect
* Fixed default Flex Pages collection ordering to order by filesystem path
* Fixed disappearing pages on save if `pages://` stream resolves to multiple folders where the preferred folder doesn't exist
* Fixed Markdown image attribute `loading` [#3251](https://github.com/getgrav/grav/pull/3251)
* Fixed `Uri::isValidExtension()` returning false positives
* Fixed `page.html` returning duplicated content with `system.pages.redirect_default_route` turned on [#3130](https://github.com/getgrav/grav/issues/3130)
* Fixed site redirect with redirect code failing when redirecting to sub-pages [#3035](https://github.com/getgrav/grav/pull/3035/files)
* Fixed `Uncaught ValueError: Path cannot be empty` when failing to upload a file [#3265](https://github.com/getgrav/grav/issues/3265)
* Fixed `Path cannot be empty` when viewing non-existent log file [#3270](https://github.com/getgrav/grav/issues/3270)
* Fixed `onAdminSave` original page having empty header [#3259](https://github.com/getgrav/grav/issues/3259)
# v1.7.7
## 02/23/2021
1. [](#new)
* Added `Utils::arrayToQueryParams()` to convert an array into query params
1. [](#improved)
* Added original image support for all flex objects and media fields
* Improved `Pagination` class to allow custom pagination query parameter
1. [](#bugfix)
* Fixed avatar of the user not being saved [grav-plugin-flex-objects#111](https://github.com/trilbymedia/grav-plugin-flex-objects/issues/111)
* Replaced special space character with regular space in `system/blueprints/user/account_new.yaml`
# v1.7.6
## 02/17/2021
1. [](#new)
* Added `Medium::attribute()` to pass arbitrary attributes [#3065](https://github.com/getgrav/grav/pull/3065)
* Added `Plugins::getPlugins()` and `Plugins::getPlugin($name)` to make it easier to access plugin instances [#2277](https://github.com/getgrav/grav/pull/2277)
* Added `regex_match` and `regex_split` twig functions [#2788](https://github.com/getgrav/grav/pull/2788)
* Updated all languages from [Crowdin](https://crowdin.com/project/grav-core) - Please update any translations here
1. [](#improved)
* Added abstract `FlexObject`, `FlexCollection` and `FlexIndex` classes to `\Grav\Common\Flex` namespace (extend those instead of Framework or Generic classes)
* Updated bundled `composer.phar` binary to latest version `2.0.9`
* Improved session fixation handling in PHP 7.4+ (cannot fix it in PHP 7.3 due to PHP bug)
* Added optional password/database attributes for redis in `system.yaml`
* Added ability to filter enabled or disabled with bin/gpm index [#3187](https://github.com/getgrav/grav/pull/3187)
* Added `$grav->getVersion()` or `grav.version` in twig to get the current Grav version [#3142](https://github.com/getgrav/grav/issues/3142)
* Added second parameter to `$blueprint->flattenData()` to include every field, including those which have no data
* Added support for setting session domain [#2040](https://github.com/getgrav/grav/pull/2040)
* Better support inheriting languages when using child themes [#3226](https://github.com/getgrav/grav/pull/3226)
* Added option for `FlexForm` constructor to reset the form
1. [](#bugfix)
* Fixed issue with `content-security-policy` not being properly supported with `http-equiv` + support single quotes
* Fixed CLI progressbar in `backup` and `security` commands to use styled output [#3198](https://github.com/getgrav/grav/issues/3198)
* Fixed page save failing because of uploaded images [#3191](https://github.com/getgrav/grav/issues/3191)
* Fixed `Flex Pages` using only default language in frontend [#106](https://github.com/trilbymedia/grav-plugin-flex-objects/issues/106)
* Fixed empty `route()` and `raw_route()` when getting translated pages [#3184](https://github.com/getgrav/grav/pull/3184)
* Fixed error on `bin/gpm plugin uninstall` [#3207](https://github.com/getgrav/grav/issues/3207)
* Fixed broken min/max validation for field `type: int`
* Fixed lowering uppercase characters in usernames when saving from frontend [#2565](https://github.com/getgrav/grav/pull/2565)
* Fixed save error when editing accounts that have been created with capital letters in their username [#3211](https://github.com/getgrav/grav/issues/3211)
* Fixed renaming flex objects key when using file storage
* Fixed wrong values in Admin pages list [#3214](https://github.com/getgrav/grav/issues/3214)
* Fixed pipelined asset using different hash when extra asset is added to before/after position [#2781](https://github.com/getgrav/grav/issues/2781)
* Fixed trailing slash redirect to only apply to GET/HEAD requests and use 301 status code [#3127](https://github.com/getgrav/grav/issues/3127)
* Fixed root page to always contain trailing slash [#3127](https://github.com/getgrav/grav/issues/3127)
* Fixed `<meta name="flattr:*" content="*">` to use name instead property [#3010](https://github.com/getgrav/grav/pull/3010)
* Fixed behavior of opposite filters in `Pages::getCollection()` to match Grav 1.6 [#3216](https://github.com/getgrav/grav/pull/3216)
* Fixed modular content with missing template file ending up using non-modular template [#3218](https://github.com/getgrav/grav/issues/3218)
* Fixed broken attachment image in Flex Objects Admin when `destination: self@` used [#3225](https://github.com/getgrav/grav/issues/3225)
* Fixed bug in page content with both markdown and twig enabled [#3223](https://github.com/getgrav/grav/issues/3223)
# v1.7.5
## 02/01/2021
1. [](#bugfix)
* Revert: Fixed page save failing because of uploaded images [#3191](https://github.com/getgrav/grav/issues/3191) - breaking save
# v1.7.4
## 02/01/2021
1. [](#new)
* Added `FlexForm::setSubmitMethod()` to customize form submit action
1. [](#improved)
* Improved GPM error handling
1. [](#bugfix)
* Fixed `bin/gpm uninstall` script not working because of bad typehint [#3172](https://github.com/getgrav/grav/issues/3172)
* Fixed `login: visibility_requires_access` not working in pages [#3176](https://github.com/getgrav/grav/issues/3176)
* Fixed cannot change image format [#3173](https://github.com/getgrav/grav/issues/3173)
* Fixed saving page in expert mode [#3174](https://github.com/getgrav/grav/issues/3174)
* Fixed exception in `$flexPage->frontmatter()` method when setting value
* Fixed `onBlueprintCreated` event being called multiple times in `Flex Pages` [grav-plugin-flex-objects#97](https://github.com/trilbymedia/grav-plugin-flex-objects/issues/97)
* Fixed wrong ordering in page collections if `intl` extension has been enabled [#3167](https://github.com/getgrav/grav/issues/3167)
* Fixed page redirect to the first visible child page (needs to be routable and published, too)
* Fixed untranslated module pages showing up in the menu
* Fixed page save failing because of uploaded images [#3191](https://github.com/getgrav/grav/issues/3191)
* Fixed incorrect config lookup for loading in `ImageLoadingTrait` [#3192](https://github.com/getgrav/grav/issues/3192)
# v1.7.3
## 01/21/2021
1. [](#improved)
* IMPORTANT - Please [checkout the process](https://getgrav.org/blog/grav-170-cli-self-upgrade-bug) to `self-upgrade` from CLI if you are on **Grav 1.7.0 or 1.7.1**
* Added support for symlinking individual plugins and themes by using `bin/grav install -p myplugin` or `-t mytheme`
* Added support for symlinking plugins and themes with `hebe.json` file to support custom folder structures
* Added support for running post-install scripts in `bin/gpm selfupgrade` if Grav was updated manually
1. [](#bugfix)
* Fixed default GPM Channel back to 'stable' - this was inadvertently left as 'testing' [#3163](https://github.com/getgrav/grav/issues/3163)
* Fixed broken stream initialization if `environment://` paths aren't streams
* Fixed Clockwork debugger in sub-folder multi-site setups
* Fixed `Unsupported option "curl" passed to "Symfony\Component\HttpClient\CurlHttpClient"` in `bin/gpm selfupgrade` [#3165](https://github.com/getgrav/grav/issues/3165)
# v1.7.2
## 01/21/2021
1. [](#improved)
* This release was pulled due to a bug in the installer, 1.7.3 replaces it.
# v1.7.1
## 01/20/2021
1. [](#bugfix)
* Fixed fatal error when `site.taxonomies` contains a bad value
* Sanitize valid Page extensions from `Page::template_format()`
* Fixed `bin/gpm index` erroring out [#3158](https://github.com/getgrav/grav/issues/3158)
* Fixed `bin/gpm selfupgrade` failing to report failed Grav update [#3116](https://github.com/getgrav/grav/issues/3116)
* Fixed `bin/gpm selfupgrade` error on `Call to undefined method` [#3160](https://github.com/getgrav/grav/issues/3160)
* Flex Pages: Fixed fatal error when trying to move a page to Root (/) [#3161](https://github.com/getgrav/grav/issues/3161)
* Fixed twig parsing errors in pages where twig is parsed after markdown [#3162](https://github.com/getgrav/grav/issues/3162)
* Fixed `lighttpd.conf` access-deny rule [#1876](https://github.com/getgrav/grav/issues/1876)
* Fixed page metadata being double-escaped [#3121](https://github.com/getgrav/grav/issues/3121)
# v1.7.0
## 01/19/2021
1. [](#new)
* Requires **PHP 7.3.6**
* Read about this release in the [Grav 1.7 Released](https://getgrav.org/blog/grav-1.7-released) blog post
* Read the full list of all changes in the [Changelog on GitHub](https://github.com/getgrav/grav/blob/1.7.0/CHANGELOG.md)
* Please read [Grav 1.7 Upgrade Guide](https://learn.getgrav.org/17/advanced/grav-development/grav-17-upgrade-guide) before upgrading!
* Added support for overriding configuration by using environment variables
* Use PHP 7.4 serialization (the old `Serializable` methods are now final and cannot be overridden)
* Enabled `ETag` setting by default for 304 responses
* Added `FlexCollection::getDistinctValues()` to get all the assigned values from the field
* `Flex Pages` method `$page->header()` returns `\Grav\Common\Page\Header` object, old `Page` class still returns `stdClass`
1. [](#improved)
* Make it possible to use an absolute path when loading a blueprint
* Make serialize methods final in `ContentBlock`, `AbstractFile`, `FormTrait`, `ObjectCollectionTrait` and `ObjectTrait`
* Added support for relative paths in `PageObject::getLevelListing()` [#3110](https://github.com/getgrav/grav/issues/3110)
* Better `--env` and `--lang` support for `bin/grav`, `bin/gpm` and `bin/plugin` console commands
* **BC BREAK** Shorthand for `--env`: `-e` will not work anymore as it conflicts with some plugins
* Added support for locking the `start` and `limit` in a Page Collection
1. [](#bugfix)
* Fixed port issue with `system.custom_base_url`
* Hide errors with `exif_read_data` in `ImageFile`
* Fixed unserialize in `MarkdownFormatter` and `Framework\File` classes
* Fixed pages with session messages should never be cached [#3108](https://github.com/getgrav/grav/issues/3108)
* Fixed `Filesystem::normalize()` with dot-dot paths
* Fixed Flex sorting issues [grav-plugin-flex-objects#92](https://github.com/trilbymedia/grav-plugin-flex-objects/issues/92)
* Fixed Clockwork missing dumped arrays and objects
* Fixed fatal error in PHP 8 when trying to access root page
* Fixed Array->String conversion error when `languages:translations: false` [admin#1896](https://github.com/getgrav/grav-plugin-admin/issues/1896)
* Fixed `Inflector` methods when translation is missing `GRAV.INFLECTOR_*` translations
* Fixed exception when changing parent of new page [grav-plugin-admin#2018](https://github.com/getgrav/grav-plugin-admin/issues/2018)
* Fixed ordering issue with moving pages [grav-plugin-admin#2015](https://github.com/getgrav/grav-plugin-admin/issues/2015)
* Fixed Flex Pages cache not invalidating if saving an old `Page` object [#3152](https://github.com/getgrav/grav/issues/3152)
* Fixed multiple issues with `system.language.translations: false`
* Fixed page collections containing dummy items for untranslated default language [#2985](https://github.com/getgrav/grav/issues/2985)
* Fixed streams in `setup.php` being overridden by `system/streams.yaml` [#2450](https://github.com/getgrav/grav/issues/2450)
* Fixed `ERR_TOO_MANY_REDIRECTS` with HTTPS = 'On' [#3155](https://github.com/getgrav/grav/issues/3155)
* Fixed page collection pagination not behaving as it did in Grav 1.6
# v1.7.0-rc.20
## 12/15/2020
@@ -47,7 +772,7 @@
* Allow `JsonFormatter` options to be passed as a string
* Hide Flex Pages frontend configuration (not ready for production use)
* Improve Flex configuration: gather views together in blueprint
* Added XSS detection to all forms. See [documentation](http://learn.grav.local/17/forms/forms/form-options#xss-checks)
* Added XSS detection to all forms. See [documentation](https://learn.getgrav.org/17/forms/forms/form-options#xss-checks)
* Better handling of missing repository index [grav-plugin-admin#1916](https://github.com/getgrav/grav-plugin-admin/issues/1916)
* Added support for having all sites / environments under `user/env` folder [#3072](https://github.com/getgrav/grav/issues/3072)
* Added `FlexObject::refresh()` method to make sure object is up to date
@@ -548,7 +1273,7 @@
* Optimization: Combine some early Grav processors into a single one
# v1.6.31
## mm/dd/2020
## 12/14/2020
1. [](#improved)
* Allow all CSS and JS via `robots.txt` [#2006](https://github.com/getgrav/grav/issues/2006) [#3067](https://github.com/getgrav/grav/issues/3067)

View File

@@ -1,46 +1,133 @@
# 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, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible 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.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
Examples of behavior that contributes to a positive environment for our
community 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
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior by participants include:
Examples of unacceptable behavior include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or 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
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
## Enforcement 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.
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
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.
Community leaders 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, and will communicate reasons for moderation
decisions when appropriate.
## 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.
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@getgrav.org. The project team will review and investigate all complaints, and will respond in a way that it deems 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.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[INSERT CONTACT METHOD].
All complaints will be reviewed and investigated promptly and fairly.
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.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2018 Grav
Copyright (c) 2021 Grav
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,20 +1,19 @@
# ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav
[![PHPStan](https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat)](https://github.com/phpstan/phpstan)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad)
[![Discord](https://img.shields.io/discord/501836936584101899.svg?logo=discord&colorB=728ADA&label=Discord%20Chat)](https://chat.getgrav.org)
[![Build Status](https://travis-ci.org/getgrav/grav.svg?branch=develop)](https://travis-ci.org/getgrav/grav) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors)
[![PHP Tests](https://github.com/getgrav/grav/workflows/PHP%20Tests/badge.svg?branch=develop)](https://github.com/getgrav/grav/actions?query=workflow%3A%22PHP+Tests%22) [![OpenCollective](https://opencollective.com/grav/tiers/backers/badge.svg?label=Backers&color=brightgreen)](#backers) [![OpenCollective](https://opencollective.com/grav/tiers/supporters/badge.svg?label=Supporters&color=brightgreen)](#supporters) [![OpenCollective](https://opencollective.com/grav/tiers/sponsors/badge.svg?label=Sponsors&color=brightgreen)](#sponsors)
Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.
The underlying architecture of Grav is designed to use well-established and _best-in-class_ technologies to ensure that Grav is simple to use and easy to extend. Some of these key technologies include:
* [Twig Templating](https://twig.sensiolabs.org/): for powerful control of the user interface
* [Twig Templating](https://twig.symfony.com/): for powerful control of the user interface
* [Markdown](https://en.wikipedia.org/wiki/Markdown): for easy content creation
* [YAML](https://yaml.org): for simple configuration
* [Parsedown](https://parsedown.org/): for fast Markdown and Markdown Extra support
* [Doctrine Cache](https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
* [Pimple Dependency Injection Container](https://pimple.sensiolabs.org/): for extensibility and maintainability
* [Pimple Dependency Injection Container](https://github.com/silexphp/Pimple): for extensibility and maintainability
* [Symfony Event Dispatcher](https://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
* [Symfony Console](https://symfony.com/doc/current/components/console/introduction.html): for CLI interface
* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation
@@ -24,6 +23,10 @@ The underlying architecture of Grav is designed to use well-established and _bes
- PHP 7.3.6 or higher. Check the [required modules list](https://learn.getgrav.org/basics/requirements#php-requirements)
- Check the [Apache](https://learn.getgrav.org/basics/requirements#apache-requirements) or [IIS](https://learn.getgrav.org/basics/requirements#iis-requirements) requirements
# Documentation
The full documentation can be found from [learn.getgrav.org](https://learn.getgrav.org).
# QuickStart
These are the options to get Grav:
@@ -84,6 +87,11 @@ To update plugins and themes:
$ bin/gpm update
```
## Upgrading from older version
* [Upgrading to Grav 1.7](https://learn.getgrav.org/16/advanced/grav-development/grav-17-upgrade-guide)
* [Upgrading to Grav 1.6](https://learn.getgrav.org/16/advanced/grav-development/grav-16-upgrade-guide)
* [Upgrading from Grav <1.6](https://learn.getgrav.org/16/advanced/grav-development/grav-15-upgrade-guide)
# Contributing
We appreciate any contribution to Grav, whether it is related to bugs, grammar, or simply a suggestion or improvement! Please refer to the [Contributing guide](CONTRIBUTING.md) for more guidance on this topic.
@@ -109,12 +117,19 @@ If you discover a possible security issue related to Grav or one of its plugins,
* More [Awesome Grav Stuff](https://github.com/getgrav/awesome-grav)
# Backers
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)]
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav/contribute)]
<img src="https://opencollective.com/grav/tiers/backers.svg?avatarHeight=36&width=600" />
# Supporters
Support Grav with a monthly donation to help us continue development. [[Become a supporter](https://opencollective.com/grav/contribute)]
<img src="https://opencollective.com/grav/tiers/supporters.svg?avatarHeight=36&width=600" />
# Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)]
Support Grav with a yearly donation to help us continue development. [[Become a sponsor](https://opencollective.com/grav/contribute)]
<img src="https://opencollective.com/grav/tiers/sponsors.svg?avatarHeight=36&width=600" />
@@ -128,7 +143,14 @@ See [LICENSE](LICENSE.txt)
# Running Tests
First install the dev dependencies by running `composer update` from the Grav root.
First install the dev dependencies by running `composer install` from the Grav root.
Then `composer test` will run the Unit Tests, which should be always executed successfully on any site.
Windows users should use the `composer test-windows` command.
You can also run a single unit test file, e.g. `composer test tests/unit/Grav/Common/AssetsTest.php`
To run phpstan tests, you should run:
* `composer phpstan` for global tests
* `composer phpstan-framework` for more strict tests
* `composer phpstan-plugins` to test all installed plugins

View File

@@ -7,9 +7,15 @@ We are focusing our security updates on the following versions
| Version | Supported |
| ------- | ------------------ |
| 1.7.x | :white_check_mark: |
| 1.6.x | :white_check_mark: |
| 1.6.x | :warning: |
| < 1.6 | :x: |
## :warning: Versions
Versions with :warning: will be supported for security issues, however you won't be able to update to them, you will need to manually update through the [`direct-install` command](https://learn.getgrav.org/17/admin-panel/tools).
If you cannot update to the latest stable version available because, for example, your server does not meet the minimum PHP requirements, you can manually install a previous version by downloading the package from our Releases directory (https://github.com/getgrav/grav/releases).
## Reporting a Vulnerability
Please contact contact@getgrav.org with a detailed explaination of the security issue found and we will work with you to get it resolved as fast as possible.
Please contact security@getgrav.org with a detailed explaination of the security issue found and we will work with you to get it resolved as fast as possible.

View File

@@ -1,356 +0,0 @@
# UPGRADE FROM 1.6 TO 1.7.RC17
Grav 1.7 REQUIRES PHP 7.3.6
## ADMINISTRATORS
### YAML files
* Please run `bin/grav yamllinter` to find any YAML parsing errors in your site. You should run this command before and after upgrade. Grav falls back to older YAML parser if it detects an error, but it will slow down your site.
## Forms
* **BC BREAK** Fixed `validation: strict`. Please search through all your forms if you were using this feature. If you were, either remove the line or test if the form still works.
* Added configuration option `system.strict_mode.blueprint_compat` to maintain old `validation: strict` behavior
* If you disable compatibiity, form validation will be much more strict (recommended, but may break existing forms)
* DOCUMENT NEW FORM FLASH!
### Pages
* **BC BREAK** Fixed 404 error page when you go to non-routable page with routable child pages under it. Now you get redirected to the first routable child page instead. This is probably what you wanted in the first place. If you do not want this new behavior, you need to **TODO**
### Media
* Support for `webp` image format
* Markdown: Added support for native `loading=lazy` attributes on images. Can be set in `system.images.defaults` or per md image with `?loading=lazy`
* Added ability to `noprocess` specific items only in Link/Image Excerpts, e.g. `http://foo.com/page?id=foo&target=_blank&noprocess=id`
### Multi-language
* Improved language support
* **BC BREAK** Please check that your fallback languages are correct. Old implementation had a fallback to any other language, now only default language is being used unless you use `system.languages.content_fallback` configuration option to override the default behavior.
### Admin
* If you upgrade from older 1.7 RC, you need to go to Flex Objects plugin settings and turn on `Pages`, `User Accounts` and `User Groups` directories (upgrading 1.6 automatically turns them on)
* Disabling `User Accounts` and `User Groups` directories in Flex Objects plugin should be kept enabled; fine tuned **ACL** may not work without
### Sessions
* Session ID now changes on login to prevent session fixation issues
### CLI
* Added new `bin/grav server` CLI command to easily run Symfony or PHP built-in web servers
* Added new `bin/grav page-system-validator [-r|--record] [-c|--check]` CLI command to test Flex Pages
* Improved `Scheduler` cron command check and more useful CLI information
* Added new `-r <job-id>` option for Scheduler CLI command to force-run a job
* Improved `bin/grav yamllinter` CLI command by adding an option to find YAML Linting issues from the whole site or custom folder
### Configuration
* Added new configuration option `system.debugger.provider` to choose between debugbar and clockwork
* Added new configuration option `system.debugger.censored` to hide potentially sensitive information
* Added new configuration option `system.pages.type` to enable Flex Pages
* Added new configuration option `system.languages.include_default_lang_file_extension` to keep default language in `.md` files if set to `false`
* Added new configuration option `system.languages.content_fallback` to set fallback content languages individually for every language
* Added new configuration option `security.sanitize_svg` to remove potentially dangerous code from SVG files
* Added system configuration support for `HTTP_X_Forwarded` headers (host disabled by default)
* Added new configuration option `system.strict_mode.blueprint_compat` to maintain old `validation: strict` behavior
### Debugging
* Added support for [Clockwork](https://underground.works/clockwork) developer tools (now default debugger)
* Added support for [Tideways XHProf](https://github.com/tideways/php-xhprof-extension) PHP Extension for profiling method calls
* Added Twig profiling for Clockwork debugger
## DEVELOPERS
### Use composer autoloader
* Please add `composer.json` file to your plugin and run `composer update --no-dev` (and remember to keep it updated):
composer.json
```json
{
"name": "getgrav/grav-plugin-example",
"type": "grav-plugin",
"description": "Example plugin for Grav CMS",
"keywords": ["example", "plugin"],
"homepage": "https://github.com/getgrav/grav-plugin-example",
"license": "MIT",
"authors": [
{
"name": "...",
"email": "...",
"homepage": "...",
"role": "Developer"
}
],
"support": {
"issues": "https://github.com/getgrav/grav-plugin-example/issues",
"docs": "https://github.com/getgrav/grav-plugin-example/blob/master/README.md"
},
"require": {
"php": ">=7.1.3"
},
"autoload": {
"psr-4": {
"Grav\\Plugin\\Example\\": "classes/",
"Grav\\Plugin\\Console\\": "cli/"
},
"classmap": [
"example.php"
]
},
"config": {
"platform": {
"php": "7.1.3"
}
}
}
```
See [Composer schema](https://getcomposer.org/doc/04-schema.md)
* Please use autoloader instead of `require` in the code:
example.php
```php
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
'onPluginsInitialized' => [
// This is only required in Grav 1.6. Grav 1.7 automatically calls $plugin->autolaod() method.
['autoload', 100000],
]
];
}
/**
* Composer autoload.
*
* @return \Composer\Autoload\ClassLoader
*/
public function autoload(): \Composer\Autoload\ClassLoader
{
return require __DIR__ . '/vendor/autoload.php';
}
```
* Plugins & Themes: Call `$plugin->autoload()` and `$theme->autoload()` automatically when object gets initialized
* Make sure your code does not use `require` or `include` for loading classes
### Plugin/Theme Blueprints (`blueprints.yaml`)
* Please add:
```yaml
slug: folder-name
type: plugin|theme
```
* Make sure you update your dependencies. I recommend setting Grav to either 1.6 or 1.7 and update your code/vendor to PHP 7.1
```yaml
dependencies:
- { name: grav, version: '>=1.6.0' }
```
### Sessions
* Added `Session::regenerateId()` method to properly prevent session fixation issues
### ACL
* `user.authorize()` now requires user to be authorized (passed 2FA check), unless the rule contains `login` in its name.
* Added support for more advanced ACL (CRUD)
* **BC BREAK** `user.authorize()` and Flex `object.isAuthorized()` now have two deny states: `false` and `null`.
Make sure you do not have strict checks against false: `$user->authorize($action) === false` (PHP) or `user.authorize(action) is same as(false)` (Twig).
For the negative checks you should be using `!user->authorize($action)` (PHP) or `not user.authorize(action)` (Twig).
The change has been done to allow strong deny rules by chaining the actions if previous ones do not match: `user.authorize(action1) ?? user.authorize(action2) ?? user.authorize(action3)`.
Note that Twig function `authorize()` will still **keeps** the old behavior!
### Pages
* Added experimental support for `Flex Pages` in the frontend (not recommended to use yet)
* Admin uses `Flex Pages` by default (can be disabled from `Flex-Objects` plugin)
* Added page specific admin permissions support for `Flex Pages`
* Added root page support for `Flex Pages`
* Fixed wrong `Pages::dispatch()` calls (with redirect) when we really meant to call `Pages::find()`
* Added `Pages::getCollection()` method
* Moved `collection()` and `evaluate()` logic from `Page` class into `Pages` class
* **DEPRECATED** `$page->modular()` in favor of `$page->isModule()`
* **DEPRECATED** `PageCollectionInterface::nonModular()` in favor of `PageCollectionInterface::pages()`
* **DEPRECATED** `PageCollectionInterface::modular()` in favor of `PageCollectionInterface::modules()`
* **BC BREAK** Fixed `Page::modular()` and `Page::modularTwig()` returning `null` for folders and other non-initialized pages. Should not affect your code unless you were checking against `false` or `null`.
* **BC BREAK** Always use `\Grav\Common\Page\Interfaces\PageInterface` instead of `\Grav\Common\Page\Page` in method signatures
* Admin now uses `Flex Pages` by default, collection will behave in slightly different way
* **BC BREAK** `$page->topParent()` may return page itself instead of null
### Media
* Added `MediaTrait::freeMedia()` method to free media (and memory)
* Added support for uploading and deleting images directly in `Media` by using PSR-7
* Adjusted asset types to enable extension of assets in class
* **BC BREAK** Media no longer extends `Getters`, accessing `$media->$filename` no longer works, use `$media[$filename]` instead!
### Markdown
* **BC BREAK** Upgraded Parsedown to 1.7 for Parsedown-Extra 0.8. Plugins that extend Parsedown may need a fix to render as HTML
* Added new `Excerpts::processLinkHtml()` method
### Users
* Added experimental support for `Flex Users` in the frontend (not recommended to use yet)
* Admin uses `Flex Users` by default (can be disabled from `Flex-Objects` plugin)
* Improved `Flex Users`: obey blueprints and allow Flex to be used in admin only
* Improved `Flex Users`: user and group ACL now supports deny permissions
* Changed `UserInterface::authorize()` to return `null` having the same meaning as `false` if access is denied because of no matching rule
* **DEPRECATED** `\Grav\Common\User\Group` in favor of `$grav['user_groups']`, which contains Flex UserGroup collection
* **BC BREAK** Always use `\Grav\Common\User\Interfaces\UserInterface` instead of `\Grav\Common\User\User` in method signatures
### Flex
* Do not use `Framework` Flex classes directly, it's better to use or extend classes under `Grav\Common\Flex\Types\Generic` namespace
* Added `$grav['flex']` to access all registered Flex Directories
* Added `FlexRegisterEvent` which triggers when `$grav['flex']` is being accessed the first time
* Added `hasFlexFeature()` method to test if `FlexObject` or `FlexCollection` implements a given feature
* Added `getFlexFeatures()` method to return all features that `FlexObject` or `FlexCollection` implements
* Added `FlexStorage::getMetaData()` to get updated object meta information for listed keys
* `FlexDirectory::getObject()` can now be called without any parameters to create a new object
* Flex Directory: Implemented customizable configuration per flex type
* **DEPRECATED** `FlexDirectory::update()` and `FlexDirectory::remove()`
* **BC BREAK** Moved all Flex type classes under `Grav\Common\Flex`
* **BC BREAK** `FlexStorageInterface::getStoragePath()` and `getMediaPath()` can now return null
* **BC BREAK** `FlexStorageIngerface::getMetaData()` now has second optional argument
* **BC BREAK** Flex objects no longer return temporary key if they do not have one; empty key is returned instead
* **BC BREAK** Added reload argument to `FlexStorageInterface::getMetaData()`
* You can add `edit_list.html.twig` file to a form field in order to customize look in the listing view
### Templating
* Added support for Twig 2.12 (using Twig 1.43)
* Added a new `{% cache %}` Twig tag eliminating need for `twigcache` extension.
* Added `array_diff()` twig function
* Added `template_from_string()` twig function
* Added a new `svg_image()` twig function to make it easier to 'include' SVG source in Twig
* Improved `url()` twig function to take third parameter (`true`) to return URL on non-existing file instead of returning false
* Improved `|array` twig filter to work with iterators and objects with `toArray()` method
* Improved `authorize()` twig function to work better with nested rule parameters
* Improved `|yaml_serialize` twig filter: added support for `JsonSerializable` objects and other array-like objects
* Added `themes` to cached blueprints and configuration
* Added default templates for `external.html.twig`, `default.html.twig`, and `modular.html.twig`
### Multi-language
* Improved language support for `Route` class
* Translations: rename MODULAR to MODULE everywhere
* Added `Language::getPageExtensions()` to get full list of supported page language extensions
* **BC BREAK** Fixed `Language::getFallbackPageExtensions()` to fall back only to default language instead of going through all languages
### Blueprints
* Added `flatten_array` filter to form field validation
* Added support for `security@: or: [admin.super, admin.pages]` in blueprints (nested AND/OR mode support)
* Blueprint validation: Added `validate: value_type: bool|int|float|string|trim` to `array` to filter all the values inside the array
* If your plugins has blueprints folder, initializing it in the event will be too late. Do this instead:
```php
class MyPlugin extends Plugin
{
/** @var array */
public $features = [
'blueprints' => 0, // Use priority 0
];
}
```
### Events
* Use `Symfony EventDispatcher` directly instead of `rockettheme/toolbox` wrapper.
* Added `$grav->dispatchEvent()` method for PSR-14 events
* Added `PluginsLoadedEvent` which triggers after plugins have been loaded but not yet initialized
* Added `SessionStartEvent` which triggers when session is started
* Added `FlexRegisterEvent` which triggers when `$grav['flex']` is being accessed the first time
* Added `PermissionsRegisterEvent` which triggers when `$grav['permissions']` is being accessed the first time
* Added `onAfterCacheClear` event
* Check `onAdminTwigTemplatePaths` event, it should NOT be:
```php
public function onAdminTwigTemplatePaths($event)
{
// This code breaks all the other plugins in admin, including Flex Objects
$event['paths'] = [__DIR__ . '/admin/themes/grav/templates'];
}
```
but:
```php
public function onAdminTwigTemplatePaths($event)
{
// Add plugin template path for admin.
$paths = $event['paths'];
$paths[] = __DIR__ . '/admin/themes/grav/templates';
$event['paths'] = $paths;
}
```
### Misc
* Added `Utils::isAssoc()` and `Utils::isNegative()` helper methods
* Added `Utils::simpleTemplate()` method for very simple variable templating
* Added `Utils::fullPath()` to get the full path to a file be it stream, relative, etc.
* Support customizable null character replacement in `CSVFormatter::decode()`
* Added new `Security::sanitizeSVG()` function
* Added `$grav->close()` method to properly terminate the request with a response
* Added `Folder::countChildren()` method to determine if a folder has child folders
* Support symlinks when saving `File`
* Added `Route::getBase()` method
* **BC BREAK** Make `Route` objects immutable. This means that you need to do: `{% set route = route.withExtension('.html') %}` (for all `withX` methods) to keep the updated version.
* Better `Content-Encoding` handling in Apache when content compression is disabled
* Added a `Uri::getAllHeaders()` compatibility function
### CLI
* **BC BREAK** Many plugins initialize Grav in a wrong way, it is not safe to initialize plugins and theme by yourself
* Following calls require Grav 1.6.21 or later, so it is recommended to set Grav dependency to that version
* Inside `serve()` method:
* Call `$this->setLanguage($langCode);` before doing anything else if you want to set the language (or use default)
* Call one of following:
* `$this->initializeGrav();` Already called if you're in `bin/plugin`, otherwise you may need to call this one
* `$this->initializePlugins();` This initializes grav, plugins (up to `onPluginsInitialized`)
* `$this->initializeThemes();` This initializes grav, plugins and theme
* `$this->initializePages();` This initializes grav, plugins, theme and everything needed by pages
* It is a good idea to prefix your CLI command classes with your plugin name, otherwise there may be naming conflicts (we already have some!)
### Composer dependencies
* Updated Symfony Components to 4.4, please update any deprecated features in your code
* **BC BREAK** Please run `bin/grav yamllinter -f user://` to find any YAML parsing errors in your site (including your plugins and themes).
## PLUGINS
### Admin
* Added `Content Editor` option to user account blueprint
* **BC BREAK** Admin will not initialize frontend pages anymore, this has been done to greatly speed up Admin plugin.
Please call `$grav['admin']->enablePages()` or `{% do admin.enablePages() %}` if you need to access frontend pages. This call can be safely made multiple times.
If you're using `Flex Pages`, please use Flex Directory instead, it will make your code so much faster.
* Admin now uses Flex for editing `Accounts` and `Pages`. If your plugin hooks into either of those, please make sure they still work.
* Admin cache is enabled by default, make sure your plugin clears cache when needed. Please avoid clearing all cache!
### Shortcode Core
* **DEPRECATED** Every shortcode needs to have `init()` method, classes without it will stop working in the future.

View File

@@ -0,0 +1 @@
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -0,0 +1 @@
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

Binary file not shown.

51
bin/gpm
View File

@@ -1,9 +1,14 @@
#!/usr/bin/env php
<?php
/**
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
use Grav\Common\Composer;
use Symfony\Component\Console\Application;
use Grav\Common\Grav;
use Grav\Console\Application\GpmApplication;
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
@@ -20,18 +25,10 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
@@ -43,37 +40,7 @@ if (!function_exists('curl_version')) {
exit('FATAL: GPM requires PHP Curl module to be installed');
}
$climate = new League\CLImate\CLImate;
$climate->arguments->add([
'environment' => [
'prefix' => 'e',
'longPrefix' => 'env',
'description' => 'Configuration Environment',
'defaultValue' => 'localhost'
]
]);
$climate->arguments->parse();
// Set up environment based on params.
$environment = $climate->arguments->get('environment');
$grav = Grav::instance(array('loader' => $autoload));
$grav->setup($environment);
$grav['config']->init();
$grav['uri']->init();
$grav['accounts'];
$app = new Application('Grav Package Manager', GRAV_VERSION);
$app->addCommands(array(
new \Grav\Console\Gpm\IndexCommand(),
new \Grav\Console\Gpm\VersionCommand(),
new \Grav\Console\Gpm\InfoCommand(),
new \Grav\Console\Gpm\InstallCommand(),
new \Grav\Console\Gpm\UninstallCommand(),
new \Grav\Console\Gpm\UpdateCommand(),
new \Grav\Console\Gpm\SelfupgradeCommand(),
new \Grav\Console\Gpm\DirectInstallCommand(),
));
$app = new GpmApplication('Grav Package Manager', GRAV_VERSION);
$app->run();

View File

@@ -1,10 +1,14 @@
#!/usr/bin/env php
<?php
/**
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
use Grav\Common\Composer;
use Grav\Common\Grav;
use Grav\Console\Cli;
use Symfony\Component\Console\Application;
use Grav\Console\Application\GravApplication;
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
@@ -21,56 +25,18 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
$climate = new League\CLImate\CLImate;
$climate->arguments->add([
'environment' => [
'prefix' => 'e',
'longPrefix' => 'env',
'description' => 'Configuration Environment',
'defaultValue' => 'localhost'
]
]);
$climate->arguments->parse();
// Set up environment based on params.
$environment = $climate->arguments->get('environment');
$grav = Grav::instance(array('loader' => $autoload));
$grav->setup($environment);
if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!');
}
$app = new Application('Grav CLI Application', GRAV_VERSION);
$app->addCommands(array(
new Cli\InstallCommand(),
new Cli\ComposerCommand(),
new Cli\SandboxCommand(),
new Cli\CleanCommand(),
new Cli\ClearCacheCommand(),
new Cli\BackupCommand(),
new Cli\NewProjectCommand(),
new Cli\SchedulerCommand(),
new Cli\SecurityCommand(),
new Cli\LogViewerCommand(),
new Cli\YamlLinterCommand(),
new Cli\ServerCommand(),
new Cli\PageSystemValidatorCommand(),
));
$app = new GravApplication('Grav CLI Application', GRAV_VERSION);
$app->run();

View File

@@ -1,13 +1,14 @@
#!/usr/bin/env php
<?php
/**
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
use Grav\Common\Composer;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Grav\Common\Grav;
use Grav\Common\Filesystem\Folder;
use Grav\Console\Application\PluginApplication;
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
@@ -24,18 +25,10 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
@@ -43,112 +36,8 @@ if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!');
}
$climate = new League\CLImate\CLImate;
$climate->arguments->add([
'environment' => [
'prefix' => 'e',
'longPrefix' => 'env',
'description' => 'Configuration Environment',
'defaultValue' => 'localhost'
]
]);
$climate->arguments->parse();
$environment = $climate->arguments->get('environment');
// Bootstrap Grav container.
$grav = Grav::instance(array('loader' => $autoload));
$grav->setup($environment);
$grav->initializeCli();
$app = new Application('Grav Plugins Commands', GRAV_VERSION);
$pattern = '([A-Z]\w+Command\.php)';
// get arguments and strip the application name
if (null === $argv) {
$argv = $_SERVER['argv'];
}
$bin = array_shift($argv);
$name = array_shift($argv);
$argv = array_merge([$bin], $argv);
$input = new ArgvInput($argv);
/** @var \Grav\Common\Data\Data $plugin */
$plugin = $grav['plugins']->get($name);
$output = new ConsoleOutput();
$output->getFormatter()->setStyle('red', new OutputFormatterStyle('red', null, array('bold')));
$output->getFormatter()->setStyle('white', new OutputFormatterStyle('white', null, array('bold')));
if (!$name) {
$output->writeln('');
$output->writeln('<red>Usage:</red>');
$output->writeln(" {$bin} [slug] [command] [arguments]");
$output->writeln('');
$output->writeln('<red>Example:</red>');
$output->writeln(" {$bin} error log -l 1 --trace");
$list = Folder::all('plugins://', ['compare' => 'Pathname', 'pattern' => '/\/cli\/' . $pattern . '$/usm', 'levels' => 2]);
$total = 0;
if (count($list)) {
$available = [];
$output->writeln('');
$output->writeln('<red>Plugins with CLI available:</red>');
foreach ($list as $index => $entry) {
$split = explode('/', $entry);
$entry = array_shift($split);
$index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT);
$total = str_pad($total++ + 1, 2, '0', STR_PAD_LEFT);
if (\in_array($entry, $available, true)) {
$total--;
continue;
}
$available[] = $entry;
$commands_count = $index - $total + 1;
$output->writeln(' ' . $total . '. <red>' . str_pad($entry, 15) . "</red> <white>{$bin} {$entry} list</white>");
}
}
exit;
}
if (null === $plugin) {
$output->writeln('');
$output->writeln("<red>$name plugin not found</red>");
die;
}
if (!$plugin->enabled) {
$output->writeln('');
$output->writeln("<red>$name not enabled</red>");
die;
}
if ($plugin === null) {
$output->writeln("<red>Grav Plugin <white>'{$name}'</white> is not installed</red>");
exit;
}
$path = 'plugins://' . $name . '/cli';
try {
$commands = Folder::all($path, ['compare' => 'Filename', 'pattern' => '/' . $pattern . '$/usm', 'levels' => 1]);
} catch (\RuntimeException $e) {
$output->writeln("<red>No Console Commands for <white>'{$name}'</white> where found in <white>'{$path}'</white></red>");
exit;
}
foreach ($commands as $command_path) {
$full_path = $grav['locator']->findResource("plugins://{$name}/cli/{$command_path}");
require_once $full_path;
$command_class = 'Grav\Plugin\Console\\' . preg_replace('/.php$/', '', $command_path);
$command = new $command_class();
$app->add($command);
}
$app->run($input);
$app = new PluginApplication('Grav Plugins Commands', GRAV_VERSION);
$app->run();

1
cache/.gitkeep vendored
View File

@@ -0,0 +1 @@
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -19,20 +19,23 @@
"ext-zip": "*",
"ext-dom": "*",
"ext-libxml": "*",
"symfony/polyfill-mbstring": "~1.20",
"symfony/polyfill-iconv": "^1.20",
"symfony/polyfill-php74": "^1.20",
"symfony/polyfill-php80": "^1.20",
"ext-gd": "*",
"symfony/polyfill-mbstring": "~1.23",
"symfony/polyfill-iconv": "^1.23",
"symfony/polyfill-php74": "^1.23",
"symfony/polyfill-php80": "^1.23",
"symfony/polyfill-php81": "^1.23",
"psr/simple-cache": "^1.0",
"psr/http-message": "^1.0",
"psr/http-server-middleware": "^1.0",
"kodus/psr7-server": "*",
"psr/container": "~1.1.0",
"nyholm/psr7-server": "^1.0",
"nyholm/psr7": "^1.3",
"twig/twig": "~1.44",
"twig/twig": "~v1.44",
"erusev/parsedown": "^1.7",
"erusev/parsedown-extra": "~0.8",
"symfony/contracts": "~1.1",
"symfony/yaml": "4.4.16",
"symfony/yaml": "~4.4",
"symfony/console": "~4.4",
"symfony/event-dispatcher": "~4.4",
"symfony/var-dumper": "~4.4",
@@ -43,32 +46,36 @@
"filp/whoops": "~2.9",
"matthiasmullie/minify": "^1.3",
"monolog/monolog": "~1.25",
"gregwar/image": "dev-php8",
"gregwar/cache": "dev-php8",
"getgrav/image": "^3.0",
"getgrav/cache": "^2.0",
"donatj/phpuseragentparser": "~1.1",
"pimple/pimple": "~3.3",
"pimple/pimple": "~3.5.0",
"rockettheme/toolbox": "~1.5",
"maximebf/debugbar": "~1.16",
"league/climate": "^3.6",
"antoligy/dom-string-iterators": "^1.0",
"miljar/php-exif": "^0.6",
"composer/ca-bundle": "^1.2",
"dragonmantank/cron-expression": "^1.2",
"phive/twig-extensions-deferred": "^1.0",
"willdurand/negotiation": "^3.0",
"itsgoingd/clockwork": "^5.0",
"enshrined/svg-sanitize": "~0.13",
"symfony/http-client": "^4.4"
"symfony/http-client": "^4.4",
"composer/semver": "^1.4",
"rhukster/dom-sanitizer": "^1.0",
"multiavatar/multiavatar-php": "^1.0"
},
"require-dev": {
"codeception/codeception": "^4.1",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-deprecation-rules": "^0.12",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-deprecation-rules": "^1.0",
"phpunit/php-code-coverage": "~9.2",
"fzaninotto/faker": "^1.9",
"victorjonsson/markdowndocs": "dev-master",
"getgrav/markdowndocs": "^2.0",
"codeception/module-asserts": "^1.3",
"codeception/module-phpbrowser": "^1.0"
"codeception/module-phpbrowser": "^1.0",
"symfony/service-contracts": "*"
},
"replace": {
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*"
},
"suggest": {
"ext-mbstring": "Recommended for better performance",
@@ -77,7 +84,8 @@
"ext-intl": "Recommended for multi-language sites",
"ext-memcache": "Needed to support Memcache servers",
"ext-memcached": "Needed to support Memcached servers",
"ext-redis": "Needed to support Redis servers"
"ext-redis": "Needed to support Redis servers",
"ext-exif": "Needed to use exif data from images."
},
"config": {
"apcu-autoloader": true,
@@ -85,28 +93,22 @@
"php": "7.3.6"
}
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/trilbymedia/PHP-Markdown-Documentation-Generator"
},
{
"type": "vcs",
"url": "https://github.com/getgrav/Cache"
},
{
"type": "vcs",
"url": "https://github.com/getgrav/Image"
}
],
"autoload": {
"psr-4": {
"Grav\\": "system/src/Grav"
"Grav\\": "system/src/Grav",
"Twig\\": "system/src/Twig"
},
"files": [
"system/defines.php"
"system/defines.php",
"system/src/DOMLettersIterator.php",
"system/src/DOMWordsIterator.php"
]
},
"autoload-dev": {
"psr-4": {
"PHPStan\\": "tests/phpstan/classes"
}
},
"archive": {
"exclude": [
"VERSION"
@@ -115,8 +117,8 @@
"scripts": {
"api-17": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.17.md",
"post-create-project-cmd": "bin/grav install",
"phpstan": "vendor/bin/phpstan analyse -l 3 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src",
"phpstan-framework": "vendor/bin/phpstan analyse -l 8 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer system/src/Grav/Common/Assets system/src/Grav/Common/Backup system/src/Grav/Common/Config system/src/Grav/Common/Data system/src/Grav/Common/Errors system/src/Grav/Common/File system/src/Grav/Common/Helpers system/src/Grav/Common/Language system/src/Grav/Common/Markdown system/src/Grav/Common/Form system/src/Grav/Common/User",
"phpstan": "vendor/bin/phpstan analyse -l 2 -c ./tests/phpstan/phpstan.neon --memory-limit=720M system/src",
"phpstan-framework": "vendor/bin/phpstan analyse -l 5 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer",
"phpstan-plugins": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/plugins.neon --memory-limit=400M user/plugins",
"test": "vendor/bin/codecept run unit",
"test-windows": "vendor\\bin\\codecept run unit"

2606
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -3,7 +3,7 @@
/**
* @package Grav.Core
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -12,28 +12,14 @@ namespace Grav;
\define('GRAV_REQUEST_TIME', microtime(true));
\define('GRAV_PHP_MIN', '7.3.6');
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
die(sprintf('You are running PHP %s, but Grav needs at least <strong>PHP %s</strong> to run.', $ver, $req));
}
if (PHP_SAPI === 'cli-server') {
$symfony_server = stripos(getenv('_'), 'symfony') !== false || stripos($_SERVER['SERVER_SOFTWARE'], 'symfony
') !== false;
$symfony_server = stripos(getenv('_'), 'symfony') !== false || stripos($_SERVER['SERVER_SOFTWARE'] ?? '', 'symfony') !== false || stripos($_ENV['SERVER_SOFTWARE'] ?? '', 'symfony') !== false;
if (!isset($_SERVER['PHP_CLI_ROUTER']) && !$symfony_server) {
die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
}
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
// Ensure vendor libraries exist
$autoload = __DIR__ . '/vendor/autoload.php';
if (!is_file($autoload)) {
@@ -43,23 +29,23 @@ if (!is_file($autoload)) {
// Register the auto-loader.
$loader = require $autoload;
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
use Grav\Common\Grav;
use RocketTheme\Toolbox\Event\Event;
// Get the Grav instance
$grav = Grav::instance(
array(
'loader' => $loader
)
);
$grav = Grav::instance(array('loader' => $loader));
// Process the page
try {
$grav->process();
} catch (\Error $e) {
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
throw $e;
} catch (\Exception $e) {
} catch (\Error|\Exception $e) {
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
throw $e;
}

View File

@@ -0,0 +1 @@
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -1,4 +1,4 @@
{
{
"version": 2,
"builds": [{ "src": "*.php", "use": "@now/php" }]
}

View File

@@ -1,15 +1,21 @@
User-agent: *
Disallow: /.github/
Disallow: /.phan/
Disallow: /assets/
Disallow: /backup/
Disallow: /bin/
Disallow: /cache/
Disallow: /grav/
Disallow: /logs/
Disallow: /system/
Disallow: /vendor/
Disallow: /tests/
Disallow: /tmp/
Disallow: /user/
Disallow: /vendor/
Disallow: /webserver-configs/
Allow: /user/pages/
Allow: /user/themes/
Allow: /user/images/
Allow: /
Allow: *.css$
Allow: *.js$
Allow: *.js$
Allow: /system/*.js$

View File

@@ -14,11 +14,8 @@ div.phpdebugbar {
padding: 5px 8px;
}
.phpdebugbar div.phpdebugbar-header, .phpdebugbar a.phpdebugbar-restore-btn {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA/1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeHh4AAAD///8EBAT7+/sLCwv29vYVFRUvLy/t7e3m5ubCwsKxsbE/Pz+mpqZMTEwcHBzy8vLp6emfn5+AgIA2Njbi4uLf39+rq6tzc3NWVlYhISHa2trW1tbS0tLMzMy7u7uZmZmUlJSMjIxvb29kZGRHR0c7Ozt5eXkqKiq1tbWQkJBqampbW1tSUlLHx8eHh4ckJCRDQ0M3wD42AAAAI3RSTlMA/PibTbQ0x76TVAlw4LhZLOuEYCAN9Hjx0a2ppGZEGYw97djhXHwAAATZSURBVFjDlVcHW+MwDO1eFCjj2McNOzvdpXTTXVbL/P+/5SQ7QSSX5Di1X1onfi/Sk+Q4sTDbKqWK+YuznZ2zi3wxVdqK/Zf92M1nT9gnO8rmd398GX6Z3xaoOFoiAQcx3E5efgmeSuN8F6Xg1x3G06l/wjNpMR1B0uif4EhnIuFb+0diIoFXk3IVfokisR+h52GO4JKgyjmfaMhAFNlSaPR7DpwI+lzn/E4QKIqmKIJirxCMP4izBPPZPXhgXwMBYgULw0nfg/BF5scDbslb7QeJ08yqqTEmGYoB95d4H8ETL8+n9wBqrLu6ao3bBsMwAnxISf/9BHcqxNB8Y7cWl3Zz7TAUfPrvAT6AoNEFFXvsjutL01yOuMrtBxnFXsmT/1wQHmdWAFNnI3uI48Yj0FUcHbKf62GfUfr8eeQt7Uk3mQZpZNoVRPEui5vtEz5zFEpgWnyqVBZMc6oaGNriH2hGVZ0OxEvInPeMaZWJBA7vmPbCr5jjws5HBnAUxvDMH40aCIf4G5BjRQSs8E8HFFYf8bGxgDvD55bzGhwWkoBcuIyHR/AMdaCagxXDhtL6tSqoWpd4BMnlIR+Or+rYTK/a3EAGcc6e4AWHISnWv20iCCojsHoVlQdjrMexFF2C7UMg2A2WEGWbQhXN6l3eXC6XGp4b9qxbuEB2EBGBwtocrK90cVG5mbRXm6vmx/0phq1sIAGKDgLOBiN1MrO5a9aDl+D0W6x0Ar9BCTRuIIANa90Y7LrLVRXzwVtDInCqMRWcf2bUOEAsa4wJqFowQALL9EiAtVRk8QC4OW+1pOM9jIaVASwYagyNXDj+W0NcfuZNzjtXOiL0Zzg30Llj+ptfxQs4+vBPNiL5PawFCBkgXpUaVtqGl+A8dgZHL34BcBUQrwPptToW+o37Ku+UH9eYByJIx3YkAeFnMFuGO7S5gEp7YhXxa5OOAM39RXDPXb0qmpROsswZe+twXdU55oUIZAiEv3bD1UFwIYKkmGqytPCDCwKFQCKK0yL7qtSAPX54UAbtsLuBHkb9zyLmPQSNjsSgmQwKUOIfEY8F8t4B34DvndJY9BA8tNBJq1Nev9axmaStFcQLhgYoCTo0salkIaW8OUDdWjMTR2sHPhrAFZqx6cqcKE4pl2BJJ4K6hfwvqNgAnXfKX/HU6X3Zrhnu0k7tLNZtTBRv1hkwTDBY1NzFU6doDYjJbWdQkQhWwuU7/LvhTh3SDoco4ECL4i5dwURbc8NdDZz2IwKicE8d0KIqWetLE3+lL4hvUuGSeRfVWNLfj/gpOw4smBJBkKQHCzlHGwvAj4woB1gq5NGGLSXtORBPnUQPV5/MPVkDMxbpwG7w4x0xL6Ltxka0A/4NBvV09UVk4DoSn/jl2+JQS9q9KYawisAD4CfhsZ4TH3htylsdEHARIQBusqCKyUpymycgbbkkXEXjT3z7/oKQFTFVuZD2FMJHZIDsO5x2d4aAr2jR+GLwZhtAb028/0yJ9J8dE87jQyKObcjtTXT8dH+fDuKF4/eiPwzH44wTf/yUi6wrpRIOZ9lM1EtXAifFI+CJn9+iX/t2xMQwOMth/UZbASi8btAwR9FHWSpJr75g9Oqbin3VDg+SpwlP6k6TB4ex/7JvmcJx8jydy6XPk8eFTKhyfwCgX71MSvaBHgAAAABJRU5ErkJggg==);
}
.phpdebugbar a.phpdebugbar-restore-btn {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA/1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeHh4AAAD///8EBAT7+/sLCwv29vYVFRUvLy/t7e3m5ubCwsKxsbE/Pz+mpqZMTEwcHBzy8vLp6emfn5+AgIA2Njbi4uLf39+rq6tzc3NWVlYhISHa2trW1tbS0tLMzMy7u7uZmZmUlJSMjIxvb29kZGRHR0c7Ozt5eXkqKiq1tbWQkJBqampbW1tSUlLHx8eHh4ckJCRDQ0M3wD42AAAAI3RSTlMA/PibTbQ0x76TVAlw4LhZLOuEYCAN9Hjx0a2ppGZEGYw97djhXHwAAATZSURBVFjDlVcHW+MwDO1eFCjj2McNOzvdpXTTXVbL/P+/5SQ7QSSX5Di1X1onfi/Sk+Q4sTDbKqWK+YuznZ2zi3wxVdqK/Zf92M1nT9gnO8rmd398GX6Z3xaoOFoiAQcx3E5efgmeSuN8F6Xg1x3G06l/wjNpMR1B0uif4EhnIuFb+0diIoFXk3IVfokisR+h52GO4JKgyjmfaMhAFNlSaPR7DpwI+lzn/E4QKIqmKIJirxCMP4izBPPZPXhgXwMBYgULw0nfg/BF5scDbslb7QeJ08yqqTEmGYoB95d4H8ETL8+n9wBqrLu6ao3bBsMwAnxISf/9BHcqxNB8Y7cWl3Zz7TAUfPrvAT6AoNEFFXvsjutL01yOuMrtBxnFXsmT/1wQHmdWAFNnI3uI48Yj0FUcHbKf62GfUfr8eeQt7Uk3mQZpZNoVRPEui5vtEz5zFEpgWnyqVBZMc6oaGNriH2hGVZ0OxEvInPeMaZWJBA7vmPbCr5jjws5HBnAUxvDMH40aCIf4G5BjRQSs8E8HFFYf8bGxgDvD55bzGhwWkoBcuIyHR/AMdaCagxXDhtL6tSqoWpd4BMnlIR+Or+rYTK/a3EAGcc6e4AWHISnWv20iCCojsHoVlQdjrMexFF2C7UMg2A2WEGWbQhXN6l3eXC6XGp4b9qxbuEB2EBGBwtocrK90cVG5mbRXm6vmx/0phq1sIAGKDgLOBiN1MrO5a9aDl+D0W6x0Ar9BCTRuIIANa90Y7LrLVRXzwVtDInCqMRWcf2bUOEAsa4wJqFowQALL9EiAtVRk8QC4OW+1pOM9jIaVASwYagyNXDj+W0NcfuZNzjtXOiL0Zzg30Llj+ptfxQs4+vBPNiL5PawFCBkgXpUaVtqGl+A8dgZHL34BcBUQrwPptToW+o37Ku+UH9eYByJIx3YkAeFnMFuGO7S5gEp7YhXxa5OOAM39RXDPXb0qmpROsswZe+twXdU55oUIZAiEv3bD1UFwIYKkmGqytPCDCwKFQCKK0yL7qtSAPX54UAbtsLuBHkb9zyLmPQSNjsSgmQwKUOIfEY8F8t4B34DvndJY9BA8tNBJq1Nev9axmaStFcQLhgYoCTo0salkIaW8OUDdWjMTR2sHPhrAFZqx6cqcKE4pl2BJJ4K6hfwvqNgAnXfKX/HU6X3Zrhnu0k7tLNZtTBRv1hkwTDBY1NzFU6doDYjJbWdQkQhWwuU7/LvhTh3SDoco4ECL4i5dwURbc8NdDZz2IwKicE8d0KIqWetLE3+lL4hvUuGSeRfVWNLfj/gpOw4smBJBkKQHCzlHGwvAj4woB1gq5NGGLSXtORBPnUQPV5/MPVkDMxbpwG7w4x0xL6Ltxka0A/4NBvV09UVk4DoSn/jl2+JQS9q9KYawisAD4CfhsZ4TH3htylsdEHARIQBusqCKyUpymycgbbkkXEXjT3z7/oKQFTFVuZD2FMJHZIDsO5x2d4aAr2jR+GLwZhtAb028/0yJ9J8dE87jQyKObcjtTXT8dH+fDuKF4/eiPwzH44wTf/yUi6wrpRIOZ9lM1EtXAifFI+CJn9+iX/t2xMQwOMth/UZbASi8btAwR9FHWSpJr75g9Oqbin3VDg+SpwlP6k6TB4ex/7JvmcJx8jydy6XPk8eFTKhyfwCgX71MSvaBHgAAAABJRU5ErkJggg==);
width: 13px;
}

View File

@@ -47,7 +47,8 @@ form:
label: PLUGIN_ADMIN.EXTRA_ARGUMENTS
placeholder: '-lah'
.at:
type: cron
type: text
wrapper_classes: cron-selector
label: PLUGIN_ADMIN.SCHEDULER_RUNAT
help: PLUGIN_ADMIN.SCHEDULER_RUNAT_HELP
placeholder: '* * * * *'

View File

@@ -177,39 +177,47 @@ form:
label: PLUGIN_ADMIN.APPEND_URL_EXT
help: PLUGIN_ADMIN.APPEND_URL_EXT_HELP
pages.redirect_default_route:
type: toggle
label: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE
help: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
pages.redirect_default_code:
type: select
size: medium
classes: fancy
label: PLUGIN_ADMIN.REDIRECT_DEFAULT_CODE
help: PLUGIN_ADMIN.REDIRECT_DEFAULT_CODE_HELP
default: 302
options:
301: 301 - Permanent
302: 302 - Found
303: 303 - Other
304: 304 - Not Modified
301: PLUGIN_ADMIN.REDIRECT_OPTION_301
302: PLUGIN_ADMIN.REDIRECT_OPTION_302
303: PLUGIN_ADMIN.REDIRECT_OPTION_303
pages.redirect_default_route:
type: select
size: medium
classes: fancy
label: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE
help: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE_HELP
default: 0
options:
0: PLUGIN_ADMIN.REDIRECT_OPTION_NO_REDIRECT
1: PLUGIN_ADMIN.REDIRECT_OPTION_DEFAULT_REDIRECT
301: PLUGIN_ADMIN.REDIRECT_OPTION_301
302: PLUGIN_ADMIN.REDIRECT_OPTION_302
validate:
type: int
pages.redirect_trailing_slash:
type: toggle
type: select
size: medium
classes: fancy
label: PLUGIN_ADMIN.REDIRECT_TRAILING_SLASH
help: PLUGIN_ADMIN.REDIRECT_TRAILING_SLASH_HELP
highlight: 1
default: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
0: PLUGIN_ADMIN.REDIRECT_OPTION_NO_REDIRECT
1: PLUGIN_ADMIN.REDIRECT_OPTION_DEFAULT_REDIRECT
301: PLUGIN_ADMIN.REDIRECT_OPTION_301
302: PLUGIN_ADMIN.REDIRECT_OPTION_302
validate:
type: bool
type: int
pages.ignore_hidden:
type: toggle
@@ -600,7 +608,6 @@ form:
file: File
apc: APC
apcu: APCu
xcache: Xcache
memcache: Memcache
memcached: Memcached
wincache: WinCache
@@ -638,7 +645,7 @@ form:
type: toggle
label: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT
help: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT_HELP
highlight: 1
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
@@ -741,6 +748,16 @@ form:
size: small
label: PLUGIN_ADMIN.REDIS_PASSWORD
cache.redis.database:
type: text
size: medium
label: PLUGIN_ADMIN.REDIS_DATABASE
help: PLUGIN_ADMIN.REDIS_DATABASE_HELP
placeholder: "0"
validate:
type: number
min: 0
flex_caching:
type: section
title: PLUGIN_ADMIN.FLEX_CACHING
@@ -870,9 +887,45 @@ form:
title: PLUGIN_ADMIN.ASSETS
fields:
assets_section:
general_config_section:
type: section
title: PLUGIN_ADMIN.ASSETS
title: PLUGIN_ADMIN.GENERAL_CONFIG
underline: true
assets.enable_asset_timestamp:
type: toggle
label: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
assets.enable_asset_sri:
type: toggle
label: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
assets.collections:
type: multilevel
label: PLUGIN_ADMIN.COLLECTIONS
placeholder_key: collection_name
placeholder_value: collection_path
validate:
type: array
css_assets_section:
type: section
title: PLUGIN_ADMIN.CSS_ASSETS
underline: true
assets.css_pipeline:
@@ -941,6 +994,11 @@ form:
validate:
type: bool
js_assets_section:
type: section
title: PLUGIN_ADMIN.JS_ASSETS
underline: true
assets.js_pipeline:
type: toggle
label: PLUGIN_ADMIN.JAVASCRIPT_PIPELINE
@@ -985,10 +1043,15 @@ form:
validate:
type: bool
assets.enable_asset_timestamp:
js_module_assets_section:
type: section
title: PLUGIN_ADMIN.JS_MODULE_ASSETS
underline: true
assets.js_module_pipeline:
type: toggle
label: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS_HELP
label: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE
help: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
@@ -996,13 +1059,29 @@ form:
validate:
type: bool
assets.collections:
type: multilevel
label: PLUGIN_ADMIN.COLLECTIONS
placeholder_key: collection_name
placeholder_value: collection_path
assets.js_module_pipeline_include_externals:
type: toggle
label: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_INCLUDE_EXTERNALS
help: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_INCLUDE_EXTERNALS_HELP
highlight: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: array
type: bool
assets.js_module_pipeline_before_excludes:
type: toggle
label: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_BEFORE_EXCLUDES
help: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_BEFORE_EXCLUDES_HELP
highlight: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
errors:
type: tab
@@ -1076,6 +1155,13 @@ form:
local6: local6
local7: local7
log.syslog.tag:
type: text
size: small
label: PLUGIN_ADMIN.SYSLOG_TAG
help: PLUGIN_ADMIN.SYSLOG_TAG_HELP
placeholder: "grav"
debugger:
type: tab
title: PLUGIN_ADMIN.DEBUGGER
@@ -1253,6 +1339,45 @@ form:
validate:
type: commalist
section_images_cls:
type: section
title: PLUGIN_ADMIN.IMAGES_CLS_TITLE
underline: true
images.cls.auto_sizes:
type: toggle
label: PLUGIN_ADMIN.IMAGES_CLS_AUTO_SIZES
help: PLUGIN_ADMIN.IMAGES_CLS_AUTO_SIZES_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
images.cls.aspect_ratio:
type: toggle
label: PLUGIN_ADMIN.IMAGES_CLS_ASPECT_RATIO
help: PLUGIN_ADMIN.IMAGES_CLS_ASPECT_RATIO_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
images.cls.retina_scale:
type: select
label: PLUGIN_ADMIN.IMAGES_CLS_RETINA_SCALE
help: PLUGIN_ADMIN.IMAGES_CLS_RETINA_SCALE_HELP
size: small
highlight: 1
options:
1: 1X
2: 2X
3: 3X
4: 4X
session:
type: tab
title: PLUGIN_ADMIN.SESSION
@@ -1326,6 +1451,18 @@ form:
validate:
type: bool
session.secure_https:
type: toggle
label: PLUGIN_ADMIN.SESSION_SECURE_HTTPS
help: PLUGIN_ADMIN.SESSION_SECURE_HTTPS_HELP
highlight: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
default: true
validate:
type: bool
session.httponly:
type: toggle
label: PLUGIN_ADMIN.SESSION_HTTPONLY
@@ -1338,6 +1475,12 @@ form:
validate:
type: bool
session.domain:
type: text
size: small
label: PLUGIN_ADMIN.SESSION_DOMAIN
help: PLUGIN_ADMIN.SESSION_DOMAIN_HELP
session.path:
type: text
size: small
@@ -1372,6 +1515,10 @@ form:
title: PLUGIN_ADMIN.ADVANCED
underline: true
gpm_section:
type: section
title: PLUGIN_ADMIN.GPM_SECTION
gpm.releases:
type: toggle
label: PLUGIN_ADMIN.GPM_RELEASES
@@ -1381,23 +1528,6 @@ form:
stable: PLUGIN_ADMIN.STABLE
testing: PLUGIN_ADMIN.TESTING
gpm.proxy_url:
type: text
size: medium
placeholder: "e.g. 127.0.0.1:3128"
label: PLUGIN_ADMIN.PROXY_URL
help: PLUGIN_ADMIN.PROXY_URL_HELP
gpm.method:
type: toggle
label: PLUGIN_ADMIN.GPM_METHOD
highlight: auto
help: PLUGIN_ADMIN.GPM_METHOD_HELP
options:
auto: PLUGIN_ADMIN.AUTO
fopen: PLUGIN_ADMIN.FOPEN
curl: PLUGIN_ADMIN.CURL
gpm.official_gpm_only:
type: toggle
label: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY
@@ -1410,17 +1540,80 @@ form:
validate:
type: bool
gpm.verify_peer:
http_section:
type: section
title: PLUGIN_ADMIN.HTTP_SECTION
http.method:
type: toggle
label: PLUGIN_ADMIN.GPM_VERIFY_PEER
label: PLUGIN_ADMIN.GPM_METHOD
highlight: auto
help: PLUGIN_ADMIN.GPM_METHOD_HELP
options:
auto: PLUGIN_ADMIN.AUTO
fopen: PLUGIN_ADMIN.FOPEN
curl: PLUGIN_ADMIN.CURL
http.enable_proxy:
type: toggle
label: PLUGIN_ADMIN.SSL_ENABLE_PROXY
highlight: 1
help: PLUGIN_ADMIN.GPM_VERIFY_PEER_HELP
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
default: false
validate:
type: bool
http.proxy_url:
type: text
size: medium
placeholder: "e.g. 127.0.0.1:3128"
label: PLUGIN_ADMIN.PROXY_URL
help: PLUGIN_ADMIN.PROXY_URL_HELP
http.proxy_cert_path:
type: text
size: medium
placeholder: "e.g. /Users/bob/certs/"
label: PLUGIN_ADMIN.PROXY_CERT
help: PLUGIN_ADMIN.PROXY_CERT_HELP
http.verify_peer:
type: toggle
label: PLUGIN_ADMIN.SSL_VERIFY_PEER
highlight: 1
help: PLUGIN_ADMIN.SSL_VERIFY_PEER_HELP
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
http.verify_host:
type: toggle
label: PLUGIN_ADMIN.SSL_VERIFY_HOST
highlight: 1
help: PLUGIN_ADMIN.SSL_VERIFY_HOST_HELP
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
http.concurrent_connections:
type: number
size: x-small
label: PLUGIN_ADMIN.HTTP_CONNECTIONS
help: PLUGIN_ADMIN.HTTP_CONNECTIONS_HELP
validate:
min: 1
max: 20
misc_section:
type: section
title: PLUGIN_ADMIN.MISC_SECTION
reverse_proxy_setup:
type: toggle
label: PLUGIN_ADMIN.REVERSE_PROXY
@@ -1599,35 +1792,15 @@ form:
validate:
type: bool
experimental:
accounts:
type: tab
title: PLUGIN_ADMIN.EXPERIMENTAL
title: PLUGIN_ADMIN.ACCOUNTS
fields:
experimental_section:
type: section
title: PLUGIN_ADMIN.EXPERIMENTAL
underline: true
# flex_pages:
# type: section
# title: Flex Pages
#
# pages.type:
# type: select
# label: PLUGIN_ADMIN.PAGES_TYPE
# highlight: regular
# help: PLUGIN_ADMIN.PAGES_TYPE_HELP
# options:
# regular: PLUGIN_ADMIN.REGULAR
# flex: PLUGIN_ADMIN.FLEX
pages.type:
type: hidden
flex_accounts:
type: section
title: Flex Accounts
title: User Accounts
accounts.type:
type: select
@@ -1646,3 +1819,41 @@ form:
options:
file: PLUGIN_ADMIN.FILE
folder: PLUGIN_ADMIN.FOLDER
accounts.avatar:
type: select
label: PLUGIN_ADMIN.AVATAR
default: gravatar
help: PLUGIN_ADMIN.AVATAR_HELP
options:
multiavatar: Multiavatar [local]
gravatar: Gravatar [external]
# experimental:
# type: tab
# title: PLUGIN_ADMIN.EXPERIMENTAL
#
# fields:
# experimental_section:
# type: section
# title: PLUGIN_ADMIN.EXPERIMENTAL
# underline: true
#
# flex_pages:
# type: section
# title: Flex Pages
#
# pages.type:
# type: select
# label: PLUGIN_ADMIN.PAGES_TYPE
# highlight: regular
# help: PLUGIN_ADMIN.PAGES_TYPE_HELP
# options:
# regular: PLUGIN_ADMIN.REGULAR
# flex: PLUGIN_ADMIN.FLEX
#
# pages.type:
# type: hidden

View File

@@ -104,7 +104,7 @@ config:
edit:
title:
template: "{% if object.root %}Root <small>( &lt;root&gt; ){% else %}{{ (form.value('header.title') ?? form.value('folder'))|e }} <small>( {{ (object.getRoute().toString(false) ?: '/')|e }} )</small>{% endif %}"
template: "{% if object.root %}Root <small>( &lt;root&gt; )</small>{% else %}{{ (form.value('header.title') ?? form.value('folder'))|e }} <small>( {{ (object.getRoute().toString(false) ?: '/')|e }} )</small>{% endif %}"
# TODO: not used yet
buttons:
@@ -176,7 +176,7 @@ config:
indexed: true
# Set default ordering of the pages
ordering:
key: ASC
storage_key: ASC
search:
# Search options
options:
@@ -184,9 +184,9 @@ config:
# Fields to be searched
fields:
- key
- slug
- menu
- title
- name
blueprints:
configure:

View File

@@ -122,6 +122,19 @@ config:
fields:
- key
- email
- username
- fullname
relationships:
media:
type: media
cardinality: to-many
avatar:
type: media
cardinality: to-one
# roles:
# type: user-groups
# cardinality: to-many
blueprints:
configure:

View File

@@ -18,6 +18,7 @@ config:
configure:
path: '/accounts/configure'
redirects:
'/groups': '/accounts/groups'
'/accounts': '/accounts/groups'
# Permissions
@@ -112,6 +113,7 @@ config:
fields:
- key
- groupname
- readableName
- description
blueprints:

View File

@@ -121,7 +121,7 @@ form:
underline: true
folder:
type: text
type: folder-slug
label: PLUGIN_ADMIN.FOLDER_NAME
validate:
rule: slug
@@ -320,6 +320,18 @@ form:
fields:
header.redirect_default_route:
type: toggle
toggleable: true
label: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE
help: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE_HELP
config-highlight@: system.pages.redirect_default_route
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
header.routes.default:
type: text
toggleable: true

View File

@@ -1,7 +1,7 @@
title: PLUGIN_ADMIN:EXTERNAL
title: PLUGIN_ADMIN.EXTERNAL
extends@:
type: default
context: blueprints://pages
type: default
context: blueprints://pages
form:
validation: loose
@@ -29,16 +29,16 @@ form:
unset@: true
header.external_url:
type: text
label: PLUGIN_ADMIN.EXTERNAL_URL
placeholder: https://getgrav.org
validate:
required: true
type: text
label: PLUGIN_ADMIN.EXTERNAL_URL
placeholder: https://getgrav.org
validate:
required: true
options:
fields:
publishing:
fields:
header.date:

View File

@@ -51,17 +51,13 @@ form:
type: bool
header.permissions.authors:
type: list
type: array
toggleable: true
value_only: true
placeholder_value: PLUGIN_ADMIN.USERNAME
label: PLUGIN_ADMIN.PAGE_AUTHORS
help: PLUGIN_ADMIN.PAGE_AUTHORS_HELP
fields:
value:
type: text
placeholder: PLUGIN_ADMIN.USERNAME
style: vertical
header.permissions.groups:
ignore@: true
type: acl_picker

View File

@@ -11,10 +11,21 @@ form:
avatar:
type: file
size: large
destination: 'user://accounts/avatars'
destination: 'account://avatars'
multiple: false
random_name: true
multiavatar_only:
type: conditional
condition: config.system.accounts.avatar == 'multiavatar'
fields:
avatar_hash:
type: text
label: ''
placeholder: 'e.g. dceaadcfda491f4e45'
description: PLUGIN_ADMIN.AVATAR_HASH
size: large
content:
type: section
title: PLUGIN_ADMIN.ACCOUNT
@@ -107,6 +118,12 @@ form:
label: PLUGIN_ADMIN.2FA_SECRET
sublabel: PLUGIN_ADMIN.2FA_SECRET_HELP
yubikey_id:
type: text
label: PLUGIN_ADMIN.YUBIKEY_ID
description: PLUGIN_ADMIN.YUBIKEY_HELP
size: small
maxlength: 12
@@ -123,7 +140,7 @@ form:
multiple: true
size: large
label: PLUGIN_ADMIN.GROUPS
data-options@: '\Grav\Common\User\Group::groupNames'
data-options@: 'Grav\Common\Flex\Types\UserGroups\UserGroupObject::groupNames'
classes: fancy
help: PLUGIN_ADMIN.GROUPS_HELP
validate:

View File

@@ -13,6 +13,6 @@ form:
label: PLUGIN_ADMIN.USERNAME
help: PLUGIN_ADMIN.USERNAME_HELP
unset-disabled@: true
unset-readonly@: true
unset-readonly@: true
validate:
required: true

View File

@@ -28,6 +28,10 @@ types:
type: image
thumb: media/thumb-webp.png
mime: image/webp
avif:
type: image
thumb: media/thumb.png
mime: image/avif
gif:
type: animated
thumb: media/thumb-gif.png
@@ -91,7 +95,7 @@ types:
aif:
type: audio
thumb: media/thumb-aif.png
mime: audio/aif
mime: audio/aiff
txt:
type: file
thumb: media/thumb-txt.png
@@ -195,7 +199,7 @@ types:
gz:
type: file
thumb: media/thumb-gz.png
mime: application/gzip
mime: application/x-gzip
tar:
type: file
thumb: media/thumb-tar.png
@@ -207,7 +211,7 @@ types:
js:
type: file
thumb: media/thumb-js.png
mime: application/javascript
mime: text/javascript
json:
type: file
thumb: media/thumb-json.png

1986
system/config/mime.yaml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +0,0 @@
schemes:
image:
type: Stream
paths:
- user://images
- system://images
page:
type: ReadOnlyStream
paths:
- user://pages
account:
type: ReadOnlyStream
paths:
- user://accounts

View File

@@ -35,6 +35,7 @@ home:
pages:
type: regular # EXPERIMENTAL: Page type: regular or flex
dirs: ['page://'] # Advanced functionality, allows for multiple page paths
theme: quark # Default theme (defaults to "quark" theme)
order:
by: default # Order pages by "default", "alpha" or "date"
@@ -73,11 +74,11 @@ pages:
expires: 604800 # Page expires time in seconds (604800 seconds = 7 days)
cache_control: # Can be blank for no setting, or a valid `cache-control` text value
last_modified: false # Set the last modified date header based on file modification timestamp
etag: false # Set the etag header tag
etag: true # Set the etag header tag
vary_accept_encoding: false # Add `Vary: Accept-Encoding` header
redirect_default_route: false # Automatically redirect to a page's default route
redirect_default_code: 302 # Default code to use for redirects
redirect_trailing_slash: true # Handle automatically or 302 redirect a trailing / URL
redirect_default_code: 302 # Default code to use for redirects: 301|302|303
redirect_trailing_slash: 1 # Always redirect trailing slash with redirect code 0|1|301|302 (0: no redirect, 1: use default code)
redirect_default_route: 0 # Always redirect to page's default route using code 0|1|301|302, also removes .htm and .html extensions
ignore_files: [.DS_Store] # Files to ignore in Pages
ignore_folders: [.git, .idea] # Folders to ignore in Pages
ignore_hidden: true # Ignore all Hidden files and folders
@@ -96,13 +97,15 @@ cache:
purge_at: '0 4 * * *' # How often to purge old file cache (using new scheduler)
clear_at: '0 3 * * *' # How often to clear cache (using new scheduler)
clear_job_type: 'standard' # Type to clear when processing the scheduled clear job `standard`|`all`
clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled
clear_images_by_default: false # By default grav does not include processed images in cache clear, this can be enabled
cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.)
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
gzip: false # GZip compress the page output
allow_webserver_gzip: false # If true, `content-encoding: identity` but connection isn't closed before `onShutDown()` event
redis:
socket: false # Path to redis unix socket (e.g. /var/run/redis/redis.sock), false = use server and port to connect
password: # Optional password
database: # Optional database ID
twig:
cache: true # Set to true to enable Twig caching
@@ -111,6 +114,8 @@ twig:
autoescape: true # Autoescape Twig vars (DEPRECATED, always enabled in strict mode)
undefined_functions: true # Allow undefined functions
undefined_filters: true # Allow undefined filters
safe_functions: [] # List of PHP functions which are allowed to be used as Twig functions
safe_filters: [] # List of PHP functions which are allowed to be used as Twig filters
umask_fix: false # By default Twig creates cached files as 755, fix switches this to 775
assets: # Configuration for Assets Manager (JS, CSS)
@@ -123,10 +128,14 @@ assets: # Configuration for Assets Mana
js_pipeline: false # The JS pipeline is the unification of multiple JS resources into one file
js_pipeline_include_externals: true # Include external URLs in the pipeline by default
js_pipeline_before_excludes: true # Render the pipeline before any excluded files
js_module_pipeline: false # The JS Module pipeline is the unification of multiple JS Module resources into one file
js_module_pipeline_include_externals: true # Include external URLs in the pipeline by default
js_module_pipeline_before_excludes: true # Render the pipeline before any excluded files
js_minify: true # Minify the JS during pipelining
enable_asset_timestamp: false # Enable asset timestamps
enable_asset_sri: false # Enable asset SRI
collections:
jquery: system://assets/jquery/jquery-2.x.min.js
jquery: system://assets/jquery/jquery-3.x.min.js
errors:
display: 0 # Display either (1) Full backtrace | (0) Simple Error | (-1) System Error
@@ -136,6 +145,7 @@ log:
handler: file # Log handler. Currently supported: file | syslog
syslog:
facility: local6 # Syslog facilities output
tag: grav # Syslog tag. Default: "grav".
debugger:
enabled: false # Enable Grav debugger and following settings
@@ -151,8 +161,18 @@ images:
debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example
auto_fix_orientation: true # Automatically fix the image orientation based on the Exif data
seofriendly: false # SEO-friendly processed image names
cls: # Cumulative Layout Shift: See https://web.dev/optimize-cls/
auto_sizes: false # Automatically add height/width to image
aspect_ratio: false # Reserve space with aspect ratio style
retina_scale: 1 # scale to adjust auto-sizes for better handling of HiDPI resolutions
defaults:
loading: auto # Let browser pick [auto|lazy|eager]
watermark:
image: 'system://images/watermark.png' # Path to a watermark image
position_y: 'center' # top|center|bottom
position_x: 'center' # left|center|right
scale: 33 # percentage of watermark scale
watermark_all: false # automatically watermark all images
media:
enable_media_timestamp: false # Enable media timestamps
@@ -167,21 +187,30 @@ session:
name: grav-site # Name prefix of the session cookie. Use alphanumeric, dashes or underscores only. Do not use dots in the session name
uniqueness: path # Should sessions be `path` based or `security.salt` based
secure: false # Set session secure. If true, indicates that communication for this cookie must be over an encrypted transmission. Enable this only on sites that run exclusively on HTTPS
secure_https: true # Set session secure on HTTPS but not on HTTP. Has no effect if you have `session.secure: true`. Set to false if your site jumps between HTTP and HTTPS.
httponly: true # Set session HTTP only. If true, indicates that cookies should be used only over HTTP, and JavaScript modification is not allowed.
samesite: Lax # Set session SameSite. Possible values are Lax, Strict and None. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
split: true # Sessions should be independent between site and plugins (such as admin)
path:
domain: # Domain used by sessions.
path: # Path used by sessions.
gpm:
releases: testing # Set to either 'stable' or 'testing'
proxy_url: # Configure a manual proxy URL for GPM (eg 127.0.0.1:3128)
method: 'auto' # Either 'curl', 'fopen' or 'auto'. 'auto' will try fopen first and if not available cURL
verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help.
releases: stable # Set to either 'stable' or 'testing'
official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security
http:
method: auto # Either 'curl', 'fopen' or 'auto'. 'auto' will try fopen first and if not available cURL
enable_proxy: true # Enable proxy server configuration
proxy_url: # Configure a manual proxy URL for GPM (eg 127.0.0.1:3128)
proxy_cert_path: # Local path to proxy certificate folder containing pem files
concurrent_connections: 5 # Concurrent HTTP connections when multiplexing
verify_peer: true # Enable/Disable SSL verification of peer certificates
verify_host: true # Enable/Disable SSL verification of host certificates
accounts:
type: regular # EXPERIMENTAL: Account type: regular or flex
storage: file # EXPERIMENTAL: Flex storage type: file or folder
avatar: gravatar # Avatar generator [multiavatar|gravatar]
flex:
cache:

View File

@@ -1,16 +1,17 @@
<?php
/**
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
// Some standard defines
define('GRAV', true);
define('GRAV_VERSION', '1.7.0-rc.20');
define('GRAV_VERSION', '1.7.41.1');
define('GRAV_SCHEMA', '1.7.0_2020-11-20_1');
define('GRAV_TESTING', true);
define('GRAV_TESTING', false);
// PHP minimum requirement
if (!defined('GRAV_PHP_MIN')) {
@@ -22,51 +23,68 @@ if (!defined('DS')) {
define('DS', '/');
}
// Directories and Paths
// Absolute path to Grav root. This is where Grav is installed into.
if (!defined('GRAV_ROOT')) {
$path = rtrim(str_replace(DIRECTORY_SEPARATOR, DS, getenv('GRAV_ROOT') ?: getcwd()), DS);
define('GRAV_ROOT', $path);
}
// Absolute path to Grav webroot. This is the path where your site is located in.
if (!defined('GRAV_WEBROOT')) {
$path = rtrim(getenv('GRAV_WEBROOT') ?: GRAV_ROOT, DS);
define('GRAV_WEBROOT', $path);
}
// Relative path to user folder. This path needs to be located under GRAV_WEBROOT.
if (!defined('GRAV_USER_PATH')) {
$path = rtrim(getenv('GRAV_USER_PATH') ?: 'user', DS);
define('GRAV_USER_PATH', $path);
}
// Absolute or relative path to system folder. Defaults to GRAV_ROOT/system
// If system folder is outside of webroot, see https://github.com/getgrav/grav/issues/3297#issuecomment-810294972
if (!defined('GRAV_SYSTEM_PATH')) {
$path = rtrim(getenv('GRAV_SYSTEM_PATH') ?: 'system', DS);
define('GRAV_SYSTEM_PATH', $path);
}
// Absolute or relative path to cache folder. Defaults to GRAV_ROOT/cache
if (!defined('GRAV_CACHE_PATH')) {
$path = rtrim(getenv('GRAV_CACHE_PATH') ?: 'cache', DS);
define('GRAV_CACHE_PATH', $path);
}
// Absolute or relative path to logs folder. Defaults to GRAV_ROOT/logs
if (!defined('GRAV_LOG_PATH')) {
$path = rtrim(getenv('GRAV_LOG_PATH') ?: 'logs', DS);
define('GRAV_LOG_PATH', $path);
}
// Absolute or relative path to tmp folder. Defaults to GRAV_ROOT/tmp
if (!defined('GRAV_TMP_PATH')) {
$path = rtrim(getenv('GRAV_TMP_PATH') ?: 'tmp', DS);
define('GRAV_TMP_PATH', $path);
}
// Absolute or relative path to backup folder. Defaults to GRAV_ROOT/backup
if (!defined('GRAV_BACKUP_PATH')) {
$path = rtrim(getenv('GRAV_BACKUP_PATH') ?: 'backup', DS);
define('GRAV_BACKUP_PATH', $path);
}
unset($path);
define('USER_PATH', GRAV_USER_PATH . DS);
define('CACHE_PATH', GRAV_CACHE_PATH . DS);
define('ROOT_DIR', GRAV_ROOT . DS);
define('USER_DIR', ROOT_DIR . USER_PATH);
define('CACHE_DIR', ROOT_DIR . CACHE_PATH);
// INTERNAL: Do not use!
define('USER_DIR', GRAV_WEBROOT . '/' . GRAV_USER_PATH . '/');
define('CACHE_DIR', (!preg_match('`^(/|[a-z]:[\\\/])`ui', GRAV_CACHE_PATH) ? GRAV_ROOT . '/' : '') . GRAV_CACHE_PATH . '/');
// DEPRECATED: Do not use!
define('ASSETS_DIR', ROOT_DIR . 'assets/');
define('IMAGES_DIR', ROOT_DIR . 'images/');
define('ACCOUNTS_DIR', USER_DIR .'accounts/');
define('PAGES_DIR', USER_DIR .'pages/');
define('DATA_DIR', USER_DIR .'data/');
define('SYSTEM_DIR', ROOT_DIR .'system/');
define('LIB_DIR', SYSTEM_DIR .'src/');
define('PLUGINS_DIR', USER_DIR .'plugins/');
define('THEMES_DIR', USER_DIR .'themes/');
define('VENDOR_DIR', ROOT_DIR .'vendor/');
define('LOG_DIR', ROOT_DIR . GRAV_LOG_PATH . DS);
define('CACHE_PATH', GRAV_CACHE_PATH . DS);
define('USER_PATH', GRAV_USER_PATH . DS);
define('ROOT_DIR', GRAV_ROOT . DS);
define('ASSETS_DIR', GRAV_WEBROOT . '/assets/');
define('IMAGES_DIR', GRAV_WEBROOT . '/images/');
define('ACCOUNTS_DIR', USER_DIR . 'accounts/');
define('PAGES_DIR', USER_DIR . 'pages/');
define('DATA_DIR', USER_DIR . 'data/');
define('PLUGINS_DIR', USER_DIR . 'plugins/');
define('THEMES_DIR', USER_DIR . 'themes/');
define('SYSTEM_DIR', (!preg_match('`^(/|[a-z]:[\\\/])`ui', GRAV_SYSTEM_PATH) ? GRAV_ROOT . '/' : '') . GRAV_SYSTEM_PATH . '/');
define('LIB_DIR', SYSTEM_DIR . 'src/');
define('VENDOR_DIR', GRAV_ROOT . '/vendor/');
define('LOG_DIR', (!preg_match('`^(/|[a-z]:[\\\/])`ui', GRAV_LOG_PATH) ? GRAV_ROOT . '/' : '') . GRAV_LOG_PATH . '/');
// END DEPRECATED
// Some extensions
@@ -81,3 +99,6 @@ define('RAW_CONTENT', 1);
define('TWIG_CONTENT', 2);
define('TWIG_CONTENT_LIST', 3);
define('TWIG_TEMPLATES', 4);
// Filters
define('GRAV_SANITIZE_STRING', 5001);

BIN
system/images/watermark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@@ -2,7 +2,7 @@
/**
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -1,6 +1,17 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nالعنوان: %1$s\n---\n# خطأ: مادة أمامية غير صحيحة\n\nمسار: '%2$s'\n\n**%3$s**\n\n, , ,\n\n%4$s\n, , ,"
INFLECTOR_UNCOUNTABLE:
- 'معدّات'
- 'معلومات'
- 'أرز'
- 'مال'
- 'نوع'
- 'سلسلة'
- 'سمك'
- 'خروف'
INFLECTOR_IRREGULAR:
'person': 'أشخاص'
NICETIME:
NO_DATE_PROVIDED: لم يتم تقديم التاريخ
BAD_DATE: تاريخ خاطئ
@@ -37,9 +48,10 @@ GRAV:
YR_PLURAL: سنوات
DEC_PLURAL: عقود
FORM:
VALIDATION_FAIL: <b>فشل التحقق من صحة:</b>
INVALID_INPUT: إدخال غير صحيح في
VALIDATION_FAIL: '<b>فشل التحقق من صحة:</b>'
INVALID_INPUT: 'إدخال غير صحيح في'
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
XSS_ISSUES: "مشاكل XSS محتملة تم اكتشافها في حقل '%s' '"
MONTHS_OF_THE_YEAR:
- 'كانون الثاني'
- 'شباط'
@@ -61,3 +73,21 @@ GRAV:
- 'الجمعة'
- 'السبت'
- 'الأحد'
YES: "نعم"
NO: "لا"
CRON:
EVERY: كل
EVERY_HOUR: كل ساعة
EVERY_MINUTE: كل دقيقة
EVERY_DAY_OF_WEEK: كل يوم في الأسبوع
EVERY_DAY_OF_MONTH: كل يوم في الشهر
EVERY_MONTH: ' كل شهر'
TEXT_PERIOD: كل <b />
TEXT_MINS: ' في <b /> دقيقة(دقائق) بعد الساعة'
TEXT_TIME: ' في <b />:<b />'
TEXT_DOW: ' في <b />'
TEXT_MONTH: ' من <b />'
TEXT_DOM: ' في <b />'
ERROR1: الوسم %s غير مدعوم!
ERROR2: عدد عناصر غير صالح.
ERROR4: تعبير غير معروف

View File

@@ -36,8 +36,8 @@ GRAV:
YR_PLURAL: г
DEC_PLURAL: дстлт
FORM:
VALIDATION_FAIL: <b>Неуспешна проверка:</b>
INVALID_INPUT: Невалидно въвеждане в
VALIDATION_FAIL: '<b>Неуспешна проверка:</b>'
INVALID_INPUT: 'Невалидно въвеждане в'
MISSING_REQUIRED_FIELD: 'Липсва задължително поле:'
MONTHS_OF_THE_YEAR:
- 'януари'

View File

@@ -1,11 +1,21 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# S'ha produït un error: Frontmatter invàlid\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'informació'
- 'rice'
- 'money'
- 'species'
- 'series'
- 'fish'
- 'sheep'
NICETIME:
NO_DATE_PROVIDED: No s'ha proporcionat data
BAD_DATE: Data invàlida
AGO: abans
FROM_NOW: des d'ara
JUST_NOW: Ara mateix
SECOND: segon
MINUTE: minut
HOUR: hora
@@ -36,9 +46,10 @@ GRAV:
YR_PLURAL: anys
DEC_PLURAL: dèc.
FORM:
VALIDATION_FAIL: <b>Ha fallat la validació:</b>
INVALID_INPUT: Entrada no vàlida a
VALIDATION_FAIL: '<b>Ha fallat la validació:</b>'
INVALID_INPUT: 'Entrada no vàlida a'
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
XSS_ISSUES: "Detectats potencials problemes XSS al camp '%s'"
MONTHS_OF_THE_YEAR:
- 'Gener'
- 'Febrer'
@@ -60,3 +71,17 @@ GRAV:
- 'Divendres'
- 'Dissabte'
- 'Diumenge'
YES: "Sí"
NO: "No"
CRON:
EVERY: cada
EVERY_HOUR: cada hora
EVERY_MINUTE: cada minut
EVERY_DAY_OF_WEEK: cada dia de la setmana
EVERY_DAY_OF_MONTH: cada dia del mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
ERROR1: L'etiqueta %s no està suportada!
ERROR2: Nombre d'elements incorrecte
ERROR3: El jquery_element s'ha d'establir a la configuració de jqCron
ERROR4: Expressió no reconeguda

View File

@@ -101,9 +101,10 @@ GRAV:
YR_PLURAL: r
DEC_PLURAL: dek
FORM:
VALIDATION_FAIL: <b>Ověření se nezdařilo:</b>
INVALID_INPUT: Neplatný vstup v
VALIDATION_FAIL: '<b>Ověření se nezdařilo:</b>'
INVALID_INPUT: 'Neplatný vstup v'
MISSING_REQUIRED_FIELD: 'Chybí požadované pole:'
XSS_ISSUES: "Byly zjištěny možné problémy XSS v poli '%s'"
MONTHS_OF_THE_YEAR:
- 'leden'
- 'únor'
@@ -125,6 +126,8 @@ GRAV:
- 'pátek'
- 'sobota'
- 'neděle'
YES: "Ano"
NO: "Ne"
CRON:
EVERY: každý
EVERY_HOUR: každou hodinu

View File

@@ -1,11 +1,27 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nTitel: %1$s\n---\n\n# Fejl: Ugyldigt frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'udstyr'
- 'information'
- 'ris'
- 'penge'
- 'arter'
- 'Serier'
- 'fisk'
- 'får'
INFLECTOR_IRREGULAR:
'person': 'personer'
'man': 'mænd'
'child': 'børn'
'sex': 'køn'
'move': 'flyt'
NICETIME:
NO_DATE_PROVIDED: Ingen dato angivet
BAD_DATE: Ugyldig dato
AGO: siden
FROM_NOW: fra nu
JUST_NOW: lige nu
SECOND: sekund
MINUTE: minut
HOUR: time
@@ -15,6 +31,7 @@ GRAV:
YEAR: år
DECADE: årti
SEC: sek
MIN: min.
HR: t
WK: u
MO: md
@@ -36,8 +53,8 @@ GRAV:
YR_PLURAL: år
DEC_PLURAL: årtier
FORM:
VALIDATION_FAIL: <b>Validering mislykkedes:</b>
INVALID_INPUT: Ugyldigt input i
VALIDATION_FAIL: '<b>Validering mislykkedes:</b>'
INVALID_INPUT: 'Ugyldigt input i'
MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:'
MONTHS_OF_THE_YEAR:
- 'januar'
@@ -60,3 +77,14 @@ GRAV:
- 'fredag'
- 'lørdag'
- 'søndag'
CRON:
EVERY: hver
EVERY_HOUR: hver time
EVERY_MINUTE: hvert minut
EVERY_DAY_OF_WEEK: alle ugens dage
EVERY_DAY_OF_MONTH: alle dage i måneden
EVERY_MONTH: hver måned
TEXT_PERIOD: Hver <b />
TEXT_MINS: ' ved <b /> minut(ter) over timen'
ERROR1: Tagget %s understøttes ikke!
ERROR2: Ugyldigt antal elementer

View File

@@ -101,9 +101,10 @@ GRAV:
YR_PLURAL: Jahre
DEC_PLURAL: Jahrzehnten
FORM:
VALIDATION_FAIL: <b>Überprüfung fehlgeschlagen:</b>
INVALID_INPUT: Ungültige Eingabe in
VALIDATION_FAIL: '<b>Überprüfung fehlgeschlagen:</b>'
INVALID_INPUT: 'Ungültige Eingabe in'
MISSING_REQUIRED_FIELD: 'Erforderliches Feld fehlt:'
XSS_ISSUES: "Potenzielle XSS-Probleme im Feld '%s' erkannt"
MONTHS_OF_THE_YEAR:
- 'Januar'
- 'Februar'
@@ -125,6 +126,8 @@ GRAV:
- 'Freitag'
- 'Samstag'
- 'Sonntag'
YES: "Ja"
NO: "Nein"
CRON:
EVERY: jede
EVERY_HOUR: jede Stunde

View File

@@ -1,11 +1,75 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nΤίτλος: %1$s\n---\n\n# Σφάλμα: Μη έγκυρη διαδρομή Frontmatter\n\nΔιαδρομή: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'εξοπλισμός'
- 'πληροφοριες'
- 'rice'
- 'χρήματα'
- 'είδη'
- 'σειρές'
- 'ψάρι'
- 'πρόβατο'
INFLECTOR_IRREGULAR:
'person': 'άνθρωποι'
'man': 'άνδρες'
'child': 'παιδιά'
'sex': 'φύλο'
'move': 'κινήσεις'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: Δεν δόθηκε καμία ημερομηνία
BAD_DATE: Εσφαλμένη ημερομηνία
AGO: πρίν
FROM_NOW: από τώρα
JUST_NOW: μόλις τώρα
SECOND: δευτερόλεπτο
MINUTE: λεπτό
HOUR: ώρα
@@ -37,8 +101,8 @@ GRAV:
YR_PLURAL: έτη
DEC_PLURAL: δεκαετίες
FORM:
VALIDATION_FAIL: <b>Η επικύρωση απέτυχε:</b>
INVALID_INPUT: Μη έγκυρα δεδομένα σε
VALIDATION_FAIL: '<b>Η επικύρωση απέτυχε:</b>'
INVALID_INPUT: 'Μη έγκυρα δεδομένα σε'
MISSING_REQUIRED_FIELD: 'Λείπει το απαιτούμενο πεδίο:'
MONTHS_OF_THE_YEAR:
- 'Ιανουάριος'
@@ -61,3 +125,20 @@ GRAV:
- 'Παρασκευή'
- 'Σάββατο'
- 'Κυριακή'
CRON:
EVERY: κάθε
EVERY_HOUR: κάθε ώρα
EVERY_MINUTE: κάθε λεπτό
EVERY_DAY_OF_WEEK: κάθε μέρα της εβδομάδος
EVERY_DAY_OF_MONTH: κάθε μέρα του μήνα
EVERY_MONTH: κάθε μήνα
TEXT_PERIOD: Κάθε <b />
TEXT_MINS: ' κατά <b /> λεπτό(ά) μετά την ώρα'
TEXT_TIME: ' στο <b />:<b />'
TEXT_DOW: ' στις <b />'
TEXT_MONTH: ' από <b />'
TEXT_DOM: ' στις <b />'
ERROR1: Η ετικέτα %s δεν υποστηρίζεται!
ERROR2: Μη έγκυρος αριθμός στοιχείων
ERROR3: Το jquery_element θα έπρεπε να οριστεί στις ρυθμίσεις του jqCron
ERROR4: Μη αναγνωρισμένη έκφραση

View File

@@ -1,19 +1,25 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntítulo: %1$s\n---\n\n# Error: Frontmatter no válido\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
FRONTMATTER_ERROR_PAGE: "---\ntítulo: %1$s\n---\n\n# Error: Prefacio no válido\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1ios'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_UNCOUNTABLE:
- 'equipo'
- 'equipamiento'
- 'información'
- 'rice'
- 'arroz'
- 'dinero'
- 'species'
- 'especies'
- 'series'
- 'pescado'
- 'oveja'
INFLECTOR_IRREGULAR:
'person': 'personas'
'man': 'hombres'
'child': 'niños'
'sex': 'sexos'
'move': 'movido'
INFLECTOR_ORDINALS:
'first': 'ro'
'second': 'do'
@@ -33,10 +39,12 @@ GRAV:
YEAR: año
DECADE: década
SEC: seg
MIN: min
HR: h
WK: sem
MO: mes
YR: año
DEC: déc
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
@@ -46,6 +54,7 @@ GRAV:
YEAR_PLURAL: años
DECADE_PLURAL: décadas
SEC_PLURAL: segs
MIN_PLURAL: mins
HR_PLURAL: hs
WK_PLURAL: sem
MO_PLURAL: mes
@@ -55,6 +64,7 @@ GRAV:
VALIDATION_FAIL: '<b>Falló la validación: </b>'
INVALID_INPUT: 'Dato inválido en: '
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
XSS_ISSUES: "Se detectaron potenciales problemas XSS en el campo '%s'"
MONTHS_OF_THE_YEAR:
- 'Enero'
- 'Febrero'
@@ -76,6 +86,8 @@ GRAV:
- 'Viernes'
- 'Sábado'
- 'Domingo'
YES: "Sí"
NO: "No"
CRON:
EVERY: cada
EVERY_HOUR: cada hora
@@ -84,12 +96,12 @@ GRAV:
EVERY_DAY_OF_MONTH: cada día del mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
TEXT_MINS: ' a <b /> minuto(s) despues de la hora'
TEXT_MINS: ' a <b /> minuto(s) después de la hora'
TEXT_TIME: ' a <b />:<b />'
TEXT_DOW: ' en <b />'
TEXT_MONTH: ' de<b />'
TEXT_DOM: ' en<b />'
ERROR1: La etiqueta %s no está soportada!
ERROR2: El número de elementos es erroneo
ERROR1: La etiqueta %s no está soportada!'
ERROR2: El número de elementos es erróneo
ERROR3: El jquery_element debería establecerse en la configuración del jqCron
ERROR4: Expresión no reconocida

View File

@@ -1,11 +1,22 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\npealkiri: %1$s\n---\n\n# Viga: vigane Frontmatter'i\n\nasukoht: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(octop|vir)us$/i': '\1i'
INFLECTOR_SINGULAR:
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/(x|ch|ss|sh)es$/i': '\1'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'informatsioon'
- 'rice'
- 'money'
- 'riis'
- 'raha'
- 'species'
- 'series'
- 'kala'
@@ -34,6 +45,7 @@ GRAV:
YEAR: aasta
DECADE: 10 aastat
SEC: sek
MIN: min
HR: t
WK: näd
MO: k.
@@ -55,7 +67,7 @@ GRAV:
YR_PLURAL: aastat
DEC_PLURAL: dek.
FORM:
VALIDATION_FAIL: <b>Kinnitamine nurjus:</b>
VALIDATION_FAIL: '<b>Kinnitamine nurjus:</b>'
INVALID_INPUT: 'Vigane sisend:'
MISSING_REQUIRED_FIELD: 'Nõutud väli puudub:'
MONTHS_OF_THE_YEAR:
@@ -81,5 +93,12 @@ GRAV:
- 'pühapäev'
CRON:
EVERY: iga
EVERY_HOUR: iga tund
EVERY_MINUTE: iga minut
EVERY_DAY_OF_WEEK: iga nädala päev
EVERY_MONTH: iga kuu
TEXT_PERIOD: Iga <b />
ERROR1: Silt %s pole toetatud!
ERROR2: Vale elementide arv
ERROR3: jqCron seadetes peaks olema määratud jquery_element
ERROR4: Tundmatu väljend

View File

@@ -36,8 +36,8 @@ GRAV:
YR_PLURAL: urt
DEC_PLURAL: ham
FORM:
VALIDATION_FAIL: <b>Balidazioak huts egin du</b>
INVALID_INPUT: Baliogabeko sarrera
VALIDATION_FAIL: '<b>Balidazioak huts egin du</b>'
INVALID_INPUT: 'Baliogabeko sarrera'
MISSING_REQUIRED_FIELD: 'Derrigorrezko eremua bete gabe:'
MONTHS_OF_THE_YEAR:
- 'Urtarrila'

View File

@@ -36,8 +36,8 @@ GRAV:
YR_PLURAL: سال
DEC_PLURAL: دهه
FORM:
VALIDATION_FAIL: <b>سنجش اعتبار ناموفق بود</b>
INVALID_INPUT: ورودی نامعتبر در
VALIDATION_FAIL: '<b>سنجش اعتبار ناموفق بود</b>'
INVALID_INPUT: 'ورودی نامعتبر در'
MISSING_REQUIRED_FIELD: 'قسمت ضروری جا افتاده:'
MONTHS_OF_THE_YEAR:
- 'ژانویه'

View File

@@ -100,8 +100,8 @@ GRAV:
YR_PLURAL: v
DEC_PLURAL: vuosikymmentä
FORM:
VALIDATION_FAIL: <b>Vahvistus epäonnistui:</b>
INVALID_INPUT: Syöte ei kelpaa
VALIDATION_FAIL: '<b>Vahvistus epäonnistui:</b>'
INVALID_INPUT: 'Syöte ei kelpaa'
MISSING_REQUIRED_FIELD: 'Puuttuva pakollinen kenttä:'
MONTHS_OF_THE_YEAR:
- 'Tammikuu'

View File

@@ -16,6 +16,7 @@ GRAV:
'/(buffal|tomat)o$/i': '\1es'
'/(bu)s$/i': 'Bus'
'/(alias|status)/i': 'alias|status'
'/(octop|vir)us$/i': 'virus'
'/(ax|test)is$/i': '\1s'
'/s$/i': 's'
'/$/': 's'
@@ -23,6 +24,7 @@ GRAV:
'/(quiz)zes$/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(n)ews$/i': '\1ouvelles'
INFLECTOR_UNCOUNTABLE:
- 'équipement'
- 'information'
@@ -57,10 +59,10 @@ GRAV:
MONTH: mois
YEAR: année
DECADE: décennie
SEC: s
MIN: m
HR: h
WK: sem
SEC: sec.
MIN: min.
HR: hr.
WK: sem.
MO: m
YR: an
DEC: déc
@@ -80,30 +82,33 @@ GRAV:
YR_PLURAL: a
DEC_PLURAL: décs
FORM:
VALIDATION_FAIL: <b>La validation a échoué :</b>
INVALID_INPUT: Saisie non valide
VALIDATION_FAIL: '<b>La validation a échoué :</b>'
INVALID_INPUT: 'Saisie non valide'
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
XSS_ISSUES: "Erreurs XSS probablement détectées dans le champ '%s'"
MONTHS_OF_THE_YEAR:
- 'Janvier'
- 'Février'
- 'Mars'
- 'Avril'
- 'Mai'
- 'Juin'
- 'Juillet'
- 'Août'
- 'Septembre'
- 'Octobre'
- 'Novembre'
- 'Décembre'
- 'janvier'
- 'février'
- 'mars'
- 'avril'
- 'mai'
- 'juin'
- 'juillet'
- 'août'
- 'septembre'
- 'octobre'
- 'novembre'
- 'décembre'
DAYS_OF_THE_WEEK:
- 'Lundi'
- 'Mardi'
- 'Mercredi'
- 'Jeudi'
- 'Vendredi'
- 'Samedi'
- 'Dimanche'
- 'lundi'
- 'mardi'
- 'mercredi'
- 'jeudi'
- 'vendredi'
- 'samedi'
- 'dimanche'
YES: "Oui"
NO: "Non"
CRON:
EVERY: chaque
EVERY_HOUR: toutes les heures
@@ -117,7 +122,7 @@ GRAV:
TEXT_DOW: ' sur <b/>'
TEXT_MONTH: ' de <b />'
TEXT_DOM: ' sur <b/>'
ERROR1: La balise %s n'est pas supportée!
ERROR1: La balise %s n'est pas prise en charge !
ERROR2: Nombre invalide d'éléments
ERROR3: L'élément jquery_element doit être défini dans les paramètres jqCron
ERROR4: Expression non reconnue

147
system/languages/gl.yaml Normal file
View File

@@ -0,0 +1,147 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntítulo: %1$s\n---\n\n# Erro: Limiar incorrecto\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1'
'/(octop|vir)us$/i': '\1'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1ces'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1'
'/(cris|ax|test)es$/i': '\1es'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1se'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2se'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'equipo'
- 'información'
- 'arroz'
- 'diñeiro'
- 'especies'
- 'series'
- 'peixe'
- 'ovella'
INFLECTOR_IRREGULAR:
'person': 'xente'
'man': 'home'
'child': 'neno'
'sex': 'sexos'
'move': 'move'
INFLECTOR_ORDINALS:
'default': 'º'
'first': 'º'
'second': 'º'
'third': 'º'
NICETIME:
NO_DATE_PROVIDED: Non fornece unha data
BAD_DATE: Data errada
AGO: hai
FROM_NOW: dende agora
JUST_NOW: xusto agora
SECOND: segundo
MINUTE: minuto
HOUR: hora
DAY: día
WEEK: semana
MONTH: mes
YEAR: ano
DECADE: década
SEC: seg
MIN: min
HR: hr
WK: Sem
MO: m
YR: a
DEC: dec
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
DAY_PLURAL: días
WEEK_PLURAL: semanas
MONTH_PLURAL: meses
YEAR_PLURAL: anos
DECADE_PLURAL: décadas
SEC_PLURAL: segs
MIN_PLURAL: mins
HR_PLURAL: hrs
WK_PLURAL: sem
MO_PLURAL: mes
YR_PLURAL: a
DEC_PLURAL: deca
FORM:
VALIDATION_FAIL: '<b>Fallou a validación:</b>'
INVALID_INPUT: 'Entrada incorrecta en'
MISSING_REQUIRED_FIELD: 'Falta un campo requirido:'
XSS_ISSUES: "Detectáronse posibles problemas XSS no campo '% s'"
MONTHS_OF_THE_YEAR:
- 'xaneiro'
- 'febreiro'
- 'marzo'
- 'abril'
- 'maio'
- 'xuño'
- 'xullo'
- 'agosto'
- 'setembro'
- 'outubro'
- 'novembro'
- 'decembro'
DAYS_OF_THE_WEEK:
- 'luns'
- 'martes'
- 'mércores'
- 'xoves'
- 'venres'
- 'sábado'
- 'domingo'
YES: "Si"
NO: "Non"
CRON:
EVERY: cada
EVERY_HOUR: Cada hora
EVERY_MINUTE: Cada minuto
EVERY_DAY_OF_WEEK: cada día da semana
EVERY_DAY_OF_MONTH: cada día do mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
TEXT_MINS: ' dentro de <b /> minuto(s) despois da hora'
TEXT_TIME: ' dentro <b />:<b />'
TEXT_DOW: ' o <b />'
TEXT_MONTH: ' de <b />'
TEXT_DOM: ' o <b />'
ERROR1: A etiqueta %s non é compatíbel!
ERROR2: Mal número de elementos
ERROR3: O jquery_element debería estar determinado na configuración de jqCron
ERROR4: Expresión non recoñecida

View File

@@ -37,8 +37,8 @@ GRAV:
YR_PLURAL: שני'
DEC_PLURAL: עש'
FORM:
VALIDATION_FAIL: <b>האימות נכשל:</b>
INVALID_INPUT: קלט לא חוקי
VALIDATION_FAIL: '<b>האימות נכשל:</b>'
INVALID_INPUT: 'קלט לא חוקי'
MISSING_REQUIRED_FIELD: 'שדות חובה חסרים:'
MONTHS_OF_THE_YEAR:
- 'ינואר'

View File

@@ -50,8 +50,8 @@ GRAV:
YR_PLURAL: g
DEC_PLURAL: des
FORM:
VALIDATION_FAIL: <b>Validacija nije uspjela:</b>
INVALID_INPUT: Pogrešan unos u
VALIDATION_FAIL: '<b>Validacija nije uspjela:</b>'
INVALID_INPUT: 'Pogrešan unos u'
MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:'
MONTHS_OF_THE_YEAR:
- 'Siječanj'

View File

@@ -58,7 +58,7 @@ GRAV:
YR_PLURAL: év
DEC_PLURAL: évt
FORM:
VALIDATION_FAIL: <b>Érvényesítés nem sikerült:</b>
VALIDATION_FAIL: '<b>Érvényesítés nem sikerült:</b>'
INVALID_INPUT: 'A megadott érték érvénytelen:'
MISSING_REQUIRED_FIELD: 'Ez a kötelező mező nincs kitöltve:'
MONTHS_OF_THE_YEAR:

View File

@@ -1,26 +1,74 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Frontmatter tidak valid\n\nLokasi: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'peralatan'
- 'informasi'
- 'nasi'
- 'uang'
- 'spesies'
- 'rangkaian'
- 'ikan'
- 'domba'
- 'Peralatan'
- 'Informasi '
- 'Nasi'
- 'Uang'
- 'Jenis'
- 'Seri'
- 'Ikan'
- 'Domba'
INFLECTOR_IRREGULAR:
'person': 'orang-orang'
'man': 'laki-laki'
'child': 'anak-anak'
'sex': 'jenis kelamin'
'person': 'Orang-orang'
'man': 'Pria'
'child': 'Balita'
'sex': 'Jenis Kelamin'
'move': 'pindahkan'
INFLECTOR_ORDINALS:
'default': 'ke'
'first': 'pertama'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: Tanggal tidak tersedia
NO_DATE_PROVIDED: Tidak ada tanggal yang disediakan
BAD_DATE: Format tanggal salah
AGO: yang lalu
FROM_NOW: dari saat ini
FROM_NOW: dari sekarang
JUST_NOW: baru saja
SECOND: detik
MINUTE: menit
@@ -30,12 +78,12 @@ GRAV:
MONTH: bulan
YEAR: tahun
DECADE: dekade
SEC: dtk
MIN: mnt
HR: j
WK: mng
MO: bln
YR: thn
SEC: detik
MIN: menit
HR: ' jam'
WK: minggu
MO: bulan
YR: tahun
DEC: desimal
SECOND_PLURAL: detik
MINUTE_PLURAL: menit
@@ -45,17 +93,18 @@ GRAV:
MONTH_PLURAL: bulan
YEAR_PLURAL: tahun
DECADE_PLURAL: dekade
SEC_PLURAL: dtk
MIN_PLURAL: mnt
HR_PLURAL: j
WK_PLURAL: mgg
MO_PLURAL: bln
YR_PLURAL: thn
SEC_PLURAL: detik
MIN_PLURAL: menit
HR_PLURAL: jam
WK_PLURAL: minggu
MO_PLURAL: bulan
YR_PLURAL: tahun
DEC_PLURAL: dekade
FORM:
VALIDATION_FAIL: <b>Validasi gagal:</b>
INVALID_INPUT: Input tidak valid di
VALIDATION_FAIL: '<b>Validasi gagal:</b>'
INVALID_INPUT: 'Input tidak valid di'
MISSING_REQUIRED_FIELD: 'Data yang diperlukan belum terisi:'
XSS_ISSUES: "Isu berpotensial XSS terdeteksi dalam baris %s"
MONTHS_OF_THE_YEAR:
- 'Januari'
- 'Februari'
@@ -74,22 +123,25 @@ GRAV:
- 'Selasa'
- 'Rabu'
- 'Kamis'
- 'Jumat'
- 'Jum''at'
- 'Sabtu'
- 'Minggu'
YES: "Ya"
NO: "Tidak"
CRON:
EVERY: Setiap
EVERY_HOUR: Setiap jam
EVERY_MINUTE: Setiap menit
EVERY_DAY_OF_WEEK: Setiap hari selama seminggu
EVERY_DAY_OF_MONTH: pada tanggal setiap bulannya
EVERY_DAY_OF_MONTH: Setiap hari dalam sebulan
EVERY_MONTH: setiap bulan
TEXT_PERIOD: Setiap <b />
TEXT_MINS: 'dalam <b /> menit setelah jam yang lalu'
TEXT_TIME: ' pada <b />:<b />'
TEXT_DOW: ' pada <b />'
TEXT_MONTH: ' pada <b />'
TEXT_DOM: ' pada <b />'
ERROR1: Tag %s tidak didukung!
ERROR2: Jumlah elemen tidak valid
ERROR3: jquery_element harus ditetapkan ke pengaturan jqCron
ERROR4: Ekspresi tidak dikenali
ERROR2: Jumlah elemen yang buruk
ERROR3: jquery_element harus diatur ke dalam pengaturan jqCron
ERROR4: Ekspresi tidak dikenal

View File

@@ -46,8 +46,8 @@ GRAV:
YR_PLURAL: árum
DEC_PLURAL: árat
FORM:
VALIDATION_FAIL: <b>Sannvottun mistókst:</b>
INVALID_INPUT: Ógilt inntak í
VALIDATION_FAIL: '<b>Sannvottun mistókst:</b>'
INVALID_INPUT: 'Ógilt inntak í'
MISSING_REQUIRED_FIELD: 'Vantar nauðsynlegan reit:'
MONTHS_OF_THE_YEAR:
- 'janúar'

View File

@@ -1,6 +1,49 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'dotazione'
- 'informazione'
@@ -58,9 +101,10 @@ GRAV:
YR_PLURAL: anni
DEC_PLURAL: decenni
FORM:
VALIDATION_FAIL: <b>Validazione fallita:</b>
INVALID_INPUT: Input non valido in
VALIDATION_FAIL: '<b>Validazione fallita:</b>'
INVALID_INPUT: 'Input non valido in'
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
XSS_ISSUES: "Rilevati potenziali problemi di XSS nel campo '%s'"
MONTHS_OF_THE_YEAR:
- 'Gennaio'
- 'Febbraio'
@@ -82,6 +126,8 @@ GRAV:
- 'Venerdì'
- 'Sabato'
- 'Domenica'
YES: "Sì"
NO: "No"
CRON:
EVERY: ogni
EVERY_HOUR: ogni ora

View File

@@ -1,11 +1,22 @@
---
GRAV:
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- '情報'
- 'rice'
- 'お金'
- 'species'
- 'series'
- '魚'
- 'ヒツジ'
INFLECTOR_IRREGULAR:
'person': 'みんな'
'man': '人'
'child': '子供'
'sex': '性別'
'move': '移動'
INFLECTOR_ORDINALS:
'first': '番目'
NICETIME:
NO_DATE_PROVIDED: 日付が設定されていません
BAD_DATE: 不正な日付
@@ -40,8 +51,8 @@ GRAV:
YR_PLURAL:
DEC_PLURAL: 10年
FORM:
VALIDATION_FAIL: <b>バリデーション失敗 :</b>
INVALID_INPUT: 不正な入力:
VALIDATION_FAIL: '<b>バリデーション失敗 :</b>'
INVALID_INPUT: '不正な入力:'
MISSING_REQUIRED_FIELD: '必須項目が入力されていません:'
MONTHS_OF_THE_YEAR:
- '1月'
@@ -64,3 +75,7 @@ GRAV:
- '金'
- '土'
- '日'
CRON:
EVERY:
EVERY_MONTH: 毎月
ERROR1: 共有タイプ %s はサポートされていません

View File

@@ -37,8 +37,8 @@ GRAV:
YR_PLURAL:
DEC_PLURAL: 년간
FORM:
VALIDATION_FAIL: <b>유효성 검사 실패:</b>
INVALID_INPUT: 잘못된 입력
VALIDATION_FAIL: '<b>유효성 검사 실패:</b>'
INVALID_INPUT: '잘못된 입력'
MISSING_REQUIRED_FIELD: '누락 된 필수 필드:'
MONTHS_OF_THE_YEAR:
- '일월'

View File

@@ -52,8 +52,8 @@ GRAV:
YR_PLURAL: m.
DEC_PLURAL: dešimtmečiai
FORM:
VALIDATION_FAIL: <b>Patvirtinimas nepavyko:</b>
INVALID_INPUT: Neteisingai įvesta į
VALIDATION_FAIL: '<b>Patvirtinimas nepavyko:</b>'
INVALID_INPUT: 'Neteisingai įvesta į'
MISSING_REQUIRED_FIELD: 'Būtina užpildyti laukelį:'
MONTHS_OF_THE_YEAR:
- 'Sausis'

147
system/languages/mn.yaml Normal file
View File

@@ -0,0 +1,147 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nГарчиг: %1$s\n---\n\n# Алдаа: Буруу Формат\n\nЗам: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1зүүд'
'/^(ox)$/i': '\1ууд'
'/([m|l])ouse$/i': '\1ууд'
'/(matr|vert|ind)ix|ex$/i': '\1иксүүд'
'/(x|ch|ss|sh)$/i': '\1үүд'
'/([^aeiouy]|qu)ies$/i': '\1үүд'
'/([^aeiouy]|qu)y$/i': '\1үүд'
'/(hive)$/i': '\1үүд'
'/(?:([^f])fe|([lr])f)$/i': '\1\2үүд'
'/sis$/i': 'үүд'
'/([ti])um$/i': '\1үүд'
'/(buffal|tomat)o$/i': '\1үүд'
'/(bu)s$/i': '\1үүд'
'/(alias|status)/i': '\1үүд'
'/(octop|vir)us$/i': '\1үүд'
'/(ax|test)is$/i': '\1үүд'
'/s$/i': 'үүд'
'/$/': 'үүд'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1икс'
'/(vert|ind)ices$/i': '\1икс'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1'
'/(cris|ax|test)es$/i': '\1'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1'
'/(s)eries$/i': '\1'
'/([^aeiouy]|qu)ies$/i': '\1үүд'
'/([lr])ves$/i': '\1'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1'
'/(^analy)ses$/i': '\1'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2үүд'
'/([ti])a$/i': '\1'
'/(n)ews$/i': '\1'
INFLECTOR_UNCOUNTABLE:
- 'тоног төхөөрөмж'
- 'Мэдээлэл'
- 'будаа'
- 'мөнгө'
- 'төрөл зүйл'
- 'цуврал'
- 'загас'
- 'хонь'
INFLECTOR_IRREGULAR:
'person': 'хүмүүс'
'man': 'эрчүүд'
'child': 'хүүхэд'
'sex': 'хүйс'
'move': 'хөдөлгөөн'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: Огноо алга
BAD_DATE: Буруу огноо
AGO: өмнө
FROM_NOW: одооноос
JUST_NOW: дөнгөж сая
SECOND: секунд
MINUTE: минут
HOUR: цаг
DAY: өдөр
WEEK: долоо хоног
MONTH: сар
YEAR: он
DECADE: арван жил
SEC: сек
MIN: мин
HR: цаг
WK: д.х.
MO: сар
YR: он
DEC: арван жил
SECOND_PLURAL: секунд
MINUTE_PLURAL: минут
HOUR_PLURAL: цаг
DAY_PLURAL: өдрүүд
WEEK_PLURAL: долоо хоногууд
MONTH_PLURAL: сарууд
YEAR_PLURAL: онууд
DECADE_PLURAL: арван жилүүд
SEC_PLURAL: сек.-үүд
MIN_PLURAL: мин.-ууд
HR_PLURAL: цагууд
WK_PLURAL: д.х.-ууд
MO_PLURAL: сарууд
YR_PLURAL: жилүүд
DEC_PLURAL: арван жилүүд
FORM:
VALIDATION_FAIL: '<b>Баталгаажуулалт амжилтгүй боллоо:</b>'
INVALID_INPUT: 'Буруу өгөгдөл дараахид'
MISSING_REQUIRED_FIELD: 'Шаардлагатай талбар дутуу байна:'
XSS_ISSUES: "'%s' талбарт XSS -ийн болзошгүй асуудлууд илэрсэн"
MONTHS_OF_THE_YEAR:
- '1-р сар'
- '2-р сар'
- '3-р сар'
- '4-р сар'
- '5 сар'
- '6 сар'
- '7 сар'
- '8 сар'
- '9 сар'
- '10 сар'
- '11 сар'
- '12 сар'
DAYS_OF_THE_WEEK:
- 'Даваа гараг'
- 'Мягмар гараг'
- 'Лхагва гараг'
- 'Пүрэв гараг'
- 'Баасан гараг'
- 'Бямба гараг'
- 'Ням гараг'
YES: "Тийм"
NO: "Үгүй"
CRON:
EVERY: бүрийн
EVERY_HOUR: цаг бүрийн
EVERY_MINUTE: минут бүрийн
EVERY_DAY_OF_WEEK: долоо хоногийн өдөр болгонд
EVERY_DAY_OF_MONTH: сарын өдөр болгонд
EVERY_MONTH: сар болгон
TEXT_PERIOD: Бүрийн <b />
TEXT_MINS: ' <b /> энэ сүүлийн цагийн минутад'
TEXT_TIME: ' <b />:<b /> -д'
TEXT_DOW: ' <b /> -д'
TEXT_MONTH: ' <b /> -ын'
TEXT_DOM: ' <b /> -т'
ERROR1: '%s -н утга нь дэмжигддэггүй!'
ERROR2: Элементүүдийн тоо хэмжээ буруу
ERROR3: jquery_element нь jqCron тохиргоонд хийгдсэн байх ёстой
ERROR4: Танигдаагүй илэрхийлэл

View File

@@ -101,8 +101,8 @@ GRAV:
YR_PLURAL: jaren
DEC_PLURAL: decennia
FORM:
VALIDATION_FAIL: <b>Validatie mislukt:</b>
INVALID_INPUT: Ongeldige invoer in
VALIDATION_FAIL: '<b>Validatie mislukt:</b>'
INVALID_INPUT: 'Ongeldige invoer in'
MISSING_REQUIRED_FIELD: 'Ontbrekend verplicht veld:'
MONTHS_OF_THE_YEAR:
- 'Januari'

View File

@@ -21,6 +21,7 @@ GRAV:
BAD_DATE: Ugyldig dato
AGO: siden
FROM_NOW: fra nå
JUST_NOW: akkurat nå
SECOND: sekund
MINUTE: minutt
HOUR: time
@@ -51,8 +52,8 @@ GRAV:
YR_PLURAL: år
DEC_PLURAL: årtier
FORM:
VALIDATION_FAIL: <b>Godkjenning mislyktes:</b>
INVALID_INPUT: Ugyldig innhold i
VALIDATION_FAIL: '<b>Godkjenning mislyktes:</b>'
INVALID_INPUT: 'Ugyldig innhold i'
MISSING_REQUIRED_FIELD: 'Mangler påkrevd felt:'
MONTHS_OF_THE_YEAR:
- 'januar'
@@ -75,3 +76,7 @@ GRAV:
- 'fredag'
- 'lørdag'
- 'søndag'
CRON:
EVERY: hver
EVERY_HOUR: hver time
EVERY_MINUTE: hvert minutt

View File

@@ -1,11 +1,32 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Nieprawidłowy Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_SINGULAR:
'/(alias|status)es$/i': '\1'
INFLECTOR_UNCOUNTABLE:
- 'wyposażenie'
- 'informacja'
- 'rice'
- 'pieniądze'
- 'species'
- 'series'
- 'ryba'
- 'owca'
INFLECTOR_IRREGULAR:
'person': 'człowiek'
'man': 'mężczyźni'
'child': 'dzieci'
'sex': 'płci'
INFLECTOR_ORDINALS:
'first': 'pierwszy'
'second': 'drugi'
'third': 'trzeci'
NICETIME:
NO_DATE_PROVIDED: Nie podano daty
BAD_DATE: Zła data
AGO: temu
FROM_NOW: od teraz
JUST_NOW: właśnie teraz
SECOND: sekunda
MINUTE: minuta
HOUR: godzina
@@ -15,6 +36,7 @@ GRAV:
YEAR: rok
DECADE: dekada
SEC: sek
MIN: minuta
HR: godz
WK: tydz
MO: m-c
@@ -36,9 +58,10 @@ GRAV:
YR_PLURAL: lat
DEC_PLURAL: dekad
FORM:
VALIDATION_FAIL: <b>Weryfikacja nie powiodła się:</b>
INVALID_INPUT: Nieprawidłowe dane wejściowe
VALIDATION_FAIL: '<b>Weryfikacja nie powiodła się:</b>'
INVALID_INPUT: 'Nieprawidłowe dane wejściowe'
MISSING_REQUIRED_FIELD: 'Opuszczono wymagane pole:'
XSS_ISSUES: "Potencjalne problemy XSS wykryte w polu '%s'"
MONTHS_OF_THE_YEAR:
- 'Styczeń'
- 'Luty'
@@ -60,3 +83,18 @@ GRAV:
- 'Piątek'
- 'Sobota'
- 'Niedziela'
YES: "Tak"
NO: "Nie"
CRON:
EVERY: każdy
EVERY_HOUR: każdą godzinę
EVERY_MINUTE: każdą minutę
EVERY_DAY_OF_WEEK: każdego dnia tygodnia
EVERY_DAY_OF_MONTH: każdego dnia miesiące
EVERY_MONTH: każdego miesiąca
TEXT_PERIOD: Każdego <b />
TEXT_MINS: 'o <b /> minut po godzinie'
TEXT_TIME: 'o <b />:<b />'
ERROR1: Znacznik %s nie jest wspierany!
ERROR2: Nieprawidłowa liczba elementów
ERROR4: Wyrażenie nierozpoznane

View File

@@ -1,8 +1,75 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Erro: Frontmatter Inválido\n\nLocalização: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'equipamento'
- 'informação'
- 'arroz'
- 'dinheiro'
- 'espécie'
- 'série'
- 'peixe'
- 'ovelha'
INFLECTOR_IRREGULAR:
'person': 'pessoas'
'man': 'homens'
'child': 'crianças'
'sex': 'sexos'
'move': 'movimentos'
INFLECTOR_ORDINALS:
'default': 'º'
'first': 'º'
'second': 'º'
'third': 'º'
NICETIME:
NO_DATE_PROVIDED: Nenhuma data fornecida
BAD_DATE: Data inválida
AGO: atrás
FROM_NOW: a partir de agora
JUST_NOW: mesmo agora
SECOND: segundo
MINUTE: minuto
HOUR: hora
@@ -11,17 +78,33 @@ GRAV:
MONTH: mês
YEAR: ano
DECADE: década
SEC: segundos
MIN: minutos
SEC: seg
MIN: min
HR: hora
WK: semana
MO: mês
YR: ano
DEC: década
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
DAY_PLURAL: dias
WEEK_PLURAL: semanas
MONTH_PLURAL: meses
YEAR_PLURAL: anos
DECADE_PLURAL: decadas
DECADE_PLURAL: décadas
SEC_PLURAL: segs
MIN_PLURAL: mins
HR_PLURAL: hrs
WK_PLURAL: sems
MO_PLURAL: meses
YR_PLURAL: anos
DEC_PLURAL: décadas
FORM:
VALIDATION_FAIL: <b>Falha na validação!</b>
MISSING_REQUIRED_FIELD: 'Campo obrigatório requerido:'
VALIDATION_FAIL: '<b>Falha na validação:</b>'
INVALID_INPUT: 'Dados inseridos são inválidos em'
MISSING_REQUIRED_FIELD: 'Campo obrigatório em falta:'
XSS_ISSUES: "Potenciais problemas de XSS detectados no campo '%s'"
MONTHS_OF_THE_YEAR:
- 'Janeiro'
- 'Fevereiro'
@@ -35,12 +118,30 @@ GRAV:
- 'Outubro'
- 'Novembro'
- 'Dezembro'
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'information'
- 'arroz'
- 'money'
- 'species'
- 'series'
- 'fish'
- 'sheep'
DAYS_OF_THE_WEEK:
- 'Segunda-feira'
- 'Terça-feira'
- 'Quarta-feira'
- 'Quinta-feira'
- 'Sexta-feira'
- 'Sábado'
- 'Domingo'
YES: "Sim"
NO: "Não"
CRON:
EVERY: cada
EVERY_HOUR: cada hora
EVERY_MINUTE: cada minuto
EVERY_DAY_OF_WEEK: todos os dias da semana
EVERY_DAY_OF_MONTH: todos os dias do mês
EVERY_MONTH: todos os meses
TEXT_PERIOD: Cada <b />
TEXT_MINS: ' em <b /> minuto(s) após a hora'
TEXT_TIME: ' em <b />:<b />'
TEXT_DOW: ' em <b />'
TEXT_MONTH: ' de <b />'
TEXT_DOM: ' em <b />'
ERROR1: A tag %s não é suportada!
ERROR2: Número de elementos inválido
ERROR3: O jquery_element deve ser definido nas configurações do jqCron
ERROR4: Expressão não reconhecida

View File

@@ -53,8 +53,8 @@ GRAV:
YR_PLURAL: ani
DEC_PLURAL: decenii
FORM:
VALIDATION_FAIL: <b>Validare nereușită</b>
INVALID_INPUT: Date incorecte în
VALIDATION_FAIL: '<b>Validare nereușită</b>'
INVALID_INPUT: 'Date incorecte în'
MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:'
MONTHS_OF_THE_YEAR:
- 'Ianuarie'

View File

@@ -13,7 +13,7 @@ GRAV:
INFLECTOR_IRREGULAR:
'person': 'люди'
'man': 'человек'
'child': 'ребенок'
'child': 'дети'
'sex': 'пол'
'move': 'движется'
INFLECTOR_ORDINALS:
@@ -58,9 +58,10 @@ GRAV:
YR_PLURAL: г
DEC_PLURAL: дстлт
FORM:
VALIDATION_FAIL: <b>Проверка не удалась:</b>
INVALID_INPUT: Неверный ввод в
VALIDATION_FAIL: '<b>Проверка не удалась:</b>'
INVALID_INPUT: 'Неверный ввод в'
MISSING_REQUIRED_FIELD: 'Отсутствует необходимое поле:'
XSS_ISSUES: "Обнаружены потенциальные XSS проблемы в поле '%s'"
MONTHS_OF_THE_YEAR:
- 'январь'
- 'февраль'
@@ -68,12 +69,12 @@ GRAV:
- 'апрель'
- 'май'
- 'июнь'
- 'Июль'
- 'Август'
- 'Сентябрь'
- 'Октябрь'
- 'Ноябрь'
- 'Декабрь'
- 'июль'
- 'август'
- 'сентябрь'
- 'октябрь'
- 'ноябрь'
- 'декабрь'
DAYS_OF_THE_WEEK:
- 'понедельник'
- 'вторник'
@@ -82,6 +83,8 @@ GRAV:
- 'пятница'
- 'суббота'
- 'воскресенье'
YES: "Да"
NO: "Нет"
CRON:
EVERY: раз в
EVERY_HOUR: раз в час

9
system/languages/si.yaml Normal file
View File

@@ -0,0 +1,9 @@
---
GRAV:
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/(x|ch|ss|sh)es$/i': '\1'

View File

@@ -101,8 +101,8 @@ GRAV:
YR_PLURAL: rokov
DEC_PLURAL: dekád
FORM:
VALIDATION_FAIL: <b>Overenie zlyhalo:</b>
INVALID_INPUT: Neplatný vstup v
VALIDATION_FAIL: '<b>Overenie zlyhalo:</b>'
INVALID_INPUT: 'Neplatný vstup v'
MISSING_REQUIRED_FIELD: 'Chýba vyžadované pole:'
MONTHS_OF_THE_YEAR:
- 'Január'

View File

@@ -36,8 +36,8 @@ GRAV:
YR_PLURAL: l
DEC_PLURAL: des
FORM:
VALIDATION_FAIL: <b>Preverjanje veljavnosti ni uspelo:</b>
INVALID_INPUT: Neveljaven vnos v
VALIDATION_FAIL: '<b>Preverjanje veljavnosti ni uspelo:</b>'
INVALID_INPUT: 'Neveljaven vnos v'
MISSING_REQUIRED_FIELD: 'Manjka obvezno polje:'
MONTHS_OF_THE_YEAR:
- 'Januar'

144
system/languages/sr.yaml Normal file
View File

@@ -0,0 +1,144 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nнаслов: %1$s\n---\n\n# Грешка: неисправан Frontmatter\n\nПутања: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'опрема'
- 'информација'
- 'пиринач'
- 'новац'
- 'врсте'
- 'серије'
- 'риба'
- 'овца'
INFLECTOR_IRREGULAR:
'person': 'особе'
'man': 'људи'
'child': 'деца'
'sex': 'полови'
'move': 'помери'
INFLECTOR_ORDINALS:
'default': 'ти'
'first': 'први'
'second': 'други'
'third': 'трећи'
NICETIME:
NO_DATE_PROVIDED: Нема датума
BAD_DATE: Погрешан датум
AGO: од пре
FROM_NOW: од сада
JUST_NOW: управо сада
SECOND: секунда
MINUTE: минута
HOUR: сат
DAY: дан
WEEK: недеља
MONTH: месец
YEAR: година
DECADE: декада
SEC: сек
MIN: мин
HR: сат
WK: нед
MO: мес
YR: год
DEC: дек
SECOND_PLURAL: секунди
MINUTE_PLURAL: минута
HOUR_PLURAL: сати
DAY_PLURAL: дана
WEEK_PLURAL: недеља
MONTH_PLURAL: месеци
YEAR_PLURAL: године(а)
DECADE_PLURAL: декаде(а)
SEC_PLURAL: сек
MIN_PLURAL: мин
HR_PLURAL: сати
WK_PLURAL: недеља
MO_PLURAL: месеци
YR_PLURAL: година
DEC_PLURAL: декада
FORM:
VALIDATION_FAIL: '<b>Провера неуспела:</b>'
INVALID_INPUT: 'Неисправан унос у'
MISSING_REQUIRED_FIELD: 'Недостаје обавезн поље:'
MONTHS_OF_THE_YEAR:
- 'Јануар'
- 'Фебруар'
- 'Март'
- 'Април'
- 'Мај'
- 'Јуни'
- 'Јули'
- 'Август'
- 'Септембар'
- 'Октобар'
- 'Новембар'
- 'Децембар'
DAYS_OF_THE_WEEK:
- 'Понедељак'
- 'Уторак'
- 'Среда'
- 'Четвртак'
- 'Петак'
- 'Субота'
- 'Недеља'
CRON:
EVERY: сваки
EVERY_HOUR: сваки сат
EVERY_MINUTE: сваки минут
EVERY_DAY_OF_WEEK: сваки дан у недељи
EVERY_DAY_OF_MONTH: сваки дан у месецу
EVERY_MONTH: сваки месец
TEXT_PERIOD: Сваки <b />
TEXT_MINS: ' у <b /> минути(а) прошлог сата'
TEXT_TIME: ' у <b />:<b />'
TEXT_DOW: ' на <b />'
TEXT_MONTH: ' од <b />'
TEXT_DOM: ' на <b />'
ERROR1: Таг %s није подржан!
ERROR2: Погрешан број елемената
ERROR3: јquery_element би требао да буде постављен у jqCron подешавању
ERROR4: Непрепознат израз

View File

@@ -12,11 +12,21 @@ GRAV:
- 'får'
INFLECTOR_IRREGULAR:
'person': 'personer'
'man': 'män'
'child': 'barn'
'sex': 'kön'
'move': 'flytta'
INFLECTOR_ORDINALS:
'default': ':e'
'first': ':a'
'second': ':a'
'third': ':e'
NICETIME:
NO_DATE_PROVIDED: Inget datum har angivits
BAD_DATE: Ogiltigt datum
AGO: sedan
FROM_NOW: fr.o.m nu
JUST_NOW: just nu
SECOND: sekund
MINUTE: minut
HOUR: timme
@@ -26,10 +36,12 @@ GRAV:
YEAR: år
DECADE: årtionde
SEC: sek
MIN: min
HR: t
WK: v
MO: m
YR: år
DEC: dec
SECOND_PLURAL: sekunder
MINUTE_PLURAL: minuter
HOUR_PLURAL: timmar
@@ -46,8 +58,8 @@ GRAV:
YR_PLURAL: år
DEC_PLURAL: dec
FORM:
VALIDATION_FAIL: <b>Kontrollen misslyckades:</b>
INVALID_INPUT: Ogiltig indata i
VALIDATION_FAIL: '<b>Kontrollen misslyckades:</b>'
INVALID_INPUT: 'Ogiltig indata i'
MISSING_REQUIRED_FIELD: 'Obligatoriskt fält måste fyllas i:'
MONTHS_OF_THE_YEAR:
- 'Januari'
@@ -70,3 +82,19 @@ GRAV:
- 'Fredag'
- 'Lördag'
- 'Söndag'
CRON:
EVERY: varje
EVERY_HOUR: varje timme
EVERY_MINUTE: varje minut
EVERY_DAY_OF_WEEK: varje veckodag
EVERY_DAY_OF_MONTH: alla månadens dagar
EVERY_MONTH: varje månad
TEXT_PERIOD: Varje <b />
TEXT_MINS: ' timmens <b />:e minut'
TEXT_TIME: ' kl <b />:<b />'
TEXT_DOW: ' <b />'
TEXT_MONTH: ' <b />'
TEXT_DOM: ' <b />'
ERROR1: Taggen %s stöds inte!
ERROR2: Ogiltigt antal element
ERROR4: Uttrycket känns inte igen

View File

@@ -31,7 +31,7 @@ GRAV:
YR_PLURAL: ปี
FORM:
VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>'
INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน
INVALID_INPUT: 'ป้อนข้อมูลไม่ถูกต้องใน'
MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:'
MONTHS_OF_THE_YEAR:
- 'มกราคม'

View File

@@ -1,11 +1,32 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nBaşlık: %1$s\n---\n\n# Hata: Geçersiz Önbölüm\n\nYol: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'ekipman'
- 'bilgi'
- 'pirinç'
- 'para'
- 'türler'
- 'seriler'
- 'balık'
- 'koyun'
INFLECTOR_IRREGULAR:
'person': 'kişi'
'man': 'erkek'
'child': 'çocuklar'
'sex': 'cinsiyet'
'move': 'taşınmış'
INFLECTOR_ORDINALS:
'default': '#F'
'first': ' 1.'
'second': ' 2.'
'third': ' 3.'
NICETIME:
NO_DATE_PROVIDED: Sağlanan tarih yok
BAD_DATE: Yanlış tarih
AGO: önce
FROM_NOW: şu andan itibaren
JUST_NOW: şimdi
SECOND: saniye
MINUTE: dakika
HOUR: saat
@@ -37,8 +58,8 @@ GRAV:
YR_PLURAL: yıl
DEC_PLURAL: onyl
FORM:
VALIDATION_FAIL: <b>Doğrulama başarısız:</b>
INVALID_INPUT: Geçersiz bilgi girişi
VALIDATION_FAIL: '<b>Doğrulama başarısız:</b>'
INVALID_INPUT: 'Geçersiz bilgi girişi'
MISSING_REQUIRED_FIELD: 'Gerekli alan eksik:'
MONTHS_OF_THE_YEAR:
- 'Ocak'
@@ -61,3 +82,19 @@ GRAV:
- 'Cuma'
- 'Cumartesi'
- 'Pazar'
YES: "Evet"
NO: "Hayır"
CRON:
EVERY: her
EVERY_HOUR: saatte bir
EVERY_MINUTE: dakikada bir
EVERY_DAY_OF_WEEK: haftanın her günü
EVERY_DAY_OF_MONTH: ayın her günü
EVERY_MONTH: her ay
TEXT_PERIOD: Her <b />
TEXT_MINS: ' saatin <b /> dakikasında'
TEXT_TIME: ' da'
ERROR1: Etiket %s desteklenmiyor!
ERROR2: Kötü eleman sayısı
ERROR3: jquery_element jqCron ayarları içinde tanımlanmalı
ERROR4: Tanınmayan ifade

View File

@@ -37,8 +37,8 @@ GRAV:
YR_PLURAL: рр.
DEC_PLURAL: рр.
FORM:
VALIDATION_FAIL: <b>Перевірка не вдалася:</b>
INVALID_INPUT: Невірне введення в
VALIDATION_FAIL: '<b>Перевірка не вдалася:</b>'
INVALID_INPUT: 'Невірне введення в'
MISSING_REQUIRED_FIELD: 'Відсутнє обов''язкове поле:'
MONTHS_OF_THE_YEAR:
- 'Січень'

View File

@@ -37,8 +37,8 @@ GRAV:
YR_PLURAL: năm
DEC_PLURAL: thập kỷ
FORM:
VALIDATION_FAIL: <b>Xác nhận thất bại:</b>
INVALID_INPUT: Dữ liệu nhập không hợp lệ cho
VALIDATION_FAIL: '<b>Xác nhận thất bại:</b>'
INVALID_INPUT: 'Dữ liệu nhập không hợp lệ cho'
MISSING_REQUIRED_FIELD: 'Thiếu trường bắt buộc:'
MONTHS_OF_THE_YEAR:
- 'Tháng 1'

144
system/languages/zh-cn.yaml Normal file
View File

@@ -0,0 +1,144 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\n标题: %1$s\n---\n\n# 错误:无效参数\n\n位置 `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- '装备'
- '信息'
- '大米'
- '钱'
- '物种'
- '系列'
- '鱼'
- '羊'
INFLECTOR_IRREGULAR:
'person': '人员'
'man': '男人'
'child': '儿童'
'sex': '性别'
'move': '移动'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'md'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: 无日期信息
BAD_DATE: 无效日期
AGO:
FROM_NOW: 距今
JUST_NOW: 刚刚
SECOND:
MINUTE: 分钟
HOUR: 小时
DAY:
WEEK:
MONTH:
YEAR:
DECADE: 十年
SEC:
MIN: 分钟
HR: 小时
WK:
MO:
YR:
DEC: 年代
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL: 小时
DAY_PLURAL:
WEEK_PLURAL:
MONTH_PLURAL:
YEAR_PLURAL:
DECADE_PLURAL: 十年
SEC_PLURAL:
MIN_PLURAL:
HR_PLURAL:
WK_PLURAL:
MO_PLURAL:
YR_PLURAL:
DEC_PLURAL: 年代
FORM:
VALIDATION_FAIL: '<b>验证失败:</b>'
INVALID_INPUT: '无效输入'
MISSING_REQUIRED_FIELD: '必填字段缺失:'
MONTHS_OF_THE_YEAR:
- '1月'
- '2月'
- '3月'
- '4月'
- '5月'
- '6月'
- '7月'
- '8月'
- '9月'
- '10月'
- '11月'
- '12月'
DAYS_OF_THE_WEEK:
- '星期一'
- '星期二'
- '星期三'
- '星期四'
- '星期五'
- '星期六'
- '星期日'
CRON:
EVERY: 每隔
EVERY_HOUR: 每小时
EVERY_MINUTE: 每分钟
EVERY_DAY_OF_WEEK: 一周中的每一天
EVERY_DAY_OF_MONTH: 月份中的每一天
EVERY_MONTH: 每月
TEXT_PERIOD: 所有 <b />
TEXT_MINS: ' 在 <b /> 小时过后的分钟'
TEXT_TIME: ' 在 <b />:<b />'
TEXT_DOW: ' on <b />'
TEXT_MONTH: ' of <b />'
TEXT_DOM: ' on <b />'
ERROR1: 不支持分享类型 %s
ERROR2: 无效数字
ERROR3: 请在 jqCron 设置中设定 jquery_element
ERROR4: 无法识别表达式

View File

@@ -38,7 +38,9 @@ GRAV:
YR_PLURAL:
DEC_PLURAL: 十年
FORM:
MISSING_REQUIRED_FIELD: 遺漏必填欄位:
VALIDATION_FAIL: '<b>確驗證失敗:</b>'
INVALID_INPUT: '無效輸入:'
MISSING_REQUIRED_FIELD: '遺漏必填欄位:'
MONTHS_OF_THE_YEAR:
- '一月'
- '二月'
@@ -60,3 +62,16 @@ GRAV:
- '星期五'
- '星期六'
- '星期日'
CRON:
EVERY:
EVERY_HOUR: 每小時
EVERY_MINUTE: 每分鐘
EVERY_DAY_OF_WEEK: 每一天
EVERY_DAY_OF_MONTH: 每一天
EVERY_MONTH: 每個月
TEXT_PERIOD: 每 <b />
TEXT_MINS: ' 的 <b /> 分'
TEXT_TIME: ' <b />:<b />'
TEXT_DOW: ' 的 <b />'
TEXT_MONTH: ' 的 <b />'
TEXT_DOM: ' 的 <b />'

View File

@@ -101,9 +101,9 @@ GRAV:
YR_PLURAL:
DEC_PLURAL: 年代
FORM:
VALIDATION_FAIL: <b>验证失败:</b>
INVALID_INPUT: 无效输入
MISSING_REQUIRED_FIELD: 必填字段缺失:
VALIDATION_FAIL: '<b>验证失败:</b>'
INVALID_INPUT: '无效输入'
MISSING_REQUIRED_FIELD: '必填字段缺失:'
MONTHS_OF_THE_YEAR:
- '1月'
- '2月'

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -13,8 +13,25 @@ if (PHP_SAPI !== 'cli-server') {
$_SERVER['PHP_CLI_ROUTER'] = true;
if (is_file($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME'])) {
return false;
$root = $_SERVER['DOCUMENT_ROOT'];
$path = $_SERVER['SCRIPT_NAME'];
if ($path !== '/index.php' && is_file($root . $path)) {
if (!(
// Block all direct access to files and folders beginning with a dot
strpos($path, '/.') !== false
// Block all direct access for these folders
|| preg_match('`^/(\.git|cache|bin|logs|backup|webserver-configs|tests)/`ui', $path)
// Block access to specific file types for these system folders
|| preg_match('`^/(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path)
// Block access to specific file types for these user folders
|| preg_match('`^/(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path)
// Block all direct access to .md files
|| preg_match('`\.md$`ui', $path)
// Block access to specific files in the root folder
|| preg_match('`^/(LICENSE\.txt|composer\.lock|composer\.json|\.htaccess)$`ui', $path)
)) {
return false;
}
}
$grav_index = 'index.php';

View File

@@ -0,0 +1,165 @@
<?php
/**
* Iterates individual characters (Unicode codepoints) of DOM text and CDATA nodes
* while keeping track of their position in the document.
*
* Example:
*
* $doc = new DOMDocument();
* $doc->load('example.xml');
* foreach(new DOMLettersIterator($doc) as $letter) echo $letter;
*
* NB: If you only need characters without their position
* in the document, use DOMNode->textContent instead.
*
* @author porneL http://pornel.net
* @license Public Domain
* @url https://github.com/antoligy/dom-string-iterators
*
* @implements Iterator<int,string>
*/
final class DOMLettersIterator implements Iterator
{
/** @var DOMElement */
private $start;
/** @var DOMElement|null */
private $current;
/** @var int */
private $offset = -1;
/** @var int|null */
private $key;
/** @var array<int,string>|null */
private $letters;
/**
* expects DOMElement or DOMDocument (see DOMDocument::load and DOMDocument::loadHTML)
*
* @param DOMNode $el
*/
public function __construct(DOMNode $el)
{
if ($el instanceof DOMDocument) {
$el = $el->documentElement;
}
if (!$el instanceof DOMElement) {
throw new InvalidArgumentException('Invalid arguments, expected DOMElement or DOMDocument');
}
$this->start = $el;
}
/**
* Returns position in text as DOMText node and character offset.
* (it's NOT a byte offset, you must use mb_substr() or similar to use this offset properly).
* node may be NULL if iterator has finished.
*
* @return array
*/
public function currentTextPosition(): array
{
return [$this->current, $this->offset];
}
/**
* Returns DOMElement that is currently being iterated or NULL if iterator has finished.
*
* @return DOMElement|null
*/
public function currentElement(): ?DOMElement
{
return $this->current ? $this->current->parentNode : null;
}
// Implementation of Iterator interface
/**
* @return int|null
*/
public function key(): ?int
{
return $this->key;
}
/**
* @return void
*/
public function next(): void
{
if (null === $this->current) {
return;
}
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
if ($this->offset === -1) {
preg_match_all('/./us', $this->current->textContent, $m);
$this->letters = $m[0];
}
$this->offset++;
$this->key++;
if ($this->letters && $this->offset < count($this->letters)) {
return;
}
$this->offset = -1;
}
while ($this->current->nodeType === XML_ELEMENT_NODE && $this->current->firstChild) {
$this->current = $this->current->firstChild;
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
$this->next();
return;
}
}
while (!$this->current->nextSibling && $this->current->parentNode) {
$this->current = $this->current->parentNode;
if ($this->current === $this->start) {
$this->current = null;
return;
}
}
$this->current = $this->current->nextSibling;
$this->next();
}
/**
* Return the current element
* @link https://php.net/manual/en/iterator.current.php
*
* @return string|null
*/
public function current(): ?string
{
return $this->letters ? $this->letters[$this->offset] : null;
}
/**
* Checks if current position is valid
* @link https://php.net/manual/en/iterator.valid.php
*
* @return bool
*/
public function valid(): bool
{
return (bool)$this->current;
}
/**
* @return void
*/
public function rewind(): void
{
$this->current = $this->start;
$this->offset = -1;
$this->key = 0;
$this->letters = [];
$this->next();
}
}

View File

@@ -0,0 +1,158 @@
<?php
/**
* Iterates individual words of DOM text and CDATA nodes
* while keeping track of their position in the document.
*
* Example:
*
* $doc = new DOMDocument();
* $doc->load('example.xml');
* foreach(new DOMWordsIterator($doc) as $word) echo $word;
*
* @author pjgalbraith http://www.pjgalbraith.com
* @author porneL http://pornel.net (based on DOMLettersIterator available at http://pornel.net/source/domlettersiterator.php)
* @license Public Domain
* @url https://github.com/antoligy/dom-string-iterators
*
* @implements Iterator<int,string>
*/
final class DOMWordsIterator implements Iterator
{
/** @var DOMElement */
private $start;
/** @var DOMElement|null */
private $current;
/** @var int */
private $offset = -1;
/** @var int|null */
private $key;
/** @var array<int,array<int,int|string>>|null */
private $words;
/**
* expects DOMElement or DOMDocument (see DOMDocument::load and DOMDocument::loadHTML)
*
* @param DOMNode $el
*/
public function __construct(DOMNode $el)
{
if ($el instanceof DOMDocument) {
$el = $el->documentElement;
}
if (!$el instanceof DOMElement) {
throw new InvalidArgumentException('Invalid arguments, expected DOMElement or DOMDocument');
}
$this->start = $el;
}
/**
* Returns position in text as DOMText node and character offset.
* (it's NOT a byte offset, you must use mb_substr() or similar to use this offset properly).
* node may be NULL if iterator has finished.
*
* @return array
*/
public function currentWordPosition(): array
{
return [$this->current, $this->offset, $this->words];
}
/**
* Returns DOMElement that is currently being iterated or NULL if iterator has finished.
*
* @return DOMElement|null
*/
public function currentElement(): ?DOMElement
{
return $this->current ? $this->current->parentNode : null;
}
// Implementation of Iterator interface
/**
* Return the key of the current element
* @link https://php.net/manual/en/iterator.key.php
* @return int|null
*/
public function key(): ?int
{
return $this->key;
}
/**
* @return void
*/
public function next(): void
{
if (null === $this->current) {
return;
}
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
if ($this->offset === -1) {
$this->words = preg_split("/[\n\r\t ]+/", $this->current->textContent, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_OFFSET_CAPTURE) ?: [];
}
$this->offset++;
if ($this->words && $this->offset < count($this->words)) {
$this->key++;
return;
}
$this->offset = -1;
}
while ($this->current->nodeType === XML_ELEMENT_NODE && $this->current->firstChild) {
$this->current = $this->current->firstChild;
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
$this->next();
return;
}
}
while (!$this->current->nextSibling && $this->current->parentNode) {
$this->current = $this->current->parentNode;
if ($this->current === $this->start) {
$this->current = null;
return;
}
}
$this->current = $this->current->nextSibling;
$this->next();
}
/**
* Return the current element
* @link https://php.net/manual/en/iterator.current.php
* @return string|null
*/
public function current(): ?string
{
return $this->words ? (string)$this->words[$this->offset][0] : null;
}
/**
* Checks if current position is valid
* @link https://php.net/manual/en/iterator.valid.php
* @return bool
*/
public function valid(): bool
{
return (bool)$this->current;
}
public function rewind(): void
{
$this->current = $this->start;
$this->offset = -1;
$this->key = 0;
$this->words = [];
$this->next();
}
}

View File

@@ -3,20 +3,21 @@
/**
* @package Grav\Common
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common;
use Closure;
use Grav\Common\Assets\Pipeline;
use Grav\Common\Assets\Traits\LegacyAssetsTrait;
use Grav\Common\Assets\Traits\TestingAssetsTrait;
use Grav\Common\Config\Config;
use Grav\Framework\Object\PropertyObject;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
use function array_slice;
use function call_user_func_array;
use function count;
use function func_get_args;
use function is_array;
@@ -29,14 +30,21 @@ class Assets extends PropertyObject
use TestingAssetsTrait;
use LegacyAssetsTrait;
const LINK = 'link';
const CSS = 'css';
const JS = 'js';
const JS_MODULE = 'js_module';
const LINK_COLLECTION = 'assets_link';
const CSS_COLLECTION = 'assets_css';
const JS_COLLECTION = 'assets_js';
const JS_MODULE_COLLECTION = 'assets_js_module';
const LINK_TYPE = Assets\Link::class;
const CSS_TYPE = Assets\Css::class;
const JS_TYPE = Assets\Js::class;
const JS_MODULE_TYPE = Assets\JsModule::class;
const INLINE_CSS_TYPE = Assets\InlineCss::class;
const INLINE_JS_TYPE = Assets\InlineJs::class;
const INLINE_JS_MODULE_TYPE = Assets\InlineJsModule::class;
/** @const Regex to match CSS and JavaScript files */
const DEFAULT_REGEX = '/.\.(css|js)$/i';
@@ -47,15 +55,24 @@ class Assets extends PropertyObject
/** @const Regex to match JavaScript files */
const JS_REGEX = '/.\.js$/i';
/** @const Regex to match JavaScriptModyle files */
const JS_MODULE_REGEX = '/.\.mjs$/i';
/** @var string */
protected $assets_dir;
/** @var string */
protected $assets_url;
/** @var array */
protected $assets_link = [];
/** @var array */
protected $assets_css = [];
/** @var array */
protected $assets_js = [];
/** @var array */
protected $assets_js_module = [];
// Following variables come from the configuration:
/** @var bool */
@@ -65,23 +82,21 @@ class Assets extends PropertyObject
/** @var bool */
protected $css_pipeline_before_excludes;
/** @var bool */
protected $inlinecss_pipeline_include_externals;
/** @var bool */
protected $inlinecss_pipeline_before_excludes;
/** @var bool */
protected $js_pipeline;
/** @var bool */
protected $js_pipeline_include_externals;
/** @var bool */
protected $js_pipeline_before_excludes;
/** @var bool */
protected $inlinejs_pipeline_include_externals;
protected $js_module_pipeline;
/** @var bool */
protected $inlinejs_pipeline_before_excludes;
protected $js_module_pipeline_include_externals;
/** @var bool */
protected $js_module_pipeline_before_excludes;
/** @var array */
protected $pipeline_options = [];
/** @var \Closure|string */
/** @var Closure|string */
protected $fetch_command;
/** @var string */
protected $autoload;
@@ -91,6 +106,8 @@ class Assets extends PropertyObject
protected $collections;
/** @var string */
protected $timestamp;
/** @var array Keeping track for order counts (for sorting) */
protected $order = [];
/**
* Initialization called in the Grav lifecycle to initialize the Assets with appropriate configuration
@@ -107,7 +124,7 @@ class Assets extends PropertyObject
/** @var UniformResourceLocator $locator */
$locator = $grav['locator'];
$this->assets_dir = $locator->findResource('asset://') . DS;
$this->assets_dir = $locator->findResource('asset://');
$this->assets_url = $locator->findResource('asset://', false);
$this->config($asset_config);
@@ -157,14 +174,27 @@ class Assets extends PropertyObject
*/
public function add($asset)
{
if (!$asset) {
return $this;
}
$args = func_get_args();
// More than one asset
if (is_array($asset)) {
foreach ($asset as $a) {
array_shift($args);
$args = array_merge([$a], $args);
call_user_func_array([$this, 'add'], $args);
foreach ($asset as $index => $location) {
$params = array_slice($args, 1);
if (is_array($location)) {
$params = array_shift($params);
if (is_numeric($params)) {
$params = [ 'priority' => $params ];
}
$params = [array_replace_recursive([], $location, $params)];
$location = $index;
}
$params = array_merge([$location], $params);
call_user_func_array([$this, 'add'], $params);
}
} elseif (isset($this->collections[$asset])) {
array_shift($args);
@@ -172,7 +202,8 @@ class Assets extends PropertyObject
call_user_func_array([$this, 'add'], $args);
} else {
// Get extension
$extension = pathinfo(parse_url($asset, PHP_URL_PATH), PATHINFO_EXTENSION);
$path = parse_url($asset, PHP_URL_PATH);
$extension = $path ? Utils::pathinfo($path, PATHINFO_EXTENSION) : '';
// JavaScript or CSS
if ($extension !== '') {
@@ -181,6 +212,8 @@ class Assets extends PropertyObject
call_user_func_array([$this, 'addCss'], $args);
} elseif ($extension === 'js') {
call_user_func_array([$this, 'addJs'], $args);
} elseif ($extension === 'mjs') {
call_user_func_array([$this, 'addJsModule'], $args);
}
}
}
@@ -198,14 +231,19 @@ class Assets extends PropertyObject
protected function addType($collection, $type, $asset, $options)
{
if (is_array($asset)) {
foreach ($asset as $a) {
$this->addType($collection, $type, $a, $options);
foreach ($asset as $index => $location) {
$assetOptions = $options;
if (is_array($location)) {
$assetOptions = array_replace_recursive([], $options, $location);
$location = $index;
}
$this->addType($collection, $type, $location, $assetOptions);
}
return $this;
}
if (($type === $this::CSS_TYPE || $type === $this::JS_TYPE) && isset($this->collections[$asset])) {
if ($this->isValidType($type) && isset($this->collections[$asset])) {
$this->addType($collection, $type, $this->collections[$asset], $options);
return $this;
}
@@ -213,7 +251,9 @@ class Assets extends PropertyObject
// If pipeline disabled, set to position if provided, else after
if (isset($options['pipeline'])) {
if ($options['pipeline'] === false) {
$exclude_type = ($type === $this::JS_TYPE || $type === $this::INLINE_JS_TYPE) ? $this::JS : $this::CSS;
$exclude_type = $this->getBaseType($type);
$excludes = strtolower($exclude_type . '_pipeline_before_excludes');
if ($this->{$excludes}) {
$default = 'after';
@@ -228,10 +268,24 @@ class Assets extends PropertyObject
}
// Add timestamp
$options['timestamp'] = $this->timestamp;
$timestamp_override = $options['timestamp'] ?? true;
if (filter_var($timestamp_override, FILTER_VALIDATE_BOOLEAN)) {
$options['timestamp'] = $this->timestamp;
} else {
$options['timestamp'] = null;
}
// Set order
$options['order'] = count($this->$collection);
$group = $options['group'] ?? 'head';
$position = $options['position'] ?? 'pipeline';
$orderKey = "{$type}|{$group}|{$position}";
if (!isset($this->order[$orderKey])) {
$this->order[$orderKey] = 0;
}
$options['order'] = $this->order[$orderKey]++;
// Create asset of correct type
$asset_object = new $type();
@@ -244,6 +298,16 @@ class Assets extends PropertyObject
return $this;
}
/**
* Add a CSS asset or a collection of assets.
*
* @return $this
*/
public function addLink($asset)
{
return $this->addType($this::LINK_COLLECTION, $this::LINK_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::LINK_TYPE));
}
/**
* Add a CSS asset or a collection of assets.
*
@@ -284,6 +348,25 @@ class Assets extends PropertyObject
return $this->addType($this::JS_COLLECTION, $this::INLINE_JS_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::INLINE_JS_TYPE));
}
/**
* Add a JS asset or a collection of assets.
*
* @return $this
*/
public function addJsModule($asset)
{
return $this->addType($this::JS_MODULE_COLLECTION, $this::JS_MODULE_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::JS_MODULE_TYPE));
}
/**
* Add an Inline JS asset or a collection of assets.
*
* @return $this
*/
public function addInlineJsModule($asset)
{
return $this->addType($this::JS_MODULE_COLLECTION, $this::INLINE_JS_MODULE_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::INLINE_JS_MODULE_TYPE));
}
/**
* Add/replace collection.
@@ -375,7 +458,7 @@ class Assets extends PropertyObject
$after_assets = $this->filterAssets($group_assets, 'position', 'after', true);
// Pipeline
if ($this->{$pipeline_enabled}) {
if ($this->{$pipeline_enabled} ?? false) {
$options = array_merge($this->pipeline_options, ['timestamp' => $this->timestamp]);
$pipeline = new Pipeline($options);
@@ -407,9 +490,29 @@ class Assets extends PropertyObject
* @param array $attributes
* @return string
*/
public function css($group = 'head', $attributes = [])
public function css($group = 'head', $attributes = [], $include_link = true)
{
return $this->render('css', $group, $attributes);
$output = '';
if ($include_link) {
$output = $this->link($group, $attributes);
}
$output .= $this->render(self::CSS, $group, $attributes);
return $output;
}
/**
* Build the CSS link tags.
*
* @param string $group name of the group
* @param array $attributes
* @return string
*/
public function link($group = 'head', $attributes = [])
{
return $this->render(self::LINK, $group, $attributes);
}
/**
@@ -419,8 +522,71 @@ class Assets extends PropertyObject
* @param array $attributes
* @return string
*/
public function js($group = 'head', $attributes = [])
public function js($group = 'head', $attributes = [], $include_js_module = true)
{
return $this->render('js', $group, $attributes);
$output = $this->render(self::JS, $group, $attributes);
if ($include_js_module) {
$output .= $this->jsModule($group, $attributes);
}
return $output;
}
/**
* Build the Javascript Modules tags
*
* @param string $group
* @param array $attributes
* @return string
*/
public function jsModule($group = 'head', $attributes = [])
{
return $this->render(self::JS_MODULE, $group, $attributes);
}
/**
* @param string $group
* @param array $attributes
* @return string
*/
public function all($group = 'head', $attributes = [])
{
$output = $this->css($group, $attributes, false);
$output .= $this->link($group, $attributes);
$output .= $this->js($group, $attributes, false);
$output .= $this->jsModule($group, $attributes);
return $output;
}
/**
* @param class-string $type
* @return bool
*/
protected function isValidType($type)
{
return in_array($type, [self::CSS_TYPE, self::JS_TYPE, self::JS_MODULE_TYPE]);
}
/**
* @param class-string $type
* @return string
*/
protected function getBaseType($type)
{
switch ($type) {
case $this::JS_TYPE:
case $this::INLINE_JS_TYPE:
$base_type = $this::JS;
break;
case $this::JS_MODULE_TYPE:
case $this::INLINE_JS_MODULE_TYPE:
$base_type = $this::JS_MODULE;
break;
default:
$base_type = $this::CSS;
}
return $base_type;
}
}

View File

@@ -3,17 +3,19 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Assets\Traits\AssetUtilsTrait;
use Grav\Common\Config\Config;
use Grav\Common\Grav;
use Grav\Common\Uri;
use Grav\Common\Utils;
use Grav\Framework\Object\PropertyObject;
use RocketTheme\Toolbox\File\File;
use SplFileInfo;
/**
@@ -24,8 +26,9 @@ abstract class BaseAsset extends PropertyObject
{
use AssetUtilsTrait;
protected const CSS_ASSET = true;
protected const JS_ASSET = false;
protected const CSS_ASSET = 1;
protected const JS_ASSET = 2;
protected const JS_MODULE_ASSET = 3;
/** @var string|false */
protected $asset;
@@ -67,7 +70,7 @@ abstract class BaseAsset extends PropertyObject
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_config = [
'group' => 'head',
@@ -90,6 +93,10 @@ abstract class BaseAsset extends PropertyObject
*/
public function init($asset, $options)
{
if (!$asset) {
return false;
}
$config = Grav::instance()['config'];
$uri = Grav::instance()['uri'];
@@ -124,7 +131,7 @@ abstract class BaseAsset extends PropertyObject
if ($locator->isStream($asset)) {
$path = $locator->findResource($asset, true);
} else {
$path = GRAV_ROOT . $asset;
$path = GRAV_WEBROOT . $asset;
}
// If local file is missing return
@@ -172,6 +179,35 @@ abstract class BaseAsset extends PropertyObject
return $this;
}
/**
* Receive asset location and return the SRI integrity hash
*
* @param string $input
* @return string
*/
public static function integrityHash($input)
{
$grav = Grav::instance();
$uri = $grav['uri'];
$assetsConfig = $grav['config']->get('system.assets');
if (!self::isRemoteLink($input) && !empty($assetsConfig['enable_asset_sri']) && $assetsConfig['enable_asset_sri']) {
$input = preg_replace('#^' . $uri->rootUrl() . '#', '', $input);
$asset = File::instance(GRAV_WEBROOT . $input);
if ($asset->exists()) {
$dataToHash = $asset->content();
$hash = hash('sha256', $dataToHash, true);
$hash_base64 = base64_encode($hash);
return ' integrity="sha256-' . $hash_base64 . '"';
}
}
return '';
}
/**
*
@@ -183,7 +219,7 @@ abstract class BaseAsset extends PropertyObject
*/
// protected function getLastModificationTime($asset)
// {
// $file = GRAV_ROOT . $asset;
// $file = GRAV_WEBROOT . $asset;
// if (Grav::instance()['locator']->isStream($asset)) {
// $file = $this->buildLocalLink($asset, true);
// }
@@ -202,7 +238,7 @@ abstract class BaseAsset extends PropertyObject
protected function buildLocalLink($asset)
{
if ($asset) {
return $this->base_url . ltrim(Utils::replaceFirstOccurrence(GRAV_ROOT, '', $asset), '/');
return $this->base_url . ltrim(Utils::replaceFirstOccurrence(GRAV_WEBROOT, '', $asset), '/');
}
return false;
}
@@ -213,6 +249,7 @@ abstract class BaseAsset extends PropertyObject
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return ['type' => $this->getType(), 'elements' => $this->getElements()];
@@ -228,6 +265,19 @@ abstract class BaseAsset extends PropertyObject
*/
protected function cssRewrite($file, $dir, $local)
{
return;
return '';
}
/**
* Finds relative JS urls() and rewrites the URL with an absolute one
*
* @param string $file the css source file
* @param string $dir local relative path to the css file
* @param bool $local is this a local or remote asset
* @return string
*/
protected function jsRewrite($file, $dir, $local)
{
return '';
}
}

View File

@@ -0,0 +1,207 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Assets;
use Grav\Common\Config\Config;
use Grav\Common\Grav;
use Grav\Framework\ContentBlock\HtmlBlock;
use function strlen;
/**
* Register block assets into Grav.
*/
class BlockAssets
{
/**
* @param HtmlBlock $block
* @return void
*/
public static function registerAssets(HtmlBlock $block): void
{
$grav = Grav::instance();
/** @var Assets $assets */
$assets = $grav['assets'];
$types = $block->getAssets();
foreach ($types as $type => $groups) {
switch ($type) {
case 'frameworks':
static::registerFrameworks($assets, $groups);
break;
case 'styles':
static::registerStyles($assets, $groups);
break;
case 'scripts':
static::registerScripts($assets, $groups);
break;
case 'links':
static::registerLinks($assets, $groups);
break;
case 'html':
static::registerHtml($assets, $groups);
break;
}
}
}
/**
* @param Assets $assets
* @param array $list
* @return void
*/
protected static function registerFrameworks(Assets $assets, array $list): void
{
if ($list) {
throw new \RuntimeException('Not Implemented');
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerStyles(Assets $assets, array $groups): void
{
$grav = Grav::instance();
/** @var Config $config */
$config = $grav['config'];
foreach ($groups as $group => $styles) {
foreach ($styles as $style) {
switch ($style[':type']) {
case 'file':
$options = [
'priority' => $style[':priority'],
'group' => $group,
'type' => $style['type'],
'media' => $style['media']
] + $style['element'];
$assets->addCss(static::getRelativeUrl($style['href'], $config->get('system.assets.css_pipeline')), $options);
break;
case 'inline':
$options = [
'priority' => $style[':priority'],
'group' => $group,
'type' => $style['type'],
] + $style['element'];
$assets->addInlineCss($style['content'], $options);
break;
}
}
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerScripts(Assets $assets, array $groups): void
{
$grav = Grav::instance();
/** @var Config $config */
$config = $grav['config'];
foreach ($groups as $group => $scripts) {
$group = $group === 'footer' ? 'bottom' : $group;
foreach ($scripts as $script) {
switch ($script[':type']) {
case 'file':
$options = [
'group' => $group,
'priority' => $script[':priority'],
'src' => $script['src'],
'type' => $script['type'],
'loading' => $script['loading'],
'defer' => $script['defer'],
'async' => $script['async'],
'handle' => $script['handle']
] + $script['element'];
$assets->addJs(static::getRelativeUrl($script['src'], $config->get('system.assets.js_pipeline')), $options);
break;
case 'inline':
$options = [
'priority' => $script[':priority'],
'group' => $group,
'type' => $script['type'],
'loading' => $script['loading']
] + $script['element'];
$assets->addInlineJs($script['content'], $options);
break;
}
}
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerLinks(Assets $assets, array $groups): void
{
foreach ($groups as $group => $links) {
foreach ($links as $link) {
$href = $link['href'];
$options = [
'group' => $group,
'priority' => $link[':priority'],
'rel' => $link['rel'],
] + $link['element'];
$assets->addLink($href, $options);
}
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerHtml(Assets $assets, array $groups): void
{
if ($groups) {
throw new \RuntimeException('Not Implemented');
}
}
/**
* @param string $url
* @param bool $pipeline
* @return string
*/
protected static function getRelativeUrl($url, $pipeline)
{
$grav = Grav::instance();
$base = rtrim($grav['base_url'], '/') ?: '/';
if (strpos($url, $base) === 0) {
if ($pipeline) {
// Remove file timestamp if CSS pipeline has been enabled.
$url = preg_replace('|[?#].*|', '', $url);
}
return substr($url, strlen($base) - 1);
}
return $url;
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class Css extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'css',
@@ -47,6 +47,6 @@ class Css extends BaseAsset
return "<style>\n" . trim($buffer) . "\n</style>\n";
}
return '<link href="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . ">\n";
return '<link href="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . $this->integrityHash($this->asset) . ">\n";
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class InlineCss extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'css',

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class InlineJs extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js',

View File

@@ -0,0 +1,46 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
/**
* Class InlineJs
* @package Grav\Common\Assets
*/
class InlineJsModule extends BaseAsset
{
/**
* InlineJs constructor.
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js_module',
'attributes' => ['type' => 'module'],
'position' => 'after'
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
/**
* @return string
*/
public function render()
{
return '<script' . $this->renderAttributes(). ">\n" . trim($this->asset) . "\n</script>\n";
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class Js extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js',
@@ -43,6 +43,6 @@ class Js extends BaseAsset
return '<script' . $this->renderAttributes() . ">\n" . trim($buffer) . "\n</script>\n";
}
return '<script src="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
return '<script src="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . $this->integrityHash($this->asset) . "></script>\n";
}
}

View File

@@ -0,0 +1,49 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
/**
* Class Js
* @package Grav\Common\Assets
*/
class JsModule extends BaseAsset
{
/**
* Js constructor.
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js_module',
'attributes' => ['type' => 'module']
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
/**
* @return string
*/
public function render()
{
if (isset($this->attributes['loading']) && $this->attributes['loading'] === 'inline') {
$buffer = $this->gatherLinks([$this], self::JS_MODULE_ASSET);
return '<script' . $this->renderAttributes() . ">\n" . trim($buffer) . "\n</script>\n";
}
return '<script src="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . $this->integrityHash($this->asset) . "></script>\n";
}
}

View File

@@ -0,0 +1,43 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
/**
* Class Link
* @package Grav\Common\Assets
*/
class Link extends BaseAsset
{
/**
* Css constructor.
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'link',
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
/**
* @return string
*/
public function render()
{
return '<link href="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . $this->integrityHash($this->asset) . ">\n";
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (C) 2015 - 2020 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -11,10 +11,13 @@ namespace Grav\Common\Assets;
use Grav\Common\Assets\Traits\AssetUtilsTrait;
use Grav\Common\Config\Config;
use Grav\Common\Filesystem\Folder;
use Grav\Common\Grav;
use Grav\Common\Uri;
use Grav\Common\Utils;
use Grav\Framework\Object\PropertyObject;
use MatthiasMullie\Minify\CSS;
use MatthiasMullie\Minify\JS;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
use function array_key_exists;
@@ -26,12 +29,16 @@ class Pipeline extends PropertyObject
{
use AssetUtilsTrait;
protected const CSS_ASSET = true;
protected const JS_ASSET = false;
protected const CSS_ASSET = 1;
protected const JS_ASSET = 2;
protected const JS_MODULE_ASSET = 3;
/** @const Regex to match CSS urls */
protected const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)}';
/** @const Regex to match JS imports */
protected const JS_IMPORT_REGEX = '{import.+from\s?[\'|\"](.+?)[\'|\"]}';
/** @const Regex to match CSS sourcemap comments */
protected const CSS_SOURCEMAP_REGEX = '{\/\*# (.*?) \*\/}';
@@ -85,7 +92,14 @@ class Pipeline extends PropertyObject
$uri = Grav::instance()['uri'];
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
$this->assets_dir = $locator->findResource('asset://') . DS;
$this->assets_dir = $locator->findResource('asset://');
if (!$this->assets_dir) {
// Attempt to create assets folder if it doesn't exist yet.
$this->assets_dir = $locator->findResource('asset://', true, true);
Folder::mkdir($this->assets_dir);
$locator->clearCache();
}
$this->assets_url = $locator->findResource('asset://', false);
}
@@ -112,14 +126,13 @@ class Pipeline extends PropertyObject
// Compute uid based on assets and timestamp
$json_assets = json_encode($assets);
$uid = md5($json_assets . $this->css_minify . $this->css_rewrite . $group);
$uid = md5($json_assets . (int)$this->css_minify . (int)$this->css_rewrite . $group);
$file = $uid . '.css';
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
$buffer = null;
if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
$filepath = "{$this->assets_dir}/{$file}";
if (file_exists($filepath)) {
$buffer = file_get_contents($filepath) . "\n";
} else {
//if nothing found get out of here!
if (empty($assets)) {
@@ -131,14 +144,14 @@ class Pipeline extends PropertyObject
// Minify if required
if ($this->shouldMinify('css')) {
$minifier = new \MatthiasMullie\Minify\CSS();
$minifier = new CSS();
$minifier->add($buffer);
$buffer = $minifier->minify();
}
// Write file
if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer);
file_put_contents($filepath, $buffer);
}
}
@@ -146,7 +159,7 @@ class Pipeline extends PropertyObject
$output = "<style>\n" . $buffer . "\n</style>\n";
} else {
$this->asset = $relative_path;
$output = '<link href="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . ">\n";
$output = '<link href="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . BaseAsset::integrityHash($this->asset) . ">\n";
}
return $output;
@@ -160,7 +173,7 @@ class Pipeline extends PropertyObject
* @param array $attributes
* @return bool|string URL or generated content if available, else false
*/
public function renderJs($assets, $group, $attributes = [])
public function renderJs($assets, $group, $attributes = [], $type = self::JS_ASSET)
{
// temporary list of assets to pipeline
$inline_group = false;
@@ -179,10 +192,9 @@ class Pipeline extends PropertyObject
$file = $uid . '.js';
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
$buffer = null;
if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
$filepath = "{$this->assets_dir}/{$file}";
if (file_exists($filepath)) {
$buffer = file_get_contents($filepath) . "\n";
} else {
//if nothing found get out of here!
if (empty($assets)) {
@@ -190,18 +202,18 @@ class Pipeline extends PropertyObject
}
// Concatenate files
$buffer = $this->gatherLinks($assets, self::JS_ASSET);
$buffer = $this->gatherLinks($assets, $type);
// Minify if required
if ($this->shouldMinify('js')) {
$minifier = new \MatthiasMullie\Minify\JS();
$minifier = new JS();
$minifier->add($buffer);
$buffer = $minifier->minify();
}
// Write file
if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer);
file_put_contents($filepath, $buffer);
}
}
@@ -209,12 +221,25 @@ class Pipeline extends PropertyObject
$output = '<script' . $this->renderAttributes(). ">\n" . $buffer . "\n</script>\n";
} else {
$this->asset = $relative_path;
$output = '<script src="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
$output = '<script src="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . BaseAsset::integrityHash($this->asset) . "></script>\n";
}
return $output;
}
/**
* Minify and concatenate JS files.
*
* @param array $assets
* @param string $group
* @param array $attributes
* @return bool|string URL or generated content if available, else false
*/
public function renderJs_Module($assets, $group, $attributes = [])
{
$attributes['type'] = 'module';
return $this->renderJs($assets, $group, $attributes, self::JS_MODULE_ASSET);
}
/**
* Finds relative CSS urls() and rewrites the URL with an absolute one
@@ -246,7 +271,7 @@ class Pipeline extends PropertyObject
$old_url = ltrim($old_url, '/');
}
$new_url = ($local ? $this->base_url: '') . $old_url;
$new_url = ($local ? $this->base_url : '') . $old_url;
return str_replace($matches[2], $new_url, $matches[0]);
}, $file);
@@ -254,6 +279,42 @@ class Pipeline extends PropertyObject
return $file;
}
/**
* Finds relative JS urls() and rewrites the URL with an absolute one
*
* @param string $file the css source file
* @param string $dir local relative path to the css file
* @param bool $local is this a local or remote asset
* @return string
*/
protected function jsRewrite($file, $dir, $local)
{
// Find any js import elements, grab the URLs and calculate an absolute path
// Then replace the old url with the new one
$file = (string)preg_replace_callback(self::JS_IMPORT_REGEX, function ($matches) use ($dir, $local) {
$old_url = $matches[1];
// Ensure link is not rooted to web server, a data URL, or to a remote host
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url) || $this->isRemoteLink($old_url)) {
return $matches[0];
}
// clean leading /
$old_url = Utils::normalizePath($dir . '/' . $old_url);
$old_url = str_replace('/./', '/', $old_url);
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url)) {
$old_url = ltrim($old_url, '/');
}
$new_url = ($local ? $this->base_url : '') . $old_url;
return str_replace($matches[1], $new_url, $matches[0]);
}, $file);
return $file;
}
/**
* @param string $type
* @return bool

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