Compare commits
1108 Commits
v0.9-13.12
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4079a64a88 | ||
|
|
9364388035 | ||
|
|
7a3c86a110 | ||
|
|
15967ea059 | ||
|
|
570f982709 | ||
|
|
6dbcdf7eae | ||
|
|
5e7e10969e | ||
|
|
3d261e08b9 | ||
|
|
546470b2de | ||
|
|
23cdc89441 | ||
|
|
d9d0be334d | ||
|
|
ba4e4134ad | ||
|
|
7ef2c08a96 | ||
|
|
db8a3f7f3e | ||
|
|
5ef475b73f | ||
|
|
917a763811 | ||
|
|
50d572a0af | ||
|
|
752fc6b0ad | ||
|
|
95f6e7b4f5 | ||
|
|
67a830f86b | ||
|
|
8ff55f5266 | ||
|
|
8035b22347 | ||
|
|
b989f24c5b | ||
|
|
23724c4193 | ||
|
|
6ddf1c1a23 | ||
|
|
7d51b210c9 | ||
|
|
91876b42aa | ||
|
|
5783cb0d01 | ||
|
|
87d479dd57 | ||
|
|
ef9ef2ce45 | ||
|
|
31f5192c9d | ||
|
|
4ce9cdefc2 | ||
|
|
0b0476e565 | ||
|
|
71c6381b15 | ||
|
|
fa107ffa51 | ||
|
|
d84e261f7b | ||
|
|
3933a23ad7 | ||
|
|
0a40b1e7ee | ||
|
|
bda7541682 | ||
|
|
f3a5336c1a | ||
|
|
d1e961af90 | ||
|
|
e3bdef645d | ||
|
|
de53b64880 | ||
|
|
d0b62eabe9 | ||
|
|
99ffd36648 | ||
|
|
4028d7d160 | ||
|
|
a30a6c122d | ||
|
|
0d28025bf4 | ||
|
|
8b75782619 | ||
|
|
c5ab9295f0 | ||
|
|
c816efa26e | ||
|
|
7115a30301 | ||
|
|
db5d8694c4 | ||
|
|
2051c040ec | ||
|
|
13282b5b84 | ||
|
|
af281422d3 | ||
|
|
68026e0fbc | ||
|
|
a9fa990124 | ||
|
|
9635a7a0ba | ||
|
|
9396eef2f9 | ||
|
|
cec6b9c62b | ||
|
|
f23e825b95 | ||
|
|
1c3b86fc22 | ||
|
|
540dbb3b21 | ||
|
|
81ad2232bf | ||
|
|
d520a556cf | ||
|
|
77aebcbd0e | ||
|
|
f3299ecb8a | ||
|
|
b88a733dc0 | ||
|
|
746667a8e6 | ||
|
|
6232de74e9 | ||
|
|
e306960db4 | ||
|
|
3caebb3b20 | ||
|
|
43c54328f7 | ||
|
|
99212ec787 | ||
|
|
5f52c1e25b | ||
|
|
272fc8b3e1 | ||
|
|
e143be0036 | ||
|
|
91ae56484d | ||
|
|
9910a9cddc | ||
|
|
666619538a | ||
|
|
9d1b01a873 | ||
|
|
206880ba71 | ||
|
|
c1753aa04e | ||
|
|
6f19a24aa3 | ||
|
|
c725fec12e | ||
|
|
596d117210 | ||
|
|
0433a11c0a | ||
|
|
98e4c1d16d | ||
|
|
7a41f0d013 | ||
|
|
c9de1b3b01 | ||
|
|
83d4d020ed | ||
|
|
01100c9a4a | ||
|
|
daef17d7eb | ||
|
|
65f5974e17 | ||
|
|
f6e1232db8 | ||
|
|
b989459d87 | ||
|
|
a609b149e9 | ||
|
|
f9ede542c9 | ||
|
|
16d21f03ef | ||
|
|
8437eac420 | ||
|
|
f0bf9d770d | ||
|
|
e05ebe442e | ||
|
|
17d9dcfa17 | ||
|
|
2014be4cd3 | ||
|
|
d15fc14463 | ||
|
|
f07b57fe20 | ||
|
|
c03ee2c8be | ||
|
|
4095850140 | ||
|
|
7f7b24d28f | ||
|
|
1d0e253281 | ||
|
|
88c3bfe13f | ||
|
|
59a5c8d14d | ||
|
|
3119c05e2c | ||
|
|
05e20c0ae5 | ||
|
|
7279d4832d | ||
|
|
ac33000ad0 | ||
|
|
02937dc51c | ||
|
|
437d296af5 | ||
|
|
f31e6daf7b | ||
|
|
f8a9d95e43 | ||
|
|
0fbb1aaea5 | ||
|
|
9fd02529b1 | ||
|
|
3512fd41bf | ||
|
|
997aa607ac | ||
|
|
3b03e0267b | ||
|
|
61606a9069 | ||
|
|
34e5bf2861 | ||
|
|
c78f7fda68 | ||
|
|
7ebfe82de1 | ||
|
|
004db7c056 | ||
|
|
d4068b1661 | ||
|
|
d77a1ecad7 | ||
|
|
ded268ef59 | ||
|
|
142a615feb | ||
|
|
c30b67d18d | ||
|
|
2db893e802 | ||
|
|
2f3e15dfb8 | ||
|
|
4be93f2741 | ||
|
|
6100695d87 | ||
|
|
0bdf8721e1 | ||
|
|
ce7af58367 | ||
|
|
1b673e06ff | ||
|
|
0edb48fae0 | ||
|
|
17fcb2f08b | ||
|
|
5f943d48b5 | ||
|
|
b23277267a | ||
|
|
b0d78a81dc | ||
|
|
f34d14280d | ||
|
|
13dc5e87dd | ||
|
|
0b021e5e7d | ||
|
|
00c75d2f75 | ||
|
|
1eedc481ad | ||
|
|
75899e287d | ||
|
|
047bd17f19 | ||
|
|
9c075dcdf0 | ||
|
|
157fc05265 | ||
|
|
c047669900 | ||
|
|
eee0228fed | ||
|
|
389b46635e | ||
|
|
919911e288 | ||
|
|
dd4bf889de | ||
|
|
0dcf45a152 | ||
|
|
ceaa545c7d | ||
|
|
01d9d0c3f5 | ||
|
|
6b46dd9c50 | ||
|
|
cb4457ab52 | ||
|
|
8a57b91343 | ||
|
|
c66b6e20ec | ||
|
|
b33a9c4d02 | ||
|
|
cac1c650a1 | ||
|
|
42e192340d | ||
|
|
b677f7db92 | ||
|
|
2fbc56dead | ||
|
|
d174cc5732 | ||
|
|
5557f6dd91 | ||
|
|
42fe6f7bf5 | ||
|
|
1f1019ba5b | ||
|
|
13d18e02cc | ||
|
|
e46acd815d | ||
|
|
432b69f70d | ||
|
|
0e750771ae | ||
|
|
fc9aaf66f3 | ||
|
|
ec495d7e24 | ||
|
|
f6b02ebe24 | ||
|
|
64b8e68688 | ||
|
|
4e5b88821d | ||
|
|
a003cffbbb | ||
|
|
7ef5fcabd5 | ||
|
|
3c4a0022c3 | ||
|
|
780c3b61f4 | ||
|
|
1d21ecac16 | ||
|
|
2d777ec061 | ||
|
|
5d20d57be9 | ||
|
|
3f14d6e138 | ||
|
|
1ee18ad532 | ||
|
|
419183ae2f | ||
|
|
0916631ae2 | ||
|
|
4186cdec6a | ||
|
|
cbb270ea89 | ||
|
|
d839f390ee | ||
|
|
26e8077e0a | ||
|
|
b5167dbe5d | ||
|
|
a1bf3d037b | ||
|
|
ed30a99655 | ||
|
|
bf2cb07e4b | ||
|
|
729dcf729a | ||
|
|
58cb9105d4 | ||
|
|
eb77897ab6 | ||
|
|
4ad930a31d | ||
|
|
fa222ba7a2 | ||
|
|
519e84e74c | ||
|
|
57106d85c9 | ||
|
|
a4883be588 | ||
|
|
96eb56fc35 | ||
|
|
a3d698c09e | ||
|
|
9bd4eaeae8 | ||
|
|
a31da6880d | ||
|
|
0759a9414a | ||
|
|
ee00fc567f | ||
|
|
5303124431 | ||
|
|
74b0f45a72 | ||
|
|
0f3f15c0ca | ||
|
|
cbfe180d8b | ||
|
|
d24a16ad23 | ||
|
|
6123f3ae62 | ||
|
|
89649522c7 | ||
|
|
675efe1e43 | ||
|
|
f40c5c178e | ||
|
|
5a2833c5aa | ||
|
|
c279ef1443 | ||
|
|
6cedf6a0a1 | ||
|
|
7068b2bbe1 | ||
|
|
4791cd978e | ||
|
|
403f96fdc0 | ||
|
|
86587d40ce | ||
|
|
7bd37f7d8c | ||
|
|
ecd21c2557 | ||
|
|
50dea3fc24 | ||
|
|
7db5f3c873 | ||
|
|
4f13adcadd | ||
|
|
ba0bfd3551 | ||
|
|
2fad7cc398 | ||
|
|
49eed7b437 | ||
|
|
d72d4ea2ab | ||
|
|
7ca696ce90 | ||
|
|
806409496a | ||
|
|
e2ca6a1fa7 | ||
|
|
e15c2966a9 | ||
|
|
93b5656109 | ||
|
|
539ef5e111 | ||
|
|
7a1b74b351 | ||
|
|
540fba3122 | ||
|
|
28f687e7fe | ||
|
|
91a970521c | ||
|
|
926ec3e117 | ||
|
|
23d52d44a1 | ||
|
|
cf9776ee43 | ||
|
|
a2e784113a | ||
|
|
38184ba5ba | ||
|
|
c422952c89 | ||
|
|
75672fe259 | ||
|
|
82fe09cf52 | ||
|
|
b0df985d66 | ||
|
|
09a320bf5d | ||
|
|
5163c43610 | ||
|
|
e20e6804e9 | ||
|
|
eeb893485b | ||
|
|
80746465c7 | ||
|
|
0e4391006c | ||
|
|
c84fa39c4f | ||
|
|
687a4c8e26 | ||
|
|
92cb7834e2 | ||
|
|
88fff899b8 | ||
|
|
5d2aef0dac | ||
|
|
75d5677d7d | ||
|
|
687ab6260a | ||
|
|
30baad977c | ||
|
|
c8c4d9e079 | ||
|
|
92debef3e3 | ||
|
|
1c189588db | ||
|
|
0177a0557a | ||
|
|
6855e9f1f3 | ||
|
|
478ec92491 | ||
|
|
256fff6b24 | ||
|
|
31ed159312 | ||
|
|
b3b9255c69 | ||
|
|
22cadcc884 | ||
|
|
df854a3bf0 | ||
|
|
5b58d71b61 | ||
|
|
fc0485c891 | ||
|
|
78a4cc9f84 | ||
|
|
29cf8a070d | ||
|
|
45c8b22ba7 | ||
|
|
d0cedde7c0 | ||
|
|
efc5bf5c51 | ||
|
|
24bd3ab367 | ||
|
|
954e710013 | ||
|
|
4b97110087 | ||
|
|
3d0b5d5f6c | ||
|
|
44aef6c707 | ||
|
|
8f61e2155c | ||
|
|
467471c9c3 | ||
|
|
423c99f3bd | ||
|
|
7f3cd2b9e8 | ||
|
|
12bd32babf | ||
|
|
3dabb7b8d8 | ||
|
|
10dd9344b8 | ||
|
|
3ad7b06c6f | ||
|
|
e157b47336 | ||
|
|
63dc87e7e3 | ||
|
|
2731e34db0 | ||
|
|
0d4299d99e | ||
|
|
bac7340c2a | ||
|
|
21a57903a9 | ||
|
|
39fcd8d513 | ||
|
|
371b88f9f8 | ||
|
|
a1168057a8 | ||
|
|
a38571bc64 | ||
|
|
79179fb65a | ||
|
|
27e6801e15 | ||
|
|
3dd592ae59 | ||
|
|
454302b3a1 | ||
|
|
3da4d660ec | ||
|
|
cb4778d6c4 | ||
|
|
d7a48ce086 | ||
|
|
ca1dcbf8da | ||
|
|
98bf0a3b6c | ||
|
|
70068ed5a1 | ||
|
|
db6825a33d | ||
|
|
f6d0627a77 | ||
|
|
50c23c44c5 | ||
|
|
ac74c6e0cb | ||
|
|
4861a40b9e | ||
|
|
0e49d186f5 | ||
|
|
13ac6f1c70 | ||
|
|
6164d92173 | ||
|
|
2f6a0c6f36 | ||
|
|
b2f1f46528 | ||
|
|
54af368084 | ||
|
|
0dbc14da02 | ||
|
|
60fdcae8e5 | ||
|
|
27ebdf09f0 | ||
|
|
6558fd5e03 | ||
|
|
5afcfbf3df | ||
|
|
b80bce520c | ||
|
|
cc078d6f6a | ||
|
|
a85c242e09 | ||
|
|
714e8788e8 | ||
|
|
bd4ffc5e1d | ||
|
|
95ef1d562e | ||
|
|
3fdaed97e3 | ||
|
|
f775a3e490 | ||
|
|
eba20a69f0 | ||
|
|
452be71d87 | ||
|
|
99df2bae64 | ||
|
|
834e4722a0 | ||
|
|
3b7d2dc319 | ||
|
|
e563687451 | ||
|
|
ab6284abf7 | ||
|
|
63b71df244 | ||
|
|
f8d39927ce | ||
|
|
f9dfb1bb85 | ||
|
|
1cc3066569 | ||
|
|
cee119eb4d | ||
|
|
269832aa85 | ||
|
|
74c8143825 | ||
|
|
bba332531b | ||
|
|
06876225c1 | ||
|
|
a26e2d5a33 | ||
|
|
cacb854d42 | ||
|
|
a387458fc6 | ||
|
|
b8f8c4c489 | ||
|
|
d8fe9e0463 | ||
|
|
0b68fa8b14 | ||
|
|
65455bc67e | ||
|
|
a4bcd37dae | ||
|
|
31072a0726 | ||
|
|
75227b3bac | ||
|
|
38f959890d | ||
|
|
77ef00e1a0 | ||
|
|
09a81d394c | ||
|
|
78e2dfbde8 | ||
|
|
3413dfd7ce | ||
|
|
371e6c9884 | ||
|
|
6398551ac3 | ||
|
|
beeeab869d | ||
|
|
408cb56ce1 | ||
|
|
029579be4d | ||
|
|
5ba2f03206 | ||
|
|
691b43bc48 | ||
|
|
3cc75893da | ||
|
|
3afd22c12c | ||
|
|
3bba7cd9dd | ||
|
|
0020814e18 | ||
|
|
8d2aa236b1 | ||
|
|
d695ce3ce5 | ||
|
|
ac1527ce43 | ||
|
|
9948a62557 | ||
|
|
75237e6a44 | ||
|
|
c17bdaf606 | ||
|
|
147f7ede98 | ||
|
|
5abd915678 | ||
|
|
64a66be475 | ||
|
|
71c72c7926 | ||
|
|
6d27a24fb8 | ||
|
|
2e2835ce6b | ||
|
|
664d8bcb23 | ||
|
|
4df129b01c | ||
|
|
32c2f8217d | ||
|
|
91d83d40b1 | ||
|
|
0cf11bb933 | ||
|
|
4155491719 | ||
|
|
8045a0d403 | ||
|
|
57a5857c1f | ||
|
|
632ac977ee | ||
|
|
247aa9e043 | ||
|
|
9f8491076f | ||
|
|
f4a34e0d7b | ||
|
|
b6626e42d8 | ||
|
|
26b70e2af8 | ||
|
|
586492e1b8 | ||
|
|
430649df81 | ||
|
|
3050aa98ab | ||
|
|
1e7e7e7997 | ||
|
|
235888cc3e | ||
|
|
0b1096c588 | ||
|
|
ad10000aca | ||
|
|
a6fe58e5b2 | ||
|
|
e492f9df4d | ||
|
|
350b2edb2b | ||
|
|
b70d240d3a | ||
|
|
6fbb65487c | ||
|
|
b497004516 | ||
|
|
a920bffd77 | ||
|
|
df7aeda761 | ||
|
|
2a8b11f48b | ||
|
|
c2a71c2f19 | ||
|
|
94ddb69311 | ||
|
|
27dce21870 | ||
|
|
e942452197 | ||
|
|
d93af07d31 | ||
|
|
3303b435ad | ||
|
|
03f237b32f | ||
|
|
cbc08861f4 | ||
|
|
df5f747975 | ||
|
|
02929ea4f5 | ||
|
|
ee409f1ee1 | ||
|
|
1d56948c4d | ||
|
|
8d4c8698de | ||
|
|
e72e723c1e | ||
|
|
68db3cd2ab | ||
|
|
a2d21f1042 | ||
|
|
c0965ad200 | ||
|
|
6530443e41 | ||
|
|
93a4bbdc20 | ||
|
|
92a40c87a5 | ||
|
|
d745863e54 | ||
|
|
717a3b1afa | ||
|
|
dd2876f484 | ||
|
|
10593d8172 | ||
|
|
7900c1b740 | ||
|
|
13c1986f02 | ||
|
|
76c7eb757b | ||
|
|
09d9c3a944 | ||
|
|
1e0b2bca4b | ||
|
|
9e78add245 | ||
|
|
143eeaa7b5 | ||
|
|
a622aa41d7 | ||
|
|
307f0e0823 | ||
|
|
04ff4b4c9c | ||
|
|
b04996d917 | ||
|
|
eae806390b | ||
|
|
96570e93b9 | ||
|
|
4ce7490b3b | ||
|
|
3848176990 | ||
|
|
02dd3f997f | ||
|
|
82212edba0 | ||
|
|
2ff40c4869 | ||
|
|
8c5f967f86 | ||
|
|
c3abcccf35 | ||
|
|
42495b36a3 | ||
|
|
2e9f64a7f7 | ||
|
|
72ebc723b7 | ||
|
|
b59785563f | ||
|
|
88b1aa465c | ||
|
|
1e82962b37 | ||
|
|
f2731b7263 | ||
|
|
f3dab3996d | ||
|
|
dd79918d2e | ||
|
|
c57f34b3eb | ||
|
|
19450df26b | ||
|
|
1a2dd1a812 | ||
|
|
1faf5b2199 | ||
|
|
d70998ac81 | ||
|
|
ab180aa385 | ||
|
|
b8788c9e7e | ||
|
|
452fac4099 | ||
|
|
97390a2af5 | ||
|
|
77df79871b | ||
|
|
f180e8452d | ||
|
|
5f3620e058 | ||
|
|
abcecb124d | ||
|
|
4a5f1aece1 | ||
|
|
10a40c4683 | ||
|
|
dabbdc8af9 | ||
|
|
72c236f651 | ||
|
|
36742a6fdb | ||
|
|
fee8bcc63c | ||
|
|
cf002bb0c0 | ||
|
|
425add976d | ||
|
|
5da128b0c7 | ||
|
|
20732c1e89 | ||
|
|
5c2276c73f | ||
|
|
f2dc80592e | ||
|
|
79dfede306 | ||
|
|
827a085c5e | ||
|
|
bf4408d6da | ||
|
|
a48f7ea48b | ||
|
|
b68c45ca93 | ||
|
|
adfbc6ca28 | ||
|
|
b3dbef1377 | ||
|
|
9e1b61e0f0 | ||
|
|
c056f6c895 | ||
|
|
ac1c62a07d | ||
|
|
93bcd46d55 | ||
|
|
a214977c83 | ||
|
|
01d3badc9b | ||
|
|
9884a2fc76 | ||
|
|
7a2b374526 | ||
|
|
92f81b3004 | ||
|
|
95e62ce30a | ||
|
|
3517eff4de | ||
|
|
8191c8fcea | ||
|
|
ed0af49767 | ||
|
|
adafe05caf | ||
|
|
da1e1b8d3b | ||
|
|
ef4ee2f9b0 | ||
|
|
f955076905 | ||
|
|
fefedb3866 | ||
|
|
7d229b55ee | ||
|
|
e277141c97 | ||
|
|
242fc1a4cb | ||
|
|
eeedef972a | ||
|
|
0e7b399ba8 | ||
|
|
eaa7d28823 | ||
|
|
b97289f7eb | ||
|
|
6005d80b20 | ||
|
|
55c676d6a5 | ||
|
|
b1c0185d85 | ||
|
|
ed8a847ae6 | ||
|
|
f3a28f38e2 | ||
|
|
ae684c3a82 | ||
|
|
3c171785d2 | ||
|
|
949b487445 | ||
|
|
d953e32003 | ||
|
|
c3c6723d7b | ||
|
|
bcfbc07bac | ||
|
|
0ba45f1006 | ||
|
|
13fc1b7169 | ||
|
|
ac11ff4cc9 | ||
|
|
a5c3e5aca7 | ||
|
|
f2ba3071fd | ||
|
|
c1584509e2 | ||
|
|
aa2eac4dcc | ||
|
|
3d8fbc8a61 | ||
|
|
43995a346d | ||
|
|
4ac142ce9e | ||
|
|
2849cc089d | ||
|
|
2627638192 | ||
|
|
43653242ed | ||
|
|
d486a30a6d | ||
|
|
80b5323fe2 | ||
|
|
41751a3625 | ||
|
|
eb68b52800 | ||
|
|
24cc1f5a5e | ||
|
|
9bcfc8141a | ||
|
|
776e45473c | ||
|
|
62d0013d41 | ||
|
|
3bf5d07fa2 | ||
|
|
597ff5ec11 | ||
|
|
a1b1915dfb | ||
|
|
56dfd2f093 | ||
|
|
8043d96d03 | ||
|
|
f88cd44d52 | ||
|
|
98ed395962 | ||
|
|
966ecf74f1 | ||
|
|
5cb34a6e82 | ||
|
|
16a74d5cc9 | ||
|
|
b3ce12c575 | ||
|
|
a159292173 | ||
|
|
93a3229c6d | ||
|
|
9122d2ab49 | ||
|
|
7cdc244d95 | ||
|
|
1366f44ada | ||
|
|
47e10dcf53 | ||
|
|
9b03f1b5a2 | ||
|
|
909145058f | ||
|
|
b008bfbc96 | ||
|
|
2f2c2d5910 | ||
|
|
8ac2087abc | ||
|
|
694a22a295 | ||
|
|
44497599f6 | ||
|
|
14f75b001c | ||
|
|
cca12d16e3 | ||
|
|
3a438d1084 | ||
|
|
2fe30b0837 | ||
|
|
e241ff09b0 | ||
|
|
e39183915b | ||
|
|
43f3e686c6 | ||
|
|
3b9ae9c498 | ||
|
|
f2ebf4b10a | ||
|
|
b9dc6a61ad | ||
|
|
03f928d4d9 | ||
|
|
8ac87dd5b2 | ||
|
|
c5e1e3c6df | ||
|
|
1372cc4242 | ||
|
|
6bcae91008 | ||
|
|
134a300861 | ||
|
|
8150e1a6a0 | ||
|
|
42eb5c4744 | ||
|
|
7653c5e0ff | ||
|
|
325f0e3486 | ||
|
|
cca53464df | ||
|
|
f28e909987 | ||
|
|
e25022ecc1 | ||
|
|
820828757a | ||
|
|
a40767a01d | ||
|
|
12c4b8fe98 | ||
|
|
627e5cf54e | ||
|
|
cc8449b67e | ||
|
|
280bc71c0c | ||
|
|
d2631fde2b | ||
|
|
c968abae08 | ||
|
|
b675161c79 | ||
|
|
0a04ab9924 | ||
|
|
cd65eaf6cb | ||
|
|
89293e80aa | ||
|
|
437ba872c1 | ||
|
|
8d04c20ed5 | ||
|
|
a2e519beeb | ||
|
|
37ab647895 | ||
|
|
0464ad729c | ||
|
|
7195666f09 | ||
|
|
1ab9e68f0f | ||
|
|
8553a8b6b9 | ||
|
|
0d371d4816 | ||
|
|
0082816f53 | ||
|
|
26745edeb5 | ||
|
|
394b93bbd2 | ||
|
|
2903f6a191 | ||
|
|
59bc86ff46 | ||
|
|
ed974cd9fe | ||
|
|
87a0479324 | ||
|
|
93a3bc5c4c | ||
|
|
30cbefc453 | ||
|
|
2613916d15 | ||
|
|
55dff6347a | ||
|
|
86ae20bfbb | ||
|
|
44141c5727 | ||
|
|
d6fc7f182f | ||
|
|
2200d86e8a | ||
|
|
1c140a563a | ||
|
|
c58a9530b1 | ||
|
|
eca450855e | ||
|
|
43087d6370 | ||
|
|
d10701f743 | ||
|
|
3955ccd85b | ||
|
|
50b2b9c591 | ||
|
|
32249ab897 | ||
|
|
e311837418 | ||
|
|
35d2908934 | ||
|
|
925daaeb63 | ||
|
|
a498669ad8 | ||
|
|
e3cdc44edc | ||
|
|
1d1b79b6cf | ||
|
|
1ccd804a40 | ||
|
|
6f6cf15674 | ||
|
|
a98472c1bb | ||
|
|
cc622f9ccc | ||
|
|
6ad6511762 | ||
|
|
fe76665687 | ||
|
|
2666641560 | ||
|
|
37be2afa98 | ||
|
|
b257d053f6 | ||
|
|
ce8bb8c349 | ||
|
|
9e2a8214a9 | ||
|
|
ae7b2f49b0 | ||
|
|
f5944fa138 | ||
|
|
6ef4219b2a | ||
|
|
3d4b7babb4 | ||
|
|
53a2ce64b4 | ||
|
|
e4e0ace9a9 | ||
|
|
5f72999a44 | ||
|
|
2aaaf9df05 | ||
|
|
e6e3cec3f1 | ||
|
|
65637a33d1 | ||
|
|
5c0ed25684 | ||
|
|
a867645e45 | ||
|
|
bcbb02b81e | ||
|
|
b54c3fb085 | ||
|
|
a0dedafc10 | ||
|
|
4bb88fa79b | ||
|
|
8fa7ddca6d | ||
|
|
b0c4cc77a7 | ||
|
|
c904005498 | ||
|
|
8fd7492840 | ||
|
|
59f4604eb6 | ||
|
|
2b120ded77 | ||
|
|
f062a78768 | ||
|
|
6e8c0f6c89 | ||
|
|
cd971ea91e | ||
|
|
63b5e48805 | ||
|
|
9d84c8f596 | ||
|
|
11bb981c99 | ||
|
|
2b2a7e907b | ||
|
|
93be22e596 | ||
|
|
57947d05e4 | ||
|
|
49cae68578 | ||
|
|
381574c1c9 | ||
|
|
ac47e05b93 | ||
|
|
72eedcdf14 | ||
|
|
1225b0c0fd | ||
|
|
9c5c404c71 | ||
|
|
4fc76a4dc3 | ||
|
|
410c603cbd | ||
|
|
09ba4cdde4 | ||
|
|
f1726cf815 | ||
|
|
1e69fdbb53 | ||
|
|
04b1ef83d2 | ||
|
|
25f5e34e66 | ||
|
|
ccd87381b0 | ||
|
|
a1fad00292 | ||
|
|
c9e34420e1 | ||
|
|
9977578393 | ||
|
|
48d30730fe | ||
|
|
f0b986318a | ||
|
|
3f3812c305 | ||
|
|
56d9b46d28 | ||
|
|
e3a7f143eb | ||
|
|
889f27d119 | ||
|
|
aa6e27b95d | ||
|
|
cdc3df3890 | ||
|
|
1b4da70ee7 | ||
|
|
19251770fd | ||
|
|
698c2a7682 | ||
|
|
136cf68e04 | ||
|
|
493eb47af3 | ||
|
|
539f9fc9d0 | ||
|
|
ecc8c80664 | ||
|
|
74313b1600 | ||
|
|
b7013f3389 | ||
|
|
e49287f957 | ||
|
|
80de4900df | ||
|
|
52f7f3a29a | ||
|
|
7b95093dc5 | ||
|
|
18a4876110 | ||
|
|
29c55b43f4 | ||
|
|
3df6e1fdbd | ||
|
|
5e2fc0ae11 | ||
|
|
33df4bb3df | ||
|
|
4a50198f6e | ||
|
|
fbda6bc514 | ||
|
|
3e5a01637b | ||
|
|
146b289c42 | ||
|
|
7de46fd2b4 | ||
|
|
bc12f48ac7 | ||
|
|
25c768a630 | ||
|
|
d1fd4b2b9c | ||
|
|
6551798e70 | ||
|
|
97d4902ce0 | ||
|
|
07f93cb76b | ||
|
|
3041d50461 | ||
|
|
9a3949247d | ||
|
|
fe0807cec5 | ||
|
|
e867629ac5 | ||
|
|
cfee6a59e7 | ||
|
|
cee9dbc41e | ||
|
|
a7bcb93d75 | ||
|
|
9daa4237dc | ||
|
|
99819643dd | ||
|
|
1a1262caf5 | ||
|
|
c6a468fdcb | ||
|
|
13f6adad4d | ||
|
|
0f572bc06e | ||
|
|
48090d9d2f | ||
|
|
73ce576c53 | ||
|
|
4cb7850b42 | ||
|
|
79b5095a3f | ||
|
|
cee9c87d9e | ||
|
|
8c7fe0a72c | ||
|
|
72bdfbe6ad | ||
|
|
2e268996b1 | ||
|
|
59a6a52acf | ||
|
|
10b7d336ba | ||
|
|
d7c8b87fb6 | ||
|
|
d872574ab5 | ||
|
|
e450672333 | ||
|
|
4f22194222 | ||
|
|
10d23e0e5f | ||
|
|
d9ee03df73 | ||
|
|
5e32925a94 | ||
|
|
8c3d36d1b2 | ||
|
|
6a73282e80 | ||
|
|
c10f2f4914 | ||
|
|
4255076c44 | ||
|
|
e927f47566 | ||
|
|
bb1642c95f | ||
|
|
df63e19190 | ||
|
|
e6d5d5e7de | ||
|
|
18acb3cb27 | ||
|
|
77088e226f | ||
|
|
e6cae33061 | ||
|
|
db335cdb8f | ||
|
|
310ee3e2dc | ||
|
|
112f16ea90 | ||
|
|
764dc5b253 | ||
|
|
99f6e2f8a7 | ||
|
|
542620a9af | ||
|
|
82db829888 | ||
|
|
57c5f92877 | ||
|
|
3d5f0de968 | ||
|
|
23b87aeb1f | ||
|
|
d384348308 | ||
|
|
a33f88e078 | ||
|
|
6c8e81edfa | ||
|
|
ea3d5585a8 | ||
|
|
58afc7fc0c | ||
|
|
db5f84114e | ||
|
|
608a3c4d89 | ||
|
|
515309b11b | ||
|
|
de41a3ee17 | ||
|
|
81f46ae06f | ||
|
|
ee4e4838cd | ||
|
|
098207351b | ||
|
|
8e0b3565a3 | ||
|
|
f1b7f58ddc | ||
|
|
b4c903f82b | ||
|
|
23e1e04cd7 | ||
|
|
15927ad775 | ||
|
|
308c1beb16 | ||
|
|
c4c915bcc4 | ||
|
|
8c28fda456 | ||
|
|
5dda5a5980 | ||
|
|
625adb8395 | ||
|
|
3149169953 | ||
|
|
a64a492886 | ||
|
|
7ee9b8b60a | ||
|
|
f7cb1a1d49 | ||
|
|
90e2c08542 | ||
|
|
94e32784e1 | ||
|
|
a58e564bb7 | ||
|
|
6e92b4d7ce | ||
|
|
e4c62b85f1 | ||
|
|
4610ee8b70 | ||
|
|
1a51276b3d | ||
|
|
f4ca780f16 | ||
|
|
9f44b4bf67 | ||
|
|
bde86574b8 | ||
|
|
1dba99b74a | ||
|
|
d9746ef847 | ||
|
|
a4f93e0231 | ||
|
|
fa7bc750f0 | ||
|
|
e3095acfc3 | ||
|
|
31a59be5e6 | ||
|
|
37c67e7de2 | ||
|
|
c3e8abe333 | ||
|
|
1d77ca0ef9 | ||
|
|
98d2433620 | ||
|
|
5dc5cfb906 | ||
|
|
0d30d33aa3 | ||
|
|
da1989c6e0 | ||
|
|
51c2864fa6 | ||
|
|
a7e4a8e120 | ||
|
|
90a3f44399 | ||
|
|
97d0d11a94 | ||
|
|
bfa9fc2553 | ||
|
|
78760beeea | ||
|
|
8aa706fd49 | ||
|
|
7ccd45dd87 | ||
|
|
1f5b276d19 | ||
|
|
7b52118457 | ||
|
|
ee4d86766a | ||
|
|
930c595ae5 | ||
|
|
6de401ab49 | ||
|
|
a54c3db00f | ||
|
|
de7b57c2cb | ||
|
|
972e65d02b | ||
|
|
338ce99c7c | ||
|
|
ac14a68937 | ||
|
|
462e1b645f | ||
|
|
4cd7184b5b | ||
|
|
8e7bf64397 | ||
|
|
bb331ec8a5 | ||
|
|
12fe71654d | ||
|
|
854bfdafef | ||
|
|
dd3410f2b8 | ||
|
|
93137cf24b | ||
|
|
b4d1a3a067 | ||
|
|
7ac6ca5546 | ||
|
|
72f95bb428 | ||
|
|
273900d806 | ||
|
|
948953eb33 | ||
|
|
1e50409ce5 | ||
|
|
554124570b | ||
|
|
5be3d08bd0 | ||
|
|
502cd5f7ca | ||
|
|
85bc868760 | ||
|
|
b6121f8b75 | ||
|
|
628dda2d8d | ||
|
|
8b6f45662e | ||
|
|
a2090a3250 | ||
|
|
c056ba70fa | ||
|
|
1ee0fa0805 | ||
|
|
9b7c14e656 | ||
|
|
bf20d25984 | ||
|
|
fdf9196d58 | ||
|
|
7c1ff3029b | ||
|
|
4ddd293f3d | ||
|
|
db3bfaa08e | ||
|
|
787c143949 | ||
|
|
4e7f9a041a | ||
|
|
68c4f7b912 | ||
|
|
daf8e1ee57 | ||
|
|
8dbe128e33 | ||
|
|
1859e92e86 | ||
|
|
aa56382207 | ||
|
|
a3f17fbadb | ||
|
|
64db5b53da | ||
|
|
ee42a9550d | ||
|
|
6a838279c6 | ||
|
|
c447a3087e | ||
|
|
851eb6b57d | ||
|
|
2f1624b71b | ||
|
|
c22ecae58a | ||
|
|
a21d13d4ed | ||
|
|
9788c44819 | ||
|
|
b7ebd770f7 | ||
|
|
47e54f201e | ||
|
|
bc7fd3e097 | ||
|
|
297c77d593 | ||
|
|
8a58ab79cd | ||
|
|
a9000a7e43 | ||
|
|
f0455ec6e3 | ||
|
|
bce11f8b58 | ||
|
|
6e855f25c9 | ||
|
|
98530da07c | ||
|
|
d38e37cdf7 | ||
|
|
7c6240f341 | ||
|
|
9398c4e6ff | ||
|
|
76c9e7fd23 | ||
|
|
b42c264494 | ||
|
|
ec58adb202 | ||
|
|
45dc72970e | ||
|
|
0357cb98cc | ||
|
|
8f0125c06c | ||
|
|
c4709b8560 | ||
|
|
0970125d25 | ||
|
|
9794b8ed1b | ||
|
|
4843b2b30a | ||
|
|
ae25d095f2 | ||
|
|
e917b842bd | ||
|
|
e74abeedd6 | ||
|
|
7c4da04be1 | ||
|
|
c5541ff5c3 | ||
|
|
0fe219206e | ||
|
|
8dcb2512d8 | ||
|
|
d3382091bc | ||
|
|
785395167f | ||
|
|
4af6b4ad21 | ||
|
|
fd20c37c8f | ||
|
|
c7f30f0516 | ||
|
|
3d17d364d5 | ||
|
|
6baa5d893d | ||
|
|
20bdf918ab | ||
|
|
66626508f0 | ||
|
|
8430afcdd7 | ||
|
|
b4fd952f03 | ||
|
|
4052da2ecd | ||
|
|
bc35aa4f45 | ||
|
|
f7eddbaf79 | ||
|
|
51dbbffc6d | ||
|
|
c0930d3f31 | ||
|
|
a0bfd17ec4 | ||
|
|
2ce51dc7b2 | ||
|
|
6c9c0e0812 | ||
|
|
e93ac75aed | ||
|
|
ee73a638ba | ||
|
|
def9d487ef | ||
|
|
a4c4213ac8 | ||
|
|
26adc429ee | ||
|
|
a6c4ebb173 | ||
|
|
6c09da6bda | ||
|
|
da5fa61414 | ||
|
|
bd1c151eaa | ||
|
|
f7d49225a4 | ||
|
|
605a035b86 | ||
|
|
2b9cf7755a | ||
|
|
0f822e5bfd | ||
|
|
08bccb90fc | ||
|
|
bfd97b3a51 | ||
|
|
6b38b7f541 | ||
|
|
0f18b09ce4 | ||
|
|
a065afc55c | ||
|
|
a77eedd18f | ||
|
|
f4511ec67f | ||
|
|
0271fa729f | ||
|
|
4bc3e9d97b | ||
|
|
02b7eda2a7 | ||
|
|
f52d4c88a7 | ||
|
|
b99e7c50d0 | ||
|
|
cfa0caeb48 | ||
|
|
74e4e07da1 | ||
|
|
81b017a118 | ||
|
|
5abd03638b | ||
|
|
6997bb1b8e | ||
|
|
6c074111be | ||
|
|
b15350075c | ||
|
|
718f36caa3 | ||
|
|
fd597d5174 | ||
|
|
d2ed2217c7 | ||
|
|
81a99eb923 | ||
|
|
f6f35f221d | ||
|
|
e979895006 | ||
|
|
ae1e349647 | ||
|
|
87a2191dba | ||
|
|
b2b55e6412 | ||
|
|
59e01860d1 | ||
|
|
c773d9e6cc | ||
|
|
7002dc5576 | ||
|
|
56d586e449 | ||
|
|
d4b55a9b87 | ||
|
|
b6bbecce82 | ||
|
|
7e06a9cc2e | ||
|
|
6825bb69d9 | ||
|
|
17fb8ffd64 | ||
|
|
355301df67 | ||
|
|
c869721cca | ||
|
|
b20e12f63c | ||
|
|
41c1112c23 | ||
|
|
a644568299 | ||
|
|
45ecb0cd29 | ||
|
|
8a29052708 | ||
|
|
5ef50b7599 | ||
|
|
d48ad48e0e | ||
|
|
0adee465cc | ||
|
|
19a9ebb8a0 | ||
|
|
c21474545c | ||
|
|
8f04aeff73 | ||
|
|
e7ba0057d5 | ||
|
|
b960ecec4a | ||
|
|
c39f6f3ee5 | ||
|
|
d02097dd3d | ||
|
|
8c6eeb8b42 | ||
|
|
5b561a246c | ||
|
|
7e68a303a8 | ||
|
|
2eb5e622fb | ||
|
|
a7a7623203 | ||
|
|
5346434a2b | ||
|
|
528ed53624 | ||
|
|
4d6ee11578 | ||
|
|
1094abdd84 | ||
|
|
52751fe6e6 | ||
|
|
9314ab0ce7 | ||
|
|
aeef74372c | ||
|
|
490828caf2 | ||
|
|
a97266df06 | ||
|
|
c849cd043c | ||
|
|
6b3a81bb4d | ||
|
|
c85bb1dc24 | ||
|
|
02a913f2a0 | ||
|
|
fc292e1c0a | ||
|
|
59121c8426 | ||
|
|
97af74da0b | ||
|
|
4b2aef4596 | ||
|
|
589c20de4f | ||
|
|
511f475bdd | ||
|
|
6e1e3ac37d | ||
|
|
e78a8b69f3 | ||
|
|
0fa9e89b61 | ||
|
|
be5f4f6e8b | ||
|
|
6db990f7a4 | ||
|
|
5b39b0ff48 | ||
|
|
376c8869b7 | ||
|
|
f5b3e92e8a | ||
|
|
eaf95a24c3 | ||
|
|
31b06efc56 | ||
|
|
c1c2a2dce2 | ||
|
|
765cfd2d05 | ||
|
|
1c1957ba05 | ||
|
|
6a9d2ea5eb | ||
|
|
7da8d5a0be | ||
|
|
b9cf37d815 | ||
|
|
a8399ef1c2 | ||
|
|
9875a00221 | ||
|
|
e1ff8c5228 | ||
|
|
b47f397a26 | ||
|
|
51d31fe7cd | ||
|
|
3c00fda61c | ||
|
|
78a386ff41 | ||
|
|
5954b77a25 | ||
|
|
8e26e1f646 | ||
|
|
ed2b3590a4 | ||
|
|
55fb9e0189 | ||
|
|
8ba71ee6ac | ||
|
|
a914c2b6d3 | ||
|
|
b46b7ada11 | ||
|
|
30c6138323 |
14
.editorconfig
Normal file
@@ -0,0 +1,14 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.yml]
|
||||
indent_size = 2
|
||||
|
||||
[*.scss]
|
||||
indent_size = 2
|
||||
|
||||
[*.php]
|
||||
insert_final_newline = true
|
||||
42
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: 上报 BUG
|
||||
about: 报告问题,帮助改进项目
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## 描述这个 Bug
|
||||
|
||||
简明扼要地描述错误是什么。
|
||||
|
||||
|
||||
### 复现方式
|
||||
|
||||
复现的步骤:
|
||||
|
||||
1. 前往 '...'
|
||||
2. 点击 '....'
|
||||
3. 滚动到 '....'
|
||||
4. 看到错误
|
||||
|
||||
|
||||
### 期望的结果
|
||||
|
||||
简明扼要地描述你期望看到的结果。
|
||||
|
||||
|
||||
### 截图
|
||||
|
||||
如果可以的话,请添加截图或视频以帮助解释你的问题。
|
||||
|
||||
|
||||
### 平台
|
||||
|
||||
- 操作系统版本:
|
||||
- Apache/Nginx 版本:
|
||||
- 数据库版本:
|
||||
- PHP 版本:
|
||||
- Typecho 版本:
|
||||
- 浏览器版本:
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: 论坛支持
|
||||
url: https://forum.typecho.org/
|
||||
about: 交流使用心得,使用模板插件,寻求帮助等等
|
||||
23
.github/ISSUE_TEMPLATE/enhancement_request.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: 提改进建议
|
||||
about: 提出改进建议,改进项目现有功能
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## 你的改进是否与某个问题有关?请描述
|
||||
|
||||
简明扼要地描述问题产生的原因。例如:当 [...] 时,我总是很困惑。
|
||||
|
||||
|
||||
## 描述你想要的解决方案
|
||||
|
||||
简明扼要地描述你希望的解决方案。
|
||||
|
||||
|
||||
## 描述你考虑过的替代方案
|
||||
|
||||
简明扼要地描述你考虑过的任何替代解决方案或功能。
|
||||
|
||||
23
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: 新功能提议
|
||||
about: 为项目提出一个想法或可能的新功能
|
||||
title: ''
|
||||
labels: feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## 你的想法是否与某个问题有关?请描述
|
||||
|
||||
简明扼要地描述问题产生的原因。例如:当 [...] 时,我总是很困惑。
|
||||
|
||||
|
||||
## 描述你想要的解决方案
|
||||
|
||||
简明扼要地描述你希望的解决方案。
|
||||
|
||||
|
||||
## 描述你考虑过的替代方案
|
||||
|
||||
简明扼要地描述你考虑过的任何替代解决方案或功能。
|
||||
|
||||
7
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
Fixes #
|
||||
|
||||
## Proposed Changes
|
||||
|
||||
-
|
||||
-
|
||||
-
|
||||
58
.github/workflows/Typecho-dev-Ci.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Typecho Dev Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
php:
|
||||
name: PHP ${{ matrix.php }} Tests
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ !contains(github.event.head_commit.message, 'skip ci') }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php: ['7.4', '8.0', '8.1', '8.2']
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup PHP only
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
- name: Test
|
||||
run: |
|
||||
find . -type f -name '*.php' -print0 | xargs -0 -n1 -P4 php -l -n | (! grep -v "No syntax errors detected" )
|
||||
build:
|
||||
name: Typecho Build
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ !contains(github.event.head_commit.message, 'skip ci') && github.event_name != 'pull_request' && github.repository == 'typecho/typecho' }}
|
||||
needs:
|
||||
- php
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build
|
||||
cp -r LICENSE.txt index.php install.php admin install usr var build/
|
||||
mkdir build/usr/uploads/
|
||||
chmod 755 build/usr/uploads/
|
||||
rm -rf build/admin/src
|
||||
rm -rf build/usr/themes/classic-22/static/scss
|
||||
cd build && zip -q -r typecho.zip * && mv typecho.zip ../ && cd -
|
||||
- name: Upload a Build Artifact
|
||||
uses: WebFreak001/deploy-nightly@v1.1.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/typecho/typecho/releases/49532662/assets{?name,label}
|
||||
release_id: 49532662
|
||||
asset_path: ./typecho.zip
|
||||
asset_name: typecho.zip
|
||||
asset_content_type: application/zip
|
||||
max_releases: 1
|
||||
36
.github/workflows/Typecho-hotfix-Merge.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Typecho Hotfix Merge
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
- labeled
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
auto-merge:
|
||||
if: github.event.action == 'closed' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'fix/')
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Merge to dev branch
|
||||
uses: devmasx/merge-branch@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
from_branch: ${{ github.event.pull_request.head.ref }}
|
||||
target_branch: dev
|
||||
|
||||
label-merge:
|
||||
if: github.event.action == 'labeled' && !startsWith(github.event.pull_request.head.ref, 'fix/')
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Merge to dev branch
|
||||
uses: devmasx/merge-branch@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
label_name: 'merge-to-dev'
|
||||
target_branch: dev
|
||||
33
.github/workflows/Typecho-release-Ci.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
name: Typecho Build Release Ci
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build
|
||||
cp -r LICENSE.txt index.php install.php admin install usr var build/
|
||||
mkdir build/usr/uploads/
|
||||
chmod 755 build/usr/uploads/
|
||||
rm -rf build/admin/src
|
||||
rm -rf build/usr/themes/classic-22/static/scss
|
||||
cd build && zip -q -r typecho.zip * && mv typecho.zip ../ && cd -
|
||||
- name: Upload Release Asset
|
||||
uses: shogo82148/actions-upload-release-asset@v1
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./typecho.zip
|
||||
asset_name: typecho.zip
|
||||
asset_content_type: application/zip
|
||||
- name: Trigger language build
|
||||
run: |
|
||||
curl -XPOST -H "Authorization: token ${{ secrets.WORKFLOW_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.everest-preview+json" \
|
||||
-H "Content-Type: application/json" \
|
||||
https://api.github.com/repos/typecho/languages/actions/workflows/update.yml/dispatches --data '{"ref": "master"}'
|
||||
17
.gitignore
vendored
@@ -2,7 +2,6 @@
|
||||
.*.swo
|
||||
._*
|
||||
.DS_Store
|
||||
/Debug/
|
||||
/ImgCache/
|
||||
/Backup_rar/
|
||||
/Debug/
|
||||
@@ -18,9 +17,21 @@
|
||||
*.exp
|
||||
*.pdb
|
||||
*.rar
|
||||
*.mo
|
||||
*.po
|
||||
*.pot
|
||||
.smbdelete*
|
||||
*.sublime*
|
||||
.sass-cache
|
||||
config.rb
|
||||
/config.inc.php
|
||||
/usr/uploads/
|
||||
prepros.config
|
||||
config.inc.*
|
||||
usr/uploads/
|
||||
usr/*.db
|
||||
usr/plugins/
|
||||
!usr/plugins/HelloWorld
|
||||
usr/themes/*
|
||||
!usr/themes/default
|
||||
!usr/themes/classic-22
|
||||
node_modules/
|
||||
tools/tmp/
|
||||
|
||||
48
.phpstorm.meta.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace PHPSTORM_META {
|
||||
override(\Typecho\Widget::widget(0), map([
|
||||
'' => '@'
|
||||
]));
|
||||
|
||||
exitPoint(\Typecho\Widget\Response::redirect());
|
||||
exitPoint(\Typecho\Widget\Response::throwContent());
|
||||
exitPoint(\Typecho\Widget\Response::throwFile());
|
||||
exitPoint(\Typecho\Widget\Response::throwJson());
|
||||
exitPoint(\Typecho\Widget\Response::throwXml());
|
||||
exitPoint(\Typecho\Widget\Response::goBack());
|
||||
|
||||
override(\Widget\Options::__get(0), map([
|
||||
'feedUrl' => string,
|
||||
'feedRssUrl' => string,
|
||||
'feedAtomUrl' => string,
|
||||
'commentsFeedUrl' => string,
|
||||
'commentsFeedRssUrl' => string,
|
||||
'commentsFeedAtomUrl' => string,
|
||||
'xmlRpcUrl' => string,
|
||||
'index' => string,
|
||||
'siteUrl' => string,
|
||||
'routingTable' => \ArrayObject::class,
|
||||
'rootUrl' => string,
|
||||
'themeUrl' => string,
|
||||
'pluginUrl' => string,
|
||||
'adminUrl' => string,
|
||||
'loginUrl' => string,
|
||||
'loginAction' => string,
|
||||
'registerUrl' => string,
|
||||
'registerAction' => string,
|
||||
'profileUrl' => string,
|
||||
'logoutUrl' => string,
|
||||
'serverTimezone' => int,
|
||||
'contentType' => string,
|
||||
'software' => string,
|
||||
'version' => string,
|
||||
'markdown' => int,
|
||||
'allowedAttachmentTypes'=> \ArrayObject::class
|
||||
]));
|
||||
|
||||
override(\Typecho\Widget::__get(0), map([
|
||||
'sequence' => int,
|
||||
'length' => int
|
||||
]));
|
||||
}
|
||||
128
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
admin@typecho.org.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
37
CONTRIBUTING.md
Normal file
@@ -0,0 +1,37 @@
|
||||
Contributing to Typecho
|
||||
=======================
|
||||
|
||||
Thanks for considering contributing to Typecho! There are many ways to contribute to Typecho, and we appreciate all of them.
|
||||
|
||||
## Reporting Bugs
|
||||
|
||||
If you find a bug in the source code, you can help us by [submitting an issue](https://github.com/typecho/typecho/issues)
|
||||
to our [GitHub Repository](https://github.com/typecho/typecho). Even better, you can submit a Pull Request with a fix.
|
||||
|
||||
## Contributing Code
|
||||
|
||||
If you would like to contribute code to Typecho, please read the following guidelines:
|
||||
|
||||
* [Code of Conduct](CODE_OF_CONDUCT.md)
|
||||
* [Contributing Guide](CONTRIBUTING.md)
|
||||
* [Coding Style Guide](CODING_STYLE.md)
|
||||
|
||||
## Translations
|
||||
|
||||
Please see [TRANSLATION](https://github.com/typecho/languages) for details.
|
||||
|
||||
## Plugin Development
|
||||
|
||||
Please see [Plugin Development](http://docs.typecho.org/plugins) for details.
|
||||
|
||||
## Theme Development
|
||||
|
||||
Please see [Theme Development](http://docs.typecho.org/themes) for details.
|
||||
|
||||
## Community
|
||||
|
||||
* [Telegram Channel](https://t.me/typechodev)
|
||||
* [Homepage](http://typecho.org/)
|
||||
* [Documents](http://docs.typecho.org/)
|
||||
* [Community](http://forum.typecho.org/)
|
||||
* [Download](http://typecho.org/download)
|
||||
@@ -1,282 +1,282 @@
|
||||
The GNU General Public License (GPL)
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
The GNU General Public License (GPL)
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
30
README.md
Normal file
@@ -0,0 +1,30 @@
|
||||
Typecho Blogging Platform
|
||||
=========================
|
||||
|
||||
Typecho is a PHP-based blog software and is designed to be the most powerful blog engine in the world.
|
||||
Typecho is released under the GNU General Public License 2.0.
|
||||
|
||||
## Main Features
|
||||
|
||||
* Multiple databases support (MariaDB, MySQL, SQLite, PostgreSQL)
|
||||
* Markdown Support
|
||||
* Plugin Support
|
||||
* Theme Support
|
||||
* Custom Fields
|
||||
* Custom Pages
|
||||
|
||||
## Requirements
|
||||
|
||||
* PHP 7.4.0 or higher
|
||||
* Database (MariaDB, MySQL, SQLite, PostgreSQL)
|
||||
* MariaDB or MySQL 5.5.3 or higher
|
||||
* SQLite 3.7.11 or higher
|
||||
* PostgreSQL 9.1 or higher
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
## Contributing
|
||||
|
||||
Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
|
||||
3
SECURITY.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Security Policy
|
||||
|
||||
Vulnerabilities can be reported by emailing security@typecho.org
|
||||
107
admin/backup.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
include 'common.php';
|
||||
include 'header.php';
|
||||
include 'menu.php';
|
||||
|
||||
$actionUrl = $security->getTokenUrl(
|
||||
\Typecho\Router::url('do', array('action' => 'backup', 'widget' => 'Backup'),
|
||||
\Typecho\Common::url('index.php', $options->rootUrl)));
|
||||
|
||||
$backupFiles = \Widget\Backup::alloc()->listFiles();
|
||||
?>
|
||||
|
||||
<main class="main">
|
||||
<div class="body container">
|
||||
<?php include 'page-title.php'; ?>
|
||||
<div class="row typecho-page-main" role="main">
|
||||
<div class="col-mb-12 col-tb-8">
|
||||
<div id="typecho-welcome">
|
||||
<form action="<?php echo $actionUrl; ?>" method="post">
|
||||
<h3><?php _e('备份您的数据'); ?></h3>
|
||||
<ul>
|
||||
<li><?php _e('此备份操作仅包含<strong>内容数据</strong>, 并不会涉及任何<strong>设置信息</strong>'); ?></li>
|
||||
<li><?php _e('如果您的数据量过大, 为了避免操作超时, 建议您直接使用数据库提供的备份工具备份数据'); ?></li>
|
||||
<li><strong class="warning"><?php _e('为了缩小备份文件体积, 建议您在备份前删除不必要的数据'); ?></strong></li>
|
||||
</ul>
|
||||
<p><button class="btn primary" type="submit"><?php _e('开始备份 »'); ?></button></p>
|
||||
<input tabindex="1" type="hidden" name="do" value="export">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="backup-secondary" class="col-mb-12 col-tb-4" role="form">
|
||||
<h3><?php _e('恢复数据'); ?></h3>
|
||||
<ul class="typecho-option-tabs">
|
||||
<li class="active w-50"><a href="#from-upload"><?php _e('上传'); ?></a></li>
|
||||
<li class="w-50"><a href="#from-server"><?php _e('从服务器'); ?></a></li>
|
||||
</ul>
|
||||
|
||||
<form action="<?php echo $actionUrl; ?>" id="from-upload" class="tab-content" method="post" enctype="multipart/form-data">
|
||||
<ul class="typecho-option">
|
||||
<li>
|
||||
<input tabindex="2" id="backup-upload-file" name="file" type="file" class="file">
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="typecho-option typecho-option-submit">
|
||||
<li>
|
||||
<button tabindex="4" type="submit" class="btn primary"><?php _e('上传并恢复 »'); ?></button>
|
||||
<input type="hidden" name="do" value="import">
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
|
||||
<form action="<?php echo $actionUrl; ?>" id="from-server" class="tab-content hidden" method="post">
|
||||
<?php if (empty($backupFiles)): ?>
|
||||
<ul class="typecho-option">
|
||||
<li>
|
||||
<p class="description"><?php _e('将备份文件手动上传至服务器的 %s 目录下后, 这里会出现文件选项', __TYPECHO_BACKUP_DIR__); ?></p>
|
||||
</li>
|
||||
</ul>
|
||||
<?php else: ?>
|
||||
<ul class="typecho-option">
|
||||
<li>
|
||||
<label class="typecho-label" for="backup-select-file"><?php _e('选择一个备份文件恢复数据'); ?></label>
|
||||
<select tabindex="5" name="file" id="backup-select-file">
|
||||
<?php foreach ($backupFiles as $file): ?>
|
||||
<option value="<?php echo $file; ?>"><?php echo $file; ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</li>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
<ul class="typecho-option typecho-option-submit">
|
||||
<li>
|
||||
<button tabindex="7" type="submit" class="btn primary"><?php _e('选择并恢复 »'); ?></button>
|
||||
<input type="hidden" name="do" value="import">
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php
|
||||
include 'copyright.php';
|
||||
include 'common-js.php';
|
||||
include 'form-js.php';
|
||||
?>
|
||||
<script>
|
||||
$('#backup-secondary .typecho-option-tabs li').click(function() {
|
||||
$('#backup-secondary .typecho-option-tabs li').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
$(this).parents('#backup-secondary').find('.tab-content').addClass('hidden');
|
||||
|
||||
var selected_tab = $(this).find('a').attr('href');
|
||||
$(selected_tab).removeClass('hidden');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#backup-secondary form').submit(function (e) {
|
||||
if (!confirm('<?php _e('恢复操作将清除所有现有数据, 是否继续?'); ?>')) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<?php include 'footer.php'; ?>
|
||||
23
admin/category.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
include 'common.php';
|
||||
include 'header.php';
|
||||
include 'menu.php';
|
||||
?>
|
||||
|
||||
<main class="main">
|
||||
<div class="body container">
|
||||
<?php include 'page-title.php'; ?>
|
||||
<div class="row typecho-page-main" role="form">
|
||||
<div class="col-mb-12 col-tb-6 col-tb-offset-3">
|
||||
<?php \Widget\Metas\Category\Edit::alloc()->form()->render(); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php
|
||||
include 'copyright.php';
|
||||
include 'common-js.php';
|
||||
include 'form-js.php';
|
||||
include 'footer.php';
|
||||
?>
|
||||
@@ -1,20 +1,21 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<script src="<?php $options->adminUrl('js/jquery.js?v=' . $suffixVersion); ?>"></script>
|
||||
<script src="<?php $options->adminUrl('js/jquery-ui.js?v=' . $suffixVersion); ?>"></script>
|
||||
<script src="<?php $options->adminUrl('js/typecho.js?v=' . $suffixVersion); ?>"></script>
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<script src="<?php $options->adminStaticUrl('js', 'jquery.js'); ?>"></script>
|
||||
<script src="<?php $options->adminStaticUrl('js', 'jquery-ui.js'); ?>"></script>
|
||||
<script src="<?php $options->adminStaticUrl('js', 'typecho.js'); ?>"></script>
|
||||
<script>
|
||||
(function () {
|
||||
$(document).ready(function() {
|
||||
// 处理消息机制
|
||||
(function () {
|
||||
var prefix = '<?php echo Typecho_Cookie::getPrefix(); ?>',
|
||||
var prefix = '<?php echo \Typecho\Cookie::getPrefix(); ?>',
|
||||
cookies = {
|
||||
notice : $.cookie(prefix + '__typecho_notice'),
|
||||
noticeType : $.cookie(prefix + '__typecho_notice_type'),
|
||||
highlight : $.cookie(prefix + '__typecho_notice_highlight')
|
||||
},
|
||||
path = '<?php $parts = parse_url($options->siteUrl);
|
||||
echo empty($parts['path']) ? '/' : $parts['path']; ?>';
|
||||
path = '<?php echo \Typecho\Cookie::getPath(); ?>',
|
||||
domain = '<?php echo \Typecho\Cookie::getDomain(); ?>',
|
||||
secure = <?php echo json_encode(\Typecho\Cookie::getSecure()); ?>;
|
||||
|
||||
if (!!cookies.notice && 'success|notice|error'.indexOf(cookies.noticeType) >= 0) {
|
||||
var head = $('.typecho-head-nav'),
|
||||
@@ -24,31 +25,10 @@
|
||||
|
||||
if (head.length > 0) {
|
||||
p.insertAfter(head);
|
||||
offset = head.outerHeight();
|
||||
} else {
|
||||
p.prependTo(document.body);
|
||||
}
|
||||
|
||||
function checkScroll () {
|
||||
if ($(window).scrollTop() >= offset) {
|
||||
p.css({
|
||||
'position' : 'fixed',
|
||||
'top' : 0
|
||||
});
|
||||
} else {
|
||||
p.css({
|
||||
'position' : 'absolute',
|
||||
'top' : offset
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$(window).scroll(function () {
|
||||
checkScroll();
|
||||
});
|
||||
|
||||
checkScroll();
|
||||
|
||||
p.slideDown(function () {
|
||||
var t = $(this), color = '#C6D880';
|
||||
|
||||
@@ -59,19 +39,18 @@
|
||||
}
|
||||
|
||||
t.effect('highlight', {color : color})
|
||||
.delay(5000).slideUp(function () {
|
||||
.delay(5000).fadeOut(function () {
|
||||
$(this).remove();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$.cookie(prefix + '__typecho_notice', null, {path : path});
|
||||
$.cookie(prefix + '__typecho_notice_type', null, {path : path});
|
||||
$.cookie(prefix + '__typecho_notice', null, {path : path, domain: domain, secure: secure});
|
||||
$.cookie(prefix + '__typecho_notice_type', null, {path : path, domain: domain, secure: secure});
|
||||
}
|
||||
|
||||
if (cookies.highlight) {
|
||||
$('#' + cookies.highlight).effect('highlight', 1000);
|
||||
$.cookie(prefix + '__typecho_notice_highlight', null, {path : path});
|
||||
$.cookie(prefix + '__typecho_notice_highlight', null, {path : path, domain: domain, secure: secure});
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -79,13 +58,14 @@
|
||||
$('a').each(function () {
|
||||
var t = $(this), href = t.attr('href');
|
||||
|
||||
if ((href.length > 1 && href[0] == '#')
|
||||
if ((href && href[0] == '#')
|
||||
|| /^<?php echo preg_quote($options->adminUrl, '/'); ?>.*$/.exec(href)
|
||||
|| /^<?php echo substr(preg_quote(Typecho_Common::url('s', $options->index), '/'), 0, -1); ?>action\/[_a-zA-Z0-9\/]+.*$/.exec(href)) {
|
||||
|| /^<?php echo substr(preg_quote(\Typecho\Common::url('s', $options->index), '/'), 0, -1); ?>action\/[_a-zA-Z0-9\/]+.*$/.exec(href)) {
|
||||
return;
|
||||
}
|
||||
|
||||
t.attr('target', '_blank');
|
||||
t.attr('target', '_blank')
|
||||
.attr('rel', 'noopener noreferrer');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -3,21 +3,24 @@ if (!defined('__DIR__')) {
|
||||
define('__DIR__', dirname(__FILE__));
|
||||
}
|
||||
|
||||
define('__TYPECHO_ADMIN__', true);
|
||||
|
||||
/** 载入配置文件 */
|
||||
if (!@include_once __DIR__ . '/../config.inc.php') {
|
||||
if (!defined('__TYPECHO_ROOT_DIR__') && !@include_once __DIR__ . '/../config.inc.php') {
|
||||
file_exists(__DIR__ . '/../install.php') ? header('Location: ../install.php') : print('Missing Config File');
|
||||
exit;
|
||||
}
|
||||
|
||||
/** 初始化组件 */
|
||||
Typecho_Widget::widget('Widget_Init');
|
||||
\Widget\Init::alloc();
|
||||
|
||||
/** 注册一个初始化插件 */
|
||||
Typecho_Plugin::factory('admin/common.php')->begin();
|
||||
\Typecho\Plugin::factory('admin/common.php')->call('begin');
|
||||
|
||||
Typecho_Widget::widget('Widget_Options')->to($options);
|
||||
Typecho_Widget::widget('Widget_User')->to($user);
|
||||
Typecho_Widget::widget('Widget_Menu')->to($menu);
|
||||
\Widget\Options::alloc()->to($options);
|
||||
\Widget\User::alloc()->to($user);
|
||||
\Widget\Security::alloc()->to($security);
|
||||
\Widget\Menu::alloc()->to($menu);
|
||||
|
||||
/** 初始化上下文 */
|
||||
$request = $options->request;
|
||||
@@ -25,32 +28,27 @@ $response = $options->response;
|
||||
|
||||
/** 检测是否是第一次登录 */
|
||||
$currentMenu = $menu->getCurrentMenu();
|
||||
list($prefixVersion, $suffixVersion) = explode('/', $options->version);
|
||||
$params = parse_url($currentMenu[2]);
|
||||
$adminFile = basename($params['path']);
|
||||
|
||||
if (!$user->logged && !Typecho_Cookie::get('__typecho_first_run') && !empty($currentMenu)) {
|
||||
|
||||
if ('welcome.php' != $adminFile) {
|
||||
$response->redirect(Typecho_Common::url('welcome.php', $options->adminUrl));
|
||||
} else {
|
||||
Typecho_Cookie::set('__typecho_first_run', 1);
|
||||
}
|
||||
|
||||
} else {
|
||||
if (!empty($currentMenu)) {
|
||||
$params = parse_url($currentMenu[2]);
|
||||
$adminFile = basename($params['path']);
|
||||
|
||||
/** 检测版本是否升级 */
|
||||
if ($user->pass('administrator', true) && !empty($currentMenu)) {
|
||||
$mustUpgrade = (!defined('Typecho_Common::VERSION') || version_compare(str_replace('/', '.', Typecho_Common::VERSION),
|
||||
str_replace('/', '.', $options->version), '>'));
|
||||
if (!$user->logged && !\Typecho\Cookie::get('__typecho_first_run')) {
|
||||
if ('welcome.php' != $adminFile) {
|
||||
$response->redirect(\Typecho\Common::url('welcome.php', $options->adminUrl));
|
||||
} else {
|
||||
\Typecho\Cookie::set('__typecho_first_run', 1);
|
||||
}
|
||||
} elseif ($user->pass('administrator', true)) {
|
||||
/** 检测版本是否升级 */
|
||||
$mustUpgrade = version_compare(\Typecho\Common::VERSION, $options->version, '>');
|
||||
|
||||
if ($mustUpgrade && 'upgrade.php' != $adminFile) {
|
||||
$response->redirect(Typecho_Common::url('upgrade.php', $options->adminUrl));
|
||||
} else if (!$mustUpgrade && 'upgrade.php' == $adminFile) {
|
||||
if ($mustUpgrade && 'upgrade.php' != $adminFile && 'backup.php' != $adminFile) {
|
||||
$response->redirect(\Typecho\Common::url('upgrade.php', $options->adminUrl));
|
||||
} elseif (!$mustUpgrade && 'upgrade.php' == $adminFile) {
|
||||
$response->redirect($options->adminUrl);
|
||||
} else if (!$mustUpgrade && 'welcome.php' == $adminFile && $user->logged) {
|
||||
} elseif (!$mustUpgrade && 'welcome.php' == $adminFile && $user->logged) {
|
||||
$response->redirect($options->adminUrl);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<div class="typecho-foot" role="contentinfo">
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<footer class="typecho-foot" role="contentinfo">
|
||||
<div class="copyright">
|
||||
<?php _e('由 <a href="http://typecho.org">%s</a> 强力驱动, 版本 %s (%s)', $options->software, $prefixVersion, $suffixVersion); ?>
|
||||
<a href="https://typecho.org" class="i-logo-s">Typecho</a>
|
||||
<p><?php _e('由 <a href="https://typecho.org">%s</a> 强力驱动, 版本 %s', $options->software, $options->version); ?></p>
|
||||
</div>
|
||||
<nav class="resource">
|
||||
<a href="http://docs.typecho.org"><?php _e('帮助文档'); ?></a> •
|
||||
<a href="http://forum.typecho.org"><?php _e('支持论坛'); ?></a> •
|
||||
<a href="https://github.com/typecho/typecho-replica/issues"><?php _e('报告错误'); ?></a> •
|
||||
<a href="http://extends.typecho.org"><?php _e('资源下载'); ?></a>
|
||||
<a href="https://docs.typecho.org"><?php _e('帮助文档'); ?></a> •
|
||||
<a href="https://forum.typecho.org"><?php _e('支持论坛'); ?></a> •
|
||||
<a href="https://github.com/typecho/typecho/issues"><?php _e('报告错误'); ?></a> •
|
||||
<a href="https://typecho.org/download"><?php _e('资源下载'); ?></a>
|
||||
</nav>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
1
admin/css/install.css
Normal file
@@ -0,0 +1 @@
|
||||
h1{text-align:center}details summary{cursor:pointer}@keyframes fadein{from{opacity:0}to{opacity:1}}.fresh .keep-word{display:none}.keep .fresh-word{display:none}form>.message{display:none;padding:20px;border-radius:5px}.message textarea{width:100%;height:200px;resize:none;margin:10px 0}.message.fade{display:block;animation:fadein .5s linear}.message *:last-child{margin-bottom:0}.message p{margin-top:10px}.message p button{margin-left:5px}.message p button:first-child{margin-left:0}
|
||||
522
admin/css/normalize.css
vendored
@@ -1,406 +1,342 @@
|
||||
/*! normalize.css v2.1.3 | MIT License | git.io/normalize */
|
||||
/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */
|
||||
|
||||
/* ==========================================================================
|
||||
HTML5 display definitions
|
||||
/* Document
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Correct `block` display not defined in IE 8/9.
|
||||
*/
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct `inline-block` display not defined in IE 8/9.
|
||||
*/
|
||||
|
||||
audio,
|
||||
canvas,
|
||||
video {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent modern browsers from displaying `audio` without controls.
|
||||
* Remove excess height in iOS 5 devices.
|
||||
*/
|
||||
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `[hidden]` styling not present in IE 8/9.
|
||||
* Hide the `template` element in IE, Safari, and Firefox < 22.
|
||||
*/
|
||||
|
||||
[hidden],
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Base
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Set default font family to sans-serif.
|
||||
* 2. Prevent iOS text size adjust after orientation change, without disabling
|
||||
* user zoom.
|
||||
* 1. Correct the line height in all browsers.
|
||||
* 2. Prevent adjustments of font size after orientation changes in iOS.
|
||||
*/
|
||||
|
||||
html {
|
||||
font-family: sans-serif; /* 1 */
|
||||
-ms-text-size-adjust: 100%; /* 2 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
line-height: 1.15; /* 1 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
-moz-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
/* Sections
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove default margin.
|
||||
* Remove the margin in all browsers.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Links
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background color from active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background: transparent;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `outline` inconsistency between Chrome and other browsers.
|
||||
*/
|
||||
|
||||
a:focus {
|
||||
outline: thin dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability when focused and also mouse hovered in all browsers.
|
||||
*/
|
||||
|
||||
a:active,
|
||||
a:hover {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Typography
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address variable `h1` font-size and margin within `section` and `article`
|
||||
* contexts in Firefox 4+, Safari 5, and Chrome.
|
||||
* Correct the font size and margin on `h1` elements within `section` and
|
||||
* `article` contexts in Chrome, Firefox, and Safari.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/* Grouping content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in Firefox.
|
||||
* 2. Show the overflow in Edge and IE.
|
||||
*/
|
||||
|
||||
hr {
|
||||
box-sizing: content-box; /* 1 */
|
||||
height: 0; /* 1 */
|
||||
overflow: visible; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9, Safari 5, and Chrome.
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/* Text-level semantics
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background on active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove the bottom border in Chrome 57-
|
||||
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: 1px dotted;
|
||||
border-bottom: none; /* 1 */
|
||||
text-decoration: underline; /* 2 */
|
||||
text-decoration: underline dotted; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
|
||||
* Add the correct font weight in Chrome, Edge, and Safari.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bold;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in Safari 5 and Chrome.
|
||||
*/
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address differences between Firefox and other browsers.
|
||||
*/
|
||||
|
||||
hr {
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9.
|
||||
*/
|
||||
|
||||
mark {
|
||||
background: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct font family set oddly in Safari 5 and Chrome.
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, serif;
|
||||
font-size: 1em;
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability of pre-formatted text in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set consistent quote types.
|
||||
*/
|
||||
|
||||
q {
|
||||
quotes: "\201C" "\201D" "\2018" "\2019";
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent and variable font size in all browsers.
|
||||
* Add the correct font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||
* Prevent `sub` and `sup` elements from affecting the line height in
|
||||
* all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Embedded content
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/* Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove border when inside `a` element in IE 8/9.
|
||||
* Remove the border on images inside links in IE 10.
|
||||
*/
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct overflow displayed oddly in IE 9.
|
||||
*/
|
||||
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Figures
|
||||
/* Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address margin not present in IE 8/9 and Safari 5.
|
||||
*/
|
||||
|
||||
figure {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Define consistent border, margin, and padding.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #c0c0c0;
|
||||
margin: 0 2px;
|
||||
padding: 0.35em 0.625em 0.75em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `color` not being inherited in IE 8/9.
|
||||
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||
*/
|
||||
|
||||
legend {
|
||||
border: 0; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct font family not being inherited in all browsers.
|
||||
* 2. Correct font size not being inherited in all browsers.
|
||||
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
|
||||
* 1. Change the font styles in all browsers.
|
||||
* 2. Remove the margin in Firefox and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit; /* 1 */
|
||||
font-size: 100%; /* 2 */
|
||||
margin: 0; /* 3 */
|
||||
font-family: inherit; /* 1 */
|
||||
font-size: 100%; /* 1 */
|
||||
line-height: 1.15; /* 1 */
|
||||
margin: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||
* the UA stylesheet.
|
||||
* Show the overflow in IE.
|
||||
* 1. Show the overflow in Edge.
|
||||
*/
|
||||
|
||||
button,
|
||||
input {
|
||||
line-height: normal;
|
||||
input { /* 1 */
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||
* All other form control elements do not inherit `text-transform` values.
|
||||
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
|
||||
* Correct `select` style inheritance in Firefox 4+ and Opera.
|
||||
* Remove the inheritance of text transform in Edge, Firefox, and IE.
|
||||
* 1. Remove the inheritance of text transform in Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
select { /* 1 */
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||
* and `video` controls.
|
||||
* 2. Correct inability to style clickable `input` types in iOS.
|
||||
* 3. Improve usability and consistency of cursor style between image-type
|
||||
* `input` and others.
|
||||
* Correct the inability to style clickable types in iOS and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
html input[type="button"], /* 1 */
|
||||
input[type="reset"],
|
||||
input[type="submit"] {
|
||||
-webkit-appearance: button; /* 2 */
|
||||
cursor: pointer; /* 3 */
|
||||
[type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-set default cursor for disabled elements.
|
||||
*/
|
||||
|
||||
button[disabled],
|
||||
html input[disabled] {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address box sizing set to `content-box` in IE 8/9/10.
|
||||
* 2. Remove excess padding in IE 8/9/10.
|
||||
*/
|
||||
|
||||
input[type="checkbox"],
|
||||
input[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
|
||||
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
|
||||
* (include `-moz` to future-proof).
|
||||
*/
|
||||
|
||||
input[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
-moz-box-sizing: content-box;
|
||||
-webkit-box-sizing: content-box; /* 2 */
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and search cancel button in Safari 5 and Chrome
|
||||
* on OS X.
|
||||
*/
|
||||
|
||||
input[type="search"]::-webkit-search-cancel-button,
|
||||
input[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and border in Firefox 4+.
|
||||
* Remove the inner border and padding in Firefox.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove default vertical scrollbar in IE 8/9.
|
||||
* 2. Improve readability and alignment in all browsers.
|
||||
* Restore the focus styles unset by the previous rule.
|
||||
*/
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the padding in Firefox.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
padding: 0.35em 0.75em 0.625em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the text wrapping in Edge and IE.
|
||||
* 2. Correct the color inheritance from `fieldset` elements in IE.
|
||||
* 3. Remove the padding so developers are not caught out when they zero out
|
||||
* `fieldset` elements in all browsers.
|
||||
*/
|
||||
|
||||
legend {
|
||||
box-sizing: border-box; /* 1 */
|
||||
color: inherit; /* 2 */
|
||||
display: table; /* 1 */
|
||||
max-width: 100%; /* 1 */
|
||||
padding: 0; /* 3 */
|
||||
white-space: normal; /* 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
||||
*/
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the default vertical scrollbar in IE 10+.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto; /* 1 */
|
||||
vertical-align: top; /* 2 */
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Tables
|
||||
/**
|
||||
* 1. Add the correct box sizing in IE 10.
|
||||
* 2. Remove the padding in IE 10.
|
||||
*/
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the cursor style of increment and decrement buttons in Chrome.
|
||||
*/
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the odd appearance in Chrome and Safari.
|
||||
* 2. Correct the outline style in Safari.
|
||||
*/
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
outline-offset: -2px; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner padding in Chrome and Safari on macOS.
|
||||
*/
|
||||
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inability to style clickable types in iOS and Safari.
|
||||
* 2. Change font properties to `inherit` in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button; /* 1 */
|
||||
font: inherit; /* 2 */
|
||||
}
|
||||
|
||||
/* Interactive
|
||||
========================================================================== */
|
||||
|
||||
/*
|
||||
* Add the correct display in Edge, IE 10+, and Firefox.
|
||||
*/
|
||||
|
||||
details {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the correct display in all browsers.
|
||||
*/
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/* Misc
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove most spacing between table cells.
|
||||
* Add the correct display in IE 10+.
|
||||
*/
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10.
|
||||
*/
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
1573
admin/css/style.css
@@ -1,40 +1,34 @@
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
// 自定义字段
|
||||
$('#custom-field-expand').click(function() {
|
||||
var btn = $('i', this);
|
||||
if (btn.hasClass('i-caret-right')) {
|
||||
btn.removeClass('i-caret-right').addClass('i-caret-down');
|
||||
} else {
|
||||
btn.removeClass('i-caret-down').addClass('i-caret-right');
|
||||
}
|
||||
$(this).parent().toggleClass('fold');
|
||||
});
|
||||
|
||||
function attachDeleteEvent (el) {
|
||||
$('button.btn-xs', el).click(function () {
|
||||
if (confirm('<?php _e('确认要删除此字段吗?'); ?>')) {
|
||||
$(this).parents('tr').fadeOut(function () {
|
||||
$(this).parents('li').fadeOut(function () {
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
$(this).parents('form').trigger('change');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$('#custom-field table tbody tr').each(function () {
|
||||
$('#custom-field .fields .field').each(function () {
|
||||
attachDeleteEvent(this);
|
||||
});
|
||||
|
||||
$('#custom-field button.operate-add').click(function () {
|
||||
var html = '<tr><td><input type="text" name="fieldNames[]" placeholder="<?php _e('字段名称'); ?>" class="text-s w-100"></td>'
|
||||
+ '<td><select name="fieldTypes[]" id="">'
|
||||
var html = '<li class="field"><div class="field-name"><input type="text" name="fieldNames[]" placeholder="<?php _e('字段名称'); ?>" pattern="^[_a-zA-Z][_a-zA-Z0-9]*$" oninput="this.reportValidity()" class="text-s w-100">'
|
||||
+ '<select name="fieldTypes[]" id="">'
|
||||
+ '<option value="str"><?php _e('字符'); ?></option>'
|
||||
+ '<option value="int"><?php _e('整数'); ?></option>'
|
||||
+ '<option value="float"><?php _e('小数'); ?></option>'
|
||||
+ '</select></td>'
|
||||
+ '<td><textarea name="fieldValues[]" placeholder="<?php _e('字段值'); ?>" class="text-s w-100" rows="2"></textarea></td>'
|
||||
+ '<td><button type="button" class="btn-xs"><?php _e('删除'); ?></button></td></tr>',
|
||||
el = $(html).hide().appendTo('#custom-field table tbody').fadeIn();
|
||||
+ '<option value="json"><?php _e('JSON 结构'); ?></option>'
|
||||
+ '</select></div>'
|
||||
+ '<div class="field-value"><textarea name="fieldValues[]" placeholder="<?php _e('字段值'); ?>" class="text-s w-100" rows="2"></textarea>'
|
||||
+ '<button type="button" class="btn btn-xs"><?php _e('删除'); ?></button></div></li>',
|
||||
el = $(html).hide().appendTo('#custom-field .fields').fadeIn();
|
||||
|
||||
attachDeleteEvent(el);
|
||||
});
|
||||
|
||||
@@ -1,66 +1,72 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<?php if (!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<?php
|
||||
$fields = isset($post) ? $post->getFieldItems() : $page->getFieldItems();
|
||||
$defaultFields = isset($post) ? $post->getDefaultFieldItems() : $page->getDefaultFieldItems();
|
||||
?>
|
||||
<section id="custom-field" class="typecho-post-option<?php if (empty($defaultFields) && empty($fields)): ?> fold<?php endif; ?>">
|
||||
<label id="custom-field-expand" class="typecho-label"><i class="i-caret-right"></i> <?php _e('自定义字段'); ?></label>
|
||||
<table class="typecho-list-table mono">
|
||||
<colgroup>
|
||||
<col width="25%"/>
|
||||
<col width="10%"/>
|
||||
<col width="55%"/>
|
||||
<col width="10%"/>
|
||||
</colgroup>
|
||||
<?php foreach ($defaultFields as $field): ?>
|
||||
<?php list ($label, $input) = $field; ?>
|
||||
<tr>
|
||||
<td><?php $label->render(); ?></td>
|
||||
<td colspan="3"><?php $input->render(); ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php foreach ($fields as $field): ?>
|
||||
<tr>
|
||||
<td><input type="text" name="fieldNames[]" value="<?php echo htmlspecialchars($field['name']); ?>" class="text-s w-100"></td>
|
||||
<td>
|
||||
<select name="fieldTypes[]" id="">
|
||||
<option value="str"<?php if ('str' == $field['type']): ?> selected<?php endif; ?>><?php _e('字符'); ?></option>
|
||||
<option value="int"<?php if ('int' == $field['type']): ?> selected<?php endif; ?>><?php _e('整数'); ?></option>
|
||||
<option value="float"<?php if ('float' == $field['type']): ?> selected<?php endif; ?>><?php _e('小数'); ?></option>
|
||||
</select>
|
||||
</td>
|
||||
<td><textarea name="fieldValues[]" class="text-s w-100" rows="2"><?php echo htmlspecialchars($field[$field['type'] . '_value']); ?></textarea></td>
|
||||
<td>
|
||||
<button type="button" class="btn-xs"><?php _e('删除'); ?></button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php if (empty($defaultFields) && empty($fields)): ?>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="title" class="visuallyhidden"><?php _e('字段名称'); ?></label>
|
||||
<input type="text" name="fieldNames[]" placeholder="<?php _e('字段名称'); ?>" class="text-s w-100">
|
||||
</td>
|
||||
<td>
|
||||
<label for="title" class="visuallyhidden"><?php _e('字段类型'); ?></label>
|
||||
<select name="fieldTypes[]" id="">
|
||||
<option value="str"><?php _e('字符'); ?></option>
|
||||
<option value="int"><?php _e('整数'); ?></option>
|
||||
<option value="float"><?php _e('小数'); ?></option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<label for="title" class="visuallyhidden"><?php _e('字段值'); ?></label>
|
||||
<textarea name="fieldValues[]" placeholder="<?php _e('字段值'); ?>" class="text-s w-100" rows="2"></textarea>
|
||||
</td>
|
||||
<td>
|
||||
<button type="button" class="btn-xs"><?php _e('删除'); ?></button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
<div class="description clearfix">
|
||||
<button type="button" class="btn-xs operate-add"><?php _e('+添加字段'); ?></button>
|
||||
<?php _e('自定义字段可以扩展你的模板功能, 使用方法参见 <a href="">帮助文档</a>'); ?>
|
||||
</div>
|
||||
</section>
|
||||
<details id="custom-field"
|
||||
class="typecho-post-option" <?php if (!empty($defaultFields) || !empty($fields)): ?>open<?php endif; ?>>
|
||||
<summary><?php _e('自定义字段'); ?></summary>
|
||||
<ul class="fields mono">
|
||||
<?php foreach ($defaultFields as $field): ?>
|
||||
<?php [$label, $input] = $field; ?>
|
||||
<li class="field">
|
||||
<div class="field-name"><?php $label->render(); ?></div>
|
||||
<div class="field-value"><?php $input->render(); ?></div>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
<?php foreach ($fields as $field): ?>
|
||||
<li class="field">
|
||||
<div class="field-name">
|
||||
<label for="fieldname" class="sr-only"><?php _e('字段名称'); ?></label>
|
||||
<input type="text" name="fieldNames[]" value="<?php echo htmlspecialchars($field['name']); ?>"
|
||||
id="fieldname" pattern="^[_a-zA-Z][_a-zA-Z0-9]*$" oninput="this.reportValidity()" class="text-s w-100">
|
||||
<label for="fieldtype" class="sr-only"><?php _e('字段类型'); ?></label>
|
||||
<select name="fieldTypes[]" id="fieldtype">
|
||||
<option
|
||||
value="str"<?php if ('str' == $field['type']): ?> selected<?php endif; ?>><?php _e('字符'); ?></option>
|
||||
<option
|
||||
value="int"<?php if ('int' == $field['type']): ?> selected<?php endif; ?>><?php _e('整数'); ?></option>
|
||||
<option
|
||||
value="float"<?php if ('float' == $field['type']): ?> selected<?php endif; ?>><?php _e('小数'); ?></option>
|
||||
<option
|
||||
value="json"<?php if ('json' == $field['type']): ?> selected<?php endif; ?>><?php _e('JSON 结构'); ?></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field-value">
|
||||
<label for="fieldvalue" class="sr-only"><?php _e('字段值'); ?></label>
|
||||
<textarea name="fieldValues[]" id="fieldvalue" class="text-s w-100"
|
||||
rows="2"><?php echo htmlspecialchars($field[($field['type'] == 'json' ? 'str' : $field['type']) . '_value']); ?></textarea>
|
||||
<button type="button" class="btn btn-xs"><?php _e('删除'); ?></button>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
<?php if (empty($defaultFields) && empty($fields)): ?>
|
||||
<li class="field">
|
||||
<div class="field-name">
|
||||
<label for="fieldname" class="sr-only"><?php _e('字段名称'); ?></label>
|
||||
<input type="text" name="fieldNames[]" placeholder="<?php _e('字段名称'); ?>" id="fieldname"
|
||||
class="text-s w-100" pattern="^[_a-zA-Z][_a-zA-Z0-9]*$" oninput="this.reportValidity()">
|
||||
<label for="fieldtype" class="sr-only"><?php _e('字段类型'); ?></label>
|
||||
<select name="fieldTypes[]" id="fieldtype">
|
||||
<option value="str"><?php _e('字符'); ?></option>
|
||||
<option value="int"><?php _e('整数'); ?></option>
|
||||
<option value="float"><?php _e('小数'); ?></option>
|
||||
<option value="json"><?php _e('JSON 结构'); ?></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field-value">
|
||||
<label for="fieldvalue" class="sr-only"><?php _e('字段值'); ?></label>
|
||||
<textarea name="fieldValues[]" placeholder="<?php _e('字段值'); ?>" id="fieldvalue"
|
||||
class="text-s w-100" rows="2"></textarea>
|
||||
<button type="button" class="btn btn-xs"><?php _e('删除'); ?></button>
|
||||
</div>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
<div class="add">
|
||||
<button type="button" class="btn btn-xs operate-add"><?php _e('+添加字段'); ?></button>
|
||||
<div class="description kit-hidden-mb">
|
||||
<?php _e('自定义字段可以扩展你的模板功能, 使用方法参见 <a href="https://docs.typecho.org/help/custom-fields">帮助文档</a>'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
@@ -1,15 +1,44 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<?php $content = !empty($post) ? $post : $page; if ($options->markdown && (!$content->have() || $content->isMarkdown)): ?>
|
||||
<script src="<?php $options->adminUrl('js/pagedown.js?v=' . $suffixVersion); ?>"></script>
|
||||
<script src="<?php $options->adminUrl('js/pagedown-extra.js?v=' . $suffixVersion); ?>"></script>
|
||||
<script src="<?php $options->adminUrl('js/diff.js?v=' . $suffixVersion); ?>"></script>
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<?php $content = !empty($post) ? $post : $page; ?>
|
||||
<script>
|
||||
(function () {
|
||||
$('#text').on('change', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}).on('input', function () {
|
||||
$(this).parents('form').trigger('write');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<?php if (!$options->markdown): ?>
|
||||
<script>
|
||||
(function () {
|
||||
const textarea = $('#text');
|
||||
|
||||
// 原始的插入图片和文件
|
||||
Typecho.insertFileToEditor = function (file, url, isImage) {
|
||||
const sel = textarea.getSelection(),
|
||||
html = isImage ? '<img src="' + url + '" alt="' + file + '" />'
|
||||
: '<a href="' + url + '">' + file + '</a>',
|
||||
offset = (sel ? sel.start : 0) + html.length;
|
||||
|
||||
textarea.replaceSelection(html);
|
||||
textarea.setSelection(offset, offset);
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
<?php else: ?>
|
||||
<script src="<?php $options->adminStaticUrl('js', 'hyperdown.js'); ?>"></script>
|
||||
<script src="<?php $options->adminStaticUrl('js', 'pagedown.js'); ?>"></script>
|
||||
<script src="<?php $options->adminStaticUrl('js', 'purify.js'); ?>"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
var textarea = $('#text'),
|
||||
toolbar = $('<div class="editor" id="wmd-button-bar" />').insertBefore(textarea.parent())
|
||||
const textarea = $('#text'),
|
||||
toolbar = $('<div class="editor" id="wmd-button-bar" />').insertBefore(textarea.parent()),
|
||||
preview = $('<div id="wmd-preview" class="wmd-hidetab" />').insertAfter('.editor');
|
||||
let isFullScreen = false;
|
||||
|
||||
var options = {};
|
||||
const options = {}, isMarkdown = <?php echo json_encode(!$content->have() || $content->isMarkdown); ?>;
|
||||
|
||||
options.strings = {
|
||||
bold: '<?php _e('加粗'); ?> <strong> Ctrl+B',
|
||||
@@ -48,7 +77,7 @@ $(document).ready(function () {
|
||||
exitFullscreen: '<?php _e('退出全屏'); ?> - Ctrl+E',
|
||||
fullscreenUnsupport: '<?php _e('此浏览器不支持全屏操作'); ?>',
|
||||
|
||||
imagedialog: '<p><b><?php _e('插入图片'); ?></b></p><p><?php _e('请在下方的输入框内输入要插入的远程图片地址'); ?></p><p><?php _e('您也可以使用编辑器下方的文件上传功能插入本地图片'); ?></p>',
|
||||
imagedialog: '<p><b><?php _e('插入图片'); ?></b></p><p><?php _e('请在下方的输入框内输入要插入的远程图片地址'); ?></p><p><?php _e('您也可以使用附件功能插入上传的本地图片'); ?></p>',
|
||||
linkdialog: '<p><b><?php _e('插入链接'); ?></b></p><p><?php _e('请在下方的输入框内输入要插入的链接地址'); ?></p>',
|
||||
|
||||
ok: '<?php _e('确定'); ?>',
|
||||
@@ -57,31 +86,18 @@ $(document).ready(function () {
|
||||
help: '<?php _e('Markdown语法帮助'); ?>'
|
||||
};
|
||||
|
||||
var converter = new Markdown.Converter(),
|
||||
editor = new Markdown.Editor(converter, '', options),
|
||||
diffMatch = new diff_match_patch(), last = '', preview = $('#wmd-preview'),
|
||||
mark = '@mark' + Math.ceil(Math.random() * 100000000) + '@',
|
||||
span = '<span class="diff" />';
|
||||
|
||||
// 设置markdown
|
||||
Markdown.Extra.init(converter, {
|
||||
extensions : 'all'
|
||||
});
|
||||
const converter = new HyperDown(),
|
||||
editor = new Markdown.Editor(converter, '', options);
|
||||
|
||||
// 自动跟随
|
||||
converter.hooks.chain('postConversion', function (html) {
|
||||
// clear special html tags
|
||||
html = html.replace(/<\/?(\!doctype|html|head|body|link|title|input|select|button|textarea|style|noscript)[^>]*>/ig, function (all) {
|
||||
return all.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/'/g, ''')
|
||||
.replace(/"/g, '"');
|
||||
});
|
||||
|
||||
// clear hard breaks
|
||||
html = html.replace(/\s*((?:<br>\n)+)\s*(<\/?(?:p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption|li|dd|dt)[^\w])/gm, '$2');
|
||||
converter.enableHtml(true);
|
||||
converter.enableLine(true);
|
||||
const reloadScroll = scrollableEditor(textarea, preview);
|
||||
|
||||
// 修正白名单
|
||||
converter.hook('makeHtml', function (html) {
|
||||
html = html.replace('<p><!--more--></p>', '<!--more-->');
|
||||
|
||||
if (html.indexOf('<!--more-->') > 0) {
|
||||
var parts = html.split(/\s*<\!\-\-more\-\->\s*/),
|
||||
summary = parts.shift(),
|
||||
@@ -91,143 +107,176 @@ $(document).ready(function () {
|
||||
+ '<div class="details">' + details + '</div>';
|
||||
}
|
||||
|
||||
|
||||
var diffs = diffMatch.diff_main(last, html);
|
||||
last = html;
|
||||
|
||||
if (diffs.length > 0) {
|
||||
var stack = [], markStr = mark;
|
||||
|
||||
for (var i = 0; i < diffs.length; i ++) {
|
||||
var diff = diffs[i], op = diff[0], str = diff[1]
|
||||
sp = str.lastIndexOf('<'), ep = str.lastIndexOf('>');
|
||||
|
||||
if (op != 0) {
|
||||
if (sp >=0 && sp > ep) {
|
||||
if (op > 0) {
|
||||
stack.push(str.substring(0, sp) + markStr + str.substring(sp));
|
||||
} else {
|
||||
var lastStr = stack[stack.length - 1], lastSp = lastStr.lastIndexOf('<');
|
||||
stack[stack.length - 1] = lastStr.substring(0, lastSp) + markStr + lastStr.substring(lastSp);
|
||||
}
|
||||
} else {
|
||||
if (op > 0) {
|
||||
stack.push(str + markStr);
|
||||
} else {
|
||||
stack.push(markStr);
|
||||
}
|
||||
}
|
||||
|
||||
markStr = '';
|
||||
} else {
|
||||
stack.push(str);
|
||||
}
|
||||
// 替换block
|
||||
html = html.replace(/<(iframe|embed)\s+([^>]*)>/ig, function (all, tag, src) {
|
||||
if (src[src.length - 1] === '/') {
|
||||
src = src.substring(0, src.length - 1);
|
||||
}
|
||||
|
||||
html = stack.join('');
|
||||
return '<div class="embed"><strong>'
|
||||
+ tag + '</strong> : ' + $.trim(src) + '</div>';
|
||||
});
|
||||
|
||||
if (!markStr) {
|
||||
var pos = html.indexOf(mark), prev = html.substring(0, pos),
|
||||
next = html.substr(pos + mark.length),
|
||||
sp = prev.lastIndexOf('<'), ep = prev.lastIndexOf('>');
|
||||
|
||||
if (sp >= 0 && sp > ep) {
|
||||
html = prev.substring(0, sp) + span + prev.substring(sp) + next;
|
||||
} else {
|
||||
html = prev + span + next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return html;
|
||||
return DOMPurify.sanitize(html, {USE_PROFILES: {html: true}});
|
||||
});
|
||||
|
||||
editor.hooks.chain('onPreviewRefresh', function () {
|
||||
var diff = $('.diff', preview);
|
||||
const images = $('img', preview);
|
||||
let count = images.length;
|
||||
|
||||
if (diff.length > 0) {
|
||||
var p = diff.position(), lh = diff.parent().css('line-height');
|
||||
lh = !!lh ? parseInt(lh) : 0;
|
||||
if (count === 0) {
|
||||
reloadScroll(true);
|
||||
} else {
|
||||
images.bind('load error', function () {
|
||||
count --;
|
||||
|
||||
if (p.top < 0 || p.top > preview.height() - lh) {
|
||||
preview.scrollTo(diff, {
|
||||
offset : - 50
|
||||
});
|
||||
}
|
||||
if (count === 0) {
|
||||
reloadScroll(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var input = $('#text'), th = textarea.height(), ph = preview.height();
|
||||
<?php \Typecho\Plugin::factory('admin/editor-js.php')->call('markdownEditor', $content); ?>
|
||||
|
||||
let th = textarea.height(), ph = preview.height();
|
||||
const uploadBtn = $('<button type="button" id="btn-fullscreen-upload" class="btn btn-link">'
|
||||
+ '<i class="i-upload"><?php _e('附件'); ?></i></button>')
|
||||
.prependTo('.submit .right')
|
||||
.click(function() {
|
||||
$('a', $('.typecho-option-tabs li').not('.active')).trigger('click');
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.typecho-option-tabs li').click(function () {
|
||||
uploadBtn.find('i').toggleClass('i-upload-active',
|
||||
$('#tab-files-btn', this).length > 0);
|
||||
});
|
||||
|
||||
editor.hooks.chain('enterFakeFullScreen', function () {
|
||||
th = textarea.height();
|
||||
ph = preview.height();
|
||||
$(document.body).addClass('fullscreen');
|
||||
var h = $(window).height() - toolbar.outerHeight();
|
||||
const h = $(window).height() - toolbar.outerHeight();
|
||||
|
||||
textarea.css('height', h);
|
||||
preview.css('height', h);
|
||||
isFullScreen = true;
|
||||
});
|
||||
|
||||
editor.hooks.chain('enterFullScreen', function () {
|
||||
$(document.body).addClass('fullscreen');
|
||||
|
||||
var h = window.screen.height - toolbar.outerHeight();
|
||||
const h = window.screen.height - toolbar.outerHeight();
|
||||
textarea.css('height', h);
|
||||
preview.css('height', h);
|
||||
isFullScreen = true;
|
||||
});
|
||||
|
||||
editor.hooks.chain('exitFullScreen', function () {
|
||||
$(document.body).removeClass('fullscreen');
|
||||
textarea.height(th);
|
||||
preview.height(ph);
|
||||
isFullScreen = false;
|
||||
});
|
||||
|
||||
editor.run();
|
||||
editor.hooks.chain('commandExecuted', function () {
|
||||
textarea.trigger('input');
|
||||
});
|
||||
|
||||
var imageButton = $('#wmd-image-button'),
|
||||
linkButton = $('#wmd-link-button');
|
||||
editor.hooks.chain('save', function () {
|
||||
Typecho.savePost();
|
||||
});
|
||||
|
||||
Typecho.insertFileToEditor = function (file, url, isImage) {
|
||||
var button = isImage ? imageButton : linkButton;
|
||||
function initMarkdown() {
|
||||
editor.run();
|
||||
|
||||
options.strings[isImage ? 'imagename' : 'linkname'] = file;
|
||||
button.trigger('click');
|
||||
const imageButton = $('#wmd-image-button'),
|
||||
linkButton = $('#wmd-link-button');
|
||||
|
||||
var checkDialog = setInterval(function () {
|
||||
if ($('.wmd-prompt-dialog').length > 0) {
|
||||
$('.wmd-prompt-dialog input').val(url).select();
|
||||
clearInterval(checkDialog);
|
||||
checkDialog = null;
|
||||
}
|
||||
}, 10);
|
||||
};
|
||||
Typecho.insertFileToEditor = function (file, url, isImage) {
|
||||
const button = isImage ? imageButton : linkButton;
|
||||
|
||||
options.strings[isImage ? 'imagename' : 'linkname'] = file;
|
||||
button.trigger('click');
|
||||
|
||||
// 编辑预览切换
|
||||
var edittab = $('.editor').prepend('<div class="wmd-edittab"><a href="#wmd-editarea" class="active">撰写</a><a href="#wmd-preview">预览</a></div>'),
|
||||
editarea = $(textarea.parent()).attr("id", "wmd-editarea");
|
||||
let checkDialog = setInterval(function () {
|
||||
if ($('.wmd-prompt-dialog').length > 0) {
|
||||
$('.wmd-prompt-dialog input').val(url).select();
|
||||
clearInterval(checkDialog);
|
||||
checkDialog = null;
|
||||
}
|
||||
}, 10);
|
||||
};
|
||||
|
||||
$(".wmd-edittab a").click(function() {
|
||||
$(".wmd-edittab a").removeClass('active');
|
||||
$(this).addClass("active");
|
||||
$("#wmd-editarea, #wmd-preview").addClass("wmd-hidetab");
|
||||
Typecho.uploadComplete = function (attachment) {
|
||||
Typecho.insertFileToEditor(attachment.title, attachment.url, attachment.isImage);
|
||||
};
|
||||
|
||||
// 编辑预览切换
|
||||
const edittab = $('.editor').append('<div class="wmd-edittab"><a href="#wmd-editarea" class="active"><?php _e('撰写'); ?></a><a href="#wmd-preview"><?php _e('预览'); ?></a></div>'),
|
||||
editarea = $(textarea.parent()).attr("id", "wmd-editarea");
|
||||
|
||||
$(".wmd-edittab a").click(function() {
|
||||
$(".wmd-edittab a").removeClass('active');
|
||||
$(this).addClass("active");
|
||||
$("#wmd-editarea, #wmd-preview").addClass("wmd-hidetab");
|
||||
|
||||
var selected_tab = $(this).attr("href"),
|
||||
selected_el = $(selected_tab).removeClass("wmd-hidetab");
|
||||
const selected_tab = $(this).attr("href"),
|
||||
selected_el = $(selected_tab).removeClass("wmd-hidetab");
|
||||
|
||||
// 预览时隐藏编辑器按钮
|
||||
if (selected_tab == "#wmd-preview") {
|
||||
$("#wmd-button-row").addClass("wmd-visualhide");
|
||||
} else {
|
||||
$("#wmd-button-row").removeClass("wmd-visualhide");
|
||||
}
|
||||
// 预览时隐藏编辑器按钮
|
||||
if (selected_tab === "#wmd-preview") {
|
||||
$("#wmd-button-row").addClass("wmd-visualhide");
|
||||
} else {
|
||||
$("#wmd-button-row").removeClass("wmd-visualhide");
|
||||
}
|
||||
|
||||
// 预览和编辑窗口高度一致
|
||||
$("#wmd-preview").outerHeight($("#wmd-editarea").innerHeight());
|
||||
// 预览和编辑窗口高度一致
|
||||
$("#wmd-preview").outerHeight($("#wmd-editarea").innerHeight());
|
||||
|
||||
return false;
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
// 剪贴板复制图片
|
||||
textarea.bind('paste', function (e) {
|
||||
const items = (e.clipboardData || e.originalEvent.clipboardData).items;
|
||||
|
||||
for (const item of items) {
|
||||
if (item.kind === 'file') {
|
||||
const file = item.getAsFile();
|
||||
|
||||
if (file.size > 0) {
|
||||
if (!file.name) {
|
||||
file.name = (new Date()).toISOString().replace(/\..+$/, '')
|
||||
+ '.' + file.type.split('/').pop();
|
||||
}
|
||||
|
||||
Typecho.uploadFile(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (isMarkdown) {
|
||||
initMarkdown();
|
||||
} else {
|
||||
const notice = $('<div class="message notice"><?php _e('这篇文章不是由Markdown语法创建的, 继续使用Markdown编辑它吗?'); ?> '
|
||||
+ '<button class="btn btn-xs primary yes"><?php _e('是'); ?></button> '
|
||||
+ '<button class="btn btn-xs no"><?php _e('否'); ?></button></div>')
|
||||
.hide().insertBefore(textarea).slideDown();
|
||||
|
||||
$('.yes', notice).click(function () {
|
||||
notice.remove();
|
||||
$('<input type="hidden" name="markdown" value="1" />').appendTo('.submit');
|
||||
initMarkdown();
|
||||
});
|
||||
|
||||
$('.no', notice).click(function () {
|
||||
notice.remove();
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
<?php
|
||||
|
||||
include 'common.php';
|
||||
|
||||
$panel = $request->get('panel');
|
||||
$panelTable = unserialize($options->panelTable);
|
||||
$panelTable = $options->panelTable;
|
||||
|
||||
if (!isset($panelTable['file']) || !in_array(urlencode($panel), $panelTable['file'])) {
|
||||
throw new Typecho_Plugin_Exception(_t('页面不存在'), 404);
|
||||
throw new \Typecho\Plugin\Exception(_t('页面不存在'), 404);
|
||||
}
|
||||
|
||||
require_once $panel;
|
||||
[$pluginName, $file] = explode('/', trim($panel, '/'), 2);
|
||||
|
||||
require_once $options->pluginDir($pluginName) . '/' . $file;
|
||||
|
||||
@@ -1,36 +1,21 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<?php
|
||||
if (isset($post) && $post instanceof Typecho_Widget && $post->have()) {
|
||||
$fileParentContent = $post;
|
||||
} else if (isset($page) && $page instanceof Typecho_Widget && $page->have()) {
|
||||
$fileParentContent = $page;
|
||||
$phpMaxFilesize = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : '0';
|
||||
|
||||
if (preg_match("/^([0-9]+)([a-z]{1,2})?$/i", $phpMaxFilesize, $matches)) {
|
||||
$size = intval($matches[1]);
|
||||
$unit = $matches[2] ?? 'b';
|
||||
|
||||
$phpMaxFilesize = round($size * pow(1024, stripos('bkmgtpezy', $unit[0])));
|
||||
}
|
||||
?>
|
||||
|
||||
<script src="<?php $options->adminUrl('js/filedrop.js?v=' . $suffixVersion); ?>"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
var errorWord = '<?php $val = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0;
|
||||
$last = strtolower($val[strlen($val)-1]);
|
||||
switch($last) {
|
||||
// The 'G' modifier is available since PHP 5.1.0
|
||||
case 'g':
|
||||
$val *= 1024;
|
||||
case 'm':
|
||||
$val *= 1024;
|
||||
case 'k':
|
||||
$val *= 1024;
|
||||
}
|
||||
|
||||
$val = number_format(ceil($val / (1024 *1024)));
|
||||
_e('文件上传失败, 请确认文件尺寸没有超过 %s 并且服务器文件目录可以写入', "{$val}Mb"); ?>',
|
||||
loading = $('<img src="<?php $options->adminUrl('img/ajax-loader.gif'); ?>" style="display:none" />')
|
||||
.appendTo(document.body);
|
||||
|
||||
function updateAttacmentNumber () {
|
||||
function updateAttachmentNumber () {
|
||||
var btn = $('#tab-files-btn'),
|
||||
balloon = $('.balloon', btn),
|
||||
count = $('#file-list li').length;
|
||||
count = $('#file-list li .insert').length;
|
||||
|
||||
if (count > 0) {
|
||||
if (!balloon.length) {
|
||||
@@ -39,149 +24,186 @@ $(document).ready(function() {
|
||||
}
|
||||
|
||||
balloon.html(count);
|
||||
} else if (0 == count && balloon.length > 0) {
|
||||
} else if (0 === count && balloon.length > 0) {
|
||||
balloon.remove();
|
||||
}
|
||||
}
|
||||
|
||||
updateAttacmentNumber();
|
||||
updateAttachmentNumber();
|
||||
|
||||
function fileUploadStart (file, id) {
|
||||
$('<li id="' + id + '" class="loading">'
|
||||
+ file + '</li>').prependTo('#file-list');
|
||||
}
|
||||
const uploadUrl = $('.upload-area').bind({
|
||||
dragenter : function (e) {
|
||||
$(this).parent().addClass('drag');
|
||||
},
|
||||
|
||||
function fileUploadComplete (id, url, data) {
|
||||
var li = $('#' + id).removeClass('loading').data('cid', data.cid)
|
||||
.data('url', data.url)
|
||||
.data('image', data.isImage)
|
||||
.html('<input type="hidden" name="attachment[]" value="' + data.cid + '" />'
|
||||
+ '<a class="insert" target="_blank" href="###" title="<?php _e('点击插入文件'); ?>">' + data.title + '</a><div class="info">' + data.bytes
|
||||
+ ' <a class="file" target="_blank" href="<?php $options->adminUrl('media.php'); ?>?cid='
|
||||
+ data.cid + '" title="<?php _e('编辑'); ?>"><i class="i-edit"></i></a>'
|
||||
+ ' <a class="delete" href="###" title="<?php _e('删除'); ?>"><i class="i-delete"></i></a></div>')
|
||||
.effect('highlight', 1000);
|
||||
|
||||
attachInsertEvent(li);
|
||||
attachDeleteEvent(li);
|
||||
updateAttacmentNumber();
|
||||
}
|
||||
dragover : function (e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
$(this).parent().addClass('drag');
|
||||
},
|
||||
|
||||
$('#tab-files').bind('init', function () {
|
||||
$('.upload-file').fileUpload({
|
||||
url : '<?php $options->index('/action/upload'
|
||||
. (isset($fileParentContent) ? '?cid=' . $fileParentContent->cid : '')); ?>',
|
||||
types : <?php
|
||||
$attachmenttypes = $options->allowedattachmenttypes;
|
||||
$attachmenttypescount = count($attachmenttypes);
|
||||
$types = array();
|
||||
drop : function (e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
$(this).parent().removeClass('drag');
|
||||
|
||||
for ($i = 0; $i < $attachmenttypescount; $i ++) {
|
||||
$types[] = '.' . $attachmenttypes[$i];
|
||||
}
|
||||
const files = e.originalEvent.dataTransfer.files;
|
||||
|
||||
echo json_encode($types);
|
||||
?>,
|
||||
typesError : '<?php _e('文件 %s 的类型不被支持'); ?>',
|
||||
onUpload : fileUploadStart,
|
||||
onError : function (id) {
|
||||
$('#' + id).remove();
|
||||
alert(errorWord);
|
||||
},
|
||||
onComplete : fileUploadComplete
|
||||
});
|
||||
});
|
||||
if (files.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$('#upload-panel').filedrop({
|
||||
url : '<?php $options->index('/action/upload'
|
||||
. (isset($fileParentContent) ? '?cid=' . $fileParentContent->cid : '')); ?>',
|
||||
allowedfileextensions : <?php
|
||||
$attachmenttypes = $options->allowedattachmenttypes;
|
||||
$attachmenttypescount = count($attachmenttypes);
|
||||
$types = array();
|
||||
|
||||
for ($i = 0; $i < $attachmenttypescount; $i ++) {
|
||||
$types[] = '.' . $attachmenttypes[$i];
|
||||
}
|
||||
|
||||
echo json_encode($types);
|
||||
?>,
|
||||
|
||||
maxfilesize : <?php
|
||||
$val = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0;
|
||||
$last = strtolower($val[strlen($val)-1]);
|
||||
switch($last) {
|
||||
// The 'G' modifier is available since PHP 5.1.0
|
||||
case 'g':
|
||||
$val *= 1024;
|
||||
case 'm':
|
||||
$val *= 1024;
|
||||
case 'k':
|
||||
$val *= 1024;
|
||||
}
|
||||
|
||||
echo ceil($val / (1024 * 1024));
|
||||
?>,
|
||||
|
||||
queuefiles : 5,
|
||||
|
||||
error: function(err, file) {
|
||||
switch(err) {
|
||||
case 'BrowserNotSupported':
|
||||
alert('<?php _e('浏览器不支持拖拽上传'); ?>');
|
||||
break;
|
||||
case 'TooManyFiles':
|
||||
alert('<?php _e('一次上传的文件不能多于%d个', 25); ?>');
|
||||
break;
|
||||
case 'FileTooLarge':
|
||||
alert('<?php $val = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0;
|
||||
$last = strtolower($val[strlen($val)-1]);
|
||||
switch($last) {
|
||||
// The 'G' modifier is available since PHP 5.1.0
|
||||
case 'g':
|
||||
$val *= 1024;
|
||||
case 'm':
|
||||
$val *= 1024;
|
||||
case 'k':
|
||||
$val *= 1024;
|
||||
}
|
||||
|
||||
$val = number_format(ceil($val / (1024 *1024)));
|
||||
_e('文件尺寸不能超过 %s', "{$val}Mb"); ?>');
|
||||
break;
|
||||
case 'FileTypeNotAllowed':
|
||||
// The file type is not in the specified list 'allowedfiletypes'
|
||||
break;
|
||||
case 'FileExtensionNotAllowed':
|
||||
alert('<?php _e('文件 %s 的类型不被支持'); ?>'.replace('%s', file.name));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
for (const file of files) {
|
||||
Typecho.uploadFile(file);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
dragOver : function () {
|
||||
$(this).addClass('drag');
|
||||
|
||||
dragend : function () {
|
||||
$(this).parent().removeClass('drag');
|
||||
},
|
||||
|
||||
dragLeave : function () {
|
||||
$(this).removeClass('drag');
|
||||
},
|
||||
|
||||
drop : function () {
|
||||
$(this).removeClass('drag');
|
||||
},
|
||||
|
||||
uploadStarted : function (i, file, len) {
|
||||
fileUploadStart(file.name, 'drag-' + i);
|
||||
},
|
||||
|
||||
uploadFinished : function (i, file, response) {
|
||||
fileUploadComplete('drag-' + i, response[0], response[1]);
|
||||
dragleave : function () {
|
||||
$(this).parent().removeClass('drag');
|
||||
}
|
||||
}).data('url');
|
||||
|
||||
const btn = $('.upload-file');
|
||||
const fileInput = $('<input type="file" name="file" />').hide().insertAfter(btn);
|
||||
|
||||
btn.click(function () {
|
||||
fileInput.click();
|
||||
return false;
|
||||
});
|
||||
|
||||
fileInput.change(function () {
|
||||
if (this.files.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Typecho.uploadFile(this.files[0]);
|
||||
});
|
||||
|
||||
function fileUploadStart (file) {
|
||||
$('<li id="' + file.id + '" class="loading">'
|
||||
+ file.name + '</li>').appendTo('#file-list');
|
||||
}
|
||||
|
||||
function fileUploadError (type, file) {
|
||||
let word = '<?php _e('上传出现错误'); ?>';
|
||||
|
||||
switch (type) {
|
||||
case 'size':
|
||||
word = '<?php _e('文件大小超过限制'); ?>';
|
||||
break;
|
||||
case 'type':
|
||||
word = '<?php _e('文件扩展名不被支持'); ?>';
|
||||
break;
|
||||
case 'duplicate':
|
||||
word = '<?php _e('文件已经上传过'); ?>';
|
||||
break;
|
||||
case 'network':
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
var fileError = '<?php _e('%s 上传失败'); ?>'.replace('%s', file.name),
|
||||
li, exist = $('#' + file.id);
|
||||
|
||||
if (exist.length > 0) {
|
||||
li = exist.removeClass('loading').html(fileError);
|
||||
} else {
|
||||
li = $('<li>' + fileError + '<br />' + word + '</li>').appendTo('#file-list');
|
||||
}
|
||||
|
||||
li.effect('highlight', {color : '#FBC2C4'}, 2000, function () {
|
||||
$(this).remove();
|
||||
});
|
||||
}
|
||||
|
||||
function fileUploadComplete (file, attachment) {
|
||||
const li = $('#' + file.id).removeClass('loading').data('cid', attachment.cid)
|
||||
.data('url', attachment.url)
|
||||
.data('image', attachment.isImage)
|
||||
.html('<input type="hidden" name="attachment[]" value="' + attachment.cid + '" />'
|
||||
+ '<a class="insert" target="_blank" href="###" title="<?php _e('点击插入文件'); ?>">'
|
||||
+ attachment.title + '</a><div class="info">' + attachment.bytes
|
||||
+ ' <a class="file" target="_blank" href="<?php $options->adminUrl('media.php'); ?>?cid='
|
||||
+ attachment.cid + '" title="<?php _e('编辑'); ?>"><i class="i-edit"></i></a>'
|
||||
+ ' <a class="delete" href="###" title="<?php _e('删除'); ?>"><i class="i-delete"></i></a></div>')
|
||||
.effect('highlight', 1000);
|
||||
|
||||
attachInsertEvent(li);
|
||||
attachDeleteEvent(li);
|
||||
updateAttachmentNumber();
|
||||
|
||||
Typecho.uploadComplete(attachment);
|
||||
}
|
||||
|
||||
Typecho.uploadFile = (function () {
|
||||
const types = '<?php echo json_encode($options->allowedAttachmentTypes); ?>';
|
||||
const maxSize = <?php echo $phpMaxFilesize ?>;
|
||||
const queue = [];
|
||||
let index = 0;
|
||||
|
||||
const getUrl = function () {
|
||||
const url = new URL(uploadUrl);
|
||||
const cid = $('input[name=cid]').val();
|
||||
|
||||
url.searchParams.append('cid', cid);
|
||||
return url.toString();
|
||||
};
|
||||
|
||||
const upload = function () {
|
||||
const file = queue.shift();
|
||||
|
||||
if (!file) {
|
||||
return;
|
||||
}
|
||||
|
||||
const data = new FormData();
|
||||
data.append('file', file);
|
||||
|
||||
fetch(getUrl(), {
|
||||
method: 'POST',
|
||||
body: data
|
||||
}).then(function (response) {
|
||||
if (response.ok) {
|
||||
return response.json();
|
||||
} else {
|
||||
throw new Error(response.statusText);
|
||||
}
|
||||
}).then(function (data) {
|
||||
if (data) {
|
||||
const [_, attachment] = data;
|
||||
fileUploadComplete(file, attachment);
|
||||
upload();
|
||||
} else {
|
||||
throw new Error('no data');
|
||||
}
|
||||
}).catch(function (error) {
|
||||
fileUploadError('network', file);
|
||||
upload();
|
||||
});
|
||||
};
|
||||
|
||||
return function (file) {
|
||||
file.id = 'upload-' + (index++);
|
||||
|
||||
if (file.size > maxSize) {
|
||||
return fileUploadError('size', file);
|
||||
}
|
||||
|
||||
const match = file.name.match(/\.([a-z0-9]+)$/i);
|
||||
if (!match || types.indexOf(match[1].toLowerCase()) < 0) {
|
||||
return fileUploadError('type', file);
|
||||
}
|
||||
|
||||
queue.push(file);
|
||||
fileUploadStart(file);
|
||||
upload();
|
||||
};
|
||||
})();
|
||||
|
||||
function attachInsertEvent (el) {
|
||||
$('.insert', el).click(function () {
|
||||
var t = $(this), p = t.parents('li');
|
||||
@@ -195,12 +217,12 @@ $(document).ready(function() {
|
||||
$('.delete', el).click(function () {
|
||||
if (confirm('<?php _e('确认要删除文件 %s 吗?'); ?>'.replace('%s', file))) {
|
||||
var cid = $(this).parents('li').data('cid');
|
||||
$.post('<?php $options->index('/action/contents-attachment-edit'); ?>',
|
||||
$.post('<?php $security->index('/action/contents-attachment-edit'); ?>',
|
||||
{'do' : 'delete', 'cid' : cid},
|
||||
function () {
|
||||
$(el).fadeOut(function () {
|
||||
$(this).remove();
|
||||
updateAttacmentNumber();
|
||||
updateAttachmentNumber();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
|
||||
<?php
|
||||
if (isset($post) || isset($page)) {
|
||||
$cid = isset($post) ? $post->cid : $page->cid;
|
||||
|
||||
|
||||
if ($cid) {
|
||||
Typecho_Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $cid)->to($attachment);
|
||||
\Widget\Contents\Attachment\Related::alloc(['parentId' => $cid])->to($attachment);
|
||||
} else {
|
||||
Typecho_Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment);
|
||||
\Widget\Contents\Attachment\Unattached::alloc()->to($attachment);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<div id="upload-panel" class="p">
|
||||
<div class="upload-area"><?php _e('拖放文件到这里<br>或者 %s选择文件上传%s', '<a href="###" class="upload-file">', '</a>'); ?></div>
|
||||
<div class="upload-area" data-url="<?php $security->index('/action/upload'); ?>">
|
||||
<?php _e('拖放文件到这里<br>或者 %s选择文件上传%s', '<a href="###" class="upload-file">', '</a>'); ?>
|
||||
</div>
|
||||
<ul id="file-list">
|
||||
<?php while ($attachment->next()): ?>
|
||||
<li data-cid="<?php $attachment->cid(); ?>" data-url="<?php echo $attachment->attachment->url; ?>" data-image="<?php echo $attachment->attachment->isImage ? 1 : 0; ?>"><input type="hidden" name="attachment[]" value="<?php $attachment->cid(); ?>" />
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<?php \Typecho\Plugin::factory('admin/footer.php')->call('begin'); ?>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
/** 注册一个初始化插件 */
|
||||
Typecho_Plugin::factory('admin/footer.php')->end();
|
||||
/** 注册一个结束插件 */
|
||||
\Typecho\Plugin::factory('admin/footer.php')->call('end');
|
||||
|
||||
@@ -1,26 +1,51 @@
|
||||
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
|
||||
<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
|
||||
<script>
|
||||
(function () {
|
||||
$(document).ready(function () {
|
||||
var error = $('.typecho-option .error:first');
|
||||
const error = $('.typecho-option .error:first');
|
||||
|
||||
if (error.length > 0) {
|
||||
$('html,body').scrollTop(error.offset().top);
|
||||
$('html,body').scrollTop(error.parents('.typecho-option').offset().top);
|
||||
}
|
||||
|
||||
$('form').submit(function () {
|
||||
if (this.submitted) {
|
||||
$('.main form').submit(function () {
|
||||
const self = $(this);
|
||||
|
||||
if (self.hasClass('submitting')) {
|
||||
return false;
|
||||
} else {
|
||||
this.submitted = true;
|
||||
$('button[type=submit]', this).attr('disabled', 'disabled');
|
||||
self.addClass('submitting');
|
||||
}
|
||||
}).on('submitted', function () {
|
||||
$('button[type=submit]', this).removeAttr('disabled');
|
||||
$(this).removeClass('submitting');
|
||||
});
|
||||
|
||||
$('label input[type=text]').click(function (e) {
|
||||
var check = $('#' + $(this).parents('label').attr('for'));
|
||||
const check = $('#' + $(this).parents('label').attr('for'));
|
||||
check.prop('checked', true);
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.main form input[type="url"]').each(function () {
|
||||
const self = $(this);
|
||||
const input = $('<input type="hidden" />').attr('name', self.attr('name'));
|
||||
|
||||
function setInput() {
|
||||
const url = self.val();
|
||||
|
||||
try {
|
||||
const urlObj = new URL(url);
|
||||
input.val(urlObj.toString());
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
self.removeAttr('name').after(input).on('input', setInput);
|
||||
setInput();
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
@@ -1,34 +1,23 @@
|
||||
<?php
|
||||
if (!defined('__TYPECHO_ROOT_DIR__')) {
|
||||
if (!defined('__TYPECHO_ADMIN__')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$header = '<link rel="stylesheet" href="' . Typecho_Common::url('css/normalize.css?v=' . $suffixVersion, $options->adminUrl) . '">
|
||||
<link rel="stylesheet" href="' . Typecho_Common::url('css/grid.css?v=' . $suffixVersion, $options->adminUrl) . '">
|
||||
<link rel="stylesheet" href="' . Typecho_Common::url('css/style.css?v=' . $suffixVersion, $options->adminUrl) . '">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="' . Typecho_Common::url('js/html5shiv.js?v=' . $suffixVersion, $options->adminUrl) . '"></script>
|
||||
<script src="' . Typecho_Common::url('js/respond.js?v=' . $suffixVersion, $options->adminUrl) . '"></script>
|
||||
<![endif]-->';
|
||||
$header = '<link rel="stylesheet" href="' . $options->adminStaticUrl('css', 'normalize.css', true) . '">
|
||||
<link rel="stylesheet" href="' . $options->adminStaticUrl('css', 'grid.css', true) . '">
|
||||
<link rel="stylesheet" href="' . $options->adminStaticUrl('css', 'style.css', true) . '">';
|
||||
|
||||
/** 注册一个初始化插件 */
|
||||
$header = Typecho_Plugin::factory('admin/header.php')->header($header);
|
||||
$header = \Typecho\Plugin::factory('admin/header.php')->filter('header', $header);
|
||||
|
||||
?><!DOCTYPE HTML>
|
||||
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="<?php $options->charset(); ?>">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<title><?php _e('%s - %s - Powered by Typecho', $menu->title, $options->title); ?></title>
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<?php echo $header; ?>
|
||||
</head>
|
||||
<body<?php if (isset($bodyClass)) {echo ' class="' . $bodyClass . '"';} ?>>
|
||||
<!--[if lt IE 9]>
|
||||
<div class="message error browsehappy"><?php _e('您正在使用 <strong>旧版本</strong> 的浏览器. 为了更好的访问本页面, 请 <a href="http://browsehappy.com/">升级你的浏览器</a>'); ?>.</div>
|
||||
<![endif]-->
|
||||
|
||||
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 842 B |
|
Before Width: | Height: | Size: 529 B |
|
Before Width: | Height: | Size: 258 B |
|
Before Width: | Height: | Size: 267 B |
|
Before Width: | Height: | Size: 258 B |
|
Before Width: | Height: | Size: 246 B |
|
Before Width: | Height: | Size: 507 B |
|
Before Width: | Height: | Size: 585 B |
|
Before Width: | Height: | Size: 466 B |
|
Before Width: | Height: | Size: 241 B |
|
Before Width: | Height: | Size: 281 B |
|
Before Width: | Height: | Size: 898 B |
|
Before Width: | Height: | Size: 415 B |
|
Before Width: | Height: | Size: 317 B |
|
Before Width: | Height: | Size: 445 B |
|
Before Width: | Height: | Size: 433 B |
|
Before Width: | Height: | Size: 384 B |
|
Before Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 184 B |
|
Before Width: | Height: | Size: 181 B |
|
Before Width: | Height: | Size: 179 B |
|
Before Width: | Height: | Size: 296 B |
|
Before Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 237 B |
|
Before Width: | Height: | Size: 156 B |
|
Before Width: | Height: | Size: 209 B |
|
Before Width: | Height: | Size: 473 B |
|
Before Width: | Height: | Size: 254 B |
|
Before Width: | Height: | Size: 171 B |
|
Before Width: | Height: | Size: 259 B |
BIN
admin/img/editor@2x.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 271 B |
|
Before Width: | Height: | Size: 250 B |
|
Before Width: | Height: | Size: 453 B |
|
Before Width: | Height: | Size: 391 B |
|
Before Width: | Height: | Size: 540 B |
|
Before Width: | Height: | Size: 241 B |
|
Before Width: | Height: | Size: 215 B |
|
Before Width: | Height: | Size: 214 B |
|
Before Width: | Height: | Size: 272 B |
|
Before Width: | Height: | Size: 381 B |
|
Before Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 255 B |
|
Before Width: | Height: | Size: 223 B |
|
Before Width: | Height: | Size: 226 B |
|
Before Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 941 B |
|
Before Width: | Height: | Size: 941 B After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 193 B |
|
Before Width: | Height: | Size: 177 B |
|
Before Width: | Height: | Size: 289 B |
|
Before Width: | Height: | Size: 283 B |
|
Before Width: | Height: | Size: 311 B |
|
Before Width: | Height: | Size: 198 B |
|
Before Width: | Height: | Size: 182 B |
|
Before Width: | Height: | Size: 166 B |
|
Before Width: | Height: | Size: 209 B |
|
Before Width: | Height: | Size: 256 B |
|
Before Width: | Height: | Size: 226 B |
|
Before Width: | Height: | Size: 193 B |
|
Before Width: | Height: | Size: 185 B |
|
Before Width: | Height: | Size: 188 B |
|
Before Width: | Height: | Size: 242 B |
BIN
admin/img/icons@2x.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.2 KiB |