Compare commits
1758 Commits
0.9.27
...
1.1.0-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a895f578e | ||
|
|
0c7ee74bd1 | ||
|
|
3eafc4a089 | ||
|
|
df800cdfd7 | ||
|
|
ffb7ac755b | ||
|
|
693568b509 | ||
|
|
bf2b3bff9a | ||
|
|
9effb59a1d | ||
|
|
8d03f3166d | ||
|
|
f1162895c2 | ||
|
|
cd58e10fbc | ||
|
|
5adff355be | ||
|
|
c021fbd232 | ||
|
|
cbd6ab42c3 | ||
|
|
8b39411fb4 | ||
|
|
0a8fd26e04 | ||
|
|
2e89ea5f19 | ||
|
|
88e3c9dd18 | ||
|
|
82f5111857 | ||
|
|
23d2d19f35 | ||
|
|
c5394f07f6 | ||
|
|
33f06e00a1 | ||
|
|
96c2bae4f8 | ||
|
|
643a977df6 | ||
|
|
cea454b2c5 | ||
|
|
672b37359a | ||
|
|
5d97fed383 | ||
|
|
99f8ee2c81 | ||
|
|
d4642e4b9a | ||
|
|
dc121e9ef2 | ||
|
|
6124f71d6e | ||
|
|
5213867611 | ||
|
|
a778878ec5 | ||
|
|
e58994d196 | ||
|
|
eb4e7ceae1 | ||
|
|
773e3b68ef | ||
|
|
f2e6691f26 | ||
|
|
3535c55bef | ||
|
|
8bdceb6919 | ||
|
|
40348124a1 | ||
|
|
a5d4ede100 | ||
|
|
c8e86dc1a6 | ||
|
|
9eeb4c15ac | ||
|
|
fbe65e7cac | ||
|
|
a8f4092ac3 | ||
|
|
c4470889b4 | ||
|
|
90481e8a6d | ||
|
|
7e06b01771 | ||
|
|
0e40257176 | ||
|
|
b4cdeba4cf | ||
|
|
88320607fa | ||
|
|
a58766be66 | ||
|
|
8751c662b9 | ||
|
|
3f1e482ee3 | ||
|
|
e880cf9c63 | ||
|
|
9f7874a4f6 | ||
|
|
722e3cb55e | ||
|
|
63c2db5c85 | ||
|
|
c7c69cbd66 | ||
|
|
29eb3932ce | ||
|
|
9c5b457aa4 | ||
|
|
0f6d8b7037 | ||
|
|
bc6d9f98ff | ||
|
|
c47c4bcbf5 | ||
|
|
61e6b8f371 | ||
|
|
77c3f51118 | ||
|
|
9433eb4888 | ||
|
|
3d449ff37c | ||
|
|
411a7d4b73 | ||
|
|
33d69d7783 | ||
|
|
9d2ef020b4 | ||
|
|
d28e7bc147 | ||
|
|
0ed84642e9 | ||
|
|
974d107355 | ||
|
|
d349e5d67b | ||
|
|
993c10df10 | ||
|
|
5e107116c5 | ||
|
|
3571663e0f | ||
|
|
5e85ac640e | ||
|
|
d8e1a33479 | ||
|
|
d68a5b68c4 | ||
|
|
1408477827 | ||
|
|
ee37650b35 | ||
|
|
34a211a532 | ||
|
|
7619d3b54a | ||
|
|
6790a7c86b | ||
|
|
4e171c7e80 | ||
|
|
e839fccc2e | ||
|
|
ab23b52416 | ||
|
|
d752cd09c6 | ||
|
|
82f52548d3 | ||
|
|
187b2b331e | ||
|
|
08cd9f0510 | ||
|
|
83fbcf33b9 | ||
|
|
fbb51cffac | ||
|
|
810deb4105 | ||
|
|
da6a91f132 | ||
|
|
51ee7eef24 | ||
|
|
5ac7de5d7d | ||
|
|
2c9c712bec | ||
|
|
7158dd9beb | ||
|
|
c3ede5c425 | ||
|
|
1d2c4ea2a6 | ||
|
|
6f91e27389 | ||
|
|
7051dad34c | ||
|
|
1f49bee5f2 | ||
|
|
7b3c02cece | ||
|
|
7edb382d37 | ||
|
|
b86a9ef564 | ||
|
|
94f6e6d8ce | ||
|
|
bfd48218ab | ||
|
|
9ef5b16baa | ||
|
|
8682df2e32 | ||
|
|
c8a78871a9 | ||
|
|
c24637a8a6 | ||
|
|
d632adec75 | ||
|
|
8096c535c8 | ||
|
|
9c38fd9b8f | ||
|
|
2cf0e2f8b6 | ||
|
|
8ae4e3fd64 | ||
|
|
4bb6876c78 | ||
|
|
71bbb03bd9 | ||
|
|
3aca86ef6f | ||
|
|
909695169c | ||
|
|
80c6793ef7 | ||
|
|
2ad75c8b91 | ||
|
|
3c43888de1 | ||
|
|
51c281e7df | ||
|
|
46ba290004 | ||
|
|
ca6977d61f | ||
|
|
50b4308242 | ||
|
|
b43d621dfc | ||
|
|
2e78beee8f | ||
|
|
4ff59ea57c | ||
|
|
fa50ae9367 | ||
|
|
3f25ad7c4f | ||
|
|
9f79c018e6 | ||
|
|
2dce488e77 | ||
|
|
362bffeba8 | ||
|
|
e557c6f797 | ||
|
|
65d0149291 | ||
|
|
fce5de5464 | ||
|
|
707d081c55 | ||
|
|
6c4fd4dabc | ||
|
|
f3043926e1 | ||
|
|
fbac9a6dcd | ||
|
|
7d2f13f198 | ||
|
|
6cdd302eae | ||
|
|
993c0d1347 | ||
|
|
1beb460a9b | ||
|
|
9119ce8679 | ||
|
|
0716f96d8d | ||
|
|
ba286cf8c5 | ||
|
|
055db441f8 | ||
|
|
068eefab7b | ||
|
|
c053a153fe | ||
|
|
f586358ab3 | ||
|
|
d5f31db8af | ||
|
|
06d9abaede | ||
|
|
09a03f8b1a | ||
|
|
3317fab0c6 | ||
|
|
44c99e59f9 | ||
|
|
c8f87f87ee | ||
|
|
f11c7b40bb | ||
|
|
5155d09765 | ||
|
|
9a83977913 | ||
|
|
10a89cf4e7 | ||
|
|
a87315c57d | ||
|
|
0dc9070f2e | ||
|
|
cee512c585 | ||
|
|
e9c46e7ace | ||
|
|
2f1f48b9b2 | ||
|
|
db664b2762 | ||
|
|
2db4b519c8 | ||
|
|
d101ffe353 | ||
|
|
c304c40dbf | ||
|
|
14353c50d8 | ||
|
|
42222d1be4 | ||
|
|
9feebaaa69 | ||
|
|
04aab610c9 | ||
|
|
606c38b852 | ||
|
|
400213fdf0 | ||
|
|
91222cb32b | ||
|
|
3a5d92db1f | ||
|
|
b040596aab | ||
|
|
d95881e535 | ||
|
|
7fe50f454e | ||
|
|
b58cce573a | ||
|
|
ed0d562a3e | ||
|
|
76f9d85360 | ||
|
|
faac7eb783 | ||
|
|
e0c579d513 | ||
|
|
7e4f4319d5 | ||
|
|
d573ebbfe3 | ||
|
|
99bd25f805 | ||
|
|
48cabb19e7 | ||
|
|
30f15682e1 | ||
|
|
c8cc861b94 | ||
|
|
207e07876f | ||
|
|
830cd5c172 | ||
|
|
e784b13bdf | ||
|
|
091a727fe1 | ||
|
|
8a11269ccd | ||
|
|
ed68714302 | ||
|
|
3196122f4e | ||
|
|
5a4fec7825 | ||
|
|
ca064d2abc | ||
|
|
9bdccbf2ef | ||
|
|
cdef2e105d | ||
|
|
c5c16fc24d | ||
|
|
ffcfd7df6b | ||
|
|
0d77e31036 | ||
|
|
4cd0198bd7 | ||
|
|
991e4bde8f | ||
|
|
048ecb099a | ||
|
|
ff7d8a4391 | ||
|
|
b128300439 | ||
|
|
072fa63067 | ||
|
|
f2008135bb | ||
|
|
16d532bb2e | ||
|
|
7e4619e0a3 | ||
|
|
8f5a30cc50 | ||
|
|
2be8de4283 | ||
|
|
afa7d541ec | ||
|
|
de8302aafa | ||
|
|
d43c10189b | ||
|
|
74e4e4d6ee | ||
|
|
db7da685ae | ||
|
|
aa1b716469 | ||
|
|
6791244e38 | ||
|
|
979cf2061c | ||
|
|
7c61ed384a | ||
|
|
385c758c77 | ||
|
|
5c2318da28 | ||
|
|
85c8072cec | ||
|
|
f74562987d | ||
|
|
5c4c7402fa | ||
|
|
89fbd4c2bf | ||
|
|
9e6ae57caa | ||
|
|
6caaeedf93 | ||
|
|
a83b8513f4 | ||
|
|
797e513395 | ||
|
|
f93dc7d8ae | ||
|
|
af4a1b884a | ||
|
|
8bf0f2dbab | ||
|
|
396a694005 | ||
|
|
02d2b05a47 | ||
|
|
024ae68782 | ||
|
|
b96e902160 | ||
|
|
5c33bd37eb | ||
|
|
8b2d727970 | ||
|
|
01570baa6b | ||
|
|
604b6f07f6 | ||
|
|
6a78fa633a | ||
|
|
0a5d9935b5 | ||
|
|
30b7aaf2b1 | ||
|
|
86be0b3f34 | ||
|
|
f3a44e39b1 | ||
|
|
01af9dfc46 | ||
|
|
8051debdcc | ||
|
|
bd14963992 | ||
|
|
592fc1b471 | ||
|
|
5ee4eafd5f | ||
|
|
30640ae821 | ||
|
|
5c887495bf | ||
|
|
78864ecc03 | ||
|
|
2ab22e46df | ||
|
|
49f9cff9cd | ||
|
|
05ec395f4d | ||
|
|
ebe46f1482 | ||
|
|
59fc6c20e8 | ||
|
|
80f9c5782a | ||
|
|
9302610e8f | ||
|
|
37799fd173 | ||
|
|
17f6a9b877 | ||
|
|
d67da7bed6 | ||
|
|
0b53d39cdb | ||
|
|
989f5bb129 | ||
|
|
4c7fd6866c | ||
|
|
9cca14338b | ||
|
|
a5821948e1 | ||
|
|
9a87ab1a4d | ||
|
|
c3afb68e9a | ||
|
|
75ea201e31 | ||
|
|
1263a0bcab | ||
|
|
931d08b46d | ||
|
|
43d63f6976 | ||
|
|
fb32805f69 | ||
|
|
4a16fe68c3 | ||
|
|
eb120a2cda | ||
|
|
be297677e8 | ||
|
|
1d90107a5a | ||
|
|
10758eecd1 | ||
|
|
0143ac22e3 | ||
|
|
17c47889a6 | ||
|
|
5cdc10075a | ||
|
|
b331758d9c | ||
|
|
503ff8d70f | ||
|
|
2ba5517d4c | ||
|
|
3a0a20ab97 | ||
|
|
b59cdbfdcf | ||
|
|
2944289544 | ||
|
|
a683f661ed | ||
|
|
1c382a1bc6 | ||
|
|
1e6e9bbbb4 | ||
|
|
a4c817147b | ||
|
|
ed3c1c7b3a | ||
|
|
a1d0494ea2 | ||
|
|
16889cac31 | ||
|
|
afc0559d68 | ||
|
|
59b75a339c | ||
|
|
7a1d9e454b | ||
|
|
788c54ea9c | ||
|
|
1cfc778467 | ||
|
|
afd680b133 | ||
|
|
3a46dc3dcd | ||
|
|
0b361c3790 | ||
|
|
bf91d13222 | ||
|
|
0bd60d24b7 | ||
|
|
864f14344e | ||
|
|
b50ebba477 | ||
|
|
81e25e314b | ||
|
|
028554dbf8 | ||
|
|
bda8de3076 | ||
|
|
36be17617d | ||
|
|
bb23f6157f | ||
|
|
39ac423bce | ||
|
|
39b1eed912 | ||
|
|
360286f3d4 | ||
|
|
88c84ed028 | ||
|
|
f03a7ced06 | ||
|
|
5605b69844 | ||
|
|
bfe3a7750e | ||
|
|
1d23d29485 | ||
|
|
3bec73049b | ||
|
|
cd7366ca8d | ||
|
|
63812cc6b1 | ||
|
|
de9b6df2c7 | ||
|
|
990663cd60 | ||
|
|
9701908aaa | ||
|
|
49facba84a | ||
|
|
7953271265 | ||
|
|
3f3adfc5c6 | ||
|
|
b6c289067f | ||
|
|
1d2c1c3a29 | ||
|
|
71176f52e9 | ||
|
|
03f48d56a4 | ||
|
|
79a3077fdb | ||
|
|
54f959b462 | ||
|
|
927ef9b8ba | ||
|
|
6e3d08d9d0 | ||
|
|
0d97710ffb | ||
|
|
1d65344aa5 | ||
|
|
82a5afa732 | ||
|
|
72836982e6 | ||
|
|
d12c8b10a2 | ||
|
|
b208ced437 | ||
|
|
c4e72819a6 | ||
|
|
3541ea8ec8 | ||
|
|
e4cda6383f | ||
|
|
3cc6700845 | ||
|
|
36ec6ad513 | ||
|
|
aec95f3fa6 | ||
|
|
1fe190998c | ||
|
|
aeca73bdd3 | ||
|
|
1d7fbe42d3 | ||
|
|
848497774b | ||
|
|
327826542d | ||
|
|
1d440035a4 | ||
|
|
51104a1d55 | ||
|
|
6222b22e2a | ||
|
|
b332e497ab | ||
|
|
75419120be | ||
|
|
94feeac119 | ||
|
|
cf058bb662 | ||
|
|
1e56e92502 | ||
|
|
2025e7c28a | ||
|
|
1d08090560 | ||
|
|
485df7517d | ||
|
|
2a4030e399 | ||
|
|
5743d7e048 | ||
|
|
3b8da60cf9 | ||
|
|
49a7b11e2b | ||
|
|
e5d255accd | ||
|
|
0e6bf74db1 | ||
|
|
9024d0f3e3 | ||
|
|
f0a802d2e1 | ||
|
|
9d67f1ac33 | ||
|
|
8c738d0687 | ||
|
|
7d35475104 | ||
|
|
1f5641069b | ||
|
|
f8eeac70a2 | ||
|
|
1279cb4ef3 | ||
|
|
2934157fb4 | ||
|
|
ddaca8a312 | ||
|
|
57cd5c9e6f | ||
|
|
31940c03b1 | ||
|
|
e223b506cb | ||
|
|
8bc4d1e460 | ||
|
|
56f267ec79 | ||
|
|
5f6b09b032 | ||
|
|
7de21b1f52 | ||
|
|
9c0deea6c8 | ||
|
|
62dbf9b02b | ||
|
|
0ddfd4c546 | ||
|
|
5abb4060f3 | ||
|
|
9ba4ced65d | ||
|
|
49c4dd197e | ||
|
|
3d830fb608 | ||
|
|
47b5cd7db7 | ||
|
|
d4aeb8e223 | ||
|
|
c76be3c4dd | ||
|
|
b17a3780ab | ||
|
|
b612347ee7 | ||
|
|
06a76579db | ||
|
|
13db4025b6 | ||
|
|
07fa7da920 | ||
|
|
0be127eda7 | ||
|
|
fe01f29872 | ||
|
|
a1dca420e4 | ||
|
|
2585512946 | ||
|
|
7a1e10ee13 | ||
|
|
99c16d5514 | ||
|
|
ee99cb7990 | ||
|
|
c2fb252a6e | ||
|
|
7d00941876 | ||
|
|
db59caa764 | ||
|
|
4218e3f81b | ||
|
|
11a14aed76 | ||
|
|
ae3ca8aa2d | ||
|
|
0bce4a95b7 | ||
|
|
60ab5cefd0 | ||
|
|
793f14c3e0 | ||
|
|
bb1e49dd8e | ||
|
|
4108c7710b | ||
|
|
3fb684d608 | ||
|
|
e2d00bec41 | ||
|
|
aa4fb96b8b | ||
|
|
c307f63e1f | ||
|
|
1494247c85 | ||
|
|
d6b8ae6297 | ||
|
|
233af34bdc | ||
|
|
b3a8a66c0e | ||
|
|
d3202b3210 | ||
|
|
a08b5a1863 | ||
|
|
1f75e014d3 | ||
|
|
19891408db | ||
|
|
57c4f13e53 | ||
|
|
4854c72cbb | ||
|
|
d440739b8b | ||
|
|
2d49054a95 | ||
|
|
2fb22d813f | ||
|
|
6c02bf0c70 | ||
|
|
172600415d | ||
|
|
c55b032928 | ||
|
|
1d79ef60c3 | ||
|
|
e279817839 | ||
|
|
c8983bf7db | ||
|
|
ab5233032d | ||
|
|
535e3c982d | ||
|
|
2d5f721301 | ||
|
|
5c746f869a | ||
|
|
4485aa3109 | ||
|
|
b8437fbd01 | ||
|
|
7e20ef5dd6 | ||
|
|
04116b3a37 | ||
|
|
086f791c9f | ||
|
|
86c22c2e29 | ||
|
|
95241da47c | ||
|
|
683b8a2848 | ||
|
|
8dbe06941c | ||
|
|
af2e416ea1 | ||
|
|
e576b05078 | ||
|
|
78c6d60655 | ||
|
|
cbb1cc2b85 | ||
|
|
8a3636d10f | ||
|
|
2721e681ef | ||
|
|
8a41b2e08d | ||
|
|
dec78b9cbd | ||
|
|
7ab75811ad | ||
|
|
15043e1a11 | ||
|
|
4ef5236a53 | ||
|
|
2a06cfc5e2 | ||
|
|
60876f2f09 | ||
|
|
74fdca79f0 | ||
|
|
c3c7c78e46 | ||
|
|
24a5c2c03c | ||
|
|
9113c86196 | ||
|
|
06b993181c | ||
|
|
a579544130 | ||
|
|
a8bfa88cac | ||
|
|
2742f333aa | ||
|
|
b6329b1964 | ||
|
|
d1b24d0077 | ||
|
|
8d93df1633 | ||
|
|
ef095d4fc0 | ||
|
|
1df6173041 | ||
|
|
fb50c4a4f0 | ||
|
|
febe3123dd | ||
|
|
23ad20ed13 | ||
|
|
bce084841e | ||
|
|
172236e58d | ||
|
|
b848f98481 | ||
|
|
a69e7ee7cf | ||
|
|
e5493573d5 | ||
|
|
bdbc14b9c1 | ||
|
|
f82b40ef49 | ||
|
|
7958db6a17 | ||
|
|
ed8cd7f30e | ||
|
|
43f11f5d49 | ||
|
|
5a1fa1025d | ||
|
|
879f0815cb | ||
|
|
bff84ae8d5 | ||
|
|
4e0db8e540 | ||
|
|
85ff412768 | ||
|
|
2b695a985d | ||
|
|
a1a75954ae | ||
|
|
c8a5e846c1 | ||
|
|
e3e47717c6 | ||
|
|
515f257ee3 | ||
|
|
71795fd775 | ||
|
|
a69116738f | ||
|
|
f87887920a | ||
|
|
8cda9a08da | ||
|
|
684503245c | ||
|
|
7760f541fb | ||
|
|
4f73fd62c9 | ||
|
|
77c8458fbf | ||
|
|
7f7ba5306d | ||
|
|
612e2126ee | ||
|
|
dd43b3b7da | ||
|
|
27af9432e0 | ||
|
|
80d0c2a405 | ||
|
|
774cf2d6d0 | ||
|
|
8270edbc78 | ||
|
|
b791e8efda | ||
|
|
130d039101 | ||
|
|
ebee88dd39 | ||
|
|
ad25462bd5 | ||
|
|
563a990f0d | ||
|
|
b248b39dc7 | ||
|
|
a9ec2af342 | ||
|
|
1fdc34b43c | ||
|
|
11dc04262b | ||
|
|
5e4070188b | ||
|
|
5c08439633 | ||
|
|
e686472eeb | ||
|
|
152a3c4943 | ||
|
|
82a4176816 | ||
|
|
9a4830808d | ||
|
|
722bc3e74b | ||
|
|
1616fadfe9 | ||
|
|
71e8ba44fc | ||
|
|
e801c8f44e | ||
|
|
4fa04f6eec | ||
|
|
f308587624 | ||
|
|
8406802a05 | ||
|
|
778ae8aced | ||
|
|
49dd8b3c9d | ||
|
|
1ecd4bfd5a | ||
|
|
235b7e5ff3 | ||
|
|
68c582a02a | ||
|
|
d0ef86c9a8 | ||
|
|
9c89f55274 | ||
|
|
26434d26fe | ||
|
|
d237a1e037 | ||
|
|
6c7a1b335b | ||
|
|
ad65816c35 | ||
|
|
ed28a5dc62 | ||
|
|
9fee3d4c59 | ||
|
|
0349169097 | ||
|
|
09e1c844f4 | ||
|
|
9b1b69fcae | ||
|
|
4dd57daec0 | ||
|
|
7813d18b1b | ||
|
|
f35bff4f59 | ||
|
|
fd47620817 | ||
|
|
b949b512e2 | ||
|
|
00aefa50ed | ||
|
|
1a5abcbcbc | ||
|
|
90568da797 | ||
|
|
2035a9a800 | ||
|
|
d29bc41ae7 | ||
|
|
25637defa8 | ||
|
|
82616b9891 | ||
|
|
067f75389b | ||
|
|
0e6132800e | ||
|
|
0a76e46d8f | ||
|
|
77d4925f38 | ||
|
|
e1f95b54d5 | ||
|
|
092989cdd0 | ||
|
|
27ab57eede | ||
|
|
e80a17540c | ||
|
|
72fb77894e | ||
|
|
70f8707b04 | ||
|
|
0d33a1d479 | ||
|
|
5d38e60076 | ||
|
|
431f538536 | ||
|
|
fc08cb8e52 | ||
|
|
d65ec29408 | ||
|
|
758ef2313a | ||
|
|
a118824cf5 | ||
|
|
479e73e950 | ||
|
|
af6e352083 | ||
|
|
5786530cda | ||
|
|
7e5b60917b | ||
|
|
3695ff3d03 | ||
|
|
be2af197c3 | ||
|
|
9d983e7486 | ||
|
|
acbbc723eb | ||
|
|
7c7df2240b | ||
|
|
c43f253805 | ||
|
|
756e2cf0c3 | ||
|
|
6087e786f5 | ||
|
|
9fa5681a4f | ||
|
|
182b6977bd | ||
|
|
3da7079777 | ||
|
|
992f99190b | ||
|
|
dfee5fdea9 | ||
|
|
aa9b735a50 | ||
|
|
9a3005e3c5 | ||
|
|
92ea756d91 | ||
|
|
5e84ca35f2 | ||
|
|
ee20bf70e0 | ||
|
|
8cb098c6e0 | ||
|
|
3054a67078 | ||
|
|
6e2d9ca3cc | ||
|
|
eff72b73ab | ||
|
|
eb29d68958 | ||
|
|
e0632dee09 | ||
|
|
0866a62a1f | ||
|
|
1a7fd382a9 | ||
|
|
c772c2d4ad | ||
|
|
e47ac59860 | ||
|
|
4f003bb5fa | ||
|
|
74c1e7473a | ||
|
|
51d2724dfd | ||
|
|
5fefa85f4a | ||
|
|
e8a935570b | ||
|
|
ce71168ed9 | ||
|
|
cdc96ca574 | ||
|
|
d121aa3415 | ||
|
|
6aaeb9e1f1 | ||
|
|
fa39629104 | ||
|
|
9e13593c11 | ||
|
|
0b3970d7c1 | ||
|
|
95c09f2ce5 | ||
|
|
c78619aad3 | ||
|
|
566da30513 | ||
|
|
f8c8ac4371 | ||
|
|
1951722fdb | ||
|
|
90d2856581 | ||
|
|
4fdeb4902e | ||
|
|
df3a492d3a | ||
|
|
e180e5a52a | ||
|
|
3c4dd26c20 | ||
|
|
f5fc509f14 | ||
|
|
2d00203a1f | ||
|
|
f1ac509032 | ||
|
|
5d4705b9fa | ||
|
|
ac23ab21b8 | ||
|
|
6cb85dc6a5 | ||
|
|
5b8b8e4ebb | ||
|
|
a6b1c6b222 | ||
|
|
0261df0d48 | ||
|
|
b3d18be643 | ||
|
|
2709938f9f | ||
|
|
53e1c790d8 | ||
|
|
f2f9fc4ed6 | ||
|
|
3cbf9c7101 | ||
|
|
c655d9e8fc | ||
|
|
2ef7f7cf36 | ||
|
|
418f0972a9 | ||
|
|
9a777efd52 | ||
|
|
aa8a329c7b | ||
|
|
e4930a144f | ||
|
|
194014007f | ||
|
|
dc8f2c1466 | ||
|
|
6ee48c74f7 | ||
|
|
136a9e8218 | ||
|
|
34045ea62b | ||
|
|
267edbee7d | ||
|
|
da882ebcd2 | ||
|
|
ed0ba1ed98 | ||
|
|
ef9dd3aa28 | ||
|
|
73b9abd38b | ||
|
|
6e399fe0ed | ||
|
|
5f9ed17091 | ||
|
|
1f4b3913b6 | ||
|
|
dc9b9509d7 | ||
|
|
b4f34c8643 | ||
|
|
52544a8b25 | ||
|
|
017500a6b5 | ||
|
|
425ae30e62 | ||
|
|
1aa09d8987 | ||
|
|
a45196dc97 | ||
|
|
8d7ab6fdd3 | ||
|
|
87870bcde7 | ||
|
|
9b85c1b0f7 | ||
|
|
104012228c | ||
|
|
e3deb40f69 | ||
|
|
492b290845 | ||
|
|
3eb2a5664a | ||
|
|
15fd233e56 | ||
|
|
912f697cff | ||
|
|
d827228dc2 | ||
|
|
84073a53cb | ||
|
|
f562573640 | ||
|
|
66aa66954c | ||
|
|
99275dfe59 | ||
|
|
efded08d6e | ||
|
|
d726f15aa3 | ||
|
|
7c6cd30aea | ||
|
|
879b5ef272 | ||
|
|
91a57e1a16 | ||
|
|
3698afb8a6 | ||
|
|
8e1b2bc6e4 | ||
|
|
37dd107281 | ||
|
|
2d3b41c62d | ||
|
|
c9b8fc0e1b | ||
|
|
7eb57b674a | ||
|
|
25b33d0204 | ||
|
|
d47faed870 | ||
|
|
9a8efdf9cd | ||
|
|
593fd20a15 | ||
|
|
ef75582e20 | ||
|
|
7440074491 | ||
|
|
9688ed0f51 | ||
|
|
45d415e547 | ||
|
|
b2c7e22634 | ||
|
|
4581077dcd | ||
|
|
729f83b3d4 | ||
|
|
bf361db5fc | ||
|
|
328e9b20de | ||
|
|
484a34cd92 | ||
|
|
5ab4d916b0 | ||
|
|
f0974e0d24 | ||
|
|
06a5aa6d01 | ||
|
|
a88829bd57 | ||
|
|
c023c74ae5 | ||
|
|
a8ad14222d | ||
|
|
6c6871f607 | ||
|
|
5764e5e686 | ||
|
|
b89044a709 | ||
|
|
5fc4755d3b | ||
|
|
2f2adaaee8 | ||
|
|
e2ae24faa9 | ||
|
|
55bc84c118 | ||
|
|
a47d5d00b3 | ||
|
|
05c2b98929 | ||
|
|
c5d3098b25 | ||
|
|
6805f32a13 | ||
|
|
b8aa250a22 | ||
|
|
bf05a36dfe | ||
|
|
8f9cdad916 | ||
|
|
d2ed424a7c | ||
|
|
369d2cb390 | ||
|
|
dcaa9a35c3 | ||
|
|
4a80691e07 | ||
|
|
215b2cdfa8 | ||
|
|
425831a7ae | ||
|
|
984e0455b1 | ||
|
|
00ecfb30f3 | ||
|
|
c18f20e483 | ||
|
|
71c5ff8c51 | ||
|
|
1996dd7de8 | ||
|
|
e87daa2361 | ||
|
|
987feb1385 | ||
|
|
8d048c689f | ||
|
|
139ef04e0a | ||
|
|
4c01e6c93e | ||
|
|
27744ba747 | ||
|
|
3d3c6f4eba | ||
|
|
fb4abc5f5f | ||
|
|
f29b141d69 | ||
|
|
1cecd09423 | ||
|
|
0142e76270 | ||
|
|
5f8c7f41ec | ||
|
|
451baff26e | ||
|
|
78accfe98b | ||
|
|
0e8e27877e | ||
|
|
d8a993bc86 | ||
|
|
ec7dbbdc8b | ||
|
|
c45652de81 | ||
|
|
e152cfd10f | ||
|
|
17a0590ee4 | ||
|
|
653edb064b | ||
|
|
40f5d57737 | ||
|
|
566c5cb38f | ||
|
|
7e3058e3f0 | ||
|
|
053d8a3fd5 | ||
|
|
0e810c15e2 | ||
|
|
6b9154d1f3 | ||
|
|
2d7a3232cc | ||
|
|
96d7c4790f | ||
|
|
c0b9ada21c | ||
|
|
7b116b41ae | ||
|
|
0619f7c656 | ||
|
|
48083b203a | ||
|
|
f8aa9fed91 | ||
|
|
c55521ac4a | ||
|
|
cdcb76cc55 | ||
|
|
def726a012 | ||
|
|
7d1291e2b9 | ||
|
|
a0297e9d65 | ||
|
|
f46ad2d032 | ||
|
|
0c807b6108 | ||
|
|
3a47d6a580 | ||
|
|
52947b3a2c | ||
|
|
eacfc798f4 | ||
|
|
5c0e5f3c01 | ||
|
|
985141b842 | ||
|
|
1aac2ab95d | ||
|
|
aa7d5ddf59 | ||
|
|
e87505378d | ||
|
|
53f097c2b3 | ||
|
|
6ea7fe9dba | ||
|
|
0206f1b0c7 | ||
|
|
ef9f2c77dd | ||
|
|
822292f541 | ||
|
|
ec08cd9374 | ||
|
|
8fb4063cf2 | ||
|
|
8a2b444c48 | ||
|
|
9c6f243902 | ||
|
|
d5bd99b363 | ||
|
|
5554c07cbf | ||
|
|
acd95aac6f | ||
|
|
8ad5f2624d | ||
|
|
8adc0e1c17 | ||
|
|
fab66cf3a5 | ||
|
|
5df48e7a68 | ||
|
|
079a8c5728 | ||
|
|
d9196426a1 | ||
|
|
2f686f5b74 | ||
|
|
c4b5df20a9 | ||
|
|
06608a6d3c | ||
|
|
fd63911faf | ||
|
|
66a1e55867 | ||
|
|
af2eb2e75d | ||
|
|
9b4f32cafd | ||
|
|
9179fbd1a2 | ||
|
|
24ea7f1f55 | ||
|
|
9b95053110 | ||
|
|
71ffb9c72f | ||
|
|
f29f698f61 | ||
|
|
f1f8579a0b | ||
|
|
4ca8fab750 | ||
|
|
b80ed731b0 | ||
|
|
23a9a73600 | ||
|
|
dc8c0b6522 | ||
|
|
e695b1942c | ||
|
|
3f543e7e84 | ||
|
|
7f6f9e82e3 | ||
|
|
51529eb0ce | ||
|
|
05b24a4b75 | ||
|
|
ca5819489f | ||
|
|
1d2acf8096 | ||
|
|
98278e965b | ||
|
|
7bc990688c | ||
|
|
b86aa6d473 | ||
|
|
fa52e18e3f | ||
|
|
b605753a6d | ||
|
|
0af4fb351c | ||
|
|
90edf95077 | ||
|
|
ab3843442a | ||
|
|
023b9dd708 | ||
|
|
0ac882314e | ||
|
|
0fe9264582 | ||
|
|
b1e16b2206 | ||
|
|
a67c1780c1 | ||
|
|
1170f2f58d | ||
|
|
199c0a08ea | ||
|
|
84ad152536 | ||
|
|
5b0f905ae3 | ||
|
|
a2bba8f09d | ||
|
|
2007975428 | ||
|
|
e484997515 | ||
|
|
af5c52c52f | ||
|
|
f3d0e10378 | ||
|
|
b33ab43ff9 | ||
|
|
c580399db6 | ||
|
|
00d8717d7c | ||
|
|
6e2f4607a6 | ||
|
|
3a7abeb18b | ||
|
|
84a5984c65 | ||
|
|
1465c26b1f | ||
|
|
b399d8e3b9 | ||
|
|
b5c04bdc9b | ||
|
|
b4725800c3 | ||
|
|
2b1a102efa | ||
|
|
500c548af4 | ||
|
|
fc7017f822 | ||
|
|
5b254f4cf8 | ||
|
|
43783f3ce6 | ||
|
|
ae39aabee1 | ||
|
|
df7a94148b | ||
|
|
63890661fe | ||
|
|
793ac1a1bb | ||
|
|
77db54c50d | ||
|
|
b259927348 | ||
|
|
e8972a6aa5 | ||
|
|
8d8420c0d6 | ||
|
|
7a6707f597 | ||
|
|
b0ec66cce8 | ||
|
|
edfd7db88b | ||
|
|
fb3e68e16e | ||
|
|
080ab9e289 | ||
|
|
f67e441b83 | ||
|
|
9c07d69c45 | ||
|
|
13207f13ad | ||
|
|
34f83ebde2 | ||
|
|
14ed805656 | ||
|
|
385233c508 | ||
|
|
8a3b987cd5 | ||
|
|
bdd17fc56a | ||
|
|
29b3c081ee | ||
|
|
b1d80b6c5f | ||
|
|
e00560f81a | ||
|
|
20f17130a2 | ||
|
|
583156d2f3 | ||
|
|
88f36f4987 | ||
|
|
965c8cfbe9 | ||
|
|
b8f00243e6 | ||
|
|
1d97f98515 | ||
|
|
9764cf3f65 | ||
|
|
1f5df81496 | ||
|
|
5f76a0255c | ||
|
|
17f3ca6eba | ||
|
|
b29d79738b | ||
|
|
020cdd7324 | ||
|
|
1e39f3b22d | ||
|
|
37035a488d | ||
|
|
745b418cd7 | ||
|
|
2a02c8bc4f | ||
|
|
a15e063b92 | ||
|
|
2051fed5b7 | ||
|
|
268714863e | ||
|
|
60c6532307 | ||
|
|
2a0a9a225c | ||
|
|
aee92b58c7 | ||
|
|
16db950009 | ||
|
|
bde33e7188 | ||
|
|
267efbe164 | ||
|
|
f9e137c994 | ||
|
|
e7f9751403 | ||
|
|
9adf81294d | ||
|
|
3033818589 | ||
|
|
06d663680c | ||
|
|
1bbdca5032 | ||
|
|
c1654a988e | ||
|
|
18a540c867 | ||
|
|
99fc8df322 | ||
|
|
2d21cb8b1e | ||
|
|
d8008654b9 | ||
|
|
146295fb1e | ||
|
|
09ed480628 | ||
|
|
5dd1554e5d | ||
|
|
748f329c8e | ||
|
|
7228b25393 | ||
|
|
63e083ea37 | ||
|
|
b1630feb5d | ||
|
|
1185a91c90 | ||
|
|
dce6d7894b | ||
|
|
375ee0d1fa | ||
|
|
ce0574f897 | ||
|
|
c515111446 | ||
|
|
7d6393628e | ||
|
|
24fde7261a | ||
|
|
3d922abf1a | ||
|
|
7f1d3a94fe | ||
|
|
3d774b7585 | ||
|
|
b0083548b6 | ||
|
|
905dae3b16 | ||
|
|
d79979371b | ||
|
|
c4bff94f7d | ||
|
|
7c4fd3858c | ||
|
|
3b9af8883d | ||
|
|
29b34d7de0 | ||
|
|
90fcf448c7 | ||
|
|
5193551d04 | ||
|
|
d2660e0755 | ||
|
|
2d8ac27fdd | ||
|
|
dd2ddfeb40 | ||
|
|
ac3396e6c4 | ||
|
|
49a5b38589 | ||
|
|
6e2f792bb9 | ||
|
|
da098fd46a | ||
|
|
3e081b340f | ||
|
|
698015a03d | ||
|
|
000a10f936 | ||
|
|
c764e31c8a | ||
|
|
c18021d52a | ||
|
|
3d0cc67415 | ||
|
|
3f94a6fda9 | ||
|
|
7f0eefbde5 | ||
|
|
280377985f | ||
|
|
d5b3f070a5 | ||
|
|
3505ef046d | ||
|
|
a6bc565356 | ||
|
|
a1ee3cf4e4 | ||
|
|
e96445abe3 | ||
|
|
c22fae0d3d | ||
|
|
d888dcd085 | ||
|
|
184cb9ea3a | ||
|
|
3cf6e8762c | ||
|
|
f0cdd7c03e | ||
|
|
5e40201888 | ||
|
|
f2c2debb28 | ||
|
|
997c772b7c | ||
|
|
bc4a09f80d | ||
|
|
0e3e7497ac | ||
|
|
72313ac9ec | ||
|
|
dc80228f0b | ||
|
|
a83642a7e3 | ||
|
|
00d8403095 | ||
|
|
e1ec8e9742 | ||
|
|
0725af5367 | ||
|
|
65e543af02 | ||
|
|
b49e8315eb | ||
|
|
c5a89112b4 | ||
|
|
94ec474ffa | ||
|
|
da4593fdc1 | ||
|
|
b8413cefaf | ||
|
|
d3097e4fd0 | ||
|
|
51753f0716 | ||
|
|
b7ada873b8 | ||
|
|
ed8b08a9e4 | ||
|
|
e1fdb6803d | ||
|
|
5cb9f2f42f | ||
|
|
fcf48ed2e5 | ||
|
|
050512536a | ||
|
|
99207fca13 | ||
|
|
55890b4fd8 | ||
|
|
6fdfaccc92 | ||
|
|
76e01e7aea | ||
|
|
87378562ea | ||
|
|
77d80f12f3 | ||
|
|
e400207a65 | ||
|
|
4b68036a1b | ||
|
|
a95b716aa7 | ||
|
|
dc8efded34 | ||
|
|
e016b17276 | ||
|
|
b99876f0b4 | ||
|
|
66abc842b7 | ||
|
|
9f36158c67 | ||
|
|
18c1ca3919 | ||
|
|
0c729e5b0a | ||
|
|
55f3b78ab1 | ||
|
|
a73b796ca7 | ||
|
|
bb0bca7ef1 | ||
|
|
b3144ee921 | ||
|
|
a86ce7cb28 | ||
|
|
ccf2a780b6 | ||
|
|
b0c1dbe4b7 | ||
|
|
ec73eef695 | ||
|
|
467d68344e | ||
|
|
8899b3ebb8 | ||
|
|
5478cfaf9f | ||
|
|
4b6a85f30a | ||
|
|
a045107cc7 | ||
|
|
c97edb60a5 | ||
|
|
c953ffb471 | ||
|
|
3d7fa06129 | ||
|
|
49d4fbcf3d | ||
|
|
fc18a40c35 | ||
|
|
1e81d5e38c | ||
|
|
daf8b53c0d | ||
|
|
6bf669815d | ||
|
|
8ba49e163d | ||
|
|
26918d90ab | ||
|
|
929b0806dc | ||
|
|
3e32e61db1 | ||
|
|
038693bffb | ||
|
|
9445aa43e6 | ||
|
|
bb16dbab78 | ||
|
|
658212e7be | ||
|
|
e91554770c | ||
|
|
8f9671ad32 | ||
|
|
7f134e39f4 | ||
|
|
c87e3f419d | ||
|
|
07b2767ac9 | ||
|
|
0ca24a9786 | ||
|
|
c84c1366e7 | ||
|
|
ebf9bb5c18 | ||
|
|
70b67a0805 | ||
|
|
545b97716f | ||
|
|
7e540e0623 | ||
|
|
f7140522f6 | ||
|
|
bd2f7088e9 | ||
|
|
5260c181a1 | ||
|
|
a9538adf2b | ||
|
|
abf6d6638e | ||
|
|
36e52146f5 | ||
|
|
24eaa24839 | ||
|
|
fafd72fcd8 | ||
|
|
df9b219a16 | ||
|
|
5c9c378889 | ||
|
|
47e1eab6c1 | ||
|
|
d88f56316d | ||
|
|
8b414c388d | ||
|
|
acb828eacf | ||
|
|
293dfad87e | ||
|
|
e4e1927126 | ||
|
|
edf6f86cb5 | ||
|
|
d086664a61 | ||
|
|
b0c171f453 | ||
|
|
feed15f75b | ||
|
|
95fd54d909 | ||
|
|
79f6380aae | ||
|
|
8478d690a0 | ||
|
|
5db8197db2 | ||
|
|
8407e5b295 | ||
|
|
3e3b4548e9 | ||
|
|
868a61dd34 | ||
|
|
a614c8c7cc | ||
|
|
de61d88d29 | ||
|
|
9d86c0a9db | ||
|
|
dc57bef5f3 | ||
|
|
2721bb511a | ||
|
|
1e07cb9b5b | ||
|
|
39a4a1e9bf | ||
|
|
7a56a361a0 | ||
|
|
d54359d441 | ||
|
|
98d0538868 | ||
|
|
f03921690c | ||
|
|
46869de29c | ||
|
|
b7b29b3f84 | ||
|
|
b9e1d9af6e | ||
|
|
edf313a7a2 | ||
|
|
4f22d1c918 | ||
|
|
67fefb53ad | ||
|
|
0ff5dc0016 | ||
|
|
ae17a77789 | ||
|
|
5f11ae7482 | ||
|
|
4d33eb2173 | ||
|
|
fe7873ddbe | ||
|
|
f95a4f5cc6 | ||
|
|
f973b61b5e | ||
|
|
f1d4192ae7 | ||
|
|
fb500d3e1c | ||
|
|
98b8f1f9e5 | ||
|
|
9324847bac | ||
|
|
14347ebf88 | ||
|
|
3e0188e40b | ||
|
|
7c6471fe2a | ||
|
|
647ec528d3 | ||
|
|
667ad5c580 | ||
|
|
b82f17f367 | ||
|
|
2e4866f5fa | ||
|
|
3f28dc59ea | ||
|
|
77deea8ad4 | ||
|
|
077ba28706 | ||
|
|
db2caf4b04 | ||
|
|
464a65b574 | ||
|
|
e27f638fe3 | ||
|
|
00ae0988ab | ||
|
|
ce4350bc63 | ||
|
|
aa60d9f53d | ||
|
|
7cb7891fa7 | ||
|
|
3848a266d0 | ||
|
|
29b8c1d124 | ||
|
|
813ab70895 | ||
|
|
efcaf00e88 | ||
|
|
5476ef4fa8 | ||
|
|
5857882417 | ||
|
|
fe4d178fb4 | ||
|
|
247e45bfea | ||
|
|
b7784a23ff | ||
|
|
fa4893804e | ||
|
|
373130d8ac | ||
|
|
8e781976eb | ||
|
|
266b56f947 | ||
|
|
2b8adfee05 | ||
|
|
d4c4f8593e | ||
|
|
1f8aa032c4 | ||
|
|
7194f7b674 | ||
|
|
24db4cfc49 | ||
|
|
7781389dea | ||
|
|
30f09994d6 | ||
|
|
babd50fb6c | ||
|
|
5da88d2751 | ||
|
|
1f23f20163 | ||
|
|
dadce54a6a | ||
|
|
0d3d396229 | ||
|
|
6c39e432d2 | ||
|
|
2a6437a2f1 | ||
|
|
52fcf7c39d | ||
|
|
f47d3faea9 | ||
|
|
d1e7ec2e22 | ||
|
|
1efab799b5 | ||
|
|
7ad9996cc3 | ||
|
|
00ec536761 | ||
|
|
3f2d9b42c8 | ||
|
|
ce76eeb512 | ||
|
|
1bc4a6f208 | ||
|
|
8595b7972b | ||
|
|
22054e232f | ||
|
|
5876b6693a | ||
|
|
9ef501fe0c | ||
|
|
08790aa9a8 | ||
|
|
79f244f012 | ||
|
|
143653e2ce | ||
|
|
ef83d874c3 | ||
|
|
eb999c3dc9 | ||
|
|
9a455901dd | ||
|
|
c207fe563e | ||
|
|
ce8e985e56 | ||
|
|
0f4c65f689 | ||
|
|
f332cee568 | ||
|
|
0fa53d5f5d | ||
|
|
e5933811fd | ||
|
|
9ae506ad07 | ||
|
|
12101f6014 | ||
|
|
93af0e7992 | ||
|
|
abfa90755e | ||
|
|
f302c8a5d4 | ||
|
|
b7da95bc36 | ||
|
|
14b014be20 | ||
|
|
9669fe90d7 | ||
|
|
e0d51beb84 | ||
|
|
198046a5d3 | ||
|
|
16dd2fea4c | ||
|
|
b8a38c2fb6 | ||
|
|
9a2906e9db | ||
|
|
578140256b | ||
|
|
c614d27f3e | ||
|
|
538dff16a6 | ||
|
|
fd1118d493 | ||
|
|
6bb00c73de | ||
|
|
cca7eb6c6d | ||
|
|
a35aad61ee | ||
|
|
f30a586b5c | ||
|
|
03fadd86f0 | ||
|
|
2d133f3d57 | ||
|
|
fa60b93ff9 | ||
|
|
65729d9d86 | ||
|
|
15d3d8c709 | ||
|
|
8b49eca549 | ||
|
|
2cd2cb0480 | ||
|
|
5c1112f552 | ||
|
|
f84363fbf1 | ||
|
|
3afce91504 | ||
|
|
57b18edb55 | ||
|
|
2c278c1fde | ||
|
|
1ae743e60c | ||
|
|
3f701f8c55 | ||
|
|
cff36d7cde | ||
|
|
4153dbb8e5 | ||
|
|
d2ee4310e6 | ||
|
|
575282dbe8 | ||
|
|
2f3c5b59a5 | ||
|
|
fb91c361bc | ||
|
|
dce8c78882 | ||
|
|
129b5d58d7 | ||
|
|
9a454a9c89 | ||
|
|
63bb99d2f1 | ||
|
|
60644c38dd | ||
|
|
8ff21e6718 | ||
|
|
34a079aae4 | ||
|
|
a73972f11a | ||
|
|
f18dbbaf4c | ||
|
|
633f0a7c6d | ||
|
|
3ffd6ed833 | ||
|
|
da74bd7428 | ||
|
|
51615f4ada | ||
|
|
9c0525f292 | ||
|
|
952ed806ac | ||
|
|
86ca9cf01c | ||
|
|
d4bac5a6da | ||
|
|
cfdead2bbf | ||
|
|
357ebbb6be | ||
|
|
3908ada113 | ||
|
|
93ae7fbaee | ||
|
|
dbe4bb87d0 | ||
|
|
565152dee0 | ||
|
|
29fb88fbdc | ||
|
|
70831690a5 | ||
|
|
d90da464b3 | ||
|
|
d81b08eda7 | ||
|
|
37f6bef152 | ||
|
|
8ed6ebb0fe | ||
|
|
83ceb1b1f7 | ||
|
|
4cef330f0b | ||
|
|
8573c3736a | ||
|
|
bee065d603 | ||
|
|
0f1f336c3a | ||
|
|
66d5eab041 | ||
|
|
075c5f90cc | ||
|
|
28b88f1566 | ||
|
|
70e347cfce | ||
|
|
42987d96e3 | ||
|
|
2c85f1cc2b | ||
|
|
35c67d6e8f | ||
|
|
c91d06e4c6 | ||
|
|
b991bf5301 | ||
|
|
d2ecdf2016 | ||
|
|
c27497dd16 | ||
|
|
da58ff3d7a | ||
|
|
e366cdfb05 | ||
|
|
e92e9296c7 | ||
|
|
67d17080e6 | ||
|
|
345ed1178c | ||
|
|
e54c614f9f | ||
|
|
f8c02d065e | ||
|
|
07fe7f4f89 | ||
|
|
546bb9bb13 | ||
|
|
5208304ef6 | ||
|
|
9ce5cc8f77 | ||
|
|
bef9e3c5ce | ||
|
|
572bb429ce | ||
|
|
955e985f4d | ||
|
|
fab8667dd4 | ||
|
|
03a8baf51c | ||
|
|
1f2f259554 | ||
|
|
989f5f5b61 | ||
|
|
063b31e7e6 | ||
|
|
9abbb85b4a | ||
|
|
2ecebd14b0 | ||
|
|
2f38277993 | ||
|
|
faf690b833 | ||
|
|
506517901d | ||
|
|
2a1f5500bd | ||
|
|
38fad35119 | ||
|
|
502eab85bf | ||
|
|
567169c4cb | ||
|
|
cdc3f45257 | ||
|
|
f7ff0f8ad5 | ||
|
|
f9ac87db3a | ||
|
|
b712174136 | ||
|
|
81ca34ea1d | ||
|
|
27a2f462a0 | ||
|
|
986664a766 | ||
|
|
3a4bea928a | ||
|
|
0ad8c43c7b | ||
|
|
87ddd619de | ||
|
|
5827fe4a22 | ||
|
|
bd06842375 | ||
|
|
71c8dcb595 | ||
|
|
1b76486bff | ||
|
|
7b1d5efe0d | ||
|
|
9d7a46fe94 | ||
|
|
e494c87e28 | ||
|
|
6215f148b5 | ||
|
|
7f35c69b12 | ||
|
|
0688909fb7 | ||
|
|
a5e2f76cb8 | ||
|
|
119e52fa15 | ||
|
|
083ef6d474 | ||
|
|
d7bbbb2d76 | ||
|
|
2fa9f79962 | ||
|
|
8fdac33219 | ||
|
|
d3e4adb3c4 | ||
|
|
469ab56b64 | ||
|
|
89c694443d | ||
|
|
6fd95154bb | ||
|
|
4de2665192 | ||
|
|
23d38083f6 | ||
|
|
0ae486737f | ||
|
|
cd3aa54a12 | ||
|
|
ec55020f77 | ||
|
|
d4461f075b | ||
|
|
f67bb675a1 | ||
|
|
a084f804f2 | ||
|
|
a898f97d21 | ||
|
|
9c3b062cff | ||
|
|
dd00f34cb8 | ||
|
|
b9e24712a8 | ||
|
|
1ebbef257e | ||
|
|
e7aca138d3 | ||
|
|
f0ed155814 | ||
|
|
838ddabd3c | ||
|
|
5f3c20b71b | ||
|
|
76bff5a1a9 | ||
|
|
e7270f17fd | ||
|
|
aa709c4089 | ||
|
|
807032b0f0 | ||
|
|
b2597d1058 | ||
|
|
56bb8c0304 | ||
|
|
c4a51c2c9f | ||
|
|
c3cdf0238a | ||
|
|
f28fc339df | ||
|
|
45be24192e | ||
|
|
bb2929dfe9 | ||
|
|
5b2cf24840 | ||
|
|
19688ffcb5 | ||
|
|
0baab3ae9f | ||
|
|
9364c07c81 | ||
|
|
b46ab8aa5b | ||
|
|
9d70a93619 | ||
|
|
688ec17cba | ||
|
|
8bdef0dc57 | ||
|
|
826fa8e225 | ||
|
|
c41e58b1d7 | ||
|
|
198c181ed7 | ||
|
|
665974a21e | ||
|
|
be4af2403b | ||
|
|
19a4480b96 | ||
|
|
f58df3c48f | ||
|
|
a19e20e347 | ||
|
|
cb074afd85 | ||
|
|
03613481a3 | ||
|
|
7e3226e596 | ||
|
|
c7c81e5380 | ||
|
|
b3c1584630 | ||
|
|
889a1a147c | ||
|
|
795268a98b | ||
|
|
70a36602e8 | ||
|
|
46736becc7 | ||
|
|
af160168f1 | ||
|
|
6e21a3f56a | ||
|
|
86f29ebe57 | ||
|
|
cf867d29a0 | ||
|
|
93a3d800ef | ||
|
|
056ad33f50 | ||
|
|
e750e1b183 | ||
|
|
257949505c | ||
|
|
b688660ff3 | ||
|
|
ddc98f99da | ||
|
|
8e41b51cb7 | ||
|
|
0675ce718c | ||
|
|
25ac6a0600 | ||
|
|
e8ca646070 | ||
|
|
ce8fd4d3ef | ||
|
|
26d1973110 | ||
|
|
c4cd355f5b | ||
|
|
4a59b8ae43 | ||
|
|
c3f2ddf3e4 | ||
|
|
8cbb86045e | ||
|
|
e54b202de3 | ||
|
|
6466241cbb | ||
|
|
dbccdbd51f | ||
|
|
3141336c9b | ||
|
|
07bf588aa4 | ||
|
|
ce84648689 | ||
|
|
cdef7d62c8 | ||
|
|
440c27d27b | ||
|
|
e82b90b117 | ||
|
|
1ecf147764 | ||
|
|
58b9ecf030 | ||
|
|
0e28dc835e | ||
|
|
8800f48312 | ||
|
|
6315004a24 | ||
|
|
ee63192512 | ||
|
|
1c9dec6ea4 | ||
|
|
6fd85c8dbd | ||
|
|
80e4ed1746 | ||
|
|
06b5a93fe9 | ||
|
|
7ca2e9b5f0 | ||
|
|
274ff3d8c0 | ||
|
|
42e6d587d8 | ||
|
|
c13daf7780 | ||
|
|
e47b3e73d3 | ||
|
|
38a7b0d7ab | ||
|
|
e13c5c214a | ||
|
|
a975786b7b | ||
|
|
0bccaf5458 | ||
|
|
9b760da29b | ||
|
|
5a7ad45a7e | ||
|
|
3cf5c6e4ab | ||
|
|
659517001b | ||
|
|
4c94776ace | ||
|
|
76c4da7945 | ||
|
|
aacd9732f2 | ||
|
|
16b2cccea4 | ||
|
|
8922f6a486 | ||
|
|
d28656ce4b | ||
|
|
8c4f6d68e8 | ||
|
|
972987c515 | ||
|
|
09fc5b768e | ||
|
|
77caad9944 | ||
|
|
5c367ac598 | ||
|
|
867445cbd8 | ||
|
|
65df265e30 | ||
|
|
11869ad4ec | ||
|
|
62b8486431 | ||
|
|
11fc34cfed | ||
|
|
b5717c2cbb | ||
|
|
0c085a5aab | ||
|
|
5cee23cbfa | ||
|
|
1e168b3100 | ||
|
|
018f7a6dec | ||
|
|
a62e88f22b | ||
|
|
dc5ba9eff4 | ||
|
|
4bebdfe0c7 | ||
|
|
f8fd065192 | ||
|
|
9d38d0818b | ||
|
|
a1ad9b7f4d | ||
|
|
29cb55e91c | ||
|
|
0687d2ff78 | ||
|
|
cd04572b78 | ||
|
|
6bb47124a9 | ||
|
|
1a21186ba1 | ||
|
|
82d1193090 | ||
|
|
ea76ac024a | ||
|
|
ff52d61322 | ||
|
|
83e970731e | ||
|
|
c6ea5eb5e9 | ||
|
|
aa7a4111e6 | ||
|
|
2b01f832bd | ||
|
|
1401102396 | ||
|
|
8963d024a6 | ||
|
|
bb5e7b508f | ||
|
|
bfc9efea92 | ||
|
|
75feea3e75 | ||
|
|
e142f5ee61 | ||
|
|
9746c2db5d | ||
|
|
311598e3a6 | ||
|
|
109d19f02e | ||
|
|
bc5ea13821 | ||
|
|
e9cc34f481 | ||
|
|
9f254b6c84 | ||
|
|
4f442d1edc | ||
|
|
a1a10ab23d | ||
|
|
21beefd387 | ||
|
|
a7e03c9d5c | ||
|
|
49781f9717 | ||
|
|
ca12c69741 | ||
|
|
333814eab0 | ||
|
|
c18311eeb2 | ||
|
|
3caa0d1ef5 | ||
|
|
dc56f85881 | ||
|
|
532e035724 | ||
|
|
c3431e1ead | ||
|
|
3016e77897 | ||
|
|
cf69ba0d66 | ||
|
|
4e82891779 | ||
|
|
7fa3e7bf28 | ||
|
|
656c23a891 | ||
|
|
00f758dd98 | ||
|
|
8962d2b1e4 | ||
|
|
eefb761e98 | ||
|
|
9363da137f | ||
|
|
c4daae2f95 | ||
|
|
b201b21e46 | ||
|
|
c959fd9c48 | ||
|
|
0845b5e28a | ||
|
|
b9f9570033 | ||
|
|
baa0e73703 | ||
|
|
e97aaccfee | ||
|
|
f58cfd8571 | ||
|
|
1a43d31c50 | ||
|
|
d244442e70 | ||
|
|
a009c56271 | ||
|
|
f30af37faf | ||
|
|
bb4eea7999 | ||
|
|
e26b80d873 | ||
|
|
b23aa1bc4c | ||
|
|
e22655b440 | ||
|
|
8e57839271 | ||
|
|
16f779c8f5 | ||
|
|
bd08d787f2 | ||
|
|
df99fe0073 | ||
|
|
7a2fceaee9 | ||
|
|
bb69656bd7 | ||
|
|
5be0618b4d | ||
|
|
ad00252a4e | ||
|
|
84eee30d1f | ||
|
|
8975c2936c | ||
|
|
b64bfc9ab0 | ||
|
|
cc9f5ed096 | ||
|
|
2161daa398 | ||
|
|
f1a41394ab | ||
|
|
6d5bb6f887 | ||
|
|
9bcf9a7dcd | ||
|
|
6d69f03111 | ||
|
|
0b709ddb1a | ||
|
|
6ba780ba3b | ||
|
|
f0f24142b2 | ||
|
|
a716da14f7 | ||
|
|
d8a80479c2 | ||
|
|
8d4a55a3a4 | ||
|
|
0c0aa94ded | ||
|
|
0fd4991dd4 | ||
|
|
5f32ea64eb | ||
|
|
dc6705c74a | ||
|
|
4479f251a6 | ||
|
|
ac076fb892 | ||
|
|
503b38c17f | ||
|
|
7b6680cde2 | ||
|
|
7029edfd58 | ||
|
|
3b3ac68f47 | ||
|
|
5e28d04aa6 | ||
|
|
102140b917 | ||
|
|
17d7e19e84 | ||
|
|
d7b810e87e | ||
|
|
3cf44b4c62 | ||
|
|
96a9962895 | ||
|
|
b2cd4db395 | ||
|
|
015ef2c6ce | ||
|
|
0ba1af244d | ||
|
|
547a049140 | ||
|
|
05e0013990 | ||
|
|
b9d6f75923 | ||
|
|
07f4cb0892 | ||
|
|
e48be33c6c | ||
|
|
b3ba54894e | ||
|
|
14753d499d | ||
|
|
bb348fff94 | ||
|
|
c097907098 | ||
|
|
3719bac746 | ||
|
|
85add10bef | ||
|
|
8a7a9d4a45 | ||
|
|
875885f647 | ||
|
|
3af85ed14f | ||
|
|
34f6020e7f | ||
|
|
2a6b96937c | ||
|
|
8861918827 | ||
|
|
6212aef8b1 | ||
|
|
f13c4e916a | ||
|
|
60e183a8c0 | ||
|
|
939449c1b0 | ||
|
|
5970e5bf5c | ||
|
|
aee5a38313 | ||
|
|
19b2de7040 | ||
|
|
20d7ed5421 | ||
|
|
0dd53aea02 | ||
|
|
801d5d361a | ||
|
|
dc7362c70b | ||
|
|
fc3c0e7fa5 | ||
|
|
e172f5c82d | ||
|
|
3a7426ed04 | ||
|
|
3ab1feb7b1 | ||
|
|
1c90ee6db3 | ||
|
|
046136bc37 | ||
|
|
1d0234550e | ||
|
|
cca3a039ad | ||
|
|
e73d101c97 | ||
|
|
389e53207e | ||
|
|
5bdce4fb28 | ||
|
|
b06e3b3281 | ||
|
|
a4d39ce424 | ||
|
|
79f5aaa032 | ||
|
|
740ea2e86d | ||
|
|
364f95ec45 | ||
|
|
6668a7b8ab | ||
|
|
571f27d518 | ||
|
|
0fa70b5b35 | ||
|
|
be8d424404 | ||
|
|
08e239fcf4 | ||
|
|
947cb79558 | ||
|
|
1f1df9afc7 | ||
|
|
ef40bb25fd | ||
|
|
e2db025aa0 | ||
|
|
63369247ab | ||
|
|
8c695df9da | ||
|
|
1c9d41ad58 | ||
|
|
e7721d21a2 | ||
|
|
547f72919f | ||
|
|
2b6740dc7b | ||
|
|
1a91cf7033 | ||
|
|
1e9418b87b | ||
|
|
bedf1555af | ||
|
|
5d070f4d9e | ||
|
|
7eff48bd4f | ||
|
|
dfccfb3cf3 | ||
|
|
aeebc13d83 | ||
|
|
0a42ace4ba | ||
|
|
7b4f0a29ac | ||
|
|
b529456745 | ||
|
|
f1a929624f | ||
|
|
65285ad11e | ||
|
|
eb421bc95e | ||
|
|
917a5c3082 | ||
|
|
ea491fbde5 | ||
|
|
a98d01ba65 | ||
|
|
7e2fa8295a | ||
|
|
adf758a569 | ||
|
|
49941105dc | ||
|
|
c07afab981 | ||
|
|
c2b07fec1f | ||
|
|
7f8baf326e | ||
|
|
9601061f25 | ||
|
|
b1317e56ec | ||
|
|
353832c386 | ||
|
|
8bf04d4593 | ||
|
|
c9f0500c6f | ||
|
|
0dc465bb41 | ||
|
|
34e50aab21 | ||
|
|
5a2411a0e6 | ||
|
|
178f66c940 | ||
|
|
6d3a7a3989 | ||
|
|
2400eaf04e | ||
|
|
752a3ca5bd | ||
|
|
6dbb6eb432 | ||
|
|
e580bb9998 | ||
|
|
d309491f06 | ||
|
|
0e35048143 | ||
|
|
c919ed36b4 | ||
|
|
6d2a7c53dc | ||
|
|
a8582fc131 | ||
|
|
76b7bd855d | ||
|
|
5656bb3caf | ||
|
|
57bd4d8f22 | ||
|
|
e71cd5a7ad | ||
|
|
4132388dda | ||
|
|
1edabe3b00 | ||
|
|
019fdd65e9 | ||
|
|
fa432cd32f | ||
|
|
4935679659 | ||
|
|
835c64c173 | ||
|
|
4d6ecbe618 | ||
|
|
63456aad85 | ||
|
|
bec2ee91b5 | ||
|
|
027c9cdd04 | ||
|
|
8ecea3a8c1 | ||
|
|
69e6d57346 | ||
|
|
8127d9cf31 | ||
|
|
bc1a9b31fa | ||
|
|
ff5658e803 | ||
|
|
3d986cdd91 | ||
|
|
32810efcd9 | ||
|
|
76b463792e | ||
|
|
b4a0a31539 | ||
|
|
acbc7efdc8 | ||
|
|
8475e0803a | ||
|
|
f779fc57df | ||
|
|
7afef9073c | ||
|
|
370b5db34e | ||
|
|
6adabb5f71 | ||
|
|
df9a0eeab2 | ||
|
|
e6d58b780e | ||
|
|
e4b65d5d7f | ||
|
|
bf61a123cc | ||
|
|
71f0757015 | ||
|
|
f1e57e0e9c | ||
|
|
1147516dcc | ||
|
|
3f1661965b | ||
|
|
adb0b3ab18 | ||
|
|
8afad07146 | ||
|
|
81bce07a6e | ||
|
|
e883b57ac6 | ||
|
|
921685ff88 | ||
|
|
ae2f95b1ae | ||
|
|
4f77ef26b5 | ||
|
|
d8df9ffb53 | ||
|
|
3c51c0acd4 | ||
|
|
c085540143 | ||
|
|
d239dd56d5 | ||
|
|
8f9eb3b48b | ||
|
|
1f906e6a50 | ||
|
|
e0a4efe181 | ||
|
|
78e9c8fa1a | ||
|
|
9382dc9c10 | ||
|
|
aa85f20aa9 | ||
|
|
4ae01d48ae | ||
|
|
fe3082c6c9 | ||
|
|
ab6c257ba6 | ||
|
|
628ae561d5 | ||
|
|
56b5a65b24 | ||
|
|
73654a99f9 | ||
|
|
5078ae62c0 | ||
|
|
326f1bc890 | ||
|
|
ff04b33efd | ||
|
|
4f1a71b145 | ||
|
|
f7f8aa108a | ||
|
|
fb31caefef | ||
|
|
7ceb0dd065 | ||
|
|
05e4f96a6b |
@@ -2,15 +2,15 @@ git:
|
|||||||
problems:
|
problems:
|
||||||
url: https://github.com/getgrav/grav-plugin-problems
|
url: https://github.com/getgrav/grav-plugin-problems
|
||||||
path: user/plugins/problems
|
path: user/plugins/problems
|
||||||
branch: develop
|
branch: master
|
||||||
error:
|
error:
|
||||||
url: https://github.com/getgrav/grav-plugin-error
|
url: https://github.com/getgrav/grav-plugin-error
|
||||||
path: user/plugins/error
|
path: user/plugins/error
|
||||||
branch: develop
|
branch: master
|
||||||
antimatter:
|
antimatter:
|
||||||
url: https://github.com/getgrav/grav-theme-antimatter
|
url: https://github.com/getgrav/grav-theme-antimatter
|
||||||
path: user/themes/antimatter
|
path: user/themes/antimatter
|
||||||
branch: develop
|
branch: master
|
||||||
links:
|
links:
|
||||||
problems:
|
problems:
|
||||||
src: grav-plugin-problems
|
src: grav-plugin-problems
|
||||||
|
|||||||
10
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
# Composer
|
# Composer
|
||||||
composer.lock
|
|
||||||
.composer
|
.composer
|
||||||
vendor/
|
vendor/
|
||||||
|
|
||||||
@@ -17,12 +16,15 @@ logs/*
|
|||||||
!logs/.*
|
!logs/.*
|
||||||
images/*
|
images/*
|
||||||
!images/.*
|
!images/.*
|
||||||
|
user/accounts/*
|
||||||
|
!user/accounts/.*
|
||||||
user/data/*
|
user/data/*
|
||||||
!user/data/.*
|
!user/data/.*
|
||||||
user/plugins/*
|
user/plugins/*
|
||||||
!user/plugins/.*
|
!user/plugins/.*
|
||||||
user/themes/*
|
user/themes/*
|
||||||
!user/themes/.*
|
!user/themes/.*
|
||||||
|
user/localhost/config/security.yaml
|
||||||
|
|
||||||
# OS Generated
|
# OS Generated
|
||||||
.DS_Store*
|
.DS_Store*
|
||||||
@@ -33,3 +35,9 @@ Thumbs.db
|
|||||||
|
|
||||||
# phpstorm
|
# phpstorm
|
||||||
.idea/*
|
.idea/*
|
||||||
|
user/config/security.yaml
|
||||||
|
|
||||||
|
tests/_output/*
|
||||||
|
tests/_support/_generated/*
|
||||||
|
tests/cache/*
|
||||||
|
tests/error.log
|
||||||
|
|||||||
21
.htaccess
@@ -3,7 +3,7 @@
|
|||||||
RewriteEngine On
|
RewriteEngine On
|
||||||
|
|
||||||
## Begin RewriteBase
|
## Begin RewriteBase
|
||||||
# If you are getting 404 errors on subpages, you may have to uncomment the RewriteBase entry
|
# If you are getting 500 or 404 errors on subpages, you may have to uncomment the RewriteBase entry
|
||||||
# You should change the '/' to your appropriate subfolder. For example if you have
|
# You should change the '/' to your appropriate subfolder. For example if you have
|
||||||
# your Grav install at the root of your site '/' should work, else it might be something
|
# your Grav install at the root of your site '/' should work, else it might be something
|
||||||
# along the lines of: RewriteBase /<your_sub_folder>
|
# along the lines of: RewriteBase /<your_sub_folder>
|
||||||
@@ -44,13 +44,22 @@ RewriteRule .* index.php [L]
|
|||||||
|
|
||||||
## Begin - Security
|
## Begin - Security
|
||||||
# Block all direct access for these folders
|
# Block all direct access for these folders
|
||||||
RewriteRule ^(cache|bin|logs|backup)/(.*) error [L]
|
RewriteRule ^(.git|cache|bin|logs|backup|webserver-configs|tests)/(.*) error [F]
|
||||||
# Block access to specific file types for these folders
|
# Block access to specific file types for these system folders
|
||||||
RewriteRule ^(system|user|vendor)/(.*)\.(txt|md|html|yaml|php|twig|sh|bat)$ error [L]
|
RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|yaml|php|pl|py|cgi|twig|sh|bat)$ error [F]
|
||||||
|
# Block access to specific file types for these user folders
|
||||||
|
RewriteRule ^(user)/(.*)\.(txt|md|yaml|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
|
||||||
|
RewriteRule (^|/)\.(?!well-known) - [F]
|
||||||
|
# Block access to specific files in the root folder
|
||||||
|
RewriteRule ^(LICENSE.txt|composer.lock|composer.json|\.htaccess)$ error [F]
|
||||||
## End - Security
|
## End - Security
|
||||||
|
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
# Begin - Prevent Browsing
|
# Begin - Prevent Browsing and Set Default Resources
|
||||||
Options -Indexes
|
Options -Indexes
|
||||||
# End - Prevent Browsing
|
DirectoryIndex index.php index.html index.htm
|
||||||
|
# End - Prevent Browsing and Set Default Resources
|
||||||
|
|||||||
104
.travis.yml
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
language: php
|
||||||
|
php:
|
||||||
|
- '5.5'
|
||||||
|
- '5.6'
|
||||||
|
- '7.0'
|
||||||
|
- hhvm
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- develop
|
||||||
|
- master
|
||||||
|
- build_test
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
on_success: never
|
||||||
|
on_failure: always
|
||||||
|
hipchat:
|
||||||
|
# hipchat_api@grav
|
||||||
|
rooms:
|
||||||
|
- secure: "bqO0wM1B7bJnQw2fuhquSXEqI9gw6WmFytIh9sEWXzbYTzTUP5t0PcKOd3FT2BNMRaDxPJLVl+vG/oqmqDUBkEmOGcG504IQjeNzZqnMz0tXQMIcCc22Las9tFfc4Jf6RVi/qGomFtHGE9Wgii+TAN4zqZaufbNjwd8SyjO0+W8="
|
||||||
|
template:
|
||||||
|
- '%{repository}#%{build_number} (%{branch}): Travis Job Finished [%{duration}] (<a href="%{build_url}">Details</a>)'
|
||||||
|
format: html
|
||||||
|
slack:
|
||||||
|
secure: dowksPsxxCxGKT6nis5hUgkp6+ZDAhoqzQHF9rJnx4hx0iEygPhVBs7pKl9yL2jubYJoLs+EXwE7z1dYgDAEJh4BnfrCokCMLpFGcxVxQC/HeAUdSQ2/RtdBYR5PRT75ScaFpqM/SfXXZVtnwVXAw9Z+JC6BjQ9vmn23m51Jw4k=
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
# Colors!
|
||||||
|
- TEXTRESET=$(tput sgr0) # reset the foreground colour
|
||||||
|
- RED=$(tput setaf 1)
|
||||||
|
- GREEN=$(tput setaf 2)
|
||||||
|
- YELLOW=$(tput setaf 3)
|
||||||
|
- BLUE=$(tput setaf 4)
|
||||||
|
- BOLD=$(tput bold)
|
||||||
|
# User
|
||||||
|
- GH_USER="getgrav"
|
||||||
|
# Paths
|
||||||
|
- RT_DEVTOOLS=$HOME/devtools
|
||||||
|
- GOPATH="$HOME/go"
|
||||||
|
- PATH="$GOPATH/bin:$PATH"
|
||||||
|
# GH_TOKEN [API Key]
|
||||||
|
- secure: "jS+c+g2v33vypG4VtqiSDW2qQ4dGJZlrUKBRCztoy1yrOrYRPvc5Vzi/AS3fDmZ4yizukEwmUNNzyZQcgFvLPpmCCml46Dovp8R9OXhbNe8OnULmaSn2Zkr71oblMYu6ZP+RpYvNq0BIdSB3u2TiFriHMiTIkX9UwZNaUCOX1ig="
|
||||||
|
# BB_TOKEN value => "user:pass@"
|
||||||
|
- secure: "einUtSEkUWy2IrqLXyVjwUU+mwaaoiOXRRVdLBpA3Zye6bZx8cm5h/5AplkPWhM/NmCJoW/MwNZHHkFhlr3mDRov5iOxVmTTYfnXB+I5lxYTSgduOLLErS7mU8hfADpVDU8bHNU44fNGD3UEiG1PD4qQBX4DMlqIFmR20mjs81k="
|
||||||
|
# GH_API_USER [for curl]
|
||||||
|
- secure: "AQGcX1B2NrI8ajflY4AimZDNcK2kBA3F6mbtEFQ78NkDoWhMipsQHayWXiSTzRc0YJKvQl2Y16MTwQF4VHzjTAiiZFATgA8J88vQUjIPabi/kKjqSmcLFoaAOAxStQbW6e0z2GiQ6KBMcNF1y5iUuI63xVrBvtKrYX/w5y+ako8="
|
||||||
|
# Latest Release version
|
||||||
|
- TRAVIS_TAG=$(curl --fail -s https://api.github.com/repos/getgrav/grav/releases/latest | grep tag_name | head -n 1 | cut -d '"' -f 4)
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- export TZ=Pacific/Honolulu
|
||||||
|
- echo $TRAVIS_PHP_VERSION
|
||||||
|
- echo $TRAVIS_BRANCH
|
||||||
|
- echo $TRAVIS_PULL_REQUEST
|
||||||
|
- composer self-update
|
||||||
|
- if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
|
||||||
|
composer install --dev --prefer-dist;
|
||||||
|
fi
|
||||||
|
- if [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "5.6" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
|
||||||
|
go get github.com/aktau/github-release;
|
||||||
|
git clone --quiet --depth=50 --branch=master https://${BB_TOKEN}bitbucket.org/rockettheme/grav-devtools.git $RT_DEVTOOLS &>/dev/null;
|
||||||
|
if [ ! -z "$TRAVIS_TAG" ]; then
|
||||||
|
cd ${RT_DEVTOOLS};
|
||||||
|
./build-grav.sh skeletons.txt;
|
||||||
|
fi;
|
||||||
|
fi
|
||||||
|
before_script:
|
||||||
|
- if [ $TRAVIS_PHP_VERSION != 'hhvm' ]; then phpenv config-rm xdebug.ini; fi
|
||||||
|
script:
|
||||||
|
- if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
|
||||||
|
vendor/bin/codecept run;
|
||||||
|
fi
|
||||||
|
- echo $TRAVIS_TAG
|
||||||
|
- if [ ! -z "$TRAVIS_TAG" ] && [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "5.6" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
|
||||||
|
FILES="$RT_DEVTOOLS/grav-dist/*.zip";
|
||||||
|
for file in ${FILES[@]}; do
|
||||||
|
NAME=${file##*/};
|
||||||
|
if [[ "$NAME" == *"-rc"* ]]; then
|
||||||
|
REPO="$(echo ${NAME} | rev | cut -f 3- -d "-" | rev)";
|
||||||
|
else
|
||||||
|
REPO="$(echo ${NAME} | rev | cut -f 2- -d "-" | rev)";
|
||||||
|
fi;
|
||||||
|
if [[ $REPO == 'grav' || $REPO == 'grav-admin' || $REPO == 'grav-update' ]]; then
|
||||||
|
REPO="grav";
|
||||||
|
fi;
|
||||||
|
API="$(curl --fail --user "${GH_API_USER}" -s https://api.github.com/repos/${GH_USER}/${REPO}/releases/latest)";
|
||||||
|
ASSETS="$(echo "${API}" | node gh-assets.js)";
|
||||||
|
TAG="$(echo "${API}" | grep tag_name | head -n 1 | cut -d '"' -f 4)";
|
||||||
|
if [ $REPO == "grav" ]; then
|
||||||
|
TAG="$TRAVIS_TAG";
|
||||||
|
fi;
|
||||||
|
if [ ! -z "$ASSETS" ]; then
|
||||||
|
for asset in ${ASSETS[@]}; do
|
||||||
|
asset_id=$(echo ${asset} | cut -d ':' -f 1);
|
||||||
|
asset_name=$(echo ${asset} | cut -d ':' -f 2);
|
||||||
|
if [ "${NAME}" == "${asset_name}" ]; then
|
||||||
|
echo -e "\nAsset ${BOLD}${BLUE}${NAME}${TEXTRESET} already exists in ${YELLOW}${REPO}${TEXTRESET}@${BOLD}${YELLOW}${TAG}${TEXTRESET}... deleting id ${BOLD}${RED}${asset_id}${TEXTRESET}...";
|
||||||
|
curl -X DELETE --fail --user "${GH_API_USER}" "https://api.github.com/repos/${GH_USER}/${REPO}/releases/assets/${asset_id}";
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
fi;
|
||||||
|
echo "Uploading package ${BOLD}${BLUE}${NAME}${TEXTRESET} to ${YELLOW}${REPO}${TEXTRESET}@${YELLOW}${TAG}${TEXTRESET}";
|
||||||
|
github-release upload --security-token $GH_TOKEN --user ${GH_USER} --repo $REPO --tag "$TAG" --name "$NAME" --file "$file";
|
||||||
|
done;
|
||||||
|
fi
|
||||||
719
CHANGELOG.md
@@ -1,3 +1,708 @@
|
|||||||
|
# v1.1.0-beta.1
|
||||||
|
## 04/20/2016
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* **Blueprint Improvements**: The main improvements to Grav take the form of a major rewrite of our blueprint functionality. Blueprints are an essential piece of functionality within Grav that helps define configuration fields. These allow us to create a definition of a form field that can be rendered in the administrator plugin and allow the input, validation, and storage of values into the various configuration and page files that power Grav. Grav 1.0 had extensive support for building and extending blueprints, but Grav 1.1 takes this even further and adds improvements to our existing system.
|
||||||
|
* **Extending Blueprints**: You could extend forms in Grav 1.0, but now you can use a newer `extends@:` default syntax rather than the previous `'@extends'` string that needed to be quoted in YAML. Also this new format allows for the defining of a `context` which lets you define where to look for the base blueprint. Another new feature is the ability to extend from multiple blueprints.
|
||||||
|
* **Embedding/Importing Blueprints**: One feature that has been requested is the ability to embed or import one blueprint into another blueprint. This allows you to share fields or sub-form between multiple forms. This is accomplished via the `import@` syntax.
|
||||||
|
* **Removing Existing Fields and Properties**: Another new feature is the ability to remove completely existing fields or properties from an extended blueprint. This allows the user a lot more flexibility when creating custom forms by simply using the new `unset@: true` syntax. To remove a field property you would use `unset-<property>@: true` in your extended field definition, for example: `unset-options@: true`.
|
||||||
|
* **Replacing Existing Fields and Properties**: Similar to removing, you can now replace an existing field or property with the `replace@: true` syntax for the whole field, and `replace-<property>@: true` for a specific property.
|
||||||
|
* **Field Ordering**: Probably the most frequently requested blueprint functionality that we have added is the ability to change field ordering. Imagine that you want to extend the default page blueprint but add a new tab. Previously, this meant your tab would be added at the end of the form, but now you can define that you wish the new tab to be added right after the `content` tab. This works for any field too, so you can extend a blueprint and add your own custom fields anywhere you wish! This is accomplished by using the new `ordering@:` syntax with either an existing property name or an integer.
|
||||||
|
* **Configuration Properties**: Another useful new feature is the ability to directly access Grav configuration in blueprints with `config-<property>@` syntax. For example you can set a default for a field via `config-default@: site.author.name` which will use the author.name value from the `site.yaml` file as the `default` value for this field.
|
||||||
|
* **Function Calls**: The ability to call PHP functions for values has been improved in Grav 1.1 to be more powerful. You can use the `data-<property>@` syntax to call static methods to obtain values. For example: `data-default@: '\Grav\Plugin\Admin::route'`. You can now even pass parameters to these methods.
|
||||||
|
* **Validation Rules**: You can now define a custom blueprint-level validation rule and assign this rule to a form field.
|
||||||
|
* **Custom Form Field Types**: This advanced new functionality allows you to create a custom field type via a new plugin event called getFormFieldTypes(). This allows you to provide extra functionality or instructions on how to handle the form form field.
|
||||||
|
* **GPM Versioning**: A new feature that we have wanted to add to our GPM package management system is the ability to control dependencies by version. We have opted to use a syntax very similar to the Composer Package Manager that is already familiar to most PHP developers. This new versioning system allows you to define specific minimum version requirements of dependent packages within Grav. This should ensure that we have less (hopefully none!) issues when you update one package that also requires a specific minimum version of another package. The admin plugin for example may have an update that requires a specific version of Grav itself.
|
||||||
|
* **GPM Testing Channel**: GPM repository now comes with both a `stable` and `testing` channel. A new setting in `system.gpm.releases` allow to switch between the two channels. Developers will be able to decide whether their resource is going to be in a pre-release state or stable. Only users who switch to the **testing** channel will be able to install a pre-release version.
|
||||||
|
* **GPM Events**: Packages (plugins and themes) can now add event handlers to hook in the package GPM events: install, update, uninstall. A package can listen for events before and after each of these events, and can execute any PHP code, and optionally halt the procedure or return a message.
|
||||||
|
* Refactor of the process chain breaking out `Processors` into individual classes to allow for easier modification and addition. Thanks to toovy for this work. - [#745](https://github.com/getgrav/grav/pull/745)
|
||||||
|
* Added multipart downloads, resumable downloads, download throttling, and video streaming in the `Utils::download()` method.
|
||||||
|
* Added optional config to allow Twig processing in page frontmatter - [#788](https://github.com/getgrav/grav/pull/788)
|
||||||
|
* Added the ability to provide blueprints via a plugin (previously limited to Themes only).
|
||||||
|
* Added Developer CLI Tools to easily create a new theme or plugin
|
||||||
|
* Allow authentication for proxies - [#698](https://github.com/getgrav/grav/pull/698)
|
||||||
|
* Allow to override the default Parsedown behavior - [#747](https://github.com/getgrav/grav/pull/747)
|
||||||
|
* Added an option to allow to exclude external files from the pipeline, and to render the pipeline before/after excluded files
|
||||||
|
* Added the possibility to store translations of themes in separate files inside the `languages` folder
|
||||||
|
* Added a method to the Uri class to return the base relative URL including the language prefix, or the base relative url if multilanguage is not enabled
|
||||||
|
* Added a shortcut for pages.find() alias
|
||||||
|
1. [](#improved)
|
||||||
|
* Now supporting hostnames with localhost environments for better vhost support/development
|
||||||
|
* Refactor hard-coded paths to use PHP Streams that allow a setup file to configure where certain parts of Grav are stored in the physical filesystem.
|
||||||
|
* If multilanguage is active, include the Intl Twig Extension to allow translating dates automatically (http://twig.sensiolabs.org/doc/extensions/intl.html)
|
||||||
|
* Allow having local themes with the same name as GPM themes, by adding `gpm: false` to the theme blueprint - [#767](https://github.com/getgrav/grav/pull/767)
|
||||||
|
* Caddyfile and Lighttpd config files updated
|
||||||
|
* Removed `node_modules` folder from backups to make them faster
|
||||||
|
* Display error when `bin/grav install` hasn't been run instead of throwing exception. Prevents "white page" errors if error display is off
|
||||||
|
* Improved command line flow when installing multiple packages: don't reinstall packages if already installed, ask once if should use symlinks if symlinks are found
|
||||||
|
* Added more tests to our testing suite
|
||||||
|
* Added x-ua-compatible to http_equiv metadata processing
|
||||||
|
* Added ability to have a per-page `frontmatter.yaml` file to set header frontmatter defaults. Especially useful for multilang scenarios - [#775](https://github.com/getgrav/grav/pull/775)
|
||||||
|
* Removed deprecated `bin/grav newuser` CLI command. use `bin/plugin login newuser` instead.
|
||||||
|
* Added `webm` and `ogv` video types to the default media types list.
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix Zend Opcache `opcache.validate_timestamps=0` not detecting changes in compiled yaml and twig files
|
||||||
|
* Avoid losing params, query and fragment from the URL when auto-redirecting to a language-specific route - [#759](https://github.com/getgrav/grav/pull/759)
|
||||||
|
* Fix for non-pipeline assets getting lost when pipeline is cached to filesystem
|
||||||
|
* Fix for double encoding resulting from Markdown Extra
|
||||||
|
* Fix for a remote link breaking all CSS rewrites for pipeline
|
||||||
|
* Fix an issue with Retina alternatives not clearing properly between repeat uses
|
||||||
|
* Fix for non standard http/s external markdown links - [#738](https://github.com/getgrav/grav/issues/738)
|
||||||
|
* Fix for `find()` calling redirects via `dispatch()` causing infinite loops - [#781](https://github.com/getgrav/grav/issues/781)
|
||||||
|
|
||||||
|
# v1.0.10
|
||||||
|
## 02/11/2016
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `Page::contentMeta()` mechanism to store content-level meta data alongside content
|
||||||
|
* Added Japanese language translation
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated some vendor libraries
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Hide `streams` blueprint from Admin plugin
|
||||||
|
* Fix translations of languages with `---` in YAML files
|
||||||
|
|
||||||
|
# v1.0.9
|
||||||
|
## 02/05/2016
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* New **Unit Testing** via Codeception http://codeception.com/
|
||||||
|
* New **page-level SSL** functionality when using `absolute_urls`
|
||||||
|
* Added `reverse_proxy` config option for issues with non-standard ports
|
||||||
|
* Added `proxy_url` config option to support GPM behind proxy servers #639
|
||||||
|
* New `Pages::parentsRawRoutes()` method
|
||||||
|
* Enhanced `bin/gpm info` CLI command with Changelog support #559
|
||||||
|
* Ability to add empty *Folder* via admin plugin
|
||||||
|
* Added latest `jQuery 2.2.0` library to core
|
||||||
|
* Added translations from Crowdin
|
||||||
|
1. [](#improved)
|
||||||
|
* [BC] Metadata now supports only flat arrays. To use open graph metas and the likes (ie, 'og:title'), simply specify it in the key.
|
||||||
|
* Refactored `Uri::convertUrl()` method to be more reliable + tests created
|
||||||
|
* Date for last update of a modular sub-page sets modified date of modular page itself
|
||||||
|
* Split configuration up into two steps
|
||||||
|
* Moved Grav-based `base_uri` variables into `Uri::init()`
|
||||||
|
* Refactored init in `URI` to better support testing
|
||||||
|
* Allow `twig_vars` to be exposed earlier and merged later
|
||||||
|
* Avoid setting empty metadata
|
||||||
|
* Accept single group access as a string rather than requiring an array
|
||||||
|
* Return `$this` in Page constructor and init to allow chaining
|
||||||
|
* Added `ext-*` PHP requirements to `composer.json`
|
||||||
|
* Use Whoops 2.0 library while supporting old style
|
||||||
|
* Removed redundant old default-hash fallback mechanisms
|
||||||
|
* Commented out default redirects and routes in `site.yaml`
|
||||||
|
* Added `/tests` folder to deny's of all `webserver-configs/*` files
|
||||||
|
* Various PS and code style fixes
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix default generator metadata
|
||||||
|
* Fix for broken image processing caused by `Uri::convertUrl()` bugs
|
||||||
|
* Fix loading JS and CSS from collections #623
|
||||||
|
* Fix stream overriding
|
||||||
|
* Remove the URL extension for home link
|
||||||
|
* Fix permissions when the user has no access level set at all
|
||||||
|
* Fix issue with user with multiple groups getting denied on first group
|
||||||
|
* Fixed an issue with `Pages()` internal cache lookup not being unique enough
|
||||||
|
* Fix for bug with `site.redirects` and `site.routes` being an empty list
|
||||||
|
* [Markdown] Don't process links for **special protocols**
|
||||||
|
* [Whoops] serve JSON errors when request is JSON
|
||||||
|
|
||||||
|
|
||||||
|
# v1.0.8
|
||||||
|
## 01/08/2016
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added `rotate`, `flip` and `fixOrientation` image medium methods
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Removed IP from Nonce generation. Should be more reliable in a variety of scenarios
|
||||||
|
|
||||||
|
# v1.0.7
|
||||||
|
## 01/07/2016
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added `composer create-project` as an additional installation method #585
|
||||||
|
* New optional system config setting to strip home from page routs and urls #561
|
||||||
|
* Added Greek, Finnish, Norwegian, Polish, Portuguese, and Romanian languages
|
||||||
|
* Added new `Page->topParent()` method to return top most parent of a page
|
||||||
|
* Added plugins configuration tab to debugger
|
||||||
|
* Added support for APCu and PHP7.0 via new Doctrine Cache release
|
||||||
|
* Added global setting for `twig_first` processing (false by default)
|
||||||
|
* New configuration options for Session settings #553
|
||||||
|
1. [](#improved)
|
||||||
|
* Switched to SSL for GPM calls
|
||||||
|
* Use `URI->host()` for session domain
|
||||||
|
* Add support for `open_basedir` when installing packages via GPM
|
||||||
|
* Improved `Utils::generateNonceString()` method to handle reverse proxies
|
||||||
|
* Optimized core thumbnails saving 38% in file size
|
||||||
|
* Added new `bin/gpm index --installed-only` option
|
||||||
|
* Improved GPM errors to provider more helpful diagnostic of issues
|
||||||
|
* Removed old hardcoded PHP version references
|
||||||
|
* Moved `onPageContentProcessed()` event so it's fired more reliably
|
||||||
|
* Maintain md5 keys during sorting of Assets #566
|
||||||
|
* Update to Caddyfile for Caddy web server
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed an issue with cache/config checksum not being set on cache load
|
||||||
|
* Fix for page blueprint and theme inheritance issue #534
|
||||||
|
* Set `ZipBackup` timeout to 10 minutes if possible
|
||||||
|
* Fix case where we only have inline data for CSS or JS #565
|
||||||
|
* Fix `bin/grav sandbox` command to work with new `webserver-config` folder
|
||||||
|
* Fix for markdown attributes on external URLs
|
||||||
|
* Fixed issue where `data:` page header was acting as `publish_date:`
|
||||||
|
* Fix for special characters in URL parameters (e.g. /tag:c++) #541
|
||||||
|
* Safety check for an array of nonces to only use the first one
|
||||||
|
|
||||||
|
# v1.0.6
|
||||||
|
## 12/22/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Set minimum requirements to [PHP 5.5.9](http://bit.ly/1Jt9OXO)
|
||||||
|
* Added `saveConfig` to Themes
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated Whoops to new 2.0 version (PHP 7.0 compatible)
|
||||||
|
* Moved sample web server configs into dedicated directory
|
||||||
|
* FastCGI will use Apache's `mod_deflate` if gzip turned off
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix broken media image operators
|
||||||
|
* Only call extra method of blueprints if blueprints exist
|
||||||
|
* Fix lang prefix in url twig variables #523
|
||||||
|
* Fix case insensitive HTTPS check #535
|
||||||
|
* Field field validation handles case `multiple` missing
|
||||||
|
|
||||||
|
# v1.0.5
|
||||||
|
## 12/18/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Add ability to extend markdown with plugins
|
||||||
|
* Added support for plugins to have individual language files
|
||||||
|
* Added `7z` to media formats
|
||||||
|
* Use Grav's fork of Parsedown until PR is merged
|
||||||
|
* New function to persist plugin configuration to disk
|
||||||
|
* GPM `selfupgrade` will now check PHP version requirements
|
||||||
|
1. [](#improved)
|
||||||
|
* If the field allows multiple files, return array
|
||||||
|
* Handle non-array values in file validation
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix when looping `fields` param in a `list` field
|
||||||
|
* Properly convert commas to spaces for media attributes
|
||||||
|
* Forcing Travis VM to HI timezone to address future files in zip file
|
||||||
|
|
||||||
|
# v1.0.4
|
||||||
|
## 12/12/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Needed to put default image folder permissions for YAML compatibility
|
||||||
|
|
||||||
|
# v1.0.3
|
||||||
|
## 12/11/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed issue when saving config causing incorrect image cache folder perms
|
||||||
|
|
||||||
|
# v1.0.2
|
||||||
|
## 12/11/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix for timing display in debugbar
|
||||||
|
|
||||||
|
# v1.0.1
|
||||||
|
## 12/11/2015
|
||||||
|
|
||||||
|
1. [](#improved)
|
||||||
|
* Reduced package sizes by removing extra vendor dev bits
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix issue when you enable debugger from admin plugin
|
||||||
|
|
||||||
|
# v1.0.0
|
||||||
|
## 12/11/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Add new link attributes via markdown media
|
||||||
|
* Added setters to set state of CSS/JS pipelining
|
||||||
|
* Added `user/accounts` to `.gitignore`
|
||||||
|
* Added configurable permissions option for Image cache
|
||||||
|
1. [](#improved)
|
||||||
|
* Hungarian translation updated
|
||||||
|
* Refactored Theme initialization for improved flexibility
|
||||||
|
* Wrapped security section of account blueprints in an 'super user' authorize check
|
||||||
|
* Minor performance optimizations
|
||||||
|
* Updated core page blueprints with markdown preview option
|
||||||
|
* Added useful cache info output to Debugbar
|
||||||
|
* Added `iconv` polyfill library used by Symfony 2.8
|
||||||
|
* Force lowercase of username in a few places for case sensitive filesystems
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix for GPM problems "Call to a member function set() on null"
|
||||||
|
* Fix for individual asset pipeline values not functioning
|
||||||
|
* Fix `Page::copy()` and `Page::move()` to support multiple moves at once
|
||||||
|
* Fixed page moving of a page with no content
|
||||||
|
* Fix for wrong ordering when moving many pages
|
||||||
|
* Escape root path in page medium files to work with special characters
|
||||||
|
* Add missing parent constructor to Themes class
|
||||||
|
* Fix missing file error in `bin/grav sandbox` command
|
||||||
|
* Fixed changelog differ when upgrading Grav
|
||||||
|
* Fixed a logic error in `Validation->validate()`
|
||||||
|
* Make `$container` available in `setup.php` to fix multi-site
|
||||||
|
|
||||||
|
# v1.0.0-rc.6
|
||||||
|
## 12/01/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Refactor Config classes for improved performance!
|
||||||
|
* Refactor Data classes to use `NestedArrayAccess` instead of `DataMutatorTrait`
|
||||||
|
* Added support for `classes` and `id` on medium objects to set CSS values
|
||||||
|
* Data objects: Allow function call chaining
|
||||||
|
* Data objects: Lazy load blueprints only if needed
|
||||||
|
* Automatically create unique security salt for each configuration
|
||||||
|
* Added Hungarian translation
|
||||||
|
* Added support for User groups
|
||||||
|
1. [](#improved)
|
||||||
|
* Improved robots.txt to disallow crawling of non-user folders
|
||||||
|
* Nonces only generated once per action and process
|
||||||
|
* Added IP into Nonce string calculation
|
||||||
|
* Nonces now use random string with random salt to improve performance
|
||||||
|
* Improved list form handling #475
|
||||||
|
* Vendor library updates
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed help output for `bin/plugin`
|
||||||
|
* Fix for nested logic for lists and form parsing #273
|
||||||
|
* Fix for array form fields and last entry not getting deleted
|
||||||
|
* Should not be able to set parent to self #308
|
||||||
|
|
||||||
|
# v1.0.0-rc.5
|
||||||
|
## 11/20/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added **nonce** functionality for all admin forms for improved security
|
||||||
|
* Implemented the ability for Plugins to provide their own CLI commands through `bin/plugin`
|
||||||
|
* Added Croatian translation
|
||||||
|
* Added missing `umask_fix` property to `system.yaml`
|
||||||
|
* Added current theme's config to global config. E.g. `config.theme.dropdown_enabled`
|
||||||
|
* Added `append_url_extension` option to system config & page headers
|
||||||
|
* Users have a new `state` property to allow disabling/banning
|
||||||
|
* Added new `Page.relativePagePath()` helper method
|
||||||
|
* Added new `|pad` Twig filter for strings (uses `str_pad()`)
|
||||||
|
* Added `lighttpd.conf` for Lightly web server
|
||||||
|
1. [](#improved)
|
||||||
|
* Clear previously applied operations when doing a reset on image media
|
||||||
|
* Password no longer required when editing user
|
||||||
|
* Improved support for trailing `/` URLs
|
||||||
|
* Improved `.nginx.conf` configuration file
|
||||||
|
* Improved `.htaccess` security
|
||||||
|
* Updated vendor libs
|
||||||
|
* Updated `composer.phar`
|
||||||
|
* Use streams instead of paths for `clearCache()`
|
||||||
|
* Use PCRE_UTF8 so unicode strings can be regexed in Truncator
|
||||||
|
* Handle case when login plugin is disabled
|
||||||
|
* Improved `quality` functionality in media handling
|
||||||
|
* Added some missing translation strings
|
||||||
|
* Deprecated `bin/grav newuser` in favor of `bin/plugin login new-user`
|
||||||
|
* Moved fallback types to use any valid media type
|
||||||
|
* Renamed `system.pages.fallback_types` to `system.media.allowed_fallback_types`
|
||||||
|
* Removed version number in default `generator` meta tag
|
||||||
|
* Disable time limit in case of slow downloads
|
||||||
|
* Removed default hash in `system.yaml`
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix for media using absolute URLs causing broken links
|
||||||
|
* Fix theme auto-loading #432
|
||||||
|
* Don't create empty `<style>` or `<script>` scripts if no data
|
||||||
|
* Code cleanups
|
||||||
|
* Fix undefined variable in Config class
|
||||||
|
* Fix exception message when label is not set
|
||||||
|
* Check in `Plugins::get()` to ensure plugins exists
|
||||||
|
* Fixed GZip compression making output buffering work correctly with all servers and browsers
|
||||||
|
* Fixed date representation in system config
|
||||||
|
|
||||||
|
# v1.0.0-rc.4
|
||||||
|
## 10/29/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed a fatal error if you have a collection with missing or invalid `@page: /route`
|
||||||
|
|
||||||
|
# v1.0.0-rc.3
|
||||||
|
## 10/29/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* New Page collection options! `@self.parent, @self.siblings, @self.descendants` + more
|
||||||
|
* White list of file types for fallback route functionality (images by default)
|
||||||
|
1. [](#improved)
|
||||||
|
* Assets switched from defines to streams
|
||||||
|
1. [](#bugfix)
|
||||||
|
* README.md typos fixed
|
||||||
|
* Fixed issue with routes that have lang string in them (`/en/english`)
|
||||||
|
* Trim strings before validation so whitespace is not satisfy 'required'
|
||||||
|
|
||||||
|
# v1.0.0-rc.2
|
||||||
|
## 10/27/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added support for CSS Asset groups
|
||||||
|
* Added a `wrapped_site` system option for themes/plugins to use
|
||||||
|
* Pass `Page` object as event to `onTwigPageVariables()` event hook
|
||||||
|
* New `Data.items()` method to get all items
|
||||||
|
1. [](#improved)
|
||||||
|
* Missing pipelined remote asset will now fail quietly
|
||||||
|
* More reliably handle inline JS and CSS to remove only surrounding HTML tags
|
||||||
|
* `Medium.meta` returns new Data object so null checks are possible
|
||||||
|
* Improved Medium metadata merging to allow for automatic title/alt/class attributes
|
||||||
|
* Moved Grav object to global variable rather than template variable (useful for macros)
|
||||||
|
* German language improvements
|
||||||
|
* Updated bundled composer
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Accept variety of `true` values in `User.authorize()` method
|
||||||
|
* Fix for `Validation` throwing an error if no label set
|
||||||
|
|
||||||
|
# v1.0.0-rc.1
|
||||||
|
## 10/23/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Use native PECL YAML parser if installed for 4X speed boost in parsing YAML files
|
||||||
|
* Support for inherited theme class
|
||||||
|
* Added new default language prepend system configuration option
|
||||||
|
* New `|evaluate` Twig filter to evaluate a string as twig
|
||||||
|
* New system option to ignore all **hidden** files and folders
|
||||||
|
* New system option for default redirect code
|
||||||
|
* Added ability to append specific `[30x]` codes to redirect URLs
|
||||||
|
* Added `url_taxonomy_filters` for page collections
|
||||||
|
* Added `@root` page and `recurse` flag for page collections
|
||||||
|
* Support for **multiple** page collection types as an array
|
||||||
|
* Added Dutch language file
|
||||||
|
* Added Russian language file
|
||||||
|
* Added `remove` method to User object
|
||||||
|
1. [](#improved)
|
||||||
|
* Moved hardcoded mimetypes to `media.yaml` to be treated as Page media files
|
||||||
|
* Set `errors: display: false` by default in `system.yaml`
|
||||||
|
* Strip out extra slashes in the URI
|
||||||
|
* Validate hostname to ensure it is valid
|
||||||
|
* Ignore more SCM folders in Backups
|
||||||
|
* Removed `home_redirect` settings from `system.yaml`
|
||||||
|
* Added Page `media` as root twig object for consistency
|
||||||
|
* Updated to latest vendor libraries
|
||||||
|
* Optimizations to Asset pipeline logic for minor speed increase
|
||||||
|
* Block direct access to a variety of files in `.htaccess` for increased security
|
||||||
|
* Debugbar vendor library update
|
||||||
|
* Always fallback to english if other translations are not available
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix for redirecting external URL with multi-language
|
||||||
|
* Fix for Asset pipeline not respecting asset groups
|
||||||
|
* Fix language files with child/parent theme relationships
|
||||||
|
* Fixed a regression issue resulting in incorrect default language
|
||||||
|
* Ensure error handler is initialized before URI is processed
|
||||||
|
* Use default language in Twig if active language is not set
|
||||||
|
* Fixed issue with `safeEmailFilter()` Twig filter not separating with `;` properly
|
||||||
|
* Fixed empty YAML file causing error with native PECL YAML parser
|
||||||
|
* Fixed `SVG` mimetype
|
||||||
|
* Fixed incorrect `Cache-control: max-age` value format
|
||||||
|
|
||||||
|
# v0.9.45
|
||||||
|
## 10/08/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed a regression issue resulting in incorrect default language
|
||||||
|
|
||||||
|
# v0.9.44
|
||||||
|
## 10/07/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added Redis back as a supported cache mechanism
|
||||||
|
* Allow Twig `nicetime` translations
|
||||||
|
* Added `-y` option for 'Yes to all' in `bin/gpm update`
|
||||||
|
* Added CSS `media` attribute to the Assets manager
|
||||||
|
* New German language support
|
||||||
|
* New Czech language support
|
||||||
|
* New French language support
|
||||||
|
* Added `modulus` twig filter
|
||||||
|
1. [](#improved)
|
||||||
|
* URL decode in medium actions to allow complex syntax
|
||||||
|
* Take into account `HTTP_HOST` before `SERVER_NAME` (helpful with Nginx)
|
||||||
|
* More friendly cache naming to ease manual management of cache systems
|
||||||
|
* Added default Apache resource for `DirectoryIndex`
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix GPM failure when offline
|
||||||
|
* Fix `open_basedir` error in `bin/gpm install`
|
||||||
|
* Fix an HHVM error in Truncator
|
||||||
|
* Fix for XSS vulnerability with params
|
||||||
|
* Fix chaining for responsive size derivatives
|
||||||
|
* Fix for saving pages when removing the page title and all other header elements
|
||||||
|
* Fix when saving array fields
|
||||||
|
* Fix for ports being included in `HTTP_HOST`
|
||||||
|
* Fix for Truncator to handle PHP tags gracefully
|
||||||
|
* Fix for locate style lang codes in `getNativeName()`
|
||||||
|
* Urldecode image basenames in markdown
|
||||||
|
|
||||||
|
# v0.9.43
|
||||||
|
## 09/16/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `AudioMedium` for HTML5 audio
|
||||||
|
* Added ability for Assets to be added and displayed in separate *groups*
|
||||||
|
* New support for responsive image derivative sizes
|
||||||
|
1. [](#improved)
|
||||||
|
* GPM theme install now uses a `copy` method so new files are not lost (e.g. `/css/custom.css`)
|
||||||
|
* Code analysis improvements and cleanup
|
||||||
|
* Removed Twig panel from debugger (no longer supported in Twig 1.20)
|
||||||
|
* Updated composer packages
|
||||||
|
* Prepend active language to `convertUrl()` when used in markdown links
|
||||||
|
* Added some pre/post flight options for installer via blueprints
|
||||||
|
* Hyphenize the site name in the backup filename
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fix broken routable logic
|
||||||
|
* Check for `phpinfo()` method in case it is restricted by hosting provider
|
||||||
|
* Fixes for windows when running GPM
|
||||||
|
* Fix for ampersand (`&`) causing error in `truncateHtml()` via `Page.summary()`
|
||||||
|
|
||||||
|
# v0.9.42
|
||||||
|
## 09/11/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed `User.authorise()` to be backwards compabile
|
||||||
|
|
||||||
|
# v0.9.41
|
||||||
|
## 09/11/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* New and improved multibyte-safe TruncateHTML function and filter
|
||||||
|
* Added support for custom page date format
|
||||||
|
* Added a `string` Twig filter to render as json_encoded string
|
||||||
|
* Added `authorize` Twig filter
|
||||||
|
* Added support for theme inheritance in the admin
|
||||||
|
* Support for multiple content collections on a page
|
||||||
|
* Added configurable files/folders ignores for pages
|
||||||
|
* Added the ability to set the default PHP locale and override via multi-lang configuration
|
||||||
|
* Added ability to save as YAML via admin
|
||||||
|
* Added check for `mbstring` support
|
||||||
|
* Added new `redirect` header for pages
|
||||||
|
1. [](#improved)
|
||||||
|
* Changed dependencies from `develop` to `master`
|
||||||
|
* Updated logging to log everything from `debug` level on (was `warning`)
|
||||||
|
* Added missing `accounts/` folder
|
||||||
|
* Default to performing a 301 redirect for URIs with trailing slashes
|
||||||
|
* Improved Twig error messages
|
||||||
|
* Allow validating of forms from anywhere such as plugins
|
||||||
|
* Added logic so modular pages are by default non-routable
|
||||||
|
* Hide password input in `bin/grav newuser` command
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed `Pages.all()` not returning modular pages
|
||||||
|
* Fix for modular template types not getting found
|
||||||
|
* Fix for `markdown_extra:` overriding `markdown:extra:` setting
|
||||||
|
* Fix for multi-site routing
|
||||||
|
* Fix for multi-lang page name error
|
||||||
|
* Fixed a redirect loop in `URI` class
|
||||||
|
* Fixed a potential error when `unsupported_inline_types` is empty
|
||||||
|
* Correctly generate 2x retina image
|
||||||
|
* Typo fixes in page publish/unpublish blueprint
|
||||||
|
|
||||||
|
# v0.9.40
|
||||||
|
## 08/31/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added some new Twig filters: `defined`, `rtrim`, `ltrim`
|
||||||
|
* Admin support for customizable page file name + template override
|
||||||
|
1. [](#improved)
|
||||||
|
* Better message for incompatible/unsupported Twig template
|
||||||
|
* Improved User blueprints with better help
|
||||||
|
* Switched to composer **install** rather than **update** by default
|
||||||
|
* Admin autofocus on page title
|
||||||
|
* `.htaccess` hardening (`.htaccess` & `htaccess.txt`)
|
||||||
|
* Cache safety checks for missing folders
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed issue with unescaped `o` character in date formats
|
||||||
|
|
||||||
|
# v0.9.39
|
||||||
|
## 08/25/2015
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* `Page.active()` not triggering on **homepage**
|
||||||
|
* Fix for invalid session name in Opera browser
|
||||||
|
|
||||||
|
# v0.9.38
|
||||||
|
## 08/24/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added `language` to **user** blueprint
|
||||||
|
* Added translations to blueprints
|
||||||
|
* New extending logic for blueprints
|
||||||
|
* Blueprints are now loaded with Streams to allow for better overrides
|
||||||
|
* Added new Symfony `dump()` method
|
||||||
|
1. [](#improved)
|
||||||
|
* Catch YAML header parse exception so site doesn't die
|
||||||
|
* Better `Page.parent()` logic
|
||||||
|
* Improved GPM display layout
|
||||||
|
* Tweaked default page layout
|
||||||
|
* Unset route and slug for improved reliability of route changes
|
||||||
|
* Added requirements to README.md
|
||||||
|
* Updated various libraries
|
||||||
|
* Allow use of custom page date field for dateRange collections
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Slug fixes with GPM
|
||||||
|
* Unset plaintext password on save
|
||||||
|
* Fix for trailing `/` not matching active children
|
||||||
|
|
||||||
|
# v0.9.37
|
||||||
|
## 08/12/2015
|
||||||
|
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Fixed issue when saving `header.process` in page forms via the **admin plugin**
|
||||||
|
* Fixed error due to use of `set_time_limit` that might be disabled on some hosts
|
||||||
|
|
||||||
|
# v0.9.36
|
||||||
|
## 08/11/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added a new `newuser` CLI command to create user accounts
|
||||||
|
* Added `default` blueprint for all templates
|
||||||
|
* Support `user` and `system` language translation merging
|
||||||
|
1. [](#improved)
|
||||||
|
* Added isSymlink method in GPM to determine if Grav is symbolically linked or not
|
||||||
|
* Refactored page recursing
|
||||||
|
* Updated blueprints to use new toggles
|
||||||
|
* Updated blueprints to use current date for date format fields
|
||||||
|
* Updated composer.phar
|
||||||
|
* Use sessions for admin even when disabled for site
|
||||||
|
* Use `GRAV_ROOT` in session identifier
|
||||||
|
|
||||||
|
# v0.9.35
|
||||||
|
## 08/06/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added `body_classes` field
|
||||||
|
* Added `visiblity` toggle and help tooltips on new page form
|
||||||
|
* Added new `Page.unsetRoute()` method to allow admin to regenerate the route
|
||||||
|
2. [](#improved)
|
||||||
|
* User save no longer stores username each time
|
||||||
|
* Page list form field now shows all pages except root
|
||||||
|
* Removed required option from page title
|
||||||
|
* Added configuration settings for running Nginx in sub directory
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Fixed deep translation merging
|
||||||
|
* Fixed broken **metadata** merging with site defaults
|
||||||
|
* Fixed broken **summary** field
|
||||||
|
* Fixed broken robots field
|
||||||
|
* Fixed GPM issue when using cURL, throwing an `Undefined offset: 1` exception
|
||||||
|
* Removed duplicate hidden page `type` field
|
||||||
|
|
||||||
|
# v0.9.34
|
||||||
|
## 08/04/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `cache_all` system setting + media `cache()` method
|
||||||
|
* Added base languages configuration
|
||||||
|
* Added property language to page to help plugins identify page language
|
||||||
|
* New `Utils::arrayFilterRecursive()` method
|
||||||
|
2. [](#improved)
|
||||||
|
* Improved Session handling to support site and admin independently
|
||||||
|
* Allow Twig variables to be modified in other events
|
||||||
|
* Blueprint updates in preparation for Admin plugin
|
||||||
|
* Changed `Inflector` from static to object and added multi-language support
|
||||||
|
* Support for admin override of a page's blueprints
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Removed unused `use` in `VideoMedium` that was causing error
|
||||||
|
* Array fix in `User.authorise()` method
|
||||||
|
* Fix for typo in `translations_fallback`
|
||||||
|
* Fixed moving page to the root
|
||||||
|
|
||||||
|
# v0.9.33
|
||||||
|
## 07/21/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `onImageMediumSaved()` event (useful for post-image processing)
|
||||||
|
* Added `Vary: Accept-Encoding` option
|
||||||
|
2. [](#improved)
|
||||||
|
* Multilang-safe delimeter position
|
||||||
|
* Refactored Twig classes and added optional umask setting
|
||||||
|
* Removed `pageinit()` timing
|
||||||
|
* `Page->routable()` now takes `published()` state into account
|
||||||
|
* Improved how page extension is set
|
||||||
|
* Support `Language->translate()` method taking string and array
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Fixed `backup` command to include empty folders
|
||||||
|
|
||||||
|
# v0.9.32
|
||||||
|
## 07/14/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Detect users preferred language via `http_accept_language` setting
|
||||||
|
* Added new `translateArray()` language method
|
||||||
|
2. [](#improved)
|
||||||
|
* Support `en` translations by default for plugins & themes
|
||||||
|
* Improved default generator tag
|
||||||
|
* Minor language tweaks and fixes
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Fix for session active language and homepage redirects
|
||||||
|
* Ignore root-level page rather than throwing error
|
||||||
|
|
||||||
|
# v0.9.31
|
||||||
|
## 07/09/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added xml, json, css and js to valid media file types
|
||||||
|
2. [](#improved)
|
||||||
|
* Better handling of unsupported media type downloads
|
||||||
|
* Improved `bin/grav backup` command to mimic admin plugin location/name
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Critical fix for broken language translations
|
||||||
|
* Fix for Twig markdown filter error
|
||||||
|
* Safety check for download extension
|
||||||
|
|
||||||
|
# v0.9.30
|
||||||
|
## 07/08/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* BIG NEWS! Extensive Multi-Language support is all new in 0.9.30!
|
||||||
|
* Translation support via Twig filter/function and PHP method
|
||||||
|
* Page specific default route
|
||||||
|
* Page specific route aliases
|
||||||
|
* Canonical URL route support
|
||||||
|
* Added built-in session support
|
||||||
|
* New `Page.rawRoute()` to get a consistent folder-based route to a page
|
||||||
|
* Added option to always redirect to default page on alias URL
|
||||||
|
* Added language safe redirect function for use in core and plugins
|
||||||
|
2. [](#improved)
|
||||||
|
* Improved `Page.active()` and `Page.activeChild()` methods to support route aliases
|
||||||
|
* Various spelling corrections in `.php` comments, `.md` and `.yaml` files
|
||||||
|
* `Utils::startsWith()` and `Utils::endsWith()` now support needle arrays
|
||||||
|
* Added a new timer around `pageInitialized` event
|
||||||
|
* Updated jQuery library to v2.1.4
|
||||||
|
3. [](#bugfix)
|
||||||
|
* In-page CSS and JS files are now handled properly
|
||||||
|
* Fix for `enable_media_timestamp` not working properly
|
||||||
|
|
||||||
|
# v0.9.29
|
||||||
|
## 06/22/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* New and improved Regex-powered redirect and route alias logic
|
||||||
|
* Added new `onBuildPagesInitialized` event for memory critical or time-consuming plugins
|
||||||
|
* Added a `setSummary()` method for pages
|
||||||
|
2. [](#improved)
|
||||||
|
* Improved `MergeConfig()` logic for more control
|
||||||
|
* Travis skeleton build trigger implemented
|
||||||
|
* Set composer.json versions to stable versions where possible
|
||||||
|
* Disabled `last_modified` and `etag` page headers by default (causing too much page caching)
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Preload classes during `bin/gpm selfupgrade` to avoid issues with updated classes
|
||||||
|
* Fix for directory relative _down_ links
|
||||||
|
|
||||||
|
# v0.9.28
|
||||||
|
## 06/16/2015
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added method to set raw markdown on a page
|
||||||
|
* Added ability to enabled system and page level `etag` and `last_modified` headers
|
||||||
|
2. [](#improved)
|
||||||
|
* Improved image path processing
|
||||||
|
* Improved query string handling
|
||||||
|
* Optimization to image handling supporting URL encoded filenames
|
||||||
|
* Use global `composer` when available rather than Grv provided one
|
||||||
|
* Use `PHP_BINARY` contant rather than `php` executable
|
||||||
|
* Updated Doctrine Cache library
|
||||||
|
* Updated Symfony libraries
|
||||||
|
* Moved `convertUrl()` method to Uri object
|
||||||
|
3. [](#bugfix)
|
||||||
|
* Fix incorrect slug causing problems with CLI `uninstall`
|
||||||
|
* Fix Twig runtime error with assets pipeline in sufolder installations
|
||||||
|
* Fix for `+` in image filenames
|
||||||
|
* Fix for dot files causing issues with page processing
|
||||||
|
* Fix for Uri path detection on Windows platform
|
||||||
|
* Fix for alternative media resolutions
|
||||||
|
* Fix for modularTypes key properties
|
||||||
|
|
||||||
# v0.9.27
|
# v0.9.27
|
||||||
## 05/09/2015
|
## 05/09/2015
|
||||||
|
|
||||||
@@ -9,7 +714,7 @@
|
|||||||
* Added a new `parseLinks` method to Plugins class
|
* Added a new `parseLinks` method to Plugins class
|
||||||
* Added `starts_with` and `ends_with` Twig filters
|
* Added `starts_with` and `ends_with` Twig filters
|
||||||
2. [](#improved)
|
2. [](#improved)
|
||||||
* Opitmized install of vendor libraries for speed improvement
|
* Optimized install of vendor libraries for speed improvement
|
||||||
* Improved configuration handling in preparation for admin plugin
|
* Improved configuration handling in preparation for admin plugin
|
||||||
* Cache optimization: Don't cache Twig templates when you pass dynamic params
|
* Cache optimization: Don't cache Twig templates when you pass dynamic params
|
||||||
* Moved `Utils::rcopy` to `Folder::rcopy`
|
* Moved `Utils::rcopy` to `Folder::rcopy`
|
||||||
@@ -23,7 +728,7 @@
|
|||||||
* Fix for URLs with trailing slashes
|
* Fix for URLs with trailing slashes
|
||||||
* Handle condition where certain errors resulted in blank page
|
* Handle condition where certain errors resulted in blank page
|
||||||
* Fix for issue with theme name equal to base_url and asset pipeline
|
* Fix for issue with theme name equal to base_url and asset pipeline
|
||||||
* Fix to properly nomralize font rewrite path
|
* Fix to properly normalize font rewrite path
|
||||||
* Fix for absolute URLs below the current page
|
* Fix for absolute URLs below the current page
|
||||||
* Fix for `..` page references
|
* Fix for `..` page references
|
||||||
|
|
||||||
@@ -41,7 +746,7 @@
|
|||||||
2. [](#improved)
|
2. [](#improved)
|
||||||
* Refactored media image handling to make it more flexible and support absolute paths
|
* Refactored media image handling to make it more flexible and support absolute paths
|
||||||
* Refactored page modification check process to make it faster
|
* Refactored page modification check process to make it faster
|
||||||
* User account improvements in preparation for Admin plugin
|
* User account improvements in preparation for admin plugin
|
||||||
* Protect against timing attacks
|
* Protect against timing attacks
|
||||||
* Reset default system expires time to 0 seconds (can override if you need to)
|
* Reset default system expires time to 0 seconds (can override if you need to)
|
||||||
3. [](#bugfix)
|
3. [](#bugfix)
|
||||||
@@ -169,7 +874,7 @@
|
|||||||
* Improved the markdown Lightbox functionality to better mimic Twig version
|
* Improved the markdown Lightbox functionality to better mimic Twig version
|
||||||
* Fullsize Lightbox can now have filters applied
|
* Fullsize Lightbox can now have filters applied
|
||||||
* Added a new `mergeConfig()` method to Plugin class to merge system + page header configuration
|
* Added a new `mergeConfig()` method to Plugin class to merge system + page header configuration
|
||||||
* Added a new `disable()` method to Plugin class to programatically disable a plugin
|
* Added a new `disable()` method to Plugin class to programmatically disable a plugin
|
||||||
* Updated Parsedown and Parsedown Extra to address bugs
|
* Updated Parsedown and Parsedown Extra to address bugs
|
||||||
* Various PSR fixes
|
* Various PSR fixes
|
||||||
3. [](#bugfix)
|
3. [](#bugfix)
|
||||||
@@ -222,7 +927,7 @@
|
|||||||
* Added `publish_date` in page headers to automatically publish page
|
* Added `publish_date` in page headers to automatically publish page
|
||||||
* Added `unpublish_date` in page headers to automatically unpublish page
|
* Added `unpublish_date` in page headers to automatically unpublish page
|
||||||
* Added `dateRange()` capability for collections
|
* Added `dateRange()` capability for collections
|
||||||
* Added ability to dynamically control Cache lifetime programatically
|
* Added ability to dynamically control Cache lifetime programmatically
|
||||||
* Added ability to sort by anything in the page header. E.g. `sort: header.taxonomy.year`
|
* Added ability to sort by anything in the page header. E.g. `sort: header.taxonomy.year`
|
||||||
* Added various helper methods to collections: `copy, nonVisible, modular, nonModular, published, nonPublished, nonRoutable`
|
* Added various helper methods to collections: `copy, nonVisible, modular, nonModular, published, nonPublished, nonRoutable`
|
||||||
2. [](#improved)
|
2. [](#improved)
|
||||||
@@ -397,7 +1102,7 @@
|
|||||||
* Broke cache types out into multiple directories in the cache folder
|
* Broke cache types out into multiple directories in the cache folder
|
||||||
* Removed vendor libs from github repository
|
* Removed vendor libs from github repository
|
||||||
* Various PSR cleanup of code
|
* Various PSR cleanup of code
|
||||||
* Various Blueprint updates to support upcoming Admin plugin
|
* Various Blueprint updates to support upcoming admin plugin
|
||||||
* Added ability to filter page children for normal/modular/all
|
* Added ability to filter page children for normal/modular/all
|
||||||
* Added `sort_by_key` twig filter
|
* Added `sort_by_key` twig filter
|
||||||
* Added `visible()` and `routable()` filters to page collections
|
* Added `visible()` and `routable()` filters to page collections
|
||||||
@@ -470,7 +1175,7 @@
|
|||||||
* Addition of Dependency Injection Container
|
* Addition of Dependency Injection Container
|
||||||
* Refactored plugins to use Symfony Event Dispatcher
|
* Refactored plugins to use Symfony Event Dispatcher
|
||||||
* New Asset Manager to provide unified management of JavaScript and CSS
|
* New Asset Manager to provide unified management of JavaScript and CSS
|
||||||
* Asset Pipelining to provide unification, minify, and optimazation of JavaScript and CSS
|
* Asset Pipelining to provide unification, minify, and optimization of JavaScript and CSS
|
||||||
* Grav Media support directly in Markdown syntax
|
* Grav Media support directly in Markdown syntax
|
||||||
* Additional Grav Generator meta tag in default themes
|
* Additional Grav Generator meta tag in default themes
|
||||||
* Added support for PHP Stream Wrapper for resource location
|
* Added support for PHP Stream Wrapper for resource location
|
||||||
|
|||||||
122
CONTRIBUTING.md
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
# Contributing to Grav
|
||||||
|
|
||||||
|
:+1::tada: First, thanks for getting involved with Grav! :tada::+1:
|
||||||
|
|
||||||
|
Please take a moment to review this document in order to make the contribution
|
||||||
|
process easy and effective for everyone involved.
|
||||||
|
|
||||||
|
Following these guidelines helps to communicate that you respect the time of
|
||||||
|
the developers managing and developing this open source project. In return,
|
||||||
|
they should reciprocate that respect in addressing your issue or assessing
|
||||||
|
patches and features.
|
||||||
|
|
||||||
|
## Grav, Plugins, Themes and Skeletons
|
||||||
|
|
||||||
|
Grav is a large open source project—it's made up of over 100 repositories. When you initially consider contributing to Grav, you might be unsure about which of those 200 repositories implements the functionality you want to change or report a bug for.
|
||||||
|
|
||||||
|
[https://github.com/getgrav/grav](https://github.com/getgrav/grav) is the main Grav repository. The core of Grav is provided by this repo.
|
||||||
|
|
||||||
|
[https://github.com/getgrav/grav-plugin-admin](https://github.com/getgrav/grav-plugin-admin) is the Admin Plugin repository.
|
||||||
|
|
||||||
|
Every Plugin and Theme has its own repository. If you have a problem you think is specific to a Theme or Plugin, please report it in its corresponding repository. Please read the Plugin or Theme documentation to ensure the problem is not addressed there already.
|
||||||
|
|
||||||
|
Every Skeleton also has its own repository, so if an issue is not specific to a theme or plugin but rather to its usage in the skeleton, report it in the skeleton repository.
|
||||||
|
|
||||||
|
## Using the issue tracker
|
||||||
|
|
||||||
|
The issue tracker is the preferred channel for [bug reports](#bugs),
|
||||||
|
[features requests](#features) and [submitting pull
|
||||||
|
requests](#pull-requests), but please respect the following restrictions:
|
||||||
|
|
||||||
|
* Please **do not** use the issue tracker for support requests. Use
|
||||||
|
[the Forum](http://getgrav.org/forum) or [the Gitter chat](https://gitter.im/getgrav/grav).
|
||||||
|
|
||||||
|
|
||||||
|
<a name="bugs"></a>
|
||||||
|
## Bug reports
|
||||||
|
|
||||||
|
A bug is a _demonstrable problem_ that is caused by the code in the repository.
|
||||||
|
Good bug reports are extremely helpful - thank you!
|
||||||
|
|
||||||
|
Guidelines for bug reports:
|
||||||
|
|
||||||
|
1. **Check you satisfy the Grav requirements** — [http://learn.getgrav.org/basics/requirements](http://learn.getgrav.org/basics/requirements)
|
||||||
|
|
||||||
|
2. **Check this happens on a clean Grav install** — check if the issue happens on any Grav site, or just with a specific configuration of plugins / theme
|
||||||
|
|
||||||
|
3. **Use the GitHub issue search** — check if the issue has already been
|
||||||
|
reported.
|
||||||
|
|
||||||
|
4. **Check if the issue is already being solved in a PR** — check the open Pull Requests to see if one already solves the problem you're having
|
||||||
|
|
||||||
|
5. **Check if the issue has been fixed** — try to reproduce it using the
|
||||||
|
latest `develop` branch in the repository.
|
||||||
|
|
||||||
|
6. **Isolate the problem** — create a [reduced test
|
||||||
|
case](http://css-tricks.com/reduced-test-cases/) and provide a step-by-step instruction set on how to recreate the problem. Include code samples, page snippets or yaml configurations if needed.
|
||||||
|
|
||||||
|
A good bug report shouldn't leave others needing to chase you up for more
|
||||||
|
information. Please try to be as detailed as possible in your report.
|
||||||
|
|
||||||
|
What is your environment? Is it localhost, OSX, Linux, on a remote server? Same happening locally and or the server, or just locally or just on Linux?
|
||||||
|
|
||||||
|
What steps will reproduce the issue? What browser(s) and OS experience the problem?
|
||||||
|
|
||||||
|
What would you expect to be the outcome?
|
||||||
|
|
||||||
|
Did the problem start happening recently (e.g. after updating to a new version of Grav) or was this always a problem?
|
||||||
|
|
||||||
|
If the problem started happening recently, can you reproduce the problem in an older version of Grav? What's the most recent version in which the problem doesn't happen? You can download older versions of Grav from the releases page on Github.
|
||||||
|
|
||||||
|
Can you reliably reproduce the issue? If not, provide details about how often the problem happens and under which conditions it normally happens.
|
||||||
|
|
||||||
|
|
||||||
|
All these details will help people to fix any potential bugs.
|
||||||
|
|
||||||
|
Important: [include Code Samples in triple backticks](https://help.github.com/articles/github-flavored-markdown/#fenced-code-blocks) so that Github will provide a proper indentation. [Add the language name after the backticks](https://help.github.com/articles/github-flavored-markdown/#syntax-highlighting) to add syntax highlighting to the code snippets.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
> Short and descriptive example bug report title
|
||||||
|
>
|
||||||
|
> A summary of the issue and the browser/OS environment in which it occurs. If
|
||||||
|
> suitable, include the steps required to reproduce the bug.
|
||||||
|
>
|
||||||
|
> 1. This is the first step
|
||||||
|
> 2. This is the second step
|
||||||
|
> 3. Further steps, etc.
|
||||||
|
>>
|
||||||
|
> Any other information you want to share that is relevant to the issue being
|
||||||
|
> reported. This might include the lines of code that you have identified as
|
||||||
|
> causing the bug, and potential solutions (and your opinions on their
|
||||||
|
> merits).
|
||||||
|
|
||||||
|
|
||||||
|
<a name="features"></a>
|
||||||
|
## Feature requests
|
||||||
|
|
||||||
|
Feature requests are welcome. But take a moment to find out whether your idea
|
||||||
|
fits with the scope and aims of the project. It's up to *you* to make a strong
|
||||||
|
case to convince the project's developers of the merits of this feature. Please
|
||||||
|
provide as much detail and context as possible.
|
||||||
|
|
||||||
|
|
||||||
|
<a name="pull-requests"></a>
|
||||||
|
## Pull requests
|
||||||
|
|
||||||
|
Good pull requests - patches, improvements, new features - are a fantastic
|
||||||
|
help. They should remain focused in scope and avoid containing unrelated
|
||||||
|
commits.
|
||||||
|
|
||||||
|
**Please ask first** in Gitter or in the Forum before embarking on any significant pull request (e.g.
|
||||||
|
implementing features, refactoring code..),
|
||||||
|
otherwise you risk spending a lot of time working on something that the
|
||||||
|
project's developers might not want to merge into the project.
|
||||||
|
|
||||||
|
Please adhere to the coding conventions used throughout the project (indentation,
|
||||||
|
accurate comments, etc.) and any other requirements.
|
||||||
|
|
||||||
|
See [Using Pull Request](https://help.github.com/articles/using-pull-requests/) and [Fork a Repo](https://help.github.com/articles/fork-a-repo/) if you're not familiar with Pull Requests.
|
||||||
|
|
||||||
|
**IMPORTANT**: By submitting a patch, you agree to allow the project owner to
|
||||||
|
license your work under the same license as that used by the project.
|
||||||
44
README.md
@@ -1,29 +1,42 @@
|
|||||||
#  Grav
|
#  Grav
|
||||||
|
|
||||||
[](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad) [](https://gitter.im/getgrav/grav?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad) [](https://gitter.im/getgrav/grav?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://travis-ci.org/getgrav/grav)
|
||||||
|
|
||||||
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.
|
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:
|
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](http://twig.sensiolabs.org/): for powerful control of the user interface
|
* [Twig Templating](http://twig.sensiolabs.org/): for powerful control of the user interface
|
||||||
* [Markdown](http://en.wikipedia.org/wiki/Markdown): for easy content creation
|
* [Markdown](http://en.wikipedia.org/wiki/Markdown): for easy content creation
|
||||||
* [YAML](http://yaml.org): for simple configuration
|
* [YAML](http://yaml.org): for simple configuration
|
||||||
* [Parsedown](http://parsedown.org/): for fast Markdown and Mardown Extra support
|
* [Parsedown](http://parsedown.org/): for fast Markdown and Markdown Extra support
|
||||||
* [Doctrine Cache](http://docs.doctrine-project.org/en/2.0.x/reference/caching.html): layer for performance
|
* [Doctrine Cache](http://docs.doctrine-project.org/en/2.0.x/reference/caching.html): layer for performance
|
||||||
* [Pimple Dependency Injection Container](http://pimple.sensiolabs.org/): for extensibility and maintainability
|
* [Pimple Dependency Injection Container](http://pimple.sensiolabs.org/): for extensibility and maintainability
|
||||||
* [Symfony Event Dispacher](http://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
|
* [Symfony Event Dispatcher](http://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
|
||||||
* [Symfony Console](http://symfony.com/doc/current/components/console/introduction.html): for CLI interface
|
* [Symfony Console](http://symfony.com/doc/current/components/console/introduction.html): for CLI interface
|
||||||
* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation
|
* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
|
||||||
|
- PHP 5.5.9 or higher. Check the [required modules list](http://learn.getgrav.org/basics/requirements#php-requirements)
|
||||||
|
- Check the [Apache](http://learn.getgrav.org/basics/requirements#apache-requirements) or [IIS](http://learn.getgrav.org/basics/requirements#iis-requirements) requirements
|
||||||
|
|
||||||
# QuickStart
|
# QuickStart
|
||||||
|
|
||||||
You have two options to get Grav:
|
These are the options to get Grav:
|
||||||
|
|
||||||
### Downloading a Grav Package
|
### Downloading a Grav Package
|
||||||
|
|
||||||
You can download a **ready-built** package from the [Downloads page on http://getgrav.org](http://getgrav.org/downloads)
|
You can download a **ready-built** package from the [Downloads page on http://getgrav.org](http://getgrav.org/downloads)
|
||||||
|
|
||||||
|
### With Composer
|
||||||
|
|
||||||
|
You can create a new project with the latest **stable** Grav release with the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ composer create-project getgrav/grav ~/webroot/grav
|
||||||
|
```
|
||||||
|
|
||||||
### From GitHub
|
### From GitHub
|
||||||
|
|
||||||
1. Clone the Grav repository from [https://github.com/getgrav/grav]() to a folder in the webroot of your server, e.g. `~/webroot/grav`. Launch a **terminal** or **console** and navigate to the webroot folder:
|
1. Clone the Grav repository from [https://github.com/getgrav/grav]() to a folder in the webroot of your server, e.g. `~/webroot/grav`. Launch a **terminal** or **console** and navigate to the webroot folder:
|
||||||
@@ -42,13 +55,13 @@ Check out the [install procedures](http://learn.getgrav.org/basics/installation)
|
|||||||
|
|
||||||
# Adding Functionality
|
# Adding Functionality
|
||||||
|
|
||||||
You can download manually from the [Downloads page on http://getgrav.org](http://getgrav.org/downloads), but the preferred solution is to use the [Grav Package Manager](http://learn.getgrav.org/advanced/grav-gpm) or `GPM`:
|
You can download [plugins](http://getgrav.org/downloads/plugins) or [themes](http://getgrav.org/downloads/themes) manually from the appropriate tab on the [Downloads page on http://getgrav.org](http://getgrav.org/downloads), but the preferred solution is to use the [Grav Package Manager](http://learn.getgrav.org/advanced/grav-gpm) or `GPM`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ bin/gpm index
|
$ bin/gpm index
|
||||||
```
|
```
|
||||||
|
|
||||||
This will display all the available plugins and then you can install one ore more with:
|
This will display all the available plugins and then you can install one or more with:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ bin/gpm install <plugin/theme>
|
$ bin/gpm install <plugin/theme>
|
||||||
@@ -71,7 +84,7 @@ $ bin/gpm update
|
|||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
We appreciate any contribution to Grav, whether it is related to bugs, grammar, or simply a suggestion or improvement.
|
We appreciate any contribution to Grav, whether it is related to bugs, grammar, or simply a suggestion or improvement.
|
||||||
However, we ask that any contribution follow our simple guidelines in order to be properly received.
|
However, we ask that any contributions follow our simple guidelines in order to be properly received.
|
||||||
|
|
||||||
All our projects follow the [GitFlow branching model][gitflow-model], from development to release. If you are not familiar with it, there are several guides and tutorials to make you understand what it is about.
|
All our projects follow the [GitFlow branching model][gitflow-model], from development to release. If you are not familiar with it, there are several guides and tutorials to make you understand what it is about.
|
||||||
|
|
||||||
@@ -87,19 +100,26 @@ What you mainly want to know is that:
|
|||||||
* [What is Grav?](http://learn.getgrav.org/basics/what-is-grav)
|
* [What is Grav?](http://learn.getgrav.org/basics/what-is-grav)
|
||||||
* [Install](http://learn.getgrav.org/basics/installation) Grav in few seconds
|
* [Install](http://learn.getgrav.org/basics/installation) Grav in few seconds
|
||||||
* Understand the [Configuration](http://learn.getgrav.org/basics/grav-configuration)
|
* Understand the [Configuration](http://learn.getgrav.org/basics/grav-configuration)
|
||||||
* Take a peek at our available free [Skeletons](http://getgrav.org/downloads/skeletons#extras)
|
* Take a peek at our available free [Skeletons](http://getgrav.org/downloads/skeletons)
|
||||||
* If you have questions, check out `#grav` on irc.freenode.net
|
* If you have questions, jump on our [Gitter Room](https://gitter.im/getgrav/grav)!
|
||||||
* Have fun!
|
* Have fun!
|
||||||
|
|
||||||
# Exploring more
|
# Exploring More
|
||||||
|
|
||||||
* Have a look at our [Basic Tutorial](http://learn.getgrav.org/basics/basic-tutorial)
|
* Have a look at our [Basic Tutorial](http://learn.getgrav.org/basics/basic-tutorial)
|
||||||
* Dive into more [advanced](http://learn.getgrav.org/advanced) functions
|
* Dive into more [advanced](http://learn.getgrav.org/advanced) functions
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
See [LICENSE](LICENSE)
|
See [LICENSE](LICENSE.txt)
|
||||||
|
|
||||||
|
|
||||||
[gitflow-model]: http://nvie.com/posts/a-successful-git-branching-model/
|
[gitflow-model]: http://nvie.com/posts/a-successful-git-branching-model/
|
||||||
[gitflow-extensions]: https://github.com/nvie/gitflow
|
[gitflow-extensions]: https://github.com/nvie/gitflow
|
||||||
|
|
||||||
|
# Running Tests
|
||||||
|
|
||||||
|
First install the dev dependencies by running `composer update` from the Grav root.
|
||||||
|
Then `composer test` will run the Unit Tests, which should be always executed successfully on any site.
|
||||||
|
|
||||||
|
You can also run a single unit test file, e.g. `composer test tests/unit/Grav/Common/AssetsTest.php`
|
||||||
|
|||||||
18
bin/gpm
@@ -2,14 +2,17 @@
|
|||||||
<?php
|
<?php
|
||||||
define('GRAV_CLI', true);
|
define('GRAV_CLI', true);
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = '5.4.0', '<')) {
|
if (!file_exists(__DIR__ . '/../vendor')){
|
||||||
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
|
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use Grav\Common\Composer;
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')){
|
if (!file_exists(__DIR__ . '/../vendor')){
|
||||||
// Before we can even start, we need to run composer first
|
// Before we can even start, we need to run composer first
|
||||||
|
$composer = Composer::getComposerExecutor();
|
||||||
echo "Preparing to install vendor dependencies...\n\n";
|
echo "Preparing to install vendor dependencies...\n\n";
|
||||||
echo system('php bin/composer.phar --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
|
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
|
||||||
echo "\n\n";
|
echo "\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18,6 +21,10 @@ use Grav\Common\Grav;
|
|||||||
|
|
||||||
$autoload = require_once(__DIR__ . '/../vendor/autoload.php');
|
$autoload = require_once(__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')) {
|
if (!ini_get('date.timezone')) {
|
||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
}
|
}
|
||||||
@@ -32,9 +39,8 @@ if (!function_exists('curl_version')) {
|
|||||||
|
|
||||||
$grav = Grav::instance(array('loader' => $autoload));
|
$grav = Grav::instance(array('loader' => $autoload));
|
||||||
$grav['config']->init();
|
$grav['config']->init();
|
||||||
|
$grav['uri']->init();
|
||||||
$grav['streams'];
|
$grav['streams'];
|
||||||
$grav['plugins']->init();
|
|
||||||
$grav['themes']->init();
|
|
||||||
|
|
||||||
$app = new Application('Grav Package Manager', GRAV_VERSION);
|
$app = new Application('Grav Package Manager', GRAV_VERSION);
|
||||||
$app->addCommands(array(
|
$app->addCommands(array(
|
||||||
@@ -46,4 +52,6 @@ $app->addCommands(array(
|
|||||||
new \Grav\Console\Gpm\UpdateCommand(),
|
new \Grav\Console\Gpm\UpdateCommand(),
|
||||||
new \Grav\Console\Gpm\SelfupgradeCommand(),
|
new \Grav\Console\Gpm\SelfupgradeCommand(),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
$app->setDefaultCommand('index');
|
||||||
$app->run();
|
$app->run();
|
||||||
|
|||||||
29
bin/grav
@@ -2,14 +2,17 @@
|
|||||||
<?php
|
<?php
|
||||||
define('GRAV_CLI', true);
|
define('GRAV_CLI', true);
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = '5.4.0', '<')) {
|
if (!file_exists(__DIR__ . '/../vendor')){
|
||||||
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
|
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use Grav\Common\Composer;
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')){
|
if (!file_exists(__DIR__ . '/../vendor')){
|
||||||
// Before we can even start, we need to run composer first
|
// Before we can even start, we need to run composer first
|
||||||
|
$composer = Composer::getComposerExecutor();
|
||||||
echo "Preparing to install vendor dependencies...\n\n";
|
echo "Preparing to install vendor dependencies...\n\n";
|
||||||
echo system('php bin/composer.phar --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
|
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
|
||||||
echo "\n\n";
|
echo "\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,6 +20,10 @@ use Symfony\Component\Console\Application;
|
|||||||
|
|
||||||
require_once __DIR__ . '/../vendor/autoload.php';
|
require_once __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')) {
|
if (!ini_get('date.timezone')) {
|
||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
}
|
}
|
||||||
@@ -25,14 +32,14 @@ if (!file_exists(ROOT_DIR . 'index.php')) {
|
|||||||
exit('FATAL: Must be run from ROOT directory of Grav!');
|
exit('FATAL: Must be run from ROOT directory of Grav!');
|
||||||
}
|
}
|
||||||
|
|
||||||
$app = new Application('Grav CLI Application', '0.1.0');
|
$app = new Application('Grav CLI Application', GRAV_VERSION);
|
||||||
$app->addCommands(array(
|
$app->addCommands(array(
|
||||||
new Grav\Console\Cli\InstallCommand(),
|
new \Grav\Console\Cli\InstallCommand(),
|
||||||
new Grav\Console\Cli\ComposerCommand(),
|
new \Grav\Console\Cli\ComposerCommand(),
|
||||||
new Grav\Console\Cli\SandboxCommand(),
|
new \Grav\Console\Cli\SandboxCommand(),
|
||||||
new Grav\Console\Cli\CleanCommand(),
|
new \Grav\Console\Cli\CleanCommand(),
|
||||||
new Grav\Console\Cli\ClearCacheCommand(),
|
new \Grav\Console\Cli\ClearCacheCommand(),
|
||||||
new Grav\Console\Cli\BackupCommand(),
|
new \Grav\Console\Cli\BackupCommand(),
|
||||||
new Grav\Console\Cli\NewProjectCommand(),
|
new \Grav\Console\Cli\NewProjectCommand(),
|
||||||
));
|
));
|
||||||
$app->run();
|
$app->run();
|
||||||
|
|||||||
118
bin/plugin
Executable file
@@ -0,0 +1,118 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
define('GRAV_CLI', true);
|
||||||
|
|
||||||
|
if (!file_exists(__DIR__ . '/../vendor')) {
|
||||||
|
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
use Grav\Common\Composer;
|
||||||
|
|
||||||
|
if (!file_exists(__DIR__ . '/../vendor')) {
|
||||||
|
// Before we can even start, we need to run composer first
|
||||||
|
$composer = Composer::getComposerExecutor();
|
||||||
|
echo "Preparing to install vendor dependencies...\n\n";
|
||||||
|
echo system($composer . ' --working-dir="' . __DIR__ . '/../" --no-interaction --no-dev --prefer-dist -o install');
|
||||||
|
echo "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
$autoload = require_once(__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');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!file_exists(ROOT_DIR . 'index.php')) {
|
||||||
|
exit('FATAL: Must be run from ROOT directory of Grav!');
|
||||||
|
}
|
||||||
|
|
||||||
|
$grav = Grav::instance(array('loader' => $autoload));
|
||||||
|
$grav['config']->init();
|
||||||
|
$grav['streams'];
|
||||||
|
$grav['plugins']->init();
|
||||||
|
$grav['themes']->init();
|
||||||
|
|
||||||
|
$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);
|
||||||
|
|
||||||
|
$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']);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (in_array($entry, $available)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$available[] = $entry;
|
||||||
|
$output->writeln(' ' . $index . ". <red>" . str_pad($entry, 15) . "</red> <white>${bin} ${entry} list</white>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
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']);
|
||||||
|
} 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) {
|
||||||
|
require_once "plugins://{$name}/cli/{$command_path}";
|
||||||
|
|
||||||
|
$command_class = 'Grav\Plugin\Console\\' . preg_replace('/.php$/', '', $command_path);
|
||||||
|
$command = new $command_class();
|
||||||
|
$app->add($command);
|
||||||
|
}
|
||||||
|
|
||||||
|
$app->run($input);
|
||||||
16
codeception.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
actor: Tester
|
||||||
|
paths:
|
||||||
|
tests: tests
|
||||||
|
log: tests/_output
|
||||||
|
data: tests/_data
|
||||||
|
support: tests/_support
|
||||||
|
envs: tests/_envs
|
||||||
|
settings:
|
||||||
|
bootstrap: _bootstrap.php
|
||||||
|
colors: true
|
||||||
|
memory_limit: 1024M
|
||||||
|
extensions:
|
||||||
|
enabled:
|
||||||
|
- Codeception\Extension\RunFailed
|
||||||
|
modules:
|
||||||
|
config:
|
||||||
@@ -1,27 +1,38 @@
|
|||||||
{
|
{
|
||||||
"name": "getgrav/grav",
|
"name": "getgrav/grav",
|
||||||
"type": "library",
|
"type": "project",
|
||||||
"description": "Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS",
|
"description": "Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS",
|
||||||
"keywords": ["cms","flat-file cms","flat cms","flatfile cms","php"],
|
"keywords": ["cms","flat-file cms","flat cms","flatfile cms","php"],
|
||||||
"homepage": "http://getgrav.org",
|
"homepage": "http://getgrav.org",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.4.0",
|
"php": ">=5.5.9",
|
||||||
"twig/twig": "~1.16",
|
"twig/twig": "~1.24",
|
||||||
|
"erusev/parsedown": "dev-master as 1.6.0",
|
||||||
"erusev/parsedown-extra": "~0.7",
|
"erusev/parsedown-extra": "~0.7",
|
||||||
"symfony/yaml": "~2.6",
|
"symfony/yaml": "~2.8",
|
||||||
"symfony/console": "~2.6",
|
"symfony/console": "~2.8",
|
||||||
"symfony/event-dispatcher": "~2.6",
|
"symfony/event-dispatcher": "~2.8",
|
||||||
"doctrine/cache": "~1.3",
|
"symfony/var-dumper": "~2.8",
|
||||||
"maximebf/debugbar": "dev-master",
|
"symfony/polyfill-iconv": "~1.0",
|
||||||
"filp/whoops": "1.2.*@dev",
|
"doctrine/cache": "~1.5",
|
||||||
|
"filp/whoops": "~2.0",
|
||||||
"monolog/monolog": "~1.0",
|
"monolog/monolog": "~1.0",
|
||||||
"gregwar/image": "~2.0",
|
"gregwar/image": "~2.0",
|
||||||
"ircmaxell/password-compat": "1.0.*",
|
"mrclay/minify": "~2.2",
|
||||||
"mrclay/minify": "dev-master",
|
"donatj/phpuseragentparser": "~0.3",
|
||||||
"donatj/phpuseragentparser": "dev-master",
|
|
||||||
"pimple/pimple": "~3.0",
|
"pimple/pimple": "~3.0",
|
||||||
"rockettheme/toolbox": "1.0.*"
|
"rockettheme/toolbox": "dev-develop",
|
||||||
|
"maximebf/debugbar": "~1.10",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"ext-openssl": "*",
|
||||||
|
"ext-curl": "*",
|
||||||
|
"twig/extensions": "^1.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"codeception/codeception": "^2.1",
|
||||||
|
"phpunit/php-code-coverage": "~2.0",
|
||||||
|
"fzaninotto/faker": "^1.5"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@@ -31,5 +42,15 @@
|
|||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"exclude": ["VERSION"]
|
"exclude": ["VERSION"]
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"post-create-project-cmd": "bin/grav install",
|
||||||
|
"test": "vendor/bin/codecept run unit",
|
||||||
|
"test-windows": "vendor\\bin\\codecept run unit"
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-develop": "1.x-dev"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2687
composer.lock
generated
Normal file
17
index.php
@@ -1,14 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Grav;
|
namespace Grav;
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = '5.4.0', '<')) {
|
|
||||||
throw new \RuntimeException(sprintf('You are running PHP %s, but Grav needs at least <strong>PHP %s</strong> to run.', $ver, $req));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure vendor libraries exist
|
// Ensure vendor libraries exist
|
||||||
$autoload = __DIR__ . '/vendor/autoload.php';
|
$autoload = __DIR__ . '/vendor/autoload.php';
|
||||||
if (!is_file($autoload)) {
|
if (!is_file($autoload)) {
|
||||||
throw new \RuntimeException("Please run: <i>bin/grav install</i>");
|
die("Please run: <i>bin/grav install</i>");
|
||||||
}
|
}
|
||||||
|
|
||||||
use Grav\Common\Grav;
|
use Grav\Common\Grav;
|
||||||
@@ -16,9 +12,19 @@ use Grav\Common\Grav;
|
|||||||
// Register the auto-loader.
|
// Register the auto-loader.
|
||||||
$loader = require_once $autoload;
|
$loader = require_once $autoload;
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
// Set timezone to default, falls back to system if php.ini not set
|
// Set timezone to default, falls back to system if php.ini not set
|
||||||
date_default_timezone_set(@date_default_timezone_get());
|
date_default_timezone_set(@date_default_timezone_get());
|
||||||
|
|
||||||
|
// Set internal encoding if mbstring loaded
|
||||||
|
if (!extension_loaded('mbstring')) {
|
||||||
|
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
|
||||||
|
}
|
||||||
|
mb_internal_encoding('UTF-8');
|
||||||
|
|
||||||
// Get the Grav instance
|
// Get the Grav instance
|
||||||
$grav = Grav::instance(
|
$grav = Grav::instance(
|
||||||
array(
|
array(
|
||||||
@@ -33,4 +39,3 @@ try {
|
|||||||
$grav->fireEvent('onFatalException');
|
$grav->fireEvent('onFatalException');
|
||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
73
nginx.conf
@@ -1,73 +0,0 @@
|
|||||||
worker_processes 1;
|
|
||||||
|
|
||||||
events {
|
|
||||||
worker_connections 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
http {
|
|
||||||
include mime.types;
|
|
||||||
default_type application/octet-stream;
|
|
||||||
sendfile on;
|
|
||||||
keepalive_timeout 65;
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name localhost;
|
|
||||||
|
|
||||||
error_page 500 502 503 504 /50x.html;
|
|
||||||
location = /50x.html {
|
|
||||||
root html;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
root html;
|
|
||||||
index index.php;
|
|
||||||
if (!-e $request_filename){ rewrite ^(.*)$ /index.php last; }
|
|
||||||
}
|
|
||||||
|
|
||||||
location /images/ {
|
|
||||||
# Serve images as static
|
|
||||||
}
|
|
||||||
|
|
||||||
location /user {
|
|
||||||
rewrite ^/user/accounts/(.*)$ /error redirect;
|
|
||||||
rewrite ^/user/config/(.*)$ /error redirect;
|
|
||||||
rewrite ^/user/(.*)\.(txt|md|html|php|yaml|json|twig|sh|bat)$ /error redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /cache {
|
|
||||||
rewrite ^/cache/(.*) /error redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /bin {
|
|
||||||
rewrite ^/bin/(.*)$ /error redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /backup {
|
|
||||||
rewrite ^/backup/(.*) /error redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /system {
|
|
||||||
rewrite ^/system/(.*)\.(txt|md|html|php|yaml|json|twig|sh|bat)$ /error redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /vendor {
|
|
||||||
rewrite ^/vendor/(.*)\.(txt|md|html|php|yaml|json|twig|sh|bat)$ /error redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remember to change 127.0.0.1:9000 to the Ip/port
|
|
||||||
# you configured php-cgi.exe to run from
|
|
||||||
|
|
||||||
location ~ \.php$ {
|
|
||||||
try_files $uri =404;
|
|
||||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
|
||||||
fastcgi_pass 127.0.0.1:9000;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
include fastcgi_params;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
11
robots.txt
@@ -1,2 +1,11 @@
|
|||||||
User-agent: *
|
User-agent: *
|
||||||
Disallow:
|
Disallow: /backup/
|
||||||
|
Disallow: /bin/
|
||||||
|
Disallow: /cache/
|
||||||
|
Disallow: /grav/
|
||||||
|
Disallow: /logs/
|
||||||
|
Disallow: /system/
|
||||||
|
Disallow: /vendor/
|
||||||
|
Disallow: /user/
|
||||||
|
Allow: /user/pages/
|
||||||
|
Allow: /user/themes/
|
||||||
|
|||||||
4
system/assets/jquery/jquery-2.1.3.min.js
vendored
4
system/assets/jquery/jquery-2.1.4.min.js
vendored
Normal file
4
system/assets/jquery/jquery-2.x.min.js
vendored
Normal file
@@ -1,110 +1,19 @@
|
|||||||
body {
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
body header {
|
body header {
|
||||||
background: #349886;
|
background: #8552A2;
|
||||||
border-left: 8px solid #29796B;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body .clipboard {
|
body .left-panel {
|
||||||
width: 28px;
|
background: inherit;
|
||||||
height: 28px;
|
|
||||||
background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcAQMAAABIw03XAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///////9VfPVsAAAAAnRSTlP/AOW3MEoAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAFnRFWHRDcmVhdGlvbiBUaW1lADEwLzE1LzE0xr/LJAAAADhJREFUCJlj+P///wcGBPGDQR5E8OMi2IEEczOIaAQRHSCioQBGHAAR/7AT/z+DiA8MMALVXhABAJf9Sr5aY+UFAAAAAElFTkSuQmCC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body .exc-title-primary {
|
body .exc-title-primary {
|
||||||
color: #1C3631;
|
color: #fff;
|
||||||
text-shadow: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body .exc-title {
|
body .exc-title {
|
||||||
color: #2F5B52;
|
color: #ddd;
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .data-table-container label {
|
|
||||||
color: #0082BA;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frames-container {
|
|
||||||
overflow-y: auto;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .active .frame-class {
|
|
||||||
color: #E3D8E9;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-class {
|
|
||||||
color: #9055AF;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame.active {
|
|
||||||
border: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
background-color: #9055AF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body .frame:not(.active):hover {
|
body .frame:not(.active):hover {
|
||||||
background: #e9e9e9;
|
background: #e6e6e6;
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-file, body .data-table tbody {
|
|
||||||
font-family: "DejaVu Sans Mono", Menlo, Monaco, Consolas, Courier, monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-code {
|
|
||||||
background: #305669;
|
|
||||||
border-left: 8px solid #253A47;
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-code .frame-file {
|
|
||||||
background: #253A47;
|
|
||||||
color: #eee;
|
|
||||||
text-shadow: none;
|
|
||||||
box-shadow: none;
|
|
||||||
font-family: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-code .frame-file strong {
|
|
||||||
color: #fff;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-comments {
|
|
||||||
background: #283E4D;
|
|
||||||
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .frame-comments.empty:before {
|
|
||||||
color: #789AAB;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .details-container {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .details {
|
|
||||||
background-color: #eee;
|
|
||||||
border-left: 8px solid #ddd;
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .code-block {
|
|
||||||
background: #2C4454;
|
|
||||||
box-shadow: none;
|
|
||||||
font-family: "DejaVu Sans Mono", Menlo, Monaco, Consolas, Courier, monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .handler.active {
|
|
||||||
background: #666;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
title: Media
|
title: PLUGIN_ADMIN.MEDIA
|
||||||
|
|
||||||
form:
|
form:
|
||||||
validation: loose
|
validation: loose
|
||||||
|
|||||||
@@ -1,72 +1,116 @@
|
|||||||
title: Site
|
title: PLUGIN_ADMIN.SITE
|
||||||
form:
|
form:
|
||||||
validation: loose
|
validation: loose
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
content:
|
content:
|
||||||
type: section
|
type: section
|
||||||
title: Defaults
|
title: PLUGIN_ADMIN.DEFAULTS
|
||||||
|
underline: true
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
title:
|
title:
|
||||||
type: text
|
type: text
|
||||||
label: Site Title
|
label: PLUGIN_ADMIN.SITE_TITLE
|
||||||
size: large
|
size: large
|
||||||
placeholder: "Site wide title"
|
placeholder: PLUGIN_ADMIN.SITE_TITLE_PLACEHOLDER
|
||||||
help: Default title for your site
|
help: PLUGIN_ADMIN.SITE_TITLE_HELP
|
||||||
|
|
||||||
author.name:
|
author.name:
|
||||||
type: text
|
type: text
|
||||||
size: large
|
size: large
|
||||||
label: Default Author
|
label: PLUGIN_ADMIN.DEFAULT_AUTHOR
|
||||||
|
help: PLUGIN_ADMIN.DEFAULT_AUTHOR_HELP
|
||||||
|
|
||||||
author.email:
|
author.email:
|
||||||
type: text
|
type: text
|
||||||
size: large
|
size: large
|
||||||
label: Default Email
|
label: PLUGIN_ADMIN.DEFAULT_EMAIL
|
||||||
|
help: PLUGIN_ADMIN.DEFAULT_EMAIL_HELP
|
||||||
validate:
|
validate:
|
||||||
type: email
|
type: email
|
||||||
|
|
||||||
taxonomies:
|
taxonomies:
|
||||||
type: text
|
type: selectize
|
||||||
size: large
|
size: large
|
||||||
label: Taxonomy Types
|
label: PLUGIN_ADMIN.TAXONOMY_TYPES
|
||||||
classes: fancy
|
classes: fancy
|
||||||
|
help: PLUGIN_ADMIN.TAXONOMY_TYPES_HELP
|
||||||
validate:
|
validate:
|
||||||
type: commalist
|
type: commalist
|
||||||
|
|
||||||
metadata:
|
summary:
|
||||||
type: array
|
|
||||||
label: Metadata
|
|
||||||
placeholder_key: Name
|
|
||||||
placeholder_value: Content
|
|
||||||
|
|
||||||
blog:
|
|
||||||
type: section
|
type: section
|
||||||
title: Blog
|
title: PLUGIN_ADMIN.PAGE_SUMMARY
|
||||||
|
underline: true
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
blog.route:
|
summary.enabled:
|
||||||
type: text
|
type: toggle
|
||||||
size: large
|
label: PLUGIN_ADMIN.ENABLED
|
||||||
label: Blog URL
|
highlight: 1
|
||||||
|
help: PLUGIN_ADMIN.ENABLED_HELP
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
summary.size:
|
summary.size:
|
||||||
type: text
|
type: text
|
||||||
size: x-small
|
size: x-small
|
||||||
label: Summary Size
|
label: PLUGIN_ADMIN.SUMMARY_SIZE
|
||||||
|
help: PLUGIN_ADMIN.SUMMARY_SIZE_HELP
|
||||||
validate:
|
validate:
|
||||||
type: int
|
type: int
|
||||||
min: 0
|
min: 0
|
||||||
max: 65536
|
max: 65536
|
||||||
|
|
||||||
|
summary.format:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.FORMAT
|
||||||
|
classes: fancy
|
||||||
|
help: PLUGIN_ADMIN.FORMAT_HELP
|
||||||
|
highlight: short
|
||||||
|
options:
|
||||||
|
'short': PLUGIN_ADMIN.SHORT
|
||||||
|
'long': PLUGIN_ADMIN.LONG
|
||||||
|
|
||||||
|
summary.delimiter:
|
||||||
|
type: text
|
||||||
|
size: x-small
|
||||||
|
label: PLUGIN_ADMIN.DELIMITER
|
||||||
|
help: PLUGIN_ADMIN.DELIMITER_HELP
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.METADATA
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
fields:
|
||||||
|
metadata:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.METADATA
|
||||||
|
help: PLUGIN_ADMIN.METADATA_HELP
|
||||||
|
placeholder_key: PLUGIN_ADMIN.METADATA_KEY
|
||||||
|
placeholder_value: PLUGIN_ADMIN.METADATA_VALUE
|
||||||
|
|
||||||
routes:
|
routes:
|
||||||
type: section
|
type: section
|
||||||
title: Routes
|
title: PLUGIN_ADMIN.REDIRECTS_AND_ROUTES
|
||||||
|
underline: true
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
redirects:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.CUSTOM_REDIRECTS
|
||||||
|
help: PLUGIN_ADMIN.CUSTOM_REDIRECTS_HELP
|
||||||
|
placeholder_key: PLUGIN_ADMIN.CUSTOM_REDIRECTS_PLACEHOLDER_KEY
|
||||||
|
placeholder_value: PLUGIN_ADMIN.CUSTOM_REDIRECTS_PLACEHOLDER_VALUE
|
||||||
|
|
||||||
routes:
|
routes:
|
||||||
type: array
|
type: array
|
||||||
label: Custom
|
label: PLUGIN_ADMIN.CUSTOM_ROUTES
|
||||||
placeholder_key: /your/alias
|
help: PLUGIN_ADMIN.CUSTOM_ROUTES_HELP
|
||||||
placeholder_value: /your/route
|
placeholder_key: PLUGIN_ADMIN.CUSTOM_ROUTES_PLACEHOLDER_KEY
|
||||||
|
placeholder_value: PLUGIN_ADMIN.CUSTOM_ROUTES_PLACEHOLDER_VALUE
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
title: File Streams
|
title: PLUGIN_ADMIN.FILE_STREAMS
|
||||||
|
|
||||||
form:
|
form:
|
||||||
validation: loose
|
validation: loose
|
||||||
|
hidden: true
|
||||||
fields:
|
fields:
|
||||||
schemes.xxx:
|
schemes.xxx:
|
||||||
type: array
|
type: array
|
||||||
|
|||||||
7
system/blueprints/media/meta.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
|
||||||
|
alt_text:
|
||||||
|
type: string
|
||||||
|
label: Alt Text
|
||||||
8
system/blueprints/media/move.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
route:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.PAGE
|
||||||
|
classes: fancy
|
||||||
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
8
system/blueprints/media/rename.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
new_file_name:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN_PRO.NEW_FILE_NAME
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
290
system/blueprints/pages/default.yaml
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
title: PLUGIN_ADMIN.DEFAULT
|
||||||
|
|
||||||
|
rules:
|
||||||
|
slug:
|
||||||
|
pattern: "[a-z][a-z0-9_\-]+"
|
||||||
|
min: 2
|
||||||
|
max: 80
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
|
||||||
|
fields:
|
||||||
|
|
||||||
|
tabs:
|
||||||
|
type: tabs
|
||||||
|
active: 1
|
||||||
|
|
||||||
|
fields:
|
||||||
|
content:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.CONTENT
|
||||||
|
|
||||||
|
fields:
|
||||||
|
header.title:
|
||||||
|
type: text
|
||||||
|
autofocus: true
|
||||||
|
style: vertical
|
||||||
|
label: PLUGIN_ADMIN.TITLE
|
||||||
|
|
||||||
|
content:
|
||||||
|
type: markdown
|
||||||
|
validate:
|
||||||
|
type: textarea
|
||||||
|
|
||||||
|
uploads:
|
||||||
|
type: pagemedia
|
||||||
|
label: PLUGIN_ADMIN.PAGE_MEDIA
|
||||||
|
|
||||||
|
options:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.OPTIONS
|
||||||
|
|
||||||
|
fields:
|
||||||
|
|
||||||
|
publishing:
|
||||||
|
type: section
|
||||||
|
title: Publishing
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
fields:
|
||||||
|
header.published:
|
||||||
|
type: toggle
|
||||||
|
toggleable: true
|
||||||
|
label: PLUGIN_ADMIN.PUBLISHED
|
||||||
|
help: PLUGIN_ADMIN.PUBLISHED_HELP
|
||||||
|
highlight: 1
|
||||||
|
size: medium
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
header.date:
|
||||||
|
type: datetime
|
||||||
|
label: PLUGIN_ADMIN.DATE
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.DATE_HELP
|
||||||
|
|
||||||
|
header.publish_date:
|
||||||
|
type: datetime
|
||||||
|
label: PLUGIN_ADMIN.PUBLISHED_DATE
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.PUBLISHED_DATE_HELP
|
||||||
|
|
||||||
|
header.unpublish_date:
|
||||||
|
type: datetime
|
||||||
|
label: PLUGIN_ADMIN.UNPUBLISHED_DATE
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.UNPUBLISHED_DATE_HELP
|
||||||
|
|
||||||
|
header.metadata:
|
||||||
|
toggleable: true
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.METADATA
|
||||||
|
help: PLUGIN_ADMIN.METADATA_HELP
|
||||||
|
placeholder_key: PLUGIN_ADMIN.METADATA_KEY
|
||||||
|
placeholder_value: PLUGIN_ADMIN.METADATA_VALUE
|
||||||
|
|
||||||
|
taxonomies:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.TAXONOMIES
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
fields:
|
||||||
|
header.taxonomy:
|
||||||
|
type: taxonomy
|
||||||
|
label: PLUGIN_ADMIN.TAXONOMY
|
||||||
|
multiple: true
|
||||||
|
validate:
|
||||||
|
type: array
|
||||||
|
|
||||||
|
advanced:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.ADVANCED
|
||||||
|
|
||||||
|
fields:
|
||||||
|
columns:
|
||||||
|
type: columns
|
||||||
|
fields:
|
||||||
|
column1:
|
||||||
|
type: column
|
||||||
|
fields:
|
||||||
|
|
||||||
|
settings:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.SETTINGS
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
ordering:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX
|
||||||
|
help: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX_HELP
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.ENABLED
|
||||||
|
0: PLUGIN_ADMIN.DISABLED
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
folder:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.FOLDER_NAME
|
||||||
|
validate:
|
||||||
|
type: slug
|
||||||
|
|
||||||
|
route:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.PARENT
|
||||||
|
classes: fancy
|
||||||
|
'@data-options': '\Grav\Common\Page\Pages::parentsRawRoutes'
|
||||||
|
'@data-default': '\Grav\Plugin\admin::route'
|
||||||
|
options:
|
||||||
|
'/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT
|
||||||
|
|
||||||
|
name:
|
||||||
|
type: select
|
||||||
|
classes: fancy
|
||||||
|
label: PLUGIN_ADMIN.PAGE_FILE
|
||||||
|
help: PLUGIN_ADMIN.PAGE_FILE_HELP
|
||||||
|
default: default
|
||||||
|
'@data-options': '\Grav\Common\Page\Pages::pageTypes'
|
||||||
|
|
||||||
|
header.body_classes:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.BODY_CLASSES
|
||||||
|
|
||||||
|
|
||||||
|
column2:
|
||||||
|
type: column
|
||||||
|
|
||||||
|
fields:
|
||||||
|
order_title:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.ORDERING
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
order:
|
||||||
|
type: order
|
||||||
|
label: PLUGIN_ADMIN.PAGE_ORDER
|
||||||
|
sitemap:
|
||||||
|
|
||||||
|
overrides:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.OVERRIDES
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
fields:
|
||||||
|
|
||||||
|
header.dateformat:
|
||||||
|
toggleable: true
|
||||||
|
type: select
|
||||||
|
size: medium
|
||||||
|
selectize:
|
||||||
|
create: true
|
||||||
|
label: PLUGIN_ADMIN.DEFAULT_DATE_FORMAT
|
||||||
|
help: PLUGIN_ADMIN.DEFAULT_DATE_FORMAT_HELP
|
||||||
|
placeholder: PLUGIN_ADMIN.DEFAULT_DATE_FORMAT_PLACEHOLDER
|
||||||
|
'@data-options': '\Grav\Common\Utils::dateFormats'
|
||||||
|
validate:
|
||||||
|
type: string
|
||||||
|
|
||||||
|
header.menu:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.MENU
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.MENU_HELP
|
||||||
|
|
||||||
|
header.slug:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.SLUG
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.SLUG_HELP
|
||||||
|
validate:
|
||||||
|
message: PLUGIN_ADMIN.SLUG_VALIDATE_MESSAGE
|
||||||
|
rule: slug
|
||||||
|
|
||||||
|
header.redirect:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.REDIRECT
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.REDIRECT_HELP
|
||||||
|
|
||||||
|
header.process:
|
||||||
|
type: checkboxes
|
||||||
|
label: PLUGIN_ADMIN.PROCESS
|
||||||
|
toggleable: true
|
||||||
|
'@config-default': system.pages.process
|
||||||
|
default:
|
||||||
|
markdown: true
|
||||||
|
twig: false
|
||||||
|
options:
|
||||||
|
markdown: Markdown
|
||||||
|
twig: Twig
|
||||||
|
use: keys
|
||||||
|
|
||||||
|
header.child_type:
|
||||||
|
type: select
|
||||||
|
toggleable: true
|
||||||
|
label: PLUGIN_ADMIN.DEFAULT_CHILD_TYPE
|
||||||
|
default: default
|
||||||
|
placeholder: PLUGIN_ADMIN.USE_GLOBAL
|
||||||
|
'@data-options': '\Grav\Common\Page\Pages::types'
|
||||||
|
|
||||||
|
header.routable:
|
||||||
|
type: toggle
|
||||||
|
toggleable: true
|
||||||
|
label: PLUGIN_ADMIN.ROUTABLE
|
||||||
|
help: PLUGIN_ADMIN.ROUTABLE_HELP
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.ENABLED
|
||||||
|
0: PLUGIN_ADMIN.DISABLED
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
header.cache_enable:
|
||||||
|
type: toggle
|
||||||
|
toggleable: true
|
||||||
|
label: PLUGIN_ADMIN.CACHING
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.ENABLED
|
||||||
|
0: PLUGIN_ADMIN.DISABLED
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
header.visible:
|
||||||
|
type: toggle
|
||||||
|
toggleable: true
|
||||||
|
label: PLUGIN_ADMIN.VISIBLE
|
||||||
|
help: PLUGIN_ADMIN.VISIBLE_HELP
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.ENABLED
|
||||||
|
0: PLUGIN_ADMIN.DISABLED
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
header.template:
|
||||||
|
type: text
|
||||||
|
toggleable: true
|
||||||
|
label: PLUGIN_ADMIN.DISPLAY_TEMPLATE
|
||||||
|
|
||||||
|
header.append_url_extension:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.APPEND_URL_EXT
|
||||||
|
toggleable: true
|
||||||
|
help: PLUGIN_ADMIN.APPEND_URL_EXT_HELP
|
||||||
|
|
||||||
|
header.order_by:
|
||||||
|
type: hidden
|
||||||
|
|
||||||
|
header.order_manual:
|
||||||
|
type: hidden
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
|
blueprint:
|
||||||
|
type: blueprint
|
||||||
47
system/blueprints/pages/modular.yaml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
title: PLUGIN_ADMIN.MODULAR
|
||||||
|
@extends:
|
||||||
|
type: default
|
||||||
|
context: blueprints://pages
|
||||||
|
|
||||||
|
form:
|
||||||
|
fields:
|
||||||
|
tabs:
|
||||||
|
type: tabs
|
||||||
|
active: 1
|
||||||
|
|
||||||
|
fields:
|
||||||
|
content:
|
||||||
|
fields:
|
||||||
|
|
||||||
|
header.content.items:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.ITEMS
|
||||||
|
default: '@self.modular'
|
||||||
|
options:
|
||||||
|
'@self.modular': Children
|
||||||
|
|
||||||
|
header.content.order.by:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.ORDER_BY
|
||||||
|
default: date
|
||||||
|
options:
|
||||||
|
folder: PLUGIN_ADMIN.FOLDER
|
||||||
|
title: PLUGIN_ADMIN.TITLE
|
||||||
|
date: PLUGIN_ADMIN.DATE
|
||||||
|
default: PLUGIN_ADMIN.DEFAULT
|
||||||
|
|
||||||
|
header.content.order.dir:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.ORDER
|
||||||
|
default: desc
|
||||||
|
options:
|
||||||
|
asc: PLUGIN_ADMIN.ASCENDING
|
||||||
|
desc: PLUGIN_ADMIN.DESCENDING
|
||||||
|
|
||||||
|
header.process:
|
||||||
|
type: ignore
|
||||||
|
content:
|
||||||
|
type: ignore
|
||||||
|
uploads:
|
||||||
|
type: ignore
|
||||||
|
|
||||||
@@ -10,40 +10,39 @@ form:
|
|||||||
|
|
||||||
section:
|
section:
|
||||||
type: section
|
type: section
|
||||||
title: Add Modular Content
|
title: PLUGIN_ADMIN.ADD_MODULAR_CONTENT
|
||||||
|
|
||||||
title:
|
title:
|
||||||
type: text
|
type: text
|
||||||
label: Page Title
|
label: PLUGIN_ADMIN.PAGE_TITLE
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
folder:
|
folder:
|
||||||
type: text
|
type: text
|
||||||
label: Folder Name
|
label: PLUGIN_ADMIN.FOLDER_NAME
|
||||||
validate:
|
validate:
|
||||||
type: slug
|
type: slug
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
route:
|
route:
|
||||||
type: select
|
type: select
|
||||||
label: Page
|
label: PLUGIN_ADMIN.PAGE
|
||||||
classes: fancy
|
classes: fancy
|
||||||
@data-options: '\Grav\Common\Page\Pages::parents'
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
@data-default: '\Grav\Plugin\admin::route'
|
'@data-default': '\Grav\Plugin\admin::route'
|
||||||
options:
|
options:
|
||||||
'': '- Select -'
|
'': PLUGIN_ADMIN.DEFAULT_OPTION_SELECT
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
type:
|
name:
|
||||||
type: select
|
type: select
|
||||||
classes: fancy
|
classes: fancy
|
||||||
label: Modular Template
|
label: PLUGIN_ADMIN.MODULAR_TEMPLATE
|
||||||
|
help: PLUGIN_ADMIN.PAGE_FILE_HELP
|
||||||
default: default
|
default: default
|
||||||
@data-options: '\Grav\Common\Page\Pages::modularTypes'
|
'@data-options': '\Grav\Common\Page\Pages::modularTypes'
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@@ -52,3 +51,6 @@ form:
|
|||||||
default: 1
|
default: 1
|
||||||
validate:
|
validate:
|
||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
|
blueprint:
|
||||||
|
type: blueprint
|
||||||
|
|||||||
@@ -15,26 +15,35 @@ form:
|
|||||||
fields:
|
fields:
|
||||||
content:
|
content:
|
||||||
type: tab
|
type: tab
|
||||||
title: Content
|
title: PLUGIN_ADMIN.CONTENT
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
frontmatter:
|
frontmatter:
|
||||||
type: frontmatter
|
classes: frontmatter
|
||||||
label: Frontmatter
|
type: editor
|
||||||
|
label: PLUGIN_ADMIN.FRONTMATTER
|
||||||
|
autofocus: true
|
||||||
|
codemirror:
|
||||||
|
mode: 'yaml'
|
||||||
|
indentUnit: 4
|
||||||
|
autofocus: true
|
||||||
|
indentWithTabs: false
|
||||||
|
lineNumbers: true
|
||||||
|
styleActiveLine: true
|
||||||
|
gutters: ['CodeMirror-lint-markers']
|
||||||
|
lint: true
|
||||||
|
|
||||||
content:
|
content:
|
||||||
type: markdown
|
type: markdown
|
||||||
label: Content
|
|
||||||
|
|
||||||
uploads:
|
uploads:
|
||||||
type: uploads
|
type: pagemedia
|
||||||
label: Page Media
|
label: PLUGIN_ADMIN.PAGE_MEDIA
|
||||||
|
|
||||||
|
|
||||||
options:
|
options:
|
||||||
type: tab
|
type: tab
|
||||||
title: Options
|
title: PLUGIN_ADMIN.OPTIONS
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
@@ -47,30 +56,41 @@ form:
|
|||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
|
ordering:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX
|
||||||
|
help: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX_HELP
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.ENABLED
|
||||||
|
0: PLUGIN_ADMIN.DISABLED
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
folder:
|
folder:
|
||||||
type: text
|
type: text
|
||||||
label: Filename
|
label: PLUGIN_ADMIN.FILENAME
|
||||||
validate:
|
validate:
|
||||||
type: slug
|
type: slug
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
route:
|
route:
|
||||||
type: select
|
type: select
|
||||||
label: Parent
|
label: PLUGIN_ADMIN.PARENT
|
||||||
classes: fancy
|
classes: fancy
|
||||||
@data-options: '\Grav\Common\Page\Pages::parents'
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
@data-default: '\Grav\Plugin\admin::route'
|
'@data-default': '\Grav\Plugin\admin::route'
|
||||||
options:
|
options:
|
||||||
'': '- Select -'
|
'': PLUGIN_ADMIN.DEFAULT_OPTION_SELECT
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
type:
|
name:
|
||||||
type: select
|
type: select
|
||||||
classes: fancy
|
classes: fancy
|
||||||
label: Modular Template
|
label: PLUGIN_ADMIN.MODULAR_TEMPLATE
|
||||||
default: default
|
default: default
|
||||||
@data-options: '\Grav\Common\Page\Pages::modularTypes'
|
'@data-options': '\Grav\Common\Page\Pages::modularTypes'
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@@ -80,5 +100,7 @@ form:
|
|||||||
fields:
|
fields:
|
||||||
order:
|
order:
|
||||||
type: order
|
type: order
|
||||||
label: Ordering
|
label: PLUGIN_ADMIN.ORDERING
|
||||||
|
|
||||||
|
blueprint:
|
||||||
|
type: blueprint
|
||||||
|
|||||||
17
system/blueprints/pages/move.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
rules:
|
||||||
|
slug:
|
||||||
|
pattern: "[a-z][a-z0-9_\-]+"
|
||||||
|
min: 2
|
||||||
|
max: 80
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
route:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.PARENT
|
||||||
|
classes: fancy
|
||||||
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
|
'@data-default': '\Grav\Plugin\admin::route'
|
||||||
|
options:
|
||||||
|
'/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT
|
||||||
@@ -10,39 +10,57 @@ form:
|
|||||||
|
|
||||||
section:
|
section:
|
||||||
type: section
|
type: section
|
||||||
title: Add Page
|
title: PLUGIN_ADMIN.ADD_PAGE
|
||||||
|
|
||||||
title:
|
title:
|
||||||
type: text
|
type: text
|
||||||
label: Page Title
|
label: PLUGIN_ADMIN.PAGE_TITLE
|
||||||
|
help: PLUGIN_ADMIN.PAGE_TITLE_HELP
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
folder:
|
folder:
|
||||||
type: text
|
type: text
|
||||||
label: Folder Name
|
label: PLUGIN_ADMIN.FOLDER_NAME
|
||||||
|
help: PLUGIN_ADMIN.FOLDER_NAME_HELP
|
||||||
validate:
|
validate:
|
||||||
type: slug
|
type: slug
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
route:
|
route:
|
||||||
type: select
|
type: select
|
||||||
label: Parent Page
|
label: PLUGIN_ADMIN.PARENT_PAGE
|
||||||
classes: fancy
|
classes: fancy
|
||||||
@data-options: '\Grav\Common\Page\Pages::parents'
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
@data-default: '\Grav\Plugin\admin::route'
|
'@data-default': '\Grav\Plugin\admin::getLastPageRoute'
|
||||||
options:
|
options:
|
||||||
'/': '- Root -'
|
'/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
type:
|
name:
|
||||||
type: select
|
type: select
|
||||||
classes: fancy
|
classes: fancy
|
||||||
label: Display Template
|
label: PLUGIN_ADMIN.PAGE_FILE
|
||||||
default: default
|
help: PLUGIN_ADMIN.PAGE_FILE_HELP
|
||||||
@data-options: '\Grav\Common\Page\Pages::types'
|
'@data-options': '\Grav\Common\Page\Pages::types'
|
||||||
|
'@data-default': '\Grav\Plugin\admin::getLastPageName'
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
visible:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.VISIBLE
|
||||||
|
help: PLUGIN_ADMIN.VISIBLE_HELP
|
||||||
|
highlight: ''
|
||||||
|
default: ''
|
||||||
|
options:
|
||||||
|
'': Auto
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
required: true
|
||||||
|
|
||||||
|
blueprint:
|
||||||
|
type: blueprint
|
||||||
|
|||||||
35
system/blueprints/pages/new_folder.yaml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
rules:
|
||||||
|
slug:
|
||||||
|
pattern: "[a-z][a-z0-9_\-]+"
|
||||||
|
min: 2
|
||||||
|
max: 80
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
|
||||||
|
section:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.ADD_FOLDER
|
||||||
|
|
||||||
|
folder:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.FOLDER_NAME
|
||||||
|
help: PLUGIN_ADMIN.FOLDER_NAME_HELP
|
||||||
|
validate:
|
||||||
|
type: slug
|
||||||
|
required: true
|
||||||
|
|
||||||
|
route:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.PARENT_PAGE
|
||||||
|
classes: fancy
|
||||||
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
|
'@data-default': '\Grav\Plugin\admin::getLastPageRoute'
|
||||||
|
options:
|
||||||
|
'/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
blueprint:
|
||||||
|
type: blueprint
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
rules:
|
|
||||||
slug:
|
|
||||||
pattern: "[a-z][a-z0-9_\-]+"
|
|
||||||
min: 2
|
|
||||||
max: 80
|
|
||||||
|
|
||||||
form:
|
|
||||||
validation: loose
|
|
||||||
fields:
|
|
||||||
|
|
||||||
title:
|
|
||||||
type: text
|
|
||||||
label: Title
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
folder:
|
|
||||||
type: text
|
|
||||||
label: Folder
|
|
||||||
validate:
|
|
||||||
type: slug
|
|
||||||
required: true
|
|
||||||
|
|
||||||
route:
|
|
||||||
type: select
|
|
||||||
label: Parent
|
|
||||||
classes: fancy
|
|
||||||
@data-options: '\Grav\Common\Page\Pages::parents'
|
|
||||||
@data-default: '\Grav\Plugin\admin::route'
|
|
||||||
options:
|
|
||||||
'/': '- Root -'
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
type:
|
|
||||||
type: select
|
|
||||||
classes: fancy
|
|
||||||
label: Display Template
|
|
||||||
default: default
|
|
||||||
@data-options: '\Grav\Common\Page\Pages::types'
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
@@ -15,26 +15,34 @@ form:
|
|||||||
fields:
|
fields:
|
||||||
content:
|
content:
|
||||||
type: tab
|
type: tab
|
||||||
title: Content
|
title: PLUGIN_ADMIN.CONTENT
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
frontmatter:
|
frontmatter:
|
||||||
type: frontmatter
|
classes: frontmatter
|
||||||
label: Frontmatter
|
type: editor
|
||||||
|
label: PLUGIN_ADMIN.FRONTMATTER
|
||||||
|
autofocus: true
|
||||||
|
codemirror:
|
||||||
|
mode: 'yaml'
|
||||||
|
indentUnit: 4
|
||||||
|
autofocus: true
|
||||||
|
indentWithTabs: false
|
||||||
|
lineNumbers: true
|
||||||
|
styleActiveLine: true
|
||||||
|
gutters: ['CodeMirror-lint-markers']
|
||||||
|
lint: true
|
||||||
|
|
||||||
content:
|
content:
|
||||||
type: markdown
|
type: markdown
|
||||||
label: Content
|
|
||||||
|
|
||||||
uploads:
|
uploads:
|
||||||
type: uploads
|
type: pagemedia
|
||||||
label: Page Media
|
label: PLUGIN_ADMIN.PAGE_MEDIA
|
||||||
|
|
||||||
|
|
||||||
options:
|
options:
|
||||||
type: tab
|
type: tab
|
||||||
title: Options
|
title: PLUGIN_ADMIN.OPTIONS
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
@@ -47,30 +55,41 @@ form:
|
|||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
|
ordering:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX
|
||||||
|
help: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX_HELP
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.ENABLED
|
||||||
|
0: PLUGIN_ADMIN.DISABLED
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
folder:
|
folder:
|
||||||
type: text
|
type: text
|
||||||
label: Folder Name
|
label: PLUGIN_ADMIN.FOLDER_NAME
|
||||||
|
help: PLUGIN_ADMIN.FOLDER_NAME_HELP
|
||||||
validate:
|
validate:
|
||||||
type: slug
|
type: slug
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
route:
|
route:
|
||||||
type: select
|
type: select
|
||||||
label: Parent
|
label: PLUGIN_ADMIN.PARENT
|
||||||
classes: fancy
|
classes: fancy
|
||||||
@data-options: '\Grav\Common\Page\Pages::parents'
|
'@data-options': '\Grav\Common\Page\Pages::parents'
|
||||||
@data-default: '\Grav\Plugin\admin::route'
|
'@data-default': '\Grav\Plugin\admin::route'
|
||||||
options:
|
options:
|
||||||
'/': '- Root -'
|
'/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
type:
|
name:
|
||||||
type: select
|
type: select
|
||||||
classes: fancy
|
classes: fancy
|
||||||
label: Display Template
|
label: PLUGIN_ADMIN.DISPLAY_TEMPLATE
|
||||||
|
help: PLUGIN_ADMIN.DISPLAY_TEMPLATE_HELP
|
||||||
default: default
|
default: default
|
||||||
@data-options: '\Grav\Common\Page\Pages::types'
|
'@data-options': '\Grav\Common\Page\Pages::types'
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@@ -80,5 +99,7 @@ form:
|
|||||||
fields:
|
fields:
|
||||||
order:
|
order:
|
||||||
type: order
|
type: order
|
||||||
label: Ordering
|
label: PLUGIN_ADMIN.ORDERING
|
||||||
|
|
||||||
|
blueprint:
|
||||||
|
type: blueprint
|
||||||
|
|||||||
@@ -1,41 +1,92 @@
|
|||||||
title: Site
|
title: Site
|
||||||
form:
|
form:
|
||||||
validation: loose
|
validation: loose
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
content:
|
info:
|
||||||
type: section
|
type: userinfo
|
||||||
title: Account
|
size: large
|
||||||
|
|
||||||
fields:
|
content:
|
||||||
username:
|
type: section
|
||||||
type: text
|
title: PLUGIN_ADMIN.ACCOUNT
|
||||||
size: large
|
underline: true
|
||||||
label: Username
|
|
||||||
readonly: true
|
|
||||||
|
|
||||||
email:
|
|
||||||
type: text
|
|
||||||
size: large
|
|
||||||
label: Email
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
password:
|
username:
|
||||||
type: password
|
type: text
|
||||||
size: large
|
size: large
|
||||||
label: Password
|
label: PLUGIN_ADMIN.USERNAME
|
||||||
validate:
|
disabled: true
|
||||||
required: true
|
readonly: true
|
||||||
|
|
||||||
fullname:
|
email:
|
||||||
type: text
|
type: email
|
||||||
size: large
|
size: large
|
||||||
label: Full name
|
label: PLUGIN_ADMIN.EMAIL
|
||||||
validate:
|
validate:
|
||||||
required: true
|
type: email
|
||||||
|
message: PLUGIN_ADMIN.EMAIL_VALIDATION_MESSAGE
|
||||||
|
required: true
|
||||||
|
|
||||||
title:
|
password:
|
||||||
type: text
|
type: password
|
||||||
size: large
|
size: large
|
||||||
label: Title
|
label: PLUGIN_ADMIN.PASSWORD
|
||||||
|
validate:
|
||||||
|
required: false
|
||||||
|
message: PLUGIN_ADMIN.PASSWORD_VALIDATION_MESSAGE
|
||||||
|
pattern: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
|
||||||
|
|
||||||
|
fullname:
|
||||||
|
type: text
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.FULL_NAME
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
title:
|
||||||
|
type: text
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.TITLE
|
||||||
|
|
||||||
|
language:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.LANGUAGE
|
||||||
|
size: medium
|
||||||
|
classes: fancy
|
||||||
|
'@data-options': '\Grav\Plugin\admin::adminLanguages'
|
||||||
|
default: 'en'
|
||||||
|
help: PLUGIN_ADMIN.LANGUAGE_HELP
|
||||||
|
|
||||||
|
security:
|
||||||
|
title: PLUGIN_ADMIN.ACCESS_LEVELS
|
||||||
|
type: section
|
||||||
|
security: admin.super
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
fields:
|
||||||
|
groups:
|
||||||
|
type: selectize
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.GROUPS
|
||||||
|
'@data-options': '\Grav\User\Groups::groups'
|
||||||
|
classes: fancy
|
||||||
|
help: PLUGIN_ADMIN.GROUPS_HELP
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
|
access.admin:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.ADMIN_ACCESS
|
||||||
|
multiple: false
|
||||||
|
validate:
|
||||||
|
type: array
|
||||||
|
|
||||||
|
access.site:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.SITE_ACCESS
|
||||||
|
multiple: false
|
||||||
|
validate:
|
||||||
|
type: array
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
title: Add Account
|
title: PLUGIN_ADMIN.ADD_ACCOUNT
|
||||||
|
|
||||||
form:
|
form:
|
||||||
validation: loose
|
validation: loose
|
||||||
@@ -6,10 +6,11 @@ form:
|
|||||||
|
|
||||||
content:
|
content:
|
||||||
type: section
|
type: section
|
||||||
title: Add Account
|
title: PLUGIN_ADMIN.ADD_ACCOUNT
|
||||||
|
|
||||||
username:
|
username:
|
||||||
type: text
|
type: text
|
||||||
label: Username
|
label: PLUGIN_ADMIN.USERNAME
|
||||||
|
help: PLUGIN_ADMIN.USERNAME_HELP
|
||||||
validate:
|
validate:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
44
system/blueprints/user/group.yaml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
title: Group
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
|
||||||
|
fields:
|
||||||
|
spacer:
|
||||||
|
type: spacer
|
||||||
|
text: '<br>'
|
||||||
|
|
||||||
|
groupname:
|
||||||
|
type: text
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.NAME
|
||||||
|
disabled: true
|
||||||
|
readonly: true
|
||||||
|
|
||||||
|
readableName:
|
||||||
|
type: text
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN_PRO.READABLE_NAME
|
||||||
|
|
||||||
|
description:
|
||||||
|
type: text
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.DESCRIPTION
|
||||||
|
|
||||||
|
icon:
|
||||||
|
type: text
|
||||||
|
size: small
|
||||||
|
label: PLUGIN_ADMIN_PRO.ICON
|
||||||
|
|
||||||
|
access.admin:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.ADMIN_ACCESS
|
||||||
|
multiple: false
|
||||||
|
validate:
|
||||||
|
type: array
|
||||||
|
|
||||||
|
access.site:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.SITE_ACCESS
|
||||||
|
multiple: false
|
||||||
|
validate:
|
||||||
|
type: array
|
||||||
16
system/blueprints/user/group_new.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
title: PLUGIN_ADMIN_PRO.ADD_GROUP
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
|
||||||
|
content:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN_PRO.ADD_GROUP
|
||||||
|
|
||||||
|
groupname:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN_PRO.GROUP_NAME
|
||||||
|
help: PLUGIN_ADMIN_PRO.GROUP_NAME_HELP
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
@@ -11,6 +11,10 @@ jpg:
|
|||||||
type: image
|
type: image
|
||||||
thumb: media/thumb-jpg.png
|
thumb: media/thumb-jpg.png
|
||||||
mime: image/jpeg
|
mime: image/jpeg
|
||||||
|
jpe:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb-jpg.png
|
||||||
|
mime: image/jpeg
|
||||||
jpeg:
|
jpeg:
|
||||||
type: image
|
type: image
|
||||||
thumb: media/thumb-jpeg.png
|
thumb: media/thumb-jpeg.png
|
||||||
@@ -26,7 +30,7 @@ gif:
|
|||||||
|
|
||||||
svg:
|
svg:
|
||||||
type: vector
|
type: vector
|
||||||
thumb: media/thumb-gif.png
|
thumb: media/thumb.png
|
||||||
mime: image/svg+xml
|
mime: image/svg+xml
|
||||||
|
|
||||||
mp4:
|
mp4:
|
||||||
@@ -49,6 +53,14 @@ flv:
|
|||||||
type: video
|
type: video
|
||||||
thumb: media/thumb-flv.png
|
thumb: media/thumb-flv.png
|
||||||
mime: video/x-flv
|
mime: video/x-flv
|
||||||
|
webm:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb.png
|
||||||
|
mime: video/webm
|
||||||
|
ogv:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-ogg.png
|
||||||
|
mime: video/ogg
|
||||||
|
|
||||||
mp3:
|
mp3:
|
||||||
type: audio
|
type: audio
|
||||||
@@ -70,19 +82,92 @@ wav:
|
|||||||
type: audio
|
type: audio
|
||||||
thumb: media/thumb-wav.png
|
thumb: media/thumb-wav.png
|
||||||
mime: audio/wav
|
mime: audio/wav
|
||||||
|
aiff:
|
||||||
|
type: audio
|
||||||
|
mime: audio/aiff
|
||||||
|
aif:
|
||||||
|
type: audio
|
||||||
|
mime: audio/aif
|
||||||
|
|
||||||
txt:
|
txt:
|
||||||
type: file
|
type: file
|
||||||
thumb: media/thumb-txt.png
|
thumb: media/thumb-txt.png
|
||||||
mime: text/plain
|
mime: text/plain
|
||||||
|
xml:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-xml.png
|
||||||
|
mime: application/xml
|
||||||
doc:
|
doc:
|
||||||
type: file
|
type: file
|
||||||
thumb: media/thumb-doc.png
|
thumb: media/thumb-doc.png
|
||||||
mime: application/msword
|
mime: application/msword
|
||||||
|
docx:
|
||||||
|
type: file
|
||||||
|
mime: application/msword
|
||||||
|
xls:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xlt:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xlm:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xld:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xla:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xlc:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xlw:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xll:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
ppt:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-powerpoint
|
||||||
|
pps:
|
||||||
|
type: file
|
||||||
|
mime: application/vnd.ms-powerpoint
|
||||||
|
rtf:
|
||||||
|
type: file
|
||||||
|
mime: application/rtf
|
||||||
|
|
||||||
|
bmp:
|
||||||
|
type: file
|
||||||
|
mime: image/bmp
|
||||||
|
tiff:
|
||||||
|
type: file
|
||||||
|
mime: image/tiff
|
||||||
|
mpeg:
|
||||||
|
type: file
|
||||||
|
mime: video/mpeg
|
||||||
|
mpg:
|
||||||
|
type: file
|
||||||
|
mime: video/mpeg
|
||||||
|
mpe:
|
||||||
|
type: file
|
||||||
|
mime: video/mpeg
|
||||||
|
avi:
|
||||||
|
type: file
|
||||||
|
mime: video/msvideo
|
||||||
|
wmv:
|
||||||
|
type: file
|
||||||
|
mime: video/x-ms-wmv
|
||||||
|
|
||||||
html:
|
html:
|
||||||
type: file
|
type: file
|
||||||
thumb: media/thumb-html.png
|
thumb: media/thumb-html.png
|
||||||
mime: text/html
|
mime: text/html
|
||||||
|
htm:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-html.png
|
||||||
|
mime: text/html
|
||||||
pdf:
|
pdf:
|
||||||
type: file
|
type: file
|
||||||
thumb: media/thumb-pdf.png
|
thumb: media/thumb-pdf.png
|
||||||
@@ -91,7 +176,27 @@ zip:
|
|||||||
type: file
|
type: file
|
||||||
thumb: media/thumb-zip.png
|
thumb: media/thumb-zip.png
|
||||||
mime: application/zip
|
mime: application/zip
|
||||||
|
7z:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-7zip.png
|
||||||
|
mime: application/x-7z-compressed
|
||||||
gz:
|
gz:
|
||||||
type: file
|
type: file
|
||||||
thumb: media/thumb-gz.png
|
thumb: media/thumb-gz.png
|
||||||
mime: application/gzip
|
mime: application/gzip
|
||||||
|
tar:
|
||||||
|
type: file
|
||||||
|
mime: application/x-tar
|
||||||
|
css:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-css.png
|
||||||
|
mime: text/css
|
||||||
|
js:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-js.png
|
||||||
|
mime: application/javascript
|
||||||
|
json:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-json.png
|
||||||
|
mime: application/json
|
||||||
|
|
||||||
|
|||||||
@@ -6,22 +6,25 @@ author:
|
|||||||
|
|
||||||
taxonomies: [category,tag] # Arbitrary list of taxonomy types
|
taxonomies: [category,tag] # Arbitrary list of taxonomy types
|
||||||
|
|
||||||
blog:
|
|
||||||
route: '/blog' # Route to blog (deprecated)
|
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
description: 'My Grav Site' # Site description
|
description: 'My Grav Site' # Site description
|
||||||
|
|
||||||
summary:
|
summary:
|
||||||
enabled: true # enable or disable summary of page
|
enabled: true # enable or disable summary of page
|
||||||
format: short # long = summary delimiter will be ignored; short = use the first occurence of delimter or size
|
format: short # long = summary delimiter will be ignored; short = use the first occurrence of delimiter or size
|
||||||
size: 300 # Maximum length of summary (characters)
|
size: 300 # Maximum length of summary (characters)
|
||||||
delimiter: === # The summary delimiter
|
delimiter: === # The summary delimiter
|
||||||
|
|
||||||
|
redirects:
|
||||||
|
# /redirect-test: / # Redirect test goes to home page
|
||||||
|
# /old/(.*): /new/$1 # Would redirect /old/my-page to /new/my-page
|
||||||
|
|
||||||
routes:
|
routes:
|
||||||
/something/else: '/blog/sample-3' # Alias for /blog/sample-3
|
# /something/else: '/blog/sample-3' # Alias for /blog/sample-3
|
||||||
/another/one/here: '/blog/sample-3' # Another alias for /blog/sample-3
|
# /new/(.*): '/blog/$1' # Regex any /new/my-page URL to /blog/my-page Route
|
||||||
/new/*: '/blog/*' # Wildcard any /new/my-page URL to /blog/my-page Route
|
|
||||||
|
blog:
|
||||||
|
route: '/blog' # Custom value added (accessible via system.blog.route)
|
||||||
|
|
||||||
#menu: # Sample Menu Example
|
#menu: # Sample Menu Example
|
||||||
# - text: Source
|
# - text: Source
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
schemes:
|
schemes:
|
||||||
asset:
|
|
||||||
type: ReadOnlyStream
|
|
||||||
paths:
|
|
||||||
- assets
|
|
||||||
|
|
||||||
image:
|
image:
|
||||||
type: ReadOnlyStream
|
type: ReadOnlyStream
|
||||||
paths:
|
paths:
|
||||||
|
|||||||
@@ -1,84 +1,129 @@
|
|||||||
absolute_urls: false # Absolute or relative URLs for `base_url`
|
absolute_urls: false # Absolute or relative URLs for `base_url`
|
||||||
timezone: '' # Valid values: http://php.net/manual/en/timezones.php
|
timezone: '' # Valid values: http://php.net/manual/en/timezones.php
|
||||||
param_sep: ':' # Parameter separator, use ';' for Apache on windows
|
default_locale: # Default locale (defaults to system)
|
||||||
|
param_sep: ':' # Parameter separator, use ';' for Apache on windows
|
||||||
|
wrapped_site: false # For themes/plugins to know if Grav is wrapped by another platform
|
||||||
|
reverse_proxy_setup: false # Running in a reverse proxy scenario with different webserver ports than proxy
|
||||||
|
|
||||||
|
|
||||||
|
languages:
|
||||||
|
supported: [] # List of languages supported. eg: [en, fr, de]
|
||||||
|
include_default_lang: true # Include the default lang prefix in all URLs
|
||||||
|
translations: true # Enable translations by default
|
||||||
|
translations_fallback: true # Fallback through supported translations if active lang doesn't exist
|
||||||
|
session_store_active: false # Store active language in session
|
||||||
|
http_accept_language: false # Attempt to set the language based on http_accept_language header in the browser
|
||||||
|
override_locale: false # Override the default or system locale with language specific one
|
||||||
|
|
||||||
home:
|
home:
|
||||||
alias: '/home' # Default path for home, ie /
|
alias: '/home' # Default path for home, ie /
|
||||||
|
hide_in_urls: false # Hide the home route in URLs
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
theme: antimatter # Default theme (defaults to "antimatter" theme)
|
theme: antimatter # Default theme (defaults to "antimatter" theme)
|
||||||
order:
|
order:
|
||||||
by: default # Order pages by "default", "alpha" or "date"
|
by: default # Order pages by "default", "alpha" or "date"
|
||||||
dir: asc # Default ordering direction, "asc" or "desc"
|
dir: asc # Default ordering direction, "asc" or "desc"
|
||||||
list:
|
list:
|
||||||
count: 20 # Default item count per page
|
count: 20 # Default item count per page
|
||||||
dateformat:
|
dateformat:
|
||||||
short: 'jS M Y' # Short date format
|
default: # The default date format Grav expects in the `date: ` field
|
||||||
long: 'F jS \a\t g:ia' # Long date format
|
short: 'jS M Y' # Short date format
|
||||||
publish_dates: true # automatically publish/unpublish based on dates
|
long: 'F jS \a\t g:ia' # Long date format
|
||||||
|
publish_dates: true # automatically publish/unpublish based on dates
|
||||||
process:
|
process:
|
||||||
markdown: true # Process Markdown
|
markdown: true # Process Markdown
|
||||||
twig: false # Process Twig
|
twig: false # Process Twig
|
||||||
|
twig_first: false # Process Twig before markdown when processing both on a page
|
||||||
events:
|
events:
|
||||||
page: true # Enable page level events
|
page: true # Enable page level events
|
||||||
twig: true # Enable twig level events
|
twig: true # Enable twig level events
|
||||||
markdown:
|
markdown:
|
||||||
extra: false # Enable support for Markdown Extra support (GFM by default)
|
extra: false # Enable support for Markdown Extra support (GFM by default)
|
||||||
auto_line_breaks: false # Enable automatic line breaks
|
auto_line_breaks: false # Enable automatic line breaks
|
||||||
auto_url_links: false # Enable automatic HTML links
|
auto_url_links: false # Enable automatic HTML links
|
||||||
escape_markup: false # Escape markup tags into entities
|
escape_markup: false # Escape markup tags into entities
|
||||||
special_chars: # List of special characters to automatically convert to entities
|
special_chars: # List of special characters to automatically convert to entities
|
||||||
'>': 'gt'
|
'>': 'gt'
|
||||||
'<': 'lt'
|
'<': 'lt'
|
||||||
types: 'txt|xml|html|json|rss|atom' # Pipe separated list of valid page types
|
types: [txt,xml,html,htm,json,rss,atom] # list of valid page types
|
||||||
expires: 0 # Page expires time in seconds (604800 seconds = 7 days)
|
append_url_extension: '' # Append page's extension in Page urls (e.g. '.html' results in /path/page.html)
|
||||||
|
expires: 604800 # Page expires time in seconds (604800 seconds = 7 days)
|
||||||
|
last_modified: false # Set the last modified date header based on file modifcation timestamp
|
||||||
|
etag: false # 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: 301 # Default code to use for redirects
|
||||||
|
redirect_trailing_slash: true # Handle automatically or 301 redirect a trailing / URL
|
||||||
|
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
|
||||||
|
url_taxonomy_filters: true # Enable auto-magic URL-based taxonomy filters for page collections
|
||||||
|
frontmatter:
|
||||||
|
process_twig: false # Should the frontmatter be processed to replace Twig variables?
|
||||||
|
ignore_fields: ['form'] # Fields that might contain Twig variables and should not be processed
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
enabled: true # Set to true to enable caching
|
enabled: true # Set to true to enable caching
|
||||||
check:
|
check:
|
||||||
method: file # Method to check for updates in pages: file|folder|none
|
method: file # Method to check for updates in pages: file|folder|none
|
||||||
driver: auto # One of: auto|file|apc|xcache|memcache|wincache
|
driver: auto # One of: auto|file|apc|xcache|memcache|wincache
|
||||||
prefix: 'g' # Cache prefix string (prevents cache conflicts)
|
prefix: 'g' # Cache prefix string (prevents cache conflicts)
|
||||||
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
|
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
|
||||||
gzip: false # GZip compress the page output
|
gzip: false # GZip compress the page output
|
||||||
|
|
||||||
|
|
||||||
twig:
|
twig:
|
||||||
cache: true # Set to true to enable twig caching
|
cache: true # Set to true to enable twig caching
|
||||||
debug: false # Enable Twig debug
|
debug: false # Enable Twig debug
|
||||||
auto_reload: true # Refresh cache on changes
|
auto_reload: true # Refresh cache on changes
|
||||||
autoescape: false # Autoescape Twig vars
|
autoescape: false # Autoescape Twig vars
|
||||||
undefined_functions: true # Allow undefined functions
|
undefined_functions: true # Allow undefined functions
|
||||||
undefined_filters: true # Allow undefined filters
|
undefined_filters: true # Allow undefined filters
|
||||||
|
umask_fix: false # By default Twig creates cached files as 755, fix switches this to 775
|
||||||
|
|
||||||
assets: # Configuration for Assets Manager (JS, CSS)
|
assets: # Configuration for Assets Manager (JS, CSS)
|
||||||
css_pipeline: false # The CSS pipeline is the unification of multiple CSS resources into one file
|
css_pipeline: false # The CSS pipeline is the unification of multiple CSS resources into one file
|
||||||
css_minify: true # Minify the CSS during pipelining
|
css_pipeline_include_externals: true # Include external URLs in the pipeline by default
|
||||||
css_minify_windows: false # Minify Override for Windows platforms. False by default due to ThreadStackSize
|
css_pipeline_before_excludes: true # Render the pipeline before any excluded files
|
||||||
css_rewrite: true # Rewrite any CSS relative URLs during pipelining
|
css_minify: true # Minify the CSS during pipelining
|
||||||
js_pipeline: false # The JS pipeline is the unification of multiple JS resources into one file
|
css_minify_windows: false # Minify Override for Windows platforms. False by default due to ThreadStackSize
|
||||||
js_minify: true # Minify the JS during pipelining
|
css_rewrite: true # Rewrite any CSS relative URLs during pipelining
|
||||||
enable_asset_timestamp: false # Enable asset timetsamps
|
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_minify: true # Minify the JS during pipelining
|
||||||
|
enable_asset_timestamp: false # Enable asset timestamps
|
||||||
collections:
|
collections:
|
||||||
jquery: system://assets/jquery/jquery-2.1.3.min.js
|
jquery: system://assets/jquery/jquery-2.x.min.js
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
display: true # Display full backtrace-style error page
|
display: false # Display full backtrace-style error page
|
||||||
log: true # Log errors to /logs folder
|
log: true # Log errors to /logs folder
|
||||||
|
|
||||||
debugger:
|
debugger:
|
||||||
enabled: false # Enable Grav debugger and following settings
|
enabled: false # Enable Grav debugger and following settings
|
||||||
twig: true # Enable debugging of Twig templates
|
|
||||||
shutdown:
|
shutdown:
|
||||||
close_connection: true # Close the connection before calling onShutdown(). false for debugging
|
close_connection: true # Close the connection before calling onShutdown(). false for debugging
|
||||||
|
|
||||||
images:
|
images:
|
||||||
default_image_quality: 85 # Default image quality to use when resampling images (85%)
|
default_image_quality: 85 # Default image quality to use when resampling images (85%)
|
||||||
debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example
|
cache_all: false # Cache all image by default
|
||||||
|
cache_perms: '0755' # MUST BE IN QUOTES!! Default cache folder perms. Usually '0755' or '0775'
|
||||||
|
debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example
|
||||||
|
|
||||||
media:
|
media:
|
||||||
enable_media_timestamp: false # Enable media timetsamps
|
enable_media_timestamp: false # Enable media timetsamps
|
||||||
upload_limit: 0 # Set maximum upload size in bytes (0 is unlimited)
|
upload_limit: 0 # Set maximum upload size in bytes (0 is unlimited)
|
||||||
|
unsupported_inline_types: [] # Array of supported media types to try to display inline
|
||||||
|
allowed_fallback_types: [] # Array of allowed media types of files found if accessed via Page route
|
||||||
|
|
||||||
security:
|
session:
|
||||||
default_hash: $2y$10$kwsyMVwM8/7j0K/6LHT.g.Fs49xOCTp2b8hh/S5.dPJuJcJB6T.UK
|
enabled: true # Enable Session support
|
||||||
|
timeout: 1800 # Timeout in seconds
|
||||||
|
name: grav-site # Name prefix of the session cookie. Use alphanumeric, dashes or underscores only. Do not use dots in the session name
|
||||||
|
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
|
||||||
|
httponly: true # Set session HTTP only. If true, indicates that cookies should be used only over HTTP, and JavaScript modification is not allowed.
|
||||||
|
|
||||||
|
gpm:
|
||||||
|
releases: testing # Set to either 'stable' or 'testing'
|
||||||
|
proxy_url: # Configure a manual proxy URL for GPM (eg 127.0.0.1:3128)
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
// Some standard defines
|
// Some standard defines
|
||||||
define('GRAV', true);
|
define('GRAV', true);
|
||||||
define('GRAV_VERSION', '0.9.27');
|
define('GRAV_VERSION', '1.1.0-beta.1');
|
||||||
|
define('GRAV_TESTING', true);
|
||||||
define('DS', '/');
|
define('DS', '/');
|
||||||
|
define('GRAV_PHP_MIN', '5.5.9');
|
||||||
|
|
||||||
// Directories and Paths
|
// Directories and Paths
|
||||||
if (!defined('GRAV_ROOT')) {
|
if (!defined('GRAV_ROOT')) {
|
||||||
@@ -12,20 +14,20 @@ if (!defined('GRAV_ROOT')) {
|
|||||||
define('ROOT_DIR', GRAV_ROOT . '/');
|
define('ROOT_DIR', GRAV_ROOT . '/');
|
||||||
define('USER_PATH', 'user/');
|
define('USER_PATH', 'user/');
|
||||||
define('USER_DIR', ROOT_DIR . USER_PATH);
|
define('USER_DIR', ROOT_DIR . USER_PATH);
|
||||||
define('SYSTEM_DIR', ROOT_DIR .'system/');
|
|
||||||
define('ASSETS_DIR', ROOT_DIR . 'assets/');
|
|
||||||
define('CACHE_DIR', ROOT_DIR . 'cache/');
|
define('CACHE_DIR', ROOT_DIR . 'cache/');
|
||||||
define('IMAGES_DIR', ROOT_DIR . 'images/');
|
|
||||||
define('LOG_DIR', ROOT_DIR .'logs/');
|
|
||||||
define('ACCOUNTS_DIR', USER_DIR .'accounts/');
|
|
||||||
define('PAGES_DIR', USER_DIR .'pages/');
|
|
||||||
|
|
||||||
// DEPRECATED: Do not use!
|
// 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('DATA_DIR', USER_DIR .'data/');
|
||||||
|
define('SYSTEM_DIR', ROOT_DIR .'system/');
|
||||||
define('LIB_DIR', SYSTEM_DIR .'src/');
|
define('LIB_DIR', SYSTEM_DIR .'src/');
|
||||||
define('PLUGINS_DIR', USER_DIR .'plugins/');
|
define('PLUGINS_DIR', USER_DIR .'plugins/');
|
||||||
define('THEMES_DIR', USER_DIR .'themes/');
|
define('THEMES_DIR', USER_DIR .'themes/');
|
||||||
define('VENDOR_DIR', ROOT_DIR .'vendor/');
|
define('VENDOR_DIR', ROOT_DIR .'vendor/');
|
||||||
|
define('LOG_DIR', ROOT_DIR .'logs/');
|
||||||
// END DEPRECATED
|
// END DEPRECATED
|
||||||
|
|
||||||
// Some extensions
|
// Some extensions
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
system/images/media/thumb.png
Normal file
|
After Width: | Height: | Size: 123 B |
79
system/languages/cs.yaml
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- vybavení
|
||||||
|
- informace
|
||||||
|
- rýže
|
||||||
|
- peníze
|
||||||
|
- druhy
|
||||||
|
- série
|
||||||
|
- ryba
|
||||||
|
- ovce
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: lidé
|
||||||
|
man: muži
|
||||||
|
child: děti
|
||||||
|
sex: pohlaví
|
||||||
|
move: pohyby
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
default: '.'
|
||||||
|
first: '.'
|
||||||
|
second: '.'
|
||||||
|
third: '.'
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Datum nebylo vloženo
|
||||||
|
BAD_DATE: Chybné datum
|
||||||
|
AGO: zpět
|
||||||
|
FROM_NOW: od teď
|
||||||
|
SECOND: sekunda
|
||||||
|
MINUTE: minuta
|
||||||
|
HOUR: hodina
|
||||||
|
DAY: den
|
||||||
|
WEEK: týden
|
||||||
|
MONTH: měsíc
|
||||||
|
YEAR: rok
|
||||||
|
DECADE: dekáda
|
||||||
|
SEC: sek
|
||||||
|
MIN: min
|
||||||
|
HR: hod
|
||||||
|
WK: t
|
||||||
|
MO: m
|
||||||
|
YR: r
|
||||||
|
DEC: dek
|
||||||
|
SECOND_PLURAL: sekundy
|
||||||
|
MINUTE_PLURAL: minuty
|
||||||
|
HOUR_PLURAL: hodiny
|
||||||
|
DAY_PLURAL: dny
|
||||||
|
WEEK_PLURAL: týdny
|
||||||
|
MONTH_PLURAL: měsíce
|
||||||
|
YEAR_PLURAL: roky
|
||||||
|
DECADE_PLURAL: dekády
|
||||||
|
SEC_PLURAL: sek
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: hod
|
||||||
|
WK_PLURAL: t
|
||||||
|
MO_PLURAL: m
|
||||||
|
YR_PLURAL: r
|
||||||
|
DEC_PLURAL: dek
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Ověření se nezdařilo:</b>'
|
||||||
|
MISSING_REQUIRED_FIELD: 'Chybí požadované pole:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- ledna
|
||||||
|
- února
|
||||||
|
- března
|
||||||
|
- dubna
|
||||||
|
- května
|
||||||
|
- června
|
||||||
|
- července
|
||||||
|
- srpna
|
||||||
|
- září
|
||||||
|
- října
|
||||||
|
- listopadu
|
||||||
|
- prosince
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Pondělí
|
||||||
|
- Úterý
|
||||||
|
- Středa
|
||||||
|
- Čtvrtek
|
||||||
|
- Pátek
|
||||||
|
- Sobota
|
||||||
|
- Neděle
|
||||||
82
system/languages/de.yaml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: |
|
||||||
|
---
|
||||||
|
title: %1$s
|
||||||
|
---
|
||||||
|
# Fehler: Frontmatter enthält Fehler
|
||||||
|
|
||||||
|
Pfad: `%2$s`
|
||||||
|
|
||||||
|
**%3$s **
|
||||||
|
|
||||||
|
```
|
||||||
|
%4$s
|
||||||
|
```
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
1: Informationen
|
||||||
|
2: Reis
|
||||||
|
3: Geld
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: Personen
|
||||||
|
man: Menschen
|
||||||
|
child: Kinder
|
||||||
|
sex: Geschlecht
|
||||||
|
move: Züge
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Keine Daten vorhanden
|
||||||
|
BAD_DATE: Falsches Datum
|
||||||
|
AGO: her
|
||||||
|
FROM_NOW: ab jetzt
|
||||||
|
SECOND: Sekunde
|
||||||
|
MINUTE: Minute
|
||||||
|
HOUR: Stunde
|
||||||
|
DAY: Tag
|
||||||
|
WEEK: Woche
|
||||||
|
MONTH: Monat
|
||||||
|
YEAR: Jahr
|
||||||
|
DECADE: Dekade
|
||||||
|
SEC: sek
|
||||||
|
MIN: Min
|
||||||
|
HR: std
|
||||||
|
WK: wo
|
||||||
|
YR: yh
|
||||||
|
DEC: Jz
|
||||||
|
SECOND_PLURAL: Sekunden
|
||||||
|
MINUTE_PLURAL: Minuten
|
||||||
|
HOUR_PLURAL: Stunden
|
||||||
|
DAY_PLURAL: Tage
|
||||||
|
WEEK_PLURAL: Wochen
|
||||||
|
MONTH_PLURAL: Monate
|
||||||
|
YEAR_PLURAL: Jahre
|
||||||
|
DECADE_PLURAL: Dekaden
|
||||||
|
SEC_PLURAL: Sekunden
|
||||||
|
MIN_PLURAL: Minuten
|
||||||
|
HR_PLURAL: Stunden
|
||||||
|
WK_PLURAL: Wochen
|
||||||
|
MO_PLURAL: Monate
|
||||||
|
YR_PLURAL: Jahre
|
||||||
|
DEC_PLURAL: Dekaden
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Überprüfung fehlgeschlagen:</b>'
|
||||||
|
INVALID_INPUT: Ungültige Eingabe in
|
||||||
|
MISSING_REQUIRED_FIELD: 'Erforderliches Feld fehlt:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Januar
|
||||||
|
- Februar
|
||||||
|
- März
|
||||||
|
- April
|
||||||
|
- Mai
|
||||||
|
- Juni
|
||||||
|
- Juli
|
||||||
|
- August
|
||||||
|
- Semptember
|
||||||
|
- Oktober
|
||||||
|
- November
|
||||||
|
- Dezember
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Montag
|
||||||
|
- Dienstag
|
||||||
|
- Mittwoch
|
||||||
|
- Donnerstag
|
||||||
|
- Freitag
|
||||||
|
- Samstag
|
||||||
|
- Sonntag
|
||||||
21
system/languages/el.yaml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Ιανουάριος
|
||||||
|
- Φεβρουάριος
|
||||||
|
- Μάρτιος
|
||||||
|
- Απρίλιος
|
||||||
|
- Μάιος
|
||||||
|
- Ιούνιος
|
||||||
|
- Ιούλιος
|
||||||
|
- Αύγουστος
|
||||||
|
- Σεπτέμβριος
|
||||||
|
- Οκτώβριος
|
||||||
|
- Νοέμβριος
|
||||||
|
- Δεκέμβριος
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Δευτέρα
|
||||||
|
- Τρλιτη
|
||||||
|
- Τετάρτη
|
||||||
|
- Πέμπτη
|
||||||
|
- Παρασκευή
|
||||||
|
- Σαββάτο
|
||||||
|
- Κυριακή
|
||||||
100
system/languages/en.yaml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%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'
|
||||||
|
'/s$/i': ''
|
||||||
|
INFLECTOR_UNCOUNTABLE: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep']
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
'person': 'people'
|
||||||
|
'man': 'men'
|
||||||
|
'child': 'children'
|
||||||
|
'sex': 'sexes'
|
||||||
|
'move': 'moves'
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
'default': 'th'
|
||||||
|
'first': 'st'
|
||||||
|
'second': 'nd'
|
||||||
|
'third': 'rd'
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: No date provided
|
||||||
|
BAD_DATE: Bad date
|
||||||
|
AGO: ago
|
||||||
|
FROM_NOW: from now
|
||||||
|
SECOND: second
|
||||||
|
MINUTE: minute
|
||||||
|
HOUR: hour
|
||||||
|
DAY: day
|
||||||
|
WEEK: week
|
||||||
|
MONTH: month
|
||||||
|
YEAR: year
|
||||||
|
DECADE: decade
|
||||||
|
SEC: sec
|
||||||
|
MIN: min
|
||||||
|
HR: hr
|
||||||
|
DAY: day
|
||||||
|
WK: wk
|
||||||
|
MO: mo
|
||||||
|
YR: yr
|
||||||
|
DEC: dec
|
||||||
|
SECOND_PLURAL: seconds
|
||||||
|
MINUTE_PLURAL: minutes
|
||||||
|
HOUR_PLURAL: hours
|
||||||
|
DAY_PLURAL: days
|
||||||
|
WEEK_PLURAL: weeks
|
||||||
|
MONTH_PLURAL: months
|
||||||
|
YEAR_PLURAL: years
|
||||||
|
DECADE_PLURAL: decades
|
||||||
|
SEC_PLURAL: secs
|
||||||
|
MIN_PLURAL: mins
|
||||||
|
HR_PLURAL: hrs
|
||||||
|
DAY_PLURAL: days
|
||||||
|
WK_PLURAL: wks
|
||||||
|
MO_PLURAL: mos
|
||||||
|
YR_PLURAL: yrs
|
||||||
|
DEC_PLURAL: decs
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Validation failed:</b>
|
||||||
|
INVALID_INPUT: Invalid input in
|
||||||
|
MISSING_REQUIRED_FIELD: Missing required field:
|
||||||
|
MONTHS_OF_THE_YEAR: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
|
||||||
|
DAYS_OF_THE_WEEK: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
|
||||||
75
system/languages/es.yaml
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
0: equipo
|
||||||
|
1: información
|
||||||
|
3: dinero
|
||||||
|
5: series
|
||||||
|
6: pescado
|
||||||
|
7: oveja
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
man: hombres
|
||||||
|
child: niños
|
||||||
|
sex: sexos
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
first: ro
|
||||||
|
second: do
|
||||||
|
third: ro
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: No se proporcionó fecha
|
||||||
|
BAD_DATE: Fecha erronea
|
||||||
|
AGO: antes
|
||||||
|
FROM_NOW: desde ahora
|
||||||
|
SECOND: segundo
|
||||||
|
MINUTE: minuto
|
||||||
|
HOUR: hora
|
||||||
|
DAY: día
|
||||||
|
WEEK: semana
|
||||||
|
MONTH: mes
|
||||||
|
YEAR: año
|
||||||
|
DECADE: década
|
||||||
|
SEC: seg
|
||||||
|
MIN: min
|
||||||
|
HR: h
|
||||||
|
WK: sem
|
||||||
|
MO: mes
|
||||||
|
YR: año
|
||||||
|
DEC: dec
|
||||||
|
SECOND_PLURAL: segundos
|
||||||
|
MINUTE_PLURAL: minutos
|
||||||
|
HOUR_PLURAL: horas
|
||||||
|
DAY_PLURAL: días
|
||||||
|
WEEK_PLURAL: semanas
|
||||||
|
MONTH_PLURAL: meses
|
||||||
|
YEAR_PLURAL: años
|
||||||
|
DECADE_PLURAL: décadas
|
||||||
|
SEC_PLURAL: segs
|
||||||
|
MIN_PLURAL: mins
|
||||||
|
HR_PLURAL: hs
|
||||||
|
WK_PLURAL: sem
|
||||||
|
MO_PLURAL: mes
|
||||||
|
YR_PLURAL: años
|
||||||
|
DEC_PLURAL: décadas
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Falló la validación. </b>'
|
||||||
|
INVALID_INPUT: 'Dato inválido en: '
|
||||||
|
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Enero
|
||||||
|
- Febrero
|
||||||
|
- Marzo
|
||||||
|
- Abril
|
||||||
|
- Mayo
|
||||||
|
- Junio
|
||||||
|
- Julio
|
||||||
|
- Agosto
|
||||||
|
- Septiembre
|
||||||
|
- Octubre
|
||||||
|
- Noviembre
|
||||||
|
- Diciembre
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Lunes
|
||||||
|
- Martes
|
||||||
|
- Miércoles
|
||||||
|
- Jueves
|
||||||
|
- Viernes
|
||||||
|
- Sábado
|
||||||
|
- Domingo
|
||||||
137
system/languages/fr.yaml
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: |
|
||||||
|
---
|
||||||
|
title: %1$s
|
||||||
|
---
|
||||||
|
|
||||||
|
# Erreur : Frontmatter invalide
|
||||||
|
|
||||||
|
Path: `%2$s`
|
||||||
|
|
||||||
|
**%3$s**
|
||||||
|
|
||||||
|
```
|
||||||
|
%4$s
|
||||||
|
```
|
||||||
|
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:
|
||||||
|
- équipement
|
||||||
|
- informations
|
||||||
|
- riz
|
||||||
|
- argent
|
||||||
|
- espèces
|
||||||
|
- séries
|
||||||
|
- poisson
|
||||||
|
- mouton
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: personnes
|
||||||
|
man: hommes
|
||||||
|
child: enfants
|
||||||
|
sex: sexes
|
||||||
|
move: déplacements
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
default: ème
|
||||||
|
first: er
|
||||||
|
second: ème
|
||||||
|
third: ème
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Aucune date fournie
|
||||||
|
BAD_DATE: Date erronée
|
||||||
|
AGO: plus tôt
|
||||||
|
FROM_NOW: à partir de maintenant
|
||||||
|
SECOND: seconde
|
||||||
|
MINUTE: minute
|
||||||
|
HOUR: heure
|
||||||
|
DAY: jour
|
||||||
|
WEEK: semaine
|
||||||
|
MONTH: mois
|
||||||
|
YEAR: année
|
||||||
|
DECADE: décennie
|
||||||
|
SEC: s
|
||||||
|
MIN: m
|
||||||
|
HR: h
|
||||||
|
WK: sem
|
||||||
|
MO: m
|
||||||
|
YR: an
|
||||||
|
DEC: déc
|
||||||
|
SECOND_PLURAL: secondes
|
||||||
|
MINUTE_PLURAL: minutes
|
||||||
|
HOUR_PLURAL: heures
|
||||||
|
DAY_PLURAL: jours
|
||||||
|
WEEK_PLURAL: semaines
|
||||||
|
MONTH_PLURAL: mois
|
||||||
|
YEAR_PLURAL: années
|
||||||
|
DECADE_PLURAL: décennies
|
||||||
|
SEC_PLURAL: s
|
||||||
|
MIN_PLURAL: m
|
||||||
|
HR_PLURAL: h
|
||||||
|
WK_PLURAL: sem
|
||||||
|
MO_PLURAL: mois
|
||||||
|
YR_PLURAL: a
|
||||||
|
DEC_PLURAL: décs
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>La validation a échoué :</b>'
|
||||||
|
INVALID_INPUT: Saisie non valide
|
||||||
|
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 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
|
||||||
74
system/languages/hr.yaml
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- oprema
|
||||||
|
- informacije
|
||||||
|
- riža
|
||||||
|
- novac
|
||||||
|
- vrsta
|
||||||
|
- serija
|
||||||
|
- riba
|
||||||
|
- ovca
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: osobe
|
||||||
|
man: ljudi
|
||||||
|
child: djeca
|
||||||
|
sex: spolovi
|
||||||
|
move: Pomakni
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Datum nije upisan
|
||||||
|
BAD_DATE: Pogrešan datum
|
||||||
|
AGO: prije
|
||||||
|
FROM_NOW: od sada
|
||||||
|
SECOND: sekunda
|
||||||
|
MINUTE: minuta
|
||||||
|
HOUR: sat
|
||||||
|
DAY: dan
|
||||||
|
WEEK: tjedan
|
||||||
|
MONTH: mjesec
|
||||||
|
YEAR: godina
|
||||||
|
DECADE: desetljeće
|
||||||
|
SEC: sek
|
||||||
|
HR: sat
|
||||||
|
WK: t
|
||||||
|
MO: m
|
||||||
|
YR: g
|
||||||
|
DEC: des
|
||||||
|
SECOND_PLURAL: sekundi
|
||||||
|
MINUTE_PLURAL: minuta
|
||||||
|
HOUR_PLURAL: sati
|
||||||
|
DAY_PLURAL: dan
|
||||||
|
WEEK_PLURAL: tjedana
|
||||||
|
MONTH_PLURAL: mjeseci
|
||||||
|
YEAR_PLURAL: godina
|
||||||
|
DECADE_PLURAL: desetljeća
|
||||||
|
SEC_PLURAL: sek
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: sat
|
||||||
|
WK_PLURAL: t
|
||||||
|
MO_PLURAL: m
|
||||||
|
YR_PLURAL: g
|
||||||
|
DEC_PLURAL: des
|
||||||
|
FORM:
|
||||||
|
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
|
||||||
|
- Veljača
|
||||||
|
- Ožujak
|
||||||
|
- Travanj
|
||||||
|
- Svibanj
|
||||||
|
- Lipanj
|
||||||
|
- Srpanj
|
||||||
|
- Kolovoz
|
||||||
|
- Rujan
|
||||||
|
- Listopad
|
||||||
|
- Studeni
|
||||||
|
- Prosinac
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Ponedjeljak
|
||||||
|
- Utorak
|
||||||
|
- Srijeda
|
||||||
|
- Četvrtak
|
||||||
|
- Petak
|
||||||
|
- Subota
|
||||||
|
- Nedjelja
|
||||||
64
system/languages/hu.yaml
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: |
|
||||||
|
---
|
||||||
|
cím: %1$s
|
||||||
|
---
|
||||||
|
|
||||||
|
# Hiba: Érvénytelen Frontmatter
|
||||||
|
|
||||||
|
Elérési út: `%2$s`
|
||||||
|
|
||||||
|
**%3$s**
|
||||||
|
|
||||||
|
```
|
||||||
|
%4$s
|
||||||
|
```
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: személyek
|
||||||
|
man: férfiak
|
||||||
|
child: gyerekek
|
||||||
|
sex: nemek
|
||||||
|
move: lépések
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
default: '.'
|
||||||
|
first: '.'
|
||||||
|
second: '.'
|
||||||
|
third: '.'
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Nincs dátum megadva
|
||||||
|
BAD_DATE: Hibás dátum
|
||||||
|
AGO: elteltével
|
||||||
|
FROM_NOW: mostantól
|
||||||
|
SECOND: másodperc
|
||||||
|
MINUTE: perc
|
||||||
|
HOUR: óra
|
||||||
|
DAY: nap
|
||||||
|
WEEK: hét
|
||||||
|
MONTH: hónap
|
||||||
|
YEAR: év
|
||||||
|
DECADE: évtized
|
||||||
|
SEC: mp
|
||||||
|
MIN: p
|
||||||
|
HR: ó
|
||||||
|
WK: hét
|
||||||
|
MO: hó
|
||||||
|
YR: év
|
||||||
|
DEC: évt
|
||||||
|
SECOND_PLURAL: másodperc
|
||||||
|
MINUTE_PLURAL: perc
|
||||||
|
HOUR_PLURAL: óra
|
||||||
|
DAY_PLURAL: nap
|
||||||
|
WEEK_PLURAL: hét
|
||||||
|
MONTH_PLURAL: hónap
|
||||||
|
YEAR_PLURAL: év
|
||||||
|
DECADE_PLURAL: évtized
|
||||||
|
SEC_PLURAL: mp
|
||||||
|
MIN_PLURAL: perc
|
||||||
|
HR_PLURAL: ó
|
||||||
|
WK_PLURAL: hét
|
||||||
|
MO_PLURAL: hó
|
||||||
|
YR_PLURAL: év
|
||||||
|
DEC_PLURAL: évt
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>A validáció hibát talált:</b>'
|
||||||
|
INVALID_INPUT: 'Az itt megadott érték érvénytelen:'
|
||||||
|
MISSING_REQUIRED_FIELD: 'Ez a kötelező mező nincs kitöltve:'
|
||||||
45
system/languages/it.yaml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Nessuna data fornita
|
||||||
|
BAD_DATE: Data errata
|
||||||
|
AGO: fa
|
||||||
|
FROM_NOW: da adesso
|
||||||
|
SECOND: secondo
|
||||||
|
MINUTE: minuto
|
||||||
|
HOUR: ora
|
||||||
|
DAY: giorno
|
||||||
|
WEEK: settimana
|
||||||
|
MONTH: mese
|
||||||
|
YEAR: anno
|
||||||
|
SECOND_PLURAL: secondi
|
||||||
|
MINUTE_PLURAL: minuti
|
||||||
|
HOUR_PLURAL: ore
|
||||||
|
DAY_PLURAL: giorni
|
||||||
|
WEEK_PLURAL: settimane
|
||||||
|
MONTH_PLURAL: mesi
|
||||||
|
YEAR_PLURAL: anni
|
||||||
|
DECADE_PLURAL: decadi
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Validazione fallita:</b>'
|
||||||
|
INVALID_INPUT: Input invalido in
|
||||||
|
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Gennaio
|
||||||
|
- Febbraio
|
||||||
|
- Marzo
|
||||||
|
- Aprile
|
||||||
|
- Maggio
|
||||||
|
- Giugno
|
||||||
|
- Luglio
|
||||||
|
- Agosto
|
||||||
|
- Settembre
|
||||||
|
- Ottobre
|
||||||
|
- Novembre
|
||||||
|
- Dicembre
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Lunedi
|
||||||
|
- Martedi
|
||||||
|
- Mercoledi
|
||||||
|
- Giovedi
|
||||||
|
- Venerdi
|
||||||
|
- Sabato
|
||||||
|
- Domenica
|
||||||
59
system/languages/ja.yaml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
INFLECTOR_PLURALS: []
|
||||||
|
|
||||||
|
INFLECTOR_SINGULAR: []
|
||||||
|
|
||||||
|
INFLECTOR_UNCOUNTABLE: []
|
||||||
|
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
'person': 'みんな'
|
||||||
|
'man': '人'
|
||||||
|
'child': '子供'
|
||||||
|
'sex': '性別'
|
||||||
|
'move': '移動'
|
||||||
|
|
||||||
|
INFLECTOR_ORDINALS: []
|
||||||
|
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: 日付が設定されていません
|
||||||
|
BAD_DATE: 不正な日付
|
||||||
|
AGO: 前
|
||||||
|
FROM_NOW: from now
|
||||||
|
SECOND: 秒
|
||||||
|
MINUTE: 分
|
||||||
|
HOUR: 時
|
||||||
|
DAY: 日
|
||||||
|
WEEK: 週
|
||||||
|
MONTH: 月
|
||||||
|
YEAR: 年
|
||||||
|
DECADE: 10年
|
||||||
|
SEC: 秒
|
||||||
|
MIN: 分
|
||||||
|
HR: 時
|
||||||
|
DAY: 日
|
||||||
|
WK: 週
|
||||||
|
MO: 月
|
||||||
|
YR: 年
|
||||||
|
DEC: dec
|
||||||
|
SECOND_PLURAL: 秒
|
||||||
|
MINUTE_PLURAL: 分
|
||||||
|
HOUR_PLURAL: 時
|
||||||
|
DAY_PLURAL: 日
|
||||||
|
WEEK_PLURAL: 週
|
||||||
|
MONTH_PLURAL: 月
|
||||||
|
YEAR_PLURAL: 年
|
||||||
|
DECADE_PLURAL: 10年
|
||||||
|
SEC_PLURAL: 秒
|
||||||
|
MIN_PLURAL: 分
|
||||||
|
HR_PLURAL: 時
|
||||||
|
DAY_PLURAL: 日
|
||||||
|
WK_PLURAL: 週
|
||||||
|
MO_PLURAL: 月
|
||||||
|
YR_PLURAL: 年
|
||||||
|
DEC_PLURAL: 10年
|
||||||
|
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: ['月', '火', '水', '木', '金', '土', '日']
|
||||||
68
system/languages/lt.yaml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
2: ryžiai
|
||||||
|
3: pinigai
|
||||||
|
4: prieskoniai
|
||||||
|
5: serijos
|
||||||
|
6: žuvis
|
||||||
|
7: avis
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: žmonės
|
||||||
|
man: žmogus
|
||||||
|
child: vaikai
|
||||||
|
sex: lytys
|
||||||
|
move: juda
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Nenurodyta data
|
||||||
|
BAD_DATE: Neteisinga data
|
||||||
|
AGO: prieš
|
||||||
|
FROM_NOW: nuo dabar
|
||||||
|
SECOND: sekundė
|
||||||
|
MINUTE: minutė
|
||||||
|
HOUR: valanda
|
||||||
|
DAY: diena
|
||||||
|
WEEK: savaitė
|
||||||
|
MONTH: mėnuo
|
||||||
|
YEAR: metai
|
||||||
|
DECADE: dešimtmetis
|
||||||
|
SEC: sek
|
||||||
|
MIN: min
|
||||||
|
HR: val
|
||||||
|
WK: sav
|
||||||
|
MO: mėn
|
||||||
|
YR: m
|
||||||
|
MINUTE_PLURAL: minutės
|
||||||
|
HOUR_PLURAL: valandos
|
||||||
|
DAY_PLURAL: dienos
|
||||||
|
WEEK_PLURAL: savaitės
|
||||||
|
MONTH_PLURAL: mėnesiai
|
||||||
|
YEAR_PLURAL: metai
|
||||||
|
DECADE_PLURAL: dešimtmečiai
|
||||||
|
SEC_PLURAL: sek
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: val
|
||||||
|
WK_PLURAL: sav
|
||||||
|
MO_PLURAL: mėn
|
||||||
|
YR_PLURAL: m
|
||||||
|
FORM:
|
||||||
|
MISSING_REQUIRED_FIELD: 'Būtina užpildyti laukelį:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Sausis
|
||||||
|
- Vasaris
|
||||||
|
- Kovas
|
||||||
|
- Balandis
|
||||||
|
- Gegužė
|
||||||
|
- Birželis
|
||||||
|
- Liepa
|
||||||
|
- Rugpjūtis
|
||||||
|
- Rugsėjis
|
||||||
|
- Spalis
|
||||||
|
- Lakpritis
|
||||||
|
- Gruodis
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Pirmadienis
|
||||||
|
- Antradienis
|
||||||
|
- Trečiadienis
|
||||||
|
- Ketvirtadienis
|
||||||
|
- Penktadienis
|
||||||
|
- Šeštadienis
|
||||||
|
- Sekmadienis
|
||||||
2
system/languages/nb.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
MONTHS_OF_THE_YEAR: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember']
|
||||||
|
DAYS_OF_THE_WEEK: ['mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag', 'søndag']
|
||||||
50
system/languages/nl.yaml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: personen
|
||||||
|
man: mensen
|
||||||
|
child: kinderen
|
||||||
|
sex: geslacht
|
||||||
|
move: verplaatsen
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: geen datum opgegeven
|
||||||
|
BAD_DATE: Datumformaat onjuist
|
||||||
|
AGO: geleden
|
||||||
|
FROM_NOW: vanaf nu
|
||||||
|
SECOND: seconde
|
||||||
|
MINUTE: minuut
|
||||||
|
HOUR: uur
|
||||||
|
DAY: dag
|
||||||
|
MONTH: maand
|
||||||
|
YEAR: jaar
|
||||||
|
DECADE: decenium
|
||||||
|
MO: ma
|
||||||
|
SECOND_PLURAL: seconden
|
||||||
|
MINUTE_PLURAL: minuten
|
||||||
|
HOUR_PLURAL: uren
|
||||||
|
DAY_PLURAL: dagen
|
||||||
|
WEEK_PLURAL: weken
|
||||||
|
MONTH_PLURAL: maanden
|
||||||
|
YEAR_PLURAL: jaren
|
||||||
|
DECADE_PLURAL: decennia
|
||||||
|
SEC_PLURAL: seconden
|
||||||
|
MIN_PLURAL: minuten
|
||||||
|
HR_PLURAL: uren
|
||||||
|
WK_PLURAL: weken
|
||||||
|
MO_PLURAL: maanden
|
||||||
|
YR_PLURAL: jaren
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
0: Januari
|
||||||
|
1: Februari
|
||||||
|
2: Maart
|
||||||
|
4: Mei
|
||||||
|
5: Juni
|
||||||
|
6: Juli
|
||||||
|
7: Augustus
|
||||||
|
9: Oktober
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Maandag
|
||||||
|
- Dinsdag
|
||||||
|
- Woensdag
|
||||||
|
- Donderdag
|
||||||
|
- Vrijdag
|
||||||
|
- Zaterdag
|
||||||
|
- Zondag
|
||||||
90
system/languages/no.yaml
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: |
|
||||||
|
---
|
||||||
|
Tittel: %1$s
|
||||||
|
---
|
||||||
|
|
||||||
|
# Feilmelding: Ugyldig Frontmatter
|
||||||
|
|
||||||
|
Pane: '%2$s'
|
||||||
|
|
||||||
|
**%3$s **
|
||||||
|
|
||||||
|
```
|
||||||
|
%4$s
|
||||||
|
```
|
||||||
|
INFLECTOR_PLURALS:
|
||||||
|
/(quiz)$/i: '\1zes'
|
||||||
|
/^(ox)$/i: '\1en'
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- utstyr
|
||||||
|
- informasjon
|
||||||
|
- ris
|
||||||
|
- penger
|
||||||
|
- arter
|
||||||
|
- serier
|
||||||
|
- fisk
|
||||||
|
- sau
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: folk
|
||||||
|
man: menn
|
||||||
|
child: barn
|
||||||
|
sex: kjønn
|
||||||
|
move: trekk
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Ingen dato gitt
|
||||||
|
BAD_DATE: Dårlig dato
|
||||||
|
AGO: siden
|
||||||
|
FROM_NOW: fra nå
|
||||||
|
SECOND: sekund
|
||||||
|
MINUTE: minutt
|
||||||
|
HOUR: time
|
||||||
|
DAY: dag
|
||||||
|
WEEK: uke
|
||||||
|
MONTH: måned
|
||||||
|
YEAR: år
|
||||||
|
DECADE: tiår
|
||||||
|
SEC: sek
|
||||||
|
MIN: min
|
||||||
|
HR: t
|
||||||
|
WK: uke
|
||||||
|
MO: må
|
||||||
|
YR: år
|
||||||
|
DEC: des
|
||||||
|
SECOND_PLURAL: sekunder
|
||||||
|
MINUTE_PLURAL: minutter
|
||||||
|
HOUR_PLURAL: timer
|
||||||
|
DAY_PLURAL: dager
|
||||||
|
WEEK_PLURAL: uker
|
||||||
|
MONTH_PLURAL: måneder
|
||||||
|
YEAR_PLURAL: år
|
||||||
|
DECADE_PLURAL: tiår
|
||||||
|
SEC_PLURAL: sek
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: timer
|
||||||
|
WK_PLURAL: uker
|
||||||
|
YR_PLURAL: år
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Validering mislyktes:</b>'
|
||||||
|
INVALID_INPUT: Ugyldig innhold i
|
||||||
|
MISSING_REQUIRED_FIELD: 'Mangler påkrevd felt:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- januar
|
||||||
|
- februar
|
||||||
|
- mars
|
||||||
|
- april
|
||||||
|
- mai
|
||||||
|
- juni
|
||||||
|
- juli
|
||||||
|
- august
|
||||||
|
- september
|
||||||
|
- oktober
|
||||||
|
- november
|
||||||
|
- desember
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- mandag
|
||||||
|
- tirsdag
|
||||||
|
- onsdag
|
||||||
|
- torsdag
|
||||||
|
- fredag
|
||||||
|
- lørdag
|
||||||
|
- søndag
|
||||||
74
system/languages/pl.yaml
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
FRONTMATTER_ERROR_PAGE: |
|
||||||
|
---
|
||||||
|
title: %1$s
|
||||||
|
---
|
||||||
|
|
||||||
|
# Error: Nieprawidłowy Frontmatter
|
||||||
|
|
||||||
|
Path: `%2$s`
|
||||||
|
|
||||||
|
**%3$s**
|
||||||
|
|
||||||
|
```
|
||||||
|
%4$s
|
||||||
|
```
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Nie podano daty
|
||||||
|
BAD_DATE: Zła data
|
||||||
|
AGO: temu
|
||||||
|
FROM_NOW: od teraz
|
||||||
|
SECOND: sekunda
|
||||||
|
MINUTE: minuta
|
||||||
|
HOUR: godzina
|
||||||
|
DAY: dzień
|
||||||
|
WEEK: tydzień
|
||||||
|
MONTH: miesiąc
|
||||||
|
YEAR: rok
|
||||||
|
DECADE: dekada
|
||||||
|
SEC: sek
|
||||||
|
MIN: min
|
||||||
|
HR: godz
|
||||||
|
WK: tydź
|
||||||
|
MO: mieś
|
||||||
|
YR: rok
|
||||||
|
DEC: dekada
|
||||||
|
SECOND_PLURAL: sekund
|
||||||
|
MINUTE_PLURAL: minut
|
||||||
|
HOUR_PLURAL: godzin
|
||||||
|
DAY_PLURAL: dni
|
||||||
|
WEEK_PLURAL: tygodnie
|
||||||
|
MONTH_PLURAL: miesięcy
|
||||||
|
YEAR_PLURAL: lat
|
||||||
|
DECADE_PLURAL: dekad
|
||||||
|
SEC_PLURAL: sekund
|
||||||
|
MIN_PLURAL: minut
|
||||||
|
HR_PLURAL: godz
|
||||||
|
WK_PLURAL: tyg
|
||||||
|
MO_PLURAL: mieś
|
||||||
|
YR_PLURAL: lat
|
||||||
|
DEC_PLURAL: dekad
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Weryfikacja nie powiodła się:</b>'
|
||||||
|
INVALID_INPUT: Nieprawidłowe dane w
|
||||||
|
MISSING_REQUIRED_FIELD: 'Opuszczono wymagane pole:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Styczeń
|
||||||
|
- Luty
|
||||||
|
- Marzec
|
||||||
|
- Kwiecień
|
||||||
|
- Maj
|
||||||
|
- Czerwiec
|
||||||
|
- Lipiec
|
||||||
|
- Sierpień
|
||||||
|
- Wrzesień
|
||||||
|
- Październik
|
||||||
|
- Listopad
|
||||||
|
- Grudzień
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Poniedziałek
|
||||||
|
- Wtorek
|
||||||
|
- Środa
|
||||||
|
- Czwartek
|
||||||
|
- Piątek
|
||||||
|
- Sobota
|
||||||
|
- Niedziela
|
||||||
55
system/languages/pt.yaml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
1: informação
|
||||||
|
2: arroz
|
||||||
|
3: dinheiro
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
man: homens
|
||||||
|
sex: sexos
|
||||||
|
NICETIME:
|
||||||
|
SECOND: segundo
|
||||||
|
MINUTE: minuto
|
||||||
|
HOUR: hora
|
||||||
|
DAY: dia
|
||||||
|
WEEK: semana
|
||||||
|
MONTH: mês
|
||||||
|
YEAR: ano
|
||||||
|
DECADE: década
|
||||||
|
SEC: seg
|
||||||
|
MIN: mín
|
||||||
|
MO: mês
|
||||||
|
YR: ano
|
||||||
|
SECOND_PLURAL: segundos
|
||||||
|
MINUTE_PLURAL: minutos
|
||||||
|
HOUR_PLURAL: horas
|
||||||
|
DAY_PLURAL: dias
|
||||||
|
WEEK_PLURAL: semanas
|
||||||
|
MONTH_PLURAL: meses
|
||||||
|
YEAR_PLURAL: anos
|
||||||
|
DECADE_PLURAL: décadas
|
||||||
|
SEC_PLURAL: seg
|
||||||
|
MIN_PLURAL: mins
|
||||||
|
HR_PLURAL: hrs
|
||||||
|
YR_PLURAL: anos
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: '<b>Validação falhada: </b>'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- Janeiro
|
||||||
|
- Fevereiro
|
||||||
|
- Março
|
||||||
|
- Abril
|
||||||
|
- Maio
|
||||||
|
- Junho
|
||||||
|
- Julho
|
||||||
|
- Agosto
|
||||||
|
- Setembro
|
||||||
|
- Outubro
|
||||||
|
- Novembro
|
||||||
|
- Dezembro
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Segunda
|
||||||
|
- Terça
|
||||||
|
- Quarta
|
||||||
|
- Quinta
|
||||||
|
- Sexta
|
||||||
|
- Sábado
|
||||||
|
- Domingo
|
||||||
20
system/languages/ro.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
0: Ianuarie
|
||||||
|
1: Februarie
|
||||||
|
2: Martie
|
||||||
|
3: Aprilue
|
||||||
|
4: Mai
|
||||||
|
5: Iunie
|
||||||
|
6: Iulie
|
||||||
|
8: Septembrie
|
||||||
|
9: Octombrie
|
||||||
|
10: Noiembrie
|
||||||
|
11: Decembrie
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- Luni
|
||||||
|
- Marti
|
||||||
|
- Miercuri
|
||||||
|
- Joi
|
||||||
|
- Vineri
|
||||||
|
- Sâmbătă
|
||||||
|
- Duminică
|
||||||
66
system/languages/ru.yaml
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
person: люди
|
||||||
|
man: человек
|
||||||
|
child: ребенок
|
||||||
|
sex: пол
|
||||||
|
move: движется
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Дата не указана
|
||||||
|
BAD_DATE: Неверная дата
|
||||||
|
AGO: назад
|
||||||
|
FROM_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:
|
||||||
|
- Понедельник
|
||||||
|
- Вторник
|
||||||
|
- Среда
|
||||||
|
- Четверг
|
||||||
|
- Пятница
|
||||||
|
- Суббота
|
||||||
|
- Воскресенье
|
||||||
2
system/languages/sv.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
NICETIME:
|
||||||
|
DAY: dag
|
||||||
35
system/languages/tr.yaml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Tarih yok
|
||||||
|
BAD_DATE: Yanlış tarih
|
||||||
|
AGO: önce
|
||||||
|
FROM_NOW: (şimdiden)
|
||||||
|
SECOND: saniye
|
||||||
|
MINUTE: dakika
|
||||||
|
HOUR: saat
|
||||||
|
DAY: gün
|
||||||
|
WEEK: hafta
|
||||||
|
MONTH: ay
|
||||||
|
YEAR: yıl
|
||||||
|
DECADE: onyıl
|
||||||
|
SEC: sn
|
||||||
|
MIN: dk
|
||||||
|
HR: sa
|
||||||
|
WK: hft
|
||||||
|
MO: ay
|
||||||
|
YR: yl
|
||||||
|
DEC: onyl
|
||||||
|
SECOND_PLURAL: saniye
|
||||||
|
MINUTE_PLURAL: dakika
|
||||||
|
HOUR_PLURAL: saat
|
||||||
|
DAY_PLURAL: gün
|
||||||
|
WEEK_PLURAL: hafta
|
||||||
|
MONTH_PLURAL: ay
|
||||||
|
YEAR_PLURAL: yıl
|
||||||
|
DECADE_PLURAL: onyıl
|
||||||
|
SEC_PLURAL: sn
|
||||||
|
MIN_PLURAL: dk
|
||||||
|
HR_PLURAL: sa
|
||||||
|
WK_PLURAL: hft
|
||||||
|
MO_PLURAL: ay
|
||||||
|
YR_PLURAL: yl
|
||||||
|
DEC_PLURAL: onyl
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Grav\Common\Backup;
|
namespace Grav\Common\Backup;
|
||||||
|
|
||||||
use Grav\Common\GravTrait;
|
use Grav\Common\Grav;
|
||||||
use Grav\Common\Filesystem\Folder;
|
use Grav\Common\Inflector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The ZipBackup class lets you create simple zip-backups of a grav site
|
* The ZipBackup class lets you create simple zip-backups of a grav site
|
||||||
@@ -12,8 +12,6 @@ use Grav\Common\Filesystem\Folder;
|
|||||||
*/
|
*/
|
||||||
class ZipBackup
|
class ZipBackup
|
||||||
{
|
{
|
||||||
use GravTrait;
|
|
||||||
|
|
||||||
protected static $ignorePaths = [
|
protected static $ignorePaths = [
|
||||||
'backup',
|
'backup',
|
||||||
'cache',
|
'cache',
|
||||||
@@ -22,25 +20,38 @@ class ZipBackup
|
|||||||
];
|
];
|
||||||
|
|
||||||
protected static $ignoreFolders = [
|
protected static $ignoreFolders = [
|
||||||
'.git'
|
'.git',
|
||||||
|
'.svn',
|
||||||
|
'.hg',
|
||||||
|
'.idea',
|
||||||
|
'node_modules'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Backup
|
||||||
|
*
|
||||||
|
* @param null $destination
|
||||||
|
* @param callable|null $messager
|
||||||
|
*
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
public static function backup($destination = null, callable $messager = null)
|
public static function backup($destination = null, callable $messager = null)
|
||||||
{
|
{
|
||||||
if (!$destination) {
|
if (!$destination) {
|
||||||
$destination = self::getGrav()['locator']->findResource('backup://', true);
|
$destination = Grav::instance()['locator']->findResource('backup://', true);
|
||||||
|
|
||||||
if (!$destination)
|
if (!$destination) {
|
||||||
throw new \RuntimeException('The backup folder is missing.');
|
throw new \RuntimeException('The backup folder is missing.');
|
||||||
|
}
|
||||||
Folder::mkdir($destination);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$name = self::getGrav()['config']->get('site.title', basename(GRAV_ROOT));
|
$name = Grav::instance()['config']->get('site.title', basename(GRAV_ROOT));
|
||||||
|
|
||||||
|
$inflector = new Inflector();
|
||||||
|
|
||||||
if (is_dir($destination)) {
|
if (is_dir($destination)) {
|
||||||
$date = date('YmdHis', time());
|
$date = date('YmdHis', time());
|
||||||
$filename = $name . '-' . $date . '.zip';
|
$filename = trim($inflector->hyphenize($name), '-') . '-' . $date . '.zip';
|
||||||
$destination = rtrim($destination, DS) . DS . $filename;
|
$destination = rtrim($destination, DS) . DS . $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,6 +69,8 @@ class ZipBackup
|
|||||||
$zip = new \ZipArchive();
|
$zip = new \ZipArchive();
|
||||||
$zip->open($destination, \ZipArchive::CREATE);
|
$zip->open($destination, \ZipArchive::CREATE);
|
||||||
|
|
||||||
|
$max_execution_time = ini_set('max_execution_time', 600);
|
||||||
|
|
||||||
static::folderToZip(GRAV_ROOT, $zip, strlen(rtrim(GRAV_ROOT, DS) . DS), $messager);
|
static::folderToZip(GRAV_ROOT, $zip, strlen(rtrim(GRAV_ROOT, DS) . DS), $messager);
|
||||||
|
|
||||||
$messager && $messager([
|
$messager && $messager([
|
||||||
@@ -79,6 +92,10 @@ class ZipBackup
|
|||||||
|
|
||||||
$zip->close();
|
$zip->close();
|
||||||
|
|
||||||
|
if ($max_execution_time !== false) {
|
||||||
|
ini_set('max_execution_time', $max_execution_time);
|
||||||
|
}
|
||||||
|
|
||||||
return $destination;
|
return $destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +114,10 @@ class ZipBackup
|
|||||||
// Remove prefix from file path before add to zip.
|
// Remove prefix from file path before add to zip.
|
||||||
$localPath = substr($filePath, $exclusiveLength);
|
$localPath = substr($filePath, $exclusiveLength);
|
||||||
|
|
||||||
if (in_array($f, static::$ignoreFolders) || in_array($localPath, static::$ignorePaths)) {
|
if (in_array($f, static::$ignoreFolders)) {
|
||||||
|
continue;
|
||||||
|
} elseif (in_array($localPath, static::$ignorePaths)) {
|
||||||
|
$zipFile->addEmptyDir($f);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,20 @@
|
|||||||
namespace Grav\Common;
|
namespace Grav\Common;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple wrapper for the very simple parse_user_agent() function
|
* Handles browser and platform versions
|
||||||
|
*
|
||||||
|
* Internally uses the PhpUserAgent package https://github.com/donatj/PhpUserAgent
|
||||||
|
*
|
||||||
|
* @author RocketTheme
|
||||||
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
class Browser
|
class Browser
|
||||||
{
|
{
|
||||||
|
|
||||||
protected $useragent = [];
|
protected $useragent = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Browser constructor.
|
||||||
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@@ -18,24 +25,111 @@ class Browser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current browser identifier
|
||||||
|
*
|
||||||
|
* Currently detected browsers:
|
||||||
|
*
|
||||||
|
* Android Browser
|
||||||
|
* BlackBerry Browser
|
||||||
|
* Camino
|
||||||
|
* Kindle / Silk
|
||||||
|
* Firefox / Iceweasel
|
||||||
|
* Safari
|
||||||
|
* Internet Explorer
|
||||||
|
* IEMobile
|
||||||
|
* Chrome
|
||||||
|
* Opera
|
||||||
|
* Midori
|
||||||
|
* Vivaldi
|
||||||
|
* TizenBrowser
|
||||||
|
* Lynx
|
||||||
|
* Wget
|
||||||
|
* Curl
|
||||||
|
*
|
||||||
|
* @return string the lowercase browser name
|
||||||
|
*/
|
||||||
public function getBrowser()
|
public function getBrowser()
|
||||||
{
|
{
|
||||||
return strtolower($this->useragent['browser']);
|
return strtolower($this->useragent['browser']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current platform identifier
|
||||||
|
*
|
||||||
|
* Currently detected platforms:
|
||||||
|
*
|
||||||
|
* Desktop
|
||||||
|
* -> Windows
|
||||||
|
* -> Linux
|
||||||
|
* -> Macintosh
|
||||||
|
* -> Chrome OS
|
||||||
|
* Mobile
|
||||||
|
* -> Android
|
||||||
|
* -> iPhone
|
||||||
|
* -> iPad / iPod Touch
|
||||||
|
* -> Windows Phone OS
|
||||||
|
* -> Kindle
|
||||||
|
* -> Kindle Fire
|
||||||
|
* -> BlackBerry
|
||||||
|
* -> Playbook
|
||||||
|
* -> Tizen
|
||||||
|
* Console
|
||||||
|
* -> Nintendo 3DS
|
||||||
|
* -> New Nintendo 3DS
|
||||||
|
* -> Nintendo Wii
|
||||||
|
* -> Nintendo WiiU
|
||||||
|
* -> PlayStation 3
|
||||||
|
* -> PlayStation 4
|
||||||
|
* -> PlayStation Vita
|
||||||
|
* -> Xbox 360
|
||||||
|
* -> Xbox One
|
||||||
|
*
|
||||||
|
* @return string the lowercase platform name
|
||||||
|
*/
|
||||||
public function getPlatform()
|
public function getPlatform()
|
||||||
{
|
{
|
||||||
return strtolower($this->useragent['platform']);
|
return strtolower($this->useragent['platform']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current full version identifier
|
||||||
|
*
|
||||||
|
* @return string the browser full version identifier
|
||||||
|
*/
|
||||||
public function getLongVersion()
|
public function getLongVersion()
|
||||||
{
|
{
|
||||||
return $this->useragent['version'];
|
return $this->useragent['version'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current major version identifier
|
||||||
|
*
|
||||||
|
* @return string the browser major version identifier
|
||||||
|
*/
|
||||||
public function getVersion()
|
public function getVersion()
|
||||||
{
|
{
|
||||||
$version = explode('.', $this->getLongVersion());
|
$version = explode('.', $this->getLongVersion());
|
||||||
|
|
||||||
return intval($version[0]);
|
return intval($version[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the request comes from a human, or from a bot/crawler
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isHuman()
|
||||||
|
{
|
||||||
|
$browser = $this->getBrowser();
|
||||||
|
if (empty($browser)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('~(bot|crawl)~i', $browser)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Grav\Common;
|
namespace Grav\Common;
|
||||||
|
|
||||||
use \Doctrine\Common\Cache\Cache as DoctrineCache;
|
use \Doctrine\Common\Cache as DoctrineCache;
|
||||||
use Grav\Common\Config\Config;
|
use Grav\Common\Config\Config;
|
||||||
use Grav\Common\Filesystem\Folder;
|
use Grav\Common\Filesystem\Folder;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The GravCache object is used throughout Grav to store and retrieve cached data.
|
* The GravCache object is used throughout Grav to store and retrieve cached data.
|
||||||
@@ -16,7 +17,7 @@ use Grav\Common\Filesystem\Folder;
|
|||||||
* MemCacheD
|
* MemCacheD
|
||||||
* FileSystem
|
* FileSystem
|
||||||
*
|
*
|
||||||
* @author RocketTheme
|
* @author RocketTheme
|
||||||
* @license MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
class Cache extends Getters
|
class Cache extends Getters
|
||||||
@@ -29,13 +30,18 @@ class Cache extends Getters
|
|||||||
protected $lifetime;
|
protected $lifetime;
|
||||||
protected $now;
|
protected $now;
|
||||||
|
|
||||||
|
/** @var Config $config */
|
||||||
protected $config;
|
protected $config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var DoctrineCache
|
* @var DoctrineCache\CacheProvider
|
||||||
*/
|
*/
|
||||||
protected $driver;
|
protected $driver;
|
||||||
|
|
||||||
|
protected $driver_name;
|
||||||
|
|
||||||
|
protected $driver_setting;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
@@ -44,36 +50,36 @@ class Cache extends Getters
|
|||||||
protected $cache_dir;
|
protected $cache_dir;
|
||||||
|
|
||||||
protected static $standard_remove = [
|
protected static $standard_remove = [
|
||||||
'cache/twig/',
|
'cache://twig/',
|
||||||
'cache/doctrine/',
|
'cache://doctrine/',
|
||||||
'cache/compiled/',
|
'cache://compiled/',
|
||||||
'cache/validated-',
|
'cache://validated-',
|
||||||
'images/',
|
'cache://images',
|
||||||
'assets/',
|
'asset://',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static $all_remove = [
|
protected static $all_remove = [
|
||||||
'cache/',
|
'cache://',
|
||||||
'images/',
|
'cache://images',
|
||||||
'assets/'
|
'asset://'
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static $assets_remove = [
|
protected static $assets_remove = [
|
||||||
'assets/'
|
'asset://'
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static $images_remove = [
|
protected static $images_remove = [
|
||||||
'images/'
|
'cache://images'
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static $cache_remove = [
|
protected static $cache_remove = [
|
||||||
'cache/'
|
'cache://'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @params Grav $grav
|
* @param Grav $grav
|
||||||
*/
|
*/
|
||||||
public function __construct(Grav $grav)
|
public function __construct(Grav $grav)
|
||||||
{
|
{
|
||||||
@@ -84,6 +90,7 @@ class Cache extends Getters
|
|||||||
* Initialization that sets a base key and the driver based on configuration settings
|
* Initialization that sets a base key and the driver based on configuration settings
|
||||||
*
|
*
|
||||||
* @param Grav $grav
|
* @param Grav $grav
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function init(Grav $grav)
|
public function init(Grav $grav)
|
||||||
@@ -99,15 +106,22 @@ class Cache extends Getters
|
|||||||
|
|
||||||
$prefix = $this->config->get('system.cache.prefix');
|
$prefix = $this->config->get('system.cache.prefix');
|
||||||
|
|
||||||
$this->enabled = (bool) $this->config->get('system.cache.enabled');
|
$this->enabled = (bool)$this->config->get('system.cache.enabled');
|
||||||
|
|
||||||
// Cache key allows us to invalidate all cache on configuration changes.
|
// Cache key allows us to invalidate all cache on configuration changes.
|
||||||
$this->key = substr(md5(($prefix ? $prefix : 'g') . $uri->rootUrl(true) . $this->config->key() . GRAV_VERSION), 2, 8);
|
$this->key = ($prefix ? $prefix : 'g') . '-' . substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION),
|
||||||
|
2, 8);
|
||||||
|
|
||||||
|
$this->driver_setting = $this->config->get('system.cache.driver');
|
||||||
|
|
||||||
$this->driver = $this->getCacheDriver();
|
$this->driver = $this->getCacheDriver();
|
||||||
|
|
||||||
// Set the cache namespace to our unique key
|
// Set the cache namespace to our unique key
|
||||||
$this->driver->setNamespace($this->key);
|
$this->driver->setNamespace($this->key);
|
||||||
|
|
||||||
|
// Dump Cache state
|
||||||
|
$grav['debugger']->addMessage('Cache: [' . ($this->enabled ? 'true' : 'false') . '] Setting: [' . $this->driver_setting . '] Driver: [' . $this->driver_name . ']');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,15 +129,17 @@ class Cache extends Getters
|
|||||||
* If there is no config option for $driver in the config, or it's set to 'auto', it will
|
* If there is no config option for $driver in the config, or it's set to 'auto', it will
|
||||||
* pick the best option based on which cache extensions are installed.
|
* pick the best option based on which cache extensions are installed.
|
||||||
*
|
*
|
||||||
* @return DoctrineCacheDriver The cache driver to use
|
* @return DoctrineCache\CacheProvider The cache driver to use
|
||||||
*/
|
*/
|
||||||
public function getCacheDriver()
|
public function getCacheDriver()
|
||||||
{
|
{
|
||||||
$setting = $this->config->get('system.cache.driver');
|
$setting = $this->driver_setting;
|
||||||
$driver_name = 'file';
|
$driver_name = 'file';
|
||||||
|
|
||||||
if (!$setting || $setting == 'auto') {
|
if (!$setting || $setting == 'auto') {
|
||||||
if (extension_loaded('apc')) {
|
if (extension_loaded('apcu')) {
|
||||||
|
$driver_name = 'apcu';
|
||||||
|
} elseif (extension_loaded('apc')) {
|
||||||
$driver_name = 'apc';
|
$driver_name = 'apc';
|
||||||
} elseif (extension_loaded('wincache')) {
|
} elseif (extension_loaded('wincache')) {
|
||||||
$driver_name = 'wincache';
|
$driver_name = 'wincache';
|
||||||
@@ -134,29 +150,44 @@ class Cache extends Getters
|
|||||||
$driver_name = $setting;
|
$driver_name = $setting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->driver_name = $driver_name;
|
||||||
|
|
||||||
switch ($driver_name) {
|
switch ($driver_name) {
|
||||||
case 'apc':
|
case 'apc':
|
||||||
$driver = new \Doctrine\Common\Cache\ApcCache();
|
$driver = new DoctrineCache\ApcCache();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'apcu':
|
||||||
|
$driver = new DoctrineCache\ApcuCache();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'wincache':
|
case 'wincache':
|
||||||
$driver = new \Doctrine\Common\Cache\WinCacheCache();
|
$driver = new DoctrineCache\WinCacheCache();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'xcache':
|
case 'xcache':
|
||||||
$driver = new \Doctrine\Common\Cache\XcacheCache();
|
$driver = new DoctrineCache\XcacheCache();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'memcache':
|
case 'memcache':
|
||||||
$memcache = new \Memcache();
|
$memcache = new \Memcache();
|
||||||
$memcache->connect($this->config->get('system.cache.memcache.server','localhost'),
|
$memcache->connect($this->config->get('system.cache.memcache.server', 'localhost'),
|
||||||
$this->config->get('system.cache.memcache.port', 11211));
|
$this->config->get('system.cache.memcache.port', 11211));
|
||||||
$driver = new \Doctrine\Common\Cache\MemcacheCache();
|
$driver = new DoctrineCache\MemcacheCache();
|
||||||
$driver->setMemcache($memcache);
|
$driver->setMemcache($memcache);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'redis':
|
||||||
|
$redis = new \Redis();
|
||||||
|
$redis->connect($this->config->get('system.cache.redis.server', 'localhost'),
|
||||||
|
$this->config->get('system.cache.redis.port', 6379));
|
||||||
|
|
||||||
|
$driver = new DoctrineCache\RedisCache();
|
||||||
|
$driver->setRedis($redis);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
$driver = new \Doctrine\Common\Cache\FilesystemCache($this->cache_dir);
|
$driver = new DoctrineCache\FilesystemCache($this->cache_dir);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,6 +198,7 @@ class Cache extends Getters
|
|||||||
* Gets a cached entry if it exists based on an id. If it does not exist, it returns false
|
* Gets a cached entry if it exists based on an id. If it does not exist, it returns false
|
||||||
*
|
*
|
||||||
* @param string $id the id of the cached entry
|
* @param string $id the id of the cached entry
|
||||||
|
*
|
||||||
* @return object returns the cached entry, can be any type, or false if doesn't exist
|
* @return object returns the cached entry, can be any type, or false if doesn't exist
|
||||||
*/
|
*/
|
||||||
public function fetch($id)
|
public function fetch($id)
|
||||||
@@ -181,9 +213,9 @@ class Cache extends Getters
|
|||||||
/**
|
/**
|
||||||
* Stores a new cached entry.
|
* Stores a new cached entry.
|
||||||
*
|
*
|
||||||
* @param string $id the id of the cached entry
|
* @param string $id the id of the cached entry
|
||||||
* @param array|object $data the data for the cached entry to store
|
* @param array|object $data the data for the cached entry to store
|
||||||
* @param int $lifetime the lifetime to store the entry in seconds
|
* @param int $lifetime the lifetime to store the entry in seconds
|
||||||
*/
|
*/
|
||||||
public function save($id, $data, $lifetime = null)
|
public function save($id, $data, $lifetime = null)
|
||||||
{
|
{
|
||||||
@@ -195,6 +227,34 @@ class Cache extends Getters
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes an item in the cache based on the id
|
||||||
|
*
|
||||||
|
* @param string $id the id of the cached data entry
|
||||||
|
* @return bool true if the item was deleted successfully
|
||||||
|
*/
|
||||||
|
public function delete($id)
|
||||||
|
{
|
||||||
|
if ($this->enabled) {
|
||||||
|
return $this->driver->delete($id);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a boolean state of whether or not the item exists in the cache based on id key
|
||||||
|
*
|
||||||
|
* @param string $id the id of the cached data entry
|
||||||
|
* @return bool true if the cached items exists
|
||||||
|
*/
|
||||||
|
public function contains($id)
|
||||||
|
{
|
||||||
|
if ($this->enabled) {
|
||||||
|
return $this->driver->contains(($id));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getter method to get the cache key
|
* Getter method to get the cache key
|
||||||
*/
|
*/
|
||||||
@@ -203,20 +263,29 @@ class Cache extends Getters
|
|||||||
return $this->key;
|
return $this->key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter method to set key (Advanced)
|
||||||
|
*/
|
||||||
|
public function setKey($key)
|
||||||
|
{
|
||||||
|
$this->key = $key;
|
||||||
|
$this->driver->setNamespace($this->key);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to clear all Grav caches
|
* Helper method to clear all Grav caches
|
||||||
*
|
*
|
||||||
* @param string $remove standard|all|assets-only|images-only|cache-only
|
* @param string $remove standard|all|assets-only|images-only|cache-only
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function clearCache($remove = 'standard')
|
public static function clearCache($remove = 'standard')
|
||||||
{
|
{
|
||||||
|
$locator = Grav::instance()['locator'];
|
||||||
$output = [];
|
$output = [];
|
||||||
$user_config = USER_DIR . 'config/system.yaml';
|
$user_config = USER_DIR . 'config/system.yaml';
|
||||||
|
|
||||||
switch($remove) {
|
switch ($remove) {
|
||||||
case 'all':
|
case 'all':
|
||||||
$remove_paths = self::$all_remove;
|
$remove_paths = self::$all_remove;
|
||||||
break;
|
break;
|
||||||
@@ -234,26 +303,34 @@ class Cache extends Getters
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach ($remove_paths as $path) {
|
foreach ($remove_paths as $stream) {
|
||||||
|
|
||||||
|
// Convert stream to a real path
|
||||||
|
$path = $locator->findResource($stream, true, true);
|
||||||
|
// Make sure path exists before proceeding, otherwise we would wipe ROOT_DIR
|
||||||
|
if (!$path) {
|
||||||
|
throw new \RuntimeException("Stream '{$stream}' not found", 500);
|
||||||
|
}
|
||||||
|
|
||||||
$anything = false;
|
$anything = false;
|
||||||
$files = glob(ROOT_DIR . $path . '*');
|
$files = glob($path . '/*');
|
||||||
|
|
||||||
foreach ($files as $file) {
|
if (is_array($files)) {
|
||||||
if (is_file($file)) {
|
foreach ($files as $file) {
|
||||||
if (@unlink($file)) {
|
if (is_file($file)) {
|
||||||
$anything = true;
|
if (@unlink($file)) {
|
||||||
}
|
$anything = true;
|
||||||
} elseif (is_dir($file)) {
|
}
|
||||||
if (@Folder::delete($file)) {
|
} elseif (is_dir($file)) {
|
||||||
$anything = true;
|
if (Folder::delete($file)) {
|
||||||
|
$anything = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($anything) {
|
if ($anything) {
|
||||||
$output[] = '<red>Cleared: </red>' . $path . '*';
|
$output[] = '<red>Cleared: </red>' . $path . '/*';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,7 +348,7 @@ class Cache extends Getters
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the cache lifetime programatically
|
* Set the cache lifetime programmatically
|
||||||
*
|
*
|
||||||
* @param int $future timestamp
|
* @param int $future timestamp
|
||||||
*/
|
*/
|
||||||
|
|||||||
60
system/src/Grav/Common/Composer.php
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Grav\Common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offers composer helper methods.
|
||||||
|
*
|
||||||
|
* @author eschmar
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
class Composer
|
||||||
|
{
|
||||||
|
/** @const Default composer location */
|
||||||
|
const DEFAULT_PATH = "bin/composer.phar";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the location of composer.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getComposerLocation()
|
||||||
|
{
|
||||||
|
if (!function_exists('shell_exec') || strtolower(substr(PHP_OS, 0, 3)) === 'win') {
|
||||||
|
return self::DEFAULT_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for global composer install
|
||||||
|
$path = trim(shell_exec("command -v composer"));
|
||||||
|
|
||||||
|
// fall back to grav bundled composer
|
||||||
|
if (!$path || !preg_match('/(composer|composer\.phar)$/', $path)) {
|
||||||
|
$path = self::DEFAULT_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the composer executable file path
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getComposerExecutor()
|
||||||
|
{
|
||||||
|
$executor = PHP_BINARY . ' ';
|
||||||
|
$composer = static::getComposerLocation();
|
||||||
|
|
||||||
|
if ($composer !== static::DEFAULT_PATH && is_executable($composer)) {
|
||||||
|
$file = fopen($composer, 'r');
|
||||||
|
$firstLine = fgets($file);
|
||||||
|
fclose($file);
|
||||||
|
|
||||||
|
if (!preg_match('/^#!.+php/i', $firstLine)) {
|
||||||
|
$executor = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $executor . $composer;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,207 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Grav\Common\Config;
|
|
||||||
|
|
||||||
use Grav\Common\File\CompiledYamlFile;
|
|
||||||
use Grav\Common\Grav;
|
|
||||||
use Grav\Common\Filesystem\Folder;
|
|
||||||
use RocketTheme\Toolbox\Blueprints\Blueprints as BaseBlueprints;
|
|
||||||
use RocketTheme\Toolbox\File\PhpFile;
|
|
||||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Blueprints class contains configuration rules.
|
|
||||||
*
|
|
||||||
* @author RocketTheme
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
class Blueprints extends BaseBlueprints
|
|
||||||
{
|
|
||||||
protected $grav;
|
|
||||||
protected $files = [];
|
|
||||||
protected $blueprints;
|
|
||||||
|
|
||||||
public function __construct(array $serialized = null, Grav $grav = null)
|
|
||||||
{
|
|
||||||
parent::__construct($serialized);
|
|
||||||
$this->grav = $grav ?: Grav::instance();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function init()
|
|
||||||
{
|
|
||||||
/** @var UniformResourceLocator $locator */
|
|
||||||
$locator = $this->grav['locator'];
|
|
||||||
|
|
||||||
$blueprints = $locator->findResources('blueprints://config');
|
|
||||||
$plugins = $locator->findResources('plugins://');
|
|
||||||
|
|
||||||
$blueprintFiles = $this->getBlueprintFiles($blueprints, $plugins);
|
|
||||||
|
|
||||||
$this->loadCompiledBlueprints($plugins + $blueprints, $blueprintFiles);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function loadCompiledBlueprints($blueprints, $blueprintFiles)
|
|
||||||
{
|
|
||||||
$checksum = md5(serialize($blueprints));
|
|
||||||
$filename = CACHE_DIR . 'compiled/blueprints/' . $checksum .'.php';
|
|
||||||
$checksum .= ':'.md5(serialize($blueprintFiles));
|
|
||||||
$class = get_class($this);
|
|
||||||
$file = PhpFile::instance($filename);
|
|
||||||
|
|
||||||
if ($file->exists()) {
|
|
||||||
$cache = $file->exists() ? $file->content() : null;
|
|
||||||
} else {
|
|
||||||
$cache = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Load real file if cache isn't up to date (or is invalid).
|
|
||||||
if (
|
|
||||||
!is_array($cache)
|
|
||||||
|| empty($cache['checksum'])
|
|
||||||
|| empty($cache['$class'])
|
|
||||||
|| $cache['checksum'] != $checksum
|
|
||||||
|| $cache['@class'] != $class
|
|
||||||
) {
|
|
||||||
// Attempt to lock the file for writing.
|
|
||||||
$file->lock(false);
|
|
||||||
|
|
||||||
// Load blueprints.
|
|
||||||
$this->blueprints = new Blueprints();
|
|
||||||
foreach ($blueprintFiles as $key => $files) {
|
|
||||||
$this->loadBlueprints($key);
|
|
||||||
}
|
|
||||||
|
|
||||||
$cache = [
|
|
||||||
'@class' => $class,
|
|
||||||
'checksum' => $checksum,
|
|
||||||
'files' => $blueprintFiles,
|
|
||||||
'data' => $this->blueprints->toArray()
|
|
||||||
];
|
|
||||||
|
|
||||||
// If compiled file wasn't already locked by another process, save it.
|
|
||||||
if ($file->locked() !== false) {
|
|
||||||
$file->save($cache);
|
|
||||||
$file->unlock();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->blueprints = new Blueprints($cache['data']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load global blueprints.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param array $files
|
|
||||||
*/
|
|
||||||
public function loadBlueprints($key, array $files = null)
|
|
||||||
{
|
|
||||||
if (is_null($files)) {
|
|
||||||
$files = $this->files[$key];
|
|
||||||
}
|
|
||||||
foreach ($files as $name => $item) {
|
|
||||||
$file = CompiledYamlFile::instance($item['file']);
|
|
||||||
$this->blueprints->embed($name, $file->content(), '/');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all blueprint files (including plugins).
|
|
||||||
*
|
|
||||||
* @param array $blueprints
|
|
||||||
* @param array $plugins
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function getBlueprintFiles(array $blueprints, array $plugins)
|
|
||||||
{
|
|
||||||
$list = [];
|
|
||||||
foreach (array_reverse($plugins) as $folder) {
|
|
||||||
$list += $this->detectPlugins($folder, true);
|
|
||||||
}
|
|
||||||
foreach (array_reverse($blueprints) as $folder) {
|
|
||||||
$list += $this->detectConfig($folder, true);
|
|
||||||
}
|
|
||||||
return $list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detects all plugins with a configuration file and returns last modification time.
|
|
||||||
*
|
|
||||||
* @param string $lookup Location to look up from.
|
|
||||||
* @param bool $blueprints
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function detectPlugins($lookup = SYSTEM_DIR, $blueprints = false)
|
|
||||||
{
|
|
||||||
$find = $blueprints ? 'blueprints.yaml' : '.yaml';
|
|
||||||
$location = $blueprints ? 'blueprintFiles' : 'configFiles';
|
|
||||||
$path = trim(Folder::getRelativePath($lookup), '/');
|
|
||||||
if (isset($this->{$location}[$path])) {
|
|
||||||
return [$path => $this->{$location}[$path]];
|
|
||||||
}
|
|
||||||
|
|
||||||
$list = [];
|
|
||||||
|
|
||||||
if (is_dir($lookup)) {
|
|
||||||
$iterator = new \DirectoryIterator($lookup);
|
|
||||||
|
|
||||||
/** @var \DirectoryIterator $directory */
|
|
||||||
foreach ($iterator as $directory) {
|
|
||||||
if (!$directory->isDir() || $directory->isDot()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$name = $directory->getBasename();
|
|
||||||
$filename = "{$path}/{$name}/" . ($find && $find[0] != '.' ? $find : $name . $find);
|
|
||||||
|
|
||||||
if (is_file($filename)) {
|
|
||||||
$list["plugins/{$name}"] = ['file' => $filename, 'modified' => filemtime($filename)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->{$location}[$path] = $list;
|
|
||||||
|
|
||||||
return [$path => $list];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detects all plugins with a configuration file and returns last modification time.
|
|
||||||
*
|
|
||||||
* @param string $lookup Location to look up from.
|
|
||||||
* @param bool $blueprints
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function detectConfig($lookup = SYSTEM_DIR, $blueprints = false)
|
|
||||||
{
|
|
||||||
$location = $blueprints ? 'blueprintFiles' : 'configFiles';
|
|
||||||
$path = trim(Folder::getRelativePath($lookup), '/');
|
|
||||||
if (isset($this->{$location}[$path])) {
|
|
||||||
return [$path => $this->{$location}[$path]];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_dir($lookup)) {
|
|
||||||
// Find all system and user configuration files.
|
|
||||||
$options = [
|
|
||||||
'compare' => 'Filename',
|
|
||||||
'pattern' => '|\.yaml$|',
|
|
||||||
'filters' => [
|
|
||||||
'key' => '|\.yaml$|',
|
|
||||||
'value' => function (\RecursiveDirectoryIterator $file) use ($path) {
|
|
||||||
return ['file' => "{$path}/{$file->getSubPathname()}", 'modified' => $file->getMTime()];
|
|
||||||
}],
|
|
||||||
'key' => 'SubPathname'
|
|
||||||
];
|
|
||||||
|
|
||||||
$list = Folder::all($lookup, $options);
|
|
||||||
} else {
|
|
||||||
$list = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->{$location}[$path] = $list;
|
|
||||||
|
|
||||||
return [$path => $list];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
243
system/src/Grav/Common/Config/CompiledBase.php
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use RocketTheme\Toolbox\File\PhpFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Compiled base class.
|
||||||
|
*/
|
||||||
|
abstract class CompiledBase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var int Version number for the compiled file.
|
||||||
|
*/
|
||||||
|
public $version = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string Filename (base name) of the compiled configuration.
|
||||||
|
*/
|
||||||
|
public $name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|bool Configuration checksum.
|
||||||
|
*/
|
||||||
|
public $checksum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string Cache folder to be used.
|
||||||
|
*/
|
||||||
|
protected $cacheFolder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array List of files to load.
|
||||||
|
*/
|
||||||
|
protected $files;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var mixed Configuration object.
|
||||||
|
*/
|
||||||
|
protected $object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $cacheFolder Cache folder to be used.
|
||||||
|
* @param array $files List of files as returned from ConfigFileFinder class.
|
||||||
|
* @param string $path Base path for the file list.
|
||||||
|
* @throws \BadMethodCallException
|
||||||
|
*/
|
||||||
|
public function __construct($cacheFolder, array $files, $path)
|
||||||
|
{
|
||||||
|
if (!$cacheFolder) {
|
||||||
|
throw new \BadMethodCallException('Cache folder not defined.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->cacheFolder = $cacheFolder;
|
||||||
|
$this->files = $files;
|
||||||
|
$this->path = $path ? rtrim($path, '\\/') . '/' : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get filename for the compiled PHP file.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function name($name = null)
|
||||||
|
{
|
||||||
|
if (!$this->name) {
|
||||||
|
$this->name = $name ?: md5(json_encode(array_keys($this->files)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function gets called when cached configuration is saved.
|
||||||
|
*/
|
||||||
|
public function modified() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the configuration.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function load()
|
||||||
|
{
|
||||||
|
if ($this->object) {
|
||||||
|
return $this->object;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filename = $this->createFilename();
|
||||||
|
if (!$this->loadCompiledFile($filename) && $this->loadFiles()) {
|
||||||
|
$this->saveCompiledFile($filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns checksum from the configuration files.
|
||||||
|
*
|
||||||
|
* You can set $this->checksum = false to disable this check.
|
||||||
|
*
|
||||||
|
* @return bool|string
|
||||||
|
*/
|
||||||
|
public function checksum()
|
||||||
|
{
|
||||||
|
if (!isset($this->checksum)) {
|
||||||
|
$this->checksum = md5(json_encode($this->files) . $this->version);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function createFilename()
|
||||||
|
{
|
||||||
|
return "{$this->cacheFolder}/{$this->name()->name}.php";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create configuration object.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
abstract protected function createObject(array $data = []);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalize configuration object.
|
||||||
|
*/
|
||||||
|
abstract protected function finalizeObject();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load single configuration file and append it to the correct position.
|
||||||
|
*
|
||||||
|
* @param string $name Name of the position.
|
||||||
|
* @param string $filename File to be loaded.
|
||||||
|
*/
|
||||||
|
abstract protected function loadFile($name, $filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and join all configuration files.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function loadFiles()
|
||||||
|
{
|
||||||
|
$this->createObject();
|
||||||
|
|
||||||
|
$list = array_reverse($this->files);
|
||||||
|
foreach ($list as $files) {
|
||||||
|
foreach ($files as $name => $item) {
|
||||||
|
$this->loadFile($name, $this->path . $item['file']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->finalizeObject();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load compiled file.
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* @return bool
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function loadCompiledFile($filename)
|
||||||
|
{
|
||||||
|
if (!file_exists($filename)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cache = include $filename;
|
||||||
|
if (
|
||||||
|
!is_array($cache)
|
||||||
|
|| !isset($cache['checksum'])
|
||||||
|
|| !isset($cache['data'])
|
||||||
|
|| !isset($cache['@class'])
|
||||||
|
|| $cache['@class'] != get_class($this)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load real file if cache isn't up to date (or is invalid).
|
||||||
|
if ($cache['checksum'] !== $this->checksum()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->createObject($cache['data']);
|
||||||
|
|
||||||
|
$this->finalizeObject();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save compiled file.
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* @throws \RuntimeException
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function saveCompiledFile($filename)
|
||||||
|
{
|
||||||
|
$file = PhpFile::instance($filename);
|
||||||
|
|
||||||
|
// Attempt to lock the file for writing.
|
||||||
|
try {
|
||||||
|
$file->lock(false);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// Another process has locked the file; we will check this in a bit.
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($file->locked() === false) {
|
||||||
|
// File was already locked by another process.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cache = [
|
||||||
|
'@class' => get_class($this),
|
||||||
|
'timestamp' => time(),
|
||||||
|
'checksum' => $this->checksum(),
|
||||||
|
'files' => $this->files,
|
||||||
|
'data' => $this->getState()
|
||||||
|
];
|
||||||
|
|
||||||
|
$file->save($cache);
|
||||||
|
$file->unlock();
|
||||||
|
$file->free();
|
||||||
|
|
||||||
|
$this->modified();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getState()
|
||||||
|
{
|
||||||
|
return $this->object->toArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
112
system/src/Grav/Common/Config/CompiledBlueprints.php
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use Grav\Common\Data\Blueprint;
|
||||||
|
use Grav\Common\Data\BlueprintSchema;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Compiled Blueprints class.
|
||||||
|
*/
|
||||||
|
class CompiledBlueprints extends CompiledBase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var int Version number for the compiled file.
|
||||||
|
*/
|
||||||
|
public $version = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var BlueprintSchema Blueprints object.
|
||||||
|
*/
|
||||||
|
protected $object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns checksum from the configuration files.
|
||||||
|
*
|
||||||
|
* You can set $this->checksum = false to disable this check.
|
||||||
|
*
|
||||||
|
* @return bool|string
|
||||||
|
*/
|
||||||
|
public function checksum()
|
||||||
|
{
|
||||||
|
if (!isset($this->checksum)) {
|
||||||
|
$this->checksum = md5(json_encode($this->files) . json_encode($this->getTypes()) . $this->version);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create configuration object.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
protected function createObject(array $data = [])
|
||||||
|
{
|
||||||
|
$this->object = (new BlueprintSchema($data))->setTypes($this->getTypes());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get list of form field types.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getTypes()
|
||||||
|
{
|
||||||
|
return Grav::instance()['plugins']->formFieldTypes ?: [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalize configuration object.
|
||||||
|
*/
|
||||||
|
protected function finalizeObject()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load single configuration file and append it to the correct position.
|
||||||
|
*
|
||||||
|
* @param string $name Name of the position.
|
||||||
|
* @param array $files Files to be loaded.
|
||||||
|
*/
|
||||||
|
protected function loadFile($name, $files)
|
||||||
|
{
|
||||||
|
// Load blueprint file.
|
||||||
|
$blueprint = new Blueprint($files);
|
||||||
|
|
||||||
|
$this->object->embed($name, $blueprint->load()->toArray(), '/', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and join all configuration files.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function loadFiles()
|
||||||
|
{
|
||||||
|
$this->createObject();
|
||||||
|
|
||||||
|
// Convert file list into parent list.
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->files as $files) {
|
||||||
|
foreach ($files as $name => $item) {
|
||||||
|
$list[$name][] = $this->path . $item['file'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load files.
|
||||||
|
foreach ($list as $name => $files) {
|
||||||
|
$this->loadFile($name, $files);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->finalizeObject();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getState()
|
||||||
|
{
|
||||||
|
return $this->object->getState();
|
||||||
|
}
|
||||||
|
}
|
||||||
98
system/src/Grav/Common/Config/CompiledConfig.php
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use Grav\Common\File\CompiledYamlFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Compiled Configuration class.
|
||||||
|
*/
|
||||||
|
class CompiledConfig extends CompiledBase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var int Version number for the compiled file.
|
||||||
|
*/
|
||||||
|
public $version = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Config Configuration object.
|
||||||
|
*/
|
||||||
|
protected $object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var callable Blueprints loader.
|
||||||
|
*/
|
||||||
|
protected $callable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $withDefaults;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set blueprints for the configuration.
|
||||||
|
*
|
||||||
|
* @param callable $blueprints
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setBlueprints(callable $blueprints)
|
||||||
|
{
|
||||||
|
$this->callable = $blueprints;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $withDefaults
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function load($withDefaults = false)
|
||||||
|
{
|
||||||
|
$this->withDefaults = $withDefaults;
|
||||||
|
|
||||||
|
return parent::load();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create configuration object.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
protected function createObject(array $data = [])
|
||||||
|
{
|
||||||
|
if ($this->withDefaults && empty($data) && is_callable($this->callable)) {
|
||||||
|
$blueprints = $this->callable;
|
||||||
|
$data = $blueprints()->getDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->object = new Config($data, $this->callable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalize configuration object.
|
||||||
|
*/
|
||||||
|
protected function finalizeObject()
|
||||||
|
{
|
||||||
|
$this->object->checksum($this->checksum());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function gets called when cached configuration is saved.
|
||||||
|
*/
|
||||||
|
public function modified()
|
||||||
|
{
|
||||||
|
$this->object->modified(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load single configuration file and append it to the correct position.
|
||||||
|
*
|
||||||
|
* @param string $name Name of the position.
|
||||||
|
* @param string $filename File to be loaded.
|
||||||
|
*/
|
||||||
|
protected function loadFile($name, $filename)
|
||||||
|
{
|
||||||
|
$file = CompiledYamlFile::instance($filename);
|
||||||
|
$this->object->join($name, $file->content(), '/');
|
||||||
|
$file->free();
|
||||||
|
}
|
||||||
|
}
|
||||||
64
system/src/Grav/Common/Config/CompiledLanguages.php
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use Grav\Common\File\CompiledYamlFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Compiled Languages class.
|
||||||
|
*/
|
||||||
|
class CompiledLanguages extends CompiledBase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var int Version number for the compiled file.
|
||||||
|
*/
|
||||||
|
public $version = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Languages Configuration object.
|
||||||
|
*/
|
||||||
|
protected $object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create configuration object.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
protected function createObject(array $data = [])
|
||||||
|
{
|
||||||
|
$this->object = new Languages($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalize configuration object.
|
||||||
|
*/
|
||||||
|
protected function finalizeObject()
|
||||||
|
{
|
||||||
|
$this->object->checksum($this->checksum());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function gets called when cached configuration is saved.
|
||||||
|
*/
|
||||||
|
public function modified()
|
||||||
|
{
|
||||||
|
$this->object->modified(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load single configuration file and append it to the correct position.
|
||||||
|
*
|
||||||
|
* @param string $name Name of the position.
|
||||||
|
* @param string $filename File to be loaded.
|
||||||
|
*/
|
||||||
|
protected function loadFile($name, $filename)
|
||||||
|
{
|
||||||
|
$file = CompiledYamlFile::instance($filename);
|
||||||
|
if (preg_match('|languages\.yaml$|', $filename)) {
|
||||||
|
$this->object->mergeRecursive($file->content());
|
||||||
|
} else {
|
||||||
|
$this->object->join($name, $file->content(), '/');
|
||||||
|
}
|
||||||
|
$file->free();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Grav\Common\Config;
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
use Grav\Common\File\CompiledYamlFile;
|
use Grav\Common\Debugger;
|
||||||
use Grav\Common\Grav;
|
use Grav\Common\Grav;
|
||||||
use Grav\Common\Data\Data;
|
use Grav\Common\Data\Data;
|
||||||
use RocketTheme\Toolbox\Blueprints\Blueprints;
|
use Grav\Common\Service\ConfigServiceProvider;
|
||||||
use RocketTheme\Toolbox\File\PhpFile;
|
|
||||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Config class contains configuration information.
|
* The Config class contains configuration information.
|
||||||
@@ -16,368 +14,84 @@ use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
|||||||
*/
|
*/
|
||||||
class Config extends Data
|
class Config extends Data
|
||||||
{
|
{
|
||||||
protected $grav;
|
|
||||||
protected $streams = [
|
|
||||||
'system' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['system'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'user' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['user'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'blueprints' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['user://blueprints', 'system/blueprints'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'config' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['user://config', 'system/config'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'plugins' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['user://plugins'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'plugin' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['user://plugins'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'themes' => [
|
|
||||||
'type' => 'ReadOnlyStream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['user://themes'],
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'cache' => [
|
|
||||||
'type' => 'Stream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['cache'],
|
|
||||||
'images' => ['images']
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'log' => [
|
|
||||||
'type' => 'Stream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['logs']
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'backup' => [
|
|
||||||
'type' => 'Stream',
|
|
||||||
'prefixes' => [
|
|
||||||
'' => ['backup']
|
|
||||||
]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $setup = [];
|
|
||||||
|
|
||||||
protected $blueprintFiles = [];
|
|
||||||
protected $configFiles = [];
|
|
||||||
protected $checksum;
|
protected $checksum;
|
||||||
protected $timestamp;
|
protected $modified = false;
|
||||||
|
|
||||||
protected $configLookup;
|
|
||||||
protected $blueprintLookup;
|
|
||||||
protected $pluginLookup;
|
|
||||||
|
|
||||||
protected $finder;
|
|
||||||
protected $environment;
|
|
||||||
protected $messages = [];
|
|
||||||
|
|
||||||
public function __construct(array $setup = array(), Grav $grav = null, $environment = null)
|
|
||||||
{
|
|
||||||
$this->grav = $grav ?: Grav::instance();
|
|
||||||
$this->finder = new ConfigFinder;
|
|
||||||
$this->environment = $environment ?: 'localhost';
|
|
||||||
$this->messages[] = 'Environment Name: ' . $this->environment;
|
|
||||||
|
|
||||||
// Make sure that
|
|
||||||
if (!isset($setup['streams']['schemes'])) {
|
|
||||||
$setup['streams']['schemes'] = [];
|
|
||||||
}
|
|
||||||
$setup['streams']['schemes'] += $this->streams;
|
|
||||||
|
|
||||||
$setup = $this->autoDetectEnvironmentConfig($setup);
|
|
||||||
$this->messages[] = $setup['streams']['schemes']['config']['prefixes'][''];
|
|
||||||
|
|
||||||
$this->setup = $setup;
|
|
||||||
parent::__construct($setup);
|
|
||||||
|
|
||||||
$this->check();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function key()
|
public function key()
|
||||||
{
|
{
|
||||||
return $this->checksum();
|
return $this->checksum();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function checksum($checksum = null)
|
||||||
|
{
|
||||||
|
if ($checksum !== null) {
|
||||||
|
$this->checksum = $checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function modified($modified = null)
|
||||||
|
{
|
||||||
|
if ($modified !== null) {
|
||||||
|
$this->modified = $modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->modified;
|
||||||
|
}
|
||||||
|
|
||||||
public function reload()
|
public function reload()
|
||||||
{
|
{
|
||||||
$this->items = $this->setup;
|
$grav = Grav::instance();
|
||||||
$this->check();
|
|
||||||
$this->init();
|
// Load new configuration.
|
||||||
$this->debug();
|
$config = ConfigServiceProvider::load($grav);
|
||||||
|
|
||||||
|
/** @var Debugger $debugger */
|
||||||
|
$debugger = $grav['debugger'];
|
||||||
|
|
||||||
|
if ($config->modified()) {
|
||||||
|
// Update current configuration.
|
||||||
|
$this->items = $config->toArray();
|
||||||
|
$this->checksum($config->checksum());
|
||||||
|
$this->modified(true);
|
||||||
|
|
||||||
|
$debugger->addMessage('Configuration was changed and saved.');
|
||||||
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function check()
|
|
||||||
{
|
|
||||||
$streams = isset($this->items['streams']['schemes']) ? $this->items['streams']['schemes'] : null;
|
|
||||||
if (!is_array($streams)) {
|
|
||||||
throw new \InvalidArgumentException('Configuration is missing streams.schemes!');
|
|
||||||
}
|
|
||||||
$diff = array_keys(array_diff_key($this->streams, $streams));
|
|
||||||
if ($diff) {
|
|
||||||
throw new \InvalidArgumentException(
|
|
||||||
sprintf('Configuration is missing keys %s from streams.schemes!', implode(', ', $diff))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function debug()
|
public function debug()
|
||||||
{
|
{
|
||||||
foreach ($this->messages as $message) {
|
/** @var Debugger $debugger */
|
||||||
$this->grav['debugger']->addMessage($message);
|
$debugger = Grav::instance()['debugger'];
|
||||||
|
|
||||||
|
$debugger->addMessage('Environment Name: ' . $this->environment);
|
||||||
|
if ($this->modified()) {
|
||||||
|
$debugger->addMessage('Configuration reloaded and cached.');
|
||||||
}
|
}
|
||||||
$this->messages = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function init()
|
public function init()
|
||||||
{
|
{
|
||||||
/** @var UniformResourceLocator $locator */
|
$setup = Grav::instance()['setup']->toArray();
|
||||||
$locator = $this->grav['locator'];
|
foreach ($setup as $key => $value) {
|
||||||
|
if ($key === 'streams' || !is_array($value)) {
|
||||||
$this->configLookup = $locator->findResources('config://');
|
// Optimized as streams and simple values are fully defined in setup.
|
||||||
$this->blueprintLookup = $locator->findResources('blueprints://config');
|
$this->items[$key] = $value;
|
||||||
$this->pluginLookup = $locator->findResources('plugins://');
|
} else {
|
||||||
|
$this->joinDefaults($key, $value);
|
||||||
$this->loadCompiledBlueprints($this->blueprintLookup, $this->pluginLookup, 'master');
|
|
||||||
$this->loadCompiledConfig($this->configLookup, $this->pluginLookup, 'master');
|
|
||||||
|
|
||||||
$this->initializeLocator($locator);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function checksum()
|
|
||||||
{
|
|
||||||
$checkBlueprints = $this->get('system.cache.check.blueprints', false);
|
|
||||||
$checkConfig = $this->get('system.cache.check.config', true);
|
|
||||||
$checkSystem = $this->get('system.cache.check.system', true);
|
|
||||||
|
|
||||||
if (!$checkBlueprints && !$checkConfig && !$checkSystem) {
|
|
||||||
$this->messages[] = 'Skip configuration timestamp check.';
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate checksum according to the configuration settings.
|
|
||||||
if (!$checkConfig) {
|
|
||||||
$this->messages[] = 'Check configuration timestamps from system.yaml files.';
|
|
||||||
// Just check changes in system.yaml files and ignore all the other files.
|
|
||||||
$cc = $checkSystem ? $this->finder->locateConfigFile($this->configLookup, 'system') : [];
|
|
||||||
} else {
|
|
||||||
$this->messages[] = 'Check configuration timestamps from all configuration files.';
|
|
||||||
// Check changes in all configuration files.
|
|
||||||
$cc = $this->finder->locateConfigFiles($this->configLookup, $this->pluginLookup);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($checkBlueprints) {
|
|
||||||
$this->messages[] = 'Check blueprint timestamps from all blueprint files.';
|
|
||||||
$cb = $this->finder->locateBlueprintFiles($this->blueprintLookup, $this->pluginLookup);
|
|
||||||
} else {
|
|
||||||
$cb = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return md5(json_encode([$cc, $cb]));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function autoDetectEnvironmentConfig($items)
|
|
||||||
{
|
|
||||||
$environment = $this->environment;
|
|
||||||
$env_stream = 'user://'.$environment.'/config';
|
|
||||||
|
|
||||||
if (file_exists(USER_DIR.$environment.'/config')) {
|
|
||||||
array_unshift($items['streams']['schemes']['config']['prefixes'][''], $env_stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $items;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function loadCompiledBlueprints($blueprints, $plugins, $filename = null)
|
|
||||||
{
|
|
||||||
$checksum = md5(json_encode($blueprints));
|
|
||||||
$filename = $filename
|
|
||||||
? CACHE_DIR . 'compiled/blueprints/' . $filename . '-' . $this->environment . '.php'
|
|
||||||
: CACHE_DIR . 'compiled/blueprints/' . $checksum . '-' . $this->environment . '.php';
|
|
||||||
$file = PhpFile::instance($filename);
|
|
||||||
$cache = $file->exists() ? $file->content() : null;
|
|
||||||
$blueprintFiles = $this->finder->locateBlueprintFiles($blueprints, $plugins);
|
|
||||||
$checksum .= ':'.md5(json_encode($blueprintFiles));
|
|
||||||
$class = get_class($this);
|
|
||||||
|
|
||||||
// Load real file if cache isn't up to date (or is invalid).
|
|
||||||
if (
|
|
||||||
!is_array($cache)
|
|
||||||
|| !isset($cache['checksum'])
|
|
||||||
|| !isset($cache['@class'])
|
|
||||||
|| $cache['checksum'] != $checksum
|
|
||||||
|| $cache['@class'] != $class
|
|
||||||
) {
|
|
||||||
// Attempt to lock the file for writing.
|
|
||||||
$file->lock(false);
|
|
||||||
|
|
||||||
// Load blueprints.
|
|
||||||
$this->blueprints = new Blueprints;
|
|
||||||
foreach ($blueprintFiles as $files) {
|
|
||||||
$this->loadBlueprintFiles($files);
|
|
||||||
}
|
|
||||||
|
|
||||||
$cache = [
|
|
||||||
'@class' => $class,
|
|
||||||
'checksum' => $checksum,
|
|
||||||
'files' => $blueprintFiles,
|
|
||||||
'data' => $this->blueprints->toArray()
|
|
||||||
];
|
|
||||||
// If compiled file wasn't already locked by another process, save it.
|
|
||||||
if ($file->locked() !== false) {
|
|
||||||
$this->messages[] = 'Saving compiled blueprints.';
|
|
||||||
$file->save($cache);
|
|
||||||
$file->unlock();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->blueprints = new Blueprints($cache['data']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function loadCompiledConfig($configs, $plugins, $filename = null)
|
|
||||||
{
|
|
||||||
$filename = $filename
|
|
||||||
? CACHE_DIR . 'compiled/config/' . $filename . '-' . $this->environment . '.php'
|
|
||||||
: CACHE_DIR . 'compiled/config/' . $checksum . '-' . $this->environment . '.php';
|
|
||||||
$file = PhpFile::instance($filename);
|
|
||||||
$cache = $file->exists() ? $file->content() : null;
|
|
||||||
$class = get_class($this);
|
|
||||||
$checksum = $this->checksum();
|
|
||||||
|
|
||||||
if (
|
|
||||||
!is_array($cache)
|
|
||||||
|| !isset($cache['checksum'])
|
|
||||||
|| !isset($cache['@class'])
|
|
||||||
|| $cache['@class'] != $class
|
|
||||||
) {
|
|
||||||
$this->messages[] = 'No cached configuration, compiling new configuration..';
|
|
||||||
} else if ($cache['checksum'] !== $checksum) {
|
|
||||||
$this->messages[] = 'Configuration checksum mismatch, reloading configuration..';
|
|
||||||
} else {
|
|
||||||
$this->messages[] = 'Configuration checksum matches, using cached version.';
|
|
||||||
|
|
||||||
$this->items = $cache['data'];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$configFiles = $this->finder->locateConfigFiles($configs, $plugins);
|
|
||||||
|
|
||||||
// Attempt to lock the file for writing.
|
|
||||||
$file->lock(false);
|
|
||||||
|
|
||||||
// Load configuration.
|
|
||||||
foreach ($configFiles as $files) {
|
|
||||||
$this->loadConfigFiles($files);
|
|
||||||
}
|
|
||||||
$cache = [
|
|
||||||
'@class' => $class,
|
|
||||||
'timestamp' => time(),
|
|
||||||
'checksum' => $checksum,
|
|
||||||
'data' => $this->toArray()
|
|
||||||
];
|
|
||||||
|
|
||||||
// If compiled file wasn't already locked by another process, save it.
|
|
||||||
if ($file->locked() !== false) {
|
|
||||||
$this->messages[] = 'Saving compiled configuration.';
|
|
||||||
$file->save($cache);
|
|
||||||
$file->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->items = $cache['data'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load blueprints.
|
|
||||||
*
|
|
||||||
* @param array $files
|
|
||||||
*/
|
|
||||||
public function loadBlueprintFiles(array $files)
|
|
||||||
{
|
|
||||||
foreach ($files as $name => $item) {
|
|
||||||
$file = CompiledYamlFile::instance($item['file']);
|
|
||||||
$this->blueprints->embed($name, $file->content(), '/');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load configuration.
|
|
||||||
*
|
|
||||||
* @param array $files
|
|
||||||
*/
|
|
||||||
public function loadConfigFiles(array $files)
|
|
||||||
{
|
|
||||||
foreach ($files as $name => $item) {
|
|
||||||
$file = CompiledYamlFile::instance($item['file']);
|
|
||||||
$this->join($name, $file->content(), '/');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize resource locator by using the configuration.
|
|
||||||
*
|
|
||||||
* @param UniformResourceLocator $locator
|
|
||||||
*/
|
|
||||||
public function initializeLocator(UniformResourceLocator $locator)
|
|
||||||
{
|
|
||||||
$locator->reset();
|
|
||||||
|
|
||||||
$schemes = (array) $this->get('streams.schemes', []);
|
|
||||||
|
|
||||||
foreach ($schemes as $scheme => $config) {
|
|
||||||
if (isset($config['paths'])) {
|
|
||||||
$locator->addPath($scheme, '', $config['paths']);
|
|
||||||
}
|
|
||||||
if (isset($config['prefixes'])) {
|
|
||||||
foreach ($config['prefixes'] as $prefix => $paths) {
|
|
||||||
$locator->addPath($scheme, $prefix, $paths);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get available streams and their types from the configuration.
|
* @return mixed
|
||||||
*
|
* @deprecated
|
||||||
* @return array
|
|
||||||
*/
|
*/
|
||||||
public function getStreams()
|
public function getLanguages()
|
||||||
{
|
{
|
||||||
$schemes = [];
|
return Grav::instance()['languages'];
|
||||||
foreach ((array) $this->get('streams.schemes') as $scheme => $config) {
|
|
||||||
$type = !empty($config['type']) ? $config['type'] : 'ReadOnlyStream';
|
|
||||||
if ($type[0] != '\\') {
|
|
||||||
$type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type;
|
|
||||||
}
|
|
||||||
|
|
||||||
$schemes[$scheme] = $type;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $schemes;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
258
system/src/Grav/Common/Config/ConfigFileFinder.php
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use Grav\Common\Filesystem\Folder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Configuration & Blueprints Finder class.
|
||||||
|
*/
|
||||||
|
class ConfigFileFinder
|
||||||
|
{
|
||||||
|
protected $base = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $base
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setBase($base)
|
||||||
|
{
|
||||||
|
$this->base = $base ? "{$base}/" : '';
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all locations for all the files with a timestamp.
|
||||||
|
*
|
||||||
|
* @param array $paths List of folders to look from.
|
||||||
|
* @param string $pattern Pattern to match the file. Pattern will also be removed from the key.
|
||||||
|
* @param int $levels Maximum number of recursive directories.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function locateFiles(array $paths, $pattern = '|\.yaml$|', $levels = -1)
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($paths as $folder) {
|
||||||
|
$list += $this->detectRecursive($folder, $pattern, $levels);
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all locations for all the files with a timestamp.
|
||||||
|
*
|
||||||
|
* @param array $paths List of folders to look from.
|
||||||
|
* @param string $pattern Pattern to match the file. Pattern will also be removed from the key.
|
||||||
|
* @param int $levels Maximum number of recursive directories.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getFiles(array $paths, $pattern = '|\.yaml$|', $levels = -1)
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($paths as $folder) {
|
||||||
|
$path = trim(Folder::getRelativePath($folder), '/');
|
||||||
|
|
||||||
|
$files = $this->detectRecursive($folder, $pattern, $levels);
|
||||||
|
|
||||||
|
$list += $files[trim($path, '/')];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all paths for all the files with a timestamp.
|
||||||
|
*
|
||||||
|
* @param array $paths List of folders to look from.
|
||||||
|
* @param string $pattern Pattern to match the file. Pattern will also be removed from the key.
|
||||||
|
* @param int $levels Maximum number of recursive directories.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function listFiles(array $paths, $pattern = '|\.yaml$|', $levels = -1)
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($paths as $folder) {
|
||||||
|
$list = array_merge_recursive($list, $this->detectAll($folder, $pattern, $levels));
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find filename from a list of folders.
|
||||||
|
*
|
||||||
|
* Note: Only finds the last override.
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* @param array $folders
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function locateFileInFolder($filename, array $folders)
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($folders as $folder) {
|
||||||
|
$list += $this->detectInFolder($folder, $filename);
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find filename from a list of folders.
|
||||||
|
*
|
||||||
|
* @param array $folders
|
||||||
|
* @param string $filename
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function locateInFolders(array $folders, $filename = null)
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($folders as $folder) {
|
||||||
|
$path = trim(Folder::getRelativePath($folder), '/');
|
||||||
|
$list[$path] = $this->detectInFolder($folder, $filename);
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all existing locations for a single file with a timestamp.
|
||||||
|
*
|
||||||
|
* @param array $paths Filesystem paths to look up from.
|
||||||
|
* @param string $name Configuration file to be located.
|
||||||
|
* @param string $ext File extension (optional, defaults to .yaml).
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function locateFile(array $paths, $name, $ext = '.yaml')
|
||||||
|
{
|
||||||
|
$filename = preg_replace('|[.\/]+|', '/', $name) . $ext;
|
||||||
|
|
||||||
|
$list = [];
|
||||||
|
foreach ($paths as $folder) {
|
||||||
|
$path = trim(Folder::getRelativePath($folder), '/');
|
||||||
|
|
||||||
|
if (is_file("{$folder}/{$filename}")) {
|
||||||
|
$modified = filemtime("{$folder}/{$filename}");
|
||||||
|
} else {
|
||||||
|
$modified = 0;
|
||||||
|
}
|
||||||
|
$basename = $this->base . $name;
|
||||||
|
$list[$path] = [$basename => ['file' => "{$path}/{$filename}", 'modified' => $modified]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects all directories with a configuration file and returns them with last modification time.
|
||||||
|
*
|
||||||
|
* @param string $folder Location to look up from.
|
||||||
|
* @param string $pattern Pattern to match the file. Pattern will also be removed from the key.
|
||||||
|
* @param int $levels Maximum number of recursive directories.
|
||||||
|
* @return array
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function detectRecursive($folder, $pattern, $levels)
|
||||||
|
{
|
||||||
|
$path = trim(Folder::getRelativePath($folder), '/');
|
||||||
|
|
||||||
|
if (is_dir($folder)) {
|
||||||
|
// Find all system and user configuration files.
|
||||||
|
$options = [
|
||||||
|
'levels' => $levels,
|
||||||
|
'compare' => 'Filename',
|
||||||
|
'pattern' => $pattern,
|
||||||
|
'filters' => [
|
||||||
|
'pre-key' => $this->base,
|
||||||
|
'key' => $pattern,
|
||||||
|
'value' => function (\RecursiveDirectoryIterator $file) use ($path) {
|
||||||
|
return ['file' => "{$path}/{$file->getSubPathname()}", 'modified' => $file->getMTime()];
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'key' => 'SubPathname'
|
||||||
|
];
|
||||||
|
|
||||||
|
$list = Folder::all($folder, $options);
|
||||||
|
|
||||||
|
ksort($list);
|
||||||
|
} else {
|
||||||
|
$list = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$path => $list];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects all directories with the lookup file and returns them with last modification time.
|
||||||
|
*
|
||||||
|
* @param string $folder Location to look up from.
|
||||||
|
* @param string $lookup Filename to be located (defaults to directory name).
|
||||||
|
* @return array
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function detectInFolder($folder, $lookup = null)
|
||||||
|
{
|
||||||
|
$folder = rtrim($folder, '/');
|
||||||
|
$path = trim(Folder::getRelativePath($folder), '/');
|
||||||
|
$base = $path === $folder ? '' : ($path ? substr($folder, 0, -strlen($path)) : $folder . '/');
|
||||||
|
|
||||||
|
$list = [];
|
||||||
|
|
||||||
|
if (is_dir($folder)) {
|
||||||
|
$iterator = new \DirectoryIterator($folder);
|
||||||
|
|
||||||
|
/** @var \DirectoryIterator $directory */
|
||||||
|
foreach ($iterator as $directory) {
|
||||||
|
if (!$directory->isDir() || $directory->isDot()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $directory->getBasename();
|
||||||
|
$find = ($lookup ?: $name) . '.yaml';
|
||||||
|
$filename = "{$path}/{$name}/{$find}";
|
||||||
|
|
||||||
|
if (file_exists($base . $filename)) {
|
||||||
|
$basename = $this->base . $name;
|
||||||
|
$list[$basename] = ['file' => $filename, 'modified' => filemtime($base . $filename)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects all plugins with a configuration file and returns them with last modification time.
|
||||||
|
*
|
||||||
|
* @param string $folder Location to look up from.
|
||||||
|
* @param string $pattern Pattern to match the file. Pattern will also be removed from the key.
|
||||||
|
* @param int $levels Maximum number of recursive directories.
|
||||||
|
* @return array
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function detectAll($folder, $pattern, $levels)
|
||||||
|
{
|
||||||
|
$path = trim(Folder::getRelativePath($folder), '/');
|
||||||
|
|
||||||
|
if (is_dir($folder)) {
|
||||||
|
// Find all system and user configuration files.
|
||||||
|
$options = [
|
||||||
|
'levels' => $levels,
|
||||||
|
'compare' => 'Filename',
|
||||||
|
'pattern' => $pattern,
|
||||||
|
'filters' => [
|
||||||
|
'pre-key' => $this->base,
|
||||||
|
'key' => $pattern,
|
||||||
|
'value' => function (\RecursiveDirectoryIterator $file) use ($path) {
|
||||||
|
return ["{$path}/{$file->getSubPathname()}" => $file->getMTime()];
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'key' => 'SubPathname'
|
||||||
|
];
|
||||||
|
|
||||||
|
$list = Folder::all($folder, $options);
|
||||||
|
|
||||||
|
ksort($list);
|
||||||
|
} else {
|
||||||
|
$list = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,146 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Grav\Common\Config;
|
|
||||||
|
|
||||||
use Grav\Common\Filesystem\Folder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Configuration Finder class.
|
|
||||||
*
|
|
||||||
* @author RocketTheme
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
class ConfigFinder
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Get all locations for blueprint files (including plugins).
|
|
||||||
*
|
|
||||||
* @param array $blueprints
|
|
||||||
* @param array $plugins
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function locateBlueprintFiles(array $blueprints, array $plugins)
|
|
||||||
{
|
|
||||||
$list = [];
|
|
||||||
foreach (array_reverse($plugins) as $folder) {
|
|
||||||
$list += $this->detectInFolder($folder, 'blueprints');
|
|
||||||
}
|
|
||||||
foreach (array_reverse($blueprints) as $folder) {
|
|
||||||
$list += $this->detectRecursive($folder);
|
|
||||||
}
|
|
||||||
return $list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all locations for configuration files (including plugins).
|
|
||||||
*
|
|
||||||
* @param array $configs
|
|
||||||
* @param array $plugins
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function locateConfigFiles(array $configs, array $plugins)
|
|
||||||
{
|
|
||||||
$list = [];
|
|
||||||
foreach (array_reverse($plugins) as $folder) {
|
|
||||||
$list += $this->detectInFolder($folder);
|
|
||||||
}
|
|
||||||
foreach (array_reverse($configs) as $folder) {
|
|
||||||
$list += $this->detectRecursive($folder);
|
|
||||||
}
|
|
||||||
return $list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all locations for a single configuration file.
|
|
||||||
*
|
|
||||||
* @param array $folders Locations to look up from.
|
|
||||||
* @param string $name Filename to be located.
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function locateConfigFile(array $folders, $name)
|
|
||||||
{
|
|
||||||
$filename = "{$name}.yaml";
|
|
||||||
|
|
||||||
$list = [];
|
|
||||||
foreach ($folders as $folder) {
|
|
||||||
$path = trim(Folder::getRelativePath($folder), '/');
|
|
||||||
|
|
||||||
if (is_file("{$folder}/{$filename}")) {
|
|
||||||
$modified = filemtime("{$folder}/{$filename}");
|
|
||||||
} else {
|
|
||||||
$modified = 0;
|
|
||||||
}
|
|
||||||
$list[$path] = [$name => ['file' => "{$path}/{$filename}", 'modified' => $modified]];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detects all plugins with a configuration file and returns them with last modification time.
|
|
||||||
*
|
|
||||||
* @param string $folder Location to look up from.
|
|
||||||
* @param string $lookup Filename to be located.
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function detectInFolder($folder, $lookup = null)
|
|
||||||
{
|
|
||||||
$path = trim(Folder::getRelativePath($folder), '/');
|
|
||||||
|
|
||||||
$list = [];
|
|
||||||
|
|
||||||
if (is_dir($folder)) {
|
|
||||||
$iterator = new \DirectoryIterator($folder);
|
|
||||||
|
|
||||||
/** @var \DirectoryIterator $directory */
|
|
||||||
foreach ($iterator as $directory) {
|
|
||||||
if (!$directory->isDir() || $directory->isDot()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$name = $directory->getBasename();
|
|
||||||
$find = ($lookup ?: $name) . '.yaml';
|
|
||||||
$filename = "{$path}/{$name}/$find";
|
|
||||||
|
|
||||||
if (file_exists($filename)) {
|
|
||||||
$list["plugins/{$name}"] = ['file' => $filename, 'modified' => filemtime($filename)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return [$path => $list];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detects all plugins with a configuration file and returns them with last modification time.
|
|
||||||
*
|
|
||||||
* @param string $folder Location to look up from.
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function detectRecursive($folder)
|
|
||||||
{
|
|
||||||
$path = trim(Folder::getRelativePath($folder), '/');
|
|
||||||
|
|
||||||
if (is_dir($folder)) {
|
|
||||||
// Find all system and user configuration files.
|
|
||||||
$options = [
|
|
||||||
'compare' => 'Filename',
|
|
||||||
'pattern' => '|\.yaml$|',
|
|
||||||
'filters' => [
|
|
||||||
'key' => '|\.yaml$|',
|
|
||||||
'value' => function (\RecursiveDirectoryIterator $file) use ($path) {
|
|
||||||
return ['file' => "{$path}/{$file->getSubPathname()}", 'modified' => $file->getMTime()];
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'key' => 'SubPathname'
|
|
||||||
];
|
|
||||||
|
|
||||||
$list = Folder::all($folder, $options);
|
|
||||||
} else {
|
|
||||||
$list = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [$path => $list];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
44
system/src/Grav/Common/Config/Languages.php
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use Grav\Common\Data\Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Languages class contains configuration rules.
|
||||||
|
*
|
||||||
|
* @author RocketTheme
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
class Languages extends Data
|
||||||
|
{
|
||||||
|
public function checksum($checksum = null)
|
||||||
|
{
|
||||||
|
if ($checksum !== null) {
|
||||||
|
$this->checksum = $checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function modified($modified = null)
|
||||||
|
{
|
||||||
|
if ($modified !== null) {
|
||||||
|
$this->modified = $modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function reformat()
|
||||||
|
{
|
||||||
|
if (isset($this->items['plugins'])) {
|
||||||
|
$this->items = array_merge_recursive($this->items, $this->items['plugins']);
|
||||||
|
unset($this->items['plugins']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mergeRecursive(array $data)
|
||||||
|
{
|
||||||
|
$this->items = array_merge_recursive($this->items, $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
255
system/src/Grav/Common/Config/Setup.php
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
|
use Grav\Common\File\CompiledYamlFile;
|
||||||
|
use Grav\Common\Data\Data;
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
use Pimple\Container;
|
||||||
|
use RocketTheme\Toolbox\File\YamlFile;
|
||||||
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Config class contains configuration information.
|
||||||
|
*
|
||||||
|
* @author RocketTheme
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
class Setup extends Data
|
||||||
|
{
|
||||||
|
protected $streams = [
|
||||||
|
'system' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['system'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'environment' => [
|
||||||
|
'type' => 'ReadOnlyStream'
|
||||||
|
// If not defined, environment will be set up in the constructor.
|
||||||
|
],
|
||||||
|
'asset' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['assets'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'blueprints' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['environment://blueprints', 'user://blueprints', 'system/blueprints'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'config' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['environment://config', 'user://config', 'system/config'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'plugins' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://plugins'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'plugin' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://plugins'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'themes' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://themes'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'languages' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['environment://languages', 'user://languages', 'system/languages'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'cache' => [
|
||||||
|
'type' => 'Stream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['cache'],
|
||||||
|
'images' => ['images']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'log' => [
|
||||||
|
'type' => 'Stream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['logs']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'backup' => [
|
||||||
|
'type' => 'Stream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['backup']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'image' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://images', 'system://images']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://pages']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'account' => [
|
||||||
|
'type' => 'ReadOnlyStream',
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://accounts']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Container|array $container
|
||||||
|
*/
|
||||||
|
public function __construct($container)
|
||||||
|
{
|
||||||
|
$environment = $container['uri']->environment() ?: 'localhost';
|
||||||
|
|
||||||
|
// Pre-load setup.php which contains our initial configuration.
|
||||||
|
// Configuration may contain dynamic parts, which is why we need to always load it.
|
||||||
|
$file = GRAV_ROOT . '/setup.php';
|
||||||
|
$setup = is_file($file) ? (array) include $file : [];
|
||||||
|
|
||||||
|
// Add default streams defined in beginning of the class.
|
||||||
|
if (!isset($setup['streams']['schemes'])) {
|
||||||
|
$setup['streams']['schemes'] = [];
|
||||||
|
}
|
||||||
|
$setup['streams']['schemes'] += $this->streams;
|
||||||
|
|
||||||
|
// Initialize class.
|
||||||
|
parent::__construct($setup);
|
||||||
|
|
||||||
|
// Set up environment.
|
||||||
|
$this->def('environment', $environment);
|
||||||
|
$this->def('streams.schemes.environment.prefixes', ['' => ["user://{$this->environment}"]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
$locator = new UniformResourceLocator(GRAV_ROOT);
|
||||||
|
$files = [];
|
||||||
|
|
||||||
|
$guard = 5;
|
||||||
|
do {
|
||||||
|
$check = $files;
|
||||||
|
$this->initializeLocator($locator);
|
||||||
|
$files = $locator->findResources('config://streams.yaml');
|
||||||
|
|
||||||
|
if ($check === $files) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update streams.
|
||||||
|
foreach (array_reverse($files) as $path) {
|
||||||
|
$file = CompiledYamlFile::instance($path);
|
||||||
|
$content = $file->content();
|
||||||
|
if (!empty($content['schemes'])) {
|
||||||
|
$this->items['streams']['schemes'] = $content['schemes'] + $this->items['streams']['schemes'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (--$guard);
|
||||||
|
|
||||||
|
if (!$guard) {
|
||||||
|
throw new \RuntimeException('Setup: Configuration reload loop detected!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we have valid setup.
|
||||||
|
$this->check($locator);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize resource locator by using the configuration.
|
||||||
|
*
|
||||||
|
* @param UniformResourceLocator $locator
|
||||||
|
*/
|
||||||
|
public function initializeLocator(UniformResourceLocator $locator)
|
||||||
|
{
|
||||||
|
$locator->reset();
|
||||||
|
|
||||||
|
$schemes = (array) $this->get('streams.schemes', []);
|
||||||
|
|
||||||
|
foreach ($schemes as $scheme => $config) {
|
||||||
|
if (isset($config['paths'])) {
|
||||||
|
$locator->addPath($scheme, '', $config['paths']);
|
||||||
|
}
|
||||||
|
if (isset($config['prefixes'])) {
|
||||||
|
foreach ($config['prefixes'] as $prefix => $paths) {
|
||||||
|
$locator->addPath($scheme, $prefix, $paths);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get available streams and their types from the configuration.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getStreams()
|
||||||
|
{
|
||||||
|
$schemes = [];
|
||||||
|
foreach ((array) $this->get('streams.schemes') as $scheme => $config) {
|
||||||
|
$type = !empty($config['type']) ? $config['type'] : 'ReadOnlyStream';
|
||||||
|
if ($type[0] != '\\') {
|
||||||
|
$type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
$schemes[$scheme] = $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $schemes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param UniformResourceLocator $locator
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
protected function check(UniformResourceLocator $locator)
|
||||||
|
{
|
||||||
|
$streams = isset($this->items['streams']['schemes']) ? $this->items['streams']['schemes'] : null;
|
||||||
|
if (!is_array($streams)) {
|
||||||
|
throw new \InvalidArgumentException('Configuration is missing streams.schemes!');
|
||||||
|
}
|
||||||
|
$diff = array_keys(array_diff_key($this->streams, $streams));
|
||||||
|
if ($diff) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
sprintf('Configuration is missing keys %s from streams.schemes!', implode(', ', $diff))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$locator->findResource('environment://config', true)) {
|
||||||
|
// If environment does not have its own directory, remove it from the lookup.
|
||||||
|
$this->set('streams.schemes.environment.prefixes', ['config' => []]);
|
||||||
|
$this->initializeLocator($locator);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create security.yaml if it doesn't exist.
|
||||||
|
$filename = $locator->findResource('config://security.yaml', true, true);
|
||||||
|
$file = YamlFile::instance($filename);
|
||||||
|
if (!$file->exists()) {
|
||||||
|
$file->save(['salt' => Utils::generateRandomString(14)]);
|
||||||
|
$file->free();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,82 +1,40 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Grav\Common\Data;
|
namespace Grav\Common\Data;
|
||||||
|
|
||||||
use RocketTheme\Toolbox\ArrayTraits\Export;
|
use Grav\Common\File\CompiledYamlFile;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use RocketTheme\Toolbox\Blueprints\BlueprintForm;
|
||||||
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Blueprint handles the inside logic of blueprints.
|
* The Config class contains configuration information.
|
||||||
*
|
*
|
||||||
* @author RocketTheme
|
* @author RocketTheme
|
||||||
* @license MIT
|
|
||||||
*/
|
*/
|
||||||
class Blueprint
|
class Blueprint extends BlueprintForm
|
||||||
{
|
{
|
||||||
use Export, DataMutatorTrait;
|
|
||||||
|
|
||||||
public $name;
|
|
||||||
|
|
||||||
public $initialized = false;
|
|
||||||
|
|
||||||
protected $items;
|
|
||||||
protected $context;
|
|
||||||
protected $fields;
|
|
||||||
protected $rules = array();
|
|
||||||
protected $nested = array();
|
|
||||||
protected $filter = ['validation' => 1];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $name
|
* @var string
|
||||||
* @param array $data
|
|
||||||
* @param Blueprints $context
|
|
||||||
*/
|
*/
|
||||||
public function __construct($name, array $data = array(), Blueprints $context = null)
|
protected $context = 'blueprints://';
|
||||||
{
|
|
||||||
$this->name = $name;
|
|
||||||
$this->items = $data;
|
|
||||||
$this->context = $context;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set filter for inherited properties.
|
* @var BlueprintSchema
|
||||||
|
*/
|
||||||
|
protected $blueprintSchema;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get nested structure containing default values defined in the blueprints.
|
||||||
*
|
*
|
||||||
* @param array $filter List of field names to be inherited.
|
* Fields without default value are ignored in the list.
|
||||||
*/
|
|
||||||
public function setFilter(array $filter)
|
|
||||||
{
|
|
||||||
$this->filter = array_flip($filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return all form fields.
|
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function fields()
|
public function getDefaults()
|
||||||
{
|
{
|
||||||
if (!isset($this->fields)) {
|
$this->initInternals();
|
||||||
$this->fields = [];
|
|
||||||
$this->embed('', $this->items);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->fields;
|
return $this->blueprintSchema->getDefaults();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate data against blueprints.
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @throws \RuntimeException
|
|
||||||
*/
|
|
||||||
public function validate(array $data)
|
|
||||||
{
|
|
||||||
// Initialize data
|
|
||||||
$this->fields();
|
|
||||||
|
|
||||||
try {
|
|
||||||
$this->validateArray($data, $this->nested);
|
|
||||||
} catch (\RuntimeException $e) {
|
|
||||||
throw new \RuntimeException(sprintf('Page validation failed: %s', $e->getMessage()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,26 +42,15 @@ class Blueprint
|
|||||||
*
|
*
|
||||||
* @param array $data1
|
* @param array $data1
|
||||||
* @param array $data2
|
* @param array $data2
|
||||||
|
* @param string $name Optional
|
||||||
|
* @param string $separator Optional
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function mergeData(array $data1, array $data2)
|
public function mergeData(array $data1, array $data2, $name = null, $separator = '.')
|
||||||
{
|
{
|
||||||
// Initialize data
|
$this->initInternals();
|
||||||
$this->fields();
|
|
||||||
return $this->mergeArrays($data1, $data2, $this->nested);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
return $this->blueprintSchema->mergeData($data1, $data2, $name, $separator);
|
||||||
* Filter data by using blueprints.
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function filter(array $data)
|
|
||||||
{
|
|
||||||
// Initialize data
|
|
||||||
$this->fields();
|
|
||||||
return $this->filterArray($data, $this->nested);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,318 +62,158 @@ class Blueprint
|
|||||||
*/
|
*/
|
||||||
public function extra(array $data, $prefix = '')
|
public function extra(array $data, $prefix = '')
|
||||||
{
|
{
|
||||||
// Initialize data
|
$this->initInternals();
|
||||||
$this->fields();
|
|
||||||
return $this->extraArray($data, $this->nested, $prefix);
|
return $this->blueprintSchema->extra($data, $prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend blueprint with another blueprint.
|
* Validate data against blueprints.
|
||||||
*
|
*
|
||||||
* @param Blueprint $extends
|
* @param array $data
|
||||||
* @param bool $append
|
|
||||||
*/
|
|
||||||
public function extend(Blueprint $extends, $append = false)
|
|
||||||
{
|
|
||||||
$blueprints = $append ? $this->items : $extends->toArray();
|
|
||||||
$appended = $append ? $extends->toArray() : $this->items;
|
|
||||||
|
|
||||||
$bref_stack = array(&$blueprints);
|
|
||||||
$head_stack = array($appended);
|
|
||||||
|
|
||||||
do {
|
|
||||||
end($bref_stack);
|
|
||||||
|
|
||||||
$bref = &$bref_stack[key($bref_stack)];
|
|
||||||
$head = array_pop($head_stack);
|
|
||||||
|
|
||||||
unset($bref_stack[key($bref_stack)]);
|
|
||||||
|
|
||||||
foreach (array_keys($head) as $key) {
|
|
||||||
if (isset($key, $bref[$key]) && is_array($bref[$key]) && is_array($head[$key])) {
|
|
||||||
$bref_stack[] = &$bref[$key];
|
|
||||||
$head_stack[] = $head[$key];
|
|
||||||
} else {
|
|
||||||
$bref = array_merge($bref, array($key => $head[$key]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (count($head_stack));
|
|
||||||
|
|
||||||
$this->items = $blueprints;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert object into an array.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getState()
|
|
||||||
{
|
|
||||||
return ['name' => $this->name, 'items' => $this->items, 'rules' => $this->rules, 'nested' => $this->nested];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Embed an array to the blueprint.
|
|
||||||
*
|
|
||||||
* @param $name
|
|
||||||
* @param array $value
|
|
||||||
* @param string $separator
|
|
||||||
*/
|
|
||||||
public function embed($name, array $value, $separator = '.')
|
|
||||||
{
|
|
||||||
|
|
||||||
if (!isset($value['form']['fields']) || !is_array($value['form']['fields'])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Initialize data
|
|
||||||
$this->fields();
|
|
||||||
$prefix = $name ? strtr($name, $separator, '.') . '.' : '';
|
|
||||||
$params = array_intersect_key($this->filter, $value);
|
|
||||||
$this->parseFormFields($value['form']['fields'], $params, $prefix, $this->fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $data
|
|
||||||
* @param array $rules
|
|
||||||
* @throws \RuntimeException
|
* @throws \RuntimeException
|
||||||
* @internal
|
|
||||||
*/
|
*/
|
||||||
protected function validateArray(array $data, array $rules)
|
public function validate(array $data)
|
||||||
{
|
{
|
||||||
$this->checkRequired($data, $rules);
|
$this->initInternals();
|
||||||
|
|
||||||
foreach ($data as $key => $field) {
|
$this->blueprintSchema->validate($data);
|
||||||
$val = isset($rules[$key]) ? $rules[$key] : null;
|
|
||||||
$rule = is_string($val) ? $this->rules[$val] : null;
|
|
||||||
|
|
||||||
if ($rule) {
|
|
||||||
// Item has been defined in blueprints.
|
|
||||||
Validation::validate($field, $rule);
|
|
||||||
} elseif (is_array($field) && is_array($val)) {
|
|
||||||
// Array has been defined in blueprints.
|
|
||||||
$this->validateArray($field, $val);
|
|
||||||
} elseif (isset($this->items['form']['validation']) && $this->items['form']['validation'] == 'strict') {
|
|
||||||
// Undefined/extra item.
|
|
||||||
throw new \RuntimeException(sprintf('%s is not defined in blueprints', $key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* Filter data by using blueprints.
|
||||||
* @param array $rules
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function filterArray(array $data, array $rules)
|
|
||||||
{
|
|
||||||
$results = array();
|
|
||||||
foreach ($data as $key => $field) {
|
|
||||||
$val = isset($rules[$key]) ? $rules[$key] : null;
|
|
||||||
$rule = is_string($val) ? $this->rules[$val] : null;
|
|
||||||
|
|
||||||
if ($rule) {
|
|
||||||
// Item has been defined in blueprints.
|
|
||||||
$field = Validation::filter($field, $rule);
|
|
||||||
} elseif (is_array($field) && is_array($val)) {
|
|
||||||
// Array has been defined in blueprints.
|
|
||||||
$field = $this->filterArray($field, $val);
|
|
||||||
} elseif (isset($this->items['form']['validation']) && $this->items['form']['validation'] == 'strict') {
|
|
||||||
$field = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($field) && (!is_array($field) || !empty($field))) {
|
|
||||||
$results[$key] = $field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $data1
|
|
||||||
* @param array $data2
|
|
||||||
* @param array $rules
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function mergeArrays(array $data1, array $data2, array $rules)
|
|
||||||
{
|
|
||||||
foreach ($data2 as $key => $field) {
|
|
||||||
$val = isset($rules[$key]) ? $rules[$key] : null;
|
|
||||||
$rule = is_string($val) ? $this->rules[$val] : null;
|
|
||||||
|
|
||||||
if (!$rule && array_key_exists($key, $data1) && is_array($field) && is_array($val)) {
|
|
||||||
// Array has been defined in blueprints.
|
|
||||||
$data1[$key] = $this->mergeArrays($data1[$key], $field, $val);
|
|
||||||
} else {
|
|
||||||
// Otherwise just take value from the data2.
|
|
||||||
$data1[$key] = $field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $data
|
|
||||||
* @param array $rules
|
|
||||||
* @param string $prefix
|
|
||||||
* @return array
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
protected function extraArray(array $data, array $rules, $prefix)
|
|
||||||
{
|
|
||||||
$array = array();
|
|
||||||
foreach ($data as $key => $field) {
|
|
||||||
$val = isset($rules[$key]) ? $rules[$key] : null;
|
|
||||||
$rule = is_string($val) ? $this->rules[$val] : null;
|
|
||||||
|
|
||||||
if ($rule) {
|
|
||||||
// Item has been defined in blueprints.
|
|
||||||
} elseif (is_array($field) && is_array($val)) {
|
|
||||||
// Array has been defined in blueprints.
|
|
||||||
$array += $this->ExtraArray($field, $val, $prefix);
|
|
||||||
} else {
|
|
||||||
// Undefined/extra item.
|
|
||||||
$array[$prefix.$key] = $field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $array;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets all field definitions from the blueprints.
|
|
||||||
*
|
*
|
||||||
* @param array $fields
|
* @param array $data
|
||||||
* @param array $params
|
* @return array
|
||||||
* @param string $prefix
|
|
||||||
* @param array $current
|
|
||||||
* @internal
|
|
||||||
*/
|
*/
|
||||||
protected function parseFormFields(array &$fields, $params, $prefix, array &$current)
|
public function filter(array $data)
|
||||||
{
|
{
|
||||||
// Go though all the fields in current level.
|
$this->initInternals();
|
||||||
foreach ($fields as $key => &$field) {
|
|
||||||
$current[$key] = &$field;
|
|
||||||
// Set name from the array key.
|
|
||||||
$field['name'] = $prefix . $key;
|
|
||||||
$field += $params;
|
|
||||||
|
|
||||||
if (isset($field['fields'])) {
|
return $this->blueprintSchema->filter($data);
|
||||||
// Recursively get all the nested fields.
|
}
|
||||||
$newParams = array_intersect_key($this->filter, $field);
|
|
||||||
$this->parseFormFields($field['fields'], $newParams, $prefix, $current[$key]['fields']);
|
/**
|
||||||
|
* Initialize validator.
|
||||||
|
*/
|
||||||
|
protected function initInternals()
|
||||||
|
{
|
||||||
|
if (!isset($this->blueprintSchema)) {
|
||||||
|
$types = Grav::instance()['plugins']->formFieldTypes;
|
||||||
|
|
||||||
|
$this->blueprintSchema = new BlueprintSchema;
|
||||||
|
if ($types) {
|
||||||
|
$this->blueprintSchema->setTypes($types);
|
||||||
|
}
|
||||||
|
$this->blueprintSchema->embed('', $this->items);
|
||||||
|
$this->blueprintSchema->init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $filename
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function loadFile($filename)
|
||||||
|
{
|
||||||
|
$file = CompiledYamlFile::instance($filename);
|
||||||
|
$content = $file->content();
|
||||||
|
$file->free();
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|array $path
|
||||||
|
* @param string $context
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getFiles($path, $context = null)
|
||||||
|
{
|
||||||
|
if (is_string($path) && !strpos($path, '://')) {
|
||||||
|
// Resolve filename.
|
||||||
|
if (isset($this->overrides[$path])) {
|
||||||
|
$path = $this->overrides[$path];
|
||||||
} else {
|
} else {
|
||||||
// Add rule.
|
if ($context === null) {
|
||||||
$this->rules[$prefix . $key] = &$field;
|
$context = $this->context;
|
||||||
$this->addProperty($prefix . $key);
|
|
||||||
|
|
||||||
foreach ($field as $name => $value) {
|
|
||||||
// Support nested blueprints.
|
|
||||||
if ($this->context && $name == '@import') {
|
|
||||||
$values = (array) $value;
|
|
||||||
if (!isset($field['fields'])) {
|
|
||||||
$field['fields'] = array();
|
|
||||||
}
|
|
||||||
foreach ($values as $bname) {
|
|
||||||
$b = $this->context->get($bname);
|
|
||||||
$field['fields'] = array_merge($field['fields'], $b->fields());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Support for callable data values.
|
|
||||||
elseif (substr($name, 0, 6) == '@data-') {
|
|
||||||
$property = substr($name, 6);
|
|
||||||
if (is_array($value)) {
|
|
||||||
$func = array_shift($value);
|
|
||||||
} else {
|
|
||||||
$func = $value;
|
|
||||||
$value = array();
|
|
||||||
}
|
|
||||||
list($o, $f) = preg_split('/::/', $func);
|
|
||||||
if (!$f && function_exists($o)) {
|
|
||||||
$data = call_user_func_array($o, $value);
|
|
||||||
} elseif ($f && method_exists($o, $f)) {
|
|
||||||
$data = call_user_func_array(array($o, $f), $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If function returns a value,
|
|
||||||
if (isset($data)) {
|
|
||||||
if (isset($field[$property]) && is_array($field[$property]) && is_array($data)) {
|
|
||||||
// Combine field and @data-field together.
|
|
||||||
$field[$property] += $data;
|
|
||||||
} else {
|
|
||||||
// Or create/replace field with @data-field.
|
|
||||||
$field[$property] = $data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if ($context && $context[strlen($context)-1] !== '/') {
|
||||||
|
$context .= '/';
|
||||||
|
}
|
||||||
|
$path = $context . $path;
|
||||||
|
|
||||||
// Initialize predefined validation rule.
|
if (!preg_match('/\.yaml$/', $path)) {
|
||||||
if (isset($field['validate']['rule'])) {
|
$path .= '.yaml';
|
||||||
$field['validate'] += $this->getRule($field['validate']['rule']);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_string($path) && strpos($path, '://')) {
|
||||||
|
/** @var UniformResourceLocator $locator */
|
||||||
|
$locator = Grav::instance()['locator'];
|
||||||
|
|
||||||
|
$files = $locator->findResources($path);
|
||||||
|
} else {
|
||||||
|
$files = (array) $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $files;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add property to the definition.
|
* @param array $field
|
||||||
*
|
* @param string $property
|
||||||
* @param string $path Comma separated path to the property.
|
* @param array $call
|
||||||
* @internal
|
|
||||||
*/
|
*/
|
||||||
protected function addProperty($path)
|
protected function dynamicData(array &$field, $property, array &$call)
|
||||||
{
|
{
|
||||||
$parts = explode('.', $path);
|
$params = $call['params'];
|
||||||
$item = array_pop($parts);
|
|
||||||
|
|
||||||
$nested = &$this->nested;
|
if (is_array($params)) {
|
||||||
foreach ($parts as $part) {
|
$function = array_shift($params);
|
||||||
if (!isset($nested[$part])) {
|
} else {
|
||||||
$nested[$part] = array();
|
$function = $params;
|
||||||
}
|
$params = [];
|
||||||
$nested = &$nested[$part];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($nested[$item])) {
|
list($o, $f) = preg_split('/::/', $function, 2);
|
||||||
$nested[$item] = $path;
|
if (!$f) {
|
||||||
|
if (function_exists($o)) {
|
||||||
|
$data = call_user_func_array($o, $params);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (method_exists($o, $f)) {
|
||||||
|
$data = call_user_func_array(array($o, $f), $params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If function returns a value,
|
||||||
|
if (isset($data)) {
|
||||||
|
if (isset($field[$property]) && is_array($field[$property]) && is_array($data)) {
|
||||||
|
// Combine field and @data-field together.
|
||||||
|
$field[$property] += $data;
|
||||||
|
} else {
|
||||||
|
// Or create/replace field with @data-field.
|
||||||
|
$field[$property] = $data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $rule
|
* @param array $field
|
||||||
* @return array
|
* @param string $property
|
||||||
* @internal
|
* @param array $call
|
||||||
*/
|
*/
|
||||||
protected function getRule($rule)
|
protected function dynamicConfig(array &$field, $property, array &$call)
|
||||||
{
|
{
|
||||||
if (isset($this->items['rules'][$rule]) && is_array($this->items['rules'][$rule])) {
|
$value = $call['params'];
|
||||||
return $this->items['rules'][$rule];
|
|
||||||
}
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
$default = isset($field[$property]) ? $field[$property] : null;
|
||||||
* @param array $data
|
$config = Grav::instance()['config']->get($value, $default);
|
||||||
* @param array $fields
|
|
||||||
* @throws \RuntimeException
|
if (!is_null($config)) {
|
||||||
* @internal
|
$field[$property] = $config;
|
||||||
*/
|
|
||||||
protected function checkRequired(array $data, array $fields)
|
|
||||||
{
|
|
||||||
foreach ($fields as $name => $field) {
|
|
||||||
if (!is_string($field)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$field = $this->rules[$field];
|
|
||||||
if (isset($field['validate']['required'])
|
|
||||||
&& $field['validate']['required'] === true
|
|
||||||
&& empty($data[$name])) {
|
|
||||||
throw new \RuntimeException("Missing required field: {$field['name']}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
163
system/src/Grav/Common/Data/BlueprintSchema.php
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
<?php
|
||||||
|
namespace Grav\Common\Data;
|
||||||
|
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use RocketTheme\Toolbox\ArrayTraits\Export;
|
||||||
|
use RocketTheme\Toolbox\ArrayTraits\ExportInterface;
|
||||||
|
use RocketTheme\Toolbox\Blueprints\BlueprintSchema as BlueprintSchemaBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blueprint schema handles the internal logic of blueprints.
|
||||||
|
*
|
||||||
|
* @author RocketTheme
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
||||||
|
{
|
||||||
|
use Export;
|
||||||
|
|
||||||
|
protected $ignoreFormKeys = [
|
||||||
|
'title' => true,
|
||||||
|
'help' => true,
|
||||||
|
'placeholder' => true,
|
||||||
|
'placeholder_key' => true,
|
||||||
|
'placeholder_value' => true,
|
||||||
|
'fields' => true
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate data against blueprints.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @throws \RuntimeException
|
||||||
|
*/
|
||||||
|
public function validate(array $data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$messages = $this->validateArray($data, $this->nested);
|
||||||
|
|
||||||
|
} catch (\RuntimeException $e) {
|
||||||
|
throw (new ValidationException($e->getMessage(), $e->getCode(), $e))->setMessages();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($messages)) {
|
||||||
|
throw (new ValidationException())->setMessages($messages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter data by using blueprints.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function filter(array $data)
|
||||||
|
{
|
||||||
|
return $this->filterArray($data, $this->nested);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @param array $rules
|
||||||
|
* @returns array
|
||||||
|
* @throws \RuntimeException
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function validateArray(array $data, array $rules)
|
||||||
|
{
|
||||||
|
$messages = $this->checkRequired($data, $rules);
|
||||||
|
|
||||||
|
foreach ($data as $key => $field) {
|
||||||
|
$val = isset($rules[$key]) ? $rules[$key] : (isset($rules['*']) ? $rules['*'] : null);
|
||||||
|
$rule = is_string($val) ? $this->items[$val] : null;
|
||||||
|
|
||||||
|
if ($rule) {
|
||||||
|
// Item has been defined in blueprints.
|
||||||
|
$messages += Validation::validate($field, $rule);
|
||||||
|
} elseif (is_array($field) && is_array($val)) {
|
||||||
|
// Array has been defined in blueprints.
|
||||||
|
$messages += $this->validateArray($field, $val);
|
||||||
|
} elseif (isset($rules['validation']) && $rules['validation'] == 'strict') {
|
||||||
|
// Undefined/extra item.
|
||||||
|
throw new \RuntimeException(sprintf('%s is not defined in blueprints', $key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @param array $rules
|
||||||
|
* @return array
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
protected function filterArray(array $data, array $rules)
|
||||||
|
{
|
||||||
|
$results = array();
|
||||||
|
foreach ($data as $key => $field) {
|
||||||
|
$val = isset($rules[$key]) ? $rules[$key] : (isset($rules['*']) ? $rules['*'] : null);
|
||||||
|
$rule = is_string($val) ? $this->items[$val] : null;
|
||||||
|
|
||||||
|
if ($rule) {
|
||||||
|
// Item has been defined in blueprints.
|
||||||
|
$field = Validation::filter($field, $rule);
|
||||||
|
} elseif (is_array($field) && is_array($val)) {
|
||||||
|
// Array has been defined in blueprints.
|
||||||
|
$field = $this->filterArray($field, $val);
|
||||||
|
} elseif (isset($rules['validation']) && $rules['validation'] == 'strict') {
|
||||||
|
$field = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($field) && (!is_array($field) || !empty($field))) {
|
||||||
|
$results[$key] = $field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @param array $fields
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function checkRequired(array $data, array $fields)
|
||||||
|
{
|
||||||
|
$messages = [];
|
||||||
|
|
||||||
|
foreach ($fields as $name => $field) {
|
||||||
|
if (!is_string($field)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$field = $this->items[$field];
|
||||||
|
if (isset($field['validate']['required'])
|
||||||
|
&& $field['validate']['required'] === true
|
||||||
|
&& !isset($data[$name])) {
|
||||||
|
$value = isset($field['label']) ? $field['label'] : $field['name'];
|
||||||
|
$language = Grav::instance()['language'];
|
||||||
|
$message = sprintf($language->translate('FORM.MISSING_REQUIRED_FIELD', null, true) . ' %s', $language->translate($value));
|
||||||
|
$messages[$field['name']][] = $message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $field
|
||||||
|
* @param string $property
|
||||||
|
* @param array $call
|
||||||
|
*/
|
||||||
|
protected function dynamicConfig(array &$field, $property, array &$call)
|
||||||
|
{
|
||||||
|
$value = $call['params'];
|
||||||
|
|
||||||
|
$default = isset($field[$property]) ? $field[$property] : null;
|
||||||
|
$config = Grav::instance()['config']->get($value, $default);
|
||||||
|
|
||||||
|
if (!is_null($config)) {
|
||||||
|
$field[$property] = $config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Grav\Common\Data;
|
namespace Grav\Common\Data;
|
||||||
|
|
||||||
use Grav\Common\File\CompiledYamlFile;
|
use Grav\Common\Grav;
|
||||||
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Blueprints class keeps track on blueprint instances.
|
* Blueprints class keeps track on blueprint instances.
|
||||||
@@ -13,18 +14,14 @@ class Blueprints
|
|||||||
{
|
{
|
||||||
protected $search;
|
protected $search;
|
||||||
protected $types;
|
protected $types;
|
||||||
protected $instances = array();
|
protected $instances = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string|array $search Search path.
|
* @param string|array $search Search path.
|
||||||
*/
|
*/
|
||||||
public function __construct($search)
|
public function __construct($search = 'blueprints://')
|
||||||
{
|
{
|
||||||
if (!is_string($search)) {
|
$this->search = $search;
|
||||||
$this->search = $search;
|
|
||||||
} else {
|
|
||||||
$this->search = rtrim($search, '\\/') . '/';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,30 +34,7 @@ class Blueprints
|
|||||||
public function get($type)
|
public function get($type)
|
||||||
{
|
{
|
||||||
if (!isset($this->instances[$type])) {
|
if (!isset($this->instances[$type])) {
|
||||||
if (is_string($this->search)) {
|
$this->instances[$type] = $this->loadFile($type);
|
||||||
$filename = $this->search . $type . YAML_EXT;
|
|
||||||
} else {
|
|
||||||
$filename = isset($this->search[$type]) ? $this->search[$type] : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($filename && is_file($filename)) {
|
|
||||||
$file = CompiledYamlFile::instance($filename);
|
|
||||||
$blueprints = $file->content();
|
|
||||||
} else {
|
|
||||||
$blueprints = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$blueprint = new Blueprint($type, $blueprints, $this);
|
|
||||||
|
|
||||||
if (isset($blueprints['@extends'])) {
|
|
||||||
// Extend blueprint by other blueprints.
|
|
||||||
$extends = (array) $blueprints['@extends'];
|
|
||||||
foreach ($extends as $extendType) {
|
|
||||||
$blueprint->extend($this->get($extendType));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->instances[$type] = $blueprint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->instances[$type];
|
return $this->instances[$type];
|
||||||
@@ -76,7 +50,18 @@ class Blueprints
|
|||||||
if ($this->types === null) {
|
if ($this->types === null) {
|
||||||
$this->types = array();
|
$this->types = array();
|
||||||
|
|
||||||
$iterator = new \DirectoryIterator($this->search);
|
$grav = Grav::instance();
|
||||||
|
|
||||||
|
/** @var UniformResourceLocator $locator */
|
||||||
|
$locator = $grav['locator'];
|
||||||
|
|
||||||
|
// Get stream / directory iterator.
|
||||||
|
if ($locator->isStream($this->search)) {
|
||||||
|
$iterator = $locator->getIterator($this->search);
|
||||||
|
} else {
|
||||||
|
$iterator = new \DirectoryIterator($this->search);
|
||||||
|
}
|
||||||
|
|
||||||
/** @var \DirectoryIterator $file */
|
/** @var \DirectoryIterator $file */
|
||||||
foreach ($iterator as $file) {
|
foreach ($iterator as $file) {
|
||||||
if (!$file->isFile() || '.' . $file->getExtension() != YAML_EXT) {
|
if (!$file->isFile() || '.' . $file->getExtension() != YAML_EXT) {
|
||||||
@@ -86,6 +71,27 @@ class Blueprints
|
|||||||
$this->types[$name] = ucfirst(strtr($name, '_', ' '));
|
$this->types[$name] = ucfirst(strtr($name, '_', ' '));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->types;
|
return $this->types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load blueprint file.
|
||||||
|
*
|
||||||
|
* @param string $name Name of the blueprint.
|
||||||
|
* @return Blueprint
|
||||||
|
*/
|
||||||
|
protected function loadFile($name)
|
||||||
|
{
|
||||||
|
$blueprint = new Blueprint($name);
|
||||||
|
|
||||||
|
if (is_array($this->search) || is_object($this->search)) {
|
||||||
|
$blueprint->setOverrides($this->search);
|
||||||
|
} else {
|
||||||
|
$blueprint->setContext($this->search);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $blueprint->load()->init();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||