mirror of
https://github.com/getgrav/grav.git
synced 2025-12-08 00:39:58 +01:00
Compare commits
804 Commits
1.5.0-rc.1
...
1.6.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bc6848464 | ||
|
|
abefbfc776 | ||
|
|
ad173ca129 | ||
|
|
d69ef0e39c | ||
|
|
436be17881 | ||
|
|
9a5fa7e699 | ||
|
|
d502ff08c1 | ||
|
|
14eb1281f9 | ||
|
|
8fd7a5aebe | ||
|
|
08423df547 | ||
|
|
40563ed2f8 | ||
|
|
b639f09ca7 | ||
|
|
dd134ad551 | ||
|
|
3d93d50cf0 | ||
|
|
f1da7b6063 | ||
|
|
ef7b33f9b6 | ||
|
|
0f0e6ab1c8 | ||
|
|
5362b312d1 | ||
|
|
ca4d6a398f | ||
|
|
ed00d480f2 | ||
|
|
057bdd546b | ||
|
|
7762f0c85e | ||
|
|
1e6c01ea65 | ||
|
|
4b777f508b | ||
|
|
d15f125964 | ||
|
|
32b435b7e6 | ||
|
|
31d301911f | ||
|
|
911eec5e68 | ||
|
|
2e4bb25e2e | ||
|
|
d99c80eae9 | ||
|
|
0e03240d13 | ||
|
|
02064117bc | ||
|
|
a9e0cc7159 | ||
|
|
6b4332db72 | ||
|
|
0f591953a0 | ||
|
|
0a5e78ccc6 | ||
|
|
fbf7c50a12 | ||
|
|
09c1255239 | ||
|
|
75650ceba3 | ||
|
|
e2a65004f3 | ||
|
|
d4e1bcc660 | ||
|
|
b1b1670c77 | ||
|
|
5a3674f6f6 | ||
|
|
e622e204bf | ||
|
|
c378b06a90 | ||
|
|
c6ce6e6c32 | ||
|
|
355f7ee748 | ||
|
|
c19fa22a26 | ||
|
|
5ba4c8ee5b | ||
|
|
306df5837d | ||
|
|
66bba376db | ||
|
|
ec07d37623 | ||
|
|
cab78d36f3 | ||
|
|
449682baea | ||
|
|
6eb11b9717 | ||
|
|
5a1d138d08 | ||
|
|
dfd75efbe5 | ||
|
|
76ed48fc7c | ||
|
|
1043b9a189 | ||
|
|
e401c683f5 | ||
|
|
9d4fe331fa | ||
|
|
fbae3fd194 | ||
|
|
022f1ce758 | ||
|
|
b367c664c7 | ||
|
|
8512968726 | ||
|
|
2ffc110f03 | ||
|
|
36836c516f | ||
|
|
1f288c25de | ||
|
|
a4b62d48b2 | ||
|
|
397f6902f3 | ||
|
|
e97bceed56 | ||
|
|
7efc0f418e | ||
|
|
ac2a4e1c06 | ||
|
|
ef43348020 | ||
|
|
b6e68bb362 | ||
|
|
8d9ceb5d99 | ||
|
|
af47825b76 | ||
|
|
a4c88697af | ||
|
|
45fbfb098a | ||
|
|
9172e442f2 | ||
|
|
3b91f9af8c | ||
|
|
d5e9cc4bfe | ||
|
|
bb719c5d53 | ||
|
|
05a6775b08 | ||
|
|
1accbb8edc | ||
|
|
a04a7f5714 | ||
|
|
f31f7f7499 | ||
|
|
354d6f307c | ||
|
|
90aa4083ca | ||
|
|
5fbd252db9 | ||
|
|
04d3237a89 | ||
|
|
55aaaeed47 | ||
|
|
84d995335e | ||
|
|
f7d3299ebb | ||
|
|
e762c3add9 | ||
|
|
df6bb065d3 | ||
|
|
2fed02affa | ||
|
|
a739ed6825 | ||
|
|
90c708db2b | ||
|
|
fcbd819f48 | ||
|
|
a25d18bca7 | ||
|
|
4480077894 | ||
|
|
e9aa338c1e | ||
|
|
88a3e874aa | ||
|
|
87814039bc | ||
|
|
af72951671 | ||
|
|
5f2dfc8221 | ||
|
|
c706756d19 | ||
|
|
a4801ead6a | ||
|
|
a57cec8404 | ||
|
|
8b171435a7 | ||
|
|
ab23d071a4 | ||
|
|
3e6c4e9c5e | ||
|
|
28db98c95d | ||
|
|
95583dbbcd | ||
|
|
9d8fc4a065 | ||
|
|
b23cd7bb65 | ||
|
|
28d5be982c | ||
|
|
3836e4d38a | ||
|
|
4ebfd51e98 | ||
|
|
25ff1241d4 | ||
|
|
0dc3e5806e | ||
|
|
982b12a239 | ||
|
|
5995515419 | ||
|
|
8c1c813acd | ||
|
|
0e95d7faf6 | ||
|
|
47c3d4bf9b | ||
|
|
33282e043b | ||
|
|
81efef7c60 | ||
|
|
2678f56499 | ||
|
|
cd8f578b39 | ||
|
|
ab535ec8be | ||
|
|
ada6c3f160 | ||
|
|
0917850634 | ||
|
|
c09a8fbbc4 | ||
|
|
2b392055c1 | ||
|
|
45acd237f5 | ||
|
|
cbf79e38c4 | ||
|
|
ed10ce03e2 | ||
|
|
561abc851f | ||
|
|
8789fd91ee | ||
|
|
b835db49f4 | ||
|
|
a5e832b0b0 | ||
|
|
2b16f813ef | ||
|
|
30b013f5b0 | ||
|
|
5eccfaa34b | ||
|
|
fde69ade6b | ||
|
|
af3d5e9683 | ||
|
|
c757e00ac9 | ||
|
|
19d61b4013 | ||
|
|
b4a4b60871 | ||
|
|
9727f30c61 | ||
|
|
db8e5b3cbb | ||
|
|
b0b6c1dd17 | ||
|
|
47bb35e2e9 | ||
|
|
2433e0d2cd | ||
|
|
cdf891478e | ||
|
|
39b1940f94 | ||
|
|
8564524984 | ||
|
|
2f74f0f587 | ||
|
|
6e2e533184 | ||
|
|
ecd39421d6 | ||
|
|
68d43a0c88 | ||
|
|
c80a3f5568 | ||
|
|
b3d84a05f5 | ||
|
|
95495614a8 | ||
|
|
45d7a164b5 | ||
|
|
97b236d117 | ||
|
|
8718c5ef31 | ||
|
|
7d7418df26 | ||
|
|
dd9aa5bf78 | ||
|
|
7f86f8eb6f | ||
|
|
8b4cac7ba6 | ||
|
|
b388e91177 | ||
|
|
a2ac3f4c8b | ||
|
|
1db8b93cfa | ||
|
|
6217ac90e0 | ||
|
|
bb385490bc | ||
|
|
a5e48ba160 | ||
|
|
c7a4e8e4bb | ||
|
|
85d5b6e889 | ||
|
|
1c725c02f0 | ||
|
|
5008672a48 | ||
|
|
4e03f19bac | ||
|
|
a03c328ee3 | ||
|
|
77ac68f2e8 | ||
|
|
02acc34461 | ||
|
|
a402a8ef84 | ||
|
|
60573c1d78 | ||
|
|
56adf40bb4 | ||
|
|
d33c45165d | ||
|
|
032acedafe | ||
|
|
6a48216afb | ||
|
|
85af461eb4 | ||
|
|
4b1a129f38 | ||
|
|
1762ef3d1e | ||
|
|
8ffba2d88d | ||
|
|
f19cb94f89 | ||
|
|
8fb7caa22a | ||
|
|
07646860f2 | ||
|
|
6765c5f594 | ||
|
|
026f9cb3a0 | ||
|
|
516dfd5c26 | ||
|
|
1fbd5e0b38 | ||
|
|
b35a892853 | ||
|
|
578f8e4947 | ||
|
|
a934dd4fff | ||
|
|
18625758e5 | ||
|
|
eb689c417b | ||
|
|
df226a1102 | ||
|
|
8947f5ade9 | ||
|
|
941a5db8de | ||
|
|
2fcaaea6ac | ||
|
|
5887a396c1 | ||
|
|
f934256e06 | ||
|
|
ccb465e998 | ||
|
|
1b0a6e99f7 | ||
|
|
2e647be565 | ||
|
|
863123ac92 | ||
|
|
434620dea0 | ||
|
|
212d7d24ef | ||
|
|
61cf416df4 | ||
|
|
ff23f6b015 | ||
|
|
d59d60647c | ||
|
|
cf088d00ff | ||
|
|
dd5a10d0e2 | ||
|
|
0da39aa397 | ||
|
|
2dff43acba | ||
|
|
c97853e1aa | ||
|
|
c9be74fe39 | ||
|
|
e7df9c1dca | ||
|
|
3c680cd8e8 | ||
|
|
3545761b92 | ||
|
|
72016d7e7c | ||
|
|
6c1701ea5a | ||
|
|
28372be982 | ||
|
|
58f85212db | ||
|
|
c39bdaf7f2 | ||
|
|
16ab2e59f1 | ||
|
|
29c65c74db | ||
|
|
fee77d7301 | ||
|
|
21d9fa1e74 | ||
|
|
b4d973bfd0 | ||
|
|
993db32652 | ||
|
|
a0f4878c12 | ||
|
|
452df10ea1 | ||
|
|
a3bf38b182 | ||
|
|
674ea8ae25 | ||
|
|
94610f4e61 | ||
|
|
b2df60647d | ||
|
|
e8650a55af | ||
|
|
09805f7091 | ||
|
|
a63040aa11 | ||
|
|
3e97ecab68 | ||
|
|
409b4028d0 | ||
|
|
85b4996dbf | ||
|
|
e7041ff48e | ||
|
|
793b56fc8c | ||
|
|
ea91601459 | ||
|
|
6e3edb7dfb | ||
|
|
4e38c1fe25 | ||
|
|
2adb13ac66 | ||
|
|
d565c4af16 | ||
|
|
877529ae5b | ||
|
|
8b89c2c52e | ||
|
|
427ba0e420 | ||
|
|
4be7aa5665 | ||
|
|
9bd66031ab | ||
|
|
48816d9f2e | ||
|
|
031bfdc1e7 | ||
|
|
88121aaab4 | ||
|
|
8f588aca99 | ||
|
|
5b34a9bfc4 | ||
|
|
ef55d2615f | ||
|
|
1391dd38a4 | ||
|
|
f8f1d5854c | ||
|
|
a1c8cb9f78 | ||
|
|
54ce1b570a | ||
|
|
f2d66c810a | ||
|
|
26de0340ec | ||
|
|
333fbd0db1 | ||
|
|
4cf4c09339 | ||
|
|
34bf8fb5bb | ||
|
|
06eee1e711 | ||
|
|
b6ab086bf7 | ||
|
|
b1d43d292d | ||
|
|
19b92f17dd | ||
|
|
c713625a38 | ||
|
|
24e6b6c8f1 | ||
|
|
cebe28e591 | ||
|
|
b111a2c29d | ||
|
|
8743a8080c | ||
|
|
f2155aa04f | ||
|
|
45346b72f2 | ||
|
|
632a2d79b6 | ||
|
|
2fa5021a0c | ||
|
|
e4b1d2ed9e | ||
|
|
a3fea3d0fc | ||
|
|
d50e5d954d | ||
|
|
970af3870e | ||
|
|
9ba572d788 | ||
|
|
ba2c37c216 | ||
|
|
0e14a325f8 | ||
|
|
1141dabbd8 | ||
|
|
7a044c7397 | ||
|
|
d0b3dd1d99 | ||
|
|
4f80a1567d | ||
|
|
23098a6b02 | ||
|
|
5c8a37be64 | ||
|
|
7b8944e8f2 | ||
|
|
37fcb12ad1 | ||
|
|
f312c44a46 | ||
|
|
999e439d47 | ||
|
|
0566185c4f | ||
|
|
b91574e5c2 | ||
|
|
604361045b | ||
|
|
d45efb484c | ||
|
|
610c6c341c | ||
|
|
6daf480bfc | ||
|
|
bbdac0fd6d | ||
|
|
5f5bfdaa42 | ||
|
|
ad7fdd5c2b | ||
|
|
1321e582d5 | ||
|
|
6d6689b431 | ||
|
|
f78658738a | ||
|
|
7c99ece0e1 | ||
|
|
9058e1166d | ||
|
|
ebd94a532c | ||
|
|
95a4ecb0f1 | ||
|
|
ff8cc83b3a | ||
|
|
fbd3bbdbf9 | ||
|
|
f0e58adfbc | ||
|
|
5ad4ffd3cf | ||
|
|
0700e4bfdb | ||
|
|
82e5df960d | ||
|
|
3ace15d01a | ||
|
|
d367e6a1fb | ||
|
|
a09940ef6a | ||
|
|
6d89108cc4 | ||
|
|
bd01b07b4b | ||
|
|
4e31a114ef | ||
|
|
18d53079dd | ||
|
|
57de7cc03d | ||
|
|
2d7eeb611d | ||
|
|
e6b6e218f8 | ||
|
|
243055289b | ||
|
|
52c7d8dfb7 | ||
|
|
5b0e2e401e | ||
|
|
8381261b7c | ||
|
|
2ada99d314 | ||
|
|
bd27d6fe8c | ||
|
|
b94631533d | ||
|
|
fb9baaed8a | ||
|
|
254fe990ba | ||
|
|
0afe9d4f93 | ||
|
|
ccca3170d3 | ||
|
|
00b1f12dda | ||
|
|
9ca411aa24 | ||
|
|
e976aa0f5f | ||
|
|
02c979bdf6 | ||
|
|
88625c6362 | ||
|
|
76ff68a594 | ||
|
|
d27a2171ea | ||
|
|
075498d03b | ||
|
|
f04ae315e4 | ||
|
|
2e277f3cb3 | ||
|
|
29098aa8db | ||
|
|
659cd1bb92 | ||
|
|
3bf7c6943a | ||
|
|
189e29b5c6 | ||
|
|
0ede252fa3 | ||
|
|
d7d69b2be8 | ||
|
|
d79729f596 | ||
|
|
988d4ab047 | ||
|
|
437866dfcd | ||
|
|
c40dcf020c | ||
|
|
e520bd0eb8 | ||
|
|
3a9e57e228 | ||
|
|
22ed1286e8 | ||
|
|
1a37c54316 | ||
|
|
b6328944a3 | ||
|
|
751d1da704 | ||
|
|
5cf4eea09e | ||
|
|
f0cf4ed8ff | ||
|
|
fa61ed17b1 | ||
|
|
f1363877d8 | ||
|
|
e8825beae5 | ||
|
|
830a83e3d1 | ||
|
|
7d249c61c2 | ||
|
|
a224c8b348 | ||
|
|
c04208d5dd | ||
|
|
394dfad566 | ||
|
|
2c55fe01ac | ||
|
|
680bfef2c3 | ||
|
|
a23cbd0257 | ||
|
|
f5b77e8082 | ||
|
|
10378ac5af | ||
|
|
4a290e6194 | ||
|
|
c2c0fb242b | ||
|
|
9b37e50492 | ||
|
|
6c6e8d2605 | ||
|
|
5a6e6dceda | ||
|
|
e8631da9f3 | ||
|
|
5d57713f95 | ||
|
|
28bd4027cd | ||
|
|
108541e0d0 | ||
|
|
54a177279f | ||
|
|
b3e9974e95 | ||
|
|
2ad66102d2 | ||
|
|
6828114e86 | ||
|
|
f53b43de14 | ||
|
|
d53dbdf5ba | ||
|
|
8ba00f5967 | ||
|
|
56c7b8ca5f | ||
|
|
d6115007ab | ||
|
|
ba53d876bc | ||
|
|
2d593995ee | ||
|
|
3808776ddb | ||
|
|
9a118d0a71 | ||
|
|
684d6d3389 | ||
|
|
89a0e960e2 | ||
|
|
1b21e01938 | ||
|
|
3b692a27b4 | ||
|
|
3c83f379ee | ||
|
|
0c344df07a | ||
|
|
2a20959660 | ||
|
|
94a843429d | ||
|
|
34e6b6652a | ||
|
|
1ba785f28e | ||
|
|
bac24cf520 | ||
|
|
40b7d53349 | ||
|
|
96d44b4322 | ||
|
|
bf127fb0bd | ||
|
|
501bc0133f | ||
|
|
787bf8beeb | ||
|
|
257396aa06 | ||
|
|
7eb469f0ae | ||
|
|
156e544ab9 | ||
|
|
b38a143c66 | ||
|
|
cd21d65400 | ||
|
|
b19cb1215b | ||
|
|
48acad3e47 | ||
|
|
009db01ab9 | ||
|
|
7d8fff9571 | ||
|
|
9d048f5f36 | ||
|
|
cb4ea86310 | ||
|
|
2b099c2ed5 | ||
|
|
6afb55cc30 | ||
|
|
0937e0ff91 | ||
|
|
d602cb6e9e | ||
|
|
e02fa1a4e7 | ||
|
|
9e1661eb8c | ||
|
|
00c6313102 | ||
|
|
f01792ae81 | ||
|
|
bc18b9408b | ||
|
|
fa948c04ab | ||
|
|
8fdd34c245 | ||
|
|
cd5bda3f9e | ||
|
|
e14129d278 | ||
|
|
decb19b92e | ||
|
|
eb770e95d5 | ||
|
|
77f035eb2d | ||
|
|
db2738978e | ||
|
|
180f3c2eca | ||
|
|
e84fbc425f | ||
|
|
c5e2ed9f22 | ||
|
|
a92f0898d8 | ||
|
|
d968901d98 | ||
|
|
c38b761871 | ||
|
|
b49741f8aa | ||
|
|
6866c2a39a | ||
|
|
9598cd13fe | ||
|
|
49c8fef5f5 | ||
|
|
13341f8aa8 | ||
|
|
251cb3f9fa | ||
|
|
51767a8f36 | ||
|
|
c653fe6e4a | ||
|
|
70688f3e00 | ||
|
|
e9c52046fa | ||
|
|
a01b94f80b | ||
|
|
708c79cef8 | ||
|
|
f1ce69d4bf | ||
|
|
5bd417aa39 | ||
|
|
2bf448c587 | ||
|
|
b6c582ad3a | ||
|
|
c35c285580 | ||
|
|
890a61358a | ||
|
|
7de66cdc53 | ||
|
|
b353ec12e1 | ||
|
|
48489ae291 | ||
|
|
85a3d98d4c | ||
|
|
c9eea7e019 | ||
|
|
da483d63f6 | ||
|
|
3f89b39b60 | ||
|
|
e89b5ce870 | ||
|
|
88f6d02c03 | ||
|
|
cc78fcf31c | ||
|
|
37e880b64a | ||
|
|
75b2307d30 | ||
|
|
9e8f700119 | ||
|
|
4bcba0e4f9 | ||
|
|
11b661cad5 | ||
|
|
5e1980d770 | ||
|
|
5e7eb6b2f4 | ||
|
|
994a1f89cd | ||
|
|
4daa07fd14 | ||
|
|
d39165f506 | ||
|
|
468db9566b | ||
|
|
33309105d3 | ||
|
|
8cfe6e772d | ||
|
|
bad6e32e18 | ||
|
|
02d48693dd | ||
|
|
7975ec8d09 | ||
|
|
de898b610d | ||
|
|
0743816822 | ||
|
|
bb4958115b | ||
|
|
b64404a924 | ||
|
|
9a8b47872e | ||
|
|
76070ddd43 | ||
|
|
22066e11b3 | ||
|
|
ef157c7d2b | ||
|
|
e42e9fdd54 | ||
|
|
e2594dc72c | ||
|
|
f4e2153291 | ||
|
|
44db0245a7 | ||
|
|
ff5aa8a0ac | ||
|
|
8c0dd6a8d1 | ||
|
|
1ba21afd30 | ||
|
|
e73537f488 | ||
|
|
9405418572 | ||
|
|
59ccd662c7 | ||
|
|
377751416b | ||
|
|
116c279f01 | ||
|
|
1d8ef45e9c | ||
|
|
380b3be928 | ||
|
|
c151043c70 | ||
|
|
64e13c5f87 | ||
|
|
b55d29dfb7 | ||
|
|
bf86b5a924 | ||
|
|
9f2da67d48 | ||
|
|
d0b34d114d | ||
|
|
d0c9e56aeb | ||
|
|
74cd3ac1e0 | ||
|
|
ecbc401584 | ||
|
|
0c81568df6 | ||
|
|
b9dc2baef1 | ||
|
|
9b43f20159 | ||
|
|
82d3d5edda | ||
|
|
005f626b88 | ||
|
|
63005a8280 | ||
|
|
2943294d08 | ||
|
|
ed03b02e52 | ||
|
|
f43f992125 | ||
|
|
0b646875d0 | ||
|
|
b1b4469d18 | ||
|
|
eea70d380c | ||
|
|
a32880a84d | ||
|
|
72cc5b9d07 | ||
|
|
b9c28c5a7c | ||
|
|
c56d7ac793 | ||
|
|
000bac8cfc | ||
|
|
3c2a8510f9 | ||
|
|
64b0fd7e86 | ||
|
|
36432c00ac | ||
|
|
e7d660149e | ||
|
|
829638c143 | ||
|
|
601990d59b | ||
|
|
3469974861 | ||
|
|
167ea6419b | ||
|
|
472b575e20 | ||
|
|
b622ff7f14 | ||
|
|
d70d0b889e | ||
|
|
a84b791ac7 | ||
|
|
6332e7f518 | ||
|
|
849d3184b3 | ||
|
|
4344148bfa | ||
|
|
251971485b | ||
|
|
fa3ce13a87 | ||
|
|
bc70d50ff0 | ||
|
|
64a0dd52e8 | ||
|
|
5d1c65c936 | ||
|
|
3537770823 | ||
|
|
b1090d4286 | ||
|
|
5b097fc038 | ||
|
|
092ecd1417 | ||
|
|
ff54dc82ff | ||
|
|
ed105b42a2 | ||
|
|
9e2a95db73 | ||
|
|
acf0854e6a | ||
|
|
809c4a1bcf | ||
|
|
42887ca282 | ||
|
|
46752e9b10 | ||
|
|
6be1127cf0 | ||
|
|
d8a627898e | ||
|
|
1f87c5069b | ||
|
|
222f05fe81 | ||
|
|
023221bfab | ||
|
|
b4e40a669d | ||
|
|
f812236180 | ||
|
|
b8c9f0cc8c | ||
|
|
072c7929f7 | ||
|
|
4811fa7d49 | ||
|
|
3d786f78d5 | ||
|
|
0bf62ed39b | ||
|
|
a9196c3268 | ||
|
|
699c72841c | ||
|
|
9c4a80a25f | ||
|
|
beb1b41317 | ||
|
|
bdc3f41ac2 | ||
|
|
fc0dfbe8b4 | ||
|
|
8590f4fbf5 | ||
|
|
f9cc86a6db | ||
|
|
dc263c12e9 | ||
|
|
d6c17132df | ||
|
|
3742be10bc | ||
|
|
a3caa13c23 | ||
|
|
27aa5e8e15 | ||
|
|
83211acaae | ||
|
|
eb97964a00 | ||
|
|
f43ab0ed59 | ||
|
|
df5f7f4890 | ||
|
|
08f07e663e | ||
|
|
cc61fb5d0f | ||
|
|
049f84a52a | ||
|
|
776d1419c1 | ||
|
|
d848dcde5d | ||
|
|
4ff0d34aa2 | ||
|
|
c6f6677d6e | ||
|
|
9944486c17 | ||
|
|
da5c9e415f | ||
|
|
7b5a1b2c14 | ||
|
|
235a5cc765 | ||
|
|
b96e264cc7 | ||
|
|
1d6cdd45eb | ||
|
|
0204906454 | ||
|
|
a7b184abdb | ||
|
|
fff9c657d4 | ||
|
|
6070bfc46e | ||
|
|
073d601b67 | ||
|
|
ad1bbba0b3 | ||
|
|
6b46c288a6 | ||
|
|
8dd352c5c4 | ||
|
|
8fe3f0c35f | ||
|
|
16edb93efb | ||
|
|
b6b5e329aa | ||
|
|
6e5b173861 | ||
|
|
6010b8e1b4 | ||
|
|
8d0d26ed9b | ||
|
|
65bb683b4a | ||
|
|
75e8a19363 | ||
|
|
1a47b837f5 | ||
|
|
50c211fc10 | ||
|
|
4fb035c512 | ||
|
|
78992df894 | ||
|
|
70c423563f | ||
|
|
2503180e73 | ||
|
|
ed0cb0c8f2 | ||
|
|
a6449cb8ba | ||
|
|
9e776df296 | ||
|
|
0e973dab07 | ||
|
|
15e371564a | ||
|
|
f0e33dc242 | ||
|
|
e67c3c1091 | ||
|
|
d5ce0bd93c | ||
|
|
70b6fb32c4 | ||
|
|
7148e9e136 | ||
|
|
44dbcdf2b1 | ||
|
|
ecaeb32675 | ||
|
|
3216442946 | ||
|
|
9d4471b196 | ||
|
|
e4f6f8bcf2 | ||
|
|
91d8a16db2 | ||
|
|
920b0fcb2e | ||
|
|
760c3e869f | ||
|
|
c48107acd9 | ||
|
|
4671518409 | ||
|
|
41bf943f49 | ||
|
|
6488a0f2fb | ||
|
|
efe45f64bc | ||
|
|
d893dd55ff | ||
|
|
f40c6a8617 | ||
|
|
fb98ca7b19 | ||
|
|
451ec49d9c | ||
|
|
1709eb038c | ||
|
|
e69d6cefee | ||
|
|
7abe01ed8c | ||
|
|
17a371d86a | ||
|
|
5b787d56e6 | ||
|
|
33d98114ba | ||
|
|
ce5f0b7785 | ||
|
|
9204b87f3a | ||
|
|
4a83314095 | ||
|
|
99ea119483 | ||
|
|
c361f16fcf | ||
|
|
b4d4fb900e | ||
|
|
0c3b34e89a | ||
|
|
a549615257 | ||
|
|
c796474bce | ||
|
|
26aea439c6 | ||
|
|
32cfb749af | ||
|
|
b79cbf8975 | ||
|
|
3ef154949d | ||
|
|
007b17a7ba | ||
|
|
8c64434069 | ||
|
|
ff1d5bc965 | ||
|
|
346b8683ac | ||
|
|
7a61b09a85 | ||
|
|
53f5a6fa57 | ||
|
|
95172ce4c1 | ||
|
|
84ecdfee71 | ||
|
|
537c5f4ee8 | ||
|
|
68ee0f7580 | ||
|
|
178193ab1a | ||
|
|
e7ddae713f | ||
|
|
bd2883d63f | ||
|
|
12c3c6c472 | ||
|
|
1c08fa2b1a | ||
|
|
24991dc17d | ||
|
|
9261f105e3 | ||
|
|
51f29e112a | ||
|
|
ca8805683d | ||
|
|
8295bd8243 | ||
|
|
7a4b234c6d | ||
|
|
da95d1bb1e | ||
|
|
a1680ddeaa | ||
|
|
871333d3a0 | ||
|
|
5c81d7863c | ||
|
|
354831338c | ||
|
|
593abccedc | ||
|
|
e5c6788243 | ||
|
|
a358f2953a | ||
|
|
9444b63f8b | ||
|
|
79df293fc4 | ||
|
|
be0573f6ea | ||
|
|
4dc6264c64 | ||
|
|
bbc4fd6c79 | ||
|
|
732ff8ecab | ||
|
|
3a0c7168c9 | ||
|
|
41b7aadbda | ||
|
|
a0e475b277 | ||
|
|
834d6938db | ||
|
|
a7ad34bd99 | ||
|
|
dfabceb3d2 | ||
|
|
5499f2edb6 | ||
|
|
935fb98013 | ||
|
|
665fa6cc9c | ||
|
|
772f07e521 | ||
|
|
2bbf219dc0 | ||
|
|
7cc98b8265 | ||
|
|
1808fd3d6e | ||
|
|
0b5c1dcfa7 | ||
|
|
1369f941f2 | ||
|
|
2101c6d0dc | ||
|
|
1993fc6a2c | ||
|
|
b9b43d1f05 | ||
|
|
8d53cf3c77 | ||
|
|
756ddaa97d | ||
|
|
89f64e423d | ||
|
|
ec5596b1a3 | ||
|
|
2de89e31c0 | ||
|
|
9ca5598b6f | ||
|
|
05863276ef | ||
|
|
5ac518f311 | ||
|
|
41f488f8da | ||
|
|
6cc6e51878 | ||
|
|
78bcf84127 | ||
|
|
6b224823f1 | ||
|
|
2734b2f605 | ||
|
|
1ee88d5836 | ||
|
|
2dfd6b76d8 | ||
|
|
330b2e6a6b | ||
|
|
896c25dc9e | ||
|
|
3b04315a38 | ||
|
|
33fffa6a50 | ||
|
|
dbd825f0b6 | ||
|
|
8ab0078d5a | ||
|
|
c381bc8304 | ||
|
|
fb20b58369 | ||
|
|
906017e0c1 | ||
|
|
266369ee04 | ||
|
|
308ac14dbe | ||
|
|
2a9da76512 | ||
|
|
8e43550841 | ||
|
|
75ac0201d8 | ||
|
|
8d9efe4ff7 | ||
|
|
593400743a | ||
|
|
42ff8eaeb0 | ||
|
|
5c2f9946f8 | ||
|
|
63161e62a2 | ||
|
|
c84983ad5b | ||
|
|
3cee53508e | ||
|
|
fde75e1ed5 | ||
|
|
16d2f607c8 | ||
|
|
816a3ebd93 | ||
|
|
d59fe2fa3c | ||
|
|
ef55e7d219 | ||
|
|
424da520cf | ||
|
|
08cb311e5e | ||
|
|
e1b5875c5b | ||
|
|
7d27206fec | ||
|
|
18d405d798 | ||
|
|
34fa50fcf0 | ||
|
|
ca3cf2ea3c | ||
|
|
76fb11366b |
@@ -13,6 +13,5 @@ indent_style = space
|
|||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
# 2 space indentation
|
# 2 space indentation
|
||||||
[*.yaml, *.yml]
|
[*.{yaml,.yml}]
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -38,7 +38,9 @@ Thumbs.db
|
|||||||
# phpstorm
|
# phpstorm
|
||||||
.idea/*
|
.idea/*
|
||||||
|
|
||||||
|
# testing stuff
|
||||||
tests/_output/*
|
tests/_output/*
|
||||||
tests/_support/_generated/*
|
tests/_support/_generated/*
|
||||||
tests/cache/*
|
tests/cache/*
|
||||||
tests/error.log
|
tests/error.log
|
||||||
|
system/templates/testing/*
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
language: php
|
language: php
|
||||||
php:
|
php:
|
||||||
- '5.6'
|
|
||||||
- '7.0.21'
|
|
||||||
- '7.1'
|
- '7.1'
|
||||||
- '7.2'
|
- '7.2'
|
||||||
|
- '7.3'
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
@@ -53,7 +52,7 @@ before_install:
|
|||||||
- if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
|
- if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
|
||||||
composer install --dev --prefer-dist;
|
composer install --dev --prefer-dist;
|
||||||
fi
|
fi
|
||||||
- if [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "5.6" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
|
- if [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "7.1" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
|
||||||
export TRAVIS_TAG=$(curl --fail --user "${GH_API_USER}" -s https://api.github.com/repos/getgrav/grav/releases/latest | grep tag_name | head -n 1 | cut -d '"' -f 4);
|
export TRAVIS_TAG=$(curl --fail --user "${GH_API_USER}" -s https://api.github.com/repos/getgrav/grav/releases/latest | grep tag_name | head -n 1 | cut -d '"' -f 4);
|
||||||
eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.8 bash)";
|
eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.8 bash)";
|
||||||
go get github.com/aktau/github-release;
|
go get github.com/aktau/github-release;
|
||||||
@@ -70,7 +69,7 @@ script:
|
|||||||
vendor/bin/codecept run;
|
vendor/bin/codecept run;
|
||||||
fi
|
fi
|
||||||
- echo "Latest Release Tag - ${TRAVIS_TAG}"
|
- echo "Latest Release Tag - ${TRAVIS_TAG}"
|
||||||
- if [ ! -z "$TRAVIS_TAG" ] && [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "5.6" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
|
- if [ ! -z "$TRAVIS_TAG" ] && [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "7.1" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
|
||||||
FILES="$RT_DEVTOOLS/grav-dist/*.zip";
|
FILES="$RT_DEVTOOLS/grav-dist/*.zip";
|
||||||
for file in ${FILES[@]}; do
|
for file in ${FILES[@]}; do
|
||||||
NAME=${file##*/};
|
NAME=${file##*/};
|
||||||
|
|||||||
321
CHANGELOG.md
321
CHANGELOG.md
@@ -1,38 +1,333 @@
|
|||||||
# v1.5.0-rc.1
|
# v1.6.4
|
||||||
## 07/31/2018
|
## 04/15/2019
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Improved `redirect_default_route` logic as well as `Uri::toArray()` to take into account `root_path` and `extension`
|
||||||
|
* Rework logic to pull out excluded files from pipeline more reliably [#2445](https://github.com/getgrav/grav/issues/2445)
|
||||||
|
* Better logic in `Utils::normalizePath` to handle externals properly [#2216](https://github.com/getgrav/grav/issues/2216)
|
||||||
|
* Fixed to force all `Page::taxonomy` to be treated as strings [#2446](https://github.com/getgrav/grav/issues/2446)
|
||||||
|
* Fixed issue with `Grav['user']` not being available [form#332](https://github.com/getgrav/grav-plugin-form/issues/332)
|
||||||
|
* Updated rounding logic for `Utils::parseSize()` [#2394](https://github.com/getgrav/grav/issues/2394)
|
||||||
|
* Fixed Flex simple storage not being properly initialized if used with caching
|
||||||
|
|
||||||
|
# v1.6.3
|
||||||
|
## 04/12/2019
|
||||||
|
|
||||||
1. [](#new)
|
1. [](#new)
|
||||||
* Added twig filters for casting values: `|string`, `|int`, `|bool`, `|float`, `|array`
|
* Added `Blueprint::addDynamicHandler()` method to allow custom dynamic handlers, for example `custom-options@: getCustomOptions`
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Missed a `CacheCommand` reference in `bin/grav` [#2442](https://github.com/getgrav/grav/issues/2442)
|
||||||
|
* Fixed issue with `Utils::normalizePath` messing with external URLs [#2216](https://github.com/getgrav/grav/issues/2216)
|
||||||
|
* Fix for `vUndefined` versions when upgrading
|
||||||
|
|
||||||
|
# v1.6.2
|
||||||
|
## 04/11/2019
|
||||||
|
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Revert renaming of `ClearCacheCommand` to ensure CLI GPM upgrades go smoothly
|
||||||
|
|
||||||
|
# v1.6.1
|
||||||
|
## 04/11/2019
|
||||||
|
|
||||||
1. [](#improved)
|
1. [](#improved)
|
||||||
* Added `MediaTrait::clearMediaCache()` to allow cache to be cleared
|
* Improved CSS for the bottom filter bar of DebugBar
|
||||||
* Added `MediaTrait::getMediaCache()` to allow custom caching
|
|
||||||
1. [](#bugfix)
|
1. [](#bugfix)
|
||||||
* Made `|markdown` filter HTML safe
|
* Fixed issue with `@import` not being added to top of pipelined css [#2440](https://github.com/getgrav/grav/issues/2440)
|
||||||
|
|
||||||
# v1.5.0-beta.2
|
# v1.6.0
|
||||||
## 07/13/2018
|
## 04/11/2019
|
||||||
|
|
||||||
1. [](#new)
|
1. [](#new)
|
||||||
* Made `ObjectCollection::matching()` criteria expressions to behave more like in Twig
|
* Set minimum requirements to [PHP 7.1.3](https://getgrav.org/blog/raising-php-requirements-2018)
|
||||||
* Criteria: Added support for `LENGTH()`, `LOWER()`, `UPPER()`, `LTRIM()`, `RTRIM()` and `TRIM()`
|
* New `Scheduler` functionality for periodic jobs
|
||||||
|
* New `Backup` functionality with multiple backup profiles and scheduler integration
|
||||||
|
* Refactored `Assets Manager` to be more powerful and flexible
|
||||||
|
* Updated Doctrine Collections to 1.6
|
||||||
|
* Updated Doctrine Cache to 1.8
|
||||||
|
* Updated Symfony Components to 4.2
|
||||||
|
* Added new Cache purge functionality old cache manually via CLI/Admin as well as scheduler integration
|
||||||
|
* Added new `{% throw 404 'Not Found' %}` twig tag (with custom code/message)
|
||||||
|
* Added `Grav\Framework\File` classes for handling YAML, Markdown, JSON, INI and PHP serialized files
|
||||||
|
* Added `Grav\Framework\Collection\AbstractIndexCollection` class
|
||||||
|
* Added `Grav\Framework\Object\ObjectIndex` class
|
||||||
|
* Added `Grav\Framework\Flex` classes
|
||||||
|
* Added support for hiding form fields in blueprints by using dynamic property like `security@: admin.foobar`, `scope@: object` or `scope-ignore@: object` to any field
|
||||||
|
* New experimental **FlexObjects** powered `Users` for increased performance and capability (**disabled** by default)
|
||||||
|
* Added PSR-7 and PSR-15 classes
|
||||||
|
* Added `Grav\Framework\DI\Container` class
|
||||||
|
* Added `Grav\Framework\RequestHandler\RequestHandler` class
|
||||||
|
* Added `Page::httpResponseCode()` and `Page::httpHeaders()` methods
|
||||||
|
* Added `Grav\Framework\Form\Interfaces\FormInterface`
|
||||||
|
* Added `Grav\Framework\Form\Interfaces\FormFactoryInterface`
|
||||||
|
* Added `Grav\Framework\Form\FormTrait`
|
||||||
|
* Added `Page::forms()` method to get normalized list of all form headers defined in the page
|
||||||
|
* Added `onPageAction`, `onPageTask`, `onPageAction.{$action}` and `onPageTask.{$task}` events
|
||||||
|
* Added `Blueprint::processForm()` method to filter form inputs
|
||||||
|
* Move `processMarkdown()` method from `TwigExtension` to more general `Utils` class
|
||||||
|
* Added support to include extra files into `Media` (such as uploaded files)
|
||||||
|
* Added form preview support for `FlexObject`, including a way to render newly uploaded files before saving them
|
||||||
|
* Added `FlexObject::getChanges()` to determine what fields change during an update
|
||||||
|
* Added `arrayDiffMultidimensional`, `arrayIsAssociative`, `arrayCombine` Util functions
|
||||||
|
* New `$grav['users']` service to allow custom user classes implementing `UserInterface`
|
||||||
|
* Added `LogViewer` helper class and CLI command: `bin/grav logviewer`
|
||||||
|
* Added `select()` and `unselect()` methods to `CollectionInterface` and its base classes
|
||||||
|
* Added `orderBy()` and `limit()` methods to `ObjectCollectionInterface` and its base classes
|
||||||
|
* Added `user-data://` which is a writable stream (`user://data` is not and should be avoided)
|
||||||
|
* Added support for `/action:{$action}` (like task but used without nonce when only receiving data)
|
||||||
|
* Added `onAction.{$action}` event
|
||||||
|
* Added `Grav\Framework\Form\FormFlash` class to contain AJAX uploaded files in more reliable way
|
||||||
|
* Added `Grav\Framework\Form\FormFlashFile` class which implements `UploadedFileInterface` from PSR-7
|
||||||
|
* Added `Grav\Framework\Filesystem\Filesystem` class with methods to manipulate stream URLs
|
||||||
|
* Added new `$grav['filesystem']` service using an instance of the new `Filesystem` object
|
||||||
|
* Added `{% render object layout: 'default' with { variable: true } %}` for Flex objects and collections
|
||||||
|
* Added `$grav->setup()` to simplify CLI and custom access points
|
||||||
|
* Added `CsvFormatter` and `CsvFile` classes
|
||||||
|
* Added new system config option to `pages.hide_empty_folders` if a folder has no valid `.md` file available. Default behavior is `false` for compatibility.
|
||||||
|
* Added new system config option for `languages.pages_fallback_only` forcing only 'fallback' to find page content through supported languages, default behavior is to display any language found if active language is missing
|
||||||
|
* Added `Utils::arrayFlattenDotNotation()` and `Utils::arrayUnflattenDotNotation()` helper methods
|
||||||
|
1. [](#improved)
|
||||||
|
* Add the page to onMarkdownInitialized event [#2412](https://github.com/getgrav/grav/issues/2412)
|
||||||
|
* Doctrine filecache is now namespaced with prefix to support purging
|
||||||
|
* Register all page types into `blueprint://pages` stream
|
||||||
|
* Removed `apc` and `xcache` support, made `apc` alias of `apcu`
|
||||||
|
* Support admin and regular translations via the `|t` twig filter and `t()` twig function
|
||||||
|
* Improved Grav Core installer/updater to run installer script
|
||||||
|
* Updated vendor libraries including Symfony `4.2.3`
|
||||||
|
* Renamed old `User` class to `Grav\Common\User\DataUser\User` with multiple improvements and small fixes
|
||||||
|
* `User` class now acts as a compatibility layer to older versions of Grav
|
||||||
|
* Deprecated `new User()`, `User::load()`, `User::find()` and `User::delete()` in favor of `$grav['users']` service
|
||||||
|
* `Media` constructor has now support to not to initialize the media objects
|
||||||
|
* Cleanly handle session corruption due to changing Flex object types
|
||||||
|
* Added `FlexObjectInterface::getDefaultValue()` and `FormInterface::getDefaultValue()`
|
||||||
|
* Added new `onPageContent()` event for every call to `Page::content()`
|
||||||
|
* Added phpstan: PHP Static Analysis Tool [#2393](https://github.com/getgrav/grav/pull/2393)
|
||||||
|
* Added `composer test-plugins` to test plugin issues with the current version of Grav
|
||||||
|
* Added `Flex::getObjects()` and `Flex::getMixedCollection()` methods for co-mingled collections
|
||||||
|
* Added support to use single Flex key parameter in `Flex::getObject()` method
|
||||||
|
* Added `FlexObjectInterface::search()` and `FlexCollectionInterface::search()` methods
|
||||||
|
* Override `system.media.upload_limit` with PHP's `post_max_size` or `upload_max_filesize`
|
||||||
|
* Class `Grav\Common\Page\Medium\AbstractMedia` now use array traits instead of extending `Grav\Common\Getters`
|
||||||
|
* Implemented `Grav\Framework\Psr7` classes as `Nyholm/psr7` decorators
|
||||||
|
* Added a new `cache-clear` scheduled job to go along with `cache-purge`
|
||||||
|
* Renamed `Grav\Framework\File\Formatter\FormatterInterface` to `Grav\Framework\File\Interfaces\FileFormatterInterface`
|
||||||
|
* Improved `File::save()` to use a temporary file if file isn't locked
|
||||||
|
* Improved `|t` filter to better support admin `|tu` style filter if in admin
|
||||||
|
* Update all classes to rely on `PageInterface` instead of `Page` class
|
||||||
|
* Better error checking in `bin/plugin` for existence and enabled
|
||||||
|
* Removed `media.upload_limit` references
|
||||||
|
* Twig `nicenumber`: do not use 0 + string casting hack
|
||||||
|
* Converted Twig tags to use namespaced Twig classes
|
||||||
|
* Site shows error on page rather than hard-crash when page has invalid frontmatter [#2343](https://github.com/getgrav/grav/issues/2343)
|
||||||
|
* Added `languages.default_lang` option to override the default lang (usually first supported language)
|
||||||
|
* Added `Content-Type: application/json` body support for PSR-7 `ServerRequest`
|
||||||
|
* Remove PHP time limit in `ZipArchive`
|
||||||
|
* DebugBar: Resolve twig templates in deprecated backtraces in order to help locating Twig issues
|
||||||
|
* Added `$grav['cache']->getSimpleCache()` method for getting PSR-16 compatible cache
|
||||||
|
* MediaTrait: Use PSR-16 cache
|
||||||
|
* Improved `Utils::normalizePath()` to support non-protocol URLs
|
||||||
|
* Added ability to reset `Page::metadata` to allow rebuilding from automatically generated values
|
||||||
|
* Added back missing `page.types` field in system content configuration [admin#1612](https://github.com/getgrav/grav-plugin-admin/issues/1612)
|
||||||
|
* Console commands: add method for invalidating cache
|
||||||
|
* Updated languages
|
||||||
|
* Improved `$page->forms()` call, added `$page->addForms()`
|
||||||
|
* Updated languages from crowdin
|
||||||
|
* Fixed `ImageMedium` constructor warning when file does not exist
|
||||||
|
* Improved `Grav\Common\User` class; added `$user->update()` method
|
||||||
|
* Added trim support for text input fields `validate: trim: true`
|
||||||
|
* Improved `Grav\Framework\File\Formatter` classes to have abstract parent class and some useful methods
|
||||||
|
* Support negotiated content types set via the Request `Accept:` header
|
||||||
|
* Support negotiated language types set via the Request `Accept-Language:` header
|
||||||
|
* Cleaned up and sorted the Service `idMap`
|
||||||
|
* Updated `Grav` container object to implement PSR-11 `ContainerInterface`
|
||||||
|
* Updated Grav `Processor` classes to implement PSR-15 `MiddlewareInterface`
|
||||||
|
* Make `Data` class to extend `JsonSerializable`
|
||||||
|
* Modified debugger icon to use retina space-dude version
|
||||||
|
* Added missing `Video::preload()` method
|
||||||
|
* Set session name based on `security.salt` rather than `GRAV_ROOT` [#2242](https://github.com/getgrav/grav/issues/2242)
|
||||||
|
* Added option to configure list of `xss_invalid_protocols` in `Security` config [#2250](https://github.com/getgrav/grav/issues/2250)
|
||||||
|
* Smarter `security.salt` checking now we use `security.yaml` for other options
|
||||||
|
* Added apcu autoloader optimization
|
||||||
|
* Additional helper methods in `Language`, `Languages`, and `LanguageCodes` classes
|
||||||
|
* Call `onFatalException` event also on internal PHP errors
|
||||||
|
* Built-in PHP Webserver: log requests before handling them
|
||||||
|
* Added support for syslog and syslog facility logging (default: 'file')
|
||||||
|
* Improved usability of `System` configuration blueprint with side-tabs
|
||||||
1. [](#bugfix)
|
1. [](#bugfix)
|
||||||
* Fixed regression in 1.5.0-beta.1 blueprint extend and embed
|
* Fixed issue with `Truncator::truncateWords` and `Truncator::truncateLetters` when string not wrapped in tags [#2432](https://github.com/getgrav/grav/issues/2432)
|
||||||
|
* Fixed `Undefined method closure::fields()` when getting avatar for user, thanks @Romarain [#2422](https://github.com/getgrav/grav/issues/2422)
|
||||||
|
* Fixed cached images not being updated when source image is modified
|
||||||
|
* Fixed deleting last list item in the form
|
||||||
|
* Fixed issue with `Utils::url()` method would append extra `base_url` if URL already included it
|
||||||
|
* Fixed `mkdir(...)` race condition
|
||||||
|
* Fixed `Obtaining write lock failed on file...`
|
||||||
|
* Fixed potential undefined property in `onPageNotFound` event handling
|
||||||
|
* Fixed some potential issues/bugs found by phpstan
|
||||||
|
* Fixed regression in GPM packages casted to Array (ref, getgrav/grav-plugin-admin@e3fc4ce)
|
||||||
|
* Fixed session_start(): Setting option 'session.name' failed [#2408](https://github.com/getgrav/grav/issues/2408)
|
||||||
|
* Fixed validation for select field type with selectize
|
||||||
|
* Fixed validation for boolean toggles
|
||||||
|
* Fixed non-namespaced exceptions in scheduler
|
||||||
|
* Fixed trailing slash redirect in multlang environment [#2350](https://github.com/getgrav/grav/issues/2350)
|
||||||
|
* Fixed some issues related to Medium objects losing query string attributes
|
||||||
|
* Broke out Medium timestamp so it's not cleared on `reset()`s
|
||||||
|
* Fixed issue with `redirect_trailing_slash` losing query string [#2269](https://github.com/getgrav/grav/issues/2269)
|
||||||
|
* Fixed failed login if user attempts to log in with upper case non-english letters
|
||||||
|
* Removed extra authenticated/authorized fields when saving existing user from a form
|
||||||
|
* Fixed `Grav\Framework\Route::__toString()` returning relative URL, not relative route
|
||||||
|
* Fixed handling of `append_url_extension` inside of `Page::templateFormat()` [#2264](https://github.com/getgrav/grav/issues/2264)
|
||||||
|
* Fixed a broken language string [#2261](https://github.com/getgrav/grav/issues/2261)
|
||||||
|
* Fixed clearing cache having no effect on Doctrine cache
|
||||||
|
* Fixed `Medium::relativePath()` for streams
|
||||||
|
* Fixed `Object` serialization breaking if overriding `jsonSerialize()` method
|
||||||
|
* Fixed `YamlFormatter::decode()` when calling `init_set()` with integer
|
||||||
|
* Fixed session throwing error in CLI if initialized
|
||||||
|
* Fixed `Uri::hasStandardPort()` to support reverse proxy configurations [#1786](https://github.com/getgrav/grav/issues/1786)
|
||||||
|
* Use `append_url_extension` from page header to set template format if set [#2604](https://github.com/getgrav/grav/pull/2064)
|
||||||
|
* Fixed some bugs in Grav environment selection logic
|
||||||
|
* Use login provider User avatar if set
|
||||||
|
* Fixed `Folder::doDelete($folder, false)` removing symlink when it should not
|
||||||
|
* Fixed asset manager to not add empty assets when they don't exist in the filesystem
|
||||||
|
* Update `script` and `style` Twig tags to use the new `Assets` classes
|
||||||
|
* Fixed asset pipeline to rewrite remote URLs as well as local [#2216](https://github.com/getgrav/grav/issues/2216)
|
||||||
|
|
||||||
# v1.5.0-beta.1
|
# v1.5.10
|
||||||
## 06/19/2018
|
## 03/21/2019
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `deferred` Twig extension
|
||||||
|
|
||||||
|
# v1.5.9
|
||||||
|
## 03/20/2019
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `onPageContent()` event for every call to `Page::content()`
|
||||||
|
1. [](#improved)
|
||||||
|
* Fixed phpdoc generation
|
||||||
|
* Updated vendor libraries
|
||||||
|
* Force Toolbox v1.4.2
|
||||||
|
1. [](#bugfix)
|
||||||
|
* EXIF fix for streams
|
||||||
|
* Fix for User avatar not working due to uppercase or spaces in email [#2403](https://github.com/getgrav/grav/pull/2403)
|
||||||
|
|
||||||
|
# v1.5.8
|
||||||
|
## 02/07/2019
|
||||||
|
|
||||||
|
1. [](#improved)
|
||||||
|
* Improved `User` unserialize to not to break the object if serialized data is not what expected
|
||||||
|
* Removed unused parameter [#2357](https://github.com/getgrav/grav/pull/2357)
|
||||||
|
|
||||||
|
# v1.5.7
|
||||||
|
## 01/25/2019
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Support for AWS Cloudfront forwarded scheme header [#2297](https://github.com/getgrav/grav/pull/2297)
|
||||||
|
1. [](#improved)
|
||||||
|
* Set homepage with `https://` protocol [#2299](https://github.com/getgrav/grav/pull/2299)
|
||||||
|
* Preserve accents in fields containing Twig expr. using unicode [#2279](https://github.com/getgrav/grav/pull/2279)
|
||||||
|
* Updated vendor libraries
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Support spaces with filenames in responsive images [#2300](https://github.com/getgrav/grav/pull/2300)
|
||||||
|
|
||||||
|
# v1.5.6
|
||||||
|
## 12/14/2018
|
||||||
|
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated InitializeProcessor.php to use lang-safe redirect [#2268](https://github.com/getgrav/grav/pull/2268)
|
||||||
|
* Improved user serialization to use less memory in the session
|
||||||
|
|
||||||
|
# v1.5.5
|
||||||
|
## 11/12/2018
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Register theme prefixes as namespaces in Twig [#2210](https://github.com/getgrav/grav/pull/2210)
|
||||||
|
1. [](#improved)
|
||||||
|
* Propogate error code between 400 and 600 for production sites [#2181](https://github.com/getgrav/grav/pull/2181)
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Remove hardcoded `302` when redirecting trailing slash [#2155](https://github.com/getgrav/grav/pull/2155)
|
||||||
|
|
||||||
|
# v1.5.4
|
||||||
|
## 11/05/2018
|
||||||
|
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated default page `index.md` with some consistency fixes [#2245](https://github.com/getgrav/grav/pull/2245)
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Fixed fatal error if calling `$session->invalidate()` when there's no active session
|
||||||
|
* Fixed typo in media.yaml for `webm` extension [#2220](https://github.com/getgrav/grav/pull/2220)
|
||||||
|
* Fixed markdown processing for telephone links [#2235](https://github.com/getgrav/grav/pull/2235)
|
||||||
|
|
||||||
|
# v1.5.3
|
||||||
|
## 10/08/2018
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added `Utils::getMimeByFilename()`, `Utils::getMimeByLocalFile()` and `Utils::checkFilename()` methods
|
||||||
|
* Added configurable dangerous upload extensions in `security.yaml`
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated vendor libraries to latest
|
||||||
|
|
||||||
|
# v1.5.2
|
||||||
|
## 10/01/2018
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added new `Security` class for Grav security functionality including XSS checks
|
||||||
|
* Added new `bin/grav security` command to scan for security issues
|
||||||
|
* Added new `xss()` Twig function to allow for XSS checks on strings and arrays
|
||||||
|
* Added `onHttpPostFilter` event to allow plugins to globally clean up XSS in the forms and tasks
|
||||||
|
* Added `Deprecated` tab to DebugBar to catch future incompatibilities with later Grav versions
|
||||||
|
* Added deprecation notices for features which will be removed in Grav 2.0
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated vendor libraries to latest
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Allow `$page->slug()` to be called before `$page->init()` without breaking the page
|
||||||
|
* Fix for `Page::translatedLanguages()` to use routes always [#2163](https://github.com/getgrav/grav/issues/2163)
|
||||||
|
* Fixed `nicetime()` twig function
|
||||||
|
* Allow twig tags `{% script %}`, `{% style %}` and `{% switch %}` to be placed outside of blocks
|
||||||
|
* Session expires in 30 mins independent from config settings [login#178](https://github.com/getgrav/grav-plugin-login/issues/178)
|
||||||
|
|
||||||
|
# v1.5.1
|
||||||
|
## 08/23/2018
|
||||||
|
|
||||||
|
1. [](#new)
|
||||||
|
* Added static `Grav\Common\Yaml` class which should be used instead of `Symfony\Component\Yaml\Yaml`
|
||||||
|
1. [](#improved)
|
||||||
|
* Updated deprecated Twig code so it works in both in Twig 1.34+ and Twig 2.4+
|
||||||
|
* Switched to new Grav Yaml class to support Native + Fallback YAML libraries
|
||||||
|
1. [](#bugfix)
|
||||||
|
* Broken handling of user folder in Grav URI object [#2151](https://github.com/getgrav/grav/issues/2151)
|
||||||
|
|
||||||
|
# v1.5.0
|
||||||
|
## 08/17/2018
|
||||||
|
|
||||||
1. [](#new)
|
1. [](#new)
|
||||||
* Set minimum requirements to [PHP 5.6.4](https://getgrav.org/blog/raising-php-requirements-2018)
|
* Set minimum requirements to [PHP 5.6.4](https://getgrav.org/blog/raising-php-requirements-2018)
|
||||||
* Updated Doctrine Collections to 1.4
|
* Updated Doctrine Collections to 1.4
|
||||||
* Updated Symfony Components to 3.4 (with compatibility mode to fall back to Symfony YAML 2.8)
|
* Updated Symfony Components to 3.4 (with compatibility mode to fall back to Symfony YAML 2.8)
|
||||||
|
* Added `Uri::method()` to get current HTTP method (GET/POST etc)
|
||||||
|
* `FormatterInterface`: Added `getSupportedFileExtensions()` and `getDefaultFileExtension()` methods
|
||||||
|
* Added option to disable `SimpleCache` key validation
|
||||||
|
* Added support for multiple repo locations for `bin/grav install` command
|
||||||
|
* Added twig filters for casting values: `|string`, `|int`, `|bool`, `|float`, `|array`
|
||||||
|
* Made `ObjectCollection::matching()` criteria expressions to behave more like in Twig
|
||||||
|
* Criteria: Added support for `LENGTH()`, `LOWER()`, `UPPER()`, `LTRIM()`, `RTRIM()` and `TRIM()`
|
||||||
* Added `Grav\Framework\File\Formatter` classes for encoding/decoding YAML, Markdown, JSON, INI and PHP serialized strings
|
* Added `Grav\Framework\File\Formatter` classes for encoding/decoding YAML, Markdown, JSON, INI and PHP serialized strings
|
||||||
* Added `Grav\Framework\Session` class to replace `RocketTheme\Toolbox\Session\Session`
|
* Added `Grav\Framework\Session` class to replace `RocketTheme\Toolbox\Session\Session`
|
||||||
* Added `Grav\Common\Media` interfaces and trait; use those in `Page` and `Media` classes
|
* Added `Grav\Common\Media` interfaces and trait; use those in `Page` and `Media` classes
|
||||||
* Added `Grav\Common\Page` interface to allow custom page types in the future
|
* Added `Grav\Common\Page` interface to allow custom page types in the future
|
||||||
* Added setting to disable sessions from the site [#2013](https://github.com/getgrav/grav/issues/2013)
|
* Added setting to disable sessions from the site [#2013](https://github.com/getgrav/grav/issues/2013)
|
||||||
|
* Added new `strict_mode` settings in `system.yaml` for compatibility
|
||||||
1. [](#improved)
|
1. [](#improved)
|
||||||
|
* Improved `Utils::url()` to support query strings
|
||||||
|
* Display better exception message if Grav fails to initialize
|
||||||
|
* Added `muted` and `playsinline` support to videos [#2124](https://github.com/getgrav/grav/pull/2124)
|
||||||
|
* Added `MediaTrait::clearMediaCache()` to allow cache to be cleared
|
||||||
|
* Added `MediaTrait::getMediaCache()` to allow custom caching
|
||||||
* Improved session handling, allow all session configuration options in `system.session.options`
|
* Improved session handling, allow all session configuration options in `system.session.options`
|
||||||
1. [](#bugfix)
|
1. [](#bugfix)
|
||||||
|
* Fix broken form nonce logic [#2121](https://github.com/getgrav/grav/pull/2121)
|
||||||
|
* Fixed issue with uppercase extensions and fallback media URLs [#2133](https://github.com/getgrav/grav/issues/2133)
|
||||||
|
* Fixed theme inheritance issue with `camel-case` that includes numbers [#2134](https://github.com/getgrav/grav/issues/2134)
|
||||||
|
* Typo in demo typography page [#2136](https://github.com/getgrav/grav/pull/2136)
|
||||||
|
* Fix for incorrect plugin order in debugger panel
|
||||||
|
* Made `|markdown` filter HTML safe
|
||||||
* Fixed bug in `ContentBlock` serialization
|
* Fixed bug in `ContentBlock` serialization
|
||||||
* Fixed `Route::withQueryParam()` to accept array values
|
* Fixed `Route::withQueryParam()` to accept array values
|
||||||
* Fixed typo in truncate function [#1943](https://github.com/getgrav/grav/issues/1943)
|
* Fixed typo in truncate function [#1943](https://github.com/getgrav/grav/issues/1943)
|
||||||
|
|||||||
89
README.md
89
README.md
@@ -1,24 +1,27 @@
|
|||||||
#  Grav
|
#  Grav
|
||||||
|
|
||||||
[](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad) [](https://chat.getgrav.org) [](https://travis-ci.org/getgrav/grav) [](#backers) [](#sponsors)
|
[](https://github.com/phpstan/phpstan)
|
||||||
|
[](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad)
|
||||||
|
[](https://chat.getgrav.org)
|
||||||
|
[](https://travis-ci.org/getgrav/grav) [](#backers) [](#sponsors)
|
||||||
|
|
||||||
Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.
|
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](https://twig.sensiolabs.org/): for powerful control of the user interface
|
||||||
* [Markdown](http://en.wikipedia.org/wiki/Markdown): for easy content creation
|
* [Markdown](https://en.wikipedia.org/wiki/Markdown): for easy content creation
|
||||||
* [YAML](http://yaml.org): for simple configuration
|
* [YAML](https://yaml.org): for simple configuration
|
||||||
* [Parsedown](http://parsedown.org/): for fast Markdown and Markdown Extra support
|
* [Parsedown](https://parsedown.org/): for fast Markdown and Markdown Extra support
|
||||||
* [Doctrine Cache](http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
|
* [Doctrine Cache](https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
|
||||||
* [Pimple Dependency Injection Container](http://pimple.sensiolabs.org/): for extensibility and maintainability
|
* [Pimple Dependency Injection Container](https://pimple.sensiolabs.org/): for extensibility and maintainability
|
||||||
* [Symfony Event Dispatcher](http://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
|
* [Symfony Event Dispatcher](https://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](https://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
|
# Requirements
|
||||||
|
|
||||||
- PHP 5.6.4 or higher. Check the [required modules list](https://learn.getgrav.org/basics/requirements#php-requirements)
|
- PHP 7.1.3 or higher. Check the [required modules list](https://learn.getgrav.org/basics/requirements#php-requirements)
|
||||||
- Check the [Apache](https://learn.getgrav.org/basics/requirements#apache-requirements) or [IIS](https://learn.getgrav.org/basics/requirements#iis-requirements) requirements
|
- Check the [Apache](https://learn.getgrav.org/basics/requirements#apache-requirements) or [IIS](https://learn.getgrav.org/basics/requirements#iis-requirements) requirements
|
||||||
|
|
||||||
# QuickStart
|
# QuickStart
|
||||||
@@ -94,7 +97,7 @@ If you discover a possible security issue related to Grav or one of its plugins,
|
|||||||
* [Install](https://learn.getgrav.org/basics/installation) Grav in few seconds
|
* [Install](https://learn.getgrav.org/basics/installation) Grav in few seconds
|
||||||
* Understand the [Configuration](https://learn.getgrav.org/basics/grav-configuration)
|
* Understand the [Configuration](https://learn.getgrav.org/basics/grav-configuration)
|
||||||
* Take a peek at our available free [Skeletons](https://getgrav.org/downloads/skeletons)
|
* Take a peek at our available free [Skeletons](https://getgrav.org/downloads/skeletons)
|
||||||
* If you have questions, jump on our [Slack Room](https://getgrav.org/slack)!
|
* If you have questions, jump on our [Discord Chat Server](https://chat.getgrav.org)!
|
||||||
* Have fun!
|
* Have fun!
|
||||||
|
|
||||||
# Exploring More
|
# Exploring More
|
||||||
@@ -103,75 +106,17 @@ If you discover a possible security issue related to Grav or one of its plugins,
|
|||||||
* Dive into more [advanced](https://learn.getgrav.org/advanced) functions
|
* Dive into more [advanced](https://learn.getgrav.org/advanced) functions
|
||||||
* Learn about the [Grav CLI](https://learn.getgrav.org/cli-console/grav-cli)
|
* Learn about the [Grav CLI](https://learn.getgrav.org/cli-console/grav-cli)
|
||||||
* Review examples in the [Grav Cookbook](https://learn.getgrav.org/cookbook)
|
* Review examples in the [Grav Cookbook](https://learn.getgrav.org/cookbook)
|
||||||
|
* More [Awesome Grav Stuff](https://github.com/getgrav/awesome-grav)
|
||||||
|
|
||||||
# Backers
|
# Backers
|
||||||
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)]
|
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)]
|
||||||
|
|
||||||
<a href="https://opencollective.com/grav/backer/0/website" target="_blank"><img src="https://opencollective.com/grav/backer/0/avatar.svg"></a>
|
<img src="https://opencollective.com/grav/tiers/backers.svg?avatarHeight=36&width=600" />
|
||||||
<a href="https://opencollective.com/grav/backer/1/website" target="_blank"><img src="https://opencollective.com/grav/backer/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/2/website" target="_blank"><img src="https://opencollective.com/grav/backer/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/3/website" target="_blank"><img src="https://opencollective.com/grav/backer/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/4/website" target="_blank"><img src="https://opencollective.com/grav/backer/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/5/website" target="_blank"><img src="https://opencollective.com/grav/backer/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/6/website" target="_blank"><img src="https://opencollective.com/grav/backer/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/7/website" target="_blank"><img src="https://opencollective.com/grav/backer/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/8/website" target="_blank"><img src="https://opencollective.com/grav/backer/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/9/website" target="_blank"><img src="https://opencollective.com/grav/backer/9/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/10/website" target="_blank"><img src="https://opencollective.com/grav/backer/10/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/11/website" target="_blank"><img src="https://opencollective.com/grav/backer/11/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/12/website" target="_blank"><img src="https://opencollective.com/grav/backer/12/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/13/website" target="_blank"><img src="https://opencollective.com/grav/backer/13/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/14/website" target="_blank"><img src="https://opencollective.com/grav/backer/14/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/15/website" target="_blank"><img src="https://opencollective.com/grav/backer/15/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/16/website" target="_blank"><img src="https://opencollective.com/grav/backer/16/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/17/website" target="_blank"><img src="https://opencollective.com/grav/backer/17/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/18/website" target="_blank"><img src="https://opencollective.com/grav/backer/18/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/19/website" target="_blank"><img src="https://opencollective.com/grav/backer/19/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/20/website" target="_blank"><img src="https://opencollective.com/grav/backer/20/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/21/website" target="_blank"><img src="https://opencollective.com/grav/backer/21/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/22/website" target="_blank"><img src="https://opencollective.com/grav/backer/22/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/23/website" target="_blank"><img src="https://opencollective.com/grav/backer/23/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/24/website" target="_blank"><img src="https://opencollective.com/grav/backer/24/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/25/website" target="_blank"><img src="https://opencollective.com/grav/backer/25/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/26/website" target="_blank"><img src="https://opencollective.com/grav/backer/26/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/27/website" target="_blank"><img src="https://opencollective.com/grav/backer/27/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/28/website" target="_blank"><img src="https://opencollective.com/grav/backer/28/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/backer/29/website" target="_blank"><img src="https://opencollective.com/grav/backer/29/avatar.svg"></a>
|
|
||||||
|
|
||||||
|
|
||||||
# Sponsors
|
# Sponsors
|
||||||
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)]
|
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)]
|
||||||
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/0/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/0/avatar.svg"></a>
|
<img src="https://opencollective.com/grav/tiers/sponsors.svg?avatarHeight=36&width=600" />
|
||||||
<a href="https://opencollective.com/grav/sponsor/1/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/2/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/3/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/4/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/5/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/6/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/7/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/8/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/9/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/9/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/10/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/10/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/11/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/11/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/12/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/12/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/13/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/13/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/14/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/14/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/15/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/15/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/16/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/16/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/17/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/17/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/18/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/18/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/19/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/19/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/20/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/20/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/21/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/21/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/22/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/22/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/23/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/23/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/24/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/24/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/25/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/25/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/26/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/26/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/27/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/27/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/28/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/28/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/grav/sponsor/29/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/29/avatar.svg"></a>
|
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
31
bin/gpm
31
bin/gpm
@@ -1,26 +1,24 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php
|
<?php
|
||||||
define('GRAV_CLI', true);
|
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')){
|
|
||||||
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
use Grav\Common\Composer;
|
use Grav\Common\Composer;
|
||||||
use Grav\Common\Config\Setup;
|
use Symfony\Component\Console\Application;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')){
|
\define('GRAV_CLI', true);
|
||||||
|
\define('GRAV_REQUEST_TIME', microtime(true));
|
||||||
|
|
||||||
|
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
|
||||||
// Before we can even start, we need to run composer first
|
// Before we can even start, we need to run composer first
|
||||||
|
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
||||||
|
|
||||||
$composer = Composer::getComposerExecutor();
|
$composer = Composer::getComposerExecutor();
|
||||||
echo "Preparing to install vendor dependencies...\n\n";
|
echo "Preparing to install vendor dependencies...\n\n";
|
||||||
echo system($composer.' --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";
|
||||||
}
|
}
|
||||||
|
|
||||||
use Symfony\Component\Console\Application;
|
$autoload = require __DIR__ . '/../vendor/autoload.php';
|
||||||
use Grav\Common\Grav;
|
|
||||||
|
|
||||||
$autoload = require_once(__DIR__ . '/../vendor/autoload.php');
|
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
|
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));
|
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
|
||||||
@@ -30,7 +28,7 @@ if (!ini_get('date.timezone')) {
|
|||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists(ROOT_DIR . 'index.php')) {
|
if (!file_exists(GRAV_ROOT . '/index.php')) {
|
||||||
exit('FATAL: Must be run from ROOT directory of Grav!');
|
exit('FATAL: Must be run from ROOT directory of Grav!');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,15 +46,16 @@ $climate->arguments->add([
|
|||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
$climate->arguments->parse();
|
$climate->arguments->parse();
|
||||||
$environment = $climate->arguments->get('environment');
|
|
||||||
|
|
||||||
// Set up environment based on params.
|
// Set up environment based on params.
|
||||||
Setup::$environment = $environment;
|
$environment = $climate->arguments->get('environment');
|
||||||
|
|
||||||
$grav = Grav::instance(array('loader' => $autoload));
|
$grav = Grav::instance(array('loader' => $autoload));
|
||||||
$grav['uri']->init();
|
$grav->setup($environment);
|
||||||
|
|
||||||
$grav['config']->init();
|
$grav['config']->init();
|
||||||
$grav['streams'];
|
$grav['uri']->init();
|
||||||
|
$grav['users'];
|
||||||
|
|
||||||
$app = new Application('Grav Package Manager', GRAV_VERSION);
|
$app = new Application('Grav Package Manager', GRAV_VERSION);
|
||||||
$app->addCommands(array(
|
$app->addCommands(array(
|
||||||
|
|||||||
25
bin/grav
25
bin/grav
@@ -1,34 +1,36 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php
|
<?php
|
||||||
define('GRAV_CLI', true);
|
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')){
|
|
||||||
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
use Grav\Common\Composer;
|
use Grav\Common\Composer;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use Symfony\Component\Console\Application;
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')){
|
\define('GRAV_CLI', true);
|
||||||
|
\define('GRAV_REQUEST_TIME', microtime(true));
|
||||||
|
|
||||||
|
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
|
||||||
// Before we can even start, we need to run composer first
|
// Before we can even start, we need to run composer first
|
||||||
|
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
||||||
|
|
||||||
$composer = Composer::getComposerExecutor();
|
$composer = Composer::getComposerExecutor();
|
||||||
echo "Preparing to install vendor dependencies...\n\n";
|
echo "Preparing to install vendor dependencies...\n\n";
|
||||||
echo system($composer.' --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";
|
||||||
}
|
}
|
||||||
|
|
||||||
use Symfony\Component\Console\Application;
|
$autoload = require __DIR__ . '/../vendor/autoload.php';
|
||||||
|
|
||||||
require_once __DIR__ . '/../vendor/autoload.php';
|
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
|
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));
|
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Grav::instance(array('loader' => $autoload));
|
||||||
|
|
||||||
if (!ini_get('date.timezone')) {
|
if (!ini_get('date.timezone')) {
|
||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists(ROOT_DIR . 'index.php')) {
|
if (!file_exists(GRAV_ROOT . '/index.php')) {
|
||||||
exit('FATAL: Must be run from ROOT directory of Grav!');
|
exit('FATAL: Must be run from ROOT directory of Grav!');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,5 +43,8 @@ $app->addCommands(array(
|
|||||||
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(),
|
||||||
|
new \Grav\Console\Cli\SchedulerCommand(),
|
||||||
|
new \Grav\Console\Cli\SecurityCommand(),
|
||||||
|
new \Grav\Console\Cli\LogViewerCommand(),
|
||||||
));
|
));
|
||||||
$app->run();
|
$app->run();
|
||||||
|
|||||||
68
bin/plugin
68
bin/plugin
@@ -1,30 +1,28 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php
|
<?php
|
||||||
define('GRAV_CLI', true);
|
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')) {
|
|
||||||
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
use Grav\Common\Composer;
|
use Grav\Common\Composer;
|
||||||
|
use Symfony\Component\Console\Application;
|
||||||
|
use Symfony\Component\Console\Input\ArgvInput;
|
||||||
|
use Symfony\Component\Console\Output\ConsoleOutput;
|
||||||
|
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use Grav\Common\Filesystem\Folder;
|
||||||
|
|
||||||
if (!file_exists(__DIR__ . '/../vendor')) {
|
\define('GRAV_CLI', true);
|
||||||
|
\define('GRAV_REQUEST_TIME', microtime(true));
|
||||||
|
|
||||||
|
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
|
||||||
// Before we can even start, we need to run composer first
|
// Before we can even start, we need to run composer first
|
||||||
|
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
|
||||||
|
|
||||||
$composer = Composer::getComposerExecutor();
|
$composer = Composer::getComposerExecutor();
|
||||||
echo "Preparing to install vendor dependencies...\n\n";
|
echo "Preparing to install vendor dependencies...\n\n";
|
||||||
echo system($composer.' --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";
|
||||||
}
|
}
|
||||||
|
|
||||||
use Symfony\Component\Console\Application;
|
$autoload = require __DIR__ . '/../vendor/autoload.php';
|
||||||
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\Config\Setup;
|
|
||||||
use Grav\Common\Filesystem\Folder;
|
|
||||||
|
|
||||||
$autoload = require_once(__DIR__ . '/../vendor/autoload.php');
|
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
|
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));
|
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
|
||||||
@@ -34,7 +32,7 @@ if (!ini_get('date.timezone')) {
|
|||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists(ROOT_DIR . 'index.php')) {
|
if (!file_exists(GRAV_ROOT . '/index.php')) {
|
||||||
exit('FATAL: Must be run from ROOT directory of Grav!');
|
exit('FATAL: Must be run from ROOT directory of Grav!');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,19 +46,18 @@ $climate->arguments->add([
|
|||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
$climate->arguments->parse();
|
$climate->arguments->parse();
|
||||||
|
|
||||||
$environment = $climate->arguments->get('environment');
|
$environment = $climate->arguments->get('environment');
|
||||||
|
|
||||||
// Set up environment based on params.
|
|
||||||
Setup::$environment = $environment;
|
|
||||||
|
|
||||||
$grav = Grav::instance(array('loader' => $autoload));
|
$grav = Grav::instance(array('loader' => $autoload));
|
||||||
$grav['uri']->init();
|
$grav->setup($environment);
|
||||||
|
|
||||||
$grav['config']->init();
|
$grav['config']->init();
|
||||||
$grav['streams'];
|
$grav['uri']->init();
|
||||||
|
$grav['users'];
|
||||||
$grav['plugins']->init();
|
$grav['plugins']->init();
|
||||||
$grav['themes']->init();
|
$grav['themes']->init();
|
||||||
|
|
||||||
|
|
||||||
$app = new Application('Grav Plugins Commands', GRAV_VERSION);
|
$app = new Application('Grav Plugins Commands', GRAV_VERSION);
|
||||||
$pattern = '([A-Z]\w+Command\.php)';
|
$pattern = '([A-Z]\w+Command\.php)';
|
||||||
|
|
||||||
@@ -75,21 +72,36 @@ $argv = array_merge([$bin], $argv);
|
|||||||
|
|
||||||
$input = new ArgvInput($argv);
|
$input = new ArgvInput($argv);
|
||||||
|
|
||||||
|
/** @var \Grav\Common\Data\Data $plugin */
|
||||||
$plugin = $grav['plugins']->get($name);
|
$plugin = $grav['plugins']->get($name);
|
||||||
|
|
||||||
$output = new ConsoleOutput();
|
$output = new ConsoleOutput();
|
||||||
$output->getFormatter()->setStyle('red', new OutputFormatterStyle('red', null, array('bold')));
|
$output->getFormatter()->setStyle('red', new OutputFormatterStyle('red', null, array('bold')));
|
||||||
$output->getFormatter()->setStyle('white', new OutputFormatterStyle('white', null, array('bold')));
|
$output->getFormatter()->setStyle('white', new OutputFormatterStyle('white', null, array('bold')));
|
||||||
|
|
||||||
|
if (is_null($plugin)) {
|
||||||
|
$output->writeln('');
|
||||||
|
$output->writeln("<red>$name plugin not found</red>");
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$plugin->enabled) {
|
||||||
|
$output->writeln('');
|
||||||
|
$output->writeln("<red>$name not enabled</red>");
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!$name) {
|
if (!$name) {
|
||||||
$output->writeln('');
|
$output->writeln('');
|
||||||
$output->writeln("<red>Usage:</red>");
|
$output->writeln('<red>Usage:</red>');
|
||||||
$output->writeln(" {$bin} [slug] [command] [arguments]");
|
$output->writeln(" {$bin} [slug] [command] [arguments]");
|
||||||
$output->writeln('');
|
$output->writeln('');
|
||||||
$output->writeln("<red>Example:</red>");
|
$output->writeln('<red>Example:</red>');
|
||||||
$output->writeln(" {$bin} error log -l 1 --trace");
|
$output->writeln(" {$bin} error log -l 1 --trace");
|
||||||
$list = Folder::all('plugins://', ['compare' => 'Pathname', 'pattern' => '/\/cli\/' . $pattern . '$/usm', 'levels' => 2]);
|
$list = Folder::all('plugins://', ['compare' => 'Pathname', 'pattern' => '/\/cli\/' . $pattern . '$/usm', 'levels' => 2]);
|
||||||
|
|
||||||
|
$total = 0;
|
||||||
if (count($list)) {
|
if (count($list)) {
|
||||||
$available = [];
|
$available = [];
|
||||||
$output->writeln('');
|
$output->writeln('');
|
||||||
@@ -98,13 +110,15 @@ if (!$name) {
|
|||||||
$split = explode('/', $entry);
|
$split = explode('/', $entry);
|
||||||
$entry = array_shift($split);
|
$entry = array_shift($split);
|
||||||
$index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT);
|
$index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT);
|
||||||
|
$total = str_pad($total++ + 1, 2, '0', STR_PAD_LEFT);
|
||||||
if (in_array($entry, $available)) {
|
if (\in_array($entry, $available, true)) {
|
||||||
|
$total--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$available[] = $entry;
|
$available[] = $entry;
|
||||||
$output->writeln(' ' . $index . ". <red>" . str_pad($entry, 15) . "</red> <white>${bin} ${entry} list</white>");
|
$commands_count = $index - $total + 1;
|
||||||
|
$output->writeln(' ' . $total . '. <red>' . str_pad($entry, 15) . "</red> <white>{$bin} {$entry} list</white>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,49 +3,74 @@
|
|||||||
"type": "project",
|
"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": "https://getgrav.org",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.6.4",
|
"php": ">=7.1.3",
|
||||||
"twig/twig": "~1.24",
|
"ext-json": "*",
|
||||||
"erusev/parsedown": "1.6.4",
|
|
||||||
"erusev/parsedown-extra": "~0.7",
|
|
||||||
"symfony/yaml": "~3.4",
|
|
||||||
"symfony/console": "~3.4",
|
|
||||||
"symfony/event-dispatcher": "~3.4",
|
|
||||||
"symfony/var-dumper": "~3.4",
|
|
||||||
"symfony/polyfill-iconv": "~1.0",
|
|
||||||
"doctrine/cache": "^1.6",
|
|
||||||
"doctrine/collections": "^1.4",
|
|
||||||
"psr/simple-cache": "^1.0",
|
|
||||||
"psr/http-message": "^1.0",
|
|
||||||
"guzzlehttp/psr7": "^1.4",
|
|
||||||
"filp/whoops": "~2.0",
|
|
||||||
"matthiasmullie/minify": "^1.3",
|
|
||||||
"monolog/monolog": "~1.0",
|
|
||||||
"gregwar/image": "2.*",
|
|
||||||
"donatj/phpuseragentparser": "~0.3",
|
|
||||||
"pimple/pimple": "~3.2",
|
|
||||||
"rockettheme/toolbox": "~1.4",
|
|
||||||
"maximebf/debugbar": "~1.10",
|
|
||||||
"ext-mbstring": "*",
|
"ext-mbstring": "*",
|
||||||
"ext-openssl": "*",
|
"ext-openssl": "*",
|
||||||
"ext-curl": "*",
|
"ext-curl": "*",
|
||||||
"ext-zip": "*",
|
"ext-zip": "*",
|
||||||
"league/climate": "^3.2",
|
"ext-dom": "*",
|
||||||
|
"symfony/polyfill-iconv": "^1.9",
|
||||||
|
"symfony/polyfill-php72": "^1.9",
|
||||||
|
"symfony/polyfill-php73": "^1.9",
|
||||||
|
|
||||||
|
"psr/simple-cache": "^1.0",
|
||||||
|
"psr/http-message": "^1.0",
|
||||||
|
"psr/http-server-middleware": "^1.0",
|
||||||
|
|
||||||
|
"kodus/psr7-server": "*",
|
||||||
|
"nyholm/psr7": "^1.0",
|
||||||
|
|
||||||
|
"twig/twig": "~1.35",
|
||||||
|
"erusev/parsedown": "1.6.4",
|
||||||
|
"erusev/parsedown-extra": "~0.7",
|
||||||
|
"symfony/yaml": "~4.2",
|
||||||
|
"symfony/console": "~4.2",
|
||||||
|
"symfony/event-dispatcher": "~4.2",
|
||||||
|
"symfony/var-dumper": "~4.2",
|
||||||
|
"symfony/process": "~4.2",
|
||||||
|
"doctrine/cache": "^1.8",
|
||||||
|
"doctrine/collections": "^1.5",
|
||||||
|
"guzzlehttp/psr7": "^1.4",
|
||||||
|
"filp/whoops": "~2.2",
|
||||||
|
|
||||||
|
"matthiasmullie/minify": "^1.3",
|
||||||
|
"monolog/monolog": "~1.0",
|
||||||
|
"gregwar/image": "2.*",
|
||||||
|
"donatj/phpuseragentparser": "~0.10",
|
||||||
|
"pimple/pimple": "~3.2",
|
||||||
|
"rockettheme/toolbox": "~1.4",
|
||||||
|
"maximebf/debugbar": "~1.15",
|
||||||
|
"league/climate": "^3.4",
|
||||||
"antoligy/dom-string-iterators": "^1.0",
|
"antoligy/dom-string-iterators": "^1.0",
|
||||||
"miljar/php-exif": "^0.6.3",
|
"miljar/php-exif": "^0.6.4",
|
||||||
"composer/ca-bundle": "^1.0"
|
"composer/ca-bundle": "^1.0",
|
||||||
|
"dragonmantank/cron-expression": "^1.2",
|
||||||
|
"phive/twig-extensions-deferred": "^1.0",
|
||||||
|
"willdurand/negotiation": "^2.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"codeception/codeception": "^2.1",
|
"codeception/codeception": "^2.4",
|
||||||
"phpunit/php-code-coverage": "~2.0",
|
"phpstan/phpstan": "^0.11",
|
||||||
"fzaninotto/faker": "^1.5",
|
"phpstan/phpstan-deprecation-rules": "^0.11.0",
|
||||||
|
"phpunit/php-code-coverage": "~6.0",
|
||||||
|
"fzaninotto/faker": "^1.8",
|
||||||
"victorjonsson/markdowndocs": "dev-master"
|
"victorjonsson/markdowndocs": "dev-master"
|
||||||
},
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-zend-opcache": "Recommended for better performance",
|
||||||
|
"ext-intl": "Recommended for multi-language sites",
|
||||||
|
"ext-memcache": "Needed to support Memcache servers",
|
||||||
|
"ext-memcached": "Needed to support Memcached servers",
|
||||||
|
"ext-redis": "Needed to support Redis servers"
|
||||||
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
"apcu-autoloader": true,
|
||||||
"platform": {
|
"platform": {
|
||||||
"php": "5.6.4"
|
"php": "7.1.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"repositories": [
|
"repositories": [
|
||||||
@@ -65,6 +90,9 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"post-create-project-cmd": "bin/grav install",
|
"post-create-project-cmd": "bin/grav install",
|
||||||
|
"phpstan": "vendor/bin/phpstan analyse -l 2 -c ./tests/phpstan/phpstan.neon system/src --memory-limit=256M",
|
||||||
|
"phpstan-framework": "vendor/bin/phpstan analyse -l 5 -c ./tests/phpstan/phpstan.neon system/src/Grav/Framework --memory-limit=256M",
|
||||||
|
"test-plugins": "vendor/bin/phpstan analyse -l 0 -c ./tests/phpstan/plugins.neon user/plugins --memory-limit=256M",
|
||||||
"test": "vendor/bin/codecept run unit",
|
"test": "vendor/bin/codecept run unit",
|
||||||
"test-windows": "vendor\\bin\\codecept run unit"
|
"test-windows": "vendor\\bin\\codecept run unit"
|
||||||
},
|
},
|
||||||
|
|||||||
2828
composer.lock
generated
2828
composer.lock
generated
File diff suppressed because it is too large
Load Diff
38
index.php
38
index.php
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Core
|
* @package Grav.Core
|
||||||
*
|
*
|
||||||
@@ -7,35 +8,35 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Grav;
|
namespace Grav;
|
||||||
define('GRAV_PHP_MIN', '5.6.4');
|
|
||||||
|
|
||||||
// Ensure vendor libraries exist
|
\define('GRAV_REQUEST_TIME', microtime(true));
|
||||||
$autoload = __DIR__ . '/vendor/autoload.php';
|
\define('GRAV_PHP_MIN', '7.1.3');
|
||||||
if (!is_file($autoload)) {
|
|
||||||
die("Please run: <i>bin/grav install</i>");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PHP_SAPI == 'cli-server') {
|
|
||||||
if (!isset($_SERVER['PHP_CLI_ROUTER'])) {
|
|
||||||
die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
use Grav\Common\Grav;
|
|
||||||
use RocketTheme\Toolbox\Event\Event;
|
|
||||||
|
|
||||||
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
|
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));
|
die(sprintf('You are running PHP %s, but Grav needs at least <strong>PHP %s</strong> to run.', $ver, $req));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PHP_SAPI === 'cli-server' && !isset($_SERVER['PHP_CLI_ROUTER'])) {
|
||||||
|
die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure vendor libraries exist
|
||||||
|
$autoload = __DIR__ . '/vendor/autoload.php';
|
||||||
|
if (!is_file($autoload)) {
|
||||||
|
die('Please run: <i>bin/grav install</i>');
|
||||||
|
}
|
||||||
|
|
||||||
// Register the auto-loader.
|
// Register the auto-loader.
|
||||||
$loader = require_once $autoload;
|
$loader = require $autoload;
|
||||||
|
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use RocketTheme\Toolbox\Event\Event;
|
||||||
|
|
||||||
// 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
|
// Set internal encoding if mbstring loaded
|
||||||
if (!extension_loaded('mbstring')) {
|
if (!\extension_loaded('mbstring')) {
|
||||||
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
|
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
|
||||||
}
|
}
|
||||||
mb_internal_encoding('UTF-8');
|
mb_internal_encoding('UTF-8');
|
||||||
@@ -50,6 +51,9 @@ $grav = Grav::instance(
|
|||||||
// Process the page
|
// Process the page
|
||||||
try {
|
try {
|
||||||
$grav->process();
|
$grav->process();
|
||||||
|
} catch (\Error $e) {
|
||||||
|
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
|
||||||
|
throw $e;
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
|
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
|
||||||
throw $e;
|
throw $e;
|
||||||
|
|||||||
@@ -30,9 +30,25 @@ div.phpdebugbar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.phpdebugbar .phpdebugbar-widgets-toolbar {
|
.phpdebugbar .phpdebugbar-widgets-toolbar {
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
|
padding-right: 2px;
|
||||||
|
padding-top: 2px;
|
||||||
|
background-color: #fafafa !important;
|
||||||
|
width: auto !important;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.phpdebugbar .phpdebugbar-widgets-toolbar input {
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phpdebugbar .phpdebugbar-widgets-toolbar .phpdebugbar-widgets-filter {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.phpdebugbar input[type=text] {
|
.phpdebugbar input[type=text] {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
display: inline;
|
display: inline;
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 548 B After Width: | Height: | Size: 4.1 KiB |
125
system/blueprints/config/backups.yaml
Normal file
125
system/blueprints/config/backups.yaml
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
title: PLUGIN_ADMIN.BACKUPS
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
|
||||||
|
fields:
|
||||||
|
history_title:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.BACKUPS_HISTORY
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
history:
|
||||||
|
type: backupshistory
|
||||||
|
|
||||||
|
config_title:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.BACKUPS_PURGE_CONFIG
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
purge.trigger:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_STORAGE_PURGE_TRIGGER
|
||||||
|
size: medium
|
||||||
|
default: space
|
||||||
|
options:
|
||||||
|
space: Maximum Backup Space
|
||||||
|
number: Maximum Number of Backups
|
||||||
|
time: maximum Retention Time
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
purge.max_backups_count:
|
||||||
|
type: number
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_MAX_COUNT
|
||||||
|
default: 25
|
||||||
|
size: x-small
|
||||||
|
help: PLUGIN_ADMIN.BACKUPS_MAX_COUNT
|
||||||
|
validate:
|
||||||
|
min: 0
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
message: Must be a number 0 or greater
|
||||||
|
|
||||||
|
purge.max_backups_space:
|
||||||
|
type: number
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_MAX_SPACE
|
||||||
|
append: in GB
|
||||||
|
size: x-small
|
||||||
|
default: 5
|
||||||
|
validate:
|
||||||
|
min: 1
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
message: Space must be 1GB or greater
|
||||||
|
|
||||||
|
purge.max_backups_time:
|
||||||
|
type: number
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_MAX_RETENTION_TIME
|
||||||
|
append: PLUGIN_ADMIN.BACKUPS_MAX_RETENTION_TIME_APPEND
|
||||||
|
size: x-small
|
||||||
|
default: 365
|
||||||
|
validate:
|
||||||
|
min: 7
|
||||||
|
type: number
|
||||||
|
required: true
|
||||||
|
message: Rentenion days must be 7 or greater
|
||||||
|
|
||||||
|
profiles_title:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.BACKUPS_PROFILES
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
profiles:
|
||||||
|
type: list
|
||||||
|
style: vertical
|
||||||
|
label:
|
||||||
|
classes: backups-list compact
|
||||||
|
sort: false
|
||||||
|
|
||||||
|
fields:
|
||||||
|
.name:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.NAME
|
||||||
|
placeholder: PLUGIN_ADMIN.BACKUPS_PROFILE_NAME
|
||||||
|
validate:
|
||||||
|
max: 20
|
||||||
|
message: 'Name must be less than 20 characters'
|
||||||
|
required: true
|
||||||
|
.root:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_PROFILE_ROOT_FOLDER
|
||||||
|
help: PLUGIN_ADMIN.BACKUPS_PROFILE_ROOT_FOLDER_HELP
|
||||||
|
placeholder: '/'
|
||||||
|
default: '/'
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
.exclude_paths:
|
||||||
|
type: textarea
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_PATHS
|
||||||
|
rows: 5
|
||||||
|
placeholder: "/backup\r/cache\r/images\r/logs\r/tmp"
|
||||||
|
help: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_PATHS_HELP
|
||||||
|
.exclude_files:
|
||||||
|
type: textarea
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_FILES
|
||||||
|
rows: 5
|
||||||
|
placeholder: ".DS_Store\r.git\r.svn\r.hg\r.idea\r.vscode\rnode_modules"
|
||||||
|
help: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_FILES_HELP
|
||||||
|
.schedule:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_PROFILE_SCHEDULE
|
||||||
|
highlight: 1
|
||||||
|
default: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
.schedule_at:
|
||||||
|
type: cron
|
||||||
|
label: PLUGIN_ADMIN.BACKUPS_PROFILE_SCHEDULE_AT
|
||||||
|
default: '* 3 * * *'
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
|
||||||
76
system/blueprints/config/scheduler.yaml
Normal file
76
system/blueprints/config/scheduler.yaml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
title: PLUGIN_ADMIN.SCHEDULER
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
|
||||||
|
fields:
|
||||||
|
|
||||||
|
status_title:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.SCHEDULER_STATUS
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
status:
|
||||||
|
type: cronstatus
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
|
jobs_title:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.SCHEDULER_JOBS
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
custom_jobs:
|
||||||
|
type: list
|
||||||
|
style: vertical
|
||||||
|
label:
|
||||||
|
classes: cron-job-list compact
|
||||||
|
key: id
|
||||||
|
fields:
|
||||||
|
.id:
|
||||||
|
type: key
|
||||||
|
label: ID
|
||||||
|
placeholder: 'process-name'
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
pattern: '[a-zа-я0-9_\-]+'
|
||||||
|
max: 20
|
||||||
|
message: 'ID must be lowercase with dashes/underscores only and less than 20 characters'
|
||||||
|
.command:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.COMMAND
|
||||||
|
placeholder: 'cd ~;ls -lah;'
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
.args:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.EXTRA_ARGUMENTS
|
||||||
|
.at:
|
||||||
|
type: cron
|
||||||
|
label: PLUGIN_ADMIN.SCHEDULER_RUNAT
|
||||||
|
help: PLUGIN_ADMIN.SCHEDULER_RUNAT_HELP
|
||||||
|
placeholder: '* * * * *'
|
||||||
|
validate:
|
||||||
|
required: true
|
||||||
|
.output:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.SCHEDULER_OUTPUT
|
||||||
|
help: PLUGIN_ADMIN.SCHEDULER_OUTPUT_HELP
|
||||||
|
placeholder: 'logs/ls-cron.out'
|
||||||
|
.output_mode:
|
||||||
|
type: select
|
||||||
|
label: PLUGIN_ADMIN.SCHEDULER_OUTPUT_TYPE
|
||||||
|
help: PLUGIN_ADMIN.SCHEDULER_OUTPUT_TYPE_HELP
|
||||||
|
default: append
|
||||||
|
options:
|
||||||
|
append: Append
|
||||||
|
overwrite: Overwrite
|
||||||
|
.email:
|
||||||
|
type: text
|
||||||
|
label: PLUGIN_ADMIN.SCHEDULER_EMAIL
|
||||||
|
help: PLUGIN_ADMIN.SCHEDULER_EMAIL_HELP
|
||||||
|
placeholder: 'notifications@yoursite.com'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
107
system/blueprints/config/security.yaml
Normal file
107
system/blueprints/config/security.yaml
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
title: PLUGIN_ADMIN.SECURITY
|
||||||
|
|
||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
|
||||||
|
xss_section:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.XSS_SECURITY
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
xss_whitelist:
|
||||||
|
type: selectize
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.XSS_WHITELIST_PERMISSIONS
|
||||||
|
help: PLUGIN_ADMIN.XSS_WHITELIST_PERMISSIONS_HELP
|
||||||
|
placeholder: 'admin.super'
|
||||||
|
classes: fancy
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
|
xss_enabled.on_events:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.XSS_ON_EVENTS
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
default: true
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
xss_enabled.invalid_protocols:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.XSS_INVALID_PROTOCOLS
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
default: true
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
xss_invalid_protocols:
|
||||||
|
type: selectize
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.XSS_INVALID_PROTOCOLS_LIST
|
||||||
|
classes: fancy
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
|
xss_enabled.moz_binding:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.XSS_MOZ_BINDINGS
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
default: true
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
xss_enabled.html_inline_styles:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.XSS_HTML_INLINE_STYLES
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
default: true
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
xss_enabled.dangerous_tags:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.XSS_DANGEROUS_TAGS
|
||||||
|
highlight: 1
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
default: true
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
xss_dangerous_tags:
|
||||||
|
type: selectize
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.XSS_DANGEROUS_TAGS_LIST
|
||||||
|
classes: fancy
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
|
uploads_section:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.UPLOADS_SECURITY
|
||||||
|
underline: true
|
||||||
|
|
||||||
|
|
||||||
|
uploads_dangerous_extensions:
|
||||||
|
type: selectize
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.UPLOADS_DANGEROUS_EXTENSIONS
|
||||||
|
help: PLUGIN_ADMIN.UPLOADS_DANGEROUS_EXTENSIONS_HELP
|
||||||
|
classes: fancy
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
@@ -4,12 +4,21 @@ form:
|
|||||||
validation: loose
|
validation: loose
|
||||||
fields:
|
fields:
|
||||||
|
|
||||||
|
system_tabs:
|
||||||
|
type: tabs
|
||||||
|
classes: side-tabs
|
||||||
|
|
||||||
|
fields:
|
||||||
content:
|
content:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.CONTENT
|
||||||
|
|
||||||
|
fields:
|
||||||
|
content_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.CONTENT
|
title: PLUGIN_ADMIN.CONTENT
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
home.alias:
|
home.alias:
|
||||||
type: pages
|
type: pages
|
||||||
size: large
|
size: large
|
||||||
@@ -32,7 +41,6 @@ form:
|
|||||||
validate:
|
validate:
|
||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
|
|
||||||
pages.theme:
|
pages.theme:
|
||||||
type: themeselect
|
type: themeselect
|
||||||
classes: fancy
|
classes: fancy
|
||||||
@@ -51,6 +59,14 @@ form:
|
|||||||
twig: Twig
|
twig: Twig
|
||||||
use: keys
|
use: keys
|
||||||
|
|
||||||
|
pages.types:
|
||||||
|
type: array
|
||||||
|
label: PLUGIN_ADMIN.PAGE_TYPES
|
||||||
|
help: PLUGIN_ADMIN.PAGE_TYPES_HELP
|
||||||
|
size: small
|
||||||
|
default: ['html','htm','json','xml','txt','rss','atom']
|
||||||
|
value_only: true
|
||||||
|
|
||||||
timezone:
|
timezone:
|
||||||
type: select
|
type: select
|
||||||
label: PLUGIN_ADMIN.TIMEZONE
|
label: PLUGIN_ADMIN.TIMEZONE
|
||||||
@@ -224,6 +240,15 @@ form:
|
|||||||
validate:
|
validate:
|
||||||
type: commalist
|
type: commalist
|
||||||
|
|
||||||
|
pages.hide_empty_folders:
|
||||||
|
type: selectize
|
||||||
|
size: large
|
||||||
|
label: PLUGIN_ADMIN.HIDE_EMPTY_FOLDERS
|
||||||
|
help: PLUGIN_ADMIN.HIDE_EMPTY_FOLDERS_HELP
|
||||||
|
classes: fancy
|
||||||
|
validate:
|
||||||
|
type: commalist
|
||||||
|
|
||||||
pages.url_taxonomy_filters:
|
pages.url_taxonomy_filters:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.ALLOW_URL_TAXONOMY_FILTERS
|
label: PLUGIN_ADMIN.ALLOW_URL_TAXONOMY_FILTERS
|
||||||
@@ -279,12 +304,15 @@ form:
|
|||||||
type: commalist
|
type: commalist
|
||||||
|
|
||||||
languages:
|
languages:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.LANGUAGES
|
||||||
|
|
||||||
|
fields:
|
||||||
|
languages-section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.LANGUAGES
|
title: PLUGIN_ADMIN.LANGUAGES
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
|
|
||||||
languages.supported:
|
languages.supported:
|
||||||
type: selectize
|
type: selectize
|
||||||
size: large
|
size: large
|
||||||
@@ -295,6 +323,12 @@ form:
|
|||||||
validate:
|
validate:
|
||||||
type: commalist
|
type: commalist
|
||||||
|
|
||||||
|
languages.default_lang:
|
||||||
|
type: text
|
||||||
|
size: x-small
|
||||||
|
label: PLUGIN_ADMIN.DEFAULT_LANG
|
||||||
|
help: PLUGIN_ADMIN.DEFAULT_LANG_HELP
|
||||||
|
|
||||||
languages.include_default_lang:
|
languages.include_default_lang:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.INCLUDE_DEFAULT_LANG
|
label: PLUGIN_ADMIN.INCLUDE_DEFAULT_LANG
|
||||||
@@ -306,6 +340,16 @@ form:
|
|||||||
validate:
|
validate:
|
||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
|
languages.pages_fallback_only:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.PAGES_FALLBACK_ONLY
|
||||||
|
help: PLUGIN_ADMIN.PAGES_FALLBACK_ONLY_HELP
|
||||||
|
highlight: 0
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
languages.translations:
|
languages.translations:
|
||||||
type: toggle
|
type: toggle
|
||||||
@@ -363,15 +407,19 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
http_headers:
|
http_headers:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.HTTP_HEADERS
|
||||||
|
|
||||||
|
fields:
|
||||||
|
http_headers_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.HTTP_HEADERS
|
title: PLUGIN_ADMIN.HTTP_HEADERS
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
pages.expires:
|
pages.expires:
|
||||||
type: text
|
type: text
|
||||||
size: small
|
size: small
|
||||||
append: NICETIME.SECOND_PLURAL
|
append: GRAV.NICETIME.SECOND_PLURAL
|
||||||
label: PLUGIN_ADMIN.EXPIRES
|
label: PLUGIN_ADMIN.EXPIRES
|
||||||
help: PLUGIN_ADMIN.EXPIRES_HELP
|
help: PLUGIN_ADMIN.EXPIRES_HELP
|
||||||
validate:
|
validate:
|
||||||
@@ -415,11 +463,15 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
markdown:
|
markdown:
|
||||||
type: section
|
type: tab
|
||||||
title: Markdown
|
title: PLUGIN_ADMIN.MARKDOWN
|
||||||
underline: true
|
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
markdow_section:
|
||||||
|
type: section
|
||||||
|
title: PLUGIN_ADMIN.MARKDOWN
|
||||||
|
underline: true
|
||||||
|
|
||||||
pages.markdown.extra:
|
pages.markdown.extra:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: Markdown extra
|
label: Markdown extra
|
||||||
@@ -462,11 +514,15 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
caching:
|
caching:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.CACHING
|
||||||
|
|
||||||
|
fields:
|
||||||
|
caching_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.CACHING
|
title: PLUGIN_ADMIN.CACHING
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
cache.enabled:
|
cache.enabled:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.CACHING
|
label: PLUGIN_ADMIN.CACHING
|
||||||
@@ -514,6 +570,27 @@ form:
|
|||||||
help: PLUGIN_ADMIN.CACHE_PREFIX_HELP
|
help: PLUGIN_ADMIN.CACHE_PREFIX_HELP
|
||||||
placeholder: PLUGIN_ADMIN.CACHE_PREFIX_PLACEHOLDER
|
placeholder: PLUGIN_ADMIN.CACHE_PREFIX_PLACEHOLDER
|
||||||
|
|
||||||
|
cache.purge_at:
|
||||||
|
type: cron
|
||||||
|
label: PLUGIN_ADMIN.CACHE_PURGE_JOB
|
||||||
|
help: PLUGIN_ADMIN.CACHE_PURGE_JOB_HELP
|
||||||
|
default: '* 4 * * *'
|
||||||
|
|
||||||
|
cache.clear_at:
|
||||||
|
type: cron
|
||||||
|
label: PLUGIN_ADMIN.CACHE_CLEAR_JOB
|
||||||
|
help: PLUGIN_ADMIN.CACHE_CLEAR_JOB_HELP
|
||||||
|
default: '* 3 * * *'
|
||||||
|
|
||||||
|
cache.clear_job_type:
|
||||||
|
type: select
|
||||||
|
size: medium
|
||||||
|
label: PLUGIN_ADMIN.CACHE_JOB_TYPE
|
||||||
|
help: PLUGIN_ADMIN.CACHE_JOB_TYPE_HELP
|
||||||
|
options:
|
||||||
|
standard: Standard Cache Folders
|
||||||
|
all: All Cache Folders
|
||||||
|
|
||||||
cache.clear_images_by_default:
|
cache.clear_images_by_default:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT
|
label: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT
|
||||||
@@ -539,7 +616,7 @@ form:
|
|||||||
cache.lifetime:
|
cache.lifetime:
|
||||||
type: text
|
type: text
|
||||||
size: small
|
size: small
|
||||||
append: NICETIME.SECOND_PLURAL
|
append: GRAV.NICETIME.SECOND_PLURAL
|
||||||
label: PLUGIN_ADMIN.LIFETIME
|
label: PLUGIN_ADMIN.LIFETIME
|
||||||
help: PLUGIN_ADMIN.LIFETIME_HELP
|
help: PLUGIN_ADMIN.LIFETIME_HELP
|
||||||
validate:
|
validate:
|
||||||
@@ -621,14 +698,16 @@ form:
|
|||||||
size: small
|
size: small
|
||||||
label: PLUGIN_ADMIN.REDIS_PASSWORD
|
label: PLUGIN_ADMIN.REDIS_PASSWORD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
twig:
|
twig:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.TWIG_TEMPLATING
|
||||||
|
|
||||||
|
fields:
|
||||||
|
twig_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.TWIG_TEMPLATING
|
title: PLUGIN_ADMIN.TWIG_TEMPLATING
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
twig.cache:
|
twig.cache:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.TWIG_CACHING
|
label: PLUGIN_ADMIN.TWIG_CACHING
|
||||||
@@ -685,11 +764,15 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
assets:
|
assets:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.ASSETS
|
||||||
|
|
||||||
|
fields:
|
||||||
|
assets_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.ASSETS
|
title: PLUGIN_ADMIN.ASSETS
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
assets.css_pipeline:
|
assets.css_pipeline:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.CSS_PIPELINE
|
label: PLUGIN_ADMIN.CSS_PIPELINE
|
||||||
@@ -820,11 +903,15 @@ form:
|
|||||||
type: array
|
type: array
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.ERROR_HANDLER
|
||||||
|
|
||||||
|
fields:
|
||||||
|
errors_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.ERROR_HANDLER
|
title: PLUGIN_ADMIN.ERROR_HANDLER
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
errors.display:
|
errors.display:
|
||||||
type: select
|
type: select
|
||||||
label: PLUGIN_ADMIN.DISPLAY_ERRORS
|
label: PLUGIN_ADMIN.DISPLAY_ERRORS
|
||||||
@@ -850,12 +937,53 @@ form:
|
|||||||
validate:
|
validate:
|
||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
|
log.handler:
|
||||||
|
type: select
|
||||||
|
size: small
|
||||||
|
label: PLUGIN_ADMIN.LOG_HANDLER
|
||||||
|
help: PLUGIN_ADMIN.LOG_HANDLER_HELP
|
||||||
|
default: 'file'
|
||||||
|
options:
|
||||||
|
'file': 'File'
|
||||||
|
'syslog': 'Syslog'
|
||||||
|
|
||||||
|
log.syslog.facility:
|
||||||
|
type: select
|
||||||
|
size: small
|
||||||
|
label: PLUGIN_ADMIN.SYSLOG_FACILITY
|
||||||
|
help: PLUGIN_ADMIN.SYSLOG_FACILITY_HELP
|
||||||
|
default: local6
|
||||||
|
options:
|
||||||
|
auth: auth
|
||||||
|
authpriv: authpriv
|
||||||
|
cron: cron
|
||||||
|
daemon: daemon
|
||||||
|
kern: kern
|
||||||
|
lpr: lpr
|
||||||
|
mail: mail
|
||||||
|
news: news
|
||||||
|
syslog: syslog
|
||||||
|
user: user
|
||||||
|
uucp: uucp
|
||||||
|
local0: local0
|
||||||
|
local1: local1
|
||||||
|
local2: local2
|
||||||
|
local3: local3
|
||||||
|
local4: local4
|
||||||
|
local5: local5
|
||||||
|
local6: local6
|
||||||
|
local7: local7
|
||||||
|
|
||||||
debugger:
|
debugger:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.DEBUGGER
|
||||||
|
|
||||||
|
fields:
|
||||||
|
debugger_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.DEBUGGER
|
title: PLUGIN_ADMIN.DEBUGGER
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
debugger.enabled:
|
debugger.enabled:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.DEBUGGER
|
label: PLUGIN_ADMIN.DEBUGGER
|
||||||
@@ -879,11 +1007,15 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
media:
|
media:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.MEDIA
|
||||||
|
|
||||||
|
fields:
|
||||||
|
media_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.MEDIA
|
title: PLUGIN_ADMIN.MEDIA
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
images.default_image_quality:
|
images.default_image_quality:
|
||||||
type: range
|
type: range
|
||||||
append: '%'
|
append: '%'
|
||||||
@@ -936,6 +1068,17 @@ form:
|
|||||||
validate:
|
validate:
|
||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
|
images.seofriendly:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.IMAGES_SEOFRIENDLY
|
||||||
|
help: PLUGIN_ADMIN.IMAGES_SEOFRIENDLY_HELP
|
||||||
|
highlight: 0
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
media.enable_media_timestamp:
|
media.enable_media_timestamp:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.ENABLE_MEDIA_TIMESTAMP
|
label: PLUGIN_ADMIN.ENABLE_MEDIA_TIMESTAMP
|
||||||
@@ -959,7 +1102,6 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
media.allowed_fallback_types:
|
media.allowed_fallback_types:
|
||||||
type: selectize
|
type: selectize
|
||||||
size: large
|
size: large
|
||||||
@@ -979,11 +1121,15 @@ form:
|
|||||||
type: commalist
|
type: commalist
|
||||||
|
|
||||||
session:
|
session:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.SESSION
|
||||||
|
|
||||||
|
fields:
|
||||||
|
session_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.SESSION
|
title: PLUGIN_ADMIN.SESSION
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
session.enabled:
|
session.enabled:
|
||||||
type: hidden
|
type: hidden
|
||||||
label: PLUGIN_ADMIN.ENABLED
|
label: PLUGIN_ADMIN.ENABLED
|
||||||
@@ -1011,7 +1157,7 @@ form:
|
|||||||
session.timeout:
|
session.timeout:
|
||||||
type: text
|
type: text
|
||||||
size: small
|
size: small
|
||||||
append: NICETIME.SECOND_PLURAL
|
append: GRAV.NICETIME.SECOND_PLURAL
|
||||||
label: PLUGIN_ADMIN.TIMEOUT
|
label: PLUGIN_ADMIN.TIMEOUT
|
||||||
help: PLUGIN_ADMIN.TIMEOUT_HELP
|
help: PLUGIN_ADMIN.TIMEOUT_HELP
|
||||||
validate:
|
validate:
|
||||||
@@ -1024,6 +1170,17 @@ form:
|
|||||||
label: PLUGIN_ADMIN.NAME
|
label: PLUGIN_ADMIN.NAME
|
||||||
help: PLUGIN_ADMIN.SESSION_NAME_HELP
|
help: PLUGIN_ADMIN.SESSION_NAME_HELP
|
||||||
|
|
||||||
|
session.uniqueness:
|
||||||
|
type: select
|
||||||
|
size: medium
|
||||||
|
label: PLUGIN_ADMIN.SESSION_UNIQUENESS
|
||||||
|
help: PLUGIN_ADMIN.SESSION_UNIQUENESS_HELP
|
||||||
|
highlight: path
|
||||||
|
default: path
|
||||||
|
options:
|
||||||
|
path: Grav's root file path
|
||||||
|
salt: Grav's random security salt
|
||||||
|
|
||||||
session.secure:
|
session.secure:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.SESSION_SECURE
|
label: PLUGIN_ADMIN.SESSION_SECURE
|
||||||
@@ -1067,11 +1224,15 @@ form:
|
|||||||
type: bool
|
type: bool
|
||||||
|
|
||||||
advanced:
|
advanced:
|
||||||
|
type: tab
|
||||||
|
title: PLUGIN_ADMIN.ADVANCED
|
||||||
|
|
||||||
|
fields:
|
||||||
|
advanced_section:
|
||||||
type: section
|
type: section
|
||||||
title: PLUGIN_ADMIN.ADVANCED
|
title: PLUGIN_ADMIN.ADVANCED
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
|
||||||
gpm.releases:
|
gpm.releases:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.GPM_RELEASES
|
label: PLUGIN_ADMIN.GPM_RELEASES
|
||||||
@@ -1101,9 +1262,8 @@ form:
|
|||||||
gpm.official_gpm_only:
|
gpm.official_gpm_only:
|
||||||
type: toggle
|
type: toggle
|
||||||
label: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY
|
label: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY
|
||||||
highlight: auto
|
|
||||||
help: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY_HELP
|
|
||||||
highlight: 1
|
highlight: 1
|
||||||
|
help: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY_HELP
|
||||||
options:
|
options:
|
||||||
1: PLUGIN_ADMIN.YES
|
1: PLUGIN_ADMIN.YES
|
||||||
0: PLUGIN_ADMIN.NO
|
0: PLUGIN_ADMIN.NO
|
||||||
@@ -1218,3 +1378,33 @@ form:
|
|||||||
placeholder: "e.g. http://yoursite.com/yourpath"
|
placeholder: "e.g. http://yoursite.com/yourpath"
|
||||||
label: PLUGIN_ADMIN.CUSTOM_BASE_URL
|
label: PLUGIN_ADMIN.CUSTOM_BASE_URL
|
||||||
help: PLUGIN_ADMIN.CUSTOM_BASE_URL_HELP
|
help: PLUGIN_ADMIN.CUSTOM_BASE_URL_HELP
|
||||||
|
|
||||||
|
accounts.type:
|
||||||
|
type: hidden
|
||||||
|
|
||||||
|
accounts.storage:
|
||||||
|
type: hidden
|
||||||
|
|
||||||
|
strict_mode.yaml_compat:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.STRICT_YAML_COMPAT
|
||||||
|
highlight: 1
|
||||||
|
default: 1
|
||||||
|
help: PLUGIN_ADMIN.STRICT_YAML_COMPAT_HELP
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|
||||||
|
strict_mode.twig_compat:
|
||||||
|
type: toggle
|
||||||
|
label: PLUGIN_ADMIN.STRICT_TWIG_COMPAT
|
||||||
|
highlight: 1
|
||||||
|
default: 1
|
||||||
|
help: PLUGIN_ADMIN.STRICT_TWIG_COMPAT_HELP
|
||||||
|
options:
|
||||||
|
1: PLUGIN_ADMIN.YES
|
||||||
|
0: PLUGIN_ADMIN.NO
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ form:
|
|||||||
title: PLUGIN_ADMIN.CONTENT
|
title: PLUGIN_ADMIN.CONTENT
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
|
xss_check:
|
||||||
|
type: xss
|
||||||
|
|
||||||
header.title:
|
header.title:
|
||||||
type: text
|
type: text
|
||||||
autofocus: true
|
autofocus: true
|
||||||
|
|||||||
@@ -100,13 +100,14 @@ form:
|
|||||||
|
|
||||||
|
|
||||||
security:
|
security:
|
||||||
|
security@: admin.super
|
||||||
title: PLUGIN_ADMIN.ACCESS_LEVELS
|
title: PLUGIN_ADMIN.ACCESS_LEVELS
|
||||||
type: section
|
type: section
|
||||||
security: admin.super
|
|
||||||
underline: true
|
underline: true
|
||||||
|
|
||||||
fields:
|
fields:
|
||||||
groups:
|
groups:
|
||||||
|
security@: admin.super
|
||||||
type: select
|
type: select
|
||||||
multiple: true
|
multiple: true
|
||||||
size: large
|
size: large
|
||||||
@@ -118,6 +119,7 @@ form:
|
|||||||
type: commalist
|
type: commalist
|
||||||
|
|
||||||
access:
|
access:
|
||||||
|
security@: admin.super
|
||||||
type: permissions
|
type: permissions
|
||||||
label: PLUGIN_ADMIN.PERMISSIONS
|
label: PLUGIN_ADMIN.PERMISSIONS
|
||||||
ignore_empty: true
|
ignore_empty: true
|
||||||
|
|||||||
29
system/blueprints/user/accounts.yaml
Normal file
29
system/blueprints/user/accounts.yaml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
title: User Accounts
|
||||||
|
description: User Accounts
|
||||||
|
type: flex-objects
|
||||||
|
|
||||||
|
extends@: 'user/account'
|
||||||
|
|
||||||
|
config:
|
||||||
|
admin:
|
||||||
|
list:
|
||||||
|
fields:
|
||||||
|
username:
|
||||||
|
link: edit
|
||||||
|
search: true
|
||||||
|
email:
|
||||||
|
search: true
|
||||||
|
fullname:
|
||||||
|
search: true
|
||||||
|
options:
|
||||||
|
per_page: 20
|
||||||
|
order:
|
||||||
|
by: username
|
||||||
|
dir: asc
|
||||||
|
|
||||||
|
menu:
|
||||||
|
list:
|
||||||
|
route: '/accounts'
|
||||||
|
title: Accounts
|
||||||
|
icon: fa-users
|
||||||
|
authorize: ['admin.users', 'admin.accounts', 'admin.super']
|
||||||
15
system/config/backups.yaml
Normal file
15
system/config/backups.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
purge:
|
||||||
|
trigger: space
|
||||||
|
max_backups_count: 25
|
||||||
|
max_backups_space: 5
|
||||||
|
max_backups_time: 365
|
||||||
|
|
||||||
|
profiles:
|
||||||
|
-
|
||||||
|
name: 'Default Site Backup'
|
||||||
|
root: '/'
|
||||||
|
schedule: false
|
||||||
|
schedule_at: '0 3 * * *'
|
||||||
|
exclude_paths: "/backup\r\n/cache\r\n/images\r\n/logs\r\n/tmp"
|
||||||
|
exclude_files: ".DS_Store\r\n.git\r\n.svn\r\n.hg\r\n.idea\r\n.vscode\r\nnode_modules"
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ types:
|
|||||||
thumb: media/thumb-flv.png
|
thumb: media/thumb-flv.png
|
||||||
mime: video/x-flv
|
mime: video/x-flv
|
||||||
webm:
|
webm:
|
||||||
type: file
|
type: video
|
||||||
thumb: media/thumb-webm.png
|
thumb: media/thumb-webm.png
|
||||||
mime: video/webm
|
mime: video/webm
|
||||||
ogv:
|
ogv:
|
||||||
|
|||||||
38
system/config/security.yaml
Normal file
38
system/config/security.yaml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
xss_whitelist: [admin.super] # Whitelist of user access that should 'skip' XSS checking
|
||||||
|
xss_enabled:
|
||||||
|
on_events: true
|
||||||
|
invalid_protocols: true
|
||||||
|
moz_binding: true
|
||||||
|
html_inline_styles: true
|
||||||
|
dangerous_tags: true
|
||||||
|
xss_invalid_protocols:
|
||||||
|
- javascript
|
||||||
|
- livescript
|
||||||
|
- vbscript
|
||||||
|
- mocha
|
||||||
|
- feed
|
||||||
|
- data
|
||||||
|
xss_dangerous_tags:
|
||||||
|
- applet
|
||||||
|
- meta
|
||||||
|
- xml
|
||||||
|
- blink
|
||||||
|
- link
|
||||||
|
- style
|
||||||
|
- script
|
||||||
|
- embed
|
||||||
|
- object
|
||||||
|
- iframe
|
||||||
|
- frame
|
||||||
|
- frameset
|
||||||
|
- ilayer
|
||||||
|
- layer
|
||||||
|
- bgsound
|
||||||
|
- title
|
||||||
|
- base
|
||||||
|
uploads_dangerous_extensions:
|
||||||
|
- php
|
||||||
|
- html
|
||||||
|
- htm
|
||||||
|
- js
|
||||||
|
- exe
|
||||||
@@ -27,7 +27,7 @@ routes:
|
|||||||
blog:
|
blog:
|
||||||
route: '/blog' # Custom value added (accessible via system.blog.route)
|
route: '/blog' # Custom value added (accessible via system.blog.route)
|
||||||
|
|
||||||
#menu: # Sample Menu Example
|
#menu: # Menu Example
|
||||||
# - text: Source
|
# - text: Source
|
||||||
# icon: github
|
# icon: github
|
||||||
# url: https://github.com/getgrav/grav
|
# url: https://github.com/getgrav/grav
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
schemes:
|
schemes:
|
||||||
image:
|
image:
|
||||||
type: ReadOnlyStream
|
type: Stream
|
||||||
paths:
|
paths:
|
||||||
- user://images
|
- user://images
|
||||||
- system://images
|
- system://images
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ intl_enabled: true # Special logic for PHP Interna
|
|||||||
|
|
||||||
languages:
|
languages:
|
||||||
supported: [] # List of languages supported. eg: [en, fr, de]
|
supported: [] # List of languages supported. eg: [en, fr, de]
|
||||||
|
default_lang: # Default is the first supported language. Must be one of the supported languages
|
||||||
include_default_lang: true # Include the default lang prefix in all URLs
|
include_default_lang: true # Include the default lang prefix in all URLs
|
||||||
|
pages_fallback_only: false # Only fallback to find page content through supported languages
|
||||||
translations: true # Enable translations by default
|
translations: true # Enable translations by default
|
||||||
translations_fallback: true # Fallback through supported translations if active lang doesn't exist
|
translations_fallback: true # Fallback through supported translations if active lang doesn't exist
|
||||||
session_store_active: false # Store active language in session
|
session_store_active: false # Store active language in session
|
||||||
@@ -52,7 +54,7 @@ pages:
|
|||||||
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,htm,json,rss,atom] # list of valid page types
|
types: [html,htm,xml,txt,json,rss,atom] # list of valid page types
|
||||||
append_url_extension: '' # Append page's extension in Page urls (e.g. '.html' results in /path/page.html)
|
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)
|
expires: 604800 # Page expires time in seconds (604800 seconds = 7 days)
|
||||||
cache_control: # Can be blank for no setting, or a valid `cache-control` text value
|
cache_control: # Can be blank for no setting, or a valid `cache-control` text value
|
||||||
@@ -65,6 +67,7 @@ pages:
|
|||||||
ignore_files: [.DS_Store] # Files to ignore in Pages
|
ignore_files: [.DS_Store] # Files to ignore in Pages
|
||||||
ignore_folders: [.git, .idea] # Folders to ignore in Pages
|
ignore_folders: [.git, .idea] # Folders to ignore in Pages
|
||||||
ignore_hidden: true # Ignore all Hidden files and folders
|
ignore_hidden: true # Ignore all Hidden files and folders
|
||||||
|
hide_empty_folders: false # If folder has no .md file, should it be hidden
|
||||||
url_taxonomy_filters: true # Enable auto-magic URL-based taxonomy filters for page collections
|
url_taxonomy_filters: true # Enable auto-magic URL-based taxonomy filters for page collections
|
||||||
frontmatter:
|
frontmatter:
|
||||||
process_twig: false # Should the frontmatter be processed to replace Twig variables?
|
process_twig: false # Should the frontmatter be processed to replace Twig variables?
|
||||||
@@ -74,8 +77,11 @@ 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|hash|none
|
method: file # Method to check for updates in pages: file|folder|hash|none
|
||||||
driver: auto # One of: auto|file|apc|xcache|memcache|wincache
|
driver: auto # One of: auto|file|apcu|memcache|wincache
|
||||||
prefix: 'g' # Cache prefix string (prevents cache conflicts)
|
prefix: 'g' # Cache prefix string (prevents cache conflicts)
|
||||||
|
purge_at: '0 4 * * *' # How often to purge old file cache (using new scheduler)
|
||||||
|
clear_at: '0 3 * * *' # How often to clear cache (using new scheduler)
|
||||||
|
clear_job_type: 'standard' # Type to clear when processing the scheduled clear job `standard`|`all`
|
||||||
clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled
|
clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled
|
||||||
cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.)
|
cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.)
|
||||||
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
|
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
|
||||||
@@ -112,6 +118,11 @@ errors:
|
|||||||
display: 0 # Display either (1) Full backtrace | (0) Simple Error | (-1) System Error
|
display: 0 # Display either (1) Full backtrace | (0) Simple Error | (-1) System Error
|
||||||
log: true # Log errors to /logs folder
|
log: true # Log errors to /logs folder
|
||||||
|
|
||||||
|
log:
|
||||||
|
handler: file # Log handler. Currently supported: file | syslog
|
||||||
|
syslog:
|
||||||
|
facility: local6 # Syslog facilities output
|
||||||
|
|
||||||
debugger:
|
debugger:
|
||||||
enabled: false # Enable Grav debugger and following settings
|
enabled: false # Enable Grav debugger and following settings
|
||||||
shutdown:
|
shutdown:
|
||||||
@@ -123,6 +134,7 @@ images:
|
|||||||
cache_perms: '0755' # MUST BE IN QUOTES!! Default cache folder perms. Usually '0755' or '0775'
|
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
|
debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example
|
||||||
auto_fix_orientation: false # Automatically fix the image orientation based on the Exif data
|
auto_fix_orientation: false # Automatically fix the image orientation based on the Exif data
|
||||||
|
seofriendly: false # SEO-friendly processed image names
|
||||||
|
|
||||||
media:
|
media:
|
||||||
enable_media_timestamp: false # Enable media timestamps
|
enable_media_timestamp: false # Enable media timestamps
|
||||||
@@ -135,6 +147,7 @@ session:
|
|||||||
initialize: true # Initialize session from Grav (if false, plugin needs to start the session)
|
initialize: true # Initialize session from Grav (if false, plugin needs to start the session)
|
||||||
timeout: 1800 # Timeout in seconds
|
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
|
name: grav-site # Name prefix of the session cookie. Use alphanumeric, dashes or underscores only. Do not use dots in the session name
|
||||||
|
uniqueness: path # Should sessions be `path` based or `security.salt` based
|
||||||
secure: false # Set session secure. If true, indicates that communication for this cookie must be over an encrypted transmission. Enable this only on sites that run exclusively on HTTPS
|
secure: 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.
|
httponly: true # Set session HTTP only. If true, indicates that cookies should be used only over HTTP, and JavaScript modification is not allowed.
|
||||||
split: true # Sessions should be independent between site and plugins (such as admin)
|
split: true # Sessions should be independent between site and plugins (such as admin)
|
||||||
@@ -147,6 +160,10 @@ gpm:
|
|||||||
verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help.
|
verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help.
|
||||||
official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security
|
official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security
|
||||||
|
|
||||||
|
accounts:
|
||||||
|
type: data # Account type: data or flex
|
||||||
|
storage: file # Flex storage type: file or folder
|
||||||
|
|
||||||
strict_mode:
|
strict_mode:
|
||||||
yaml_compat: true # Grav 1.5+: Enables YAML backwards compatibility
|
yaml_compat: true # Grav 1.5+: Enables YAML backwards compatibility
|
||||||
twig_compat: true # Grav 1.5+: Enables deprecated Twig autoescape setting (autoescape: false)
|
twig_compat: true # Grav 1.5+: Enables deprecated Twig autoescape setting (autoescape: false)
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Grav.Core
|
* @package Grav\Core
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Some standard defines
|
// Some standard defines
|
||||||
define('GRAV', true);
|
define('GRAV', true);
|
||||||
define('GRAV_VERSION', '1.5.0-rc.1');
|
define('GRAV_VERSION', '1.6.4');
|
||||||
define('GRAV_TESTING', true);
|
define('GRAV_TESTING', false);
|
||||||
define('DS', '/');
|
define('DS', '/');
|
||||||
|
|
||||||
if (!defined('GRAV_PHP_MIN')) {
|
if (!defined('GRAV_PHP_MIN')) {
|
||||||
define('GRAV_PHP_MIN', '5.6.4');
|
define('GRAV_PHP_MIN', '7.1.3');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Directories and Paths
|
// Directories and Paths
|
||||||
|
|||||||
17
system/install.php
Normal file
17
system/install.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @package Grav\Core
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!defined('GRAV_ROOT')) {
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
use Grav\Installer\Install;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/src/Grav/Installer/Install.php';
|
||||||
|
|
||||||
|
return Install::instance();
|
||||||
@@ -1,18 +1,6 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\nالعنوان: %1$s\n---\n# خطأ: مادة أمامية غير صحيحة\n\nمسار: '%2$s'\n\n**%3$s**\n\n, , ,\n\n%4$s\n, , ,"
|
||||||
العنوان: %1$s
|
|
||||||
---
|
|
||||||
# خطأ: مادة أمامية غير صحيحة
|
|
||||||
|
|
||||||
مسار: '%2$s'
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
, , ,
|
|
||||||
|
|
||||||
%4$s
|
|
||||||
, , ,
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: لم يتم تقديم التاريخ
|
NO_DATE_PROVIDED: لم يتم تقديم التاريخ
|
||||||
BAD_DATE: تاريخ خاطئ
|
BAD_DATE: تاريخ خاطئ
|
||||||
@@ -34,7 +22,7 @@ NICETIME:
|
|||||||
YR: سنة
|
YR: سنة
|
||||||
DEC: عقد
|
DEC: عقد
|
||||||
SECOND_PLURAL: ثواني
|
SECOND_PLURAL: ثواني
|
||||||
MINUTE_PLURAL: دقائق
|
MINUTE_PLURAL: 'دقائق'
|
||||||
HOUR_PLURAL: ساعات
|
HOUR_PLURAL: ساعات
|
||||||
DAY_PLURAL: أيام
|
DAY_PLURAL: أيام
|
||||||
WEEK_PLURAL: أسابيع
|
WEEK_PLURAL: أسابيع
|
||||||
@@ -49,27 +37,27 @@ NICETIME:
|
|||||||
YR_PLURAL: سنوات
|
YR_PLURAL: سنوات
|
||||||
DEC_PLURAL: عقود
|
DEC_PLURAL: عقود
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>فشل التحقق من صحة:</b>'
|
VALIDATION_FAIL: <b>فشل التحقق من صحة:</b>
|
||||||
INVALID_INPUT: إدخال غير صحيح في
|
INVALID_INPUT: إدخال غير صحيح في
|
||||||
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
|
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- كانون الثاني
|
- 'كانون الثاني'
|
||||||
- شباط
|
- 'شباط'
|
||||||
- آذار/ مارس
|
- 'آذار/ مارس'
|
||||||
- نيسان
|
- 'نيسان'
|
||||||
- أيار
|
- 'أيار'
|
||||||
- حزيران
|
- 'حزيران'
|
||||||
- تموز
|
- 'تموز'
|
||||||
- آب
|
- 'آب'
|
||||||
- أيلول
|
- 'أيلول'
|
||||||
- تشرين الأول
|
- 'تشرين الأول'
|
||||||
- تشرين الثاني
|
- 'تشرين الثاني'
|
||||||
- كانون الأول
|
- 'كانون الأول'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- الاثنين
|
- 'الاثنين'
|
||||||
- الثلاثاء
|
- 'الثلاثاء'
|
||||||
- الأربعاء
|
- 'الأربعاء'
|
||||||
- الخميس
|
- 'الخميس'
|
||||||
- الجمعة
|
- 'الجمعة'
|
||||||
- السبت
|
- 'السبت'
|
||||||
- الأحد
|
- 'الأحد'
|
||||||
|
|||||||
62
system/languages/bg.yaml
Normal file
62
system/languages/bg.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
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:
|
||||||
|
- 'понеделник'
|
||||||
|
- 'вторник'
|
||||||
|
- 'сряда'
|
||||||
|
- 'четвъртък'
|
||||||
|
- 'петък'
|
||||||
|
- 'събота'
|
||||||
|
- 'неделя'
|
||||||
@@ -1,23 +1,11 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# S'ha produït un error: Frontmatter invàlid\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# S'ha produït un error: Frontmatter invàlid
|
|
||||||
|
|
||||||
Ruta: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: "No s'ha proporcionat data"
|
NO_DATE_PROVIDED: No s'ha proporcionat data
|
||||||
BAD_DATE: Data invàlida
|
BAD_DATE: Data invàlida
|
||||||
AGO: abans
|
AGO: abans
|
||||||
FROM_NOW: "des d'ara"
|
FROM_NOW: des d'ara
|
||||||
SECOND: segon
|
SECOND: segon
|
||||||
MINUTE: minut
|
MINUTE: minut
|
||||||
HOUR: hora
|
HOUR: hora
|
||||||
@@ -27,7 +15,6 @@ NICETIME:
|
|||||||
YEAR: any
|
YEAR: any
|
||||||
DECADE: dècada
|
DECADE: dècada
|
||||||
SEC: s
|
SEC: s
|
||||||
MIN: min
|
|
||||||
HR: h
|
HR: h
|
||||||
WK: setm.
|
WK: setm.
|
||||||
MO: m.
|
MO: m.
|
||||||
@@ -49,27 +36,27 @@ NICETIME:
|
|||||||
YR_PLURAL: anys
|
YR_PLURAL: anys
|
||||||
DEC_PLURAL: dèc.
|
DEC_PLURAL: dèc.
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Ha fallat la validació:</b>'
|
VALIDATION_FAIL: <b>Ha fallat la validació:</b>
|
||||||
INVALID_INPUT: Entrada no vàlida a
|
INVALID_INPUT: Entrada no vàlida a
|
||||||
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
|
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Gener
|
- 'Gener'
|
||||||
- Febrer
|
- 'Febrer'
|
||||||
- Març
|
- 'Març'
|
||||||
- Abril
|
- 'Abril'
|
||||||
- Maig
|
- 'Maig'
|
||||||
- Juny
|
- 'Juny'
|
||||||
- Juliol
|
- 'Juliol'
|
||||||
- Agost
|
- 'Agost'
|
||||||
- Setembre
|
- 'Setembre'
|
||||||
- Octubre
|
- 'Octubre'
|
||||||
- Novembre
|
- 'Novembre'
|
||||||
- Desembre
|
- 'Desembre'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Dilluns
|
- 'Dilluns'
|
||||||
- Dimarts
|
- 'Dimarts'
|
||||||
- Dimecres
|
- 'Dimecres'
|
||||||
- Dijous
|
- 'Dijous'
|
||||||
- Divendres
|
- 'Divendres'
|
||||||
- Dissabte
|
- 'Dissabte'
|
||||||
- Diumenge
|
- 'Diumenge'
|
||||||
|
|||||||
@@ -1,29 +1,75 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Chyba: Chybný 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'
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
- vybavení
|
- 'vybavení'
|
||||||
- informace
|
- 'informace'
|
||||||
- rýže
|
- 'rýže'
|
||||||
- peníze
|
- 'peníze'
|
||||||
- druhy
|
- 'druhy'
|
||||||
- série
|
- 'série'
|
||||||
- ryba
|
- 'ryba'
|
||||||
- ovce
|
- 'ovce'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: lidé
|
'person': 'lidé'
|
||||||
man: muži
|
'man': 'muži'
|
||||||
child: děti
|
'child': 'děti'
|
||||||
sex: pohlaví
|
'sex': 'pohlaví'
|
||||||
move: pohyby
|
'move': 'pohyby'
|
||||||
INFLECTOR_ORDINALS:
|
INFLECTOR_ORDINALS:
|
||||||
default: '.'
|
'default': '.'
|
||||||
first: '.'
|
'first': '.'
|
||||||
second: '.'
|
'second': '.'
|
||||||
third: '.'
|
'third': '.'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Datum nebylo vloženo
|
NO_DATE_PROVIDED: Datum nebylo vloženo
|
||||||
BAD_DATE: Chybné datum
|
BAD_DATE: Chybné datum
|
||||||
AGO: zpět
|
AGO: zpět
|
||||||
FROM_NOW: od teď
|
FROM_NOW: od teď
|
||||||
|
JUST_NOW: právě teď
|
||||||
SECOND: sekunda
|
SECOND: sekunda
|
||||||
MINUTE: minuta
|
MINUTE: minuta
|
||||||
HOUR: hodina
|
HOUR: hodina
|
||||||
@@ -55,27 +101,44 @@ NICETIME:
|
|||||||
YR_PLURAL: r
|
YR_PLURAL: r
|
||||||
DEC_PLURAL: dek
|
DEC_PLURAL: dek
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Ověření se nezdařilo:</b>'
|
VALIDATION_FAIL: <b>Ověření se nezdařilo:</b>
|
||||||
INVALID_INPUT: Neplatný vstup v
|
INVALID_INPUT: Neplatný vstup v
|
||||||
MISSING_REQUIRED_FIELD: 'Chybí požadované pole:'
|
MISSING_REQUIRED_FIELD: 'Chybí požadované pole:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- ledna
|
- 'leden'
|
||||||
- února
|
- 'únor'
|
||||||
- března
|
- 'březen'
|
||||||
- dubna
|
- 'duben'
|
||||||
- května
|
- 'květen'
|
||||||
- června
|
- 'červen'
|
||||||
- července
|
- 'červenec'
|
||||||
- srpna
|
- 'srpen'
|
||||||
- září
|
- 'září'
|
||||||
- října
|
- 'říjen'
|
||||||
- listopadu
|
- 'listopad'
|
||||||
- prosince
|
- 'prosinec'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Pondělí
|
- 'pondělí'
|
||||||
- Úterý
|
- 'úterý'
|
||||||
- Středa
|
- 'středa'
|
||||||
- Čtvrtek
|
- 'čtvrtek'
|
||||||
- Pátek
|
- 'pátek'
|
||||||
- Sobota
|
- 'sobota'
|
||||||
- Neděle
|
- 'neděle'
|
||||||
|
CRON:
|
||||||
|
EVERY: každý
|
||||||
|
EVERY_HOUR: každou hodinu
|
||||||
|
EVERY_MINUTE: každou minutu
|
||||||
|
EVERY_DAY_OF_WEEK: každý den v týdnu
|
||||||
|
EVERY_DAY_OF_MONTH: každý den v měsíci
|
||||||
|
EVERY_MONTH: každý měsíc
|
||||||
|
TEXT_PERIOD: Every <b />
|
||||||
|
TEXT_MINS: ' at <b /> minute(s) past the hour'
|
||||||
|
TEXT_TIME: ' at <b />:<b />'
|
||||||
|
TEXT_DOW: ' on <b />'
|
||||||
|
TEXT_MONTH: ' of <b />'
|
||||||
|
TEXT_DOM: ' on <b />'
|
||||||
|
ERROR1: Tag %s není podporován!
|
||||||
|
ERROR2: Chybný počet prvků
|
||||||
|
ERROR3: jquery_element musí být nastaven v nastaveních pro jqCron
|
||||||
|
ERROR4: Nerozpoznaný výraz
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\nTitel: %1$s\n---\n\n# Fejl: Ugyldigt frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
Titel: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Fejl: Ugyldigt frontmatter
|
|
||||||
|
|
||||||
Sti: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Ingen dato angivet
|
NO_DATE_PROVIDED: Ingen dato angivet
|
||||||
BAD_DATE: Ugyldig dato
|
BAD_DATE: Ugyldig dato
|
||||||
@@ -27,7 +15,6 @@ NICETIME:
|
|||||||
YEAR: år
|
YEAR: år
|
||||||
DECADE: årti
|
DECADE: årti
|
||||||
SEC: sek
|
SEC: sek
|
||||||
MIN: min
|
|
||||||
HR: t
|
HR: t
|
||||||
WK: u
|
WK: u
|
||||||
MO: md
|
MO: md
|
||||||
@@ -49,27 +36,27 @@ NICETIME:
|
|||||||
YR_PLURAL: år
|
YR_PLURAL: år
|
||||||
DEC_PLURAL: årtier
|
DEC_PLURAL: årtier
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validering mislykkedes:</b>'
|
VALIDATION_FAIL: <b>Validering mislykkedes:</b>
|
||||||
INVALID_INPUT: Ugyldigt input i
|
INVALID_INPUT: Ugyldigt input i
|
||||||
MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:'
|
MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Januar
|
- 'januar'
|
||||||
- Februar
|
- 'februar'
|
||||||
- Marts
|
- 'mars'
|
||||||
- April
|
- 'april'
|
||||||
- Maj
|
- 'mai'
|
||||||
- Juni
|
- 'juni'
|
||||||
- Juli
|
- 'juli'
|
||||||
- August
|
- 'august'
|
||||||
- September
|
- 'september'
|
||||||
- Oktober
|
- 'oktober'
|
||||||
- November
|
- 'november'
|
||||||
- December
|
- 'desember'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Mandag
|
- 'mandag'
|
||||||
- Tirsdag
|
- 'tirsdag'
|
||||||
- Onsdag
|
- 'onsdag'
|
||||||
- Torsdag
|
- 'torsdag'
|
||||||
- Fredag
|
- 'fredag'
|
||||||
- Lørdag
|
- 'lørdag'
|
||||||
- Søndag
|
- 'søndag'
|
||||||
|
|||||||
@@ -1,37 +1,75 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n# Fehler: Frontmatter enthält Fehler\n\nPfad: `%2$s`\n\n**%3$s ** \n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
INFLECTOR_PLURALS:
|
||||||
---
|
'/(quiz)$/i': '\1zes'
|
||||||
# Fehler: Frontmatter enthält Fehler
|
'/^(ox)$/i': '\1en'
|
||||||
|
'/([m|l])ouse$/i': '\1ice'
|
||||||
Pfad: `%2$s`
|
'/(matr|vert|ind)ix|ex$/i': '\1ice'
|
||||||
|
'/(x|ch|ss|sh)$/i': '\1es'
|
||||||
**%3$s **
|
'/([^aeiouy]|qu)ies$/i': '\1y'
|
||||||
|
'/([^aeiouy]|qu)y$/i': '\1ies'
|
||||||
```
|
'/(hive)$/i': '\1s'
|
||||||
%4$s
|
'/(?:([^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': '\1ies'
|
||||||
|
'/(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\2ves'
|
||||||
|
'/([ti])a$/i': '\1um'
|
||||||
|
'/(n)ews$/i': '\1ews'
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
1: Informationen
|
- 'Ausstattung'
|
||||||
2: Reis
|
- 'Informationen'
|
||||||
3: Geld
|
- 'Reis'
|
||||||
|
- 'Geld'
|
||||||
|
- 'Arten'
|
||||||
|
- 'Serie'
|
||||||
|
- 'Fisch'
|
||||||
|
- 'Schaf'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: Personen
|
'person': 'Personen'
|
||||||
man: Menschen
|
'man': 'Menschen'
|
||||||
child: Kinder
|
'child': 'Kinder'
|
||||||
sex: Geschlecht
|
'sex': 'Geschlecht'
|
||||||
move: Züge
|
'move': 'Züge'
|
||||||
INFLECTOR_ORDINALS:
|
INFLECTOR_ORDINALS:
|
||||||
default: '.'
|
'default': '.'
|
||||||
first: '.'
|
'first': '.'
|
||||||
second: '.'
|
'second': '.'
|
||||||
third: '.'
|
'third': '.'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Kein Datum angegeben
|
NO_DATE_PROVIDED: Kein Datum angegeben
|
||||||
BAD_DATE: Falsches Datum
|
BAD_DATE: Falsches Datum
|
||||||
AGO: her
|
AGO: her
|
||||||
FROM_NOW: ab jetzt
|
FROM_NOW: ab jetzt
|
||||||
|
JUST_NOW: jetzt gerade
|
||||||
SECOND: Sekunde
|
SECOND: Sekunde
|
||||||
MINUTE: Minute
|
MINUTE: Minute
|
||||||
HOUR: Stunde
|
HOUR: Stunde
|
||||||
@@ -46,7 +84,7 @@ NICETIME:
|
|||||||
WK: Wo.
|
WK: Wo.
|
||||||
MO: Mo.
|
MO: Mo.
|
||||||
YR: J.
|
YR: J.
|
||||||
DEC: Dek.
|
DEC: Dez
|
||||||
SECOND_PLURAL: Sekunden
|
SECOND_PLURAL: Sekunden
|
||||||
MINUTE_PLURAL: Minuten
|
MINUTE_PLURAL: Minuten
|
||||||
HOUR_PLURAL: Stunden
|
HOUR_PLURAL: Stunden
|
||||||
@@ -63,27 +101,44 @@ NICETIME:
|
|||||||
YR_PLURAL: Jahre
|
YR_PLURAL: Jahre
|
||||||
DEC_PLURAL: Jahrzehnten
|
DEC_PLURAL: Jahrzehnten
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Überprüfung fehlgeschlagen:</b>'
|
VALIDATION_FAIL: <b>Überprüfung fehlgeschlagen:</b>
|
||||||
INVALID_INPUT: Ungültige Eingabe in
|
INVALID_INPUT: Ungültige Eingabe in
|
||||||
MISSING_REQUIRED_FIELD: 'Erforderliches Feld fehlt:'
|
MISSING_REQUIRED_FIELD: 'Erforderliches Feld fehlt:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Januar
|
- 'Januar'
|
||||||
- Februar
|
- 'Februar'
|
||||||
- März
|
- 'März'
|
||||||
- April
|
- 'April'
|
||||||
- Mai
|
- 'Mai'
|
||||||
- Juni
|
- 'Juni'
|
||||||
- Juli
|
- 'Juli'
|
||||||
- August
|
- 'August'
|
||||||
- September
|
- 'September'
|
||||||
- Oktober
|
- 'Oktober'
|
||||||
- November
|
- 'November'
|
||||||
- Dezember
|
- 'Dezember'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Montag
|
- 'Montag'
|
||||||
- Dienstag
|
- 'Dienstag'
|
||||||
- Mittwoch
|
- 'Mittwoch'
|
||||||
- Donnerstag
|
- 'Donnerstag'
|
||||||
- Freitag
|
- 'Freitag'
|
||||||
- Samstag
|
- 'Samstag'
|
||||||
- Sonntag
|
- 'Sonntag'
|
||||||
|
CRON:
|
||||||
|
EVERY: jede
|
||||||
|
EVERY_HOUR: jede Stunde
|
||||||
|
EVERY_MINUTE: Jede Minute
|
||||||
|
EVERY_DAY_OF_WEEK: jeden Tag der Woche
|
||||||
|
EVERY_DAY_OF_MONTH: jeden Tag des Monats
|
||||||
|
EVERY_MONTH: jeden Monat
|
||||||
|
TEXT_PERIOD: Alle <b />
|
||||||
|
TEXT_MINS: ' bei <b /> Minuten nach der vollen Stunde (n)'
|
||||||
|
TEXT_TIME: ' bei <b />:<b />'
|
||||||
|
TEXT_DOW: ' auf <b />'
|
||||||
|
TEXT_MONTH: ' von <b />'
|
||||||
|
TEXT_DOM: ' auf <b />'
|
||||||
|
ERROR1: Der Tag %s wird nicht unterstützt!
|
||||||
|
ERROR2: Ungültige Anzahl von Elementen
|
||||||
|
ERROR3: jquery_element sollte in den jqCron Einstellungen gesetzt werden
|
||||||
|
ERROR4: Unbekannter Ausdruck
|
||||||
|
|||||||
@@ -1,22 +1,63 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\nΤίτλος: %1$s\n---\n\n# Σφάλμα: Μη έγκυρη διαδρομή Frontmatter\n\nΔιαδρομή: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
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:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Ιανουάριος
|
- 'Ιανουάριος'
|
||||||
- Φεβρουάριος
|
- 'Φεβρουάριος'
|
||||||
- Μάρτιος
|
- 'Μάρτιος'
|
||||||
- Απρίλιος
|
- 'Απρίλιος'
|
||||||
- Μάιος
|
- 'Μάιος'
|
||||||
- Ιούνιος
|
- 'Ιούνιος'
|
||||||
- Ιούλιος
|
- 'Ιούλιος'
|
||||||
- Αύγουστος
|
- 'Αύγουστος'
|
||||||
- Σεπτέμβριος
|
- 'Σεπτέμβριος'
|
||||||
- Οκτώβριος
|
- 'Οκτώβριος'
|
||||||
- Νοέμβριος
|
- 'Νοέμβριος'
|
||||||
- Δεκέμβριος
|
- 'Δεκέμβριος'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Δευτέρα
|
- 'Δευτέρα'
|
||||||
- Τρίτη
|
- 'Τρίτη'
|
||||||
- Τετάρτη
|
- 'Τετάρτη'
|
||||||
- Πέμπτη
|
- 'Πέμπτη'
|
||||||
- Παρασκευή
|
- 'Παρασκευή'
|
||||||
- Σάββατο
|
- 'Σάββατο'
|
||||||
- Κυριακή
|
- 'Κυριακή'
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
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```"
|
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_PLURALS:
|
||||||
'/(quiz)$/i': '\1zes'
|
'/(quiz)$/i': '\1zes'
|
||||||
@@ -72,7 +74,6 @@ NICETIME:
|
|||||||
SEC: sec
|
SEC: sec
|
||||||
MIN: min
|
MIN: min
|
||||||
HR: hr
|
HR: hr
|
||||||
DAY: day
|
|
||||||
WK: wk
|
WK: wk
|
||||||
MO: mo
|
MO: mo
|
||||||
YR: yr
|
YR: yr
|
||||||
@@ -88,7 +89,6 @@ NICETIME:
|
|||||||
SEC_PLURAL: secs
|
SEC_PLURAL: secs
|
||||||
MIN_PLURAL: mins
|
MIN_PLURAL: mins
|
||||||
HR_PLURAL: hrs
|
HR_PLURAL: hrs
|
||||||
DAY_PLURAL: days
|
|
||||||
WK_PLURAL: wks
|
WK_PLURAL: wks
|
||||||
MO_PLURAL: mos
|
MO_PLURAL: mos
|
||||||
YR_PLURAL: yrs
|
YR_PLURAL: yrs
|
||||||
@@ -99,3 +99,22 @@ FORM:
|
|||||||
MISSING_REQUIRED_FIELD: Missing required field:
|
MISSING_REQUIRED_FIELD: Missing required field:
|
||||||
MONTHS_OF_THE_YEAR: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
|
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']
|
DAYS_OF_THE_WEEK: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
|
||||||
|
YES: "Yes"
|
||||||
|
NO: "No"
|
||||||
|
CRON:
|
||||||
|
EVERY: every
|
||||||
|
EVERY_HOUR: every hour
|
||||||
|
EVERY_MINUTE: every minute
|
||||||
|
EVERY_DAY_OF_WEEK: every day of the week
|
||||||
|
EVERY_DAY_OF_MONTH: every day of the month
|
||||||
|
EVERY_MONTH: every month
|
||||||
|
TEXT_PERIOD: Every <b />
|
||||||
|
TEXT_MINS: ' at <b /> minute(s) past the hour'
|
||||||
|
TEXT_TIME: ' at <b />:<b />'
|
||||||
|
TEXT_DOW: ' on <b />'
|
||||||
|
TEXT_MONTH: ' of <b />'
|
||||||
|
TEXT_DOM: ' on <b />'
|
||||||
|
ERROR1: The tag %s is not supported!
|
||||||
|
ERROR2: Bad number of elements
|
||||||
|
ERROR3: The jquery_element should be set into jqCron settings
|
||||||
|
ERROR4: Unrecognized expression
|
||||||
|
|||||||
@@ -1,38 +1,29 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntítulo: %1$s\n---\n\n# Error: Frontmatter no válido\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Error: Frontmatter Inválido
|
|
||||||
|
|
||||||
Ruta: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
0: equipo
|
- 'equipo'
|
||||||
1: información
|
- 'información'
|
||||||
3: dinero
|
- 'rice'
|
||||||
5: series
|
- 'dinero'
|
||||||
6: pescado
|
- 'species'
|
||||||
7: oveja
|
- 'series'
|
||||||
|
- 'pescado'
|
||||||
|
- 'oveja'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
man: hombres
|
'man': 'hombres'
|
||||||
child: niños
|
'child': 'niños'
|
||||||
sex: sexos
|
'sex': 'sexos'
|
||||||
INFLECTOR_ORDINALS:
|
INFLECTOR_ORDINALS:
|
||||||
first: ro
|
'first': 'ro'
|
||||||
second: do
|
'second': 'do'
|
||||||
third: ro
|
'third': 'ro'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: No se proporcionó fecha
|
NO_DATE_PROVIDED: No se proporcionó fecha
|
||||||
BAD_DATE: Fecha erronea
|
BAD_DATE: Fecha errónea
|
||||||
AGO: antes
|
AGO: antes
|
||||||
FROM_NOW: desde ahora
|
FROM_NOW: desde ahora
|
||||||
|
JUST_NOW: justo ahora
|
||||||
SECOND: segundo
|
SECOND: segundo
|
||||||
MINUTE: minuto
|
MINUTE: minuto
|
||||||
HOUR: hora
|
HOUR: hora
|
||||||
@@ -42,12 +33,10 @@ NICETIME:
|
|||||||
YEAR: año
|
YEAR: año
|
||||||
DECADE: década
|
DECADE: década
|
||||||
SEC: seg
|
SEC: seg
|
||||||
MIN: min
|
|
||||||
HR: h
|
HR: h
|
||||||
WK: sem
|
WK: sem
|
||||||
MO: mes
|
MO: mes
|
||||||
YR: año
|
YR: año
|
||||||
DEC: dec
|
|
||||||
SECOND_PLURAL: segundos
|
SECOND_PLURAL: segundos
|
||||||
MINUTE_PLURAL: minutos
|
MINUTE_PLURAL: minutos
|
||||||
HOUR_PLURAL: horas
|
HOUR_PLURAL: horas
|
||||||
@@ -57,34 +46,50 @@ NICETIME:
|
|||||||
YEAR_PLURAL: años
|
YEAR_PLURAL: años
|
||||||
DECADE_PLURAL: décadas
|
DECADE_PLURAL: décadas
|
||||||
SEC_PLURAL: segs
|
SEC_PLURAL: segs
|
||||||
MIN_PLURAL: mins
|
|
||||||
HR_PLURAL: hs
|
HR_PLURAL: hs
|
||||||
WK_PLURAL: sem
|
WK_PLURAL: sem
|
||||||
MO_PLURAL: mes
|
MO_PLURAL: mes
|
||||||
YR_PLURAL: años
|
YR_PLURAL: años
|
||||||
DEC_PLURAL: décadas
|
DEC_PLURAL: décadas
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Falló la validación. </b>'
|
VALIDATION_FAIL: '<b>Falló la validación: </b>'
|
||||||
INVALID_INPUT: 'Dato inválido en: '
|
INVALID_INPUT: 'Dato inválido en: '
|
||||||
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
|
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Enero
|
- 'Enero'
|
||||||
- Febrero
|
- 'Febrero'
|
||||||
- Marzo
|
- 'Marzo'
|
||||||
- Abril
|
- 'Abril'
|
||||||
- Mayo
|
- 'Mayo'
|
||||||
- Junio
|
- 'Junio'
|
||||||
- Julio
|
- 'Julio'
|
||||||
- Agosto
|
- 'Agosto'
|
||||||
- Septiembre
|
- 'Septiembre'
|
||||||
- Octubre
|
- 'Octubre'
|
||||||
- Noviembre
|
- 'Noviembre'
|
||||||
- Diciembre
|
- 'Diciembre'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Lunes
|
- 'Lunes'
|
||||||
- Martes
|
- 'Martes'
|
||||||
- Miércoles
|
- 'Miércoles'
|
||||||
- Jueves
|
- 'Jueves'
|
||||||
- Viernes
|
- 'Viernes'
|
||||||
- Sábado
|
- 'Sábado'
|
||||||
- Domingo
|
- 'Domingo'
|
||||||
|
CRON:
|
||||||
|
EVERY: cada
|
||||||
|
EVERY_HOUR: cada hora
|
||||||
|
EVERY_MINUTE: cada minuto
|
||||||
|
EVERY_DAY_OF_WEEK: cada día de la semana
|
||||||
|
EVERY_DAY_OF_MONTH: cada día del mes
|
||||||
|
EVERY_MONTH: cada mes
|
||||||
|
TEXT_PERIOD: Cada <b />
|
||||||
|
TEXT_MINS: ' a <b /> minuto(s) despues de la hora'
|
||||||
|
TEXT_TIME: ' a <b />:<b />'
|
||||||
|
TEXT_DOW: ' en <b />'
|
||||||
|
TEXT_MONTH: ' de<b />'
|
||||||
|
TEXT_DOM: ' en<b />'
|
||||||
|
ERROR1: La etiqueta %s no está soportada!
|
||||||
|
ERROR2: El número de elementos es erroneo
|
||||||
|
ERROR3: El jquery_element debería establecerse en la configuración del jqCron
|
||||||
|
ERROR4: Expresión no reconocida
|
||||||
|
|||||||
62
system/languages/et.yaml
Normal file
62
system/languages/et.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\npealkiri: %1$s\n---\n\n# Viga: vigane Frontmatter'i\n\nasukoht: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Kuupäev määramata
|
||||||
|
BAD_DATE: Vigane kuupäev
|
||||||
|
AGO: tagasi
|
||||||
|
FROM_NOW: praegusest
|
||||||
|
SECOND: sekund
|
||||||
|
MINUTE: minut
|
||||||
|
HOUR: tundi
|
||||||
|
DAY: päev
|
||||||
|
WEEK: nädal
|
||||||
|
MONTH: kuu
|
||||||
|
YEAR: aasta
|
||||||
|
DECADE: 10 aastat
|
||||||
|
SEC: sek
|
||||||
|
HR: t
|
||||||
|
WK: näd
|
||||||
|
MO: k.
|
||||||
|
YR: a.
|
||||||
|
DEC: dekaad
|
||||||
|
SECOND_PLURAL: sekundit
|
||||||
|
MINUTE_PLURAL: minutit
|
||||||
|
HOUR_PLURAL: tundi
|
||||||
|
DAY_PLURAL: päeva
|
||||||
|
WEEK_PLURAL: nädalat
|
||||||
|
MONTH_PLURAL: kuud
|
||||||
|
YEAR_PLURAL: aastat
|
||||||
|
DECADE_PLURAL: dekaadi
|
||||||
|
SEC_PLURAL: sekundit
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: t
|
||||||
|
WK_PLURAL: näd
|
||||||
|
MO_PLURAL: kuud
|
||||||
|
YR_PLURAL: aastat
|
||||||
|
DEC_PLURAL: dek.
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Kinnitamine nurjus:</b>
|
||||||
|
INVALID_INPUT: 'Vigane sisend:'
|
||||||
|
MISSING_REQUIRED_FIELD: 'Nõutud väli puudub:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 'jaanuar'
|
||||||
|
- 'veebruar'
|
||||||
|
- 'märts'
|
||||||
|
- 'aprill'
|
||||||
|
- 'mai'
|
||||||
|
- 'juuni'
|
||||||
|
- 'juuli'
|
||||||
|
- 'august'
|
||||||
|
- 'september'
|
||||||
|
- 'oktoober'
|
||||||
|
- 'november'
|
||||||
|
- 'detsember'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- 'esmaspäev'
|
||||||
|
- 'teisipäev'
|
||||||
|
- 'kolmapäev'
|
||||||
|
- 'neljapäev'
|
||||||
|
- 'reede'
|
||||||
|
- 'laupäev'
|
||||||
|
- 'pühapäev'
|
||||||
62
system/languages/eu.yaml
Normal file
62
system/languages/eu.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "--- title: %1$s --- # Errorea: Baliogabeko Frontmatter Bidea: `%2$s` **%3$s** ``` %4$s ```"
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Ez da datarik ezarri
|
||||||
|
BAD_DATE: Okerreko data
|
||||||
|
AGO: ' duela'
|
||||||
|
FROM_NOW: oraindik aurrera
|
||||||
|
SECOND: segundo
|
||||||
|
MINUTE: minutu
|
||||||
|
HOUR: ordua
|
||||||
|
DAY: egun
|
||||||
|
WEEK: astea
|
||||||
|
MONTH: hilabetea
|
||||||
|
YEAR: urtea
|
||||||
|
DECADE: hamarkada
|
||||||
|
SEC: seg
|
||||||
|
HR: h
|
||||||
|
WK: ast
|
||||||
|
MO: hil
|
||||||
|
YR: urt
|
||||||
|
DEC: ham
|
||||||
|
SECOND_PLURAL: segundo
|
||||||
|
MINUTE_PLURAL: minutu
|
||||||
|
HOUR_PLURAL: ordu
|
||||||
|
DAY_PLURAL: egun
|
||||||
|
WEEK_PLURAL: aste
|
||||||
|
MONTH_PLURAL: hilabete
|
||||||
|
YEAR_PLURAL: urte
|
||||||
|
DECADE_PLURAL: hamarkada
|
||||||
|
SEC_PLURAL: segundo
|
||||||
|
MIN_PLURAL: minutu
|
||||||
|
HR_PLURAL: h
|
||||||
|
WK_PLURAL: ast
|
||||||
|
MO_PLURAL: hil
|
||||||
|
YR_PLURAL: urt
|
||||||
|
DEC_PLURAL: ham
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Balidazioak huts egin du</b>
|
||||||
|
INVALID_INPUT: Baliogabeko sarrera
|
||||||
|
MISSING_REQUIRED_FIELD: 'Derrigorrezko eremua bete gabe:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 'Urtarrila'
|
||||||
|
- 'Otsaila'
|
||||||
|
- 'Martxoa'
|
||||||
|
- 'Apirila'
|
||||||
|
- 'Maiatza'
|
||||||
|
- 'Ekaina'
|
||||||
|
- 'Uztaila'
|
||||||
|
- 'Abuztua'
|
||||||
|
- 'Iraila'
|
||||||
|
- 'Urria'
|
||||||
|
- 'Azaroa'
|
||||||
|
- 'Abendua'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- 'Astelehena'
|
||||||
|
- 'Asteartea'
|
||||||
|
- 'Azteazkena'
|
||||||
|
- 'Osteguna'
|
||||||
|
- 'Ostirala'
|
||||||
|
- 'Larunbata'
|
||||||
|
- 'Igandea'
|
||||||
62
system/languages/fa.yaml
Normal file
62
system/languages/fa.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\nعنوان: %1$s\n---\n\n# خطا: Frontmatter غلط\n\nمسیر: %2$s\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
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: هفته
|
||||||
|
YR_PLURAL: سال
|
||||||
|
DEC_PLURAL: دهه
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>سنجش اعتبار ناموفق بود</b>
|
||||||
|
INVALID_INPUT: ورودی نامعتبر در
|
||||||
|
MISSING_REQUIRED_FIELD: 'قسمت ضروری جا افتاده:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 'ژانویه'
|
||||||
|
- 'فوریه'
|
||||||
|
- 'مارس'
|
||||||
|
- 'آوریل'
|
||||||
|
- 'می'
|
||||||
|
- 'ژوئن'
|
||||||
|
- 'ژوئیه'
|
||||||
|
- 'اوت'
|
||||||
|
- 'سپتامبر'
|
||||||
|
- 'اکتبر'
|
||||||
|
- 'نوامبر'
|
||||||
|
- 'دسامبر'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- 'دوشنبه'
|
||||||
|
- 'سه شنبه'
|
||||||
|
- 'چهارشنبه'
|
||||||
|
- 'پنج شنبه'
|
||||||
|
- 'جمعه'
|
||||||
|
- 'شنبه'
|
||||||
|
- 'یکشنبه'
|
||||||
@@ -1,10 +1,75 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\notsikko: %1$s\n---\n\n# Virhe: Virheellinen Frontmatter\n\nPolku: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
INFLECTOR_PLURALS:
|
||||||
|
'/(quiz)$/i': '\1zes'
|
||||||
|
'/^(ox)$/i': '\1en'
|
||||||
|
'/([m|l])ouse$/i': '\1ice'
|
||||||
|
'/(matr|vert|ind)ix|ex$/i': '\1ices'
|
||||||
|
'/(x|ch|ss|sh)$/i': '\1es'
|
||||||
|
'/([^aeiouy]|qu)ies$/i': '\1y'
|
||||||
|
'/([^aeiouy]|qu)y$/i': '\1ies'
|
||||||
|
'/(hive)$/i': '\1s'
|
||||||
|
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
|
||||||
|
'/sis$/i': 'ses'
|
||||||
|
'/([ti])um$/i': '\1a'
|
||||||
|
'/(buffal|tomat)o$/i': '\1oes'
|
||||||
|
'/(bu)s$/i': '\1ses'
|
||||||
|
'/(alias|status)/i': '\1es'
|
||||||
|
'/(octop|vir)us$/i': '\1i'
|
||||||
|
'/(ax|test)is$/i': '\1es'
|
||||||
|
'/s$/i': 's'
|
||||||
|
'/$/': 's'
|
||||||
|
INFLECTOR_SINGULAR:
|
||||||
|
'/(quiz)zes$/i': '\1'
|
||||||
|
'/(matr)ices$/i': '\1ix'
|
||||||
|
'/(vert|ind)ices$/i': '\1ex'
|
||||||
|
'/^(ox)en/i': '\1'
|
||||||
|
'/(alias|status)es$/i': '\1'
|
||||||
|
'/([octop|vir])i$/i': '\1us'
|
||||||
|
'/(cris|ax|test)es$/i': '\1is'
|
||||||
|
'/(shoe)s$/i': '\1'
|
||||||
|
'/(o)es$/i': '\1'
|
||||||
|
'/(bus)es$/i': '\1'
|
||||||
|
'/([m|l])ice$/i': '\1ouse'
|
||||||
|
'/(x|ch|ss|sh)es$/i': '\1'
|
||||||
|
'/(m)ovies$/i': '\1ovie'
|
||||||
|
'/(s)eries$/i': '\1eries'
|
||||||
|
'/([^aeiouy]|qu)ies$/i': '\1y'
|
||||||
|
'/([lr])ves$/i': '\1f'
|
||||||
|
'/(tive)s$/i': '\1'
|
||||||
|
'/(hive)s$/i': '\1'
|
||||||
|
'/([^f])ves$/i': '\1fe'
|
||||||
|
'/(^analy)ses$/i': '\1sis'
|
||||||
|
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
|
||||||
|
'/([ti])a$/i': '\1um'
|
||||||
|
'/(n)ews$/i': '\1ews'
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- 'equipment'
|
||||||
|
- 'information'
|
||||||
|
- 'riisi'
|
||||||
|
- 'raha'
|
||||||
|
- 'lajit'
|
||||||
|
- 'series'
|
||||||
|
- 'kala'
|
||||||
|
- 'lammas'
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
'person': 'ihmiset'
|
||||||
|
'man': 'miehet'
|
||||||
|
'child': 'lapset'
|
||||||
|
'sex': 'sukupuoli'
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
'default': '.'
|
||||||
|
'first': '.'
|
||||||
|
'second': '.'
|
||||||
|
'third': '.'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Päivämäärää ei annettu
|
NO_DATE_PROVIDED: Päivämäärää ei annettu
|
||||||
BAD_DATE: Virheellinen päivämäärä
|
BAD_DATE: Virheellinen päivämäärä
|
||||||
AGO: sitten
|
AGO: sitten
|
||||||
FROM_NOW: tästä lähtien
|
FROM_NOW: tästä lähtien
|
||||||
SECOND: sekunti
|
JUST_NOW: juuri nyt
|
||||||
|
SECOND: sekuntti
|
||||||
MINUTE: minuutti
|
MINUTE: minuutti
|
||||||
HOUR: tunti
|
HOUR: tunti
|
||||||
DAY: päivä
|
DAY: päivä
|
||||||
@@ -35,26 +100,35 @@ NICETIME:
|
|||||||
YR_PLURAL: v
|
YR_PLURAL: v
|
||||||
DEC_PLURAL: vuosikymmentä
|
DEC_PLURAL: vuosikymmentä
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Vahvistus epäonnistui:</b>'
|
VALIDATION_FAIL: <b>Vahvistus epäonnistui:</b>
|
||||||
|
INVALID_INPUT: Syöte ei kelpaa
|
||||||
MISSING_REQUIRED_FIELD: 'Puuttuva pakollinen kenttä:'
|
MISSING_REQUIRED_FIELD: 'Puuttuva pakollinen kenttä:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Tammikuu
|
- 'Tammikuu'
|
||||||
- Helmikuu
|
- 'Helmikuu'
|
||||||
- Maaliskuu
|
- 'Maaliskuu'
|
||||||
- Huhtikuu
|
- 'Huhtikuu'
|
||||||
- Toukokuu
|
- 'Toukokuu'
|
||||||
- Kesäkuuta
|
- 'Kesäkuuta'
|
||||||
- Heinäkuu
|
- 'Heinäkuu'
|
||||||
- Elokuu
|
- 'Elokuu'
|
||||||
- Syyskuu
|
- 'Syyskuu'
|
||||||
- Lokakuu
|
- 'Lokakuu'
|
||||||
- Marraskuu
|
- 'Marraskuu'
|
||||||
- Joulukuu
|
- 'Joulukuu'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Maanantai
|
- 'Maanantai'
|
||||||
- Tiistai
|
- 'Tiistai'
|
||||||
- Keskiviikko
|
- 'Keskiviikko'
|
||||||
- Torstai
|
- 'Torstai'
|
||||||
- Perjantai
|
- 'Perjantai'
|
||||||
- Lauantai
|
- 'Lauantai'
|
||||||
- Sunnuntai
|
- 'Sunnuntai'
|
||||||
|
CRON:
|
||||||
|
EVERY: joka
|
||||||
|
EVERY_HOUR: joka tunti
|
||||||
|
EVERY_MINUTE: joka minuutti
|
||||||
|
EVERY_DAY_OF_WEEK: viikon jokaisena päivänä
|
||||||
|
EVERY_DAY_OF_MONTH: kuukauden jokaisena päivänä
|
||||||
|
EVERY_MONTH: joka kuukausi
|
||||||
|
TEXT_PERIOD: Joka <b />
|
||||||
|
|||||||
@@ -1,86 +1,52 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntitre: %1$s\n---\n\n# Erreur : Frontmatter invalide\n\nChemin: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Erreur : Frontmatter invalide
|
|
||||||
|
|
||||||
Path: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
INFLECTOR_PLURALS:
|
INFLECTOR_PLURALS:
|
||||||
/(quiz)$/i: '\1zes'
|
'/(quiz)$/i': '\1zes'
|
||||||
/^(ox)$/i: '\1en'
|
'/^(ox)$/i': '\1en'
|
||||||
"/([m|l])ouse$/i": '\1ice'
|
'/([m|l])ouse$/i': '\1ice'
|
||||||
/(matr|vert|ind)ix|ex$/i: '\1ices'
|
'/(matr|vert|ind)ix|ex$/i': '\1ices'
|
||||||
/(x|ch|ss|sh)$/i: '\1es'
|
'/(x|ch|ss|sh)$/i': '\1es'
|
||||||
"/([^aeiouy]|qu)ies$/i": '\1y'
|
'/([^aeiouy]|qu)ies$/i': '\1y'
|
||||||
"/([^aeiouy]|qu)y$/i": '\1ies'
|
'/([^aeiouy]|qu)y$/i': '\1ies'
|
||||||
/(hive)$/i: '\1s'
|
'/(hive)$/i': '\1s'
|
||||||
"/(?:([^f])fe|([lr])f)$/i": '\1\2ves'
|
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
|
||||||
/sis$/i: ses
|
'/sis$/i': 'ses'
|
||||||
"/([ti])um$/i": '\1a'
|
'/([ti])um$/i': '\1a'
|
||||||
/(buffal|tomat)o$/i: '\1oes'
|
'/(buffal|tomat)o$/i': '\1es'
|
||||||
/(bu)s$/i: '\1ses'
|
'/(ax|test)is$/i': '\1s'
|
||||||
/(alias|status)/i: '\1es'
|
'/s$/i': 's'
|
||||||
/(octop|vir)us$/i: '\1i'
|
'/$/': 's'
|
||||||
/(ax|test)is$/i: '\1es'
|
|
||||||
/s$/i: s
|
|
||||||
/$/: s
|
|
||||||
INFLECTOR_SINGULAR:
|
INFLECTOR_SINGULAR:
|
||||||
/(quiz)zes$/i: '\1'
|
'/(quiz)zes$/i': '\1'
|
||||||
/(matr)ices$/i: '\1ix'
|
'/(alias|status)es$/i': '\1'
|
||||||
/(vert|ind)ices$/i: '\1ex'
|
'/([octop|vir])i$/i': '\1us'
|
||||||
/^(ox)en/i: '\1'
|
|
||||||
/(alias|status)es$/i: '\1'
|
|
||||||
"/([octop|vir])i$/i": '\1us'
|
|
||||||
/(cris|ax|test)es$/i: '\1is'
|
|
||||||
/(shoe)s$/i: '\1'
|
|
||||||
/(o)es$/i: '\1'
|
|
||||||
/(bus)es$/i: '\1'
|
|
||||||
"/([m|l])ice$/i": '\1ouse'
|
|
||||||
/(x|ch|ss|sh)es$/i: '\1'
|
|
||||||
/(m)ovies$/i: '\1ovie'
|
|
||||||
/(s)eries$/i: '\1eries'
|
|
||||||
"/([^aeiouy]|qu)ies$/i": '\1y'
|
|
||||||
"/([lr])ves$/i": '\1f'
|
|
||||||
/(tive)s$/i: '\1'
|
|
||||||
/(hive)s$/i: '\1'
|
|
||||||
"/([^f])ves$/i": '\1fe'
|
|
||||||
/(^analy)ses$/i: '\1sis'
|
|
||||||
/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i: '\1\2sis'
|
|
||||||
"/([ti])a$/i": '\1um'
|
|
||||||
/(n)ews$/i: '\1ews'
|
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
- équipement
|
- 'équipement'
|
||||||
- informations
|
- 'information'
|
||||||
- riz
|
- 'riz'
|
||||||
- argent
|
- 'argent'
|
||||||
- espèces
|
- 'espèces'
|
||||||
- séries
|
- 'séries'
|
||||||
- poisson
|
- 'poisson'
|
||||||
- mouton
|
- 'mouton'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: personnes
|
'person': 'personnes'
|
||||||
man: hommes
|
'man': 'hommes'
|
||||||
child: enfants
|
'child': 'enfants'
|
||||||
sex: sexes
|
'sex': 'sexes'
|
||||||
move: déplacements
|
'move': 'déplacements'
|
||||||
INFLECTOR_ORDINALS:
|
INFLECTOR_ORDINALS:
|
||||||
default: ème
|
'default': 'ème'
|
||||||
first: er
|
'first': 'er'
|
||||||
second: ème
|
'second': 'ème'
|
||||||
third: ème
|
'third': 'ème'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Aucune date fournie
|
NO_DATE_PROVIDED: Aucune date fournie
|
||||||
BAD_DATE: Date erronée
|
BAD_DATE: Date erronée
|
||||||
AGO: plus tôt
|
AGO: plus tôt
|
||||||
FROM_NOW: à partir de maintenant
|
FROM_NOW: à partir de maintenant
|
||||||
|
JUST_NOW: à l'instant
|
||||||
SECOND: seconde
|
SECOND: seconde
|
||||||
MINUTE: minute
|
MINUTE: minute
|
||||||
HOUR: heure
|
HOUR: heure
|
||||||
@@ -112,27 +78,44 @@ NICETIME:
|
|||||||
YR_PLURAL: a
|
YR_PLURAL: a
|
||||||
DEC_PLURAL: décs
|
DEC_PLURAL: décs
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>La validation a échoué :</b>'
|
VALIDATION_FAIL: <b>La validation a échoué :</b>
|
||||||
INVALID_INPUT: Saisie non valide
|
INVALID_INPUT: Saisie non valide
|
||||||
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
|
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Janvier
|
- 'Janvier'
|
||||||
- Février
|
- 'Février'
|
||||||
- Mars
|
- 'Mars'
|
||||||
- Avril
|
- 'Avril'
|
||||||
- Mai
|
- 'Mai'
|
||||||
- Juin
|
- 'Juin'
|
||||||
- Juillet
|
- 'Juillet'
|
||||||
- Août
|
- 'Août'
|
||||||
- Septembre
|
- 'Septembre'
|
||||||
- Octobre
|
- 'Octobre'
|
||||||
- Novembre
|
- 'Novembre'
|
||||||
- Décembre
|
- 'Décembre'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Lundi
|
- 'Lundi'
|
||||||
- Mardi
|
- 'Mardi'
|
||||||
- Mercredi
|
- 'Mercredi'
|
||||||
- Jeudi
|
- 'Jeudi'
|
||||||
- Vendredi
|
- 'Vendredi'
|
||||||
- Samedi
|
- 'Samedi'
|
||||||
- Dimanche
|
- 'Dimanche'
|
||||||
|
CRON:
|
||||||
|
EVERY: chaque
|
||||||
|
EVERY_HOUR: toutes les heures
|
||||||
|
EVERY_MINUTE: chaque minute
|
||||||
|
EVERY_DAY_OF_WEEK: tous les jours de la semaine
|
||||||
|
EVERY_DAY_OF_MONTH: tous les jours du mois
|
||||||
|
EVERY_MONTH: chaque mois
|
||||||
|
TEXT_PERIOD: Chaque<b/>
|
||||||
|
TEXT_MINS: ' à <b /> minute(s) après l''heure'
|
||||||
|
TEXT_TIME: ' à<b/>:<b/>'
|
||||||
|
TEXT_DOW: ' sur <b/>'
|
||||||
|
TEXT_MONTH: ' de <b />'
|
||||||
|
TEXT_DOM: ' sur <b/>'
|
||||||
|
ERROR1: La balise %s n'est pas supportée!
|
||||||
|
ERROR2: Nombre invalide d'éléments
|
||||||
|
ERROR3: L'élément jquery_element doit être défini dans les paramètres jqCron
|
||||||
|
ERROR4: Expression non reconnue
|
||||||
|
|||||||
63
system/languages/he.yaml
Normal file
63
system/languages/he.yaml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\nכותרת: %1$s\n---\n# שגיאה: Fronmatter לא חוקי\nנתיב: `%2$s`\n**%3$s**\n```\n%4$s\n```"
|
||||||
|
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:
|
||||||
|
- 'שני'
|
||||||
|
- 'שלישי'
|
||||||
|
- 'רביעי'
|
||||||
|
- 'חמישי'
|
||||||
|
- 'שישי'
|
||||||
|
- 'שבת'
|
||||||
|
- 'ראשון'
|
||||||
@@ -1,19 +1,20 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
- oprema
|
- 'oprema'
|
||||||
- informacije
|
- 'informacije'
|
||||||
- riža
|
- 'riža'
|
||||||
- novac
|
- 'novac'
|
||||||
- vrsta
|
- 'vrsta'
|
||||||
- serija
|
- 'serija'
|
||||||
- riba
|
- 'riba'
|
||||||
- ovca
|
- 'ovca'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: osobe
|
'person': 'osobe'
|
||||||
man: ljudi
|
'man': 'ljudi'
|
||||||
child: djeca
|
'child': 'djeca'
|
||||||
sex: spolovi
|
'sex': 'spolovi'
|
||||||
move: Pomakni
|
'move': 'Pomakni'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Datum nije upisan
|
NO_DATE_PROVIDED: Datum nije upisan
|
||||||
BAD_DATE: Pogrešan datum
|
BAD_DATE: Pogrešan datum
|
||||||
@@ -49,27 +50,27 @@ NICETIME:
|
|||||||
YR_PLURAL: g
|
YR_PLURAL: g
|
||||||
DEC_PLURAL: des
|
DEC_PLURAL: des
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validacija nije uspjela:</b>'
|
VALIDATION_FAIL: <b>Validacija nije uspjela:</b>
|
||||||
INVALID_INPUT: Pogrešan unos u
|
INVALID_INPUT: Pogrešan unos u
|
||||||
MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:'
|
MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Siječanj
|
- 'Siječanj'
|
||||||
- Veljača
|
- 'Veljača'
|
||||||
- Ožujak
|
- 'Ožujak'
|
||||||
- Travanj
|
- 'Travanj'
|
||||||
- Svibanj
|
- 'Svibanj'
|
||||||
- Lipanj
|
- 'Lipanj'
|
||||||
- Srpanj
|
- 'Srpanj'
|
||||||
- Kolovoz
|
- 'Kolovoz'
|
||||||
- Rujan
|
- 'Rujan'
|
||||||
- Listopad
|
- 'Listopad'
|
||||||
- Studeni
|
- 'Studeni'
|
||||||
- Prosinac
|
- 'Prosinac'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Ponedjeljak
|
- 'Ponedjeljak'
|
||||||
- Utorak
|
- 'Utorak'
|
||||||
- Srijeda
|
- 'Srijeda'
|
||||||
- Četvrtak
|
- 'Četvrtak'
|
||||||
- Petak
|
- 'Petak'
|
||||||
- Subota
|
- 'Subota'
|
||||||
- Nedjelja
|
- 'Nedjelja'
|
||||||
|
|||||||
@@ -1,86 +1,32 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ncím: %1$s\n---\n\n# Hiba: Érvénytelen Frontmatter\n\nElérési út: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
cím: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Hiba: Érvénytelen Frontmatter
|
|
||||||
|
|
||||||
Elérési út: `%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:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
- felszerelés
|
- 'felszerelés'
|
||||||
- információ
|
- 'információ'
|
||||||
- rizs
|
- 'rizs'
|
||||||
- pénz
|
- 'pénz'
|
||||||
- fajok
|
- 'fajok'
|
||||||
- sorozat
|
- 'sorozat'
|
||||||
- hal
|
- 'hal'
|
||||||
- juh
|
- 'juh'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: személyek
|
'person': 'személyek'
|
||||||
man: férfiak
|
'man': 'férfiak'
|
||||||
child: gyerekek
|
'child': 'gyerekek'
|
||||||
sex: nemek
|
'sex': 'nemek'
|
||||||
move: lépések
|
'move': 'lépések'
|
||||||
INFLECTOR_ORDINALS:
|
INFLECTOR_ORDINALS:
|
||||||
default: '.'
|
'default': '.'
|
||||||
first: '.'
|
'first': '.'
|
||||||
second: '.'
|
'second': '.'
|
||||||
third: '.'
|
'third': '.'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Nincs dátum megadva
|
NO_DATE_PROVIDED: Nincs dátum megadva
|
||||||
BAD_DATE: Hibás dátum
|
BAD_DATE: Hibás dátum
|
||||||
AGO: elteltével
|
AGO: elteltével
|
||||||
FROM_NOW: mostantól
|
FROM_NOW: mostantól
|
||||||
|
JUST_NOW: épp most
|
||||||
SECOND: másodperc
|
SECOND: másodperc
|
||||||
MINUTE: perc
|
MINUTE: perc
|
||||||
HOUR: óra
|
HOUR: óra
|
||||||
@@ -112,27 +58,40 @@ NICETIME:
|
|||||||
YR_PLURAL: év
|
YR_PLURAL: év
|
||||||
DEC_PLURAL: évt
|
DEC_PLURAL: évt
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>A validáció hibát talált:</b>'
|
VALIDATION_FAIL: <b>Érvényesítés nem sikerült:</b>
|
||||||
INVALID_INPUT: 'Az itt megadott érték érvénytelen:'
|
INVALID_INPUT: 'A megadott érték érvénytelen:'
|
||||||
MISSING_REQUIRED_FIELD: 'Ez a kötelező mező nincs kitöltve:'
|
MISSING_REQUIRED_FIELD: 'Ez a kötelező mező nincs kitöltve:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- január
|
- 'január'
|
||||||
- február
|
- 'február'
|
||||||
- március
|
- 'március'
|
||||||
- április
|
- 'április'
|
||||||
- május
|
- 'május'
|
||||||
- június
|
- 'június'
|
||||||
- július
|
- 'július'
|
||||||
- augusztus
|
- 'augusztus'
|
||||||
- szeptember
|
- 'szeptember'
|
||||||
- október
|
- 'október'
|
||||||
- november
|
- 'november'
|
||||||
- december
|
- 'december'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- hétfő
|
- 'hétfő'
|
||||||
- kedd
|
- 'kedd'
|
||||||
- szerda
|
- 'szerda'
|
||||||
- csütörtök
|
- 'csütörtök'
|
||||||
- péntek
|
- 'péntek'
|
||||||
- szombat
|
- 'szombat'
|
||||||
- vasárnap
|
- 'vasárnap'
|
||||||
|
CRON:
|
||||||
|
EVERY: minden
|
||||||
|
EVERY_HOUR: óránként
|
||||||
|
EVERY_MINUTE: percenként
|
||||||
|
EVERY_DAY_OF_WEEK: a hét minden napján
|
||||||
|
EVERY_DAY_OF_MONTH: a hónap minden napján
|
||||||
|
EVERY_MONTH: minden hónapban
|
||||||
|
TEXT_PERIOD: Minden <b />
|
||||||
|
TEXT_MINS: '<b /> perccel az óra elteltével'
|
||||||
|
ERROR1: A %s címke nem engedélyezett!
|
||||||
|
ERROR2: Hibás elemszám
|
||||||
|
ERROR3: A jquery_element-et a jqCron beállítsokban kell meghatározni
|
||||||
|
ERROR4: Ismeretlen kifejezés
|
||||||
|
|||||||
95
system/languages/id.yaml
Normal file
95
system/languages/id.yaml
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Frontmatter tidak valid\n\nLokasi: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- 'peralatan'
|
||||||
|
- 'informasi'
|
||||||
|
- 'nasi'
|
||||||
|
- 'uang'
|
||||||
|
- 'spesies'
|
||||||
|
- 'rangkaian'
|
||||||
|
- 'ikan'
|
||||||
|
- 'domba'
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
'person': 'orang-orang'
|
||||||
|
'man': 'laki-laki'
|
||||||
|
'child': 'anak-anak'
|
||||||
|
'sex': 'jenis kelamin'
|
||||||
|
'move': 'pindahkan'
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Tanggal tidak tersedia
|
||||||
|
BAD_DATE: Format tanggal salah
|
||||||
|
AGO: yang lalu
|
||||||
|
FROM_NOW: dari saat ini
|
||||||
|
JUST_NOW: baru saja
|
||||||
|
SECOND: detik
|
||||||
|
MINUTE: menit
|
||||||
|
HOUR: jam
|
||||||
|
DAY: hari
|
||||||
|
WEEK: pekan
|
||||||
|
MONTH: bulan
|
||||||
|
YEAR: tahun
|
||||||
|
DECADE: dekade
|
||||||
|
SEC: dtk
|
||||||
|
MIN: mnt
|
||||||
|
HR: j
|
||||||
|
WK: mng
|
||||||
|
MO: bln
|
||||||
|
YR: thn
|
||||||
|
DEC: desimal
|
||||||
|
SECOND_PLURAL: detik
|
||||||
|
MINUTE_PLURAL: menit
|
||||||
|
HOUR_PLURAL: jam
|
||||||
|
DAY_PLURAL: hari
|
||||||
|
WEEK_PLURAL: pekan
|
||||||
|
MONTH_PLURAL: bulan
|
||||||
|
YEAR_PLURAL: tahun
|
||||||
|
DECADE_PLURAL: dekade
|
||||||
|
SEC_PLURAL: dtk
|
||||||
|
MIN_PLURAL: mnt
|
||||||
|
HR_PLURAL: j
|
||||||
|
WK_PLURAL: mgg
|
||||||
|
MO_PLURAL: bln
|
||||||
|
YR_PLURAL: thn
|
||||||
|
DEC_PLURAL: dekade
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Validasi gagal:</b>
|
||||||
|
INVALID_INPUT: Input tidak valid di
|
||||||
|
MISSING_REQUIRED_FIELD: 'Data yang diperlukan belum terisi:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 'Januari'
|
||||||
|
- 'Februari'
|
||||||
|
- 'Maret'
|
||||||
|
- 'April'
|
||||||
|
- 'Mei'
|
||||||
|
- 'Juni'
|
||||||
|
- 'Juli'
|
||||||
|
- 'Agustus'
|
||||||
|
- 'September'
|
||||||
|
- 'Oktober'
|
||||||
|
- 'November'
|
||||||
|
- 'Desember'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- 'Senin'
|
||||||
|
- 'Selasa'
|
||||||
|
- 'Rabu'
|
||||||
|
- 'Kamis'
|
||||||
|
- 'Jumat'
|
||||||
|
- 'Sabtu'
|
||||||
|
- 'Minggu'
|
||||||
|
CRON:
|
||||||
|
EVERY: Setiap
|
||||||
|
EVERY_HOUR: Setiap jam
|
||||||
|
EVERY_MINUTE: Setiap menit
|
||||||
|
EVERY_DAY_OF_WEEK: Setiap hari selama seminggu
|
||||||
|
EVERY_DAY_OF_MONTH: pada tanggal setiap bulannya
|
||||||
|
EVERY_MONTH: setiap bulan
|
||||||
|
TEXT_PERIOD: Setiap <b />
|
||||||
|
TEXT_TIME: ' pada <b />:<b />'
|
||||||
|
TEXT_DOW: ' pada <b />'
|
||||||
|
TEXT_MONTH: ' pada <b />'
|
||||||
|
TEXT_DOM: ' pada <b />'
|
||||||
|
ERROR1: Tag %s tidak didukung!
|
||||||
|
ERROR2: Jumlah elemen tidak valid
|
||||||
|
ERROR3: jquery_element harus ditetapkan ke pengaturan jqCron
|
||||||
|
ERROR4: Ekspresi tidak dikenali
|
||||||
69
system/languages/is.yaml
Normal file
69
system/languages/is.yaml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitill: %1$s\n---\n\n# Villa: Ógilt efni á forsíðu\n\nSlóð: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- 'equipment'
|
||||||
|
- 'upplýsingar'
|
||||||
|
- 'rice'
|
||||||
|
- 'money'
|
||||||
|
- 'species'
|
||||||
|
- 'series'
|
||||||
|
- 'fish'
|
||||||
|
- 'sheep'
|
||||||
|
NICETIME:
|
||||||
|
AGO: síðan
|
||||||
|
JUST_NOW: í þessu
|
||||||
|
SECOND: sekúndu
|
||||||
|
MINUTE: mínútu
|
||||||
|
HOUR: klukkustund
|
||||||
|
DAY: degi
|
||||||
|
WEEK: viku
|
||||||
|
MONTH: mánuði
|
||||||
|
YEAR: ári
|
||||||
|
DECADE: áratug
|
||||||
|
SEC: sek
|
||||||
|
MIN: mín
|
||||||
|
HR: klst
|
||||||
|
WK: vk
|
||||||
|
MO: mán
|
||||||
|
YR: ár
|
||||||
|
DEC: árat
|
||||||
|
SECOND_PLURAL: sekúndum
|
||||||
|
MINUTE_PLURAL: mínútum
|
||||||
|
HOUR_PLURAL: klukkustundum
|
||||||
|
DAY_PLURAL: dögum
|
||||||
|
WEEK_PLURAL: vikum
|
||||||
|
MONTH_PLURAL: mánuðum
|
||||||
|
YEAR_PLURAL: árum
|
||||||
|
DECADE_PLURAL: áratugum
|
||||||
|
SEC_PLURAL: sek
|
||||||
|
MIN_PLURAL: mín
|
||||||
|
HR_PLURAL: klst
|
||||||
|
WK_PLURAL: vik
|
||||||
|
MO_PLURAL: mán
|
||||||
|
YR_PLURAL: árum
|
||||||
|
DEC_PLURAL: árat
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Sannvottun mistókst:</b>
|
||||||
|
MISSING_REQUIRED_FIELD: 'Vantar nauðsynlegan reit:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 'janúar'
|
||||||
|
- 'Febrúar'
|
||||||
|
- 'Mars'
|
||||||
|
- 'Apríl'
|
||||||
|
- 'Maí'
|
||||||
|
- 'Júní'
|
||||||
|
- 'Júlí'
|
||||||
|
- 'Ágúst'
|
||||||
|
- 'September'
|
||||||
|
- 'Október'
|
||||||
|
- 'Nóvember'
|
||||||
|
- 'Desember'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- 'Mánudagur'
|
||||||
|
- 'Þriðjudagur'
|
||||||
|
- 'Miðvikudagur'
|
||||||
|
- 'Fimmtudagur'
|
||||||
|
- 'Föstudagur'
|
||||||
|
- 'Laugardagur'
|
||||||
|
- 'Sunnudagur'
|
||||||
@@ -1,10 +1,32 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '"
|
FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '"
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- 'dotazione'
|
||||||
|
- 'informazione'
|
||||||
|
- 'riso'
|
||||||
|
- 'denaro'
|
||||||
|
- 'specie'
|
||||||
|
- 'serie'
|
||||||
|
- 'pesce'
|
||||||
|
- 'pecora'
|
||||||
|
INFLECTOR_IRREGULAR:
|
||||||
|
'person': 'persone'
|
||||||
|
'man': 'uomini'
|
||||||
|
'child': 'bambino'
|
||||||
|
'sex': 'sessi'
|
||||||
|
'move': 'sposta'
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
'default': '°'
|
||||||
|
'first': '°'
|
||||||
|
'second': 'o'
|
||||||
|
'third': 'o'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Nessuna data fornita
|
NO_DATE_PROVIDED: Nessuna data fornita
|
||||||
BAD_DATE: Data non valida
|
BAD_DATE: Data non valida
|
||||||
AGO: fa
|
AGO: fa
|
||||||
FROM_NOW: da adesso
|
FROM_NOW: da adesso
|
||||||
|
JUST_NOW: ora
|
||||||
SECOND: secondo
|
SECOND: secondo
|
||||||
MINUTE: minuto
|
MINUTE: minuto
|
||||||
HOUR: ora
|
HOUR: ora
|
||||||
@@ -36,27 +58,44 @@ NICETIME:
|
|||||||
YR_PLURAL: anni
|
YR_PLURAL: anni
|
||||||
DEC_PLURAL: decenni
|
DEC_PLURAL: decenni
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validazione fallita:</b>'
|
VALIDATION_FAIL: <b>Validazione fallita:</b>
|
||||||
INVALID_INPUT: Input non valido in
|
INVALID_INPUT: Input non valido in
|
||||||
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
|
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Gennaio
|
- 'Gennaio'
|
||||||
- Febbraio
|
- 'Febbraio'
|
||||||
- Marzo
|
- 'Marzo'
|
||||||
- Aprile
|
- 'Aprile'
|
||||||
- Maggio
|
- 'Maggio'
|
||||||
- Giugno
|
- 'Giugno'
|
||||||
- Luglio
|
- 'Luglio'
|
||||||
- Agosto
|
- 'Agosto'
|
||||||
- Settembre
|
- 'Settembre'
|
||||||
- Ottobre
|
- 'Ottobre'
|
||||||
- Novembre
|
- 'Novembre'
|
||||||
- Dicembre
|
- 'Dicembre'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Lunedì
|
- 'Lunedì'
|
||||||
- Martedì
|
- 'Martedì'
|
||||||
- Mercoledì
|
- 'Mercoledì'
|
||||||
- Giovedì
|
- 'Giovedì'
|
||||||
- Venerdì
|
- 'Venerdì'
|
||||||
- Sabato
|
- 'Sabato'
|
||||||
- Domenica
|
- 'Domenica'
|
||||||
|
CRON:
|
||||||
|
EVERY: ogni
|
||||||
|
EVERY_HOUR: ogni ora
|
||||||
|
EVERY_MINUTE: ogni minuto
|
||||||
|
EVERY_DAY_OF_WEEK: ogni giorno della settimana
|
||||||
|
EVERY_DAY_OF_MONTH: ogni giorno del mese
|
||||||
|
EVERY_MONTH: ogni mese
|
||||||
|
TEXT_PERIOD: Ogni <b />
|
||||||
|
TEXT_MINS: ' a <b /> minuto(i) dall''inizio dell''ora'
|
||||||
|
TEXT_TIME: ' alle <b />:<b />'
|
||||||
|
TEXT_DOW: ' su <b />'
|
||||||
|
TEXT_MONTH: ' di <b />'
|
||||||
|
TEXT_DOM: ' di <b />'
|
||||||
|
ERROR1: Il tag %s non è supportato!
|
||||||
|
ERROR2: Numero di elementi non valido
|
||||||
|
ERROR3: Il jquery_element deve essere impostato nelle impostazioni di jqCron
|
||||||
|
ERROR4: Espressione non riconosciuta
|
||||||
|
|||||||
@@ -1,24 +1,15 @@
|
|||||||
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: []
|
GRAV:
|
||||||
|
|
||||||
INFLECTOR_SINGULAR: []
|
|
||||||
|
|
||||||
INFLECTOR_UNCOUNTABLE: []
|
|
||||||
|
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
'person': 'みんな'
|
'person': 'みんな'
|
||||||
'man': '人'
|
'man': '人'
|
||||||
'child': '子供'
|
'child': '子供'
|
||||||
'sex': '性別'
|
'sex': '性別'
|
||||||
'move': '移動'
|
'move': '移動'
|
||||||
|
|
||||||
INFLECTOR_ORDINALS: []
|
|
||||||
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: 日付が設定されていません
|
NO_DATE_PROVIDED: 日付が設定されていません
|
||||||
BAD_DATE: 不正な日付
|
BAD_DATE: 不正な日付
|
||||||
AGO: 前
|
AGO: 前
|
||||||
FROM_NOW: from now
|
|
||||||
SECOND: 秒
|
SECOND: 秒
|
||||||
MINUTE: 分
|
MINUTE: 分
|
||||||
HOUR: 時
|
HOUR: 時
|
||||||
@@ -30,11 +21,9 @@ NICETIME:
|
|||||||
SEC: 秒
|
SEC: 秒
|
||||||
MIN: 分
|
MIN: 分
|
||||||
HR: 時
|
HR: 時
|
||||||
DAY: 日
|
|
||||||
WK: 週
|
WK: 週
|
||||||
MO: 月
|
MO: 月
|
||||||
YR: 年
|
YR: 年
|
||||||
DEC: dec
|
|
||||||
SECOND_PLURAL: 秒
|
SECOND_PLURAL: 秒
|
||||||
MINUTE_PLURAL: 分
|
MINUTE_PLURAL: 分
|
||||||
HOUR_PLURAL: 時
|
HOUR_PLURAL: 時
|
||||||
@@ -46,7 +35,6 @@ NICETIME:
|
|||||||
SEC_PLURAL: 秒
|
SEC_PLURAL: 秒
|
||||||
MIN_PLURAL: 分
|
MIN_PLURAL: 分
|
||||||
HR_PLURAL: 時
|
HR_PLURAL: 時
|
||||||
DAY_PLURAL: 日
|
|
||||||
WK_PLURAL: 週
|
WK_PLURAL: 週
|
||||||
MO_PLURAL: 月
|
MO_PLURAL: 月
|
||||||
YR_PLURAL: 年
|
YR_PLURAL: 年
|
||||||
@@ -54,6 +42,25 @@ NICETIME:
|
|||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: <b>バリデーション失敗 :</b>
|
VALIDATION_FAIL: <b>バリデーション失敗 :</b>
|
||||||
INVALID_INPUT: 不正な入力:
|
INVALID_INPUT: 不正な入力:
|
||||||
MISSING_REQUIRED_FIELD: 必須項目が入力されていません:
|
MISSING_REQUIRED_FIELD: '必須項目が入力されていません:'
|
||||||
MONTHS_OF_THE_YEAR: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
|
MONTHS_OF_THE_YEAR:
|
||||||
DAYS_OF_THE_WEEK: ['月', '火', '水', '木', '金', '土', '日']
|
- '1月'
|
||||||
|
- '2月'
|
||||||
|
- '3月'
|
||||||
|
- '4月'
|
||||||
|
- '5月'
|
||||||
|
- '6月'
|
||||||
|
- '7月'
|
||||||
|
- '8月'
|
||||||
|
- '9月'
|
||||||
|
- '10月'
|
||||||
|
- '11月'
|
||||||
|
- '12月'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- '月'
|
||||||
|
- '火'
|
||||||
|
- '水'
|
||||||
|
- '木'
|
||||||
|
- '金'
|
||||||
|
- '土'
|
||||||
|
- '日'
|
||||||
|
|||||||
63
system/languages/ko.yaml
Normal file
63
system/languages/ko.yaml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# 오류: 무효의 Frontmatter\n\n경로: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
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:
|
||||||
|
- '월요일'
|
||||||
|
- '화요일'
|
||||||
|
- '수요일'
|
||||||
|
- '목요일'
|
||||||
|
- '금요일'
|
||||||
|
- '토요일'
|
||||||
|
- '일요일'
|
||||||
@@ -1,17 +1,21 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Klaida: klaidinga įžanginė konfigūracija\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n %4$s\n```"
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
2: ryžiai
|
- 'equipment'
|
||||||
3: pinigai
|
- 'information'
|
||||||
4: prieskoniai
|
- 'ryžiai'
|
||||||
5: serijos
|
- 'pinigai'
|
||||||
6: žuvis
|
- 'prieskoniai'
|
||||||
7: avis
|
- 'serijos'
|
||||||
|
- 'žuvis'
|
||||||
|
- 'avis'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: žmonės
|
'person': 'žmonės'
|
||||||
man: žmogus
|
'man': 'žmogus'
|
||||||
child: vaikai
|
'child': 'vaikai'
|
||||||
sex: lytys
|
'sex': 'lytys'
|
||||||
move: juda
|
'move': 'juda'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Nenurodyta data
|
NO_DATE_PROVIDED: Nenurodyta data
|
||||||
BAD_DATE: Neteisinga data
|
BAD_DATE: Neteisinga data
|
||||||
@@ -25,12 +29,14 @@ NICETIME:
|
|||||||
MONTH: mėnuo
|
MONTH: mėnuo
|
||||||
YEAR: metai
|
YEAR: metai
|
||||||
DECADE: dešimtmetis
|
DECADE: dešimtmetis
|
||||||
SEC: sek
|
SEC: sek.
|
||||||
MIN: min
|
MIN: min.
|
||||||
HR: val
|
HR: val.
|
||||||
WK: sav
|
WK: sav.
|
||||||
MO: mėn
|
MO: mėn.
|
||||||
YR: m
|
YR: m.
|
||||||
|
DEC: dešimtmetis
|
||||||
|
SECOND_PLURAL: sekundės
|
||||||
MINUTE_PLURAL: minutės
|
MINUTE_PLURAL: minutės
|
||||||
HOUR_PLURAL: valandos
|
HOUR_PLURAL: valandos
|
||||||
DAY_PLURAL: dienos
|
DAY_PLURAL: dienos
|
||||||
@@ -38,32 +44,35 @@ NICETIME:
|
|||||||
MONTH_PLURAL: mėnesiai
|
MONTH_PLURAL: mėnesiai
|
||||||
YEAR_PLURAL: metai
|
YEAR_PLURAL: metai
|
||||||
DECADE_PLURAL: dešimtmečiai
|
DECADE_PLURAL: dešimtmečiai
|
||||||
SEC_PLURAL: sek
|
SEC_PLURAL: sek.
|
||||||
MIN_PLURAL: min
|
MIN_PLURAL: min.
|
||||||
HR_PLURAL: val
|
HR_PLURAL: val.
|
||||||
WK_PLURAL: sav
|
WK_PLURAL: sav.
|
||||||
MO_PLURAL: mėn
|
MO_PLURAL: mėn.
|
||||||
YR_PLURAL: m
|
YR_PLURAL: m.
|
||||||
|
DEC_PLURAL: dešimtmečiai
|
||||||
FORM:
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Patvirtinimas nepavyko:</b>
|
||||||
|
INVALID_INPUT: Neteisingai įvesta į
|
||||||
MISSING_REQUIRED_FIELD: 'Būtina užpildyti laukelį:'
|
MISSING_REQUIRED_FIELD: 'Būtina užpildyti laukelį:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Sausis
|
- 'Sausis'
|
||||||
- Vasaris
|
- 'Vasaris'
|
||||||
- Kovas
|
- 'Kovas'
|
||||||
- Balandis
|
- 'Balandis'
|
||||||
- Gegužė
|
- 'Gegužė'
|
||||||
- Birželis
|
- 'Birželis'
|
||||||
- Liepa
|
- 'Liepa'
|
||||||
- Rugpjūtis
|
- 'Rugpjūtis'
|
||||||
- Rugsėjis
|
- 'Rugsėjis'
|
||||||
- Spalis
|
- 'Spalis'
|
||||||
- Lakpritis
|
- 'Lakpritis'
|
||||||
- Gruodis
|
- 'Gruodis'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Pirmadienis
|
- 'Pirmadienis'
|
||||||
- Antradienis
|
- 'Antradienis'
|
||||||
- Trečiadienis
|
- 'Trečiadienis'
|
||||||
- Ketvirtadienis
|
- 'Ketvirtadienis'
|
||||||
- Penktadienis
|
- 'Penktadienis'
|
||||||
- Šeštadienis
|
- 'Šeštadienis'
|
||||||
- Sekmadienis
|
- 'Sekmadienis'
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
MONTHS_OF_THE_YEAR: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember']
|
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']
|
DAYS_OF_THE_WEEK: ['mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag', 'søndag']
|
||||||
|
|||||||
@@ -1,15 +1,75 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitel: %1$s\n---\n\n# Fout: ongeldige frontmatter\n\nPad: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
INFLECTOR_PLURALS:
|
||||||
|
'/(quiz)$/i': '\1zes'
|
||||||
|
'/^(ox)$/i': '\1en'
|
||||||
|
'/([m|l])ouse$/i': '\1ice'
|
||||||
|
'/(matr|vert|ind)ix|ex$/i': '\1ices'
|
||||||
|
'/(x|ch|ss|sh)$/i': '\1es'
|
||||||
|
'/([^aeiouy]|qu)ies$/i': '\1y'
|
||||||
|
'/([^aeiouy]|qu)y$/i': '\1ies'
|
||||||
|
'/(hive)$/i': '\1s'
|
||||||
|
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
|
||||||
|
'/sis$/i': 'ses'
|
||||||
|
'/([ti])um$/i': '\1a'
|
||||||
|
'/(buffal|tomat)o$/i': '\1oes'
|
||||||
|
'/(bu)s$/i': '\1ses'
|
||||||
|
'/(alias|status)/i': '\1es'
|
||||||
|
'/(octop|vir)us$/i': '\1i'
|
||||||
|
'/(ax|test)is$/i': '\1es'
|
||||||
|
'/s$/i': 's'
|
||||||
|
'/$/': 's'
|
||||||
|
INFLECTOR_SINGULAR:
|
||||||
|
'/(quiz)zes$/i': '\1'
|
||||||
|
'/(matr)ices$/i': '\1ix'
|
||||||
|
'/(vert|ind)ices$/i': '\1ex'
|
||||||
|
'/^(ox)en/i': '\1'
|
||||||
|
'/(alias|status)es$/i': '\1'
|
||||||
|
'/([octop|vir])i$/i': '\1us'
|
||||||
|
'/(cris|ax|test)es$/i': '\1is'
|
||||||
|
'/(shoe)s$/i': '\1'
|
||||||
|
'/(o)es$/i': '\1'
|
||||||
|
'/(bus)es$/i': '\1'
|
||||||
|
'/([m|l])ice$/i': '\1ouse'
|
||||||
|
'/(x|ch|ss|sh)es$/i': '\1'
|
||||||
|
'/(m)ovies$/i': '\1ovie'
|
||||||
|
'/(s)eries$/i': '\1eries'
|
||||||
|
'/([^aeiouy]|qu)ies$/i': '\1y'
|
||||||
|
'/([lr])ves$/i': '\1f'
|
||||||
|
'/(tive)s$/i': '\1'
|
||||||
|
'/(hive)s$/i': '\1'
|
||||||
|
'/([^f])ves$/i': '\1fe'
|
||||||
|
'/(^analy)ses$/i': '\1sis'
|
||||||
|
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
|
||||||
|
'/([ti])a$/i': '\1um'
|
||||||
|
'/(n)ews$/i': '\1ews'
|
||||||
|
INFLECTOR_UNCOUNTABLE:
|
||||||
|
- 'uitrusting'
|
||||||
|
- 'informatie'
|
||||||
|
- 'rijst'
|
||||||
|
- 'geld'
|
||||||
|
- 'soorten'
|
||||||
|
- 'reeks'
|
||||||
|
- 'vis'
|
||||||
|
- 'schaap'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: personen
|
'person': 'personen'
|
||||||
man: mensen
|
'man': 'mensen'
|
||||||
child: kinderen
|
'child': 'kinderen'
|
||||||
sex: geslacht
|
'sex': 'geslacht'
|
||||||
move: verplaatsen
|
'move': 'verplaatsen'
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
'default': 'th'
|
||||||
|
'first': 'st'
|
||||||
|
'second': 'nd'
|
||||||
|
'third': 'rd'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: geen datum opgegeven
|
NO_DATE_PROVIDED: geen datum opgegeven
|
||||||
BAD_DATE: Datumformaat onjuist
|
BAD_DATE: Datumformaat onjuist
|
||||||
AGO: geleden
|
AGO: geleden
|
||||||
FROM_NOW: vanaf nu
|
FROM_NOW: vanaf nu
|
||||||
|
JUST_NOW: zojuist
|
||||||
SECOND: seconde
|
SECOND: seconde
|
||||||
MINUTE: minuut
|
MINUTE: minuut
|
||||||
HOUR: uur
|
HOUR: uur
|
||||||
@@ -17,12 +77,14 @@ NICETIME:
|
|||||||
WEEK: week
|
WEEK: week
|
||||||
MONTH: maand
|
MONTH: maand
|
||||||
YEAR: jaar
|
YEAR: jaar
|
||||||
DECADE: decenium
|
DECADE: decennium
|
||||||
SEC: s
|
SEC: s
|
||||||
MIN: min
|
MIN: min
|
||||||
HR: u
|
HR: u
|
||||||
|
WK: week
|
||||||
MO: ma
|
MO: ma
|
||||||
YR: j
|
YR: j
|
||||||
|
DEC: decennia
|
||||||
SECOND_PLURAL: seconden
|
SECOND_PLURAL: seconden
|
||||||
MINUTE_PLURAL: minuten
|
MINUTE_PLURAL: minuten
|
||||||
HOUR_PLURAL: uren
|
HOUR_PLURAL: uren
|
||||||
@@ -37,28 +99,46 @@ NICETIME:
|
|||||||
WK_PLURAL: weken
|
WK_PLURAL: weken
|
||||||
MO_PLURAL: maanden
|
MO_PLURAL: maanden
|
||||||
YR_PLURAL: jaren
|
YR_PLURAL: jaren
|
||||||
|
DEC_PLURAL: decennia
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validatie mislukt:</b>'
|
VALIDATION_FAIL: <b>Validatie mislukt:</b>
|
||||||
INVALID_INPUT: Ongeldige invoer in
|
INVALID_INPUT: Ongeldige invoer in
|
||||||
MISSING_REQUIRED_FIELD: 'Verplicht veld ontbreekt:'
|
MISSING_REQUIRED_FIELD: 'Ontbrekend verplicht veld:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Januari
|
- 'Januari'
|
||||||
- Februari
|
- 'Februari'
|
||||||
- Maart
|
- 'Maart'
|
||||||
- april
|
- 'April'
|
||||||
- Mei
|
- 'Mei'
|
||||||
- Juni
|
- 'Juni'
|
||||||
- Juli
|
- 'Juli'
|
||||||
- Augustus
|
- 'Augustus'
|
||||||
- september
|
- 'September'
|
||||||
- Oktober
|
- 'Oktober'
|
||||||
- november
|
- 'November'
|
||||||
- december
|
- 'December'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Maandag
|
- 'Maandag'
|
||||||
- Dinsdag
|
- 'Dinsdag'
|
||||||
- Woensdag
|
- 'Woensdag'
|
||||||
- Donderdag
|
- 'Donderdag'
|
||||||
- Vrijdag
|
- 'Vrijdag'
|
||||||
- Zaterdag
|
- 'Zaterdag'
|
||||||
- Zondag
|
- 'Zondag'
|
||||||
|
CRON:
|
||||||
|
EVERY: elke
|
||||||
|
EVERY_HOUR: elk uur
|
||||||
|
EVERY_MINUTE: elke minuut
|
||||||
|
EVERY_DAY_OF_WEEK: elke dag van de week
|
||||||
|
EVERY_DAY_OF_MONTH: elke dag van de maand
|
||||||
|
EVERY_MONTH: elke maand
|
||||||
|
TEXT_PERIOD: Elke <b />
|
||||||
|
TEXT_MINS: ' <b /> minuten te laat'
|
||||||
|
TEXT_TIME: ' op <b />:<b />'
|
||||||
|
TEXT_DOW: ' op <b />'
|
||||||
|
TEXT_MONTH: ' van <b />'
|
||||||
|
TEXT_DOM: ' op <b />'
|
||||||
|
ERROR1: De tag %s wordt niet ondersteund!
|
||||||
|
ERROR2: Slecht aantal elementen
|
||||||
|
ERROR3: Het jquery_element moet ingesteld worden in de jqCron instellingen
|
||||||
|
ERROR4: Onbekende expressie
|
||||||
|
|||||||
@@ -1,39 +1,24 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\nTittel: %1$s\n---\n\n# Feilmelding: Ugyldig Frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
Tittel: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Feilmelding: Ugyldig Frontmatter
|
|
||||||
|
|
||||||
Pane: '%2$s'
|
|
||||||
|
|
||||||
**%3$s **
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
INFLECTOR_PLURALS:
|
|
||||||
/(quiz)$/i: '\1zes'
|
|
||||||
/^(ox)$/i: '\1en'
|
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
- utstyr
|
- 'utstyr'
|
||||||
- informasjon
|
- 'informasjon'
|
||||||
- ris
|
- 'ris'
|
||||||
- penger
|
- 'penger'
|
||||||
- arter
|
- 'arter'
|
||||||
- serier
|
- 'serier'
|
||||||
- fisk
|
- 'fisk'
|
||||||
- sau
|
- 'sau'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: folk
|
'person': 'folk'
|
||||||
man: menn
|
'man': 'menn'
|
||||||
child: barn
|
'child': 'barn'
|
||||||
sex: kjønn
|
'sex': 'kjønn'
|
||||||
move: trekk
|
'move': 'trekk'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Ingen dato gitt
|
NO_DATE_PROVIDED: Ingen dato gitt
|
||||||
BAD_DATE: Dårlig dato
|
BAD_DATE: Ugyldig dato
|
||||||
AGO: siden
|
AGO: siden
|
||||||
FROM_NOW: fra nå
|
FROM_NOW: fra nå
|
||||||
SECOND: sekund
|
SECOND: sekund
|
||||||
@@ -45,12 +30,11 @@ NICETIME:
|
|||||||
YEAR: år
|
YEAR: år
|
||||||
DECADE: tiår
|
DECADE: tiår
|
||||||
SEC: sek
|
SEC: sek
|
||||||
MIN: min
|
|
||||||
HR: t
|
HR: t
|
||||||
WK: uke
|
WK: uke
|
||||||
MO: må
|
MO: må
|
||||||
YR: år
|
YR: år
|
||||||
DEC: des
|
DEC: tiår
|
||||||
SECOND_PLURAL: sekunder
|
SECOND_PLURAL: sekunder
|
||||||
MINUTE_PLURAL: minutter
|
MINUTE_PLURAL: minutter
|
||||||
HOUR_PLURAL: timer
|
HOUR_PLURAL: timer
|
||||||
@@ -63,31 +47,31 @@ NICETIME:
|
|||||||
MIN_PLURAL: min
|
MIN_PLURAL: min
|
||||||
HR_PLURAL: timer
|
HR_PLURAL: timer
|
||||||
WK_PLURAL: uker
|
WK_PLURAL: uker
|
||||||
MO_PLURAL: mdr
|
MO_PLURAL: md
|
||||||
YR_PLURAL: år
|
YR_PLURAL: år
|
||||||
DEC_PLURAL: årtier
|
DEC_PLURAL: årtier
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validering mislyktes:</b>'
|
VALIDATION_FAIL: <b>Godkjenning mislyktes:</b>
|
||||||
INVALID_INPUT: Ugyldig innhold i
|
INVALID_INPUT: Ugyldig innhold i
|
||||||
MISSING_REQUIRED_FIELD: 'Mangler påkrevd felt:'
|
MISSING_REQUIRED_FIELD: 'Mangler påkrevd felt:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- januar
|
- 'januar'
|
||||||
- februar
|
- 'februar'
|
||||||
- mars
|
- 'mars'
|
||||||
- april
|
- 'april'
|
||||||
- mai
|
- 'mai'
|
||||||
- juni
|
- 'juni'
|
||||||
- juli
|
- 'juli'
|
||||||
- august
|
- 'august'
|
||||||
- september
|
- 'september'
|
||||||
- oktober
|
- 'oktober'
|
||||||
- november
|
- 'november'
|
||||||
- desember
|
- 'desember'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- mandag
|
- 'mandag'
|
||||||
- tirsdag
|
- 'tirsdag'
|
||||||
- onsdag
|
- 'onsdag'
|
||||||
- torsdag
|
- 'torsdag'
|
||||||
- fredag
|
- 'fredag'
|
||||||
- lørdag
|
- 'lørdag'
|
||||||
- søndag
|
- 'søndag'
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Nieprawidłowy Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Error: Nieprawidłowy Frontmatter
|
|
||||||
|
|
||||||
Path: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Nie podano daty
|
NO_DATE_PROVIDED: Nie podano daty
|
||||||
BAD_DATE: Zła data
|
BAD_DATE: Zła data
|
||||||
@@ -27,7 +15,6 @@ NICETIME:
|
|||||||
YEAR: rok
|
YEAR: rok
|
||||||
DECADE: dekada
|
DECADE: dekada
|
||||||
SEC: sek
|
SEC: sek
|
||||||
MIN: min
|
|
||||||
HR: godz
|
HR: godz
|
||||||
WK: tydz
|
WK: tydz
|
||||||
MO: m-c
|
MO: m-c
|
||||||
@@ -49,27 +36,27 @@ NICETIME:
|
|||||||
YR_PLURAL: lat
|
YR_PLURAL: lat
|
||||||
DEC_PLURAL: dekad
|
DEC_PLURAL: dekad
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Weryfikacja nie powiodła się:</b>'
|
VALIDATION_FAIL: <b>Weryfikacja nie powiodła się:</b>
|
||||||
INVALID_INPUT: Nieprawidłowe dane wejściowe
|
INVALID_INPUT: Nieprawidłowe dane wejściowe
|
||||||
MISSING_REQUIRED_FIELD: 'Opuszczono wymagane pole:'
|
MISSING_REQUIRED_FIELD: 'Opuszczono wymagane pole:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Styczeń
|
- 'Styczeń'
|
||||||
- Luty
|
- 'Luty'
|
||||||
- Marzec
|
- 'Marzec'
|
||||||
- Kwiecień
|
- 'Kwiecień'
|
||||||
- Maj
|
- 'Maj'
|
||||||
- Czerwiec
|
- 'Czerwiec'
|
||||||
- Lipiec
|
- 'Lipiec'
|
||||||
- Sierpień
|
- 'Sierpień'
|
||||||
- Wrzesień
|
- 'Wrzesień'
|
||||||
- Październik
|
- 'Październik'
|
||||||
- Listopad
|
- 'Listopad'
|
||||||
- Grudzień
|
- 'Grudzień'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Poniedziałek
|
- 'Poniedziałek'
|
||||||
- Wtorek
|
- 'Wtorek'
|
||||||
- Środa
|
- 'Środa'
|
||||||
- Czwartek
|
- 'Czwartek'
|
||||||
- Piątek
|
- 'Piątek'
|
||||||
- Sobota
|
- 'Sobota'
|
||||||
- Niedziela
|
- 'Niedziela'
|
||||||
|
|||||||
@@ -1,30 +1,8 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
|
||||||
título: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Erro: Frontmatter inválida
|
|
||||||
|
|
||||||
Caminho: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
INFLECTOR_UNCOUNTABLE:
|
|
||||||
1: informação
|
|
||||||
2: arroz
|
|
||||||
3: dinheiro
|
|
||||||
INFLECTOR_IRREGULAR:
|
|
||||||
man: homens
|
|
||||||
sex: sexos
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Não foi fornecida data
|
NO_DATE_PROVIDED: Nenhuma data fornecida
|
||||||
BAD_DATE: Data inválida
|
|
||||||
AGO: atrás
|
AGO: atrás
|
||||||
FROM_NOW: a partir de agora
|
|
||||||
SECOND: segundo
|
SECOND: segundo
|
||||||
MINUTE: minuto
|
MINUTE: minuto
|
||||||
HOUR: hora
|
HOUR: hora
|
||||||
@@ -33,47 +11,27 @@ NICETIME:
|
|||||||
MONTH: mês
|
MONTH: mês
|
||||||
YEAR: ano
|
YEAR: ano
|
||||||
DECADE: década
|
DECADE: década
|
||||||
SEC: seg
|
SEC: segundos
|
||||||
MIN: mín
|
MIN: minutos
|
||||||
HR: h
|
|
||||||
WK: sem
|
|
||||||
MO: m
|
|
||||||
YR: a
|
|
||||||
DEC: dec
|
|
||||||
SECOND_PLURAL: segundos
|
|
||||||
MINUTE_PLURAL: minutos
|
MINUTE_PLURAL: minutos
|
||||||
HOUR_PLURAL: horas
|
|
||||||
DAY_PLURAL: dias
|
DAY_PLURAL: dias
|
||||||
WEEK_PLURAL: semanas
|
WEEK_PLURAL: semanas
|
||||||
MONTH_PLURAL: meses
|
MONTH_PLURAL: meses
|
||||||
YEAR_PLURAL: anos
|
YEAR_PLURAL: anos
|
||||||
DECADE_PLURAL: décadas
|
DECADE_PLURAL: decadas
|
||||||
SEC_PLURAL: seg
|
|
||||||
MIN_PLURAL: mins
|
|
||||||
HR_PLURAL: hrs
|
|
||||||
WK_PLURAL: sems
|
|
||||||
YR_PLURAL: anos
|
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validação falhada: </b>'
|
VALIDATION_FAIL: <b>Falha na validação!</b>
|
||||||
MISSING_REQUIRED_FIELD: 'Campo obrigatório ausente:'
|
MISSING_REQUIRED_FIELD: 'Campo obrigatório requerido:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Janeiro
|
- 'Janeiro'
|
||||||
- Fevereiro
|
- 'Fevereiro'
|
||||||
- Março
|
- 'Março'
|
||||||
- Abril
|
- 'Abril'
|
||||||
- Maio
|
- 'Maio'
|
||||||
- Junho
|
- 'Junho'
|
||||||
- Julho
|
- 'Julho'
|
||||||
- Agosto
|
- 'Agosto'
|
||||||
- Setembro
|
- 'Setembro'
|
||||||
- Outubro
|
- 'Outubro'
|
||||||
- Novembro
|
- 'Novembro'
|
||||||
- Dezembro
|
- 'Dezembro'
|
||||||
DAYS_OF_THE_WEEK:
|
|
||||||
- Segunda
|
|
||||||
- Terça
|
|
||||||
- Quarta
|
|
||||||
- Quinta
|
|
||||||
- Sexta
|
|
||||||
- Sábado
|
|
||||||
- Domingo
|
|
||||||
|
|||||||
@@ -1,49 +1,27 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\nTitlu: %1$s\n---\n# Eroare: Frontmatter este invalid\n\nCalea: `%2$s`\n\n**%3$s**\n\n```\n%4$s"
|
||||||
Titlu: %1$s
|
|
||||||
---
|
|
||||||
# Eroare: Frontmatter este invalid
|
|
||||||
|
|
||||||
Calea: `%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'
|
|
||||||
INFLECTOR_UNCOUNTABLE:
|
INFLECTOR_UNCOUNTABLE:
|
||||||
- echipament
|
- 'echipament'
|
||||||
- informaţie
|
- 'informaţie'
|
||||||
- orez
|
- 'orez'
|
||||||
- bani
|
- 'bani'
|
||||||
- specii
|
- 'specii'
|
||||||
- serii
|
- 'serii'
|
||||||
- peşte
|
- 'peşte'
|
||||||
- oaie
|
- 'oaie'
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: persoane
|
'person': 'persoane'
|
||||||
man: bărbați
|
'man': 'bărbați'
|
||||||
child: copii
|
'child': 'copii'
|
||||||
sex: sexe
|
'sex': 'sexe'
|
||||||
move: mutări
|
'move': 'mutări'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Nu există o dată prevăzută
|
NO_DATE_PROVIDED: Nu există o dată prevăzută
|
||||||
BAD_DATE: Dată incorectă
|
BAD_DATE: Dată incorectă
|
||||||
AGO: în urmă
|
AGO: în urmă
|
||||||
FROM_NOW: de acum
|
FROM_NOW: de acum
|
||||||
|
JUST_NOW: chiar acum
|
||||||
SECOND: secundă
|
SECOND: secundă
|
||||||
MINUTE: minut
|
MINUTE: minut
|
||||||
HOUR: oră
|
HOUR: oră
|
||||||
@@ -52,8 +30,8 @@ NICETIME:
|
|||||||
MONTH: lună
|
MONTH: lună
|
||||||
YEAR: an
|
YEAR: an
|
||||||
DECADE: decadă
|
DECADE: decadă
|
||||||
SEC: sec
|
SEC: secunde
|
||||||
MIN: min
|
MIN: minute
|
||||||
HR: oră
|
HR: oră
|
||||||
WK: săpt
|
WK: săpt
|
||||||
MO: lună
|
MO: lună
|
||||||
@@ -75,27 +53,44 @@ NICETIME:
|
|||||||
YR_PLURAL: ani
|
YR_PLURAL: ani
|
||||||
DEC_PLURAL: decenii
|
DEC_PLURAL: decenii
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Validare nereușită</b>'
|
VALIDATION_FAIL: <b>Validare nereușită</b>
|
||||||
INVALID_INPUT: Date incorecte în
|
INVALID_INPUT: Date incorecte în
|
||||||
MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:'
|
MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Ianuarie
|
- 'Ianuarie'
|
||||||
- Februarie
|
- 'Februarie'
|
||||||
- Martie
|
- 'Martie'
|
||||||
- Aprilie
|
- 'Aprilie'
|
||||||
- Mai
|
- 'Mai'
|
||||||
- Iunie
|
- 'Iunie'
|
||||||
- Iulie
|
- 'Iulie'
|
||||||
- August
|
- 'August'
|
||||||
- Septembrie
|
- 'Septembrie'
|
||||||
- Octombrie
|
- 'Octombrie'
|
||||||
- Noiembrie
|
- 'Noiembrie'
|
||||||
- Decembrie
|
- 'Decembrie'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Luni
|
- 'Luni'
|
||||||
- Marți
|
- 'Marți'
|
||||||
- Miercuri
|
- 'Miercuri'
|
||||||
- Joi
|
- 'Joi'
|
||||||
- Vineri
|
- 'Vineri'
|
||||||
- Sâmbătă
|
- 'Sâmbătă'
|
||||||
- Duminică
|
- 'Duminică'
|
||||||
|
CRON:
|
||||||
|
EVERY: la fiecare
|
||||||
|
EVERY_HOUR: la fiecare oră
|
||||||
|
EVERY_MINUTE: la fiecare minut
|
||||||
|
EVERY_DAY_OF_WEEK: fiecare zi a săptămânii
|
||||||
|
EVERY_DAY_OF_MONTH: fiecare zi a lunii
|
||||||
|
EVERY_MONTH: fiecare lună
|
||||||
|
TEXT_PERIOD: Fiecare <b />
|
||||||
|
TEXT_MINS: ' la <b /> minut(e) ale fiecărei ore'
|
||||||
|
TEXT_TIME: ' la <b />:<b />'
|
||||||
|
TEXT_DOW: ' pe <b />'
|
||||||
|
TEXT_MONTH: 'al(e) <b />'
|
||||||
|
TEXT_DOM: ' pe <b />'
|
||||||
|
ERROR1: Eticheta %s nu este acceptată!
|
||||||
|
ERROR2: Număr nevalid de elemente
|
||||||
|
ERROR3: jquery_element ar trebui setat în opțiunile jqCron
|
||||||
|
ERROR4: Expresie necunoscută
|
||||||
|
|||||||
@@ -1,81 +1,101 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Ошибка: недопустимое содержимое Frontmatter\n\nПуть: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
INFLECTOR_UNCOUNTABLE:
|
||||||
---
|
- 'экипировка'
|
||||||
|
- 'информация'
|
||||||
# Ошибка: Недопустимое содержимое
|
- 'рис'
|
||||||
|
- 'деньги'
|
||||||
Path: `%2$s`
|
- 'виды'
|
||||||
|
- 'серии'
|
||||||
**%3$s**
|
- 'рыба'
|
||||||
|
- 'овца'
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
INFLECTOR_IRREGULAR:
|
INFLECTOR_IRREGULAR:
|
||||||
person: люди
|
'person': 'люди'
|
||||||
man: человек
|
'man': 'человек'
|
||||||
child: ребенок
|
'child': 'ребенок'
|
||||||
sex: пол
|
'sex': 'пол'
|
||||||
move: движется
|
'move': 'движется'
|
||||||
|
INFLECTOR_ORDINALS:
|
||||||
|
'default': 'й'
|
||||||
|
'first': 'й'
|
||||||
|
'second': 'й'
|
||||||
|
'third': 'й'
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Дата не указана
|
NO_DATE_PROVIDED: Дата не указана
|
||||||
BAD_DATE: Неверная дата
|
BAD_DATE: Неверная дата
|
||||||
AGO: назад
|
AGO: назад
|
||||||
FROM_NOW: теперь
|
FROM_NOW: теперь
|
||||||
|
JUST_NOW: только что
|
||||||
SECOND: секунда
|
SECOND: секунда
|
||||||
MINUTE: минута
|
MINUTE: минута
|
||||||
HOUR: час
|
HOUR: час
|
||||||
DAY: д
|
DAY: день
|
||||||
WEEK: неделя
|
WEEK: неделя
|
||||||
MONTH: месяц
|
MONTH: месяц
|
||||||
YEAR: год
|
YEAR: год
|
||||||
DECADE: десятилетие
|
DECADE: десятилетие
|
||||||
SEC: с
|
SEC: сек
|
||||||
MIN: мин
|
MIN: мин
|
||||||
HR: ч
|
HR: ч
|
||||||
WK: нед.
|
WK: нед
|
||||||
MO: мес.
|
MO: мес
|
||||||
YR: г.
|
YR: г
|
||||||
DEC: гг.
|
DEC: дстлт
|
||||||
SECOND_PLURAL: секунды
|
SECOND_PLURAL: сек
|
||||||
MINUTE_PLURAL: минуты
|
MINUTE_PLURAL: мин
|
||||||
HOUR_PLURAL: часы
|
HOUR_PLURAL: ч
|
||||||
DAY_PLURAL: д
|
DAY_PLURAL: д
|
||||||
WEEK_PLURAL: недели
|
WEEK_PLURAL: нед
|
||||||
MONTH_PLURAL: месяцы
|
MONTH_PLURAL: мес
|
||||||
YEAR_PLURAL: годы
|
YEAR_PLURAL: г
|
||||||
DECADE_PLURAL: десятилетия
|
DECADE_PLURAL: дстлт
|
||||||
SEC_PLURAL: с
|
SEC_PLURAL: сек
|
||||||
MIN_PLURAL: мин
|
MIN_PLURAL: мин
|
||||||
HR_PLURAL: ч
|
HR_PLURAL: ч
|
||||||
WK_PLURAL: нед
|
WK_PLURAL: нед
|
||||||
MO_PLURAL: мес
|
MO_PLURAL: мес
|
||||||
YR_PLURAL: г.
|
YR_PLURAL: г
|
||||||
DEC_PLURAL: гг.
|
DEC_PLURAL: дстлт
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Проверка не удалась:</b>'
|
VALIDATION_FAIL: <b>Проверка не удалась:</b>
|
||||||
INVALID_INPUT: Неверный ввод в
|
INVALID_INPUT: Неверный ввод в
|
||||||
MISSING_REQUIRED_FIELD: 'Отсутствует необходимое поле:'
|
MISSING_REQUIRED_FIELD: 'Отсутствует необходимое поле:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Январь
|
- 'январь'
|
||||||
- Февраль
|
- 'февраль'
|
||||||
- Март
|
- 'март'
|
||||||
- Апрель
|
- 'апрель'
|
||||||
- Май
|
- 'май'
|
||||||
- Июнь
|
- 'июнь'
|
||||||
- Июль
|
- 'Июль'
|
||||||
- Август
|
- 'Август'
|
||||||
- Сентябрь
|
- 'Сентябрь'
|
||||||
- Октябрь
|
- 'Октябрь'
|
||||||
- Ноябрь
|
- 'Ноябрь'
|
||||||
- Декабрь
|
- 'Декабрь'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Понедельник
|
- 'понедельник'
|
||||||
- Вторник
|
- 'вторник'
|
||||||
- Среда
|
- 'среда'
|
||||||
- Четверг
|
- 'четверг'
|
||||||
- Пятница
|
- 'пятница'
|
||||||
- Суббота
|
- 'суббота'
|
||||||
- Воскресенье
|
- 'воскресенье'
|
||||||
|
CRON:
|
||||||
|
EVERY: раз в
|
||||||
|
EVERY_HOUR: раз в час
|
||||||
|
EVERY_MINUTE: раз в минуту
|
||||||
|
EVERY_DAY_OF_WEEK: каждый день недели
|
||||||
|
EVERY_DAY_OF_MONTH: каждый день недели
|
||||||
|
EVERY_MONTH: раз в месяц
|
||||||
|
TEXT_PERIOD: Каждый <b />
|
||||||
|
TEXT_MINS: ' в <b /> минуте(ах) за час'
|
||||||
|
TEXT_TIME: ' в <b />:<b />'
|
||||||
|
TEXT_DOW: ' на <b />'
|
||||||
|
TEXT_MONTH: ' из <b />'
|
||||||
|
TEXT_DOM: ' на <b />'
|
||||||
|
ERROR1: Тег %s не поддерживается!
|
||||||
|
ERROR2: Неверное количество элементов
|
||||||
|
ERROR3: jquery_element должен быть установлен в настройки jqCron
|
||||||
|
ERROR4: Выражение не распознано
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Neposkytnutý žiaden dátum
|
NO_DATE_PROVIDED: Neposkytnutý žiaden dátum
|
||||||
BAD_DATE: Nesprávny dátum
|
BAD_DATE: Nesprávny dátum
|
||||||
@@ -13,30 +14,47 @@ NICETIME:
|
|||||||
YEAR: rok
|
YEAR: rok
|
||||||
DECADE: desaťročie
|
DECADE: desaťročie
|
||||||
SEC: sek
|
SEC: sek
|
||||||
MIN: min
|
|
||||||
HR: hod
|
HR: hod
|
||||||
|
WK: t
|
||||||
|
MO: m
|
||||||
|
YR: r
|
||||||
|
SECOND_PLURAL: sekúnd
|
||||||
|
MINUTE_PLURAL: minút
|
||||||
|
HOUR_PLURAL: hodín
|
||||||
|
DAY_PLURAL: dní
|
||||||
|
WEEK_PLURAL: týždňov
|
||||||
|
MONTH_PLURAL: mesiacov
|
||||||
|
YEAR_PLURAL: rokov
|
||||||
|
DECADE_PLURAL: dekád
|
||||||
|
SEC_PLURAL: sek
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: hod
|
||||||
|
WK_PLURAL: t
|
||||||
|
MO_PLURAL: mes.
|
||||||
|
YR_PLURAL: rokov
|
||||||
|
DEC_PLURAL: dekád
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Overenie zlyhalo:</b>'
|
VALIDATION_FAIL: <b>Overenie zlyhalo:</b>
|
||||||
INVALID_INPUT: Neplatný vstup v
|
INVALID_INPUT: Neplatný vstup v
|
||||||
MISSING_REQUIRED_FIELD: 'Chýba vyžadované pole:'
|
MISSING_REQUIRED_FIELD: 'Chýba vyžadované pole:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Január
|
- 'Január'
|
||||||
- Február
|
- 'Február'
|
||||||
- Marec
|
- 'Marec'
|
||||||
- Apríl
|
- 'Apríl'
|
||||||
- Máj
|
- 'Máj'
|
||||||
- Jún
|
- 'Jún'
|
||||||
- Júl
|
- 'Júl'
|
||||||
- August
|
- 'August'
|
||||||
- September
|
- 'September'
|
||||||
- Október
|
- 'Október'
|
||||||
- November
|
- 'November'
|
||||||
- December
|
- 'December'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Pondelok
|
- 'Pondelok'
|
||||||
- Utorok
|
- 'Utorok'
|
||||||
- Streda
|
- 'Streda'
|
||||||
- Štvrtok
|
- 'Štvrtok'
|
||||||
- Piatok
|
- 'Piatok'
|
||||||
- Sobota
|
- 'Sobota'
|
||||||
- Nedeľa
|
- 'Nedeľa'
|
||||||
|
|||||||
62
system/languages/sl.yaml
Normal file
62
system/languages/sl.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Napaka: Neveljavna Frontmatter\n\nPath: `%2$s`\n\n**%3$s ** \n\n```\n%4$s \n```"
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: Datum ni na voljo
|
||||||
|
BAD_DATE: Neveljaven datum
|
||||||
|
AGO: pred
|
||||||
|
FROM_NOW: od zdaj
|
||||||
|
SECOND: sekunda
|
||||||
|
MINUTE: minuta
|
||||||
|
HOUR: ura
|
||||||
|
DAY: dan
|
||||||
|
WEEK: teden
|
||||||
|
MONTH: mesec
|
||||||
|
YEAR: leto
|
||||||
|
DECADE: desetletje
|
||||||
|
SEC: sek
|
||||||
|
HR: ur
|
||||||
|
WK: T.
|
||||||
|
MO: m
|
||||||
|
YR: l
|
||||||
|
DEC: des
|
||||||
|
SECOND_PLURAL: sekund
|
||||||
|
MINUTE_PLURAL: minut
|
||||||
|
HOUR_PLURAL: ure
|
||||||
|
DAY_PLURAL: dnevi
|
||||||
|
WEEK_PLURAL: tednov
|
||||||
|
MONTH_PLURAL: mesecev
|
||||||
|
YEAR_PLURAL: leta
|
||||||
|
DECADE_PLURAL: desetletja
|
||||||
|
SEC_PLURAL: s
|
||||||
|
MIN_PLURAL: min
|
||||||
|
HR_PLURAL: ur
|
||||||
|
WK_PLURAL: t
|
||||||
|
MO_PLURAL: m
|
||||||
|
YR_PLURAL: l
|
||||||
|
DEC_PLURAL: des
|
||||||
|
FORM:
|
||||||
|
VALIDATION_FAIL: <b>Preverjanje veljavnosti ni uspelo:</b>
|
||||||
|
INVALID_INPUT: Neveljaven vnos v
|
||||||
|
MISSING_REQUIRED_FIELD: 'Manjka obvezno polje:'
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- 'Januar'
|
||||||
|
- 'Februar'
|
||||||
|
- 'Marec'
|
||||||
|
- 'April'
|
||||||
|
- 'Maj'
|
||||||
|
- 'Junij'
|
||||||
|
- 'Julij'
|
||||||
|
- 'Avgust'
|
||||||
|
- 'September'
|
||||||
|
- 'Oktober'
|
||||||
|
- 'November'
|
||||||
|
- 'December'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- 'Ponedeljek'
|
||||||
|
- 'Torek'
|
||||||
|
- 'Sreda'
|
||||||
|
- 'Četrtek'
|
||||||
|
- 'Petek'
|
||||||
|
- 'Sobota'
|
||||||
|
- 'Nedelja'
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: '--- titel: %1$s --- # Fel: Ogiltig Frontmatter-sökväg: `%2$s` **%3$s** ``` %4$s ```'
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "--- titel: %1$s --- # Fel: Ogiltig Frontmatter-sökväg: `%2$s` **%3$s** ``` %4$s ```"
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Inget datum har angivits
|
NO_DATE_PROVIDED: Inget datum har angivits
|
||||||
BAD_DATE: Ogiltigt datum
|
BAD_DATE: Ogiltigt datum
|
||||||
AGO: sedan
|
AGO: sedan
|
||||||
FROM_NOW: från nu
|
FROM_NOW: fr.o.m nu
|
||||||
SECOND: sekund
|
SECOND: sekund
|
||||||
MINUTE: minut
|
MINUTE: minut
|
||||||
HOUR: timme
|
HOUR: timme
|
||||||
@@ -14,12 +15,10 @@ NICETIME:
|
|||||||
YEAR: år
|
YEAR: år
|
||||||
DECADE: årtionde
|
DECADE: årtionde
|
||||||
SEC: sek
|
SEC: sek
|
||||||
MIN: min
|
|
||||||
HR: t
|
HR: t
|
||||||
WK: v
|
WK: v
|
||||||
MO: m
|
MO: m
|
||||||
YR: år
|
YR: år
|
||||||
DEC: dec
|
|
||||||
SECOND_PLURAL: sekunder
|
SECOND_PLURAL: sekunder
|
||||||
MINUTE_PLURAL: minuter
|
MINUTE_PLURAL: minuter
|
||||||
HOUR_PLURAL: timmar
|
HOUR_PLURAL: timmar
|
||||||
@@ -36,27 +35,27 @@ NICETIME:
|
|||||||
YR_PLURAL: år
|
YR_PLURAL: år
|
||||||
DEC_PLURAL: dec
|
DEC_PLURAL: dec
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Kontrollen misslyckades:</b>'
|
VALIDATION_FAIL: <b>Kontrollen misslyckades:</b>
|
||||||
INVALID_INPUT: Ogiltig indata i
|
INVALID_INPUT: Ogiltig indata i
|
||||||
MISSING_REQUIRED_FIELD: 'Obligatoriskt fält måste fyllas i:'
|
MISSING_REQUIRED_FIELD: 'Obligatoriskt fält måste fyllas i:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Januari
|
- 'Januari'
|
||||||
- Februrari
|
- 'Februari'
|
||||||
- Mars
|
- 'Mars'
|
||||||
- April
|
- 'April'
|
||||||
- Maj
|
- 'Maj'
|
||||||
- Juni
|
- 'Juni'
|
||||||
- Juli
|
- 'Juli'
|
||||||
- Augusti
|
- 'Augusti'
|
||||||
- September
|
- 'September'
|
||||||
- Oktober
|
- 'Oktober'
|
||||||
- November
|
- 'November'
|
||||||
- December
|
- 'December'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Måndag
|
- 'Måndag'
|
||||||
- Tisdag
|
- 'Tisdag'
|
||||||
- Onsdag
|
- 'Onsdag'
|
||||||
- Torsdag
|
- 'Torsdag'
|
||||||
- Fredag
|
- 'Fredag'
|
||||||
- Lördag
|
- 'Lördag'
|
||||||
- Söndag
|
- 'Söndag'
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\nชื่อเรื่อง: %1$s\n---\n\n# ข้อผิดพลาด: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
ชื่อเรื่อง: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# ข้อผิดพลาด: Invalid Frontmatter
|
|
||||||
|
|
||||||
Path: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: ไม่มีวันที่ให้
|
NO_DATE_PROVIDED: ไม่มีวันที่ให้
|
||||||
BAD_DATE: รูปแบบวันที่ผิด
|
BAD_DATE: รูปแบบวันที่ผิด
|
||||||
@@ -29,10 +17,6 @@ NICETIME:
|
|||||||
SEC: วิ
|
SEC: วิ
|
||||||
MIN: นาที
|
MIN: นาที
|
||||||
HR: ชม.
|
HR: ชม.
|
||||||
WK: wk
|
|
||||||
MO: mo
|
|
||||||
YR: yr
|
|
||||||
DEC: dec
|
|
||||||
SECOND_PLURAL: วินาที
|
SECOND_PLURAL: วินาที
|
||||||
MINUTE_PLURAL: นาที
|
MINUTE_PLURAL: นาที
|
||||||
HOUR_PLURAL: ชั่วโมง
|
HOUR_PLURAL: ชั่วโมง
|
||||||
@@ -44,32 +28,29 @@ NICETIME:
|
|||||||
SEC_PLURAL: วินาที
|
SEC_PLURAL: วินาที
|
||||||
MIN_PLURAL: นาที
|
MIN_PLURAL: นาที
|
||||||
HR_PLURAL: ชั่วโมง
|
HR_PLURAL: ชั่วโมง
|
||||||
WK_PLURAL: wks
|
|
||||||
MO_PLURAL: mos
|
|
||||||
YR_PLURAL: ปี
|
YR_PLURAL: ปี
|
||||||
DEC_PLURAL: decs
|
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>'
|
VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>'
|
||||||
INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน
|
INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน
|
||||||
MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:'
|
MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- มกราคม
|
- 'มกราคม'
|
||||||
- กุมภาพันธ์
|
- 'กุมภาพันธ์'
|
||||||
- มีนาคม
|
- 'มีนาคม'
|
||||||
- เมษายน
|
- 'เมษายน'
|
||||||
- พฤษภาคม
|
- 'พฤษภาคม'
|
||||||
- มิถุนายน
|
- 'มิถุนายน'
|
||||||
- กรกฏาคม
|
- 'กรกฏาคม'
|
||||||
- สิงหาคม
|
- 'สิงหาคม'
|
||||||
- กันยายน
|
- 'กันยายน'
|
||||||
- ตุลาคม
|
- 'ตุลาคม'
|
||||||
- พฤศจิกายน
|
- 'พฤศจิกายน'
|
||||||
- ธันวาคม
|
- 'ธันวาคม'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- จันทร์
|
- 'จันทร์'
|
||||||
- อังคาร
|
- 'อังคาร'
|
||||||
- พุธ
|
- 'พุธ'
|
||||||
- พฤหัสบดี
|
- 'พฤหัสบดี'
|
||||||
- ศุกร์
|
- 'ศุกร์'
|
||||||
- เสาร์
|
- 'เสาร์'
|
||||||
- อาทิตย์
|
- 'อาทิตย์'
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
---
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\nBaşlık: %1$s\n---\n\n# Hata: Geçersiz Önbölüm\n\nYol: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Tarih yok
|
NO_DATE_PROVIDED: Sağlanan tarih yok
|
||||||
BAD_DATE: Yanlış tarih
|
BAD_DATE: Yanlış tarih
|
||||||
AGO: önce
|
AGO: önce
|
||||||
FROM_NOW: (şimdiden)
|
FROM_NOW: şu andan itibaren
|
||||||
SECOND: saniye
|
SECOND: saniye
|
||||||
MINUTE: dakika
|
MINUTE: dakika
|
||||||
HOUR: saat
|
HOUR: saat
|
||||||
@@ -32,28 +34,30 @@ NICETIME:
|
|||||||
HR_PLURAL: sa
|
HR_PLURAL: sa
|
||||||
WK_PLURAL: hft
|
WK_PLURAL: hft
|
||||||
MO_PLURAL: ay
|
MO_PLURAL: ay
|
||||||
YR_PLURAL: yl
|
YR_PLURAL: yıl
|
||||||
DEC_PLURAL: onyl
|
DEC_PLURAL: onyl
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Doğrulama başarısız:</b>'
|
VALIDATION_FAIL: <b>Doğrulama başarısız:</b>
|
||||||
|
INVALID_INPUT: Geçersiz bilgi girişi
|
||||||
|
MISSING_REQUIRED_FIELD: 'Gerekli alan eksik:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Ocak
|
- 'Ocak'
|
||||||
- Şubat
|
- 'Şubat'
|
||||||
- Mart
|
- 'Mart'
|
||||||
- Nisan
|
- 'Nisan'
|
||||||
- Mayıs
|
- 'Mayıs'
|
||||||
- Haziran
|
- 'Haziran'
|
||||||
- Temmuz
|
- 'Temmuz'
|
||||||
- Ağustos
|
- 'Ağustos'
|
||||||
- Eylül
|
- 'Eylül'
|
||||||
- Ekim
|
- 'Ekim'
|
||||||
- Kasım
|
- 'Kasım'
|
||||||
- Aralık
|
- 'Aralık'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Pazartesi
|
- 'Pazartesi'
|
||||||
- Salı
|
- 'Salı'
|
||||||
- Çarşamba
|
- 'Çarşamba'
|
||||||
- Perşembe
|
- 'Perşembe'
|
||||||
- Cuma
|
- 'Cuma'
|
||||||
- Cumartesi
|
- 'Cumartesi'
|
||||||
- Pazar
|
- 'Pazar'
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Помилка: Недопустимий вміст\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Помилка: Недопустимий вміст
|
|
||||||
|
|
||||||
Path: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Не вказана дата
|
NO_DATE_PROVIDED: Не вказана дата
|
||||||
BAD_DATE: Невірна дата
|
BAD_DATE: Невірна дата
|
||||||
@@ -49,27 +37,27 @@ NICETIME:
|
|||||||
YR_PLURAL: рр.
|
YR_PLURAL: рр.
|
||||||
DEC_PLURAL: рр.
|
DEC_PLURAL: рр.
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Перевірка не вдалася:</b>'
|
VALIDATION_FAIL: <b>Перевірка не вдалася:</b>
|
||||||
INVALID_INPUT: Невірне введення в
|
INVALID_INPUT: Невірне введення в
|
||||||
MISSING_REQUIRED_FIELD: 'Відсутнє необхідне поле:'
|
MISSING_REQUIRED_FIELD: 'Відсутнє обов''язкове поле:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Січень
|
- 'Січень'
|
||||||
- Лютий
|
- 'Лютий'
|
||||||
- Березень
|
- 'Березень'
|
||||||
- Квітень
|
- 'Квітень'
|
||||||
- Травень
|
- 'Травень'
|
||||||
- Червень
|
- 'Червень'
|
||||||
- Липень
|
- 'Липень'
|
||||||
- Серпень
|
- 'Серпень'
|
||||||
- Вересень
|
- 'Вересень'
|
||||||
- Жовтень
|
- 'Жовтень'
|
||||||
- Листопад
|
- 'Листопад'
|
||||||
- Грудень
|
- 'Грудень'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Понеділок
|
- 'Понеділок'
|
||||||
- Вівторок
|
- 'Вівторок'
|
||||||
- Середа
|
- 'Середа'
|
||||||
- Четвер
|
- 'Четвер'
|
||||||
- "П'ятниця"
|
- 'П''ятниця'
|
||||||
- Субота
|
- 'Субота'
|
||||||
- Неділя
|
- 'Неділя'
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
---
|
---
|
||||||
FRONTMATTER_ERROR_PAGE: |
|
GRAV:
|
||||||
---
|
FRONTMATTER_ERROR_PAGE: "---\ntiêu đề: %1$s\n---\n\n# Error: Trang không hợp lệ\n\nĐường dẫn: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
title: %1$s
|
|
||||||
---
|
|
||||||
|
|
||||||
# Error: Invalid Frontmatter
|
|
||||||
|
|
||||||
Path: `%2$s`
|
|
||||||
|
|
||||||
**%3$s**
|
|
||||||
|
|
||||||
```
|
|
||||||
%4$s
|
|
||||||
```
|
|
||||||
NICETIME:
|
NICETIME:
|
||||||
NO_DATE_PROVIDED: Không có ngày được cung cấp
|
NO_DATE_PROVIDED: Không có ngày được cung cấp
|
||||||
BAD_DATE: Ngày không hợp lệ
|
BAD_DATE: Ngày không hợp lệ
|
||||||
@@ -49,27 +37,27 @@ NICETIME:
|
|||||||
YR_PLURAL: năm
|
YR_PLURAL: năm
|
||||||
DEC_PLURAL: thập kỷ
|
DEC_PLURAL: thập kỷ
|
||||||
FORM:
|
FORM:
|
||||||
VALIDATION_FAIL: '<b>Xác nhận thất bại:</b>'
|
VALIDATION_FAIL: <b>Xác nhận thất bại:</b>
|
||||||
INVALID_INPUT: Dữ liệu nhập không hợp lệ cho
|
INVALID_INPUT: Dữ liệu nhập không hợp lệ cho
|
||||||
MISSING_REQUIRED_FIELD: 'Thiếu trường bắt buộc:'
|
MISSING_REQUIRED_FIELD: 'Thiếu trường bắt buộc:'
|
||||||
MONTHS_OF_THE_YEAR:
|
MONTHS_OF_THE_YEAR:
|
||||||
- Tháng 1
|
- 'Tháng 1'
|
||||||
- Tháng 2
|
- 'Tháng 2'
|
||||||
- Tháng 3
|
- 'Tháng 3'
|
||||||
- Tháng 4
|
- 'Tháng 4'
|
||||||
- Tháng 5
|
- 'Tháng 5'
|
||||||
- Tháng 6
|
- 'Tháng 6'
|
||||||
- Tháng 7
|
- 'Tháng 7'
|
||||||
- Tháng 8
|
- 'Tháng 8'
|
||||||
- Tháng 9
|
- 'Tháng 9'
|
||||||
- Tháng 10
|
- 'Tháng 10'
|
||||||
- Tháng Mười 11
|
- 'Tháng 11'
|
||||||
- Tháng 12
|
- 'Tháng 12'
|
||||||
DAYS_OF_THE_WEEK:
|
DAYS_OF_THE_WEEK:
|
||||||
- Thứ 2
|
- 'Thứ 2'
|
||||||
- Thứ 3
|
- 'Thứ 3'
|
||||||
- Thứ 4
|
- 'Thứ 4'
|
||||||
- Thứ 5
|
- 'Thứ 5'
|
||||||
- Thứ 6
|
- 'Thứ 6'
|
||||||
- Thứ 7
|
- 'Thứ 7'
|
||||||
- Chủ Nhật
|
- 'Chủ Nhật'
|
||||||
|
|||||||
42
system/languages/zh-tw.yaml
Normal file
42
system/languages/zh-tw.yaml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
NICETIME:
|
||||||
|
SECOND: 秒
|
||||||
|
MINUTE: 分
|
||||||
|
HOUR: 小時
|
||||||
|
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: 十年
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- '一月'
|
||||||
|
- '二月'
|
||||||
|
- '三月'
|
||||||
|
- '四月'
|
||||||
|
- '五月'
|
||||||
|
- '六月'
|
||||||
|
- '七月'
|
||||||
|
- '八月'
|
||||||
|
- '九月'
|
||||||
|
- '十月'
|
||||||
|
- '十一月'
|
||||||
|
- '十二月'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- '星期一'
|
||||||
|
- '星期二'
|
||||||
|
- '星期三'
|
||||||
|
- '星期四'
|
||||||
|
- '星期五'
|
||||||
|
- '星期六'
|
||||||
|
- '星期日'
|
||||||
63
system/languages/zh.yaml
Normal file
63
system/languages/zh.yaml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
GRAV:
|
||||||
|
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# 錯誤: 不正確的 Frontmatter\n\n路徑: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
|
||||||
|
NICETIME:
|
||||||
|
NO_DATE_PROVIDED: 沒有提供日期
|
||||||
|
BAD_DATE: 錯誤日期
|
||||||
|
AGO: 之前
|
||||||
|
FROM_NOW: 之後
|
||||||
|
JUST_NOW: 剛剛
|
||||||
|
SECOND: 秒
|
||||||
|
MINUTE: 分
|
||||||
|
HOUR: 小時
|
||||||
|
DAY: 天
|
||||||
|
WEEK: 週
|
||||||
|
MONTH: 月
|
||||||
|
YEAR: 年
|
||||||
|
DECADE: 十年
|
||||||
|
SEC: 秒
|
||||||
|
MIN: 分
|
||||||
|
HR: 小時
|
||||||
|
WK: 週
|
||||||
|
MO: 月
|
||||||
|
YR: 年
|
||||||
|
DEC: 十年
|
||||||
|
SECOND_PLURAL: 秒
|
||||||
|
MINUTE_PLURAL: 分
|
||||||
|
HOUR_PLURAL: 小時
|
||||||
|
DAY_PLURAL: 天
|
||||||
|
WEEK_PLURAL: 週
|
||||||
|
MONTH_PLURAL: 月
|
||||||
|
YEAR_PLURAL: 年
|
||||||
|
DECADE_PLURAL: 十年
|
||||||
|
SEC_PLURAL: 秒
|
||||||
|
MIN_PLURAL: 分
|
||||||
|
HR_PLURAL: 時
|
||||||
|
WK_PLURAL: 週
|
||||||
|
MO_PLURAL: 月
|
||||||
|
YR_PLURAL: 年
|
||||||
|
DEC_PLURAL: 十年
|
||||||
|
FORM:
|
||||||
|
MISSING_REQUIRED_FIELD: 遺漏必填欄位:
|
||||||
|
MONTHS_OF_THE_YEAR:
|
||||||
|
- '一月'
|
||||||
|
- '二月'
|
||||||
|
- '三月'
|
||||||
|
- '四月'
|
||||||
|
- '五月'
|
||||||
|
- '六月'
|
||||||
|
- '七月'
|
||||||
|
- '八月'
|
||||||
|
- '九月'
|
||||||
|
- '十月'
|
||||||
|
- '十一月'
|
||||||
|
- '十二月'
|
||||||
|
DAYS_OF_THE_WEEK:
|
||||||
|
- '星期一'
|
||||||
|
- '星期二'
|
||||||
|
- '星期三'
|
||||||
|
- '星期四'
|
||||||
|
- '星期五'
|
||||||
|
- '星期六'
|
||||||
|
- '星期日'
|
||||||
|
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Core
|
* @package Grav\Core
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (PHP_SAPI !== 'cli-server') {
|
if (PHP_SAPI !== 'cli-server') {
|
||||||
exit('This script cannot be run from browser. Run it from a CLI.');
|
die('This script cannot be run from browser. Run it from a CLI.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$_SERVER['PHP_CLI_ROUTER'] = true;
|
$_SERVER['PHP_CLI_ROUTER'] = true;
|
||||||
@@ -21,6 +22,6 @@ $_SERVER['SCRIPT_FILENAME'] = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR .
|
|||||||
$_SERVER['SCRIPT_NAME'] = DIRECTORY_SEPARATOR . 'index.php';
|
$_SERVER['SCRIPT_NAME'] = DIRECTORY_SEPARATOR . 'index.php';
|
||||||
$_SERVER['PHP_SELF'] = DIRECTORY_SEPARATOR . 'index.php';
|
$_SERVER['PHP_SELF'] = DIRECTORY_SEPARATOR . 'index.php';
|
||||||
|
|
||||||
require 'index.php';
|
|
||||||
|
|
||||||
error_log(sprintf('%s:%d [%d]: %s', $_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_PORT'], http_response_code(), $_SERVER['REQUEST_URI']), 4);
|
error_log(sprintf('%s:%d [%d]: %s', $_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_PORT'], http_response_code(), $_SERVER['REQUEST_URI']), 4);
|
||||||
|
|
||||||
|
require 'index.php';
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
195
system/src/Grav/Common/Assets/BaseAsset.php
Normal file
195
system/src/Grav/Common/Assets/BaseAsset.php
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets;
|
||||||
|
|
||||||
|
use Grav\Common\Assets\Traits\AssetUtilsTrait;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use Grav\Common\Uri;
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
use Grav\Framework\Object\PropertyObject;
|
||||||
|
|
||||||
|
abstract class BaseAsset extends PropertyObject
|
||||||
|
{
|
||||||
|
use AssetUtilsTrait;
|
||||||
|
|
||||||
|
protected const CSS_ASSET = true;
|
||||||
|
protected const JS_ASSET = false;
|
||||||
|
|
||||||
|
/** @const Regex to match CSS import content */
|
||||||
|
protected const CSS_IMPORT_REGEX = '{@import(.*?);}';
|
||||||
|
|
||||||
|
protected $asset;
|
||||||
|
|
||||||
|
protected $asset_type;
|
||||||
|
protected $order;
|
||||||
|
protected $group;
|
||||||
|
protected $position;
|
||||||
|
protected $priority;
|
||||||
|
protected $attributes = [];
|
||||||
|
|
||||||
|
|
||||||
|
protected $timestamp;
|
||||||
|
protected $modified;
|
||||||
|
protected $remote;
|
||||||
|
protected $query = '';
|
||||||
|
|
||||||
|
// Private Bits
|
||||||
|
private $base_url;
|
||||||
|
private $fetch_command;
|
||||||
|
private $css_rewrite = false;
|
||||||
|
private $css_minify = false;
|
||||||
|
|
||||||
|
abstract function render();
|
||||||
|
|
||||||
|
public function __construct(array $elements = [], $key = null)
|
||||||
|
{
|
||||||
|
$base_config = [
|
||||||
|
'group' => 'head',
|
||||||
|
'position' => 'pipeline',
|
||||||
|
'priority' => 10,
|
||||||
|
'modified' => null,
|
||||||
|
'asset' => null
|
||||||
|
];
|
||||||
|
|
||||||
|
// Merge base defaults
|
||||||
|
$elements = array_merge($base_config, $elements);
|
||||||
|
|
||||||
|
parent::__construct($elements, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function init($asset, $options)
|
||||||
|
{
|
||||||
|
$config = Grav::instance()['config'];
|
||||||
|
$uri = Grav::instance()['uri'];
|
||||||
|
|
||||||
|
// set attributes
|
||||||
|
foreach ($options as $key => $value) {
|
||||||
|
if ($this->hasProperty($key)) {
|
||||||
|
$this->setProperty($key, $value);
|
||||||
|
} else {
|
||||||
|
$this->attributes[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do some special stuff for CSS/JS (not inline)
|
||||||
|
if (!Utils::startsWith($this->getType(), 'inline')) {
|
||||||
|
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
|
||||||
|
$this->remote = static::isRemoteLink($asset);
|
||||||
|
|
||||||
|
// Move this to render?
|
||||||
|
if (!$this->remote) {
|
||||||
|
|
||||||
|
$asset_parts = parse_url($asset);
|
||||||
|
if (isset($asset_parts['query'])) {
|
||||||
|
$this->query = $asset_parts['query'];
|
||||||
|
unset($asset_parts['query']);
|
||||||
|
$asset = Uri::buildUrl($asset_parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
$locator = Grav::instance()['locator'];
|
||||||
|
|
||||||
|
if ($locator->isStream($asset)) {
|
||||||
|
$path = $locator->findResource($asset, true);
|
||||||
|
} else {
|
||||||
|
$path = GRAV_ROOT . $asset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If local file is missing return
|
||||||
|
if ($path === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = new \SplFileInfo($path);
|
||||||
|
|
||||||
|
$asset = $this->buildLocalLink($file->getPathname());
|
||||||
|
|
||||||
|
$this->modified = $file->isFile() ? $file->getMTime() : false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->asset = $asset;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAsset()
|
||||||
|
{
|
||||||
|
return $this->asset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRemote()
|
||||||
|
{
|
||||||
|
return $this->remote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPosition($position)
|
||||||
|
{
|
||||||
|
$this->position = $position;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Get the last modification time of asset
|
||||||
|
*
|
||||||
|
* @param string $asset the asset string reference
|
||||||
|
*
|
||||||
|
* @return string the last modifcation time or false on error
|
||||||
|
*/
|
||||||
|
// protected function getLastModificationTime($asset)
|
||||||
|
// {
|
||||||
|
// $file = GRAV_ROOT . $asset;
|
||||||
|
// if (Grav::instance()['locator']->isStream($asset)) {
|
||||||
|
// $file = $this->buildLocalLink($asset, true);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return file_exists($file) ? filemtime($file) : false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Build local links including grav asset shortcodes
|
||||||
|
*
|
||||||
|
* @param string $asset the asset string reference
|
||||||
|
*
|
||||||
|
* @return string the final link url to the asset
|
||||||
|
*/
|
||||||
|
protected function buildLocalLink($asset)
|
||||||
|
{
|
||||||
|
if ($asset) {
|
||||||
|
return $this->base_url . ltrim(Utils::replaceFirstOccurrence(GRAV_ROOT, '', $asset), '/');
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements JsonSerializable interface.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function jsonSerialize()
|
||||||
|
{
|
||||||
|
return ['type' => $this->getType(), 'elements' => $this->getElements()];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Placeholder for AssetUtilsTrait method
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
* @param string $dir
|
||||||
|
* @param bool $local
|
||||||
|
*/
|
||||||
|
protected function cssRewrite($file, $dir, $local)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
40
system/src/Grav/Common/Assets/Css.php
Normal file
40
system/src/Grav/Common/Assets/Css.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets;
|
||||||
|
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
|
||||||
|
class Css extends BaseAsset
|
||||||
|
{
|
||||||
|
public function __construct(array $elements = [], $key = null)
|
||||||
|
{
|
||||||
|
$base_options = [
|
||||||
|
'asset_type' => 'css',
|
||||||
|
'attributes' => [
|
||||||
|
'type' => 'text/css',
|
||||||
|
'rel' => 'stylesheet'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
|
||||||
|
|
||||||
|
parent::__construct($merged_attributes, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
if (isset($this->attributes['loading']) && $this->attributes['loading'] === 'inline') {
|
||||||
|
$buffer = $this->gatherLinks( [$this], self::CSS_ASSET);
|
||||||
|
return "<style>\n" . trim($buffer) . "\n</style>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<link href="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . ">\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
32
system/src/Grav/Common/Assets/InlineCss.php
Normal file
32
system/src/Grav/Common/Assets/InlineCss.php
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets;
|
||||||
|
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
|
||||||
|
class InlineCss extends BaseAsset
|
||||||
|
{
|
||||||
|
public function __construct(array $elements = [], $key = null)
|
||||||
|
{
|
||||||
|
$base_options = [
|
||||||
|
'asset_type' => 'css',
|
||||||
|
'position' => 'after'
|
||||||
|
];
|
||||||
|
|
||||||
|
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
|
||||||
|
|
||||||
|
parent::__construct($merged_attributes, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return '<style' . $this->renderAttributes(). ">\n" . trim($this->asset) . "\n</style>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
32
system/src/Grav/Common/Assets/InlineJs.php
Normal file
32
system/src/Grav/Common/Assets/InlineJs.php
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets;
|
||||||
|
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
|
||||||
|
class InlineJs extends BaseAsset
|
||||||
|
{
|
||||||
|
public function __construct(array $elements = [], $key = null)
|
||||||
|
{
|
||||||
|
$base_options = [
|
||||||
|
'asset_type' => 'js',
|
||||||
|
'position' => 'after'
|
||||||
|
];
|
||||||
|
|
||||||
|
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
|
||||||
|
|
||||||
|
parent::__construct($merged_attributes, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return '<script' . $this->renderAttributes(). ">\n" . trim($this->asset) . "\n</script>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
36
system/src/Grav/Common/Assets/Js.php
Normal file
36
system/src/Grav/Common/Assets/Js.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets;
|
||||||
|
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
|
||||||
|
class Js extends BaseAsset
|
||||||
|
{
|
||||||
|
public function __construct(array $elements = [], $key = null)
|
||||||
|
{
|
||||||
|
$base_options = [
|
||||||
|
'asset_type' => 'js',
|
||||||
|
];
|
||||||
|
|
||||||
|
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
|
||||||
|
|
||||||
|
parent::__construct($merged_attributes, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
if (isset($this->attributes['loading']) && $this->attributes['loading'] === 'inline') {
|
||||||
|
$buffer = $this->gatherLinks( [$this], self::JS_ASSET);
|
||||||
|
return '<script' . $this->renderAttributes() . ">\n" . trim($buffer) . "\n</script>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<script src="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
273
system/src/Grav/Common/Assets/Pipeline.php
Normal file
273
system/src/Grav/Common/Assets/Pipeline.php
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets;
|
||||||
|
|
||||||
|
use Grav\Common\Assets\Traits\AssetUtilsTrait;
|
||||||
|
use Grav\Common\Config\Config;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use Grav\Common\Uri;
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
use Grav\Framework\Object\PropertyObject;
|
||||||
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
|
class Pipeline extends PropertyObject
|
||||||
|
{
|
||||||
|
use AssetUtilsTrait;
|
||||||
|
|
||||||
|
protected const CSS_ASSET = true;
|
||||||
|
protected const JS_ASSET = false;
|
||||||
|
|
||||||
|
/** @const Regex to match CSS urls */
|
||||||
|
protected const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)}';
|
||||||
|
|
||||||
|
/** @const Regex to match CSS sourcemap comments */
|
||||||
|
protected const CSS_SOURCEMAP_REGEX = '{\/\*# (.*?) \*\/}';
|
||||||
|
|
||||||
|
/** @const Regex to match CSS import content */
|
||||||
|
protected const CSS_IMPORT_REGEX = '{@import(.*?);}';
|
||||||
|
|
||||||
|
protected const FIRST_FORWARDSLASH_REGEX = '{^\/{1}\w}';
|
||||||
|
|
||||||
|
protected $css_minify;
|
||||||
|
protected $css_minify_windows;
|
||||||
|
protected $css_rewrite;
|
||||||
|
|
||||||
|
protected $js_minify;
|
||||||
|
protected $js_minify_windows;
|
||||||
|
|
||||||
|
protected $base_url;
|
||||||
|
protected $assets_dir;
|
||||||
|
protected $assets_url;
|
||||||
|
protected $timestamp;
|
||||||
|
protected $attributes;
|
||||||
|
protected $query;
|
||||||
|
protected $asset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closure used by the pipeline to fetch assets.
|
||||||
|
*
|
||||||
|
* Useful when file_get_contents() function is not available in your PHP
|
||||||
|
* installation or when you want to apply any kind of preprocessing to
|
||||||
|
* your assets before they get pipelined.
|
||||||
|
*
|
||||||
|
* The closure will receive as the only parameter a string with the path/URL of the asset and
|
||||||
|
* it should return the content of the asset file as a string.
|
||||||
|
*
|
||||||
|
* @var \Closure
|
||||||
|
*/
|
||||||
|
protected $fetch_command;
|
||||||
|
|
||||||
|
public function __construct(array $elements = [], ?string $key = null)
|
||||||
|
{
|
||||||
|
parent::__construct($elements, $key);
|
||||||
|
|
||||||
|
/** @var UniformResourceLocator $locator */
|
||||||
|
$locator = Grav::instance()['locator'];
|
||||||
|
|
||||||
|
/** @var Config $config */
|
||||||
|
$config = Grav::instance()['config'];
|
||||||
|
|
||||||
|
/** @var Uri $uri */
|
||||||
|
$uri = Grav::instance()['uri'];
|
||||||
|
|
||||||
|
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
|
||||||
|
$this->assets_dir = $locator->findResource('asset://') . DS;
|
||||||
|
$this->assets_url = $locator->findResource('asset://', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minify and concatenate CSS
|
||||||
|
*
|
||||||
|
* @param array $assets
|
||||||
|
* @param string $group
|
||||||
|
* @param array $attributes
|
||||||
|
*
|
||||||
|
* @return bool|string URL or generated content if available, else false
|
||||||
|
*/
|
||||||
|
public function renderCss($assets, $group, $attributes = [])
|
||||||
|
{
|
||||||
|
// temporary list of assets to pipeline
|
||||||
|
$inline_group = false;
|
||||||
|
|
||||||
|
if (array_key_exists('loading', $attributes) && $attributes['loading'] === 'inline') {
|
||||||
|
$inline_group = true;
|
||||||
|
unset($attributes['loading']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store Attributes
|
||||||
|
$this->attributes = array_merge(['type' => 'text/css', 'rel' => 'stylesheet'], $attributes);
|
||||||
|
|
||||||
|
// Compute uid based on assets and timestamp
|
||||||
|
$json_assets = json_encode($assets);
|
||||||
|
$uid = md5($json_assets . $this->css_minify . $this->css_rewrite . $group);
|
||||||
|
$file = $uid . '.css';
|
||||||
|
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
|
||||||
|
|
||||||
|
$buffer = null;
|
||||||
|
|
||||||
|
if (file_exists($this->assets_dir . $file)) {
|
||||||
|
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
|
||||||
|
} else {
|
||||||
|
//if nothing found get out of here!
|
||||||
|
if (empty($assets)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Concatenate files
|
||||||
|
$buffer = $this->gatherLinks($assets, self::CSS_ASSET);
|
||||||
|
|
||||||
|
// Minify if required
|
||||||
|
if ($this->shouldMinify('css')) {
|
||||||
|
$minifier = new \MatthiasMullie\Minify\CSS();
|
||||||
|
$minifier->add($buffer);
|
||||||
|
$buffer = $minifier->minify();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write file
|
||||||
|
if (trim($buffer) !== '') {
|
||||||
|
file_put_contents($this->assets_dir . $file, $buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inline_group) {
|
||||||
|
$output = "<style>\n" . $buffer . "\n</style>\n";
|
||||||
|
} else {
|
||||||
|
$this->asset = $relative_path;
|
||||||
|
$output = '<link href="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . ">\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minify and concatenate JS files.
|
||||||
|
*
|
||||||
|
* @param array $assets
|
||||||
|
* @param string $group
|
||||||
|
* @param array $attributes
|
||||||
|
*
|
||||||
|
* @return bool|string URL or generated content if available, else false
|
||||||
|
*/
|
||||||
|
public function renderJs($assets, $group, $attributes = [])
|
||||||
|
{
|
||||||
|
// temporary list of assets to pipeline
|
||||||
|
$inline_group = false;
|
||||||
|
|
||||||
|
if (array_key_exists('loading', $attributes) && $attributes['loading'] === 'inline') {
|
||||||
|
$inline_group = true;
|
||||||
|
unset($attributes['loading']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store Attributes
|
||||||
|
$this->attributes = $attributes;
|
||||||
|
|
||||||
|
// Compute uid based on assets and timestamp
|
||||||
|
$json_assets = json_encode($assets);
|
||||||
|
$uid = md5($json_assets . $this->js_minify . $group);
|
||||||
|
$file = $uid . '.js';
|
||||||
|
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
|
||||||
|
|
||||||
|
$buffer = null;
|
||||||
|
|
||||||
|
if (file_exists($this->assets_dir . $file)) {
|
||||||
|
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
|
||||||
|
} else {
|
||||||
|
//if nothing found get out of here!
|
||||||
|
if (empty($assets)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Concatenate files
|
||||||
|
$buffer = $this->gatherLinks($assets, self::JS_ASSET);
|
||||||
|
|
||||||
|
// Minify if required
|
||||||
|
if ($this->shouldMinify('js')) {
|
||||||
|
$minifier = new \MatthiasMullie\Minify\JS();
|
||||||
|
$minifier->add($buffer);
|
||||||
|
$buffer = $minifier->minify();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write file
|
||||||
|
if (trim($buffer) !== '') {
|
||||||
|
file_put_contents($this->assets_dir . $file, $buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($inline_group) {
|
||||||
|
$output = '<script' . $this->renderAttributes(). ">\n" . $buffer . "\n</script>\n";
|
||||||
|
} else {
|
||||||
|
$this->asset = $relative_path;
|
||||||
|
$output = '<script src="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds relative CSS urls() and rewrites the URL with an absolute one
|
||||||
|
*
|
||||||
|
* @param string $file the css source file
|
||||||
|
* @param string $dir , $local relative path to the css file
|
||||||
|
* @param bool $local is this a local or remote asset
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
protected function cssRewrite($file, $dir, $local)
|
||||||
|
{
|
||||||
|
// Strip any sourcemap comments
|
||||||
|
$file = preg_replace(self::CSS_SOURCEMAP_REGEX, '', $file);
|
||||||
|
|
||||||
|
// Find any css url() elements, grab the URLs and calculate an absolute path
|
||||||
|
// Then replace the old url with the new one
|
||||||
|
$file = (string)preg_replace_callback(self::CSS_URL_REGEX, function ($matches) use ($dir, $local) {
|
||||||
|
|
||||||
|
$old_url = $matches[2];
|
||||||
|
|
||||||
|
// Ensure link is not rooted to web server, a data URL, or to a remote host
|
||||||
|
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url) || Utils::startsWith($old_url, 'data:') || $this->isRemoteLink($old_url)) {
|
||||||
|
return $matches[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean leading /
|
||||||
|
$old_url = Utils::normalizePath($dir . '/' . $old_url);
|
||||||
|
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url)) {
|
||||||
|
$old_url = ltrim($old_url, '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
$new_url = ($local ? $this->base_url: '') . $old_url;
|
||||||
|
|
||||||
|
$fixed = str_replace($matches[2], $new_url, $matches[0]);
|
||||||
|
|
||||||
|
return $fixed;
|
||||||
|
}, $file);
|
||||||
|
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private function shouldMinify($type = 'css')
|
||||||
|
{
|
||||||
|
$check = $type . '_minify';
|
||||||
|
$win_check = $type . '_minify_windows';
|
||||||
|
|
||||||
|
$minify = (bool) $this->$check;
|
||||||
|
|
||||||
|
// If this is a Windows server, and minify_windows is false (default value) skip the
|
||||||
|
// minification process because it will cause Apache to die/crash due to insufficient
|
||||||
|
// ThreadStackSize in httpd.conf - See: https://bugs.php.net/bug.php?id=47689
|
||||||
|
if (stripos(php_uname('s'), 'WIN') === 0 && !$this->{$win_check}) {
|
||||||
|
$minify = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $minify;
|
||||||
|
}
|
||||||
|
}
|
||||||
182
system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php
Normal file
182
system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets\Traits
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets\Traits;
|
||||||
|
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
|
||||||
|
trait AssetUtilsTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine whether a link is local or remote.
|
||||||
|
* Understands both "http://" and "https://" as well as protocol agnostic links "//"
|
||||||
|
*
|
||||||
|
* @param string $link
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isRemoteLink($link)
|
||||||
|
{
|
||||||
|
$base = Grav::instance()['uri']->rootUrl(true);
|
||||||
|
|
||||||
|
// Sanity check for local URLs with absolute URL's enabled
|
||||||
|
if (Utils::startsWith($link, $base)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0 === strpos($link, 'http://') || 0 === strpos($link, 'https://') || 0 === strpos($link, '//'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Download and concatenate the content of several links.
|
||||||
|
*
|
||||||
|
* @param array $assets
|
||||||
|
* @param bool $css
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function gatherLinks(array $assets, $css = true)
|
||||||
|
{
|
||||||
|
$buffer = '';
|
||||||
|
|
||||||
|
|
||||||
|
foreach ($assets as $id => $asset) {
|
||||||
|
$local = true;
|
||||||
|
|
||||||
|
$link = $asset->getAsset();
|
||||||
|
$relative_path = $link;
|
||||||
|
|
||||||
|
if (static::isRemoteLink($link)) {
|
||||||
|
$local = false;
|
||||||
|
if (0 === strpos($link, '//')) {
|
||||||
|
$link = 'http:' . $link;
|
||||||
|
}
|
||||||
|
$relative_dir = \dirname($relative_path);
|
||||||
|
} else {
|
||||||
|
// Fix to remove relative dir if grav is in one
|
||||||
|
if (($this->base_url !== '/') && Utils::startsWith($relative_path, $this->base_url)) {
|
||||||
|
$base_url = '#' . preg_quote($this->base_url, '#') . '#';
|
||||||
|
$relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
$relative_dir = \dirname($relative_path);
|
||||||
|
$link = ROOT_DIR . $relative_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = ($this->fetch_command instanceof \Closure) ? @$this->fetch_command->__invoke($link) : @file_get_contents($link);
|
||||||
|
|
||||||
|
// No file found, skip it...
|
||||||
|
if ($file === false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Double check last character being
|
||||||
|
if (!$css) {
|
||||||
|
$file = rtrim($file, ' ;') . ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is CSS + the file is local + rewrite enabled
|
||||||
|
if ($css && $this->css_rewrite) {
|
||||||
|
$file = $this->cssRewrite($file, $relative_dir, $local);
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = rtrim($file) . PHP_EOL;
|
||||||
|
$buffer .= $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pull out @imports and move to top
|
||||||
|
if ($css) {
|
||||||
|
$buffer = $this->moveImports($buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves @import statements to the top of the file per the CSS specification
|
||||||
|
*
|
||||||
|
* @param string $file the file containing the combined CSS files
|
||||||
|
*
|
||||||
|
* @return string the modified file with any @imports at the top of the file
|
||||||
|
*/
|
||||||
|
protected function moveImports($file)
|
||||||
|
{
|
||||||
|
$imports = [];
|
||||||
|
|
||||||
|
$file = (string)preg_replace_callback(self::CSS_IMPORT_REGEX, function ($matches) use (&$imports) {
|
||||||
|
$imports[] = $matches[0];
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}, $file);
|
||||||
|
|
||||||
|
return implode("\n", $imports) . "\n\n" . $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Build an HTML attribute string from an array.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function renderAttributes()
|
||||||
|
{
|
||||||
|
$html = '';
|
||||||
|
$no_key = ['loading'];
|
||||||
|
|
||||||
|
foreach ($this->attributes as $key => $value) {
|
||||||
|
if (is_numeric($key)) {
|
||||||
|
$key = $value;
|
||||||
|
}
|
||||||
|
if (\is_array($value)) {
|
||||||
|
$value = implode(' ', $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\in_array($key, $no_key, true)) {
|
||||||
|
$element = htmlentities($value, ENT_QUOTES, 'UTF-8', false);
|
||||||
|
} else {
|
||||||
|
$element = $key . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= ' ' . $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render Querystring
|
||||||
|
*
|
||||||
|
* @param string $asset
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function renderQueryString($asset = null)
|
||||||
|
{
|
||||||
|
$querystring = '';
|
||||||
|
|
||||||
|
$asset = $asset ?? $this->asset;
|
||||||
|
|
||||||
|
if (!empty($this->query)) {
|
||||||
|
if (Utils::contains($asset, '?')) {
|
||||||
|
$querystring .= '&' . $this->query;
|
||||||
|
} else {
|
||||||
|
$querystring .= '?' . $this->query;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->timestamp) {
|
||||||
|
if (Utils::contains($asset, '?') || $querystring) {
|
||||||
|
$querystring .= '&' . $this->timestamp;
|
||||||
|
} else {
|
||||||
|
$querystring .= '?' . $this->timestamp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $querystring;
|
||||||
|
}
|
||||||
|
}
|
||||||
118
system/src/Grav/Common/Assets/Traits/LegacyAssetsTrait.php
Normal file
118
system/src/Grav/Common/Assets/Traits/LegacyAssetsTrait.php
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets\Traits
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets\Traits;
|
||||||
|
|
||||||
|
use Grav\Common\Assets;
|
||||||
|
|
||||||
|
trait LegacyAssetsTrait
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $args
|
||||||
|
* @param string $type
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function unifyLegacyArguments($args, $type = Assets::CSS_TYPE)
|
||||||
|
{
|
||||||
|
// First argument is always the asset
|
||||||
|
array_shift($args);
|
||||||
|
|
||||||
|
if (\count($args) === 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
if (\count($args) === 1 && \is_array($args[0])) {
|
||||||
|
return $args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($type) {
|
||||||
|
case(Assets::INLINE_CSS_TYPE):
|
||||||
|
$defaults = ['priority' => null, 'group' => null];
|
||||||
|
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(Assets::JS_TYPE):
|
||||||
|
$defaults = ['priority' => null, 'pipeline' => true, 'loading' => null, 'group' => null];
|
||||||
|
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(Assets::INLINE_JS_TYPE):
|
||||||
|
$defaults = ['priority' => null, 'group' => null, 'attributes' => null];
|
||||||
|
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
|
||||||
|
|
||||||
|
// special case to handle old attributes being passed in
|
||||||
|
if (isset($arguments['attributes'])) {
|
||||||
|
$old_attributes = $arguments['attributes'];
|
||||||
|
$arguments = array_merge($arguments, $old_attributes);
|
||||||
|
}
|
||||||
|
unset($arguments['attributes']);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case(Assets::CSS_TYPE):
|
||||||
|
$defaults = ['priority' => null, 'pipeline' => true, 'group' => null, 'loading' => null];
|
||||||
|
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function createArgumentsFromLegacy(array $args, array $defaults)
|
||||||
|
{
|
||||||
|
// Remove arguments with old default values.
|
||||||
|
$arguments = [];
|
||||||
|
foreach ($args as $arg) {
|
||||||
|
$default = current($defaults);
|
||||||
|
if ($arg !== $default) {
|
||||||
|
$arguments[key($defaults)] = $arg;
|
||||||
|
}
|
||||||
|
next($defaults);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience wrapper for async loading of JavaScript
|
||||||
|
*
|
||||||
|
* @param string|array $asset
|
||||||
|
* @param int $priority
|
||||||
|
* @param bool $pipeline
|
||||||
|
* @param string $group name of the group
|
||||||
|
*
|
||||||
|
* @return \Grav\Common\Assets
|
||||||
|
* @deprecated Please use dynamic method with ['loading' => 'async'].
|
||||||
|
*/
|
||||||
|
public function addAsyncJs($asset, $priority = 10, $pipeline = true, $group = 'head')
|
||||||
|
{
|
||||||
|
user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6, use dynamic method with [\'loading\' => \'async\']', E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
return $this->addJs($asset, $priority, $pipeline, 'async', $group);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience wrapper for deferred loading of JavaScript
|
||||||
|
*
|
||||||
|
* @param string|array $asset
|
||||||
|
* @param int $priority
|
||||||
|
* @param bool $pipeline
|
||||||
|
* @param string $group name of the group
|
||||||
|
*
|
||||||
|
* @return \Grav\Common\Assets
|
||||||
|
* @deprecated Please use dynamic method with ['loading' => 'defer'].
|
||||||
|
*/
|
||||||
|
public function addDeferJs($asset, $priority = 10, $pipeline = true, $group = 'head')
|
||||||
|
{
|
||||||
|
user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6, use dynamic method with [\'loading\' => \'defer\']', E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
return $this->addJs($asset, $priority, $pipeline, 'defer', $group);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
343
system/src/Grav/Common/Assets/Traits/TestingAssetsTrait.php
Normal file
343
system/src/Grav/Common/Assets/Traits/TestingAssetsTrait.php
Normal file
@@ -0,0 +1,343 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Assets\Traits
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Assets\Traits;
|
||||||
|
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
|
||||||
|
trait TestingAssetsTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determines if an asset exists as a collection, CSS or JS reference
|
||||||
|
*
|
||||||
|
* @param string $asset
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function exists($asset)
|
||||||
|
{
|
||||||
|
return isset($this->collections[$asset]) || isset($this->assets_css[$asset]) || isset($this->assets_js[$asset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the array of all the registered collections
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getCollections()
|
||||||
|
{
|
||||||
|
return $this->collections;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the array of collections explicitly
|
||||||
|
*
|
||||||
|
* @param array $collections
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setCollection($collections)
|
||||||
|
{
|
||||||
|
$this->collections = $collections;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the array of all the registered CSS assets
|
||||||
|
* If a $key is provided, it will try to return only that asset
|
||||||
|
* else it will return null
|
||||||
|
*
|
||||||
|
* @param null|string $key the asset key
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getCss($key = null)
|
||||||
|
{
|
||||||
|
if (null !== $key) {
|
||||||
|
$asset_key = md5($key);
|
||||||
|
|
||||||
|
return $this->assets_css[$asset_key] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->assets_css;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the array of all the registered JS assets
|
||||||
|
* If a $key is provided, it will try to return only that asset
|
||||||
|
* else it will return null
|
||||||
|
*
|
||||||
|
* @param null|string $key the asset key
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getJs($key = null)
|
||||||
|
{
|
||||||
|
if (null !== $key) {
|
||||||
|
$asset_key = md5($key);
|
||||||
|
|
||||||
|
return $this->assets_js[$asset_key] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->assets_js;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the whole array of CSS assets
|
||||||
|
*
|
||||||
|
* @param array $css
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setCss($css)
|
||||||
|
{
|
||||||
|
$this->assets_css = $css;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the whole array of JS assets
|
||||||
|
*
|
||||||
|
* @param array $js
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setJs($js)
|
||||||
|
{
|
||||||
|
$this->assets_js = $js;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an item from the CSS array if set
|
||||||
|
*
|
||||||
|
* @param string $key The asset key
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function removeCss($key)
|
||||||
|
{
|
||||||
|
$asset_key = md5($key);
|
||||||
|
if (isset($this->assets_css[$asset_key])) {
|
||||||
|
unset($this->assets_css[$asset_key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an item from the JS array if set
|
||||||
|
*
|
||||||
|
* @param string $key The asset key
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function removeJs($key)
|
||||||
|
{
|
||||||
|
$asset_key = md5($key);
|
||||||
|
if (isset($this->assets_js[$asset_key])) {
|
||||||
|
unset($this->assets_js[$asset_key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the state of CSS Pipeline
|
||||||
|
*
|
||||||
|
* @param bool $value
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setCssPipeline($value)
|
||||||
|
{
|
||||||
|
$this->css_pipeline = (bool)$value;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the state of JS Pipeline
|
||||||
|
*
|
||||||
|
* @param bool $value
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setJsPipeline($value)
|
||||||
|
{
|
||||||
|
$this->js_pipeline = (bool)$value;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset all assets.
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function reset()
|
||||||
|
{
|
||||||
|
$this->resetCss();
|
||||||
|
$this->resetJs();
|
||||||
|
$this->setCssPipeline(false);
|
||||||
|
$this->setJsPipeline(false);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset JavaScript assets.
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function resetJs()
|
||||||
|
{
|
||||||
|
$this->assets_js = [];
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset CSS assets.
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function resetCss()
|
||||||
|
{
|
||||||
|
$this->assets_css = [];
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Explicitly set's a timestamp for assets
|
||||||
|
*
|
||||||
|
* @param string|int $value
|
||||||
|
*/
|
||||||
|
public function setTimestamp($value)
|
||||||
|
{
|
||||||
|
$this->timestamp = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the timestamp for assets
|
||||||
|
*
|
||||||
|
* @param bool $include_join
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTimestamp($include_join = true)
|
||||||
|
{
|
||||||
|
if ($this->timestamp) {
|
||||||
|
return $include_join ? '?' . $this->timestamp : $this->timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all assets matching $pattern within $directory.
|
||||||
|
*
|
||||||
|
* @param string $directory Relative to the Grav root path, or a stream identifier
|
||||||
|
* @param string $pattern (regex)
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function addDir($directory, $pattern = self::DEFAULT_REGEX)
|
||||||
|
{
|
||||||
|
$root_dir = rtrim(ROOT_DIR, '/');
|
||||||
|
|
||||||
|
// Check if $directory is a stream.
|
||||||
|
if (strpos($directory, '://')) {
|
||||||
|
$directory = Grav::instance()['locator']->findResource($directory, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get files
|
||||||
|
$files = $this->rglob($root_dir . DIRECTORY_SEPARATOR . $directory, $pattern, $root_dir . '/');
|
||||||
|
|
||||||
|
// No luck? Nothing to do
|
||||||
|
if (!$files) {
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add CSS files
|
||||||
|
if ($pattern === self::CSS_REGEX) {
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$this->addCss($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add JavaScript files
|
||||||
|
if ($pattern === self::JS_REGEX) {
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$this->addJs($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unknown pattern.
|
||||||
|
foreach ($files as $asset) {
|
||||||
|
$this->add($asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all JavaScript assets within $directory
|
||||||
|
*
|
||||||
|
* @param string $directory Relative to the Grav root path, or a stream identifier
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function addDirJs($directory)
|
||||||
|
{
|
||||||
|
return $this->addDir($directory, self::JS_REGEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all CSS assets within $directory
|
||||||
|
*
|
||||||
|
* @param string $directory Relative to the Grav root path, or a stream identifier
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function addDirCss($directory)
|
||||||
|
{
|
||||||
|
return $this->addDir($directory, self::CSS_REGEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively get files matching $pattern within $directory.
|
||||||
|
*
|
||||||
|
* @param string $directory
|
||||||
|
* @param string $pattern (regex)
|
||||||
|
* @param string $ltrim Will be trimmed from the left of the file path
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function rglob($directory, $pattern, $ltrim = null)
|
||||||
|
{
|
||||||
|
$iterator = new \RegexIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory,
|
||||||
|
\FilesystemIterator::SKIP_DOTS)), $pattern);
|
||||||
|
$offset = \strlen($ltrim);
|
||||||
|
$files = [];
|
||||||
|
|
||||||
|
foreach ($iterator as $file) {
|
||||||
|
$files[] = substr($file->getPathname(), $offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
261
system/src/Grav/Common/Backup/Backups.php
Normal file
261
system/src/Grav/Common/Backup/Backups.php
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Grav\Common\Backup
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
|
* @license MIT License; see LICENSE file for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Grav\Common\Backup;
|
||||||
|
|
||||||
|
use Grav\Common\Filesystem\Archiver;
|
||||||
|
use Grav\Common\Filesystem\Folder;
|
||||||
|
use Grav\Common\Inflector;
|
||||||
|
use Grav\Common\Scheduler\Job;
|
||||||
|
use Grav\Common\Scheduler\Scheduler;
|
||||||
|
use Grav\Common\Utils;
|
||||||
|
use Grav\Common\Grav;
|
||||||
|
use RocketTheme\Toolbox\Event\Event;
|
||||||
|
use RocketTheme\Toolbox\Event\EventDispatcher;
|
||||||
|
use RocketTheme\Toolbox\File\JsonFile;
|
||||||
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
|
class Backups
|
||||||
|
{
|
||||||
|
protected const BACKUP_FILENAME_REGEXZ = "#(.*)--(\d*).zip#";
|
||||||
|
|
||||||
|
protected const BACKUP_DATE_FORMAT = 'YmdHis';
|
||||||
|
|
||||||
|
protected static $backup_dir;
|
||||||
|
|
||||||
|
protected static $backups = null;
|
||||||
|
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
/** @var EventDispatcher $dispatcher */
|
||||||
|
$dispatcher = Grav::instance()['events'];
|
||||||
|
$dispatcher->addListener('onSchedulerInitialized', [$this, 'onSchedulerInitialized']);
|
||||||
|
Grav::instance()->fireEvent('onBackupsInitialized', new Event(['backups' => $this]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setup()
|
||||||
|
{
|
||||||
|
if (null === static::$backup_dir) {
|
||||||
|
static::$backup_dir = Grav::instance()['locator']->findResource('backup://', true, true);
|
||||||
|
Folder::create(static::$backup_dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onSchedulerInitialized(Event $event)
|
||||||
|
{
|
||||||
|
/** @var Scheduler $scheduler */
|
||||||
|
$scheduler = $event['scheduler'];
|
||||||
|
|
||||||
|
/** @var Inflector $inflector */
|
||||||
|
$inflector = Grav::instance()['inflector'];
|
||||||
|
|
||||||
|
foreach (static::getBackupProfiles() as $id => $profile) {
|
||||||
|
$at = $profile['schedule_at'];
|
||||||
|
$name = $inflector::hyphenize($profile['name']);
|
||||||
|
$logs = 'logs/backup-' . $name . '.out';
|
||||||
|
/** @var Job $job */
|
||||||
|
$job = $scheduler->addFunction('Grav\Common\Backup\Backups::backup', [$id], $name );
|
||||||
|
$job->at($at);
|
||||||
|
$job->output($logs);
|
||||||
|
$job->backlink('/tools/backups');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBackupDownloadUrl($backup, $base_url)
|
||||||
|
{
|
||||||
|
$param_sep = $param_sep = Grav::instance()['config']->get('system.param_sep', ':');
|
||||||
|
$download = urlencode(base64_encode($backup));
|
||||||
|
$url = rtrim(Grav::instance()['uri']->rootUrl(true), '/') . '/' . trim($base_url,
|
||||||
|
'/') . '/task' . $param_sep . 'backup/download' . $param_sep . $download . '/admin-nonce' . $param_sep . Utils::getNonce('admin-form');
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getBackupProfiles()
|
||||||
|
{
|
||||||
|
return Grav::instance()['config']->get('backups.profiles');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getPurgeConfig()
|
||||||
|
{
|
||||||
|
return Grav::instance()['config']->get('backups.purge');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBackupNames()
|
||||||
|
{
|
||||||
|
return array_column(static::getBackupProfiles(), 'name');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getTotalBackupsSize()
|
||||||
|
{
|
||||||
|
$backups = static::getAvailableBackups();
|
||||||
|
$size = array_sum(array_column($backups, 'size'));
|
||||||
|
|
||||||
|
return $size ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getAvailableBackups($force = false)
|
||||||
|
{
|
||||||
|
if ($force || null === static::$backups) {
|
||||||
|
static::$backups = [];
|
||||||
|
$backups_itr = new \GlobIterator(static::$backup_dir . '/*.zip', \FilesystemIterator::KEY_AS_FILENAME);
|
||||||
|
$inflector = Grav::instance()['inflector'];
|
||||||
|
$long_date_format = DATE_RFC2822;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string $name
|
||||||
|
* @var \SplFileInfo $file
|
||||||
|
*/
|
||||||
|
foreach ($backups_itr as $name => $file) {
|
||||||
|
|
||||||
|
if (preg_match(static::BACKUP_FILENAME_REGEXZ, $name, $matches)) {
|
||||||
|
$date = \DateTime::createFromFormat(static::BACKUP_DATE_FORMAT, $matches[2]);
|
||||||
|
$timestamp = $date->getTimestamp();
|
||||||
|
$backup = new \stdClass();
|
||||||
|
$backup->title = $inflector->titleize($matches[1]);
|
||||||
|
$backup->time = $date;
|
||||||
|
$backup->date = $date->format($long_date_format);
|
||||||
|
$backup->filename = $name;
|
||||||
|
$backup->path = $file->getPathname();
|
||||||
|
$backup->size = $file->getSize();
|
||||||
|
static::$backups[$timestamp] = $backup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Reverse Key Sort to get in reverse date order
|
||||||
|
krsort(static::$backups);
|
||||||
|
}
|
||||||
|
|
||||||
|
return static::$backups;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Backup
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
* @param callable|null $status
|
||||||
|
*
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
public static function backup($id = 0, callable $status = null)
|
||||||
|
{
|
||||||
|
$profiles = static::getBackupProfiles();
|
||||||
|
/** @var UniformResourceLocator $locator */
|
||||||
|
$locator = Grav::instance()['locator'];
|
||||||
|
|
||||||
|
if (isset($profiles[$id])) {
|
||||||
|
$backup = (object) $profiles[$id];
|
||||||
|
} else {
|
||||||
|
throw new \RuntimeException('No backups defined...');
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = Grav::instance()['inflector']->underscorize($backup->name);
|
||||||
|
$date = date(static::BACKUP_DATE_FORMAT, time());
|
||||||
|
$filename = trim($name, '_') . '--' . $date . '.zip';
|
||||||
|
$destination = static::$backup_dir . DS . $filename;
|
||||||
|
$max_execution_time = ini_set('max_execution_time', 600);
|
||||||
|
$backup_root = $backup->root;
|
||||||
|
|
||||||
|
if ($locator->isStream($backup_root)) {
|
||||||
|
$backup_root = $locator->findResource($backup_root);
|
||||||
|
} else {
|
||||||
|
$backup_root = rtrim(GRAV_ROOT . $backup_root, '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!file_exists($backup_root)) {
|
||||||
|
throw new \RuntimeException("Backup location: {$backup_root} does not exist...");
|
||||||
|
}
|
||||||
|
|
||||||
|
$options = [
|
||||||
|
'exclude_files' => static::convertExclude($backup->exclude_files ?? ''),
|
||||||
|
'exclude_paths' => static::convertExclude($backup->exclude_paths ?? ''),
|
||||||
|
];
|
||||||
|
|
||||||
|
/** @var Archiver $archiver */
|
||||||
|
$archiver = Archiver::create('zip');
|
||||||
|
$archiver->setArchive($destination)->setOptions($options)->compress($backup_root, $status)->addEmptyFolders($options['exclude_paths'], $status);
|
||||||
|
|
||||||
|
$status && $status([
|
||||||
|
'type' => 'message',
|
||||||
|
'message' => 'Done...',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$status && $status([
|
||||||
|
'type' => 'progress',
|
||||||
|
'complete' => true
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($max_execution_time !== false) {
|
||||||
|
ini_set('max_execution_time', $max_execution_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log the backup
|
||||||
|
Grav::instance()['log']->notice('Backup Created: ' . $destination);
|
||||||
|
|
||||||
|
// Fire Finished event
|
||||||
|
Grav::instance()->fireEvent('onBackupFinished', new Event(['backup' => $destination]));
|
||||||
|
|
||||||
|
// Purge anything required
|
||||||
|
static::purge();
|
||||||
|
|
||||||
|
// Log
|
||||||
|
$log = JsonFile::instance(Grav::instance()['locator']->findResource("log://backup.log", true, true));
|
||||||
|
$log->content([
|
||||||
|
'time' => time(),
|
||||||
|
'location' => $destination
|
||||||
|
]);
|
||||||
|
$log->save();
|
||||||
|
|
||||||
|
return $destination;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function purge()
|
||||||
|
{
|
||||||
|
$purge_config = static::getPurgeConfig();
|
||||||
|
$trigger = $purge_config['trigger'];
|
||||||
|
$backups = static::getAvailableBackups(true);
|
||||||
|
|
||||||
|
switch ($trigger)
|
||||||
|
{
|
||||||
|
case 'number':
|
||||||
|
$backups_count = count($backups);
|
||||||
|
if ($backups_count > $purge_config['max_backups_count']) {
|
||||||
|
$last = end($backups);
|
||||||
|
unlink ($last->path);
|
||||||
|
static::purge();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'time':
|
||||||
|
$last = end($backups);
|
||||||
|
$now = new \DateTime();
|
||||||
|
$interval = $now->diff($last->time);
|
||||||
|
if ($interval->days > $purge_config['max_backups_time']) {
|
||||||
|
unlink($last->path);
|
||||||
|
static::purge();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$used_space = static::getTotalBackupsSize();
|
||||||
|
$max_space = $purge_config['max_backups_space'] * 1024 * 1024 * 1024;
|
||||||
|
if ($used_space > $max_space) {
|
||||||
|
$last = end($backups);
|
||||||
|
unlink($last->path);
|
||||||
|
static::purge();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static function convertExclude($exclude)
|
||||||
|
{
|
||||||
|
$lines = preg_split("/[\s,]+/", $exclude);
|
||||||
|
return array_map('trim', $lines, array_fill(0, \count($lines), '/'));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Grav.Common.Backup
|
|
||||||
*
|
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
|
||||||
* @license MIT License; see LICENSE file for details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Grav\Common\Backup;
|
|
||||||
|
|
||||||
use Grav\Common\Grav;
|
|
||||||
use Grav\Common\Inflector;
|
|
||||||
|
|
||||||
class ZipBackup
|
|
||||||
{
|
|
||||||
protected static $ignorePaths = [
|
|
||||||
'backup',
|
|
||||||
'cache',
|
|
||||||
'images',
|
|
||||||
'logs',
|
|
||||||
'tmp'
|
|
||||||
];
|
|
||||||
|
|
||||||
protected static $ignoreFolders = [
|
|
||||||
'.git',
|
|
||||||
'.svn',
|
|
||||||
'.hg',
|
|
||||||
'.idea',
|
|
||||||
'node_modules'
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Backup
|
|
||||||
*
|
|
||||||
* @param string|null $destination
|
|
||||||
* @param callable|null $messager
|
|
||||||
*
|
|
||||||
* @return null|string
|
|
||||||
*/
|
|
||||||
public static function backup($destination = null, callable $messager = null)
|
|
||||||
{
|
|
||||||
if (!$destination) {
|
|
||||||
$destination = Grav::instance()['locator']->findResource('backup://', true);
|
|
||||||
|
|
||||||
if (!$destination) {
|
|
||||||
throw new \RuntimeException('The backup folder is missing.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$name = substr(strip_tags(Grav::instance()['config']->get('site.title', basename(GRAV_ROOT))), 0, 20);
|
|
||||||
|
|
||||||
$inflector = new Inflector();
|
|
||||||
|
|
||||||
if (is_dir($destination)) {
|
|
||||||
$date = date('YmdHis', time());
|
|
||||||
$filename = trim($inflector->hyphenize($name), '-') . '-' . $date . '.zip';
|
|
||||||
$destination = rtrim($destination, DS) . DS . $filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
$messager && $messager([
|
|
||||||
'type' => 'message',
|
|
||||||
'level' => 'info',
|
|
||||||
'message' => 'Creating new Backup "' . $destination . '"'
|
|
||||||
]);
|
|
||||||
$messager && $messager([
|
|
||||||
'type' => 'message',
|
|
||||||
'level' => 'info',
|
|
||||||
'message' => ''
|
|
||||||
]);
|
|
||||||
|
|
||||||
$zip = new \ZipArchive();
|
|
||||||
$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);
|
|
||||||
|
|
||||||
$messager && $messager([
|
|
||||||
'type' => 'progress',
|
|
||||||
'percentage' => false,
|
|
||||||
'complete' => true
|
|
||||||
]);
|
|
||||||
|
|
||||||
$messager && $messager([
|
|
||||||
'type' => 'message',
|
|
||||||
'level' => 'info',
|
|
||||||
'message' => ''
|
|
||||||
]);
|
|
||||||
$messager && $messager([
|
|
||||||
'type' => 'message',
|
|
||||||
'level' => 'info',
|
|
||||||
'message' => 'Saving and compressing archive...'
|
|
||||||
]);
|
|
||||||
|
|
||||||
$zip->close();
|
|
||||||
|
|
||||||
if ($max_execution_time !== false) {
|
|
||||||
ini_set('max_execution_time', $max_execution_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $destination;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $folder
|
|
||||||
* @param $zipFile
|
|
||||||
* @param $exclusiveLength
|
|
||||||
* @param $messager
|
|
||||||
*/
|
|
||||||
private static function folderToZip($folder, \ZipArchive $zipFile, $exclusiveLength, callable $messager = null)
|
|
||||||
{
|
|
||||||
$handle = opendir($folder);
|
|
||||||
while (false !== $f = readdir($handle)) {
|
|
||||||
if ($f !== '.' && $f !== '..') {
|
|
||||||
$filePath = "$folder/$f";
|
|
||||||
// Remove prefix from file path before add to zip.
|
|
||||||
$localPath = substr($filePath, $exclusiveLength);
|
|
||||||
|
|
||||||
if (in_array($f, static::$ignoreFolders)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (in_array($localPath, static::$ignorePaths)) {
|
|
||||||
$zipFile->addEmptyDir($f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_file($filePath)) {
|
|
||||||
$zipFile->addFile($filePath, $localPath);
|
|
||||||
|
|
||||||
$messager && $messager([
|
|
||||||
'type' => 'progress',
|
|
||||||
'percentage' => false,
|
|
||||||
'complete' => false
|
|
||||||
]);
|
|
||||||
} elseif (is_dir($filePath)) {
|
|
||||||
// Add sub-directory.
|
|
||||||
$zipFile->addEmptyDir($localPath);
|
|
||||||
static::folderToZip($filePath, $zipFile, $exclusiveLength, $messager);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir($handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common
|
* @package Grav\Common
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -113,7 +114,7 @@ class Browser
|
|||||||
{
|
{
|
||||||
$version = explode('.', $this->getLongVersion());
|
$version = explode('.', $this->getLongVersion());
|
||||||
|
|
||||||
return intval($version[0]);
|
return (int)$version[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -134,4 +135,15 @@ class Browser
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if “Do Not Track” is set by browser
|
||||||
|
* @see https://www.w3.org/TR/tracking-dnt/
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isTrackable(): bool
|
||||||
|
{
|
||||||
|
return !(isset($_SERVER['HTTP_DNT']) && $_SERVER['HTTP_DNT'] === '1');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common
|
* @package Grav\Common
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -11,15 +12,16 @@ namespace Grav\Common;
|
|||||||
use \Doctrine\Common\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\Scheduler\Scheduler;
|
||||||
|
use Psr\SimpleCache\CacheInterface;
|
||||||
use RocketTheme\Toolbox\Event\Event;
|
use RocketTheme\Toolbox\Event\Event;
|
||||||
|
use RocketTheme\Toolbox\Event\EventDispatcher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
* It uses DoctrineCache library and supports a variety of caching mechanisms. Those include:
|
* It uses DoctrineCache library and supports a variety of caching mechanisms. Those include:
|
||||||
*
|
*
|
||||||
* APCu
|
* APCu
|
||||||
* APC
|
|
||||||
* XCache
|
|
||||||
* RedisCache
|
* RedisCache
|
||||||
* MemCache
|
* MemCache
|
||||||
* MemCacheD
|
* MemCacheD
|
||||||
@@ -43,6 +45,11 @@ class Cache extends Getters
|
|||||||
*/
|
*/
|
||||||
protected $driver;
|
protected $driver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var CacheInterface
|
||||||
|
*/
|
||||||
|
protected $simpleCache;
|
||||||
|
|
||||||
protected $driver_name;
|
protected $driver_name;
|
||||||
|
|
||||||
protected $driver_setting;
|
protected $driver_setting;
|
||||||
@@ -117,33 +124,73 @@ class Cache extends Getters
|
|||||||
$this->config = $grav['config'];
|
$this->config = $grav['config'];
|
||||||
$this->now = time();
|
$this->now = time();
|
||||||
|
|
||||||
$this->cache_dir = $grav['locator']->findResource('cache://doctrine', true, true);
|
if (null === $this->enabled) {
|
||||||
|
$this->enabled = (bool)$this->config->get('system.cache.enabled');
|
||||||
|
}
|
||||||
|
|
||||||
/** @var Uri $uri */
|
/** @var Uri $uri */
|
||||||
$uri = $grav['uri'];
|
$uri = $grav['uri'];
|
||||||
|
|
||||||
$prefix = $this->config->get('system.cache.prefix');
|
$prefix = $this->config->get('system.cache.prefix');
|
||||||
|
$uniqueness = substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION), 2, 8);
|
||||||
if (is_null($this->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 = ($prefix ? $prefix : 'g') . '-' . substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION),
|
$this->key = ($prefix ? $prefix : 'g') . '-' . $uniqueness;
|
||||||
2, 8);
|
$this->cache_dir = $grav['locator']->findResource('cache://doctrine/' . $uniqueness, true, true);
|
||||||
|
|
||||||
$this->driver_setting = $this->config->get('system.cache.driver');
|
$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
|
|
||||||
$this->driver->setNamespace($this->key);
|
$this->driver->setNamespace($this->key);
|
||||||
|
|
||||||
|
/** @var EventDispatcher $dispatcher */
|
||||||
|
$dispatcher = Grav::instance()['events'];
|
||||||
|
$dispatcher->addListener('onSchedulerInitialized', [$this, 'onSchedulerInitialized']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return CacheInterface
|
||||||
|
*/
|
||||||
|
public function getSimpleCache()
|
||||||
|
{
|
||||||
|
if (null === $this->simpleCache) {
|
||||||
|
$cache = new \Grav\Framework\Cache\Adapter\DoctrineCache($this->driver, '', $this->getLifetime());
|
||||||
|
|
||||||
|
// Disable cache key validation.
|
||||||
|
$cache->setValidation(false);
|
||||||
|
|
||||||
|
$this->simpleCache = $cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->simpleCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the old out of date file-based caches
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function purgeOldCache()
|
||||||
|
{
|
||||||
|
$cache_dir = dirname($this->cache_dir);
|
||||||
|
$current = basename($this->cache_dir);
|
||||||
|
$count = 0;
|
||||||
|
|
||||||
|
foreach (new \DirectoryIterator($cache_dir) as $file) {
|
||||||
|
$dir = $file->getBasename();
|
||||||
|
if ($dir === $current || $file->isDot() || $file->isFile()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Folder::delete($file->getPathname());
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Public accessor to set the enabled state of the cache
|
* Public accessor to set the enabled state of the cache
|
||||||
*
|
*
|
||||||
* @param $enabled
|
* @param bool|int $enabled
|
||||||
*/
|
*/
|
||||||
public function setEnabled($enabled)
|
public function setEnabled($enabled)
|
||||||
{
|
{
|
||||||
@@ -184,19 +231,15 @@ class Cache extends Getters
|
|||||||
|
|
||||||
// CLI compatibility requires a non-volatile cache driver
|
// CLI compatibility requires a non-volatile cache driver
|
||||||
if ($this->config->get('system.cache.cli_compatibility') && (
|
if ($this->config->get('system.cache.cli_compatibility') && (
|
||||||
$setting == 'auto' || $this->isVolatileDriver($setting))) {
|
$setting === 'auto' || $this->isVolatileDriver($setting))) {
|
||||||
$setting = $driver_name;
|
$setting = $driver_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$setting || $setting == 'auto') {
|
if (!$setting || $setting === 'auto') {
|
||||||
if (extension_loaded('apcu')) {
|
if (extension_loaded('apcu')) {
|
||||||
$driver_name = 'apcu';
|
$driver_name = 'apcu';
|
||||||
} elseif (extension_loaded('apc')) {
|
|
||||||
$driver_name = 'apc';
|
|
||||||
} elseif (extension_loaded('wincache')) {
|
} elseif (extension_loaded('wincache')) {
|
||||||
$driver_name = 'wincache';
|
$driver_name = 'wincache';
|
||||||
} elseif (extension_loaded('xcache')) {
|
|
||||||
$driver_name = 'xcache';
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$driver_name = $setting;
|
$driver_name = $setting;
|
||||||
@@ -206,9 +249,6 @@ class Cache extends Getters
|
|||||||
|
|
||||||
switch ($driver_name) {
|
switch ($driver_name) {
|
||||||
case 'apc':
|
case 'apc':
|
||||||
$driver = new DoctrineCache\ApcCache();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'apcu':
|
case 'apcu':
|
||||||
$driver = new DoctrineCache\ApcuCache();
|
$driver = new DoctrineCache\ApcuCache();
|
||||||
break;
|
break;
|
||||||
@@ -217,27 +257,32 @@ class Cache extends Getters
|
|||||||
$driver = new DoctrineCache\WinCacheCache();
|
$driver = new DoctrineCache\WinCacheCache();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'xcache':
|
|
||||||
$driver = new DoctrineCache\XcacheCache();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'memcache':
|
case 'memcache':
|
||||||
|
if (extension_loaded('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 DoctrineCache\MemcacheCache();
|
$driver = new DoctrineCache\MemcacheCache();
|
||||||
$driver->setMemcache($memcache);
|
$driver->setMemcache($memcache);
|
||||||
|
} else {
|
||||||
|
throw new \LogicException('Memcache PHP extension has not been installed');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'memcached':
|
case 'memcached':
|
||||||
|
if (extension_loaded('memcached')) {
|
||||||
$memcached = new \Memcached();
|
$memcached = new \Memcached();
|
||||||
$memcached->addServer($this->config->get('system.cache.memcached.server', 'localhost'),
|
$memcached->addServer($this->config->get('system.cache.memcached.server', 'localhost'),
|
||||||
$this->config->get('system.cache.memcached.port', 11211));
|
$this->config->get('system.cache.memcached.port', 11211));
|
||||||
$driver = new DoctrineCache\MemcachedCache();
|
$driver = new DoctrineCache\MemcachedCache();
|
||||||
$driver->setMemcached($memcached);
|
$driver->setMemcached($memcached);
|
||||||
|
} else {
|
||||||
|
throw new \LogicException('Memcached PHP extension has not been installed');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'redis':
|
case 'redis':
|
||||||
|
if (extension_loaded('redis')) {
|
||||||
$redis = new \Redis();
|
$redis = new \Redis();
|
||||||
$socket = $this->config->get('system.cache.redis.socket', false);
|
$socket = $this->config->get('system.cache.redis.socket', false);
|
||||||
$password = $this->config->get('system.cache.redis.password', false);
|
$password = $this->config->get('system.cache.redis.password', false);
|
||||||
@@ -256,6 +301,9 @@ class Cache extends Getters
|
|||||||
|
|
||||||
$driver = new DoctrineCache\RedisCache();
|
$driver = new DoctrineCache\RedisCache();
|
||||||
$driver->setRedis($redis);
|
$driver->setRedis($redis);
|
||||||
|
} else {
|
||||||
|
throw new \LogicException('Redis PHP extension has not been installed');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -277,9 +325,9 @@ class Cache extends Getters
|
|||||||
{
|
{
|
||||||
if ($this->enabled) {
|
if ($this->enabled) {
|
||||||
return $this->driver->fetch($id);
|
return $this->driver->fetch($id);
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -310,6 +358,21 @@ class Cache extends Getters
|
|||||||
if ($this->enabled) {
|
if ($this->enabled) {
|
||||||
return $this->driver->delete($id);
|
return $this->driver->delete($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all cache
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function deleteAll()
|
||||||
|
{
|
||||||
|
if ($this->enabled) {
|
||||||
|
return $this->driver->deleteAll();
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,6 +387,7 @@ class Cache extends Getters
|
|||||||
if ($this->enabled) {
|
if ($this->enabled) {
|
||||||
return $this->driver->contains(($id));
|
return $this->driver->contains(($id));
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,6 +446,12 @@ class Cache extends Getters
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete entries in the doctrine cache if required
|
||||||
|
if (in_array($remove, ['all', 'standard'])) {
|
||||||
|
$cache = Grav::instance()['cache'];
|
||||||
|
$cache->driver->deleteAll();
|
||||||
|
}
|
||||||
|
|
||||||
// Clearing cache event to add paths to clear
|
// Clearing cache event to add paths to clear
|
||||||
Grav::instance()->fireEvent('onBeforeCacheClear', new Event(['remove' => $remove, 'paths' => &$remove_paths]));
|
Grav::instance()->fireEvent('onBeforeCacheClear', new Event(['remove' => $remove, 'paths' => &$remove_paths]));
|
||||||
|
|
||||||
@@ -422,7 +492,7 @@ class Cache extends Getters
|
|||||||
|
|
||||||
$output[] = '';
|
$output[] = '';
|
||||||
|
|
||||||
if (($remove == 'all' || $remove == 'standard') && file_exists($user_config)) {
|
if (($remove === 'all' || $remove === 'standard') && file_exists($user_config)) {
|
||||||
touch($user_config);
|
touch($user_config);
|
||||||
|
|
||||||
$output[] = '<red>Touched: </red>' . $user_config;
|
$output[] = '<red>Touched: </red>' . $user_config;
|
||||||
@@ -440,6 +510,24 @@ class Cache extends Getters
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function invalidateCache()
|
||||||
|
{
|
||||||
|
$user_config = USER_DIR . 'config/system.yaml';
|
||||||
|
|
||||||
|
if (file_exists($user_config)) {
|
||||||
|
touch($user_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear stat cache
|
||||||
|
@clearstatcache();
|
||||||
|
|
||||||
|
// Clear opcache
|
||||||
|
if (function_exists('opcache_reset')) {
|
||||||
|
@opcache_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the cache lifetime programmatically
|
* Set the cache lifetime programmatically
|
||||||
@@ -496,15 +584,71 @@ class Cache extends Getters
|
|||||||
/**
|
/**
|
||||||
* is this driver a volatile driver in that it resides in PHP process memory
|
* is this driver a volatile driver in that it resides in PHP process memory
|
||||||
*
|
*
|
||||||
* @param $setting
|
* @param string $setting
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isVolatileDriver($setting)
|
public function isVolatileDriver($setting)
|
||||||
{
|
{
|
||||||
if (in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'])) {
|
if (in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'])) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static function to call as a scheduled Job to purge old Doctrine files
|
||||||
|
*/
|
||||||
|
public static function purgeJob()
|
||||||
|
{
|
||||||
|
/** @var Cache $cache */
|
||||||
|
$cache = Grav::instance()['cache'];
|
||||||
|
$deleted_folders = $cache->purgeOldCache();
|
||||||
|
|
||||||
|
echo 'Purged ' . $deleted_folders . ' old cache folders...';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static function to call as a scheduled Job to clear Grav cache
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
*/
|
||||||
|
public static function clearJob($type)
|
||||||
|
{
|
||||||
|
$result = static::clearCache($type);
|
||||||
|
static::invalidateCache();
|
||||||
|
|
||||||
|
echo strip_tags(implode("\n", $result));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onSchedulerInitialized(Event $event)
|
||||||
|
{
|
||||||
|
/** @var Scheduler $scheduler */
|
||||||
|
$scheduler = $event['scheduler'];
|
||||||
|
$config = Grav::instance()['config'];
|
||||||
|
|
||||||
|
// File Cache Purge
|
||||||
|
$at = $config->get('system.cache.purge_at');
|
||||||
|
$name = 'cache-purge';
|
||||||
|
$logs = 'logs/' . $name . '.out';
|
||||||
|
|
||||||
|
$job = $scheduler->addFunction('Grav\Common\Cache::purgeJob', [], $name );
|
||||||
|
$job->at($at);
|
||||||
|
$job->output($logs);
|
||||||
|
$job->backlink('/config/system#caching');
|
||||||
|
|
||||||
|
// Cache Clear
|
||||||
|
$at = $config->get('system.cache.clear_at');
|
||||||
|
$clear_type = $config->get('system.cache.clear_job_type');
|
||||||
|
$name = 'cache-clear';
|
||||||
|
$logs = 'logs/' . $name . '.out';
|
||||||
|
|
||||||
|
$job = $scheduler->addFunction('Grav\Common\Cache::clearJob', [$clear_type], $name );
|
||||||
|
$job->at($at);
|
||||||
|
$job->output($logs);
|
||||||
|
$job->backlink('/config/system#caching');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common
|
* @package Grav\Common
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -11,7 +12,7 @@ namespace Grav\Common;
|
|||||||
class Composer
|
class Composer
|
||||||
{
|
{
|
||||||
/** @const Default composer location */
|
/** @const Default composer location */
|
||||||
const DEFAULT_PATH = "bin/composer.phar";
|
const DEFAULT_PATH = 'bin/composer.phar';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the location of composer.
|
* Returns the location of composer.
|
||||||
@@ -20,12 +21,12 @@ class Composer
|
|||||||
*/
|
*/
|
||||||
public static function getComposerLocation()
|
public static function getComposerLocation()
|
||||||
{
|
{
|
||||||
if (!function_exists('shell_exec') || strtolower(substr(PHP_OS, 0, 3)) === 'win') {
|
if (!\function_exists('shell_exec') || stripos(PHP_OS, 'win') === 0) {
|
||||||
return self::DEFAULT_PATH;
|
return self::DEFAULT_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for global composer install
|
// check for global composer install
|
||||||
$path = trim(shell_exec("command -v composer"));
|
$path = trim(shell_exec('command -v composer'));
|
||||||
|
|
||||||
// fall back to grav bundled composer
|
// fall back to grav bundled composer
|
||||||
if (!$path || !preg_match('/(composer|composer\.phar)$/', $path)) {
|
if (!$path || !preg_match('/(composer|composer\.phar)$/', $path)) {
|
||||||
@@ -46,7 +47,7 @@ class Composer
|
|||||||
$composer = static::getComposerLocation();
|
$composer = static::getComposerLocation();
|
||||||
|
|
||||||
if ($composer !== static::DEFAULT_PATH && is_executable($composer)) {
|
if ($composer !== static::DEFAULT_PATH && is_executable($composer)) {
|
||||||
$file = fopen($composer, 'r');
|
$file = fopen($composer, 'rb');
|
||||||
$firstLine = fgets($file);
|
$firstLine = fgets($file);
|
||||||
fclose($file);
|
fclose($file);
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -128,7 +129,7 @@ abstract class CompiledBase
|
|||||||
*/
|
*/
|
||||||
public function checksum()
|
public function checksum()
|
||||||
{
|
{
|
||||||
if (!isset($this->checksum)) {
|
if (null === $this->checksum) {
|
||||||
$this->checksum = md5(json_encode($this->files) . $this->version);
|
$this->checksum = md5(json_encode($this->files) . $this->version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,11 +198,9 @@ abstract class CompiledBase
|
|||||||
|
|
||||||
$cache = include $filename;
|
$cache = include $filename;
|
||||||
if (
|
if (
|
||||||
!is_array($cache)
|
!\is_array($cache)
|
||||||
|| !isset($cache['checksum'])
|
|| !isset($cache['checksum'], $cache['data'], $cache['@class'])
|
||||||
|| !isset($cache['data'])
|
|| $cache['@class'] !== \get_class($this)
|
||||||
|| !isset($cache['@class'])
|
|
||||||
|| $cache['@class'] != get_class($this)
|
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -212,7 +211,7 @@ abstract class CompiledBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->createObject($cache['data']);
|
$this->createObject($cache['data']);
|
||||||
$this->timestamp = isset($cache['timestamp']) ? $cache['timestamp'] : 0;
|
$this->timestamp = $cache['timestamp'] ?? 0;
|
||||||
|
|
||||||
$this->finalizeObject();
|
$this->finalizeObject();
|
||||||
|
|
||||||
@@ -243,7 +242,7 @@ abstract class CompiledBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cache = [
|
$cache = [
|
||||||
'@class' => get_class($this),
|
'@class' => \get_class($this),
|
||||||
'timestamp' => time(),
|
'timestamp' => time(),
|
||||||
'checksum' => $this->checksum(),
|
'checksum' => $this->checksum(),
|
||||||
'files' => $this->files,
|
'files' => $this->files,
|
||||||
|
|||||||
@@ -1,27 +1,30 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Grav\Common\Config;
|
namespace Grav\Common\Config;
|
||||||
|
|
||||||
use Grav\Common\Data\Blueprint;
|
use Grav\Common\Data\Blueprint;
|
||||||
use Grav\Common\Data\BlueprintSchema;
|
use Grav\Common\Data\BlueprintSchema;
|
||||||
use Grav\Common\Grav;
|
use Grav\Common\Grav;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CompiledBlueprints
|
||||||
|
* @package Grav\Common\Config
|
||||||
|
*/
|
||||||
class CompiledBlueprints extends CompiledBase
|
class CompiledBlueprints extends CompiledBase
|
||||||
{
|
{
|
||||||
/**
|
public function __construct($cacheFolder, array $files, $path)
|
||||||
* @var int Version number for the compiled file.
|
{
|
||||||
*/
|
parent::__construct($cacheFolder, $files, $path);
|
||||||
public $version = 2;
|
|
||||||
|
|
||||||
/**
|
$this->version = 2;
|
||||||
* @var BlueprintSchema Blueprints object.
|
}
|
||||||
*/
|
|
||||||
protected $object;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns checksum from the configuration files.
|
* Returns checksum from the configuration files.
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -12,16 +13,6 @@ use Grav\Common\File\CompiledYamlFile;
|
|||||||
|
|
||||||
class CompiledConfig extends CompiledBase
|
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.
|
* @var callable Blueprints loader.
|
||||||
*/
|
*/
|
||||||
@@ -32,6 +23,13 @@ class CompiledConfig extends CompiledBase
|
|||||||
*/
|
*/
|
||||||
protected $withDefaults;
|
protected $withDefaults;
|
||||||
|
|
||||||
|
public function __construct($cacheFolder, array $files, $path)
|
||||||
|
{
|
||||||
|
parent::__construct($cacheFolder, $files, $path);
|
||||||
|
|
||||||
|
$this->version = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set blueprints for the configuration.
|
* Set blueprints for the configuration.
|
||||||
*
|
*
|
||||||
@@ -63,7 +61,7 @@ class CompiledConfig extends CompiledBase
|
|||||||
*/
|
*/
|
||||||
protected function createObject(array $data = [])
|
protected function createObject(array $data = [])
|
||||||
{
|
{
|
||||||
if ($this->withDefaults && empty($data) && is_callable($this->callable)) {
|
if ($this->withDefaults && empty($data) && \is_callable($this->callable)) {
|
||||||
$blueprints = $this->callable;
|
$blueprints = $this->callable;
|
||||||
$data = $blueprints()->getDefaults();
|
$data = $blueprints()->getDefaults();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -12,15 +13,12 @@ use Grav\Common\File\CompiledYamlFile;
|
|||||||
|
|
||||||
class CompiledLanguages extends CompiledBase
|
class CompiledLanguages extends CompiledBase
|
||||||
{
|
{
|
||||||
/**
|
public function __construct($cacheFolder, array $files, $path)
|
||||||
* @var int Version number for the compiled file.
|
{
|
||||||
*/
|
parent::__construct($cacheFolder, $files, $path);
|
||||||
public $version = 1;
|
|
||||||
|
|
||||||
/**
|
$this->version = 1;
|
||||||
* @var Languages Configuration object.
|
}
|
||||||
*/
|
|
||||||
protected $object;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create configuration object.
|
* Create configuration object.
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -16,14 +17,24 @@ use Grav\Common\Utils;
|
|||||||
|
|
||||||
class Config extends Data
|
class Config extends Data
|
||||||
{
|
{
|
||||||
|
public $environment;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $key;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $checksum;
|
protected $checksum;
|
||||||
protected $modified = false;
|
/** @var int */
|
||||||
protected $timestamp = 0;
|
protected $timestamp = 0;
|
||||||
|
/** @var bool */
|
||||||
|
protected $modified = false;
|
||||||
|
|
||||||
public function key()
|
public function key()
|
||||||
{
|
{
|
||||||
return $this->checksum();
|
if (null === $this->key) {
|
||||||
|
$this->key = md5($this->checksum . $this->timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function checksum($checksum = null)
|
public function checksum($checksum = null)
|
||||||
@@ -90,7 +101,7 @@ class Config extends Data
|
|||||||
{
|
{
|
||||||
$setup = Grav::instance()['setup']->toArray();
|
$setup = Grav::instance()['setup']->toArray();
|
||||||
foreach ($setup as $key => $value) {
|
foreach ($setup as $key => $value) {
|
||||||
if ($key === 'streams' || !is_array($value)) {
|
if ($key === 'streams' || !\is_array($value)) {
|
||||||
// Optimized as streams and simple values are fully defined in setup.
|
// Optimized as streams and simple values are fully defined in setup.
|
||||||
$this->items[$key] = $value;
|
$this->items[$key] = $value;
|
||||||
} else {
|
} else {
|
||||||
@@ -98,17 +109,18 @@ class Config extends Data
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override the media.upload_limit based on PHP values
|
// Legacy value - Override the media.upload_limit based on PHP values
|
||||||
$upload_limit = Utils::getUploadLimit();
|
$this->items['system']['media']['upload_limit'] = Utils::getUploadLimit();
|
||||||
$this->items['system']['media']['upload_limit'] = $upload_limit > 0 ? $upload_limit : 1024*1024*1024;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @deprecated
|
* @deprecated 1.5 Use Grav::instance()['languages'] instead.
|
||||||
*/
|
*/
|
||||||
public function getLanguages()
|
public function getLanguages()
|
||||||
{
|
{
|
||||||
|
user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.5, use Grav::instance()[\'languages\'] instead', E_USER_DEPRECATED);
|
||||||
|
|
||||||
return Grav::instance()['languages'];
|
return Grav::instance()['languages'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -13,6 +14,22 @@ use Grav\Common\Utils;
|
|||||||
|
|
||||||
class Languages extends Data
|
class Languages extends Data
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
protected $checksum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
protected $modified;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
protected $timestamp;
|
||||||
|
|
||||||
|
|
||||||
public function checksum($checksum = null)
|
public function checksum($checksum = null)
|
||||||
{
|
{
|
||||||
if ($checksum !== null) {
|
if ($checksum !== null) {
|
||||||
@@ -52,4 +69,15 @@ class Languages extends Data
|
|||||||
{
|
{
|
||||||
$this->items = Utils::arrayMergeRecursiveUnique($this->items, $data);
|
$this->items = Utils::arrayMergeRecursiveUnique($this->items, $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function flattenByLang($lang)
|
||||||
|
{
|
||||||
|
$language = $this->items[$lang];
|
||||||
|
return Utils::arrayFlattenDotNotation($language);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function unflatten($array)
|
||||||
|
{
|
||||||
|
return Utils::arrayUnflattenDotNotation($array);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Config
|
* @package Grav\Common\Config
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -12,11 +13,23 @@ use Grav\Common\File\CompiledYamlFile;
|
|||||||
use Grav\Common\Data\Data;
|
use Grav\Common\Data\Data;
|
||||||
use Grav\Common\Utils;
|
use Grav\Common\Utils;
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
use RocketTheme\Toolbox\File\YamlFile;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
class Setup extends Data
|
class Setup extends Data
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var array Environment aliases normalized to lower case.
|
||||||
|
*/
|
||||||
|
public static $environments = [
|
||||||
|
'' => 'unknown',
|
||||||
|
'127.0.0.1' => 'localhost',
|
||||||
|
'::1' => 'localhost'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string Current environment normalized to lower case.
|
||||||
|
*/
|
||||||
public static $environment;
|
public static $environment;
|
||||||
|
|
||||||
protected $streams = [
|
protected $streams = [
|
||||||
@@ -38,7 +51,7 @@ class Setup extends Data
|
|||||||
// If not defined, environment will be set up in the constructor.
|
// If not defined, environment will be set up in the constructor.
|
||||||
],
|
],
|
||||||
'asset' => [
|
'asset' => [
|
||||||
'type' => 'ReadOnlyStream',
|
'type' => 'Stream',
|
||||||
'prefixes' => [
|
'prefixes' => [
|
||||||
'' => ['assets'],
|
'' => ['assets'],
|
||||||
]
|
]
|
||||||
@@ -109,7 +122,7 @@ class Setup extends Data
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
'image' => [
|
'image' => [
|
||||||
'type' => 'ReadOnlyStream',
|
'type' => 'Stream',
|
||||||
'prefixes' => [
|
'prefixes' => [
|
||||||
'' => ['user://images', 'system://images']
|
'' => ['user://images', 'system://images']
|
||||||
]
|
]
|
||||||
@@ -120,6 +133,13 @@ class Setup extends Data
|
|||||||
'' => ['user://pages']
|
'' => ['user://pages']
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
'user-data' => [
|
||||||
|
'type' => 'Stream',
|
||||||
|
'force' => true,
|
||||||
|
'prefixes' => [
|
||||||
|
'' => ['user://data']
|
||||||
|
]
|
||||||
|
],
|
||||||
'account' => [
|
'account' => [
|
||||||
'type' => 'ReadOnlyStream',
|
'type' => 'ReadOnlyStream',
|
||||||
'prefixes' => [
|
'prefixes' => [
|
||||||
@@ -133,12 +153,26 @@ class Setup extends Data
|
|||||||
*/
|
*/
|
||||||
public function __construct($container)
|
public function __construct($container)
|
||||||
{
|
{
|
||||||
$environment = null !== static::$environment ? static::$environment : ($container['uri']->environment() ?: 'localhost');
|
// If no environment is set, make sure we get one (CLI or hostname).
|
||||||
|
if (!static::$environment) {
|
||||||
|
if (\defined('GRAV_CLI')) {
|
||||||
|
static::$environment = 'cli';
|
||||||
|
} else {
|
||||||
|
/** @var ServerRequestInterface $request */
|
||||||
|
$request = $container['request'];
|
||||||
|
$host = $request->getUri()->getHost();
|
||||||
|
|
||||||
|
static::$environment = Utils::substrToString($host, ':');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve server aliases to the proper environment.
|
||||||
|
$environment = $this->environments[static::$environment] ?? static::$environment;
|
||||||
|
|
||||||
// Pre-load setup.php which contains our initial configuration.
|
// Pre-load setup.php which contains our initial configuration.
|
||||||
// Configuration may contain dynamic parts, which is why we need to always load it.
|
// Configuration may contain dynamic parts, which is why we need to always load it.
|
||||||
// If "GRAVE_SETUP_PATH" has been defined, use it, otherwise use defaults.
|
// If "GRAV_SETUP_PATH" has been defined, use it, otherwise use defaults.
|
||||||
$file = defined('GRAV_SETUP_PATH') ? GRAV_SETUP_PATH : GRAV_ROOT . '/setup.php';
|
$file = \defined('GRAV_SETUP_PATH') ? GRAV_SETUP_PATH : GRAV_ROOT . '/setup.php';
|
||||||
$setup = is_file($file) ? (array) include $file : [];
|
$setup = is_file($file) ? (array) include $file : [];
|
||||||
|
|
||||||
// Add default streams defined in beginning of the class.
|
// Add default streams defined in beginning of the class.
|
||||||
@@ -151,8 +185,8 @@ class Setup extends Data
|
|||||||
parent::__construct($setup);
|
parent::__construct($setup);
|
||||||
|
|
||||||
// Set up environment.
|
// Set up environment.
|
||||||
$this->def('environment', $environment ?: 'cli');
|
$this->def('environment', $environment);
|
||||||
$this->def('streams.schemes.environment.prefixes', ['' => $environment ? ["user://{$this->environment}"] : []]);
|
$this->def('streams.schemes.environment.prefixes', ['' => ["user://{$this->get('environment')}"]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -212,8 +246,8 @@ class Setup extends Data
|
|||||||
$locator->addPath($scheme, '', $config['paths']);
|
$locator->addPath($scheme, '', $config['paths']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$override = isset($config['override']) ? $config['override'] : false;
|
$override = $config['override'] ?? false;
|
||||||
$force = isset($config['force']) ? $config['force'] : false;
|
$force = $config['force'] ?? false;
|
||||||
|
|
||||||
if (isset($config['prefixes'])) {
|
if (isset($config['prefixes'])) {
|
||||||
foreach ((array)$config['prefixes'] as $prefix => $paths) {
|
foreach ((array)$config['prefixes'] as $prefix => $paths) {
|
||||||
@@ -232,7 +266,7 @@ class Setup extends Data
|
|||||||
{
|
{
|
||||||
$schemes = [];
|
$schemes = [];
|
||||||
foreach ((array) $this->get('streams.schemes') as $scheme => $config) {
|
foreach ((array) $this->get('streams.schemes') as $scheme => $config) {
|
||||||
$type = !empty($config['type']) ? $config['type'] : 'ReadOnlyStream';
|
$type = $config['type'] ?? 'ReadOnlyStream';
|
||||||
if ($type[0] !== '\\') {
|
if ($type[0] !== '\\') {
|
||||||
$type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type;
|
$type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type;
|
||||||
}
|
}
|
||||||
@@ -251,8 +285,8 @@ class Setup extends Data
|
|||||||
*/
|
*/
|
||||||
protected function check(UniformResourceLocator $locator)
|
protected function check(UniformResourceLocator $locator)
|
||||||
{
|
{
|
||||||
$streams = isset($this->items['streams']['schemes']) ? $this->items['streams']['schemes'] : null;
|
$streams = $this->items['streams']['schemes'] ?? null;
|
||||||
if (!is_array($streams)) {
|
if (!\is_array($streams)) {
|
||||||
throw new \InvalidArgumentException('Configuration is missing streams.schemes!');
|
throw new \InvalidArgumentException('Configuration is missing streams.schemes!');
|
||||||
}
|
}
|
||||||
$diff = array_keys(array_diff_key($this->streams, $streams));
|
$diff = array_keys(array_diff_key($this->streams, $streams));
|
||||||
@@ -262,6 +296,7 @@ class Setup extends Data
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
if (!$locator->findResource('environment://config', true)) {
|
if (!$locator->findResource('environment://config', true)) {
|
||||||
// If environment does not have its own directory, remove it from the lookup.
|
// If environment does not have its own directory, remove it from the lookup.
|
||||||
$this->set('streams.schemes.environment.prefixes', ['config' => []]);
|
$this->set('streams.schemes.environment.prefixes', ['config' => []]);
|
||||||
@@ -270,10 +305,17 @@ class Setup extends Data
|
|||||||
|
|
||||||
// Create security.yaml if it doesn't exist.
|
// Create security.yaml if it doesn't exist.
|
||||||
$filename = $locator->findResource('config://security.yaml', true, true);
|
$filename = $locator->findResource('config://security.yaml', true, true);
|
||||||
$file = YamlFile::instance($filename);
|
$security_file = CompiledYamlFile::instance($filename);
|
||||||
if (!$file->exists()) {
|
$security_content = (array)$security_file->content();
|
||||||
$file->save(['salt' => Utils::generateRandomString(14)]);
|
|
||||||
$file->free();
|
if (!isset($security_content['salt'])) {
|
||||||
|
$security_content = array_merge($security_content, ['salt' => Utils::generateRandomString(14)]);
|
||||||
|
$security_file->content($security_content);
|
||||||
|
$security_file->save();
|
||||||
|
$security_file->free();
|
||||||
|
}
|
||||||
|
} catch (\RuntimeException $e) {
|
||||||
|
throw new \RuntimeException(sprintf('Grav failed to initialize: %s', $e->getMessage()), 500, $e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -10,21 +11,37 @@ namespace Grav\Common\Data;
|
|||||||
|
|
||||||
use Grav\Common\File\CompiledYamlFile;
|
use Grav\Common\File\CompiledYamlFile;
|
||||||
use Grav\Common\Grav;
|
use Grav\Common\Grav;
|
||||||
|
use Grav\Common\User\Interfaces\UserInterface;
|
||||||
use RocketTheme\Toolbox\Blueprints\BlueprintForm;
|
use RocketTheme\Toolbox\Blueprints\BlueprintForm;
|
||||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||||
|
|
||||||
class Blueprint extends BlueprintForm
|
class Blueprint extends BlueprintForm
|
||||||
{
|
{
|
||||||
/**
|
/** @var string */
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $context = 'blueprints://';
|
protected $context = 'blueprints://';
|
||||||
|
|
||||||
/**
|
protected $scope;
|
||||||
* @var BlueprintSchema
|
|
||||||
*/
|
/** @var BlueprintSchema */
|
||||||
protected $blueprintSchema;
|
protected $blueprintSchema;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected $defaults;
|
||||||
|
|
||||||
|
protected $handlers = [];
|
||||||
|
|
||||||
|
public function __clone()
|
||||||
|
{
|
||||||
|
if ($this->blueprintSchema) {
|
||||||
|
$this->blueprintSchema = clone $this->blueprintSchema;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setScope($scope)
|
||||||
|
{
|
||||||
|
$this->scope = $scope;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set default values for field types.
|
* Set default values for field types.
|
||||||
*
|
*
|
||||||
@@ -51,7 +68,60 @@ class Blueprint extends BlueprintForm
|
|||||||
{
|
{
|
||||||
$this->initInternals();
|
$this->initInternals();
|
||||||
|
|
||||||
return $this->blueprintSchema->getDefaults();
|
if (null === $this->defaults) {
|
||||||
|
$this->defaults = $this->blueprintSchema->getDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->defaults;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize blueprints with its dynamic fields.
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
foreach ($this->dynamic as $key => $data) {
|
||||||
|
// Locate field.
|
||||||
|
$path = explode('/', $key);
|
||||||
|
$current = &$this->items;
|
||||||
|
|
||||||
|
foreach ($path as $field) {
|
||||||
|
if (\is_object($current)) {
|
||||||
|
// Handle objects.
|
||||||
|
if (!isset($current->{$field})) {
|
||||||
|
$current->{$field} = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$current = &$current->{$field};
|
||||||
|
} else {
|
||||||
|
// Handle arrays and scalars.
|
||||||
|
if (!\is_array($current)) {
|
||||||
|
$current = [$field => []];
|
||||||
|
} elseif (!isset($current[$field])) {
|
||||||
|
$current[$field] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$current = &$current[$field];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set dynamic property.
|
||||||
|
foreach ($data as $property => $call) {
|
||||||
|
$action = $call['action'];
|
||||||
|
$method = 'dynamic' . ucfirst($action);
|
||||||
|
|
||||||
|
if (isset($this->handlers[$action])) {
|
||||||
|
$callable = $this->handlers[$action];
|
||||||
|
$callable($current, $property, $call);
|
||||||
|
} elseif (method_exists($this, $method)) {
|
||||||
|
$this->{$method}($current, $property, $call);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,6 +140,20 @@ class Blueprint extends BlueprintForm
|
|||||||
return $this->blueprintSchema->mergeData($data1, $data2, $name, $separator);
|
return $this->blueprintSchema->mergeData($data1, $data2, $name, $separator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process data coming from a form.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @param array $toggles
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function processForm(array $data, array $toggles = [])
|
||||||
|
{
|
||||||
|
$this->initInternals();
|
||||||
|
|
||||||
|
return $this->blueprintSchema->processForm($data, $toggles);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return data fields that do not exist in blueprints.
|
* Return data fields that do not exist in blueprints.
|
||||||
*
|
*
|
||||||
@@ -101,15 +185,32 @@ class Blueprint extends BlueprintForm
|
|||||||
* Filter data by using blueprints.
|
* Filter data by using blueprints.
|
||||||
*
|
*
|
||||||
* @param array $data
|
* @param array $data
|
||||||
|
* @param bool $missingValuesAsNull
|
||||||
|
* @param bool $keepEmptyValues
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function filter(array $data)
|
public function filter(array $data, bool $missingValuesAsNull = false, bool $keepEmptyValues = false)
|
||||||
{
|
{
|
||||||
$this->initInternals();
|
$this->initInternals();
|
||||||
|
|
||||||
return $this->blueprintSchema->filter($data);
|
return $this->blueprintSchema->filter($data, $missingValuesAsNull, $keepEmptyValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten data by using blueprints.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function flattenData(array $data)
|
||||||
|
{
|
||||||
|
$this->initInternals();
|
||||||
|
|
||||||
|
return $this->blueprintSchema->flattenData($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return blueprint data schema.
|
* Return blueprint data schema.
|
||||||
*
|
*
|
||||||
@@ -122,20 +223,28 @@ class Blueprint extends BlueprintForm
|
|||||||
return $this->blueprintSchema;
|
return $this->blueprintSchema;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addDynamicHandler(string $name, callable $callable): void
|
||||||
|
{
|
||||||
|
$this->handlers[$name] = $callable;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize validator.
|
* Initialize validator.
|
||||||
*/
|
*/
|
||||||
protected function initInternals()
|
protected function initInternals()
|
||||||
{
|
{
|
||||||
if (!isset($this->blueprintSchema)) {
|
if (null === $this->blueprintSchema) {
|
||||||
$types = Grav::instance()['plugins']->formFieldTypes;
|
$types = Grav::instance()['plugins']->formFieldTypes;
|
||||||
|
|
||||||
$this->blueprintSchema = new BlueprintSchema;
|
$this->blueprintSchema = new BlueprintSchema;
|
||||||
|
|
||||||
if ($types) {
|
if ($types) {
|
||||||
$this->blueprintSchema->setTypes($types);
|
$this->blueprintSchema->setTypes($types);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->blueprintSchema->embed('', $this->items);
|
$this->blueprintSchema->embed('', $this->items);
|
||||||
$this->blueprintSchema->init();
|
$this->blueprintSchema->init();
|
||||||
|
$this->defaults = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,17 +271,19 @@ class Blueprint extends BlueprintForm
|
|||||||
/** @var UniformResourceLocator $locator */
|
/** @var UniformResourceLocator $locator */
|
||||||
$locator = Grav::instance()['locator'];
|
$locator = Grav::instance()['locator'];
|
||||||
|
|
||||||
if (is_string($path) && !$locator->isStream($path)) {
|
if (\is_string($path) && !$locator->isStream($path)) {
|
||||||
// Find path overrides.
|
// Find path overrides.
|
||||||
$paths = isset($this->overrides[$path]) ? (array) $this->overrides[$path] : [];
|
$paths = (array) ($this->overrides[$path] ?? null);
|
||||||
|
|
||||||
// Add path pointing to default context.
|
// Add path pointing to default context.
|
||||||
if ($context === null) {
|
if ($context === null) {
|
||||||
$context = $this->context;
|
$context = $this->context;
|
||||||
}
|
}
|
||||||
if ($context && $context[strlen($context)-1] !== '/') {
|
|
||||||
|
if ($context && $context[\strlen($context)-1] !== '/') {
|
||||||
$context .= '/';
|
$context .= '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
$path = $context . $path;
|
$path = $context . $path;
|
||||||
|
|
||||||
if (!preg_match('/\.yaml$/', $path)) {
|
if (!preg_match('/\.yaml$/', $path)) {
|
||||||
@@ -186,7 +297,7 @@ class Blueprint extends BlueprintForm
|
|||||||
|
|
||||||
$files = [];
|
$files = [];
|
||||||
foreach ($paths as $lookup) {
|
foreach ($paths as $lookup) {
|
||||||
if (is_string($lookup) && strpos($lookup, '://')) {
|
if (\is_string($lookup) && strpos($lookup, '://')) {
|
||||||
$files = array_merge($files, $locator->findResources($lookup));
|
$files = array_merge($files, $locator->findResources($lookup));
|
||||||
} else {
|
} else {
|
||||||
$files[] = $lookup;
|
$files[] = $lookup;
|
||||||
@@ -205,27 +316,29 @@ class Blueprint extends BlueprintForm
|
|||||||
{
|
{
|
||||||
$params = $call['params'];
|
$params = $call['params'];
|
||||||
|
|
||||||
if (is_array($params)) {
|
if (\is_array($params)) {
|
||||||
$function = array_shift($params);
|
$function = array_shift($params);
|
||||||
} else {
|
} else {
|
||||||
$function = $params;
|
$function = $params;
|
||||||
$params = [];
|
$params = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
list($o, $f) = preg_split('/::/', $function, 2);
|
[$o, $f] = explode('::', $function, 2);
|
||||||
|
|
||||||
|
$data = null;
|
||||||
if (!$f) {
|
if (!$f) {
|
||||||
if (function_exists($o)) {
|
if (\function_exists($o)) {
|
||||||
$data = call_user_func_array($o, $params);
|
$data = \call_user_func_array($o, $params);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (method_exists($o, $f)) {
|
if (method_exists($o, $f)) {
|
||||||
$data = call_user_func_array(array($o, $f), $params);
|
$data = \call_user_func_array([$o, $f], $params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If function returns a value,
|
// If function returns a value,
|
||||||
if (isset($data)) {
|
if (null !== $data) {
|
||||||
if (isset($field[$property]) && is_array($field[$property]) && is_array($data)) {
|
if (\is_array($data) && isset($field[$property]) && \is_array($field[$property])) {
|
||||||
// Combine field and @data-field together.
|
// Combine field and @data-field together.
|
||||||
$field[$property] += $data;
|
$field[$property] += $data;
|
||||||
} else {
|
} else {
|
||||||
@@ -243,12 +356,75 @@ class Blueprint extends BlueprintForm
|
|||||||
protected function dynamicConfig(array &$field, $property, array &$call)
|
protected function dynamicConfig(array &$field, $property, array &$call)
|
||||||
{
|
{
|
||||||
$value = $call['params'];
|
$value = $call['params'];
|
||||||
|
$default = $field[$property] ?? null;
|
||||||
$default = isset($field[$property]) ? $field[$property] : null;
|
|
||||||
$config = Grav::instance()['config']->get($value, $default);
|
$config = Grav::instance()['config']->get($value, $default);
|
||||||
|
|
||||||
if (!is_null($config)) {
|
if (null !== $config) {
|
||||||
$field[$property] = $config;
|
$field[$property] = $config;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $field
|
||||||
|
* @param string $property
|
||||||
|
* @param array $call
|
||||||
|
*/
|
||||||
|
protected function dynamicSecurity(array &$field, $property, array &$call)
|
||||||
|
{
|
||||||
|
if ($property || !empty($field['validate']['ignore'])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$grav = Grav::instance();
|
||||||
|
$actions = (array)$call['params'];
|
||||||
|
|
||||||
|
/** @var UserInterface $user */
|
||||||
|
if (isset($grav['user'])) {
|
||||||
|
$user = Grav::instance()['user'];
|
||||||
|
foreach ($actions as $action) {
|
||||||
|
if (!$user->authorize($action)) {
|
||||||
|
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $field
|
||||||
|
* @param string $property
|
||||||
|
* @param array $call
|
||||||
|
*/
|
||||||
|
protected function dynamicScope(array &$field, $property, array &$call)
|
||||||
|
{
|
||||||
|
if ($property && $property !== 'ignore') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scopes = (array)$call['params'];
|
||||||
|
$matches = \in_array($this->scope, $scopes, true);
|
||||||
|
if ($this->scope && $property !== 'ignore') {
|
||||||
|
$matches = !$matches;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($matches) {
|
||||||
|
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addPropertyRecursive(array &$field, $property, $value)
|
||||||
|
{
|
||||||
|
if (\is_array($value) && isset($field[$property]) && \is_array($field[$property])) {
|
||||||
|
$field[$property] = array_merge_recursive($field[$property], $value);
|
||||||
|
} else {
|
||||||
|
$field[$property] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($field['fields'])) {
|
||||||
|
foreach ($field['fields'] as $key => &$child) {
|
||||||
|
$this->addPropertyRecursive($child, $property, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -26,6 +27,23 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
|||||||
'fields' => true
|
'fields' => true
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getTypes()
|
||||||
|
{
|
||||||
|
return $this->types;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getType($name)
|
||||||
|
{
|
||||||
|
return $this->types[$name] ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate data against blueprints.
|
* Validate data against blueprints.
|
||||||
*
|
*
|
||||||
@@ -47,35 +65,90 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter data by using blueprints.
|
|
||||||
*
|
|
||||||
* @param array $data
|
* @param array $data
|
||||||
|
* @param array $toggles
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function filter(array $data)
|
public function processForm(array $data, array $toggles = [])
|
||||||
{
|
{
|
||||||
return $this->filterArray($data, $this->nested);
|
return $this->processFormRecursive($data, $toggles, $this->nested);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter data by using blueprints.
|
||||||
|
*
|
||||||
|
* @param array $data Incoming data, for example from a form.
|
||||||
|
* @param bool $missingValuesAsNull Include missing values as nulls.
|
||||||
|
* @param bool $keepEmptyValues Include empty values.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function filter(array $data, $missingValuesAsNull = false, $keepEmptyValues = false)
|
||||||
|
{
|
||||||
|
return $this->filterArray($data, $this->nested, $missingValuesAsNull, $keepEmptyValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten data by using blueprints.
|
||||||
|
*
|
||||||
|
* @param array $data Data to be flattened.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function flattenData(array $data)
|
||||||
|
{
|
||||||
|
return $this->flattenArray($data, $this->nested, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param array $data
|
||||||
* @param array $rules
|
* @param array $rules
|
||||||
* @returns array
|
* @param string $prefix
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function flattenArray(array $data, array $rules, string $prefix)
|
||||||
|
{
|
||||||
|
$array = [];
|
||||||
|
|
||||||
|
foreach ($data as $key => $field) {
|
||||||
|
$val = $rules[$key] ?? $rules['*'] ?? null;
|
||||||
|
$rule = is_string($val) ? $this->items[$val] : null;
|
||||||
|
|
||||||
|
if ($rule || isset($val['*'])) {
|
||||||
|
// Item has been defined in blueprints.
|
||||||
|
$array[$prefix.$key] = $field;
|
||||||
|
} elseif (is_array($field) && is_array($val)) {
|
||||||
|
// Array has been defined in blueprints.
|
||||||
|
$array += $this->flattenArray($field, $val, $prefix . $key . '.');
|
||||||
|
} else {
|
||||||
|
// Undefined/extra item.
|
||||||
|
$array[$prefix.$key] = $field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @param array $rules
|
||||||
|
* @return array
|
||||||
* @throws \RuntimeException
|
* @throws \RuntimeException
|
||||||
* @internal
|
|
||||||
*/
|
*/
|
||||||
protected function validateArray(array $data, array $rules)
|
protected function validateArray(array $data, array $rules)
|
||||||
{
|
{
|
||||||
$messages = $this->checkRequired($data, $rules);
|
$messages = $this->checkRequired($data, $rules);
|
||||||
|
|
||||||
foreach ($data as $key => $field) {
|
foreach ($data as $key => $field) {
|
||||||
$val = isset($rules[$key]) ? $rules[$key] : (isset($rules['*']) ? $rules['*'] : null);
|
$val = $rules[$key] ?? $rules['*'] ?? null;
|
||||||
$rule = is_string($val) ? $this->items[$val] : null;
|
$rule = \is_string($val) ? $this->items[$val] : null;
|
||||||
|
|
||||||
if ($rule) {
|
if ($rule) {
|
||||||
// Item has been defined in blueprints.
|
// Item has been defined in blueprints.
|
||||||
|
if (!empty($rule['validate']['ignore'])) {
|
||||||
|
// Skip validation in the ignored field.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$messages += Validation::validate($field, $rule);
|
$messages += Validation::validate($field, $rule);
|
||||||
} elseif (is_array($field) && is_array($val)) {
|
} elseif (\is_array($field) && \is_array($val)) {
|
||||||
// Array has been defined in blueprints.
|
// Array has been defined in blueprints.
|
||||||
$messages += $this->validateArray($field, $val);
|
$messages += $this->validateArray($field, $val);
|
||||||
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
|
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
|
||||||
@@ -90,32 +163,97 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
|||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param array $data
|
||||||
* @param array $rules
|
* @param array $rules
|
||||||
|
* @param bool $missingValuesAsNull
|
||||||
|
* @param bool $keepEmptyValues
|
||||||
* @return array
|
* @return array
|
||||||
* @internal
|
|
||||||
*/
|
*/
|
||||||
protected function filterArray(array $data, array $rules)
|
protected function filterArray(array $data, array $rules, $missingValuesAsNull, $keepEmptyValues)
|
||||||
{
|
{
|
||||||
$results = array();
|
$results = [];
|
||||||
|
|
||||||
|
if ($missingValuesAsNull) {
|
||||||
|
// First pass is to fill up all the fields with null. This is done to lock the ordering of the fields.
|
||||||
|
foreach ($rules as $key => $rule) {
|
||||||
|
if ($key && !isset($results[$key])) {
|
||||||
|
$val = $rules[$key] ?? $rules['*'] ?? null;
|
||||||
|
$rule = \is_string($val) ? $this->items[$val] : null;
|
||||||
|
|
||||||
|
if (empty($rule['validate']['ignore'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($data as $key => $field) {
|
foreach ($data as $key => $field) {
|
||||||
$val = isset($rules[$key]) ? $rules[$key] : (isset($rules['*']) ? $rules['*'] : null);
|
$val = $rules[$key] ?? $rules['*'] ?? null;
|
||||||
$rule = is_string($val) ? $this->items[$val] : null;
|
$rule = \is_string($val) ? $this->items[$val] : null;
|
||||||
|
|
||||||
if ($rule) {
|
if ($rule) {
|
||||||
// Item has been defined in blueprints.
|
// Item has been defined in blueprints.
|
||||||
$field = Validation::filter($field, $rule);
|
if (!empty($rule['validate']['ignore'])) {
|
||||||
} elseif (is_array($field) && is_array($val)) {
|
// Skip any data in the ignored field.
|
||||||
// Array has been defined in blueprints.
|
unset($results[$key]);
|
||||||
$field = $this->filterArray($field, $val);
|
continue;
|
||||||
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
|
|
||||||
$field = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($field) && (!is_array($field) || !empty($field))) {
|
$field = Validation::filter($field, $rule);
|
||||||
|
} elseif (\is_array($field) && \is_array($val)) {
|
||||||
|
// Array has been defined in blueprints.
|
||||||
|
$field = $this->filterArray($field, $val, $missingValuesAsNull, $keepEmptyValues);
|
||||||
|
|
||||||
|
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
|
||||||
|
// Skip any extra data.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($keepEmptyValues || (null !== $field && (!\is_array($field) || !empty($field)))) {
|
||||||
$results[$key] = $field;
|
$results[$key] = $field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $results;
|
return $results ?: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array|null $data
|
||||||
|
* @param array $toggles
|
||||||
|
* @param array $nested
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
protected function processFormRecursive(?array $data, array $toggles, array $nested)
|
||||||
|
{
|
||||||
|
foreach ($nested as $key => $value) {
|
||||||
|
if ($key === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($key === '*') {
|
||||||
|
// TODO: Add support to collections.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Recursively fetch the items.
|
||||||
|
$data[$key] = $this->processFormRecursive($data[$key] ?? null, $toggles[$key] ?? [], $value);
|
||||||
|
} else {
|
||||||
|
$field = $this->get($value);
|
||||||
|
// Do not add the field if:
|
||||||
|
if (
|
||||||
|
// Not an input field
|
||||||
|
!$field
|
||||||
|
// Field validation is set to be ignored
|
||||||
|
|| !empty($field['validate']['ignore'])
|
||||||
|
// Field is toggleable and the toggle is turned off
|
||||||
|
|| (!empty($field['toggleable']) && empty($toggles[$key]))
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isset($data[$key])) {
|
||||||
|
$data[$key] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -128,10 +266,18 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
|||||||
$messages = [];
|
$messages = [];
|
||||||
|
|
||||||
foreach ($fields as $name => $field) {
|
foreach ($fields as $name => $field) {
|
||||||
if (!is_string($field)) {
|
if (!\is_string($field)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$field = $this->items[$field];
|
$field = $this->items[$field];
|
||||||
|
|
||||||
|
// Skip ignored field, it will not be required.
|
||||||
|
if (!empty($field['validate']['ignore'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if required.
|
||||||
if (isset($field['validate']['required'])
|
if (isset($field['validate']['required'])
|
||||||
&& $field['validate']['required'] === true) {
|
&& $field['validate']['required'] === true) {
|
||||||
|
|
||||||
@@ -142,9 +288,9 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = isset($field['label']) ? $field['label'] : $field['name'];
|
$value = $field['label'] ?? $field['name'];
|
||||||
$language = Grav::instance()['language'];
|
$language = Grav::instance()['language'];
|
||||||
$message = sprintf($language->translate('FORM.MISSING_REQUIRED_FIELD', null, true) . ' %s', $language->translate($value));
|
$message = sprintf($language->translate('GRAV.FORM.MISSING_REQUIRED_FIELD', null, true) . ' %s', $language->translate($value));
|
||||||
$messages[$field['name']][] = $message;
|
$messages[$field['name']][] = $message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,7 +307,7 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
|
|||||||
{
|
{
|
||||||
$value = $call['params'];
|
$value = $call['params'];
|
||||||
|
|
||||||
$default = isset($field[$property]) ? $field[$property] : null;
|
$default = $field[$property] ?? null;
|
||||||
$config = Grav::instance()['config']->get($value, $default);
|
$config = Grav::instance()['config']->get($value, $default);
|
||||||
|
|
||||||
if (null !== $config) {
|
if (null !== $config) {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -13,8 +14,11 @@ use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
|||||||
|
|
||||||
class Blueprints
|
class Blueprints
|
||||||
{
|
{
|
||||||
|
/** @var array|string */
|
||||||
protected $search;
|
protected $search;
|
||||||
|
/** @var array */
|
||||||
protected $types;
|
protected $types;
|
||||||
|
/** @var array */
|
||||||
protected $instances = [];
|
protected $instances = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,7 +53,7 @@ class Blueprints
|
|||||||
public function types()
|
public function types()
|
||||||
{
|
{
|
||||||
if ($this->types === null) {
|
if ($this->types === null) {
|
||||||
$this->types = array();
|
$this->types = [];
|
||||||
|
|
||||||
$grav = Grav::instance();
|
$grav = Grav::instance();
|
||||||
|
|
||||||
@@ -87,7 +91,7 @@ class Blueprints
|
|||||||
{
|
{
|
||||||
$blueprint = new Blueprint($name);
|
$blueprint = new Blueprint($name);
|
||||||
|
|
||||||
if (is_array($this->search) || is_object($this->search)) {
|
if (\is_array($this->search) || \is_object($this->search)) {
|
||||||
// Page types.
|
// Page types.
|
||||||
$blueprint->setOverrides($this->search);
|
$blueprint->setOverrides($this->search);
|
||||||
$blueprint->setContext('blueprints://pages');
|
$blueprint->setContext('blueprints://pages');
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -15,28 +16,27 @@ use RocketTheme\Toolbox\ArrayTraits\NestedArrayAccessWithGetters;
|
|||||||
use RocketTheme\Toolbox\File\File;
|
use RocketTheme\Toolbox\File\File;
|
||||||
use RocketTheme\Toolbox\File\FileInterface;
|
use RocketTheme\Toolbox\File\FileInterface;
|
||||||
|
|
||||||
class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
class Data implements DataInterface, \ArrayAccess, \Countable, \JsonSerializable, ExportInterface
|
||||||
{
|
{
|
||||||
use NestedArrayAccessWithGetters, Countable, Export;
|
use NestedArrayAccessWithGetters, Countable, Export;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
protected $gettersVariable = 'items';
|
protected $gettersVariable = 'items';
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
protected $items;
|
protected $items;
|
||||||
|
|
||||||
/**
|
/** @var Blueprint */
|
||||||
* @var Blueprints
|
|
||||||
*/
|
|
||||||
protected $blueprints;
|
protected $blueprints;
|
||||||
|
|
||||||
/**
|
/** @var File */
|
||||||
* @var File
|
|
||||||
*/
|
|
||||||
protected $storage;
|
protected $storage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $items
|
* @param array $items
|
||||||
* @param Blueprint|callable $blueprints
|
* @param Blueprint|callable $blueprints
|
||||||
*/
|
*/
|
||||||
public function __construct(array $items = array(), $blueprints = null)
|
public function __construct(array $items = [], $blueprints = null)
|
||||||
{
|
{
|
||||||
$this->items = $items;
|
$this->items = $items;
|
||||||
$this->blueprints = $blueprints;
|
$this->blueprints = $blueprints;
|
||||||
@@ -70,14 +70,16 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
{
|
{
|
||||||
$old = $this->get($name, null, $separator);
|
$old = $this->get($name, null, $separator);
|
||||||
if ($old !== null) {
|
if ($old !== null) {
|
||||||
if (!is_array($old)) {
|
if (!\is_array($old)) {
|
||||||
throw new \RuntimeException('Value ' . $old);
|
throw new \RuntimeException('Value ' . $old);
|
||||||
}
|
}
|
||||||
if (is_object($value)) {
|
|
||||||
|
if (\is_object($value)) {
|
||||||
$value = (array) $value;
|
$value = (array) $value;
|
||||||
} elseif (!is_array($value)) {
|
} elseif (!\is_array($value)) {
|
||||||
throw new \RuntimeException('Value ' . $value);
|
throw new \RuntimeException('Value ' . $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = $this->blueprints()->mergeData($old, $value, $name, $separator);
|
$value = $this->blueprints()->mergeData($old, $value, $name, $separator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,9 +110,10 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
*/
|
*/
|
||||||
public function joinDefaults($name, $value, $separator = '.')
|
public function joinDefaults($name, $value, $separator = '.')
|
||||||
{
|
{
|
||||||
if (is_object($value)) {
|
if (\is_object($value)) {
|
||||||
$value = (array) $value;
|
$value = (array) $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
$old = $this->get($name, null, $separator);
|
$old = $this->get($name, null, $separator);
|
||||||
if ($old !== null) {
|
if ($old !== null) {
|
||||||
$value = $this->blueprints()->mergeData($value, $old, $name, $separator);
|
$value = $this->blueprints()->mergeData($value, $old, $name, $separator);
|
||||||
@@ -125,16 +128,16 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
* Get value from the configuration and join it with given data.
|
* Get value from the configuration and join it with given data.
|
||||||
*
|
*
|
||||||
* @param string $name Dot separated path to the requested value.
|
* @param string $name Dot separated path to the requested value.
|
||||||
* @param array $value Value to be joined.
|
* @param array|object $value Value to be joined.
|
||||||
* @param string $separator Separator, defaults to '.'
|
* @param string $separator Separator, defaults to '.'
|
||||||
* @return array
|
* @return array
|
||||||
* @throws \RuntimeException
|
* @throws \RuntimeException
|
||||||
*/
|
*/
|
||||||
public function getJoined($name, $value, $separator = '.')
|
public function getJoined($name, $value, $separator = '.')
|
||||||
{
|
{
|
||||||
if (is_object($value)) {
|
if (\is_object($value)) {
|
||||||
$value = (array) $value;
|
$value = (array) $value;
|
||||||
} elseif (!is_array($value)) {
|
} elseif (!\is_array($value)) {
|
||||||
throw new \RuntimeException('Value ' . $value);
|
throw new \RuntimeException('Value ' . $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +148,7 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_array($old)) {
|
if (!\is_array($old)) {
|
||||||
throw new \RuntimeException('Value ' . $old);
|
throw new \RuntimeException('Value ' . $old);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,11 +198,14 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return $this
|
* @return $this
|
||||||
* Filter all items by using blueprints.
|
|
||||||
*/
|
*/
|
||||||
public function filter()
|
public function filter()
|
||||||
{
|
{
|
||||||
$this->items = $this->blueprints()->filter($this->items);
|
$args = func_get_args();
|
||||||
|
$missingValuesAsNull = (bool)(array_shift($args) ?: false);
|
||||||
|
$keepEmptyValues = (bool)(array_shift($args) ?: false);
|
||||||
|
|
||||||
|
$this->items = $this->blueprints()->filter($this->items, $missingValuesAsNull, $keepEmptyValues);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -223,7 +229,7 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
{
|
{
|
||||||
if (!$this->blueprints){
|
if (!$this->blueprints){
|
||||||
$this->blueprints = new Blueprint;
|
$this->blueprints = new Blueprint;
|
||||||
} elseif (is_callable($this->blueprints)) {
|
} elseif (\is_callable($this->blueprints)) {
|
||||||
// Lazy load blueprints.
|
// Lazy load blueprints.
|
||||||
$blueprints = $this->blueprints;
|
$blueprints = $this->blueprints;
|
||||||
$this->blueprints = $blueprints();
|
$this->blueprints = $blueprints();
|
||||||
@@ -282,6 +288,12 @@ class Data implements DataInterface, \ArrayAccess, \Countable, ExportInterface
|
|||||||
if ($storage) {
|
if ($storage) {
|
||||||
$this->storage = $storage;
|
$this->storage = $storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->storage;
|
return $this->storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function jsonSerialize()
|
||||||
|
{
|
||||||
|
return $this->items;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -10,64 +11,59 @@ namespace Grav\Common\Data;
|
|||||||
|
|
||||||
use Grav\Common\Grav;
|
use Grav\Common\Grav;
|
||||||
use Grav\Common\Utils;
|
use Grav\Common\Utils;
|
||||||
use Symfony\Component\Yaml\Exception\ParseException;
|
use Grav\Common\Yaml;
|
||||||
use Symfony\Component\Yaml\Yaml;
|
|
||||||
use RocketTheme\Toolbox\Compat\Yaml\Yaml as FallbackYaml;
|
|
||||||
|
|
||||||
class Validation
|
class Validation
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Validate value against a blueprint field definition.
|
* Validate value against a blueprint field definition.
|
||||||
*
|
*
|
||||||
* @param $value
|
* @param mixed $value
|
||||||
* @param array $field
|
* @param array $field
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function validate($value, array $field)
|
public static function validate($value, array $field)
|
||||||
{
|
{
|
||||||
$messages = [];
|
|
||||||
|
|
||||||
$validate = isset($field['validate']) ? (array) $field['validate'] : [];
|
|
||||||
// Validate type with fallback type text.
|
|
||||||
$type = (string) isset($validate['type']) ? $validate['type'] : $field['type'];
|
|
||||||
$method = 'type'.strtr($type, '-', '_');
|
|
||||||
|
|
||||||
// If value isn't required, we will stop validation if empty value is given.
|
|
||||||
if ((empty($validate['required']) || (isset($validate['required']) && $validate['required'] !== true)) && ($value === null || $value === '' || (($field['type'] === 'checkbox' || $field['type'] === 'switch') && $value == false))) {
|
|
||||||
return $messages;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($field['type'])) {
|
if (!isset($field['type'])) {
|
||||||
$field['type'] = 'text';
|
$field['type'] = 'text';
|
||||||
}
|
}
|
||||||
|
$type = $validate['type'] ?? $field['type'];
|
||||||
|
$validate = (array)($field['validate'] ?? null);
|
||||||
|
$required = $validate['required'] ?? false;
|
||||||
|
|
||||||
|
// If value isn't required, we will stop validation if empty value is given.
|
||||||
|
if ($required !== true && ($value === null || $value === '' || (($field['type'] === 'checkbox' || $field['type'] === 'switch') && $value == false))
|
||||||
|
) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
// Get language class.
|
// Get language class.
|
||||||
$language = Grav::instance()['language'];
|
$language = Grav::instance()['language'];
|
||||||
|
|
||||||
$name = ucfirst(isset($field['label']) ? $field['label'] : $field['name']);
|
$name = ucfirst($field['label'] ?? $field['name']);
|
||||||
$message = (string) isset($field['validate']['message'])
|
$message = (string) isset($field['validate']['message'])
|
||||||
? $language->translate($field['validate']['message'])
|
? $language->translate($field['validate']['message'])
|
||||||
: $language->translate('FORM.INVALID_INPUT', null, true) . ' "' . $language->translate($name) . '"';
|
: $language->translate('GRAV.FORM.INVALID_INPUT', null, true) . ' "' . $language->translate($name) . '"';
|
||||||
|
|
||||||
|
|
||||||
|
// Validate type with fallback type text.
|
||||||
|
$method = 'type' . str_replace('-', '_', $type);
|
||||||
|
|
||||||
// If this is a YAML field validate/filter as such
|
// If this is a YAML field validate/filter as such
|
||||||
if ($type != 'yaml' && isset($field['yaml']) && $field['yaml'] === true) {
|
if (isset($field['yaml']) && $field['yaml'] === true) {
|
||||||
$method = 'typeYaml';
|
$method = 'typeYaml';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method_exists(__CLASS__, $method)) {
|
$messages = [];
|
||||||
$success = self::$method($value, $validate, $field);
|
|
||||||
} else {
|
|
||||||
$success = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
$success = method_exists(__CLASS__, $method) ? self::$method($value, $validate, $field) : true;
|
||||||
if (!$success) {
|
if (!$success) {
|
||||||
$messages[$field['name']][] = $message;
|
$messages[$field['name']][] = $message;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check individual rules.
|
// Check individual rules.
|
||||||
foreach ($validate as $rule => $params) {
|
foreach ($validate as $rule => $params) {
|
||||||
$method = 'validate' . ucfirst(strtr($rule, '-', '_'));
|
$method = 'validate' . ucfirst(str_replace('-', '_', $rule));
|
||||||
|
|
||||||
if (method_exists(__CLASS__, $method)) {
|
if (method_exists(__CLASS__, $method)) {
|
||||||
$success = self::$method($value, $params);
|
$success = self::$method($value, $params);
|
||||||
@@ -90,29 +86,27 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function filter($value, array $field)
|
public static function filter($value, array $field)
|
||||||
{
|
{
|
||||||
$validate = isset($field['validate']) ? (array) $field['validate'] : [];
|
$validate = (array)($field['filter'] ?? $field['validate'] ?? null);
|
||||||
|
|
||||||
// If value isn't required, we will return null if empty value is given.
|
// If value isn't required, we will return null if empty value is given.
|
||||||
if (empty($validate['required']) && ($value === null || $value === '')) {
|
if (($value === null || $value === '') && empty($validate['required'])) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($field['type'])) {
|
if (!isset($field['type'])) {
|
||||||
$field['type'] = 'text';
|
$field['type'] = 'text';
|
||||||
}
|
}
|
||||||
|
$type = $field['filter']['type'] ?? $field['validate']['type'] ?? $field['type'];
|
||||||
|
|
||||||
|
$method = 'filter' . ucfirst(str_replace('-', '_', $type));
|
||||||
// Validate type with fallback type text.
|
|
||||||
$type = (string) isset($field['validate']['type']) ? $field['validate']['type'] : $field['type'];
|
|
||||||
$method = 'filter' . ucfirst(strtr($type, '-', '_'));
|
|
||||||
|
|
||||||
// If this is a YAML field validate/filter as such
|
// If this is a YAML field validate/filter as such
|
||||||
if ($type !== 'yaml' && isset($field['yaml']) && $field['yaml'] === true) {
|
if (isset($field['yaml']) && $field['yaml'] === true) {
|
||||||
$method = 'filterYaml';
|
$method = 'filterYaml';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!method_exists(__CLASS__, $method)) {
|
if (!method_exists(__CLASS__, $method)) {
|
||||||
$method = 'filterText';
|
$method = isset($field['array']) && $field['array'] === true ? 'filterArray' : 'filterText';
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$method($value, $validate, $field);
|
return self::$method($value, $validate, $field);
|
||||||
@@ -128,22 +122,26 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeText($value, array $params, array $field)
|
public static function typeText($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
if (!is_string($value) && !is_numeric($value)) {
|
if (!\is_string($value) && !is_numeric($value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = (string)$value;
|
$value = (string)$value;
|
||||||
|
|
||||||
if (isset($params['min']) && strlen($value) < $params['min']) {
|
if (!empty($params['trim'])) {
|
||||||
|
$value = trim($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params['min']) && \strlen($value) < $params['min']) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($params['max']) && strlen($value) > $params['max']) {
|
if (isset($params['max']) && \strlen($value) > $params['max']) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$min = isset($params['min']) ? $params['min'] : 0;
|
$min = $params['min'] ?? 0;
|
||||||
if (isset($params['step']) && (strlen($value) - $min) % $params['step'] == 0) {
|
if (isset($params['step']) && (\strlen($value) - $min) % $params['step'] === 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,17 +154,21 @@ class Validation
|
|||||||
|
|
||||||
protected static function filterText($value, array $params, array $field)
|
protected static function filterText($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
|
if (!empty($params['trim'])) {
|
||||||
|
$value = trim($value);
|
||||||
|
}
|
||||||
|
|
||||||
return (string) $value;
|
return (string) $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function filterCommaList($value, array $params, array $field)
|
protected static function filterCommaList($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
return is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
|
return \is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function typeCommaList($value, array $params, array $field)
|
public static function typeCommaList($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
return is_array($value) ? true : self::typeText($value, $params, $field);
|
return \is_array($value) ? true : self::typeText($value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function filterLower($value, array $params)
|
protected static function filterLower($value, array $params)
|
||||||
@@ -235,6 +237,7 @@ class Validation
|
|||||||
{
|
{
|
||||||
// Set multiple: true so checkboxes can easily use min/max counts to control number of options required
|
// Set multiple: true so checkboxes can easily use min/max counts to control number of options required
|
||||||
$field['multiple'] = true;
|
$field['multiple'] = true;
|
||||||
|
|
||||||
return self::typeArray((array) $value, $params, $field);
|
return self::typeArray((array) $value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,15 +257,9 @@ class Validation
|
|||||||
public static function typeCheckbox($value, array $params, array $field)
|
public static function typeCheckbox($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
$value = (string)$value;
|
$value = (string)$value;
|
||||||
|
$field_value = (string)($field['value'] ?? '1');
|
||||||
|
|
||||||
if (!isset($field['value'])) {
|
return $value === $field_value;
|
||||||
$field['value'] = 1;
|
|
||||||
}
|
|
||||||
if (isset($value) && $value != $field['value']) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -288,6 +285,10 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeToggle($value, array $params, array $field)
|
public static function typeToggle($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
|
if (\is_bool($value)) {
|
||||||
|
$value = (int)$value;
|
||||||
|
}
|
||||||
|
|
||||||
return self::typeArray((array) $value, $params, $field);
|
return self::typeArray((array) $value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,12 +345,9 @@ class Validation
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$min = isset($params['min']) ? $params['min'] : 0;
|
$min = $params['min'] ?? 0;
|
||||||
if (isset($params['step']) && fmod($value - $min, $params['step']) == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return !(isset($params['step']) && fmod($value - $min, $params['step']) === 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function filterNumber($value, array $params, array $field)
|
protected static function filterNumber($value, array $params, array $field)
|
||||||
@@ -409,10 +407,10 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeEmail($value, array $params, array $field)
|
public static function typeEmail($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
$values = !is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value;
|
$values = !\is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value;
|
||||||
|
|
||||||
foreach ($values as $value) {
|
foreach ($values as $val) {
|
||||||
if (!(self::typeText($value, $params, $field) && filter_var($value, FILTER_VALIDATE_EMAIL))) {
|
if (!(self::typeText($val, $params, $field) && filter_var($val, FILTER_VALIDATE_EMAIL))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -446,9 +444,11 @@ class Validation
|
|||||||
{
|
{
|
||||||
if ($value instanceof \DateTime) {
|
if ($value instanceof \DateTime) {
|
||||||
return true;
|
return true;
|
||||||
} elseif (!is_string($value)) {
|
}
|
||||||
|
if (!\is_string($value)) {
|
||||||
return false;
|
return false;
|
||||||
} elseif (!isset($params['format'])) {
|
}
|
||||||
|
if (!isset($params['format'])) {
|
||||||
return false !== strtotime($value);
|
return false !== strtotime($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,10 +480,10 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeDate($value, array $params, array $field)
|
public static function typeDate($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
$params = array($params);
|
|
||||||
if (!isset($params['format'])) {
|
if (!isset($params['format'])) {
|
||||||
$params['format'] = 'Y-m-d';
|
$params['format'] = 'Y-m-d';
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::typeDatetime($value, $params, $field);
|
return self::typeDatetime($value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -497,10 +497,10 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeTime($value, array $params, array $field)
|
public static function typeTime($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
$params = array($params);
|
|
||||||
if (!isset($params['format'])) {
|
if (!isset($params['format'])) {
|
||||||
$params['format'] = 'H:i';
|
$params['format'] = 'H:i';
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::typeDatetime($value, $params, $field);
|
return self::typeDatetime($value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,10 +514,10 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeMonth($value, array $params, array $field)
|
public static function typeMonth($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
$params = array($params);
|
|
||||||
if (!isset($params['format'])) {
|
if (!isset($params['format'])) {
|
||||||
$params['format'] = 'Y-m';
|
$params['format'] = 'Y-m';
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::typeDatetime($value, $params, $field);
|
return self::typeDatetime($value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -534,6 +534,7 @@ class Validation
|
|||||||
if (!isset($params['format']) && !preg_match('/^\d{4}-W\d{2}$/u', $value)) {
|
if (!isset($params['format']) && !preg_match('/^\d{4}-W\d{2}$/u', $value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::typeDatetime($value, $params, $field);
|
return self::typeDatetime($value, $params, $field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -547,72 +548,80 @@ class Validation
|
|||||||
*/
|
*/
|
||||||
public static function typeArray($value, array $params, array $field)
|
public static function typeArray($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
if (!is_array($value)) {
|
if (!\is_array($value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($field['multiple'])) {
|
if (isset($field['multiple'])) {
|
||||||
if (isset($params['min']) && count($value) < $params['min']) {
|
if (isset($params['min']) && \count($value) < $params['min']) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($params['max']) && count($value) > $params['max']) {
|
if (isset($params['max']) && \count($value) > $params['max']) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$min = isset($params['min']) ? $params['min'] : 0;
|
$min = $params['min'] ?? 0;
|
||||||
if (isset($params['step']) && (count($value) - $min) % $params['step'] == 0) {
|
if (isset($params['step']) && (\count($value) - $min) % $params['step'] === 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$options = isset($field['options']) ? array_keys($field['options']) : array();
|
$options = $field['options'] ?? [];
|
||||||
$values = isset($field['use']) && $field['use'] == 'keys' ? array_keys($value) : $value;
|
$use = $field['use'] ?? 'values';
|
||||||
if ($options && array_diff($values, $options)) {
|
|
||||||
return false;
|
if (empty($field['selectize']) || empty($field['multiple'])) {
|
||||||
|
$options = array_keys($options);
|
||||||
|
}
|
||||||
|
if ($use === 'keys') {
|
||||||
|
$value = array_keys($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return !($options && array_diff($value, $options));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function filterArray($value, $params, $field)
|
protected static function filterArray($value, $params, $field)
|
||||||
{
|
{
|
||||||
$values = (array) $value;
|
$values = (array) $value;
|
||||||
$options = isset($field['options']) ? array_keys($field['options']) : array();
|
$options = isset($field['options']) ? array_keys($field['options']) : [];
|
||||||
$multi = isset($field['multiple']) ? $field['multiple'] : false;
|
$multi = $field['multiple'] ?? false;
|
||||||
|
|
||||||
if (count($values) == 1 && isset($values[0]) && $values[0] == '') {
|
if (\count($values) === 1 && isset($values[0]) && $values[0] === '') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($options) {
|
if ($options) {
|
||||||
$useKey = isset($field['use']) && $field['use'] == 'keys';
|
$useKey = isset($field['use']) && $field['use'] === 'keys';
|
||||||
foreach ($values as $key => $value) {
|
foreach ($values as $key => $val) {
|
||||||
$values[$key] = $useKey ? (bool) $value : $value;
|
$values[$key] = $useKey ? (bool) $val : $val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($multi) {
|
if ($multi) {
|
||||||
foreach ($values as $key => $value) {
|
foreach ($values as $key => $val) {
|
||||||
if (is_array($value)) {
|
if (\is_array($val)) {
|
||||||
$value = implode(',', $value);
|
$val = implode(',', $val);
|
||||||
$values[$key] = array_map('trim', explode(',', $value));
|
$values[$key] = array_map('trim', explode(',', $val));
|
||||||
} else {
|
} else {
|
||||||
$values[$key] = trim($value);
|
$values[$key] = trim($val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($field['ignore_empty']) && Utils::isPositive($field['ignore_empty'])) {
|
if (isset($field['ignore_empty']) && Utils::isPositive($field['ignore_empty'])) {
|
||||||
foreach ($values as $key => $value) {
|
foreach ($values as $key => $val) {
|
||||||
foreach ($value as $inner_key => $inner_value) {
|
if ($val === '') {
|
||||||
if ($inner_value == '') {
|
unset($values[$key]);
|
||||||
unset($value[$inner_key]);
|
} elseif (\is_array($val)) {
|
||||||
|
foreach ($val as $inner_key => $inner_value) {
|
||||||
|
if ($inner_value === '') {
|
||||||
|
unset($val[$inner_key]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$values[$key] = $value;
|
$values[$key] = $val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,7 +630,7 @@ class Validation
|
|||||||
|
|
||||||
public static function typeList($value, array $params, array $field)
|
public static function typeList($value, array $params, array $field)
|
||||||
{
|
{
|
||||||
if (!is_array($value)) {
|
if (!\is_array($value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -629,7 +638,7 @@ class Validation
|
|||||||
foreach ($value as $key => $item) {
|
foreach ($value as $key => $item) {
|
||||||
foreach ($field['fields'] as $subKey => $subField) {
|
foreach ($field['fields'] as $subKey => $subField) {
|
||||||
$subKey = trim($subKey, '.');
|
$subKey = trim($subKey, '.');
|
||||||
$subValue = isset($item[$subKey]) ? $item[$subKey] : null;
|
$subValue = $item[$subKey] ?? null;
|
||||||
self::validate($subValue, $subField);
|
self::validate($subValue, $subField);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -645,23 +654,12 @@ class Validation
|
|||||||
|
|
||||||
public static function filterYaml($value, $params)
|
public static function filterYaml($value, $params)
|
||||||
{
|
{
|
||||||
if (!is_string($value)) {
|
if (!\is_string($value)) {
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
return (array) Yaml::parse($value);
|
return (array) Yaml::parse($value);
|
||||||
} catch (ParseException $e) {
|
|
||||||
// If YAML compatibility mode is set on, fall back to older YAML parser.
|
|
||||||
if (Grav::instance()['config']->get('system.strict_mode.yaml_compat', true)) {
|
|
||||||
try {
|
|
||||||
return (array) FallbackYaml::parse($value);
|
|
||||||
} catch (ParseException $e2) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -682,6 +680,23 @@ class Validation
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Input value which can be ignored.
|
||||||
|
*
|
||||||
|
* @param mixed $value Value to be validated.
|
||||||
|
* @param array $params Validation parameters.
|
||||||
|
* @param array $field Blueprint for the field.
|
||||||
|
* @return bool True if validation succeeded.
|
||||||
|
*/
|
||||||
|
public static function typeUnset($value, array $params, array $field)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function filterUnset($value, array $params, array $field)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// HTML5 attributes (min, max and range are handled inside the types)
|
// HTML5 attributes (min, max and range are handled inside the types)
|
||||||
|
|
||||||
@@ -689,9 +704,9 @@ class Validation
|
|||||||
{
|
{
|
||||||
if (is_scalar($value)) {
|
if (is_scalar($value)) {
|
||||||
return (bool) $params !== true || $value !== '';
|
return (bool) $params !== true || $value !== '';
|
||||||
} else {
|
|
||||||
return (bool) $params !== true || !empty($value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (bool) $params !== true || !empty($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function validatePattern($value, $params)
|
public static function validatePattern($value, $params)
|
||||||
@@ -714,12 +729,12 @@ class Validation
|
|||||||
|
|
||||||
public static function typeBool($value, $params)
|
public static function typeBool($value, $params)
|
||||||
{
|
{
|
||||||
return is_bool($value) || $value == 1 || $value == 0;
|
return \is_bool($value) || $value == 1 || $value == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function validateBool($value, $params)
|
public static function validateBool($value, $params)
|
||||||
{
|
{
|
||||||
return is_bool($value) || $value == 1 || $value == 0;
|
return \is_bool($value) || $value == 1 || $value == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function filterBool($value, $params)
|
protected static function filterBool($value, $params)
|
||||||
@@ -734,7 +749,7 @@ class Validation
|
|||||||
|
|
||||||
public static function validateFloat($value, $params)
|
public static function validateFloat($value, $params)
|
||||||
{
|
{
|
||||||
return is_float(filter_var($value, FILTER_VALIDATE_FLOAT));
|
return \is_float(filter_var($value, FILTER_VALIDATE_FLOAT));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function filterFloat($value, $params)
|
protected static function filterFloat($value, $params)
|
||||||
@@ -759,10 +774,7 @@ class Validation
|
|||||||
|
|
||||||
public static function validateArray($value, $params)
|
public static function validateArray($value, $params)
|
||||||
{
|
{
|
||||||
return is_array($value)
|
return \is_array($value) || ($value instanceof \ArrayAccess && $value instanceof \Traversable && $value instanceof \Countable);
|
||||||
|| ($value instanceof \ArrayAccess
|
|
||||||
&& $value instanceof \Traversable
|
|
||||||
&& $value instanceof \Countable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function filterItem_List($value, $params)
|
public static function filterItem_List($value, $params)
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common.Data
|
* @package Grav\Common\Data
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ class ValidationException extends \RuntimeException
|
|||||||
$this->messages = $messages;
|
$this->messages = $messages;
|
||||||
|
|
||||||
$language = Grav::instance()['language'];
|
$language = Grav::instance()['language'];
|
||||||
$this->message = $language->translate('FORM.VALIDATION_FAIL', null, true) . ' ' . $this->message;
|
$this->message = $language->translate('GRAV.FORM.VALIDATION_FAIL', null, true) . ' ' . $this->message;
|
||||||
|
|
||||||
foreach ($messages as $variable => &$list) {
|
foreach ($messages as $variable => &$list) {
|
||||||
$list = array_unique($list);
|
$list = array_unique($list);
|
||||||
|
|||||||
@@ -1,17 +1,29 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package Grav.Common
|
* @package Grav\Common
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
|
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
|
||||||
* @license MIT License; see LICENSE file for details.
|
* @license MIT License; see LICENSE file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Grav\Common;
|
namespace Grav\Common;
|
||||||
|
|
||||||
use DebugBar\DataCollector\ConfigCollector;
|
use DebugBar\DataCollector\ConfigCollector;
|
||||||
|
use DebugBar\DataCollector\DataCollectorInterface;
|
||||||
|
use DebugBar\DataCollector\ExceptionsCollector;
|
||||||
|
use DebugBar\DataCollector\MemoryCollector;
|
||||||
|
use DebugBar\DataCollector\MessagesCollector;
|
||||||
|
use DebugBar\DataCollector\PhpInfoCollector;
|
||||||
|
use DebugBar\DataCollector\RequestDataCollector;
|
||||||
|
use DebugBar\DataCollector\TimeDataCollector;
|
||||||
|
use DebugBar\DebugBar;
|
||||||
use DebugBar\JavascriptRenderer;
|
use DebugBar\JavascriptRenderer;
|
||||||
use DebugBar\StandardDebugBar;
|
use DebugBar\StandardDebugBar;
|
||||||
use Grav\Common\Config\Config;
|
use Grav\Common\Config\Config;
|
||||||
|
use Grav\Common\Processors\ProcessorInterface;
|
||||||
|
use Twig\Template;
|
||||||
|
use Twig\TemplateWrapper;
|
||||||
|
|
||||||
class Debugger
|
class Debugger
|
||||||
{
|
{
|
||||||
@@ -27,20 +39,48 @@ class Debugger
|
|||||||
/** @var StandardDebugBar $debugbar */
|
/** @var StandardDebugBar $debugbar */
|
||||||
protected $debugbar;
|
protected $debugbar;
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
protected $enabled;
|
protected $enabled;
|
||||||
|
|
||||||
|
protected $initialized = false;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
protected $timers = [];
|
protected $timers = [];
|
||||||
|
|
||||||
|
/** @var array $deprecations */
|
||||||
|
protected $deprecations = [];
|
||||||
|
|
||||||
|
/** @var callable */
|
||||||
|
protected $errorHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Debugger constructor.
|
* Debugger constructor.
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
|
$currentTime = microtime(true);
|
||||||
|
|
||||||
|
if (!\defined('GRAV_REQUEST_TIME')) {
|
||||||
|
\define('GRAV_REQUEST_TIME', $currentTime);
|
||||||
|
}
|
||||||
|
|
||||||
// Enable debugger until $this->init() gets called.
|
// Enable debugger until $this->init() gets called.
|
||||||
$this->enabled = true;
|
$this->enabled = true;
|
||||||
|
|
||||||
$this->debugbar = new StandardDebugBar();
|
$debugbar = new DebugBar();
|
||||||
$this->debugbar['time']->addMeasure('Loading', $this->debugbar['time']->getRequestStartTime(), microtime(true));
|
$debugbar->addCollector(new PhpInfoCollector());
|
||||||
|
$debugbar->addCollector(new MessagesCollector());
|
||||||
|
$debugbar->addCollector(new RequestDataCollector());
|
||||||
|
$debugbar->addCollector(new TimeDataCollector($_SERVER['REQUEST_TIME_FLOAT'] ?? GRAV_REQUEST_TIME));
|
||||||
|
|
||||||
|
$debugbar['time']->addMeasure('Server', $debugbar['time']->getRequestStartTime(), GRAV_REQUEST_TIME);
|
||||||
|
$debugbar['time']->addMeasure('Loading', GRAV_REQUEST_TIME, $currentTime);
|
||||||
|
$debugbar['time']->addMeasure('Debugger', $currentTime, microtime(true));
|
||||||
|
|
||||||
|
$this->debugbar = $debugbar;
|
||||||
|
|
||||||
|
// Set deprecation collector.
|
||||||
|
$this->setErrorHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,15 +91,28 @@ class Debugger
|
|||||||
*/
|
*/
|
||||||
public function init()
|
public function init()
|
||||||
{
|
{
|
||||||
|
if ($this->initialized) {
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
$this->grav = Grav::instance();
|
$this->grav = Grav::instance();
|
||||||
$this->config = $this->grav['config'];
|
$this->config = $this->grav['config'];
|
||||||
|
|
||||||
// Enable/disable debugger based on configuration.
|
// Enable/disable debugger based on configuration.
|
||||||
$this->enabled = $this->config->get('system.debugger.enabled');
|
$this->enabled = (bool)$this->config->get('system.debugger.enabled');
|
||||||
|
|
||||||
if ($this->enabled()) {
|
if ($this->enabled()) {
|
||||||
$this->debugbar->addCollector(new ConfigCollector((array)$this->config->get('system'), 'Config'));
|
$this->initialized = true;
|
||||||
$this->debugbar->addCollector(new ConfigCollector((array)$this->config->get('plugins'), 'Plugins'));
|
|
||||||
|
$plugins_config = (array)$this->config->get('plugins');
|
||||||
|
|
||||||
|
ksort($plugins_config);
|
||||||
|
|
||||||
|
$debugbar = $this->debugbar;
|
||||||
|
$debugbar->addCollector(new MemoryCollector());
|
||||||
|
$debugbar->addCollector(new ExceptionsCollector());
|
||||||
|
$debugbar->addCollector(new ConfigCollector((array)$this->config->get('system'), 'Config'));
|
||||||
|
$debugbar->addCollector(new ConfigCollector($plugins_config, 'Plugins'));
|
||||||
$this->addMessage('Grav v' . GRAV_VERSION);
|
$this->addMessage('Grav v' . GRAV_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,12 +124,12 @@ class Debugger
|
|||||||
*
|
*
|
||||||
* @param bool $state If null, the method returns the enabled value. If set, the method sets the enabled state
|
* @param bool $state If null, the method returns the enabled value. If set, the method sets the enabled state
|
||||||
*
|
*
|
||||||
* @return null
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function enabled($state = null)
|
public function enabled($state = null)
|
||||||
{
|
{
|
||||||
if ($state !== null) {
|
if ($state !== null) {
|
||||||
$this->enabled = $state;
|
$this->enabled = (bool)$state;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->enabled;
|
return $this->enabled;
|
||||||
@@ -122,9 +175,9 @@ class Debugger
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getCaller($ignore = 2)
|
public function getCaller($limit = 2)
|
||||||
{
|
{
|
||||||
$trace = debug_backtrace(false, $ignore);
|
$trace = debug_backtrace(false, $limit);
|
||||||
|
|
||||||
return array_pop($trace);
|
return array_pop($trace);
|
||||||
}
|
}
|
||||||
@@ -132,7 +185,7 @@ class Debugger
|
|||||||
/**
|
/**
|
||||||
* Adds a data collector
|
* Adds a data collector
|
||||||
*
|
*
|
||||||
* @param $collector
|
* @param DataCollectorInterface $collector
|
||||||
*
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
* @throws \DebugBar\DebugBarException
|
* @throws \DebugBar\DebugBarException
|
||||||
@@ -147,9 +200,9 @@ class Debugger
|
|||||||
/**
|
/**
|
||||||
* Returns a data collector
|
* Returns a data collector
|
||||||
*
|
*
|
||||||
* @param $collector
|
* @param DataCollectorInterface $collector
|
||||||
*
|
*
|
||||||
* @return \DebugBar\DataCollector\DataCollectorInterface
|
* @return DataCollectorInterface
|
||||||
* @throws \DebugBar\DebugBarException
|
* @throws \DebugBar\DebugBarException
|
||||||
*/
|
*/
|
||||||
public function getCollector($collector)
|
public function getCollector($collector)
|
||||||
@@ -171,6 +224,8 @@ class Debugger
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addDeprecations();
|
||||||
|
|
||||||
echo $this->renderer->render();
|
echo $this->renderer->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,6 +240,7 @@ class Debugger
|
|||||||
public function sendDataInHeaders()
|
public function sendDataInHeaders()
|
||||||
{
|
{
|
||||||
if ($this->enabled()) {
|
if ($this->enabled()) {
|
||||||
|
$this->addDeprecations();
|
||||||
$this->debugbar->sendDataInHeaders();
|
$this->debugbar->sendDataInHeaders();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,6 +258,7 @@ class Debugger
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addDeprecations();
|
||||||
$this->timers = [];
|
$this->timers = [];
|
||||||
|
|
||||||
return $this->debugbar->getData();
|
return $this->debugbar->getData();
|
||||||
@@ -210,14 +267,14 @@ class Debugger
|
|||||||
/**
|
/**
|
||||||
* Start a timer with an associated name and description
|
* Start a timer with an associated name and description
|
||||||
*
|
*
|
||||||
* @param $name
|
* @param string $name
|
||||||
* @param string|null $description
|
* @param string|null $description
|
||||||
*
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function startTimer($name, $description = null)
|
public function startTimer($name, $description = null)
|
||||||
{
|
{
|
||||||
if ($name[0] === '_' || $this->enabled()) {
|
if (strpos($name, '_') === 0 || $this->enabled()) {
|
||||||
$this->debugbar['time']->startMeasure($name, $description);
|
$this->debugbar['time']->startMeasure($name, $description);
|
||||||
$this->timers[] = $name;
|
$this->timers[] = $name;
|
||||||
}
|
}
|
||||||
@@ -234,7 +291,7 @@ class Debugger
|
|||||||
*/
|
*/
|
||||||
public function stopTimer($name)
|
public function stopTimer($name)
|
||||||
{
|
{
|
||||||
if (in_array($name, $this->timers, true) && ($name[0] === '_' || $this->enabled())) {
|
if (\in_array($name, $this->timers, true) && (strpos($name, '_') === 0 || $this->enabled())) {
|
||||||
$this->debugbar['time']->stopMeasure($name);
|
$this->debugbar['time']->stopMeasure($name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +301,7 @@ class Debugger
|
|||||||
/**
|
/**
|
||||||
* Dump variables into the Messages tab of the Debug Bar
|
* Dump variables into the Messages tab of the Debug Bar
|
||||||
*
|
*
|
||||||
* @param $message
|
* @param mixed $message
|
||||||
* @param string $label
|
* @param string $label
|
||||||
* @param bool $isString
|
* @param bool $isString
|
||||||
*
|
*
|
||||||
@@ -267,10 +324,283 @@ class Debugger
|
|||||||
*/
|
*/
|
||||||
public function addException(\Exception $e)
|
public function addException(\Exception $e)
|
||||||
{
|
{
|
||||||
if ($this->enabled()) {
|
if ($this->initialized && $this->enabled()) {
|
||||||
$this->debugbar['exceptions']->addException($e);
|
$this->debugbar['exceptions']->addException($e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setErrorHandler()
|
||||||
|
{
|
||||||
|
$this->errorHandler = set_error_handler(
|
||||||
|
[$this, 'deprecatedErrorHandler']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $errno
|
||||||
|
* @param string $errstr
|
||||||
|
* @param string $errfile
|
||||||
|
* @param int $errline
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function deprecatedErrorHandler($errno, $errstr, $errfile, $errline)
|
||||||
|
{
|
||||||
|
if ($errno !== E_USER_DEPRECATED) {
|
||||||
|
if ($this->errorHandler) {
|
||||||
|
return \call_user_func($this->errorHandler, $errno, $errstr, $errfile, $errline);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->enabled()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Figure out error scope from the error.
|
||||||
|
$scope = 'unknown';
|
||||||
|
if (stripos($errstr, 'grav') !== false) {
|
||||||
|
$scope = 'grav';
|
||||||
|
} elseif (strpos($errfile, '/twig/') !== false) {
|
||||||
|
$scope = 'twig';
|
||||||
|
} elseif (stripos($errfile, '/yaml/') !== false) {
|
||||||
|
$scope = 'yaml';
|
||||||
|
} elseif (strpos($errfile, '/vendor/') !== false) {
|
||||||
|
$scope = 'vendor';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up backtrace to make it more useful.
|
||||||
|
$backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
|
||||||
|
|
||||||
|
// Skip current call.
|
||||||
|
array_shift($backtrace);
|
||||||
|
|
||||||
|
// Find yaml file where the error happened.
|
||||||
|
if ($scope === 'yaml') {
|
||||||
|
foreach ($backtrace as $current) {
|
||||||
|
if (isset($current['args'])) {
|
||||||
|
foreach ($current['args'] as $arg) {
|
||||||
|
if ($arg instanceof \SplFileInfo) {
|
||||||
|
$arg = $arg->getPathname();
|
||||||
|
}
|
||||||
|
if (\is_string($arg) && preg_match('/.+\.(yaml|md)$/i', $arg)) {
|
||||||
|
$errfile = $arg;
|
||||||
|
$errline = 0;
|
||||||
|
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter arguments.
|
||||||
|
$cut = 0;
|
||||||
|
$previous = null;
|
||||||
|
foreach ($backtrace as $i => &$current) {
|
||||||
|
if (isset($current['args'])) {
|
||||||
|
$args = [];
|
||||||
|
foreach ($current['args'] as $arg) {
|
||||||
|
if (\is_string($arg)) {
|
||||||
|
$arg = "'" . $arg . "'";
|
||||||
|
if (mb_strlen($arg) > 100) {
|
||||||
|
$arg = 'string';
|
||||||
|
}
|
||||||
|
} elseif (\is_bool($arg)) {
|
||||||
|
$arg = $arg ? 'true' : 'false';
|
||||||
|
} elseif (\is_scalar($arg)) {
|
||||||
|
$arg = $arg;
|
||||||
|
} elseif (\is_object($arg)) {
|
||||||
|
$arg = get_class($arg) . ' $object';
|
||||||
|
} elseif (\is_array($arg)) {
|
||||||
|
$arg = '$array';
|
||||||
|
} else {
|
||||||
|
$arg = '$object';
|
||||||
|
}
|
||||||
|
|
||||||
|
$args[] = $arg;
|
||||||
|
}
|
||||||
|
$current['args'] = $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
$object = $current['object'] ?? null;
|
||||||
|
unset($current['object']);
|
||||||
|
|
||||||
|
$reflection = null;
|
||||||
|
if ($object instanceof TemplateWrapper) {
|
||||||
|
$reflection = new \ReflectionObject($object);
|
||||||
|
$property = $reflection->getProperty('template');
|
||||||
|
$property->setAccessible(true);
|
||||||
|
$object = $property->getValue($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($object instanceof Template) {
|
||||||
|
$file = $current['file'] ?? null;
|
||||||
|
|
||||||
|
if (preg_match('`(Template.php|TemplateWrapper.php)$`', $file)) {
|
||||||
|
$current = null;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$debugInfo = $object->getDebugInfo();
|
||||||
|
|
||||||
|
$line = 1;
|
||||||
|
if (!$reflection) {
|
||||||
|
foreach ($debugInfo as $codeLine => $templateLine) {
|
||||||
|
if ($codeLine <= $current['line']) {
|
||||||
|
$line = $templateLine;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$src = $object->getSourceContext();
|
||||||
|
//$code = preg_split('/\r\n|\r|\n/', $src->getCode());
|
||||||
|
//$current['twig']['twig'] = trim($code[$line - 1]);
|
||||||
|
$current['twig']['file'] = $src->getPath();
|
||||||
|
$current['twig']['line'] = $line;
|
||||||
|
|
||||||
|
$prevFile = $previous['file'] ?? null;
|
||||||
|
if ($prevFile && $file === $prevFile) {
|
||||||
|
$prevLine = $previous['line'];
|
||||||
|
|
||||||
|
$line = 1;
|
||||||
|
foreach ($debugInfo as $codeLine => $templateLine) {
|
||||||
|
if ($codeLine <= $prevLine) {
|
||||||
|
$line = $templateLine;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//$previous['twig']['twig'] = trim($code[$line - 1]);
|
||||||
|
$previous['twig']['file'] = $src->getPath();
|
||||||
|
$previous['twig']['line'] = $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cut = $i;
|
||||||
|
} elseif ($object instanceof ProcessorInterface) {
|
||||||
|
$cut = $cut ?: $i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previous = &$backtrace[$i];
|
||||||
|
}
|
||||||
|
unset($current);
|
||||||
|
|
||||||
|
if ($cut) {
|
||||||
|
$backtrace = array_slice($backtrace, 0, $cut + 1);
|
||||||
|
}
|
||||||
|
$backtrace = array_values(array_filter($backtrace));
|
||||||
|
|
||||||
|
// Skip vendor libraries and the method where error was triggered.
|
||||||
|
foreach ($backtrace as $i => $current) {
|
||||||
|
if (!isset($current['file'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (strpos($current['file'], '/vendor/') !== false) {
|
||||||
|
$cut = $i + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (isset($current['function']) && ($current['function'] === 'user_error' || $current['function'] === 'trigger_error')) {
|
||||||
|
$cut = $i + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($cut) {
|
||||||
|
$backtrace = array_slice($backtrace, $cut);
|
||||||
|
}
|
||||||
|
$backtrace = array_values(array_filter($backtrace));
|
||||||
|
|
||||||
|
$current = reset($backtrace);
|
||||||
|
|
||||||
|
// If the issue happened inside twig file, change the file and line to match that file.
|
||||||
|
$file = $current['twig']['file'] ?? '';
|
||||||
|
if ($file) {
|
||||||
|
$errfile = $file;
|
||||||
|
$errline = $current['twig']['line'] ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$deprecation = [
|
||||||
|
'scope' => $scope,
|
||||||
|
'message' => $errstr,
|
||||||
|
'file' => $errfile,
|
||||||
|
'line' => $errline,
|
||||||
|
'trace' => $backtrace,
|
||||||
|
'count' => 1
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->deprecations[] = $deprecation;
|
||||||
|
|
||||||
|
// Do not pass forward.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addDeprecations()
|
||||||
|
{
|
||||||
|
if (!$this->deprecations) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$collector = new MessagesCollector('deprecated');
|
||||||
|
$this->addCollector($collector);
|
||||||
|
$collector->addMessage('Your site is using following deprecated features:');
|
||||||
|
|
||||||
|
/** @var array $deprecated */
|
||||||
|
foreach ($this->deprecations as $deprecated) {
|
||||||
|
list($message, $scope) = $this->getDepracatedMessage($deprecated);
|
||||||
|
|
||||||
|
$collector->addMessage($message, $scope);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getDepracatedMessage($deprecated)
|
||||||
|
{
|
||||||
|
$scope = $deprecated['scope'];
|
||||||
|
|
||||||
|
$trace = [];
|
||||||
|
if (isset($deprecated['trace'])) {
|
||||||
|
foreach ($deprecated['trace'] as $current) {
|
||||||
|
$class = $current['class'] ?? '';
|
||||||
|
$type = $current['type'] ?? '';
|
||||||
|
$function = $this->getFunction($current);
|
||||||
|
if (isset($current['file'])) {
|
||||||
|
$current['file'] = str_replace(GRAV_ROOT . '/', '', $current['file']);
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($current['class'], $current['type'], $current['function'], $current['args']);
|
||||||
|
|
||||||
|
if (isset($current['twig'])) {
|
||||||
|
$trace[] = $current['twig'];
|
||||||
|
} else {
|
||||||
|
$trace[] = ['call' => $class . $type . $function] + $current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$array = [
|
||||||
|
'message' => $deprecated['message'],
|
||||||
|
'file' => $deprecated['file'],
|
||||||
|
'line' => $deprecated['line'],
|
||||||
|
'trace' => $trace
|
||||||
|
];
|
||||||
|
|
||||||
|
return [
|
||||||
|
array_filter($array),
|
||||||
|
$scope
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getFunction($trace)
|
||||||
|
{
|
||||||
|
if (!isset($trace['function'])) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $trace['function'] . '(' . implode(', ', $trace['args'] ?? []) . ')';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user