Compare commits
2768 Commits
cli-v1.0.1
...
v2.2.6
Author | SHA1 | Date | |
---|---|---|---|
|
60aca7beec | ||
|
8589f39afe | ||
|
6632d67a64 | ||
|
e7260d7498 | ||
|
d2e2866995 | ||
|
f14c74d802 | ||
|
391204c31e | ||
|
b3cec3be37 | ||
|
d2afd9980c | ||
|
96c7a18d5b | ||
|
dfcafd8254 | ||
|
6a17f717cf | ||
|
fdd77b8e88 | ||
|
41f4e037b5 | ||
|
7061d6c05d | ||
|
f90885709c | ||
|
071e1649bc | ||
|
c3f10d31cb | ||
|
3fb77c4e37 | ||
|
f9cfefdb29 | ||
|
153216c236 | ||
|
517deade20 | ||
|
e9d590169b | ||
|
b0609319fd | ||
|
fa9c08be06 | ||
|
daadc3309b | ||
|
dbe7146bdd | ||
|
b3ce5fbc48 | ||
|
87298db0ec | ||
|
f2818a653b | ||
|
d7d05f85ff | ||
|
5b7a5de826 | ||
|
69f0578ca9 | ||
|
6e82c8a8f9 | ||
|
f08af4d036 | ||
|
d3cd843fc8 | ||
|
3348b4f6f8 | ||
|
5d176b5bc8 | ||
|
854b83039e | ||
|
73e67deb37 | ||
|
bde39bf6b3 | ||
|
7f00e4ea5b | ||
|
8471be16aa | ||
|
b8c40da858 | ||
|
4d3eff3682 | ||
|
a16046e8a1 | ||
|
ceb57b515d | ||
|
c4fcfec581 | ||
|
2a9654f9ab | ||
|
724aa726ca | ||
|
0fc4bc05f6 | ||
|
db0e0ee17e | ||
|
6ac22ed0a0 | ||
|
4cfb804d61 | ||
|
a3c1be405e | ||
|
1f1ee5c3c2 | ||
|
785248b27f | ||
|
89d4d5e642 | ||
|
8910c87d15 | ||
|
447cb2d92d | ||
|
b5b6111e83 | ||
|
23553b70e0 | ||
|
03822487ec | ||
|
ef35b30645 | ||
|
edf07488f4 | ||
|
4f02c7359b | ||
|
f2547fed8d | ||
|
d3a449a86e | ||
|
c76ed7f8ac | ||
|
e9c11f5ac3 | ||
|
5c7fa587c0 | ||
|
6d86db3cb0 | ||
|
361802273d | ||
|
8920db5537 | ||
|
d5fcffbac1 | ||
|
15edd4dfce | ||
|
8b08f0d2b3 | ||
|
fb9ec105df | ||
|
53b4d7af68 | ||
|
3a3aa701ac | ||
|
830712a3bb | ||
|
dd1f90819c | ||
|
2ed8ac91a9 | ||
|
31c3093700 | ||
|
769094f002 | ||
|
a60d9fa61f | ||
|
6499ca8e61 | ||
|
2b64b320fb | ||
|
282f782d50 | ||
|
5fcf2e48b3 | ||
|
63d4ccdc61 | ||
|
19b45de298 | ||
|
b7e9848428 | ||
|
3f993af7fd | ||
|
e1bd127b23 | ||
|
d3c1edc3ee | ||
|
471c06b3fd | ||
|
e83ab93644 | ||
|
75a421edb1 | ||
|
07d2a60c75 | ||
|
252d0695a4 | ||
|
27c3cbdf8f | ||
|
2b378880ce | ||
|
52e1a05f4d | ||
|
c89037b4a2 | ||
|
f611d7734b | ||
|
aadace42a2 | ||
|
366ef025dc | ||
|
75cc73cc0c | ||
|
b6cf9d1d5a | ||
|
29a181f88f | ||
|
9ac56b3754 | ||
|
48d6c74a49 | ||
|
d4cdebafeb | ||
|
ea5a296d1f | ||
|
1194f6879f | ||
|
37ad6132b8 | ||
|
2d92a0f1a0 | ||
|
d469ac174c | ||
|
882d66383b | ||
|
cafaa9cac5 | ||
|
b2de27b6fc | ||
|
73c75a8071 | ||
|
d2df19ed0c | ||
|
62903874b5 | ||
|
bad1bd0fc3 | ||
|
36948732d6 | ||
|
f3e5a22ff2 | ||
|
e5d71d0cae | ||
|
eb0dd8dcd2 | ||
|
f3a69184b5 | ||
|
4567b78f0c | ||
|
92520e58fb | ||
|
7245aead39 | ||
|
9823ac3379 | ||
|
7a164b9b87 | ||
|
e125430748 | ||
|
ed8a928a8e | ||
|
7f709c210c | ||
|
8e4be78013 | ||
|
58c4f9eded | ||
|
2c525c2163 | ||
|
68f119efbd | ||
|
e88753c609 | ||
|
8395d5daa9 | ||
|
e01a17528a | ||
|
b929a44bd5 | ||
|
131e6d6fb4 | ||
|
4ceca9e44c | ||
|
9dc703c312 | ||
|
0f64c8d0fe | ||
|
71e6aec144 | ||
|
6a93cb289e | ||
|
b3ca5cdc6f | ||
|
952b2b3427 | ||
|
426915c75d | ||
|
f78ffc5e79 | ||
|
ff8f230555 | ||
|
1808367d78 | ||
|
89f4ca14e8 | ||
|
a4255bb8fe | ||
|
f761bad6bb | ||
|
018381dad3 | ||
|
62b619865a | ||
|
240cb35756 | ||
|
f6f68e9413 | ||
|
f8d2c26c8e | ||
|
09a943e8c9 | ||
|
67a000add9 | ||
|
f0c3a7313c | ||
|
54130bb4af | ||
|
ca01eb35aa | ||
|
576a5074ab | ||
|
e3db3871b6 | ||
|
d411d14818 | ||
|
5214da0a44 | ||
|
4e0ff1f81f | ||
|
a73b749ddd | ||
|
aa4f1146ca | ||
|
5a27d4dc31 | ||
|
bc97bb242a | ||
|
47b283a367 | ||
|
41f01dcc34 | ||
|
3f21a6d9ab | ||
|
afe573dc86 | ||
|
ed7face070 | ||
|
6f836b372d | ||
|
6cfd868b44 | ||
|
3430f0bcae | ||
|
4ae5108717 | ||
|
bddbc0b54e | ||
|
cf89a06eb2 | ||
|
a8bc9d2a63 | ||
|
bfc8c1e3c1 | ||
|
af15b8359b | ||
|
6c1a6b0a61 | ||
|
5ee4e2bf8e | ||
|
f3359158b9 | ||
|
e210926340 | ||
|
492c5851e3 | ||
|
238cc86590 | ||
|
2dfb33442c | ||
|
51d5e57b9f | ||
|
264f36f257 | ||
|
082c8ffecb | ||
|
c420ad4392 | ||
|
8883df24df | ||
|
d99c34f1dd | ||
|
34a0b2abb7 | ||
|
ab8dbcc73d | ||
|
5258cc335a | ||
|
7d9a222fbb | ||
|
0bc892e40e | ||
|
125af75b93 | ||
|
3d18514c3c | ||
|
7447793e77 | ||
|
427218b1f4 | ||
|
b507fbf837 | ||
|
b0e9b0e042 | ||
|
a53a6e6f15 | ||
|
cebec1a992 | ||
|
e08a909bdb | ||
|
bfa7ea7871 | ||
|
94ea177b76 | ||
|
07ea79bb46 | ||
|
f792fbb5fc | ||
|
8e789ee2ee | ||
|
d34a92d581 | ||
|
37ff926181 | ||
|
5ee2ffe174 | ||
|
1209cc6872 | ||
|
ac800af9f8 | ||
|
7ed1a453e5 | ||
|
55248ed08b | ||
|
d5becfa0ae | ||
|
1476cdf467 | ||
|
6a5629391b | ||
|
b77f9388b0 | ||
|
c3f4f22a2c | ||
|
c9f7d6483f | ||
|
de9d7f747f | ||
|
705432d9e8 | ||
|
a04e7b7d8d | ||
|
00b39e4671 | ||
|
04c4015c85 | ||
|
3d03321328 | ||
|
78f001eb9d | ||
|
269ec34c83 | ||
|
8e35841d79 | ||
|
94ba8549b7 | ||
|
8cbcb78ad1 | ||
|
5047cf1027 | ||
|
5ecac211ae | ||
|
65d87220de | ||
|
f86879778b | ||
|
5390e100e6 | ||
|
51f3c0016e | ||
|
752d118e5d | ||
|
c2cd1733cc | ||
|
fe83491eab | ||
|
6cbdad0690 | ||
|
96931877cf | ||
|
b92ab2b8cc | ||
|
e9f5ca817b | ||
|
dc9bb26c1a | ||
|
0019bd147a | ||
|
118a2f9f25 | ||
|
46868e6b25 | ||
|
67d9977489 | ||
|
638b3236cf | ||
|
8e712eacf5 | ||
|
7c92015fe6 | ||
|
0e757ad562 | ||
|
0c12c7f811 | ||
|
5ecb870ffd | ||
|
e58e2a3421 | ||
|
2e7e1948f8 | ||
|
caabdbd815 | ||
|
65e9268e83 | ||
|
4eec54cd48 | ||
|
5ef5888bfb | ||
|
12aae48ce6 | ||
|
5bb68ba65d | ||
|
112157e33f | ||
|
d129744138 | ||
|
975951ccbc | ||
|
efb6aaf8cc | ||
|
9323caf2f1 | ||
|
d13b1f96ba | ||
|
8e55fe31ee | ||
|
50ecdc2ff1 | ||
|
8a2ca0535d | ||
|
097e49d797 | ||
|
11ffbe7d66 | ||
|
e79f965e5d | ||
|
8cc103a062 | ||
|
7f05efb789 | ||
|
5b368e39ca | ||
|
b88bbc74a2 | ||
|
fc132216cb | ||
|
1dc49c7673 | ||
|
ab9bbcbff2 | ||
|
b7b12f9369 | ||
|
d8752ab889 | ||
|
372495afd3 | ||
|
2320934853 | ||
|
326fef486c | ||
|
7aff6d271d | ||
|
a86a80b21c | ||
|
4dc1210eb5 | ||
|
0222c0f0a6 | ||
|
63f7349c17 | ||
|
3b9c02e92d | ||
|
cef5834d73 | ||
|
b341caf287 | ||
|
fc063fe68e | ||
|
d73eab6f82 | ||
|
d698ea0c12 | ||
|
e04133cfc6 | ||
|
525ab01b9b | ||
|
0d33955fcd | ||
|
7f0b3fd718 | ||
|
65c3d01cc6 | ||
|
ac03c08f33 | ||
|
ea1d614f82 | ||
|
c682c8879c | ||
|
e8532441bc | ||
|
1c597883ef | ||
|
15ce5cdd6e | ||
|
a38958ab7b | ||
|
232e0c937a | ||
|
479237d16f | ||
|
6ae0e84a1a | ||
|
71d567669b | ||
|
db39db45c5 | ||
|
6916b53c2e | ||
|
578550e824 | ||
|
240a624abd | ||
|
981b1d845c | ||
|
313c8bbe8c | ||
|
8c56cf98be | ||
|
18965494d9 | ||
|
ecd1602658 | ||
|
3c181906c2 | ||
|
9e1e144311 | ||
|
757c125bd3 | ||
|
2867b66cf1 | ||
|
5c6fd93753 | ||
|
ea65313bdb | ||
|
1711f7ec88 | ||
|
e0b5ef6630 | ||
|
4bbb3d1d58 | ||
|
fd769945b1 | ||
|
6e91d2784f | ||
|
881b2f17b1 | ||
|
e83cc58ea6 | ||
|
77def9f782 | ||
|
b23cc5d30a | ||
|
d8119bcf07 | ||
|
8bce259dc9 | ||
|
8a00eef901 | ||
|
31121c86d5 | ||
|
a4a156c7a5 | ||
|
c5b0529968 | ||
|
ba322b1f9b | ||
|
6f27eae7dd | ||
|
85cc08c0d4 | ||
|
ba38bf3490 | ||
|
2cf70675dc | ||
|
58f8d7e1b4 | ||
|
b55b35e53f | ||
|
c7194bf243 | ||
|
48abe2316e | ||
|
7aca380cfa | ||
|
551033f8ba | ||
|
3b6a66a016 | ||
|
5d7d1be363 | ||
|
2af3bf61ea | ||
|
6803f1c6a7 | ||
|
1aa70dd6b4 | ||
|
feaecf7653 | ||
|
af9f3eedd3 | ||
|
815800827b | ||
|
8f1e3ba43c | ||
|
8459b46cd0 | ||
|
c5c38a323f | ||
|
01e6ca4616 | ||
|
24a586c537 | ||
|
5d233a7387 | ||
|
054e5428d5 | ||
|
0120df7bdb | ||
|
a36b13dcb4 | ||
|
b81c300907 | ||
|
1ded589eeb | ||
|
315216132f | ||
|
2eaa821272 | ||
|
7c93e268e4 | ||
|
d0c4de92e2 | ||
|
91ce465535 | ||
|
4098c01e7c | ||
|
e617e6fab3 | ||
|
5fd6571bf1 | ||
|
00dc1d881b | ||
|
c37eb56ed7 | ||
|
b2b6ad479a | ||
|
0e4c545e14 | ||
|
bbae1aef28 | ||
|
cf86ffc36e | ||
|
9d80a79cda | ||
|
ca487ade9a | ||
|
75b66a9fff | ||
|
56fdf97693 | ||
|
ce02a30441 | ||
|
a058e09183 | ||
|
594084e274 | ||
|
5614eb9442 | ||
|
7a3a2084db | ||
|
95d7ccccea | ||
|
f7a7009b3c | ||
|
de7579a14e | ||
|
c8d7ecbf6c | ||
|
3c41b45e8e | ||
|
62a371b9f3 | ||
|
5528ab7cc8 | ||
|
824afd4809 | ||
|
8ed1330d68 | ||
|
fec5d4b335 | ||
|
e7b9103bfc | ||
|
dd1c9e3c2a | ||
|
7c45b95f6f | ||
|
a7e67952b8 | ||
|
1b7d40387d | ||
|
7921e70c4f | ||
|
8afac643ba | ||
|
23cfbc2367 | ||
|
de45740129 | ||
|
a04d8ef441 | ||
|
db7b802803 | ||
|
75d79f373a | ||
|
e8a02c26d0 | ||
|
147b6b13ab | ||
|
a496a3d90d | ||
|
69a8ada2ec | ||
|
87257870f4 | ||
|
21ea3253db | ||
|
770af6a53b | ||
|
c88e4f6628 | ||
|
2f79492192 | ||
|
69aa749205 | ||
|
87a5f18c7b | ||
|
1d2a3a97d2 | ||
|
42891e37a1 | ||
|
fe802b8ebc | ||
|
3cb6d4568c | ||
|
a9f0a75d9d | ||
|
07d30eb5d2 | ||
|
8f6a47536c | ||
|
d8d83b236e | ||
|
a355600e76 | ||
|
2a58664735 | ||
|
89bc181072 | ||
|
ab7380a09f | ||
|
f8a26cf8f9 | ||
|
3505a2a973 | ||
|
5f94de0f24 | ||
|
6811ea1eb9 | ||
|
7be59a7435 | ||
|
c0683ca4c3 | ||
|
2b286410f6 | ||
|
907ac7c1f8 | ||
|
8bc27021db | ||
|
41ed66d323 | ||
|
0ef7e98479 | ||
|
161c77cb48 | ||
|
50d17bfb36 | ||
|
ee0f23718b | ||
|
cfe4546a0b | ||
|
f45e0d106f | ||
|
12a66342db | ||
|
f2b17560e6 | ||
|
ba30dce6c8 | ||
|
f5984313be | ||
|
df058352a5 | ||
|
cde25fad92 | ||
|
d89bbc5571 | ||
|
71a7fc015a | ||
|
83cef7a824 | ||
|
f65de0c9eb | ||
|
3edf74e6d2 | ||
|
b01aa7eb45 | ||
|
e59e3aa7d1 | ||
|
51051e0ee0 | ||
|
b20ab19f13 | ||
|
68e79f1573 | ||
|
ed8ee67048 | ||
|
68b516998d | ||
|
0fa7a66fb6 | ||
|
13f39b9bd5 | ||
|
013d37bd09 | ||
|
4760e5e8ba | ||
|
8930dac40e | ||
|
3f0586ef63 | ||
|
e94503abbe | ||
|
f8253cc2f0 | ||
|
2806aa1b19 | ||
|
8f57e07279 | ||
|
6ff560f22f | ||
|
2226b79c46 | ||
|
9e9bf63d70 | ||
|
5d9419be5d | ||
|
9f37aa96c6 | ||
|
eceb14ff9e | ||
|
85211e8d5c | ||
|
bd08041f53 | ||
|
77b284f01f | ||
|
daaaa133ab | ||
|
e6c4eb7cdf | ||
|
dc2cdb7d3a | ||
|
f3e03d48bb | ||
|
6577f4f35d | ||
|
d29624c816 | ||
|
6afde54bda | ||
|
ec7f0f479a | ||
|
7f05420fda | ||
|
a3f8cd4850 | ||
|
01ccf5170a | ||
|
6ddb69e1ea | ||
|
b01f82bb33 | ||
|
b6c9edba21 | ||
|
f7d164be6e | ||
|
6f2f24171d | ||
|
12cc64008b | ||
|
b9955f58d3 | ||
|
489995daef | ||
|
e156ee1b58 | ||
|
a24b0091ad | ||
|
2655b6deee | ||
|
45c40f7395 | ||
|
ecb0eee355 | ||
|
4916f4cc92 | ||
|
15fe119256 | ||
|
0b46880a00 | ||
|
deaa731983 | ||
|
d061bb1a4f | ||
|
03db0c5486 | ||
|
bb275e671d | ||
|
2d0580ff71 | ||
|
2331d3487b | ||
|
f1380fd51d | ||
|
d462dab8eb | ||
|
cf37b74d9a | ||
|
aec3ea9c0c | ||
|
1f5aa70acd | ||
|
416637ce83 | ||
|
99c4b0bc01 | ||
|
74d8fec98a | ||
|
321a58c356 | ||
|
81884cf2ea | ||
|
d7ff634f5e | ||
|
a965da97b6 | ||
|
b99cb0248d | ||
|
a31b402b9e | ||
|
6959f14a3f | ||
|
0765cf5955 | ||
|
09ad70983a | ||
|
6e64b872cf | ||
|
d26b92500c | ||
|
fc9aa33dbb | ||
|
a286dbdf86 | ||
|
c3f2bce818 | ||
|
df6f0ce9af | ||
|
5f2998a6e2 | ||
|
fa6981faa8 | ||
|
ce80d7e883 | ||
|
1a84ca204e | ||
|
0d523e5394 | ||
|
b28f087bbe | ||
|
ea536dbf87 | ||
|
ed19424271 | ||
|
5d7a3ceff5 | ||
|
610e1dc885 | ||
|
553aa0fffa | ||
|
ebd650b62f | ||
|
66dbbf3822 | ||
|
1e27a4fcd2 | ||
|
9c20d5947d | ||
|
bb77d7171a | ||
|
10bb689d5f | ||
|
a76b4a0d3e | ||
|
97c538dc48 | ||
|
0b67446ec0 | ||
|
4b26893b21 | ||
|
99410005a6 | ||
|
4ea21e0c32 | ||
|
ebf92605ae | ||
|
606a64f49c | ||
|
f76f99b423 | ||
|
1f9388d62c | ||
|
5c7dd6df5a | ||
|
26a91416c7 | ||
|
b5f01c005f | ||
|
b1ecb75e1f | ||
|
a0ead2c48e | ||
|
eb82ae87ca | ||
|
a6caa357c8 | ||
|
da4c61653f | ||
|
eef86d6166 | ||
|
4be5182913 | ||
|
92b4b967d9 | ||
|
9a043bfca5 | ||
|
156a681ecf | ||
|
5587f10487 | ||
|
34540ed30a | ||
|
bafa5053fd | ||
|
43feb1ea7e | ||
|
2531e89457 | ||
|
06ae47f507 | ||
|
b1ea3f3ad1 | ||
|
f87ff54e3d | ||
|
a4854fcde8 | ||
|
3235f58f5a | ||
|
920f54f5d3 | ||
|
de035dca39 | ||
|
1501238730 | ||
|
108b5b4cdc | ||
|
da8cc73df6 | ||
|
e95ea48ce9 | ||
|
0aef1f95ef | ||
|
a67eab46f4 | ||
|
f603440c30 | ||
|
80b16dd17e | ||
|
ad09bd93d6 | ||
|
a29648d46c | ||
|
e7184f5f86 | ||
|
8789e557ea | ||
|
f62bfbb853 | ||
|
e06a640900 | ||
|
5a620ee26e | ||
|
170f587f28 | ||
|
7518ac00fc | ||
|
9171a1ee9e | ||
|
30fab85caa | ||
|
1354c247b4 | ||
|
9642f5f715 | ||
|
f721d0123e | ||
|
518d7fc187 | ||
|
35a1da0b08 | ||
|
91bd8969cc | ||
|
2fc9c53ff0 | ||
|
e3efe70bab | ||
|
015aec503e | ||
|
54884d6db4 | ||
|
5667e687e9 | ||
|
fbfca47ef3 | ||
|
c37c2256c6 | ||
|
c79c9c4c2f | ||
|
17792d91a1 | ||
|
d8ed15873b | ||
|
29a8e815d9 | ||
|
0ff25b6302 | ||
|
bfacf71397 | ||
|
7224165ae4 | ||
|
f59e312ee2 | ||
|
829a245858 | ||
|
75eea7b87c | ||
|
4880ca19d6 | ||
|
ad83f74532 | ||
|
3a60efa153 | ||
|
c044017ba4 | ||
|
4810c01aec | ||
|
b3f950e67a | ||
|
f43edc2736 | ||
|
ea65346f04 | ||
|
a2a80bc2e3 | ||
|
9cf5974c7b | ||
|
66ad2259a9 | ||
|
c516ab405b | ||
|
17295734fd | ||
|
3fa13828cd | ||
|
99b55129f2 | ||
|
49e6b5cf62 | ||
|
81b3ddf0e7 | ||
|
e2db02887c | ||
|
0da3881aa6 | ||
|
cd1f95c5ea | ||
|
c119821c19 | ||
|
656673ed57 | ||
|
044477ba0d | ||
|
0985340a7f | ||
|
9e58af7232 | ||
|
5b65186b4d | ||
|
874f3010b7 | ||
|
a0ec926ba2 | ||
|
abe0013914 | ||
|
8ba49c6fdf | ||
|
39b3e0ac98 | ||
|
f3b2ca4752 | ||
|
35063ac05c | ||
|
a3e1ff4bdd | ||
|
e3248b65f5 | ||
|
b12a937079 | ||
|
aa067e3d16 | ||
|
131a7e7362 | ||
|
f92679c58a | ||
|
674db9a543 | ||
|
16a104c2fc | ||
|
de43a44c1f | ||
|
d76ec0ba0d | ||
|
e81c7f2dd2 | ||
|
e954ecd024 | ||
|
dda0835189 | ||
|
1aca81b584 | ||
|
ba54bb02fa | ||
|
f459e4cbc6 | ||
|
76c143e8b0 | ||
|
f8b7d20255 | ||
|
74cd19f942 | ||
|
fd390dff6b | ||
|
6e0ec05d17 | ||
|
c1b325004a | ||
|
4499408907 | ||
|
10870ed6d4 | ||
|
2f55738f16 | ||
|
7fb1692565 | ||
|
dcbb6f5dd2 | ||
|
5c04c06d6f | ||
|
a1423e4851 | ||
|
3e9cb1d4fd | ||
|
6496172aed | ||
|
4d0beb6d47 | ||
|
c4fe38e632 | ||
|
7eb9305448 | ||
|
586fe2c690 | ||
|
a23a1acc46 | ||
|
3657c0369e | ||
|
ec99511397 | ||
|
01a9e49458 | ||
|
d889cd55db | ||
|
876fcfe008 | ||
|
286a31a7f7 | ||
|
3d1c92685b | ||
|
bbc41ab726 | ||
|
31e9e7227c | ||
|
f7a41fbc8e | ||
|
1900ffe96d | ||
|
93441ea10b | ||
|
65b0d7f2f7 | ||
|
22ea40e104 | ||
|
93c35c9423 | ||
|
c86df6a480 | ||
|
3ed7d4a72b | ||
|
b7eb2f9fa8 | ||
|
752c14d726 | ||
|
b0ddba5a61 | ||
|
e12af60579 | ||
|
0c58d238e8 | ||
|
38e91ea1f7 | ||
|
da9da7ec62 | ||
|
80cb18ca90 | ||
|
17962360e5 | ||
|
f01fb8d66c | ||
|
7af1c9eaef | ||
|
97ad84cef9 | ||
|
320755a294 | ||
|
facba2811c | ||
|
fec4a905cb | ||
|
e1282bfd59 | ||
|
9ef8e0ff4a | ||
|
57473a0aad | ||
|
a6b866cbe1 | ||
|
646eb6f266 | ||
|
95fd05b135 | ||
|
bb99f51001 | ||
|
cab532873e | ||
|
d7edde0bd8 | ||
|
a836f531f6 | ||
|
9bfc7d9860 | ||
|
b7f37fdf89 | ||
|
69acced2fb | ||
|
a90e63935e | ||
|
71f976f6a5 | ||
|
3a8aea1aa4 | ||
|
f0943f7b67 | ||
|
4fb2bee330 | ||
|
b4b913cf15 | ||
|
ce8f156f51 | ||
|
26bce33e98 | ||
|
3ed19ba9f6 | ||
|
c1198dc76a | ||
|
3edea55976 | ||
|
19feb0c48b | ||
|
6dcb145732 | ||
|
414b3636d9 | ||
|
6f52107234 | ||
|
c5b8d82234 | ||
|
526b16b931 | ||
|
8f2594602c | ||
|
4e3b055d0d | ||
|
0b6e4ac99b | ||
|
341157483b | ||
|
33e1214ef6 | ||
|
11c8bf7e6e | ||
|
bd5e3d363c | ||
|
127a28e9b0 | ||
|
1e8f1cd5c5 | ||
|
80d56c4d63 | ||
|
91c4056aec | ||
|
f560563d89 | ||
|
ede600458a | ||
|
4a9d8033fa | ||
|
6746b9af70 | ||
|
ef281e8f74 | ||
|
935b4dca0a | ||
|
15d85f4ee4 | ||
|
fb165c87c3 | ||
|
1f536ba3d9 | ||
|
dac6c5fde2 | ||
|
67cbc068c6 | ||
|
1c1558c7bf | ||
|
613938e8c9 | ||
|
f24f8e8b47 | ||
|
e673ce132e | ||
|
775e22818b | ||
|
b1b5069a23 | ||
|
f38e7ec782 | ||
|
a419e1eb7c | ||
|
52c7889731 | ||
|
de64e5e8f2 | ||
|
07484de91e | ||
|
61399cec62 | ||
|
98e5810197 | ||
|
02c251ed95 | ||
|
69cd63b57f | ||
|
06b21848ac | ||
|
40a4c69afe | ||
|
dadec484e9 | ||
|
fb1c876b52 | ||
|
285482804a | ||
|
73314447b9 | ||
|
477b9fb8e8 | ||
|
cb2c2160ae | ||
|
ccbc329cbf | ||
|
4a847a096b | ||
|
0b88b7a288 | ||
|
db985b9faf | ||
|
8132311ce6 | ||
|
b0af917a35 | ||
|
f898fd4ef0 | ||
|
42c80e6e28 | ||
|
2f8aafd85b | ||
|
95253f70ea | ||
|
4156b13c32 | ||
|
18dfc5a987 | ||
|
ae29238592 | ||
|
99445cac27 | ||
|
de5bc45300 | ||
|
95f59a67ea | ||
|
fb04a3ae20 | ||
|
12187b9da3 | ||
|
35597ce3c2 | ||
|
ea49242f24 | ||
|
f60f07ad19 | ||
|
4e8299d444 | ||
|
8de46ed462 | ||
|
cda9441c69 | ||
|
11b8821bf4 | ||
|
f7a457fb6c | ||
|
63a5bfa756 | ||
|
e828c8e6eb | ||
|
dbbbd22aef | ||
|
ad56d02eb8 | ||
|
adad4cab75 | ||
|
89a2e9fe9a | ||
|
774be9cc0d | ||
|
351a05fb0d | ||
|
a320e113ac | ||
|
1509e6e58a | ||
|
cbd842c268 | ||
|
257cde4383 | ||
|
039da8c15c | ||
|
0cbecabff2 | ||
|
63559ac8b9 | ||
|
0e2351e79e | ||
|
86610e7561 | ||
|
c895f7cd4f | ||
|
83c1753049 | ||
|
22a7668d4b | ||
|
469143c2e8 | ||
|
d4a6078392 | ||
|
0c09202950 | ||
|
5128ef22bf | ||
|
43a8f4a46e | ||
|
63493214a0 | ||
|
fa9f5fd458 | ||
|
2d4ae4d8de | ||
|
716a92944d | ||
|
2018a0bd61 | ||
|
3ecf942b44 | ||
|
33db9883c9 | ||
|
85355f8eda | ||
|
1c696bf989 | ||
|
7a8629c38d | ||
|
9b24c2f4a9 | ||
|
ff0c1b62b3 | ||
|
1e611a7ab9 | ||
|
58960071e7 | ||
|
f9b0e2f6df | ||
|
fc7bd41c10 | ||
|
8d35298500 | ||
|
197e43d78a | ||
|
0e1fb9f491 | ||
|
df1df6dc1f | ||
|
ad34cee234 | ||
|
ddf3e16ff0 | ||
|
4e2e26f033 | ||
|
f37d37e613 | ||
|
63e30f6ccb | ||
|
9c718baf61 | ||
|
e8ae29adf2 | ||
|
0c67805626 | ||
|
e91c94baca | ||
|
aa74d05b24 | ||
|
9a1f7f227d | ||
|
40779d09c0 | ||
|
351d8d94c5 | ||
|
6addd52ba4 | ||
|
ea5849855f | ||
|
c81529dc45 | ||
|
b6d7971691 | ||
|
446db2d688 | ||
|
52da072f9a | ||
|
0d2bf6d787 | ||
|
59fe4a2193 | ||
|
df6d146c84 | ||
|
eb3493f648 | ||
|
7fd4c28a5b | ||
|
d1b55aeceb | ||
|
413ec1a933 | ||
|
7ad29577f9 | ||
|
7652a5a0a0 | ||
|
105189fc57 | ||
|
e559999aa4 | ||
|
4a230d7cd5 | ||
|
9b2e5e2959 | ||
|
3c5ac1ecc5 | ||
|
03dc1bbfe1 | ||
|
80580ba54d | ||
|
6a80b2ae9e | ||
|
f14ea46f0b | ||
|
247bd9bfd9 | ||
|
fc58db5d1a | ||
|
466cd836d7 | ||
|
66a09e5068 | ||
|
b53e475f99 | ||
|
ecb6134828 | ||
|
4b2bb1168b | ||
|
4743b0b5ce | ||
|
3abf21d4ae | ||
|
6cdb16c8ab | ||
|
b7bfa2b997 | ||
|
eab2371206 | ||
|
63615ffbaf | ||
|
59fa51c5bf | ||
|
c70f023fe0 | ||
|
fb5eb1a47b | ||
|
5aa5089ae0 | ||
|
4413e6a1ee | ||
|
309a97fb5b | ||
|
1b5b2342fc | ||
|
0f23277bfc | ||
|
e595e19c0d | ||
|
79dde365f0 | ||
|
2489409abb | ||
|
cbad3b1190 | ||
|
b74b849830 | ||
|
63a331c82f | ||
|
b7313568de | ||
|
25341858d5 | ||
|
dc6ae90113 | ||
|
3c8d79975c | ||
|
7530d2e4bc | ||
|
f678434411 | ||
|
9d547a58c9 | ||
|
aa4905ab45 | ||
|
b24eb5d09c | ||
|
1bc56d0fa9 | ||
|
a77d500bfa | ||
|
8fea9ba193 | ||
|
3fdcd3aaa6 | ||
|
0629cb394c | ||
|
f58b7563e6 | ||
|
d434723244 | ||
|
fca8f71f4a | ||
|
023170548f | ||
|
d75adc3740 | ||
|
0bf3531f51 | ||
|
c9f40ea23f | ||
|
c8755839be | ||
|
c3e696db5a | ||
|
a0134005b7 | ||
|
b66d90bbcc | ||
|
41edf5b2da | ||
|
c484c88715 | ||
|
4a0fb124a7 | ||
|
ebbaa5177b | ||
|
5d1dc224ca | ||
|
3626714403 | ||
|
3884ada760 | ||
|
16788d1437 | ||
|
b1908756d4 | ||
|
ccf5271584 | ||
|
df3e6a6219 | ||
|
f43ec71d9a | ||
|
32dab88054 | ||
|
1b5868a7c5 | ||
|
72712e71eb | ||
|
ec29f791ba | ||
|
40c2e59394 | ||
|
98cbb237b5 | ||
|
826dda5a75 | ||
|
6dc5a816e5 | ||
|
1700b29f7d | ||
|
7a6966405c | ||
|
9cb576889f | ||
|
047846a552 | ||
|
99fb578db4 | ||
|
7114228fd6 | ||
|
8d4d438136 | ||
|
420ac8359c | ||
|
fe7691d786 | ||
|
db4f35b936 | ||
|
72aabf71f3 | ||
|
d145ce1876 | ||
|
ab6f02a949 | ||
|
1339414443 | ||
|
732ca53b70 | ||
|
fa749d6d2a | ||
|
6e69343bb6 | ||
|
520454affb | ||
|
734514b6d8 | ||
|
ceb252b9ad | ||
|
f121245e40 | ||
|
215a1e0240 | ||
|
8ed36d7a29 | ||
|
2b33df2955 | ||
|
5c283e4508 | ||
|
c94ee5d99a | ||
|
4a258a2427 | ||
|
330ef6f7e6 | ||
|
4a579393f3 | ||
|
1091795a3a | ||
|
b5fc206202 | ||
|
794fb6a122 | ||
|
ec7cccf573 | ||
|
e94a1cac1c | ||
|
76ff0b9c11 | ||
|
fb01c64133 | ||
|
1dbeff1908 | ||
|
4f2d316db4 | ||
|
4851fd1ab3 | ||
|
ac8ddb1166 | ||
|
b61150457c | ||
|
3e948146cd | ||
|
8492a7ee26 | ||
|
0e57baf5b9 | ||
|
05f65c326a | ||
|
491714cde6 | ||
|
34c1096307 | ||
|
ebe3ddcd21 | ||
|
ca5ac9696b | ||
|
fdfbb84d37 | ||
|
740aba90ea | ||
|
eab9ff175c | ||
|
5b295d5f6f | ||
|
0be8cdf760 | ||
|
545940f545 | ||
|
d58f39823a | ||
|
f9fb1b8a81 | ||
|
56ded0062a | ||
|
83b29d7c51 | ||
|
1ec0746263 | ||
|
568d11bddf | ||
|
97b25ac99d | ||
|
7f1d3d8a5d | ||
|
fde201fbe9 | ||
|
694a1b4ede | ||
|
20d126b39d | ||
|
8ca9c3092a | ||
|
d2771029a3 | ||
|
4128c53fcf | ||
|
a14410b28c | ||
|
d1f8520e6e | ||
|
d76746b8e4 | ||
|
89d173b460 | ||
|
81aba8b8b0 | ||
|
9e076bf194 | ||
|
74a797b410 | ||
|
f48697572d | ||
|
e61e8b7b94 | ||
|
1deab7e8d1 | ||
|
86b28b5ecf | ||
|
938e723434 | ||
|
ee2ec28cd4 | ||
|
9dc505e85b | ||
|
3df31584af | ||
|
a7e3b381cb | ||
|
70381a233b | ||
|
2966fe0df2 | ||
|
143f0b4bc5 | ||
|
24ec3b8897 | ||
|
01aa4f9d5e | ||
|
520efdcb39 | ||
|
34a99f738c | ||
|
0e0de1207f | ||
|
2fda067034 | ||
|
29177330b0 | ||
|
66a5490b54 | ||
|
469cd19ec1 | ||
|
41684a64ef | ||
|
2cd7839552 | ||
|
c3d4617612 | ||
|
158fafc4a0 | ||
|
0f59731c06 | ||
|
d0f1a67d96 | ||
|
2a1434f987 | ||
|
1ee177880d | ||
|
f6d899eb29 | ||
|
a97f25fd61 | ||
|
325a5ab08f | ||
|
c158878b66 | ||
|
0f0f9c1161 | ||
|
79612163b2 | ||
|
fab5ed165c | ||
|
4897c763bd | ||
|
17b9867bf2 | ||
|
b8f14d50f5 | ||
|
9e2f60523f | ||
|
321ff4fced | ||
|
2a31f914bb | ||
|
0b71c33d09 | ||
|
502c812d9c | ||
|
5dc3baa50c | ||
|
a9af58146b | ||
|
17edebb6b1 | ||
|
bb2855bd80 | ||
|
6cae8a7d20 | ||
|
849cd9a2a2 | ||
|
5826a8d373 | ||
|
18c5404cbc | ||
|
f16fd6462b | ||
|
67c2998b9d | ||
|
db4f6e9ce5 | ||
|
0a2364f917 | ||
|
1aebcbb27c | ||
|
5bf1dc906d | ||
|
2529da5b09 | ||
|
d1a7d31335 | ||
|
b8493baa5e | ||
|
f53a7d3a8a | ||
|
33c5037816 | ||
|
38b0702314 | ||
|
693f59d07a | ||
|
59e2e65de0 | ||
|
4180d4bd28 | ||
|
46d22d8847 | ||
|
fbbfa2833b | ||
|
e351564bec | ||
|
9f8e6a3060 | ||
|
a1c08adb3e | ||
|
5cd9114334 | ||
|
65cc6853bd | ||
|
dca51cc7de | ||
|
bc76e4a918 | ||
|
3ed0083e94 | ||
|
5cafc8cea5 | ||
|
ff5e8ee7aa | ||
|
f1bbcea64b | ||
|
8e874891c0 | ||
|
546ee354dd | ||
|
afebce145f | ||
|
d202b6b5a9 | ||
|
7543d43428 | ||
|
5737560e19 | ||
|
a278c2c32a | ||
|
13dbeb4b36 | ||
|
a3f8b9027c | ||
|
f436967779 | ||
|
f37224fc42 | ||
|
a737a21185 | ||
|
234c05a966 | ||
|
92b4795410 | ||
|
3e21e9a334 | ||
|
dc3e9178ef | ||
|
46ed1304f2 | ||
|
01cf0de974 | ||
|
abf5d16da9 | ||
|
f21199a7f3 | ||
|
cdf2873883 | ||
|
0390928fea | ||
|
efb3546675 | ||
|
169841dcc4 | ||
|
b780261153 | ||
|
c906354510 | ||
|
6487fde09d | ||
|
50f046ffc4 | ||
|
ded14ff8db | ||
|
64bbd93f54 | ||
|
9a30b69610 | ||
|
046433a947 | ||
|
42232fac84 | ||
|
245976f659 | ||
|
8d90cc234f | ||
|
5183767e43 | ||
|
ceb625dbeb | ||
|
7677d9cd7d | ||
|
92fe5e2362 | ||
|
717b8da1f8 | ||
|
fa50a8f5da | ||
|
05e9000087 | ||
|
eed3dc8617 | ||
|
de123ee586 | ||
|
89abc4395f | ||
|
4b0d230815 | ||
|
48e3811fbd | ||
|
e8d216016e | ||
|
751d0e0745 | ||
|
d0f22140fd | ||
|
d63378b4e3 | ||
|
a17b77b495 | ||
|
04814eefb5 | ||
|
da3e5acc94 | ||
|
ef53c42f0a | ||
|
c8b40bfdb2 | ||
|
dbb8b4d895 | ||
|
a654419881 | ||
|
497cf996e8 | ||
|
d5dbc421b1 | ||
|
f965708ad3 | ||
|
f001d197a8 | ||
|
d588bddfaa | ||
|
b780a62588 | ||
|
154b3573a4 | ||
|
7d2551c9c3 | ||
|
7644d05225 | ||
|
1851b0e7d1 | ||
|
76c4d99b87 | ||
|
849ef418a6 | ||
|
d733c0e010 | ||
|
a48e5cd4e8 | ||
|
03942a0073 | ||
|
0bc53dc063 | ||
|
56605beea2 | ||
|
8059d3fbd1 | ||
|
46c38ce0e0 | ||
|
dfa928c1f7 | ||
|
cb696276da | ||
|
5f80628a4d | ||
|
b77f868fc8 | ||
|
6ad9931e43 | ||
|
011a65f73b | ||
|
72ccc90ea0 | ||
|
f3e6c0da32 | ||
|
9308c3f38c | ||
|
c8a7c70838 | ||
|
40f6dcfb4c | ||
|
09785cf366 | ||
|
7279b508db | ||
|
d7996c9707 | ||
|
f0432e724a | ||
|
2f9bb7b8c0 | ||
|
f4b8b5b160 | ||
|
e2962322be | ||
|
c982e42999 | ||
|
eed52a5cfd | ||
|
6272a2eb4f | ||
|
69a4a895d4 | ||
|
511e4b1da0 | ||
|
f22e6f7204 | ||
|
3d4437037e | ||
|
d8745597e9 | ||
|
b279a9693c | ||
|
7fa483d27c | ||
|
9b64c1fbdb | ||
|
a37f84e988 | ||
|
96ac3e53e8 | ||
|
416a7b36e7 | ||
|
be4d53db62 | ||
|
7154ebbf5c | ||
|
4d65bfe3f8 | ||
|
0f0c50a178 | ||
|
9a2fd97f3c | ||
|
3f2fe79151 | ||
|
1ef380d995 | ||
|
c213d5056c | ||
|
62c67cb09f | ||
|
1dd6c7dde5 | ||
|
86bace70a5 | ||
|
ee912b24c7 | ||
|
3e65e1539b | ||
|
4ac2409318 | ||
|
d953f6bcab | ||
|
e0c2b62a6c | ||
|
544d879c0b | ||
|
28f75449d7 | ||
|
fdc84aa6bb | ||
|
592b9d95c6 | ||
|
4abdab5cdb | ||
|
858508bfa9 | ||
|
116413e78d | ||
|
031a26116c | ||
|
65962e26ce | ||
|
30913a5d58 | ||
|
61618fb37c | ||
|
a40ab434ca | ||
|
dbbd930f81 | ||
|
ff3ae3860e | ||
|
e1c4d1a417 | ||
|
e1180a1d84 | ||
|
e57444dc32 | ||
|
f36019c94d | ||
|
c67c8cefdf | ||
|
a9a69b046f | ||
|
98a75e67d8 | ||
|
7188eb9db4 | ||
|
52b13f6d56 | ||
|
8e2daef144 | ||
|
73571f1c48 | ||
|
3e00f6078d | ||
|
355ba2c278 | ||
|
4e08adb76f | ||
|
eb8284ecdb | ||
|
7be93b1fbb | ||
|
76cd1b15ac | ||
|
92bcb25ef7 | ||
|
bb8cac2b2f | ||
|
39d9e5fd8b | ||
|
5a94431b04 | ||
|
c639b0cbf5 | ||
|
f81579371b | ||
|
284dbdb362 | ||
|
5f05f85e41 | ||
|
61faec147b | ||
|
d552538541 | ||
|
8787d997b2 | ||
|
adde092ea6 | ||
|
a808281dd2 | ||
|
6103aad2a7 | ||
|
1e010ec004 | ||
|
a8e36f41d5 | ||
|
f45029b2e8 | ||
|
147f3ce073 | ||
|
ccc726f2ae | ||
|
6769026265 | ||
|
ce5276ba97 | ||
|
b480aae59b | ||
|
ce59d29bb3 | ||
|
fb5f20b308 | ||
|
cee42a1296 | ||
|
7f88f507df | ||
|
2b95bce272 | ||
|
6463af0c31 | ||
|
19a8b6c285 | ||
|
06ea5e1878 | ||
|
4451bbdd71 | ||
|
2f1cc71922 | ||
|
a3286a9896 | ||
|
83ca33611b | ||
|
4f41fb7b54 | ||
|
7151a48138 | ||
|
aaaa4e4569 | ||
|
872d2942b4 | ||
|
918b768634 | ||
|
8305eb4403 | ||
|
91e7c66f9e | ||
|
e392efc091 | ||
|
458ae3731d | ||
|
a647272cf0 | ||
|
72472c13c5 | ||
|
6225d20d1f | ||
|
67f0739d3c | ||
|
17d835d694 | ||
|
42799b0662 | ||
|
d20694e52c | ||
|
62feb7ff60 | ||
|
e29e745b96 | ||
|
340312fa80 | ||
|
006239913e | ||
|
f4bc8cc817 | ||
|
fb1f43bb17 | ||
|
24cef9995a | ||
|
31ffd8d7e9 | ||
|
873184f69b | ||
|
da6977569f | ||
|
8808b38d83 | ||
|
ad654e30d5 | ||
|
6f11487dba | ||
|
dd0d54d4d0 | ||
|
0fd0451c17 | ||
|
06f2fda946 | ||
|
c249333e2a | ||
|
9755a69be8 | ||
|
18e4f7ffe7 | ||
|
7cb60aaace | ||
|
fbcfe432c5 | ||
|
ed71726e87 | ||
|
31a0449e71 | ||
|
04450a6464 | ||
|
d0ec598ee4 | ||
|
ca8b05631a | ||
|
3223fd26f4 | ||
|
7847aeda75 | ||
|
7d02ddfdb5 | ||
|
5079cd9ff2 | ||
|
48f6412721 | ||
|
498e80f2d3 | ||
|
5269a4b7fa | ||
|
88a2f9c85c | ||
|
f20b8c2dc6 | ||
|
bd2081c3b6 | ||
|
6ac4131003 | ||
|
4c5e0447a9 | ||
|
545a2206d7 | ||
|
aa47ffb30f | ||
|
83b175bb5b | ||
|
04bfbec96b | ||
|
f950e9b03f | ||
|
a0f21796c2 | ||
|
9af8720199 | ||
|
53c432ce12 | ||
|
553bbfc818 | ||
|
7b0122a8db | ||
|
7ea4f570cb | ||
|
1e1f2582c5 | ||
|
7e2d512fde | ||
|
6b75485a1e | ||
|
0cfcc00912 | ||
|
496b19b3f1 | ||
|
9618591158 | ||
|
55b6394bf3 | ||
|
4a1dc2c80e | ||
|
cb66158b2d | ||
|
da04d3ce51 | ||
|
bcbce682d5 | ||
|
08f7521e1e | ||
|
3579e7eab5 | ||
|
5922c6b216 | ||
|
c558e729bd | ||
|
ca80101174 | ||
|
6124f483dc | ||
|
90d58e4e2b | ||
|
8cd37d602c | ||
|
e4ed26a961 | ||
|
bc57d229fa | ||
|
c53cd52b4d | ||
|
0d7ca97556 | ||
|
c1e2fd125c | ||
|
6856f84faa | ||
|
de091dfd64 | ||
|
cc07016b07 | ||
|
122f20905c | ||
|
5ff8beb82f | ||
|
ff6cd57873 | ||
|
4c948408c4 | ||
|
cc3a1d78da | ||
|
0cc544a95f | ||
|
03b7402dc5 | ||
|
dd5c400c24 | ||
|
abc702c21f | ||
|
cc3e1bdee8 | ||
|
10cfa773ca | ||
|
8dc42b1f41 | ||
|
6e7ea9a549 | ||
|
ed2ccdd504 | ||
|
6d2bad01e6 | ||
|
3847831d80 | ||
|
44462f4d71 | ||
|
4d20589773 | ||
|
52140ec1a9 | ||
|
08c2a7ad64 | ||
|
d19796f14c | ||
|
e4f53a48d2 | ||
|
154163bd6c | ||
|
4502414934 | ||
|
38e4bc61d9 | ||
|
86c471afcd | ||
|
e2698aaead | ||
|
8cfe4b0f82 | ||
|
fd90a490c0 | ||
|
16c5ffadc7 | ||
|
4a184721e4 | ||
|
1e3bd937ed | ||
|
0f6932f1e8 | ||
|
cab98776db | ||
|
fbc1e3ed3b | ||
|
805d16abda | ||
|
f133229287 | ||
|
8f4031572a | ||
|
d25fa796c0 | ||
|
089d6a5c9e | ||
|
3f83355d9f | ||
|
40380e3066 | ||
|
a6748bafb3 | ||
|
b52f6eb77c | ||
|
98c933fdb7 | ||
|
ece7ffadd6 | ||
|
591bceb8ef | ||
|
04cfd07176 | ||
|
db2282a351 | ||
|
0ec3d6ca9d | ||
|
442b7ce0d3 | ||
|
6a068a90b2 | ||
|
9a6f6c8b39 | ||
|
52d5c32950 | ||
|
de47cff86d | ||
|
a459174f98 | ||
|
75d5aa3a77 | ||
|
c254ca524f | ||
|
51934b8d8d | ||
|
a5dd686bb2 | ||
|
4cbfd04522 | ||
|
6d5d9323bd | ||
|
76063a6284 | ||
|
4119924e57 | ||
|
537336754c | ||
|
06f73919bd | ||
|
3f3e46081c | ||
|
68e4b4eaad | ||
|
9dcb4b51e5 | ||
|
8543849ea1 | ||
|
6ce5240e12 | ||
|
5bc25aefce | ||
|
b737ca7471 | ||
|
a5d7366f94 | ||
|
98f822d89c | ||
|
c33a8250ee | ||
|
adad406696 | ||
|
d82eec0fa4 | ||
|
c93f474547 | ||
|
0afd4a6234 | ||
|
f42786a840 | ||
|
1c1f044966 | ||
|
ad7a80e260 | ||
|
5e040c062c | ||
|
0cede5f90a | ||
|
8dc0deb2a4 | ||
|
1ca44b8f44 | ||
|
4ba9e60194 | ||
|
9d0bb4257f | ||
|
1a273b9bca | ||
|
d9e93cd6c4 | ||
|
5d39860707 | ||
|
60a6f714bc | ||
|
6eebeca259 | ||
|
995034c53f | ||
|
45a0981d05 | ||
|
3d8577a689 | ||
|
5292fc1402 | ||
|
03063f1137 | ||
|
b125a768b8 | ||
|
a721f170e4 | ||
|
76cd69ea16 | ||
|
45d4f277e2 | ||
|
fc2a52aa1a | ||
|
b3e5a1e48d | ||
|
45eb902030 | ||
|
456f7ac00c | ||
|
a93bda71fe | ||
|
0f9d92dd3d | ||
|
5543e9ef64 | ||
|
22dd613660 | ||
|
f7502fe34b | ||
|
8254206f44 | ||
|
3a57cfea02 | ||
|
71bf0437c1 | ||
|
eca4e24362 | ||
|
9a6efb7b37 | ||
|
4b666cbbd2 | ||
|
f8f46db910 | ||
|
f529adac99 | ||
|
3a52b9764b | ||
|
7e78d7716b | ||
|
0488c5c4cb | ||
|
921cc3b6c6 | ||
|
2a7aa28d4c | ||
|
7b3440ac4c | ||
|
958e5a80b7 | ||
|
3179117c62 | ||
|
d895463167 | ||
|
7e0e513051 | ||
|
4309c4f8e2 | ||
|
20b1c90574 | ||
|
7ff6ceb585 | ||
|
3dc3f334ec | ||
|
3476211f8b | ||
|
48e299916f | ||
|
35aebc9f52 | ||
|
cb3e1cf1e9 | ||
|
db509955f6 | ||
|
fb39899f8e | ||
|
f5d4bedc07 | ||
|
e710709c15 | ||
|
d74d6d9539 | ||
|
435e8dfc3b | ||
|
6c68459b34 | ||
|
2e75a63b26 | ||
|
c328996568 | ||
|
c648f19693 | ||
|
2caaf8e8c1 | ||
|
ceb7a7303d | ||
|
c01f533342 | ||
|
ff50361e19 | ||
|
3539a452a3 | ||
|
ea878fb614 | ||
|
5fd0408365 | ||
|
2d099b2bed | ||
|
3c0b9ee522 | ||
|
9dfe084a02 | ||
|
987890ba98 | ||
|
3358c46122 | ||
|
66204401c9 | ||
|
0644e2897d | ||
|
5761451def | ||
|
d819e6ee0c | ||
|
b66be79351 | ||
|
433fa21069 | ||
|
12db3d20ee | ||
|
80a70a6649 | ||
|
02ed297529 | ||
|
30543104be | ||
|
b6a004086c | ||
|
4265b3afb0 | ||
|
ccd7ba28d7 | ||
|
871f8b3a72 | ||
|
f276d2b2d4 | ||
|
2bb5acdfb1 | ||
|
dda0d8ca08 | ||
|
15f22c0507 | ||
|
fa7bd2cfab | ||
|
dc51781976 | ||
|
c874aee774 | ||
|
6c84fdc51d | ||
|
8ff0f7c529 | ||
|
b326ffc41c | ||
|
a0de8582e6 | ||
|
5eb0417b1a | ||
|
c42d9cf069 | ||
|
d965a7b6db | ||
|
c1919c2908 | ||
|
3fd7470104 | ||
|
0bf74142ac | ||
|
b3bf7144ac | ||
|
5738a4f92b | ||
|
784851b217 | ||
|
0e0803e050 | ||
|
3d3abfe259 | ||
|
3f38b518fe | ||
|
e673ee97de | ||
|
7cb55ffdc4 | ||
|
b706217d41 | ||
|
6f680081f4 | ||
|
fe41d37f8f | ||
|
833fb1264f | ||
|
f007735936 | ||
|
73a39d36ea | ||
|
a43ab26a46 | ||
|
f5f117cb72 | ||
|
fc6da04081 | ||
|
12ff654986 | ||
|
e852ad846f | ||
|
28e00fdf2e | ||
|
3bd0656eab | ||
|
e9af71dd76 | ||
|
73b33e8e32 | ||
|
c2c7efee91 | ||
|
c9c44d5643 | ||
|
0836fca822 | ||
|
566df5039c | ||
|
559655bf33 | ||
|
0eab23fbcf | ||
|
f334f4f487 | ||
|
49bfa49489 | ||
|
5f81944a3e | ||
|
00057da17d | ||
|
0a05464013 | ||
|
26f5a606e0 | ||
|
9ebb574059 | ||
|
d29c3c2466 | ||
|
a71f1c19ec | ||
|
485921d879 | ||
|
15de7572c0 | ||
|
09f41dd50e | ||
|
7b8ee467a0 | ||
|
99a496d684 | ||
|
9d6975a9e2 | ||
|
f43ee123d8 | ||
|
f42fb1b871 | ||
|
cf2442c5b2 | ||
|
e0e4735b03 | ||
|
138faa2aae | ||
|
8bd58c9608 | ||
|
215a725ded | ||
|
12c0a05af0 | ||
|
a7fa119041 | ||
|
7fb52b8b0e | ||
|
3e86ae4a82 | ||
|
ca46590ff3 | ||
|
947d81d96d | ||
|
6ca640d2ed | ||
|
6aca233b21 | ||
|
2200be697e | ||
|
25ab3c323b | ||
|
5bf30a9586 | ||
|
b6779a8074 | ||
|
59599d318c | ||
|
538600fd6c | ||
|
63264ba471 | ||
|
95e7f3df7d | ||
|
366fd2a333 | ||
|
5be99a4a16 | ||
|
d86f6a1fbd | ||
|
7d68208cb4 | ||
|
e9de9d9128 | ||
|
1af16d9f0b | ||
|
8e11eababa | ||
|
4ec9faadd5 | ||
|
5cf462c885 | ||
|
f7ef0a2b1e | ||
|
870f55a6c5 | ||
|
7f7e38b434 | ||
|
460a07b1a3 | ||
|
48c9b86d2b | ||
|
7202066c1f | ||
|
5226f0019b | ||
|
26ac745419 | ||
|
b3f2bbee5b | ||
|
56c6cfc785 | ||
|
1db4932573 | ||
|
a2873ebbc5 | ||
|
f652011d59 | ||
|
27c572b2f5 | ||
|
7a4c97618d | ||
|
3ac4fbeee5 | ||
|
9e05fa553c | ||
|
d4f0d2423d | ||
|
abdd7e3256 | ||
|
f3ea476f27 | ||
|
aa22af443c | ||
|
ce3bd2a47d | ||
|
a9b26246e6 | ||
|
cc1e941dd9 | ||
|
9610b7e6bd | ||
|
ad85a12535 | ||
|
b825346829 | ||
|
bd4cbaf93d | ||
|
9af2a19bdf | ||
|
d3fa906a9a | ||
|
22679641ee | ||
|
0ca7457000 | ||
|
c84e49c71c | ||
|
07ab0e986d | ||
|
17957f5da4 | ||
|
a7b5d43e69 | ||
|
38eda3f151 | ||
|
056285deda | ||
|
bdedf69439 | ||
|
c9451d8675 | ||
|
c38834b04c | ||
|
851eee1500 | ||
|
40e24102ce | ||
|
7614a795e9 | ||
|
1273a1dc5f | ||
|
10909fe4fc | ||
|
9b3d3026bf | ||
|
96076c84f4 | ||
|
2c553db45a | ||
|
7d7005596f | ||
|
998dd52adc | ||
|
2a1c6d6475 | ||
|
1ba0644142 | ||
|
88ac57d7f3 | ||
|
314686bede | ||
|
af8845f209 | ||
|
c95d7f9d37 | ||
|
2510c659e6 | ||
|
b7523e1b21 | ||
|
e4e9e801a2 | ||
|
524ec12d8a | ||
|
1108e8c28a | ||
|
0f1156ab9c | ||
|
2a08cc332a | ||
|
5d2baa872e | ||
|
4b377589aa | ||
|
cf78204c85 | ||
|
c513cdd4eb | ||
|
5f410e80e6 | ||
|
2aa7eaa192 | ||
|
b24d060281 | ||
|
a014b9347e | ||
|
582ab4ac13 | ||
|
c9adccad4a | ||
|
f41ba67e15 | ||
|
1f70a76c7e | ||
|
5fe3732a38 | ||
|
445533cfcc | ||
|
a8e29249d6 | ||
|
e4a3cbd2ff | ||
|
96b7ce9d50 | ||
|
2bbc1e7ecd | ||
|
83619b279d | ||
|
8b5a99d494 | ||
|
67d4123608 | ||
|
a424e3c899 | ||
|
08d4b5a714 | ||
|
68aefd5e4c | ||
|
57d750bc9a | ||
|
fbe966903b | ||
|
652748f969 | ||
|
e108fdb1d8 | ||
|
a8296e2e37 | ||
|
0998fc0ad7 | ||
|
d5f3e860b9 | ||
|
4e624f7db5 | ||
|
5b697b7e16 | ||
|
30e0d69a74 | ||
|
652816fd26 | ||
|
3a33e5f416 | ||
|
277dac5512 | ||
|
81d97d9f9d | ||
|
a4873cd40d | ||
|
20cb2daf43 | ||
|
e5b5250a91 | ||
|
db7d617e2b | ||
|
a627884876 | ||
|
ed30d09e07 | ||
|
179e3f9aee | ||
|
a67aedba35 | ||
|
199c411a7d | ||
|
5cd7bb5bdb | ||
|
30b8f5e2aa | ||
|
44f2842820 | ||
|
569355a318 | ||
|
8464e16d5d | ||
|
874c1e3e82 | ||
|
2530ecfc86 | ||
|
6b49f1dfcc | ||
|
b1af25ea18 | ||
|
3086007a9c | ||
|
bdfb6b97f5 | ||
|
c01219e6be | ||
|
743c11c279 | ||
|
11646d1c21 | ||
|
797f4a9669 | ||
|
815775ad8f | ||
|
085109288f | ||
|
c6cf0f3ba5 | ||
|
f9bdce7e24 | ||
|
f8cf4db5db | ||
|
14e6ae373f | ||
|
39bffd2790 | ||
|
f3cb903901 | ||
|
abad1883bc | ||
|
bb8770a967 | ||
|
c903947704 | ||
|
82e96840e9 | ||
|
e190d90832 | ||
|
0ae8d454ad | ||
|
77c7f966cf | ||
|
619fa1d607 | ||
|
157736ff7e | ||
|
0b57d906f8 | ||
|
86bfdb5c79 | ||
|
fc7d34f79c | ||
|
9d962f0328 | ||
|
79e1a33b28 | ||
|
0eedae1f62 | ||
|
e1144c098e | ||
|
5c5cb0f781 | ||
|
656615b571 | ||
|
799a9e810d | ||
|
aa147bbcdc | ||
|
8c7a24282c | ||
|
f99f3f8a6d | ||
|
29fbafdfff | ||
|
3253146dae | ||
|
7e4ac0fd73 | ||
|
60d77cb5ea | ||
|
8299164964 | ||
|
488393e75d | ||
|
c19f8c8035 | ||
|
b0b55718cc | ||
|
5ade9ff2f6 | ||
|
e4cfb518ba | ||
|
89864de1ff | ||
|
ee2a474611 | ||
|
223caca0f5 | ||
|
ee358f70dd | ||
|
0718828d60 | ||
|
d13f54c2ce | ||
|
90f7f99cd1 | ||
|
a273bbaeee | ||
|
619b426689 | ||
|
97c752a39e | ||
|
7565f1cada | ||
|
0c147236a3 | ||
|
88f22fabf7 | ||
|
5f46d60c5e | ||
|
cc8c200826 | ||
|
4485947b0f | ||
|
9f1a877f96 | ||
|
13280ce1b3 | ||
|
7f73931530 | ||
|
bbfed9bca8 | ||
|
bab29cd582 | ||
|
baea44cbd6 | ||
|
ab0538df43 | ||
|
58d4a69053 | ||
|
9147b3061a | ||
|
1b0102f62c | ||
|
471631933b | ||
|
cd761932c1 | ||
|
e63eee89ef | ||
|
4393ebbcc6 | ||
|
ed82390a8d | ||
|
79e708779f | ||
|
98905f6892 | ||
|
44e57c3959 | ||
|
35d48394ce | ||
|
eb42a5f34b | ||
|
729c8c6fac | ||
|
7a1707d864 | ||
|
64d7603eed | ||
|
89e6b680a6 | ||
|
da071a804c | ||
|
7833ca5ae6 | ||
|
44d49b57b9 | ||
|
9db150f8ff | ||
|
e2d3630783 | ||
|
cb1b5cae9f | ||
|
3af5b31c1c | ||
|
b6dafd6da6 | ||
|
d08b922632 | ||
|
9d4e250f6b | ||
|
c19cc1b39a | ||
|
73bd6f9776 | ||
|
6fef55398f | ||
|
d209d5036b | ||
|
4be02bc33c | ||
|
d6daa34e0a | ||
|
9cebbbe7cf | ||
|
71e5304298 | ||
|
8f8d11c9b3 | ||
|
1cd86fd3ea | ||
|
7f1f5a8c3d | ||
|
9dfb0642da | ||
|
0fa8dfa063 | ||
|
1d79dedf6d | ||
|
a274a56e65 | ||
|
44d3a4213f | ||
|
e68eb196b7 | ||
|
4bef79cd71 | ||
|
f3dc3602c8 | ||
|
17e140ba56 | ||
|
89d0575ccd | ||
|
ca0197a319 | ||
|
62bc296abe | ||
|
e58dc809ec | ||
|
abd57ad384 | ||
|
bada9286d0 | ||
|
3807317e66 | ||
|
10ff43f4f0 | ||
|
282f6de1a9 | ||
|
9a55afec01 | ||
|
c8c4bb3245 | ||
|
e1f831af62 | ||
|
657cebfda9 | ||
|
7f1c25793a | ||
|
b770ffda4d | ||
|
d0b3e15999 | ||
|
20433b0282 | ||
|
452b41de0f | ||
|
b69008225f | ||
|
b3a778e983 | ||
|
a57c6e9155 | ||
|
3fbfba2c03 | ||
|
8a5e6875f0 | ||
|
e11e57f1d8 | ||
|
073bd80f89 | ||
|
e3aaee738a | ||
|
f1b2b7b86b | ||
|
e0a87d6253 | ||
|
a7eae2e033 | ||
|
51235f191d | ||
|
003ead2511 | ||
|
8dc8527fdc | ||
|
985dcc2605 | ||
|
4063cdba11 | ||
|
c96c591fa9 | ||
|
4913fdb800 | ||
|
24bc7f153a | ||
|
8732c97dcd | ||
|
e092eaef6f | ||
|
4ade1bf65f | ||
|
77a03599de | ||
|
9c057071b5 | ||
|
ee3f4beeaf | ||
|
7035b1f9f6 | ||
|
3aea55ee63 | ||
|
28acb4eca6 | ||
|
c63c6370b5 | ||
|
6046f40e45 | ||
|
262159cf73 | ||
|
8eb94bc8ab | ||
|
a9390affaa | ||
|
66392b4e8a | ||
|
3283f34c79 | ||
|
fd4e5d7d30 | ||
|
5bbf9d87c2 | ||
|
acf1ff6d1d | ||
|
05acc51054 | ||
|
eb8841379c | ||
|
d601575549 | ||
|
0d2f253218 | ||
|
349d020da2 | ||
|
87ccb86f54 | ||
|
20482b2f14 | ||
|
47a05fb4ba | ||
|
ac0a89625a | ||
|
a07638239b | ||
|
5143870d3b | ||
|
f61c4c1374 | ||
|
254735fcae | ||
|
44024371ff | ||
|
be232fa34b | ||
|
1a90165255 | ||
|
13417d15b7 | ||
|
9fe1f6acfc | ||
|
1899d86641 | ||
|
6ca63ca56b | ||
|
e796968ec0 | ||
|
7b64c8dbe3 | ||
|
2377f7bc07 | ||
|
47fdcef182 | ||
|
d27b658392 | ||
|
07720ed6f8 | ||
|
a9cdecf599 | ||
|
c6b5a5c328 | ||
|
e7f3aa3764 | ||
|
89ca8e08d6 | ||
|
6350506ce7 | ||
|
d5ed611920 | ||
|
acc10ccac4 | ||
|
45160a2e73 | ||
|
e38794171a | ||
|
c2d6da83c0 | ||
|
fd568b5300 | ||
|
77005fc495 | ||
|
0273e58783 | ||
|
3e88a24753 | ||
|
1205908233 | ||
|
3a7a068196 | ||
|
845ecfe742 | ||
|
53355aaad3 | ||
|
7cd0e25538 | ||
|
2f15178ff6 | ||
|
a4b13be0d1 | ||
|
23ae4fb790 | ||
|
cff036d08b | ||
|
7826cc0b03 | ||
|
2bfa28a311 | ||
|
780c5c80ae | ||
|
fcd00b3212 | ||
|
6a41d6e85a | ||
|
3733858145 | ||
|
95d8ee65a5 | ||
|
8e57697b71 | ||
|
c9c371b297 | ||
|
d4f794920e | ||
|
13b5ef36d7 | ||
|
83e0bac52a | ||
|
9943ae0fa5 | ||
|
4c95872826 | ||
|
4aef72572d | ||
|
126918be54 | ||
|
1dc4516efc | ||
|
9a9cfbd130 | ||
|
341c9ba64b | ||
|
f432734338 | ||
|
b7f5f848f2 | ||
|
d80cf6bf37 | ||
|
31bce2e644 | ||
|
faabd17fc6 | ||
|
4c4ed60cfb | ||
|
be1895a080 | ||
|
b81b6135f6 | ||
|
583ac7960b | ||
|
b749bb60fc | ||
|
2c6a298758 | ||
|
42544cc63b | ||
|
d2b81d221b | ||
|
618d8723d1 | ||
|
8058d3f728 | ||
|
0bc10acf02 | ||
|
e5866e8aa6 | ||
|
b4e907ae77 | ||
|
ff23248017 | ||
|
ac0d01b724 | ||
|
40adbc5e9e | ||
|
f36e0c2513 | ||
|
5be8c2cdcf | ||
|
e915549f6d | ||
|
30b3f3190b | ||
|
3f7390d104 | ||
|
005bfe799c | ||
|
c9f1715899 | ||
|
faf5eac806 | ||
|
9c5ab41b05 | ||
|
a8c8539e7a | ||
|
a3153f1c9f | ||
|
f23ab37a11 | ||
|
334da21a3b | ||
|
4a7c1f54d2 | ||
|
643b06ffa7 | ||
|
0f4a781df0 | ||
|
d6cc84aabd | ||
|
33ad0dce15 | ||
|
949c92f6d6 | ||
|
48098b5c06 | ||
|
afcfb0e341 | ||
|
a1364a621a | ||
|
4113252f18 | ||
|
386d11f51a | ||
|
39a506ad52 | ||
|
d9c266e3f1 | ||
|
f4092c0824 | ||
|
4fd20b1c5a | ||
|
0d5586b379 | ||
|
da77de0a08 | ||
|
dd34b155b4 | ||
|
26ce102113 | ||
|
5082181c49 | ||
|
0ee370303c | ||
|
720494d870 | ||
|
cfe1911723 | ||
|
b2318b1f9f | ||
|
560db37025 | ||
|
dd557f66a5 | ||
|
0603f179cc | ||
|
21fcaf621d | ||
|
794c8dd051 | ||
|
f020b571da | ||
|
071ea5854f | ||
|
bfec890632 | ||
|
3bb9d2efd6 | ||
|
e117b6f732 | ||
|
710026c8ac | ||
|
79c45af0d5 | ||
|
a75db94da5 | ||
|
468261906a | ||
|
3f1c9c989b | ||
|
3b40de1962 | ||
|
2dda1c82c5 | ||
|
4bc4d41728 | ||
|
c8c160d912 | ||
|
99354f7dbe | ||
|
279310f9a5 | ||
|
d0de79bffa | ||
|
fbd42726c0 | ||
|
dfe02fbe96 | ||
|
a8cffb9ac8 | ||
|
bdbf2fe583 | ||
|
36776cd615 | ||
|
1852d9291d | ||
|
0e5a0fdbe5 | ||
|
7e59c40091 | ||
|
53eba3f062 | ||
|
334347abcf | ||
|
e43e3c198a | ||
|
a8b8da4732 | ||
|
ea57f5655c | ||
|
68496bd1a1 | ||
|
097d4d5735 | ||
|
89224c8f88 | ||
|
22c0a219aa | ||
|
9eed42cea0 | ||
|
be24cbed2d | ||
|
aef3e0aead | ||
|
7a06a41502 | ||
|
03948d185d | ||
|
40d39d6268 | ||
|
66f1506429 | ||
|
f19f148297 | ||
|
79c6eb5503 | ||
|
1204bed80a | ||
|
dc91b1f7d6 | ||
|
66dc2b33de | ||
|
c97c337c79 | ||
|
0f7deeeac1 | ||
|
8c338675d2 | ||
|
b126c761cd | ||
|
d02513bb70 | ||
|
68e8d69d04 | ||
|
4eb680d675 | ||
|
068dbfffd8 | ||
|
d9ec2efa4b | ||
|
1c90e9dd7d | ||
|
811942d45e | ||
|
dbde239a25 | ||
|
ab3ba3e2ca | ||
|
79e77b5a10 | ||
|
c3395133c9 | ||
|
b1d073cdeb | ||
|
2c115cd074 | ||
|
c99bd27e4d | ||
|
25d723b373 | ||
|
0cfceab151 | ||
|
65a0e056c7 | ||
|
b27a215c7f | ||
|
e9783d050b | ||
|
e1be1ead86 | ||
|
b129bed69f | ||
|
265ad50ce4 | ||
|
3e2570601f | ||
|
05513e67d2 | ||
|
34e4164e2f | ||
|
e4123b4ad9 | ||
|
ee6325e3c2 | ||
|
a2fce031a2 | ||
|
2de30f8b82 | ||
|
f1dbc1d41c | ||
|
a96734f5be | ||
|
b83eee751f | ||
|
49451dba20 | ||
|
3830f36c0b | ||
|
9f7eeb0510 | ||
|
58396ea5ce | ||
|
b1bb470b0a | ||
|
0b6f5581f0 | ||
|
c34f762507 | ||
|
9eac63c021 | ||
|
1fec7d5558 | ||
|
5eb084fd3b | ||
|
a99db36578 | ||
|
bec8a2e7d1 | ||
|
38ced8cb09 | ||
|
8eff3f5616 | ||
|
6f8332bad1 | ||
|
01e0c0c21f | ||
|
7a1eecc815 | ||
|
bec91863e2 | ||
|
341b763088 | ||
|
e0721493e9 | ||
|
2d467f7fa5 | ||
|
23ecbfcb3a | ||
|
f8ad782991 | ||
|
c2684a8149 | ||
|
4e7c6b0aea | ||
|
c568f5b33c | ||
|
e85d4fca5d | ||
|
d9601f3136 | ||
|
3ee5deb9f3 | ||
|
8bc92e88df | ||
|
ebe06c9c38 | ||
|
b3f32ffc59 | ||
|
ecc50790ed | ||
|
a09c7b72c7 | ||
|
7d767cf0c9 | ||
|
b5fc8e7fc1 | ||
|
91ec0dce37 | ||
|
1aa2786ba0 | ||
|
3265fafd76 | ||
|
17fd8ee504 | ||
|
05adb06aeb | ||
|
dacf6377ae | ||
|
fa76c5db8d | ||
|
17f6d6e8c1 | ||
|
347d84526b | ||
|
172327613f | ||
|
3e1ee7f330 | ||
|
22b5888671 | ||
|
41edae9719 | ||
|
6446a3c4de | ||
|
9c4939e051 | ||
|
9f9f760ede | ||
|
488cb99d4c | ||
|
4167ecafd2 | ||
|
6ca41ddf80 | ||
|
734f83470c | ||
|
0f8f7aeb14 | ||
|
3b653a95a0 | ||
|
06eb389b21 | ||
|
17d2d6f959 | ||
|
20e065a371 | ||
|
57cf826e2c | ||
|
dbe8d3a68e | ||
|
5a174b2236 | ||
|
b8158f3b53 | ||
|
e768b8cfea | ||
|
c593546575 | ||
|
578f93fb90 | ||
|
24a90036b7 | ||
|
488c0f1828 | ||
|
f4717d0a3d | ||
|
913c78f45d | ||
|
4e90c05472 | ||
|
d31d9f2638 | ||
|
0cf56d5a9a | ||
|
80112e7b35 | ||
|
b2f1fac133 | ||
|
cd57877175 | ||
|
30f515d473 | ||
|
199113341f | ||
|
64aef69d74 | ||
|
2073755498 | ||
|
f72b5c1028 | ||
|
561b24f6fd | ||
|
d41221bd90 | ||
|
132c6543b2 | ||
|
7152344fe1 | ||
|
a04092c99c | ||
|
c273fd4d63 | ||
|
e06dd9c69f | ||
|
463b20013d | ||
|
204fbec648 | ||
|
d65706aa9c | ||
|
f2a1597ecc | ||
|
9a2f0bee29 | ||
|
3f8833eaf1 | ||
|
c3a1e7c6e9 | ||
|
f5aec137bd | ||
|
20960dbd47 | ||
|
e45fd6b4d3 | ||
|
8eacba972e | ||
|
51732a5adb | ||
|
f51873d877 | ||
|
d738fa54ad | ||
|
ec8ccc94aa | ||
|
cb8dca747b | ||
|
b16ebbbf7a | ||
|
90ccb34916 | ||
|
724af8f757 | ||
|
125fa8647a | ||
|
bf47237d8f | ||
|
294b9fc941 | ||
|
699c1ab58c | ||
|
150ee14de6 | ||
|
b207f7a53f | ||
|
096698912e | ||
|
a5ec1be7d1 | ||
|
f9f884a7f3 | ||
|
31d59c1e21 | ||
|
7663044e9f | ||
|
7ceb68d835 | ||
|
ac2635a363 | ||
|
2496e6e738 | ||
|
b4b36c6f22 | ||
|
0171ea837f | ||
|
79a343c2d9 | ||
|
dd5ed48c7e | ||
|
e7169cc70d | ||
|
c65ee4a424 | ||
|
feee162578 | ||
|
d1cab4b7f5 | ||
|
d2acf314f5 | ||
|
b803984773 | ||
|
d2582f4fdf | ||
|
dfd18ebe24 | ||
|
94082bc6a5 | ||
|
5c3c72c37e | ||
|
d730e068b0 | ||
|
b2f8c38842 | ||
|
71b2e36429 | ||
|
e598c64241 | ||
|
2b2ec2c655 | ||
|
381d757525 | ||
|
d54c59cf74 | ||
|
1f481fba4e | ||
|
69cd88e4a5 | ||
|
b140a9d7de | ||
|
b1b530edf2 | ||
|
ab63316f83 | ||
|
35df8e5d9e | ||
|
ea3c82733c | ||
|
60f75fe2db | ||
|
9214095a64 | ||
|
676c43ebab | ||
|
e65af8c1e4 | ||
|
2321455723 | ||
|
9260235224 | ||
|
56801c0a08 | ||
|
aa738cc086 | ||
|
900b0f3eb2 | ||
|
b5a64e2c3e | ||
|
4163d9e474 | ||
|
d769dc2b94 | ||
|
c9fc52ec74 | ||
|
fe72568d3b | ||
|
c5c379f38a | ||
|
2050889590 | ||
|
6164e2d8eb | ||
|
30c175ef29 | ||
|
f6fed72b64 | ||
|
7596ff2eda | ||
|
142976f012 | ||
|
ab5c97f75a | ||
|
aea3de982a | ||
|
83aff6f478 | ||
|
6cb7154bf4 | ||
|
3aa38d35d7 | ||
|
870a76c570 | ||
|
206a64eff6 | ||
|
6b97839617 | ||
|
456d979aa6 | ||
|
ea5e0d337c | ||
|
9651317695 | ||
|
a4cc2076d7 | ||
|
db820d500d | ||
|
722192127c | ||
|
36e23d6432 | ||
|
8cfb014f60 | ||
|
b4a572c8ae | ||
|
531e92e2da | ||
|
53a857b706 | ||
|
4f5473f8a2 | ||
|
1b617a4adc | ||
|
7741a43d42 | ||
|
776411f882 | ||
|
ae4cecc621 | ||
|
5be98a46e3 | ||
|
1907ef0c99 | ||
|
bd99b25848 | ||
|
616401ebba | ||
|
d0fb6acccd | ||
|
12a7b3c73c | ||
|
75b28c46af | ||
|
93dccf62df | ||
|
ec499eecd5 | ||
|
7ccd19e21d | ||
|
a6459d3641 | ||
|
9b26378fdd | ||
|
6b8e84332d | ||
|
6d56bb8afd | ||
|
be9e873277 | ||
|
10feeeeb6b | ||
|
518af9dc0a | ||
|
093fc811eb | ||
|
2a8b27033f | ||
|
62bddd7c69 | ||
|
113f91b3c5 | ||
|
d40ad2de89 | ||
|
3b7733018c | ||
|
e319864669 | ||
|
7251813634 | ||
|
e024015d5e | ||
|
3f5e6d72d6 | ||
|
9fd43a30f9 | ||
|
0707a0e05f | ||
|
f550d847c4 | ||
|
1e9a0036e7 | ||
|
16cf0a3058 | ||
|
0fa19a281c | ||
|
9c53f485e6 | ||
|
dc131f77d4 | ||
|
712601b8c0 | ||
|
ff7775b344 | ||
|
0512fa6208 | ||
|
27ab2b8e30 | ||
|
9fa7c9c20a | ||
|
6bd0250ef8 | ||
|
0d736bcb58 | ||
|
c1129604ba | ||
|
693f6cbfe7 | ||
|
7f397a4da8 | ||
|
52ba5c5bb7 | ||
|
ce24942a03 | ||
|
719afba05a | ||
|
c99dd2ba87 | ||
|
a59cc94afc | ||
|
336cadbc12 | ||
|
a946dc69c1 | ||
|
e2e95df057 | ||
|
e095369e1a | ||
|
1c938a5998 | ||
|
a45128807e | ||
|
d54e52b1a8 | ||
|
5743729d11 | ||
|
11d8466db1 | ||
|
c3360d6c48 | ||
|
37158fdb89 | ||
|
ae73051797 | ||
|
62db3d09ea | ||
|
f82aa0adde | ||
|
5e5b6cdc42 | ||
|
351306eb03 | ||
|
e4fffa52d4 | ||
|
d622ff4a78 | ||
|
b6d4fd16c9 | ||
|
a548d695f2 | ||
|
499f318192 | ||
|
42ecf98344 | ||
|
6f08e1e4ff | ||
|
9524eb7e37 | ||
|
84e478f8fe | ||
|
0cc77f99ac | ||
|
622049dfad | ||
|
65bcc58261 | ||
|
9749a2b9b7 | ||
|
7b365194ba | ||
|
6e5c2730f1 | ||
|
8d045f0c96 | ||
|
c370358bd1 | ||
|
03e8d921d3 | ||
|
6cf624c18d | ||
|
41acdce165 | ||
|
c607444c23 | ||
|
940198b9a0 | ||
|
9c3cf705c6 | ||
|
6027725fae | ||
|
054aa52bc8 | ||
|
f4a562bc3c | ||
|
de8bf33ad9 | ||
|
159eaf7899 | ||
|
1bc045eb18 | ||
|
0f934e48bc | ||
|
3ecd29d0b5 | ||
|
42498842b5 | ||
|
ed4fbf093d | ||
|
96b19027ec | ||
|
cdb8a1e98c | ||
|
8cd26c9380 | ||
|
0863f0d564 | ||
|
63a2f7b7a5 | ||
|
9b562276f3 | ||
|
a17e01793e | ||
|
7fb061ea76 | ||
|
91d864bded | ||
|
339d7d16c7 | ||
|
8e5762c3a3 | ||
|
50a811720f | ||
|
c2e1c4c1e1 | ||
|
e7b11a2d82 | ||
|
61d3582357 | ||
|
9e66219690 | ||
|
d049b8846c | ||
|
bdd760f343 | ||
|
1ee88618e8 | ||
|
e399474b4e | ||
|
e2e55b6e08 | ||
|
d0d2bad7f4 | ||
|
92bee549a1 | ||
|
02121f66de | ||
|
115eb6f511 | ||
|
d208da577f | ||
|
62665899c6 | ||
|
7640839f92 | ||
|
cda837247a | ||
|
8e2ba0d963 | ||
|
f4958de885 | ||
|
3917e3469d | ||
|
5ce79b1761 | ||
|
7a621e0cd7 | ||
|
34a1c965be | ||
|
17b42ae051 | ||
|
55ae00af27 | ||
|
7e200b1ec7 | ||
|
f65a3be231 | ||
|
20bec7e26c | ||
|
b367955e56 | ||
|
84c3ef144d | ||
|
ab2c8e3826 | ||
|
f2c6ff7904 | ||
|
06ee4d08d6 | ||
|
e96679c820 | ||
|
105e4652c6 | ||
|
e5b8f149bf | ||
|
334cb23691 | ||
|
52d9807648 | ||
|
b44a2075a8 | ||
|
b60952d684 | ||
|
5db362e812 | ||
|
0b74168343 | ||
|
58e2d7be61 | ||
|
728c167660 | ||
|
982f274425 | ||
|
557c7a2877 | ||
|
dbba7af4b5 | ||
|
82eefca110 | ||
|
778b30b1cf | ||
|
2d4616da01 | ||
|
37a12326dc | ||
|
5516b3284c | ||
|
ed0fae36ad | ||
|
35d27f03bd | ||
|
1600d27db4 | ||
|
0feca7ee7f | ||
|
6e0bb6cf8b | ||
|
e6d66eba7d | ||
|
bd6e77bf32 | ||
|
9027f3fb10 | ||
|
95eb302a62 | ||
|
0be982c798 | ||
|
67e5451c7c | ||
|
b31721b836 | ||
|
03146ed85f | ||
|
3007918647 | ||
|
c6c4e950db | ||
|
40eba9e95e | ||
|
51ce7c939d | ||
|
972e5aed8a | ||
|
8ba9e9efd8 | ||
|
63ca925786 | ||
|
71d1e6eb82 | ||
|
8641f69dae | ||
|
120aa066c2 | ||
|
27bcf6badb | ||
|
465691d5c9 | ||
|
48eb115cb9 | ||
|
51ee872179 | ||
|
c617f43e42 | ||
|
4920f64816 | ||
|
880134ce80 | ||
|
6e47652566 | ||
|
cb2df32d91 | ||
|
80fff62b34 | ||
|
0f6867662c | ||
|
3bb431f18e | ||
|
91a3adf2a2 | ||
|
e27d059376 | ||
|
22c61ba603 | ||
|
6807f7e07b | ||
|
8632ef34eb | ||
|
47c0d9500a | ||
|
ee01d26915 | ||
|
0910dc4e54 | ||
|
96cf42fb06 | ||
|
8b22f03c09 | ||
|
299604838d | ||
|
e9e4a0d0db | ||
|
c2049b21fc | ||
|
a415b9d7ae | ||
|
cb4fd1ebf9 | ||
|
a28b790256 | ||
|
55847fa22f | ||
|
6ca0e6adcc | ||
|
6542a60d61 | ||
|
ef4e1c53b7 | ||
|
ec64bf2f0f | ||
|
54dc2219fe | ||
|
a576ad2a39 | ||
|
25a246b6ae | ||
|
4840671f0e | ||
|
1d284a3528 | ||
|
721dd17686 | ||
|
3830f5ee46 | ||
|
ef8af13500 | ||
|
16fb1bda53 | ||
|
e8fcb0cc87 | ||
|
0e23ea5284 | ||
|
f9143ad817 | ||
|
925c03acca | ||
|
421d7a947f | ||
|
7104d5b480 | ||
|
ddb631d800 | ||
|
6107af625f | ||
|
2ce40e0390 | ||
|
3f267f3774 | ||
|
91ef985353 | ||
|
cc759afe16 | ||
|
fd405457e4 | ||
|
65706980a2 | ||
|
04851284ca | ||
|
fbedc6b29b | ||
|
d228ff9fbd | ||
|
0f28060795 | ||
|
1df8509e4d | ||
|
1229b772fe | ||
|
3cf3cd1598 | ||
|
c5f1f11f2d | ||
|
b4b424bf8a | ||
|
2d1aa27955 | ||
|
1f803662d3 | ||
|
2cbbc7100a | ||
|
ed2a6f15fd | ||
|
1aa806df85 | ||
|
17aa5ae243 | ||
|
1a96ee4c6b | ||
|
0d9ff26d51 | ||
|
ce40813bcf | ||
|
ea1db84fcc | ||
|
c79ee74b4c | ||
|
3407a31cf6 | ||
|
2dfe693564 | ||
|
e99edd4af9 | ||
|
8d43e1215a | ||
|
6449289147 | ||
|
5a33dcaf07 | ||
|
2e804086eb | ||
|
5bbedc7e3c | ||
|
9455936f19 | ||
|
9af4ec7b04 | ||
|
fb619a0099 | ||
|
35e369ff1a | ||
|
2fa8e2ff09 | ||
|
eeb9999334 | ||
|
e6cbd8c8f8 | ||
|
5a40204cb3 | ||
|
805cf06af7 | ||
|
bdce832fee | ||
|
4c97aa8542 | ||
|
ca9102d4f5 | ||
|
4f8e7b0e2b | ||
|
9e92c9230b | ||
|
2fef4a0c09 | ||
|
00dc711ffa | ||
|
a52c261d95 | ||
|
c63d8a70b8 | ||
|
79f5bcd2fc | ||
|
675ef8aefd | ||
|
f97bae0b27 | ||
|
3361901cd8 | ||
|
3db47b575b | ||
|
b1ab59b2e6 | ||
|
652b852f6d | ||
|
54fd2049a8 | ||
|
06d807d9ff | ||
|
b66b1ba9e6 | ||
|
06f71cea24 | ||
|
88eed12c78 | ||
|
ea75f65e35 | ||
|
b1a9b448a6 | ||
|
c27c3c48ba | ||
|
fdf28c3513 | ||
|
018222a1f4 | ||
|
ca5d6c5cfe | ||
|
d02488f00c | ||
|
1d14c8a706 | ||
|
573b744293 | ||
|
4bd326f72c | ||
|
d278809659 | ||
|
8053e11b9a | ||
|
5f544fba8a | ||
|
8ee0d8a73e | ||
|
b56352cb4e | ||
|
6d0cc97635 | ||
|
384c7cd831 | ||
|
9ec1e84ed0 | ||
|
691521c5b9 | ||
|
a1e77b4ccd | ||
|
f90da61a85 | ||
|
0b0ff15dde | ||
|
9b157c7ac3 | ||
|
525ba12fc8 | ||
|
2785b8ffc5 | ||
|
cd9d5db3c2 | ||
|
d8ef15a1e2 | ||
|
f1015ca73d | ||
|
e865a5d7c6 | ||
|
cd6e5ccfb8 | ||
|
46ca24cf9d | ||
|
813137efc9 | ||
|
4235288c55 | ||
|
7fd445173d | ||
|
1e190bbe70 | ||
|
0229686203 | ||
|
1606076b4e | ||
|
cd630e9516 | ||
|
3b200e5c92 | ||
|
639712c003 | ||
|
cfb59f2f19 |
10
.dockerignore
Normal file
@@ -0,0 +1,10 @@
|
||||
**/node_modules
|
||||
Assets/
|
||||
.git/
|
||||
_releases/
|
||||
packages/app-desktop
|
||||
packages/app-cli
|
||||
packages/app-mobile
|
||||
packages/app-clipper
|
||||
packages/generator-joplin
|
||||
packages/plugin-repo-cli
|
26
.env-sample
Normal file
@@ -0,0 +1,26 @@
|
||||
# =============================================================================
|
||||
# PRODUCTION CONFIG EXAMPLE
|
||||
# -----------------------------------------------------------------------------
|
||||
# By default it will use SQLite, but that's mostly to test and evaluate the
|
||||
# server. So you'll want to specify db connection settings to use Postgres.
|
||||
# =============================================================================
|
||||
#
|
||||
# APP_BASE_URL=https://example.com/joplin
|
||||
# APP_PORT=22300
|
||||
#
|
||||
# DB_CLIENT=pg
|
||||
# POSTGRES_PASSWORD=joplin
|
||||
# POSTGRES_DATABASE=joplin
|
||||
# POSTGRES_USER=joplin
|
||||
# POSTGRES_PORT=5432
|
||||
# POSTGRES_HOST=localhost
|
||||
|
||||
# =============================================================================
|
||||
# DEV CONFIG EXAMPLE
|
||||
# -----------------------------------------------------------------------------
|
||||
# Example of local config, for development. In dev mode, you would usually use
|
||||
# SQLite so database settings are not needed.
|
||||
# =============================================================================
|
||||
#
|
||||
# APP_BASE_URL=http://localhost:22300
|
||||
# APP_PORT=22300
|
1779
.eslintignore
182
.eslintrc.js
@@ -1,12 +1,13 @@
|
||||
module.exports = {
|
||||
'root': true,
|
||||
'env': {
|
||||
'browser': true,
|
||||
'es6': true,
|
||||
'node': true,
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
'parser': '@typescript-eslint/parser',
|
||||
'extends': ['eslint:recommended'],
|
||||
"settings": {
|
||||
'settings': {
|
||||
'react': {
|
||||
'version': '16.12',
|
||||
},
|
||||
@@ -15,12 +16,16 @@ module.exports = {
|
||||
'Atomics': 'readonly',
|
||||
'SharedArrayBuffer': 'readonly',
|
||||
|
||||
// Jasmine variables
|
||||
// Jest variables
|
||||
'test': 'readonly',
|
||||
'expect': 'readonly',
|
||||
'describe': 'readonly',
|
||||
'it': 'readonly',
|
||||
'beforeAll': 'readonly',
|
||||
'afterAll': 'readonly',
|
||||
'beforeEach': 'readonly',
|
||||
'jasmine': 'readonly',
|
||||
'afterEach': 'readonly',
|
||||
'jest': 'readonly',
|
||||
|
||||
// React Native variables
|
||||
'__DEV__': 'readonly',
|
||||
@@ -29,69 +34,144 @@ module.exports = {
|
||||
'browserSupportsPromises_': true,
|
||||
'chrome': 'readonly',
|
||||
'browser': 'readonly',
|
||||
|
||||
// Server admin UI global variables
|
||||
'onDocumentReady': 'readonly',
|
||||
'setupPasswordStrengthHandler': 'readonly',
|
||||
'$': 'readonly',
|
||||
'zxcvbn': 'readonly',
|
||||
|
||||
'tinymce': 'readonly',
|
||||
},
|
||||
'parserOptions': {
|
||||
'ecmaVersion': 2018,
|
||||
"ecmaFeatures": {
|
||||
"jsx": true,
|
||||
},
|
||||
"sourceType": "module",
|
||||
'ecmaFeatures': {
|
||||
'jsx': true,
|
||||
},
|
||||
'sourceType': 'module',
|
||||
},
|
||||
'rules': {
|
||||
// -------------------------------
|
||||
// Code correctness
|
||||
// -------------------------------
|
||||
"react/jsx-uses-react": "error",
|
||||
"react/jsx-uses-vars": "error",
|
||||
"no-unused-vars": "error",
|
||||
"no-constant-condition": 0,
|
||||
"no-prototype-builtins": 0,
|
||||
'react/jsx-uses-react': 'error',
|
||||
'react/jsx-uses-vars': 'error',
|
||||
'no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
|
||||
'@typescript-eslint/no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
|
||||
'@typescript-eslint/explicit-member-accessibility': 'off',
|
||||
'no-constant-condition': 0,
|
||||
'no-prototype-builtins': 0,
|
||||
// This error is always a false positive so far since it detects
|
||||
// possible race conditions in contexts where we know it cannot happen.
|
||||
"require-atomic-updates": 0,
|
||||
'require-atomic-updates': 0,
|
||||
'prefer-const': ['error'],
|
||||
'no-var': ['error'],
|
||||
'no-new-func': ['error'],
|
||||
'import/prefer-default-export': ['error'],
|
||||
|
||||
// -------------------------------
|
||||
// Coding style preferences
|
||||
// -------------------------------
|
||||
"enforce-react-hooks/enforce-react-hooks": 2,
|
||||
// This rule should not be enabled since it matters in what order
|
||||
// imports are done, in particular in relation to the shim.setReact
|
||||
// call, which should be done first, but this rule might move it down.
|
||||
// 'import/first': ['error'],
|
||||
|
||||
'no-array-constructor': ['error'],
|
||||
'radix': ['error'],
|
||||
|
||||
// Warn only for now because fixing everything would take too much
|
||||
// refactoring, but new code should try to stick to it.
|
||||
// 'complexity': ['warn', { max: 10 }],
|
||||
|
||||
// Checks rules of Hooks
|
||||
'react-hooks/rules-of-hooks': 'error',
|
||||
// Checks effect dependencies
|
||||
// Disable because of this: https://github.com/facebook/react/issues/16265
|
||||
// "react-hooks/exhaustive-deps": "warn",
|
||||
|
||||
// -------------------------------
|
||||
// Formatting
|
||||
// -------------------------------
|
||||
"space-in-parens": ["error", "never"],
|
||||
"semi": ["error", "always"],
|
||||
"eol-last": ["error", "always"],
|
||||
"quotes": ["error", "single"],
|
||||
"indent": ["error", "tab"],
|
||||
"comma-dangle": ["error", "always-multiline"],
|
||||
"no-trailing-spaces": "error",
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"prefer-template": ["error"],
|
||||
"template-curly-spacing": ["error", "never"],
|
||||
"object-curly-spacing": ["error", "always"],
|
||||
"array-bracket-spacing": ["error", "never"],
|
||||
"key-spacing": ["error", {
|
||||
"beforeColon": false,
|
||||
"afterColon": true,
|
||||
"mode": "strict"
|
||||
'space-in-parens': ['error', 'never'],
|
||||
'space-infix-ops': ['error'],
|
||||
'curly': ['error', 'multi-line', 'consistent'],
|
||||
'semi': ['error', 'always'],
|
||||
'eol-last': ['error', 'always'],
|
||||
'quotes': ['error', 'single'],
|
||||
'indent': ['error', 'tab'],
|
||||
'comma-dangle': ['error', {
|
||||
'arrays': 'always-multiline',
|
||||
'objects': 'always-multiline',
|
||||
'imports': 'always-multiline',
|
||||
'exports': 'always-multiline',
|
||||
'functions': 'never',
|
||||
}],
|
||||
"block-spacing": ["error"],
|
||||
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
|
||||
"no-spaced-func": ["error"],
|
||||
"func-call-spacing": ["error"],
|
||||
"space-before-function-paren": ["error", {
|
||||
"anonymous": "never",
|
||||
"named": "never",
|
||||
"asyncArrow": "always"
|
||||
'no-trailing-spaces': 'error',
|
||||
'linebreak-style': ['error', 'unix'],
|
||||
'prefer-template': ['error'],
|
||||
'template-curly-spacing': ['error', 'never'],
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
'array-bracket-spacing': ['error', 'never'],
|
||||
'key-spacing': ['error', {
|
||||
'beforeColon': false,
|
||||
'afterColon': true,
|
||||
'mode': 'strict',
|
||||
}],
|
||||
"multiline-comment-style": ["error", "separate-lines"],
|
||||
"space-before-blocks": "error",
|
||||
"spaced-comment": ["error", "always"],
|
||||
"keyword-spacing": ["error", { "before": true, "after": true }]
|
||||
'block-spacing': ['error'],
|
||||
'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
|
||||
'no-spaced-func': ['error'],
|
||||
'func-call-spacing': ['error'],
|
||||
'space-before-function-paren': ['error', {
|
||||
'anonymous': 'never',
|
||||
'named': 'never',
|
||||
'asyncArrow': 'always',
|
||||
}],
|
||||
'multiline-comment-style': ['error', 'separate-lines'],
|
||||
'space-before-blocks': 'error',
|
||||
'spaced-comment': ['error', 'always'],
|
||||
'keyword-spacing': ['error', { 'before': true, 'after': true }],
|
||||
'no-multi-spaces': ['error'],
|
||||
},
|
||||
"plugins": [
|
||||
"react",
|
||||
"@typescript-eslint",
|
||||
"enforce-react-hooks",
|
||||
'plugins': [
|
||||
'react',
|
||||
'@typescript-eslint',
|
||||
'react-hooks',
|
||||
'import',
|
||||
],
|
||||
};
|
||||
'overrides': [
|
||||
{
|
||||
// enable the rule specifically for TypeScript files
|
||||
'files': ['*.ts', '*.tsx'],
|
||||
'parserOptions': {
|
||||
// Required for @typescript-eslint/no-floating-promises
|
||||
'project': './tsconfig.eslint.json',
|
||||
},
|
||||
'rules': {
|
||||
// Warn only because it would make it difficult to convert JS classes to TypeScript, unless we
|
||||
// make everything public which is not great. New code however should specify member accessibility.
|
||||
'@typescript-eslint/explicit-member-accessibility': ['warn'],
|
||||
'@typescript-eslint/type-annotation-spacing': ['error', { 'before': false, 'after': true }],
|
||||
'@typescript-eslint/comma-dangle': ['error', {
|
||||
'arrays': 'always-multiline',
|
||||
'objects': 'always-multiline',
|
||||
'imports': 'always-multiline',
|
||||
'exports': 'always-multiline',
|
||||
'enums': 'always-multiline',
|
||||
'generics': 'always-multiline',
|
||||
'tuples': 'always-multiline',
|
||||
'functions': 'never',
|
||||
}],
|
||||
'@typescript-eslint/semi': ['error', 'always'],
|
||||
'@typescript-eslint/member-delimiter-style': ['error', {
|
||||
'multiline': {
|
||||
'delimiter': 'semi',
|
||||
'requireLast': true,
|
||||
},
|
||||
'singleline': {
|
||||
'delimiter': 'semi',
|
||||
'requireLast': false,
|
||||
},
|
||||
}],
|
||||
'@typescript-eslint/no-floating-promises': ['error'],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
23
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,8 +1,9 @@
|
||||
---
|
||||
name: "🐛 Bug Report"
|
||||
name: "\U0001F41B Bug Report"
|
||||
about: Report a reproducible bug or regression in Joplin.
|
||||
title: ''
|
||||
labels: 'bug'
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
@@ -19,24 +20,26 @@ labels: 'bug'
|
||||
|
||||
## Environment
|
||||
|
||||
Joplin version:
|
||||
Platform:
|
||||
OS specifcs:
|
||||
Joplin version:
|
||||
Platform:
|
||||
OS specifics:
|
||||
|
||||
<!--
|
||||
Platform can be one of: macOS, Linux, Windows, Android, iOS, terminal (or a combination)
|
||||
OS specifcs: e.g. OS version, Linux distribution, Android/iOS version, ...
|
||||
OS specifics: e.g. OS version, Linux distribution, Android/iOS version...
|
||||
-->
|
||||
|
||||
## Steps To Reproduce
|
||||
## Steps to reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
<!--
|
||||
Issues without reproduction steps are likely to stall.
|
||||
-->
|
||||
|
||||
Describe what you expected to happen:
|
||||
## Describe what you expected to happen
|
||||
|
||||
|
||||
|
||||
|
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: "\U0001F914 Feature requests and support"
|
||||
url: https://discourse.joplinapp.org/
|
||||
about: I have a question or feature request …
|
29
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -1,29 +0,0 @@
|
||||
---
|
||||
name: "🤔 Questions and Help"
|
||||
about: The issue tracker is not for questions. Please ask questions on https://discourse.joplinapp.org/.
|
||||
title: ''
|
||||
labels: 'invalid'
|
||||
|
||||
---
|
||||
|
||||
⚠🚨⛔ The issue tracker is not for questions. ⛔🚨⚠
|
||||
|
||||
As it happens, support requests that are created as issues are likely to be closed. We want to make sure you are able to find the help you seek.
|
||||
|
||||
## Questions and Help
|
||||
|
||||
Please read the [documentation](https://joplinapp.org/) and [FAQ](https://joplinapp.org/faq/) first.
|
||||
|
||||
### https://discourse.joplinapp.org/
|
||||
|
||||
If you have still questions related to Joplin, please open a topic in the [forum](https://discourse.joplinapp.org/).
|
||||
You can use your GitHub credentials to login to the forum.
|
||||
|
||||
## Links
|
||||
|
||||
- Documentation: https://joplinapp.org
|
||||
- FAQ: https://joplinapp.org/faq/
|
||||
- Forum: https://discourse.joplinapp.org
|
||||
- How to enable end-to-end encryption: https://joplinapp.org/e2ee/
|
||||
- API documentation: https://joplinapp.org/api/
|
||||
- How to enable debug mode: https://joplinapp.org/debugging/
|
14
.github/PULL_REQUEST_TEMPLATE
vendored
@@ -2,14 +2,24 @@
|
||||
|
||||
Please prefix the title with the platform you are targetting:
|
||||
|
||||
Here are some examples of good titles:
|
||||
|
||||
- Desktop: Resolves #123: Added new setting to change font
|
||||
- Mobile, Desktop: Fixes #456: Fixed config screen error
|
||||
- All: Resolves #777: Made synchronisation faster
|
||||
|
||||
And here's an explanation of the title format:
|
||||
|
||||
- "Desktop" for the Windows/macOS/Linux app (Electron app)
|
||||
- "Mobile" for the mobile app (or "Android" / "iOS" if the pull request only applies to one of the mobile platforms)
|
||||
- "CLI" for the CLI app
|
||||
|
||||
If it's two platforms, separate them with commas - "Desktop, Mobile" or if it's for all platforms, prefix with "All".
|
||||
|
||||
If it's not related to any platform (such as a translation, change to the documentation, etc.), simply don't add a platform.
|
||||
|
||||
For example: "Desktop: Added new setting to change font", or "Mobile: Fixed config screen error"
|
||||
Then please append the issue that you've addressed or fixed. Use "Resolves #123" for new features or improvements and "Fixes #123" for bug fixes.
|
||||
|
||||
PLEASE READ THE GUIDE FIRST: https://github.com/laurent22/joplin/blob/master/CONTRIBUTING.md
|
||||
AND PLEASE READ THE GUIDE: https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md
|
||||
|
||||
-->
|
||||
|
141
.github/scripts/run_ci.sh
vendored
Executable file
@@ -0,0 +1,141 @@
|
||||
#!/bin/bash
|
||||
|
||||
# =============================================================================
|
||||
# Setup environment variables
|
||||
# =============================================================================
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||
ROOT_DIR="$SCRIPT_DIR/../.."
|
||||
|
||||
IS_PULL_REQUEST=0
|
||||
IS_DEV_BRANCH=0
|
||||
IS_LINUX=0
|
||||
IS_MACOS=0
|
||||
|
||||
if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then
|
||||
IS_PULL_REQUEST=1
|
||||
fi
|
||||
|
||||
if [ "$GITHUB_REF" == "refs/heads/dev" ]; then
|
||||
IS_DEV_BRANCH=1
|
||||
fi
|
||||
|
||||
if [ "$RUNNER_OS" == "Linux" ]; then
|
||||
IS_LINUX=1
|
||||
IS_MACOS=0
|
||||
else
|
||||
IS_LINUX=0
|
||||
IS_MACOS=1
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Print environment
|
||||
# =============================================================================
|
||||
|
||||
echo "GITHUB_WORKFLOW=$GITHUB_WORKFLOW"
|
||||
echo "GITHUB_EVENT_NAME=$GITHUB_EVENT_NAME"
|
||||
echo "GITHUB_REF=$GITHUB_REF"
|
||||
echo "RUNNER_OS=$RUNNER_OS"
|
||||
echo "GIT_TAG_NAME=$GIT_TAG_NAME"
|
||||
|
||||
echo "IS_CONTINUOUS_INTEGRATION=$IS_CONTINUOUS_INTEGRATION"
|
||||
echo "IS_PULL_REQUEST=$IS_PULL_REQUEST"
|
||||
echo "IS_DEV_BRANCH=$IS_DEV_BRANCH"
|
||||
echo "IS_LINUX=$IS_LINUX"
|
||||
echo "IS_MACOS=$IS_MACOS"
|
||||
|
||||
echo "Node $( node -v )"
|
||||
echo "Npm $( npm -v )"
|
||||
|
||||
# =============================================================================
|
||||
# Install packages
|
||||
# =============================================================================
|
||||
|
||||
cd "$ROOT_DIR"
|
||||
npm install
|
||||
|
||||
# =============================================================================
|
||||
# Run test units. Only do it for pull requests and dev branch because we don't
|
||||
# want it to randomly fail when trying to create a desktop release.
|
||||
# =============================================================================
|
||||
|
||||
if [ "$IS_PULL_REQUEST" == "1" ] || [ "$IS_DEV_BRANCH" = "1" ]; then
|
||||
echo "Step: Running tests..."
|
||||
|
||||
npm run test-ci
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
fi
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Run linter for pull requests only. We also don't want this to make the desktop
|
||||
# release randomly fail.
|
||||
# =============================================================================
|
||||
|
||||
if [ "$IS_PULL_REQUEST" == "1" ]; then
|
||||
echo "Step: Running linter..."
|
||||
|
||||
npm run linter-ci ./
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
fi
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Validate translations - this is needed as some users manually edit .po files
|
||||
# (and often make mistakes) instead of using a proper tool like poedit. Doing it
|
||||
# for Linux only is sufficient.
|
||||
# =============================================================================
|
||||
|
||||
if [ "$IS_PULL_REQUEST" == "1" ]; then
|
||||
if [ "$IS_LINUX" == "1" ]; then
|
||||
echo "Step: Validating translations..."
|
||||
|
||||
node packages/tools/validate-translation.js
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Find out if we should run the build or not. Electron-builder gets stuck when
|
||||
# building PRs so we disable it in this case. The Linux build should provide
|
||||
# enough info if the app builds or not.
|
||||
# https://github.com/electron-userland/electron-builder/issues/4263
|
||||
# =============================================================================
|
||||
|
||||
if [ "$IS_PULL_REQUEST" == "1" ]; then
|
||||
if [ "$IS_MACOS" == "1" ]; then
|
||||
echo "Step: Not building Electron app"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Prepare the Electron app and build it
|
||||
#
|
||||
# If the current tag is a desktop release tag (starts with "v", such as
|
||||
# "v1.4.7"), we build and publish to github
|
||||
#
|
||||
# Otherwise we only build but don't publish to GitHub. It helps finding
|
||||
# out any issue in pull requests and dev branch.
|
||||
# =============================================================================
|
||||
|
||||
cd "$ROOT_DIR/packages/app-desktop"
|
||||
|
||||
if [[ $GIT_TAG_NAME = v* ]]; then
|
||||
echo "Step: Building and publishing desktop application..."
|
||||
USE_HARD_LINKS=false npm run dist
|
||||
elif [[ $GIT_TAG_NAME = server-v* ]] && [[ $IS_LINUX = 1 ]]; then
|
||||
echo "Step: Building Docker Image..."
|
||||
cd "$ROOT_DIR"
|
||||
npm run buildServerDocker -- --tag-name $GIT_TAG_NAME
|
||||
else
|
||||
echo "Step: Building but *not* publishing desktop application..."
|
||||
USE_HARD_LINKS=false npm run dist -- --publish=never
|
||||
fi
|
10
.github/stale.yml
vendored
@@ -1,17 +1,17 @@
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 90
|
||||
daysUntilStale: 30
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- "good first issue"
|
||||
- "essential"
|
||||
- "essential-reviewed"
|
||||
- "help wanted"
|
||||
- "nice to have"
|
||||
- "upstream"
|
||||
- "backlog"
|
||||
- "high"
|
||||
- "medium"
|
||||
- "spec"
|
||||
- "cannot reproduce"
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
|
76
.github/workflows/github-actions-main.yml
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
name: Joplin Continuous Integration
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
Main:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, ubuntu-latest, windows-2016]
|
||||
steps:
|
||||
|
||||
# Silence apt-get update errors (for example when a module doesn't
|
||||
# exist) since otherwise it will make the whole build fails, even though
|
||||
# it might work without update. libsecret-1-dev is required for keytar -
|
||||
# https://github.com/atom/node-keytar
|
||||
|
||||
- name: Install Linux dependencies
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update || true
|
||||
sudo apt-get install -y gettext
|
||||
sudo apt-get install -y libsecret-1-dev
|
||||
|
||||
- name: Install Docker Engine
|
||||
if: runner.os == 'Linux' && startsWith(github.ref, 'refs/tags/server-v')
|
||||
run: |
|
||||
sudo apt-get install -y apt-transport-https
|
||||
sudo apt-get install -y ca-certificates
|
||||
sudo apt-get install -y curl
|
||||
sudo apt-get install -y gnupg
|
||||
sudo apt-get install -y lsb-release
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
echo \
|
||||
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
|
||||
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
sudo apt-get update || true
|
||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- uses: olegtarasov/get-tag@v2.1
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '12'
|
||||
|
||||
# Login to Docker only if we're on a server release tag. If we run this on
|
||||
# a pull request it will fail because the PR doesn't have access to
|
||||
# secrets
|
||||
- uses: docker/login-action@v1
|
||||
if: runner.os == 'Linux' && startsWith(github.ref, 'refs/tags/server-v')
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Run tests, build and publish Linux and macOS apps
|
||||
if: runner.os == 'Linux' || runner.os == 'macOs'
|
||||
env:
|
||||
APPLE_ASC_PROVIDER: ${{ secrets.APPLE_ASC_PROVIDER }}
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CSC_KEY_PASSWORD }}
|
||||
CSC_LINK: ${{ secrets.APPLE_CSC_LINK }}
|
||||
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
IS_CONTINUOUS_INTEGRATION: 1
|
||||
run: |
|
||||
"${GITHUB_WORKSPACE}/.github/scripts/run_ci.sh"
|
||||
|
||||
- name: Build and publish Windows app
|
||||
if: runner.os == 'Windows' && startsWith(github.ref, 'refs/tags/v')
|
||||
env:
|
||||
CSC_KEY_PASSWORD: ${{ secrets.WINDOWS_CSC_KEY_PASSWORD }}
|
||||
CSC_LINK: ${{ secrets.WINDOWS_CSC_LINK }}
|
||||
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
IS_CONTINUOUS_INTEGRATION: 1
|
||||
run: |
|
||||
npm install
|
||||
cd packages/app-desktop
|
||||
npm run dist
|
1749
.gitignore
vendored
117
.travis.yml
@@ -1,117 +0,0 @@
|
||||
# Only build tags (Doesn't work - doesn't build anything)
|
||||
if: tag IS present OR type = pull_request
|
||||
|
||||
rvm: 2.3.3
|
||||
|
||||
# It's important to only build production branches otherwise Electron Builder
|
||||
# might take assets from dev branches and overwrite those of production.
|
||||
# https://docs.travis-ci.com/user/customizing-the-build/#Building-Specific-Branches
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: osx
|
||||
osx_image: xcode9.0
|
||||
language: node_js
|
||||
node_js: "8"
|
||||
env:
|
||||
- ELECTRON_CACHE=$HOME/.cache/electron
|
||||
- ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder
|
||||
|
||||
- os: linux
|
||||
sudo: required
|
||||
dist: trusty
|
||||
language: node_js
|
||||
node_js: "8"
|
||||
env:
|
||||
- ELECTRON_CACHE=$HOME/.cache/electron
|
||||
- ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder
|
||||
|
||||
# cache:
|
||||
# directories:
|
||||
# - node_modules
|
||||
# - $HOME/.cache/electron
|
||||
# - $HOME/.cache/electron-builder
|
||||
|
||||
before_install:
|
||||
# HOMEBREW_NO_AUTO_UPDATE needed so that Homebrew doesn't upgrade to the next
|
||||
# version, which requires Ruby 2.3, which is not available on the Travis VM.
|
||||
|
||||
# Silence apt-get update errors (for example when a module doesn't exist) since
|
||||
# otherwise it will make the whole build fails, even though all we need is yarn.
|
||||
- |
|
||||
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
HOMEBREW_NO_AUTO_UPDATE=1 brew install yarn
|
||||
else
|
||||
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
||||
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
|
||||
sudo apt-get update || true
|
||||
sudo apt-get install -y yarn
|
||||
sudo apt-get install -y gettext
|
||||
fi
|
||||
|
||||
script:
|
||||
- |
|
||||
# Copy lib
|
||||
rsync -aP --delete ReactNativeClient/lib/ ElectronClient/app/lib/
|
||||
|
||||
# Install tools
|
||||
npm install
|
||||
npm run tsc
|
||||
cd Tools
|
||||
npm install
|
||||
cd ..
|
||||
|
||||
# Run test units.
|
||||
# Only do it for pull requests because Travis randomly fails to run them
|
||||
# and that would break the desktop release.
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
cd CliClient
|
||||
npm install
|
||||
./run_test.sh
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
fi
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# Run linter for pull requests only - this is so that
|
||||
# bypassing eslint is allowed for urgent fixes.
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
npm run linter-ci ./
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
fi
|
||||
fi
|
||||
|
||||
# Validate translations - this is needed as some users manually
|
||||
# edit .po files (and often make mistakes) instead of using a proper
|
||||
# tool like poedit. Doing it for Linux only is sufficient.
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
if [ "$TRAVIS_OS_NAME" != "osx" ]; then
|
||||
node Tools/validate-translation.js
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Find out if we should run the build or not. Electron-builder gets stuck when
|
||||
# builing PRs so we disable it in this case. The Linux build should provide
|
||||
# enough info if the app builds or not.
|
||||
# https://github.com/electron-userland/electron-builder/issues/4263
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Prepare the Electron app and build it
|
||||
cd ElectronClient/app
|
||||
npm install && USE_HARD_LINKS=false yarn dist
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
BIN
Assets/ImageSources/RoundedCornersMac_1024x1024.png
Normal file
After Width: | Height: | Size: 113 KiB |
BIN
Assets/ImageSources/RoundedCorners_1024x1024.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
Assets/ImageSources/RoundedCorners_16x16.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
Assets/ImageSources/RoundedCorners_64x64.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
Assets/ImageSources/Square_1024x1024.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
Assets/ImageSources/WebsiteTopImage.png
Normal file
After Width: | Height: | Size: 4.2 MiB |
3
Assets/LICENSE
Normal file
@@ -0,0 +1,3 @@
|
||||
All assets in this directory including, but not limited to, logos, icons
|
||||
and images are copyright (c) Laurent Cozic, all rights reserved.
|
||||
They may not be used without a permission.
|
2707
Assets/PluginDocTheme/assets/css/main.css
Normal file
BIN
Assets/PluginDocTheme/assets/images/icons.png
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
Assets/PluginDocTheme/assets/images/icons@2x.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Assets/PluginDocTheme/assets/images/widgets.png
Normal file
After Width: | Height: | Size: 480 B |
BIN
Assets/PluginDocTheme/assets/images/widgets@2x.png
Normal file
After Width: | Height: | Size: 855 B |
1
Assets/PluginDocTheme/assets/js/main.js
Normal file
37
Assets/PluginDocTheme/helpers/index.js
Normal file
@@ -0,0 +1,37 @@
|
||||
function camelCaseToDots(s) {
|
||||
const output = [];
|
||||
for (let i = 0; i < s.length; i++) {
|
||||
const c = s[i];
|
||||
if (c === c.toLowerCase() || i === 0) {
|
||||
output.push(c.toLowerCase());
|
||||
} else {
|
||||
output.push('.');
|
||||
output.push(c.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
return output.join('');
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
jpFormatClassName: function(className) {
|
||||
if (className.indexOf('Joplin') !== 0 || className.indexOf(' ') >= 0) return className;
|
||||
|
||||
const p = className.substr(6);
|
||||
if (p === '') return 'joplin';
|
||||
|
||||
return `joplin.${camelCaseToDots(p)
|
||||
.replace(/menu\.items/, 'menuItems')
|
||||
.replace(/toolbar\.buttons/, 'toolbarButtons')
|
||||
.replace(/content\.scripts/, 'contentScripts')}`;
|
||||
},
|
||||
|
||||
jpIsAllowedGroup: function(name) {
|
||||
return name !== 'Constructors';
|
||||
},
|
||||
|
||||
jsIsNotKindVariable: function(classes) {
|
||||
if (!classes) return true;
|
||||
return classes.indexOf('tsd-kind-variable') < 0;
|
||||
},
|
||||
};
|
3
Assets/PluginDocTheme/index.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Joplin Plugin Documentation
|
||||
|
||||
Welcome to Joplin Plugin Documentation
|
51
Assets/PluginDocTheme/layouts/default.hbs
Normal file
@@ -0,0 +1,51 @@
|
||||
<!doctype html>
|
||||
<html class="default no-js">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<title>{{#ifCond model.name '==' project.name}}{{project.name}}{{else}}{{jpFormatClassName model.name}} | {{project.name}}{{/ifCond}}</title>
|
||||
<meta name="description" content="Documentation for {{project.name}}">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<link rel="stylesheet" href="{{relativeURL "assets/css/main.css"}}">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
{{> header}}
|
||||
|
||||
<div class="container container-main">
|
||||
<div class="row">
|
||||
<div class="col-8 col-content">
|
||||
{{{contents}}}
|
||||
</div>
|
||||
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||
<!--
|
||||
<nav class="tsd-navigation primary">
|
||||
<ul>
|
||||
{{#each navigation.children}}
|
||||
{{> navigation}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
</nav>
|
||||
-->
|
||||
|
||||
<nav class="tsd-navigation secondary menu-sticky">
|
||||
<ul class="before-current">
|
||||
{{#each toc.children}}
|
||||
{{> toc.root}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{> footer}}
|
||||
|
||||
<div class="overlay"></div>
|
||||
<script src="{{relativeURL "assets/js/main.js"}}"></script>
|
||||
|
||||
{{> analytics}}
|
||||
|
||||
</body>
|
||||
</html>
|
11
Assets/PluginDocTheme/partials/analytics.hbs
Normal file
@@ -0,0 +1,11 @@
|
||||
{{#if settings.gaID}}
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', '{{settings.gaID}}', '{{settings.gaSite}}');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
{{/if}}
|
18
Assets/PluginDocTheme/partials/breadcrumb.hbs
Normal file
@@ -0,0 +1,18 @@
|
||||
{{#if parent}}
|
||||
{{#with parent}}{{> breadcrumb}}{{/with}}
|
||||
<li>
|
||||
{{#if url}}
|
||||
<a href="{{relativeURL url}}">{{jpFormatClassName name}}</a>
|
||||
{{else}}
|
||||
<span>{{jpFormatClassName name}}</span>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{else}}
|
||||
<!--
|
||||
{{#if url}}
|
||||
<li>
|
||||
<a href="{{relativeURL url}}">Globals</a>
|
||||
</li>
|
||||
{{/if}}
|
||||
-->
|
||||
{{/if}}
|
22
Assets/PluginDocTheme/partials/comment.hbs
Normal file
@@ -0,0 +1,22 @@
|
||||
{{#with comment}}
|
||||
{{#if hasVisibleComponent}}
|
||||
<div class="tsd-comment tsd-typography">
|
||||
{{#if shortText}}
|
||||
<div class="lead">
|
||||
{{#markdown}}{{{shortText}}}{{/markdown}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if text}}
|
||||
{{#markdown}}{{{text}}}{{/markdown}}
|
||||
{{/if}}
|
||||
{{#if tags}}
|
||||
<dl class="tsd-comment-tags">
|
||||
{{#each tags}}
|
||||
<dt>{{tagName}}</dt>
|
||||
<dd>{{#markdown}}{{{text}}}{{/markdown}}</dd>
|
||||
{{/each}}
|
||||
</dl>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/with}}
|
23
Assets/PluginDocTheme/partials/footer.hbs
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
<!-- JOPLINCHANGE
|
||||
<footer{{#unless settings.hideGenerator}} class="with-border-bottom"{{/unless}}>
|
||||
<div class="container">
|
||||
<h2>Legend</h2>
|
||||
<div class="tsd-legend-group">
|
||||
{{#each legend}}
|
||||
<ul class="tsd-legend">
|
||||
{{#each .}}
|
||||
<li class="{{#compact}}{{#each classes}} {{.}}{{/each}}{{/compact}}"><span class="tsd-kind-icon">{{name}}</span></li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{{#unless settings.hideGenerator}}
|
||||
<div class="container tsd-generator">
|
||||
<p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p>
|
||||
</div>
|
||||
{{/unless}}
|
||||
-->
|
71
Assets/PluginDocTheme/partials/header.hbs
Normal file
@@ -0,0 +1,71 @@
|
||||
<header>
|
||||
<div class="tsd-page-toolbar">
|
||||
<div class="container">
|
||||
<div class="table-wrap">
|
||||
<div class="table-cell" id="tsd-search" data-index="{{relativeURL "assets/js/search.json"}}" data-base="{{relativeURL "./"}}">
|
||||
<div class="field">
|
||||
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||
<input id="tsd-search-field" type="text" />
|
||||
</div>
|
||||
|
||||
<ul class="results">
|
||||
<li class="state loading">Preparing search index...</li>
|
||||
<li class="state failure">The search index is not available</li>
|
||||
</ul>
|
||||
|
||||
<a href="{{relativeURL "classes/joplin.html"}}" class="title">{{project.name}}</a>
|
||||
</div>
|
||||
|
||||
<div class="table-cell" id="tsd-widgets">
|
||||
<div id="tsd-filter">
|
||||
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||
<div class="tsd-filter-group">
|
||||
<div class="tsd-select" id="tsd-filter-visibility">
|
||||
<span class="tsd-select-label">All</span>
|
||||
<ul class="tsd-select-list">
|
||||
<li data-value="public">Public</li>
|
||||
<li data-value="protected">Public/Protected</li>
|
||||
<li data-value="private" class="selected">All</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||
|
||||
{{#unless settings.excludeExternals}}
|
||||
<input type="checkbox" id="tsd-filter-externals" checked />
|
||||
<label class="tsd-widget" for="tsd-filter-externals">Externals</label>
|
||||
{{/unless}}
|
||||
|
||||
{{#unless settings.excludeNotExported}}
|
||||
<input type="checkbox" id="tsd-filter-only-exported" />
|
||||
<label class="tsd-widget" for="tsd-filter-only-exported">Only exported</label>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tsd-page-title">
|
||||
<div class="container">
|
||||
<ul class="tsd-breadcrumb">
|
||||
{{#with model}}{{> breadcrumb}}{{/with}}
|
||||
</ul>
|
||||
<h1>{{#compact}}
|
||||
<!-- {{model.kindString}} -->
|
||||
{{jpFormatClassName model.name}}
|
||||
{{#if model.typeParameters}}
|
||||
<
|
||||
{{#each model.typeParameters}}
|
||||
{{#if @index}}, {{/if}}
|
||||
{{name}}
|
||||
{{/each}}
|
||||
>
|
||||
{{/if}}
|
||||
{{/compact}}</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
17
Assets/PluginDocTheme/partials/hierarchy.hbs
Normal file
@@ -0,0 +1,17 @@
|
||||
<ul class="tsd-hierarchy">
|
||||
{{#each types}}
|
||||
<li>
|
||||
{{#if ../isTarget}}
|
||||
<span class="target">{{this}}</span>
|
||||
{{else}}
|
||||
{{#compact}}{{> type}}{{/compact}}
|
||||
{{/if}}
|
||||
|
||||
{{#if @last}}
|
||||
{{#with ../next}}
|
||||
{{> hierarchy}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
32
Assets/PluginDocTheme/partials/index.hbs
Normal file
@@ -0,0 +1,32 @@
|
||||
{{#if groups}}
|
||||
<section class="tsd-panel-group tsd-index-group">
|
||||
<h2>Index</h2>
|
||||
<section class="tsd-panel tsd-index-panel">
|
||||
<div class="tsd-index-content">
|
||||
{{#each groups}}
|
||||
<section class="tsd-index-section {{cssClasses}}">
|
||||
{{#if categories}}
|
||||
{{#each categories}}
|
||||
<h3>{{#if title}}{{title}} {{/if}}{{../title}}</h3>
|
||||
<ul class="tsd-index-list">
|
||||
{{#each children}}
|
||||
<li class="{{cssClasses}}"><a href="{{relativeURL url}}" class="tsd-kind-icon">{{#if name}}{{{wbr name}}}{{else}}<em>{{{wbr kindString}}}</em>{{/if}}</a></li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
{{#if (jpIsAllowedGroup title)}}
|
||||
<h3>{{title}}</h3>
|
||||
<ul class="tsd-index-list">
|
||||
{{#each children}}
|
||||
<li class="{{cssClasses}}"><a href="{{relativeURL url}}" class="tsd-kind-icon">{{#if name}}{{{wbr name}}}{{else}}<em>{{{wbr kindString}}}</em>{{/if}}</a></li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</section>
|
||||
{{/each}}
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
{{/if}}
|
36
Assets/PluginDocTheme/partials/member.declaration.hbs
Normal file
@@ -0,0 +1,36 @@
|
||||
<div class="tsd-signature tsd-kind-icon">{{#compact}}
|
||||
{{{wbr name}}}
|
||||
{{#if typeParameters}}
|
||||
<
|
||||
{{#each typeParameters}}
|
||||
{{#if @index}}, {{/if}}
|
||||
{{name}}
|
||||
{{/each}}
|
||||
>
|
||||
{{/if}}
|
||||
<span class="tsd-signature-symbol">{{#if isOptional}}?{{/if}}:</span> {{#with type}}{{>type}}{{/with}}
|
||||
{{#if defaultValue}}
|
||||
<span class="tsd-signature-symbol">
|
||||
=
|
||||
{{defaultValue}}
|
||||
</span>
|
||||
{{/if}}
|
||||
{{/compact}}</div>
|
||||
|
||||
{{> member.sources}}
|
||||
|
||||
{{> comment}}
|
||||
|
||||
{{#if typeParameters}}
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
{{> typeParameters}}
|
||||
{{/if}}
|
||||
|
||||
{{#if type.declaration}}
|
||||
<div class="tsd-type-declaration">
|
||||
<h4>Type declaration</h4>
|
||||
{{#with type.declaration}}
|
||||
{{> parameter}}
|
||||
{{/with}}
|
||||
</div>
|
||||
{{/if}}
|
37
Assets/PluginDocTheme/partials/member.getterSetter.hbs
Normal file
@@ -0,0 +1,37 @@
|
||||
<ul class="tsd-signatures {{cssClasses}}">
|
||||
{{#if getSignature}}
|
||||
{{#with getSignature}}
|
||||
<li class="tsd-signature tsd-kind-icon">{{#compact}}
|
||||
<span class="tsd-signature-symbol">get</span>
|
||||
{{../name}}
|
||||
{{> member.signature.title hideName=true }}
|
||||
{{/compact}}</li>
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
{{#if setSignature}}
|
||||
{{#with setSignature}}
|
||||
<li class="tsd-signature tsd-kind-icon">{{#compact}}
|
||||
<span class="tsd-signature-symbol">set</span>
|
||||
{{../name}}
|
||||
{{> member.signature.title hideName=true }}
|
||||
{{/compact}}</li>
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
</ul>
|
||||
|
||||
<ul class="tsd-descriptions">
|
||||
{{#if getSignature}}
|
||||
{{#with getSignature}}
|
||||
<li class="tsd-description">
|
||||
{{> member.signature.body }}
|
||||
</li>
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
{{#if setSignature}}
|
||||
{{#with setSignature}}
|
||||
<li class="tsd-description">
|
||||
{{> member.signature.body }}
|
||||
</li>
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
</ul>
|
24
Assets/PluginDocTheme/partials/member.hbs
Normal file
@@ -0,0 +1,24 @@
|
||||
<section class="tsd-panel tsd-member {{cssClasses}}">
|
||||
<a name="{{anchor}}" class="tsd-anchor"></a>
|
||||
{{#if name}}
|
||||
<h3>{{#each flags}}<span class="tsd-flag ts-flag{{this}}">{{this}}</span> {{/each}}{{{wbr name}}}</h3>
|
||||
{{/if}}
|
||||
|
||||
{{#if signatures}}
|
||||
{{> member.signatures}}
|
||||
{{else}}{{#if hasGetterOrSetter}}
|
||||
{{> member.getterSetter}}
|
||||
{{else}}{{#if isReference}}
|
||||
{{> member.reference}}
|
||||
{{else}}
|
||||
{{> member.declaration}}
|
||||
{{/if}}{{/if}}{{/if}}
|
||||
|
||||
{{#each groups}}
|
||||
{{#each children}}
|
||||
{{#unless hasOwnDocument}}
|
||||
{{> member}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
</section>
|
11
Assets/PluginDocTheme/partials/member.reference.hbs
Normal file
@@ -0,0 +1,11 @@
|
||||
{{#with tryGetTargetReflectionDeep}}
|
||||
{{#ifCond ../name '===' name}}
|
||||
Re-exports <a href="{{relativeURL url}}">{{name}}</a>
|
||||
{{else if flags.isExported}}
|
||||
Renames and re-exports <a href="{{relativeURL url}}">{{name}}</a>
|
||||
{{else}}
|
||||
Renames and exports <a href="{{relativeURL url}}">{{name}}</a>
|
||||
{{/ifCond}}
|
||||
{{else}}
|
||||
Re-exports {{name}}
|
||||
{{/with}}
|
58
Assets/PluginDocTheme/partials/member.signature.body.hbs
Normal file
@@ -0,0 +1,58 @@
|
||||
{{#unless hideSources}}
|
||||
{{> member.sources}}
|
||||
{{/unless}}
|
||||
|
||||
{{> comment}}
|
||||
|
||||
{{#if typeParameters}}
|
||||
<h4 class="tsd-type-parameters-title">Type parameters</h4>
|
||||
{{> typeParameters}}
|
||||
{{/if}}
|
||||
|
||||
{{#if parameters}}
|
||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||
<ul class="tsd-parameters">
|
||||
{{#each parameters}}
|
||||
<li>
|
||||
<h5>{{#compact}}
|
||||
{{#each flags}}
|
||||
<span class="tsd-flag ts-flag{{this}}">{{this}}</span>
|
||||
{{/each}}
|
||||
{{#if flags.isRest}}<span class="tsd-signature-symbol">...</span>{{/if}}
|
||||
{{name}}:
|
||||
{{#with type}}{{>type}}{{/with}}
|
||||
{{#if defaultValue}}
|
||||
<span class="tsd-signature-symbol">
|
||||
=
|
||||
{{defaultValue}}
|
||||
</span>
|
||||
{{/if}}
|
||||
{{/compact}}</h5>
|
||||
|
||||
{{> comment}}
|
||||
|
||||
{{#if type.declaration}}
|
||||
{{#with type.declaration}}
|
||||
{{> parameter}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
|
||||
<!-- JOPLINCHANGE
|
||||
{{#if type}}
|
||||
<h4 class="tsd-returns-title">Returns {{#compact}}{{#with type}}{{>type}}{{/with}}{{/compact}}</h4>
|
||||
|
||||
{{#if comment.returns}}
|
||||
{{#markdown}}{{{comment.returns}}}{{/markdown}}
|
||||
{{/if}}
|
||||
|
||||
{{#if type.declaration}}
|
||||
{{#with type.declaration}}
|
||||
{{> parameter}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
-->
|
32
Assets/PluginDocTheme/partials/member.signature.title.hbs
Normal file
@@ -0,0 +1,32 @@
|
||||
{{#unless hideName}}{{{wbr name}}}{{/unless}}
|
||||
{{#if typeParameters}}
|
||||
<
|
||||
{{#each typeParameters}}
|
||||
{{#if @index}}, {{/if}}
|
||||
{{name}}
|
||||
{{/each}}
|
||||
>
|
||||
{{/if}}
|
||||
<span class="tsd-signature-symbol">(</span>
|
||||
{{#each parameters}}
|
||||
{{#if @index}}, {{/if}}
|
||||
{{#if flags.isRest}}<span class="tsd-signature-symbol">...</span>{{/if}}
|
||||
{{name}}
|
||||
<span class="tsd-signature-symbol">
|
||||
{{#if flags.isOptional}}?{{/if}}
|
||||
{{#if defaultValue}}?{{/if}}
|
||||
:
|
||||
</span>
|
||||
{{#with type}}{{>type}}{{/with}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol">)</span>
|
||||
{{#if type}}
|
||||
{{#if arrowStyle}}
|
||||
<span class="tsd-signature-symbol"> => </span>
|
||||
{{else}}
|
||||
<span class="tsd-signature-symbol">: </span>
|
||||
{{/if}}
|
||||
{{#with type}}
|
||||
{{>type}}
|
||||
{{/with}}
|
||||
{{/if}}
|
13
Assets/PluginDocTheme/partials/member.signatures.hbs
Normal file
@@ -0,0 +1,13 @@
|
||||
<ul class="tsd-signatures {{cssClasses}}">
|
||||
{{#each signatures}}
|
||||
<li class="tsd-signature tsd-kind-icon">{{#compact}}{{> member.signature.title }}{{/compact}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
|
||||
<ul class="tsd-descriptions">
|
||||
{{#each signatures}}
|
||||
<li class="tsd-description">
|
||||
{{> member.signature.body }}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
11
Assets/PluginDocTheme/partials/member.sources.hbs
Normal file
@@ -0,0 +1,11 @@
|
||||
<aside class="tsd-sources">
|
||||
{{#if implementationOf}}
|
||||
<p>Implementation of {{#with implementationOf}}{{> typeAndParent}}{{/with}}</p>
|
||||
{{/if}}
|
||||
{{#if inheritedFrom}}
|
||||
<p>Inherited from {{#with inheritedFrom}}{{> typeAndParent}}{{/with}}</p>
|
||||
{{/if}}
|
||||
{{#if overwrites}}
|
||||
<p>Overrides {{#with overwrites}}{{> typeAndParent}}{{/with}}</p>
|
||||
{{/if}}
|
||||
</aside>
|
23
Assets/PluginDocTheme/partials/members.group.hbs
Normal file
@@ -0,0 +1,23 @@
|
||||
{{#if categories}}
|
||||
{{#each categories}}
|
||||
<section class="tsd-panel-group tsd-member-group {{cssClasses}}">
|
||||
<h2>{{#if title}}{{title}} {{/if}}{{../title}}</h2>
|
||||
{{#each children}}
|
||||
{{#unless hasOwnDocument}}
|
||||
{{> member}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
</section>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<section class="tsd-panel-group tsd-member-group {{cssClasses}}">
|
||||
{{#if (jpIsAllowedGroup title)}}
|
||||
<h2>{{title}}</h2>
|
||||
{{#each children}}
|
||||
{{#unless hasOwnDocument}}
|
||||
{{> member}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</section>
|
||||
{{/if}}
|
20
Assets/PluginDocTheme/partials/members.hbs
Normal file
@@ -0,0 +1,20 @@
|
||||
{{#if categories}}
|
||||
{{#each categories}}
|
||||
{{#unless allChildrenHaveOwnDocument}}
|
||||
<section class="tsd-panel-group tsd-member-group {{cssClasses}}">
|
||||
<h2>{{title}}</h2>
|
||||
{{#each children}}
|
||||
{{#unless hasOwnDocument}}
|
||||
{{> member}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
</section>
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
{{else}}
|
||||
{{#each groups}}
|
||||
{{#unless allChildrenHaveOwnDocument}}
|
||||
{{> members.group}}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
{{/if}}
|
26
Assets/PluginDocTheme/partials/navigation.hbs
Normal file
@@ -0,0 +1,26 @@
|
||||
{{#if isVisible}}
|
||||
{{#if isLabel}}
|
||||
<li class="label {{cssClasses}}">
|
||||
<span>{{{wbr title}}}</span>
|
||||
</li>
|
||||
{{else}}
|
||||
{{#if isGlobals}}
|
||||
<li class="globals {{#if isInPath}}current{{/if}} {{cssClasses}}">
|
||||
<a href="{{relativeURL url}}"><em>{{{wbr title}}}</em></a>
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="{{#if isInPath}}current{{/if}} {{cssClasses}}">
|
||||
<a href="{{relativeURL url}}">{{{wbr title}}}</a>
|
||||
{{#if isInPath}}
|
||||
{{#if children}}
|
||||
<ul>
|
||||
{{#each children}}
|
||||
{{> navigation}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/if}}
|
83
Assets/PluginDocTheme/partials/parameter.hbs
Normal file
@@ -0,0 +1,83 @@
|
||||
<ul class="tsd-parameters">
|
||||
{{#if signatures}}
|
||||
<li class="tsd-parameter-signature">
|
||||
<ul class="tsd-signatures {{cssClasses}}">
|
||||
{{#each signatures}}
|
||||
<li class="tsd-signature tsd-kind-icon">{{#compact}}
|
||||
{{> member.signature.title hideName=true }}
|
||||
{{/compact}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
|
||||
<ul class="tsd-descriptions">
|
||||
{{#each signatures}}
|
||||
<li class="tsd-description">{{> member.signature.body hideSources=true }}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{#if indexSignature}}
|
||||
<li class="tsd-parameter-index-signature">
|
||||
<h5>{{#compact}}
|
||||
<span class="tsd-signature-symbol">[</span>
|
||||
{{#each indexSignature.parameters}}
|
||||
{{#if flags.isRest}}<span class="tsd-signature-symbol">...</span>{{/if}}{{name}}: {{#with type}}{{>type}}{{/with}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol">]: </span>
|
||||
{{#with indexSignature.type}}{{>type}}{{/with}}
|
||||
{{/compact}}</h5>
|
||||
|
||||
{{#with indexSignature}}
|
||||
{{> comment}}
|
||||
{{/with}}
|
||||
|
||||
{{#if indexSignature.type.declaration}}
|
||||
{{#with indexSignature.type.declaration}}
|
||||
{{> parameter}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{#each children}}
|
||||
<li class="tsd-parameter">
|
||||
{{#if signatures}}
|
||||
<h5>{{#compact}}
|
||||
{{#if flags.isRest}}<span class="tsd-signature-symbol">...</span>{{/if}}
|
||||
{{{wbr name}}}
|
||||
<span class="tsd-signature-symbol">
|
||||
{{#if isOptional}}?{{/if}}
|
||||
:
|
||||
</span>
|
||||
function
|
||||
{{/compact}}</h5>
|
||||
|
||||
{{> member.signatures}}
|
||||
{{else}}
|
||||
<h5>{{#compact}}
|
||||
{{#each flags}}
|
||||
<span class="tsd-flag ts-flag{{this}}">{{this}}</span>
|
||||
{{/each}}
|
||||
{{#if flags.isRest}}<span class="tsd-signature-symbol">...</span>{{/if}}
|
||||
{{{wbr name}}}
|
||||
<span class="tsd-signature-symbol">
|
||||
{{#if flags.isOptional}}?{{/if}}
|
||||
:
|
||||
</span>
|
||||
{{#with type}}{{>type}}{{/with}}
|
||||
{{/compact}}</h5>
|
||||
|
||||
{{> comment}}
|
||||
|
||||
{{#if children}}
|
||||
{{> parameter}}
|
||||
{{/if}}
|
||||
|
||||
{{#if type.declaration}}
|
||||
{{#with type.declaration}}
|
||||
{{> parameter}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
10
Assets/PluginDocTheme/partials/toc.hbs
Normal file
@@ -0,0 +1,10 @@
|
||||
<li class="{{#if isInPath}}current{{/if}} {{cssClasses}}">
|
||||
<a href="{{relativeURL url}}" class="tsd-kind-icon">{{{wbr title}}}</a>
|
||||
{{#if children}}
|
||||
<ul>
|
||||
{{#each children}}
|
||||
{{> toc}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
</li>
|
21
Assets/PluginDocTheme/partials/toc.root.hbs
Normal file
@@ -0,0 +1,21 @@
|
||||
{{#if isInPath}}
|
||||
</ul>
|
||||
<ul class="current">
|
||||
{{/if}}
|
||||
|
||||
{{#if (jsIsNotKindVariable cssClasses)}}
|
||||
<li class="{{#if isInPath}}current{{/if}} {{cssClasses}}">
|
||||
<a href="{{relativeURL url}}" class="tsd-kind-icon">{{{jpFormatClassName title}}}</a>
|
||||
{{#if children}}
|
||||
<ul>
|
||||
{{#each children}}
|
||||
{{> toc}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{#if isInPath}}
|
||||
</ul>
|
||||
<ul class="after-current">
|
||||
{{/if}}
|
||||
{{/if}}
|
211
Assets/PluginDocTheme/partials/type.hbs
Normal file
@@ -0,0 +1,211 @@
|
||||
{{! Each type gets its own inline helper to determine how it is rendered. }}
|
||||
{{! The name of the helper is the value of the 'type' property on the type.}}
|
||||
|
||||
{{!
|
||||
The type helper accepts an optional needsParens parameter that is checked
|
||||
if an inner type may result in invalid output without them. For example:
|
||||
1 | 2[] !== (1 | 2)[]
|
||||
() => 1 | 2 !== (() => 1) | 2
|
||||
}}
|
||||
|
||||
{{#*inline 'array'}}
|
||||
{{#with elementType}}
|
||||
{{> type needsParens=true}}
|
||||
<span class="tsd-signature-symbol">[]</span>
|
||||
{{/with}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'conditional'}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">(</span>
|
||||
{{/if}}
|
||||
{{#with checkType}}
|
||||
{{> type needsParens=true}}
|
||||
{{/with}}
|
||||
<span class="tsd-signature-symbol"> extends </span>
|
||||
{{#with extendsType}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
<span class="tsd-signature-symbol"> ? </span>
|
||||
{{#with trueType}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
<span class="tsd-signature-symbol"> : </span>
|
||||
{{#with falseType}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">)</span>
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'indexedAccess'}}
|
||||
{{#with objectType}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
<span class="tsd-signature-symbol">[</span>
|
||||
{{#with indexType}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
<span class="tsd-signature-symbol">]</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'inferred'}}
|
||||
<span class="tsd-signature-symbol">infer </span> {{name}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'intersection'}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">(</span>
|
||||
{{/if}}
|
||||
{{#each types}}
|
||||
{{#unless @first}}
|
||||
<span class="tsd-signature-symbol"> & </span>
|
||||
{{/unless}}
|
||||
{{> type}}
|
||||
{{/each}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">)</span>
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'intrinsic'}}
|
||||
<span class="tsd-signature-type">{{name}}</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'predicate'}}
|
||||
{{#if asserts}}
|
||||
<span class="tsd-signature-symbol">asserts</span>
|
||||
{{/if}}
|
||||
<span class="tsd-signature-type">{{name}}</span>
|
||||
{{#if targetType}}
|
||||
<span class="tsd-signature-symbol"> is </span>
|
||||
{{#with targetType}}
|
||||
{{>type}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'query'}}
|
||||
<span class="tsd-signature-symbol">typeof </span>
|
||||
{{#with queryType}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'reference'}}
|
||||
{{#if reflection}}
|
||||
<a href="{{relativeURL reflection.url}}" class="tsd-signature-type">
|
||||
{{jpFormatClassName reflection.name}}
|
||||
</a>
|
||||
{{else}}
|
||||
<span class="tsd-signature-type">{{jpFormatClassName name}}</span>
|
||||
{{/if}}
|
||||
{{#if typeArguments}}
|
||||
<span class="tsd-signature-symbol"><</span>
|
||||
{{#each typeArguments}}
|
||||
{{#unless @first}}
|
||||
<span class="tsd-signature-symbol">, </span>
|
||||
{{/unless}}
|
||||
{{> type}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol">></span>
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'reflection'}}
|
||||
{{#if declaration.children}} {{! object literal }}
|
||||
<span class="tsd-signature-symbol">{ </span>
|
||||
{{#each declaration.children}}
|
||||
{{#unless @first}}
|
||||
<span class="tsd-signature-symbol">; </span>
|
||||
{{/unless}}
|
||||
{{name}}
|
||||
{{#if flags.isOptional }}
|
||||
<span class="tsd-signature-symbol">?: </span>
|
||||
{{else}}
|
||||
<span class="tsd-signature-symbol">: </span>
|
||||
{{/if}}
|
||||
{{#with type}}
|
||||
{{> type}}
|
||||
{{else}}
|
||||
<span class="tsd-signature-type">any</span>
|
||||
{{/with}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol"> }</span>
|
||||
{{else if declaration.signatures}}
|
||||
{{#if (lookup declaration.signatures 1) }} {{! more than one signature}}
|
||||
<span class="tsd-signature-symbol">{ </span>
|
||||
{{#each declaration.signatures}}
|
||||
{{> member.signature.title hideName=true}}
|
||||
{{#unless @last}}
|
||||
<span class="tsd-signature-symbol">; </span>
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol"> }</span>
|
||||
{{else}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">(</span>
|
||||
{{/if}}
|
||||
{{#with (lookup declaration.signatures '0') }}
|
||||
{{> member.signature.title hideName=true arrowStyle=true}}
|
||||
{{/with}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">)</span>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<span class="tsd-signature-symbol">{}</span>
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'stringLiteral'}}
|
||||
<span class="tsd-signature-type">"{{value}}"</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'tuple'}}
|
||||
<span class="tsd-signature-symbol">[</span>
|
||||
{{#each elements}}
|
||||
{{#unless @first}}
|
||||
<span class="tsd-signature-symbol">, </span>
|
||||
{{/unless}}
|
||||
{{> type}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol">]</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'typeOperator'}}
|
||||
<span class="tsd-signature-symbol">{{operator}} </span>
|
||||
{{#with target}}
|
||||
{{> type}}
|
||||
{{/with}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'typeParameter'}}
|
||||
<span class="tsd-signature-type">{{name}}</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'union'}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">(</span>
|
||||
{{/if}}
|
||||
{{#each types}}
|
||||
{{#unless @first}}
|
||||
<span class="tsd-signature-symbol"> | </span>
|
||||
{{/unless}}
|
||||
{{> type needsParens=true}}
|
||||
{{/each}}
|
||||
{{#if needsParens}}
|
||||
<span class="tsd-signature-symbol">)</span>
|
||||
{{/if}}
|
||||
{{/inline}}
|
||||
|
||||
{{#*inline 'unknown'}}
|
||||
<span class="tsd-signature-type">{{name}}</span>
|
||||
{{/inline}}
|
||||
|
||||
{{#if this}}
|
||||
{{> (lookup . 'type') }}
|
||||
{{else}}
|
||||
<span class="tsd-signature-type">void</span>
|
||||
{{/if}}
|
42
Assets/PluginDocTheme/partials/typeAndParent.hbs
Normal file
@@ -0,0 +1,42 @@
|
||||
{{#compact}}
|
||||
{{#if this}}
|
||||
{{#if elementType}}
|
||||
{{#with elementType}}
|
||||
{{> typeAndParent}}
|
||||
{{/with}}
|
||||
[]
|
||||
{{else}}
|
||||
{{#if reflection}}
|
||||
{{#ifSignature reflection}}
|
||||
{{#if reflection.parent.parent.url}}
|
||||
<a href="{{relativeURL reflection.parent.parent.url}}">{{reflection.parent.parent.name}}</a>
|
||||
{{else}}
|
||||
{{reflection.parent.parent.name}}
|
||||
{{/if}}
|
||||
.
|
||||
{{#if reflection.parent.url}}
|
||||
<a href="{{relativeURL reflection.parent.url}}">{{reflection.parent.name}}</a>
|
||||
{{else}}
|
||||
{{reflection.parent.name}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{#if reflection.parent.url}}
|
||||
<a href="{{relativeURL reflection.parent.url}}">{{reflection.parent.name}}</a>
|
||||
{{else}}
|
||||
{{reflection.parent.name}}
|
||||
{{/if}}
|
||||
.
|
||||
{{#if reflection.url}}
|
||||
<a href="{{relativeURL reflection.url}}">{{reflection.name}}</a>
|
||||
{{else}}
|
||||
{{reflection.name}}
|
||||
{{/if}}
|
||||
{{/ifSignature}}
|
||||
{{else}}
|
||||
{{this}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
void
|
||||
{{/if}}
|
||||
{{/compact}}
|
14
Assets/PluginDocTheme/partials/typeParameters.hbs
Normal file
@@ -0,0 +1,14 @@
|
||||
<ul class="tsd-type-parameters">
|
||||
{{#each typeParameters}}
|
||||
<li>
|
||||
<h4>{{#compact}}
|
||||
{{name}}
|
||||
{{#if type}}
|
||||
<span class="tsd-signature-symbol">: </span>
|
||||
{{#with type}}{{> type}}{{/with}}
|
||||
{{/if}}
|
||||
{{/compact}}</h4>
|
||||
{{> comment}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
3
Assets/PluginDocTheme/templates/index.hbs
Normal file
@@ -0,0 +1,3 @@
|
||||
<div class="tsd-panel tsd-typography">
|
||||
{{#markdown}}{{{model.readme}}}{{/markdown}}
|
||||
</div>
|
81
Assets/PluginDocTheme/templates/reflection.hbs
Normal file
@@ -0,0 +1,81 @@
|
||||
{{#with model}}
|
||||
{{#if hasComment}}
|
||||
<section class="tsd-panel tsd-comment">
|
||||
{{> comment}}
|
||||
</section>
|
||||
{{/if}}
|
||||
{{/with}}
|
||||
|
||||
{{#if model.typeParameters}}
|
||||
<section class="tsd-panel tsd-type-parameters">
|
||||
<h3>Type parameters</h3>
|
||||
{{#with model}}{{> typeParameters}}{{/with}}
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if model.typeHierarchy}}
|
||||
<!--
|
||||
<section class="tsd-panel tsd-hierarchy">
|
||||
<h3>Hierarchy</h3>
|
||||
{{#with model.typeHierarchy}}{{> hierarchy}}{{/with}}
|
||||
</section>
|
||||
-->
|
||||
{{/if}}
|
||||
|
||||
{{#if model.implementedTypes}}
|
||||
<section class="tsd-panel">
|
||||
<h3>Implements</h3>
|
||||
<ul class="tsd-hierarchy">
|
||||
{{#each model.implementedTypes}}
|
||||
<li>{{#compact}}{{> type}}{{/compact}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if model.implementedBy}}
|
||||
<section class="tsd-panel">
|
||||
<h3>Implemented by</h3>
|
||||
<ul class="tsd-hierarchy">
|
||||
{{#each model.implementedBy}}
|
||||
<li>{{#compact}}{{> type}}{{/compact}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if model.signatures}}
|
||||
<section class="tsd-panel">
|
||||
<h3 class="tsd-before-signature">Callable</h3>
|
||||
{{#with model}}{{> member.signatures}}{{/with}}
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#if model.indexSignature}}
|
||||
<section class="tsd-panel {{model.cssClasses}}">
|
||||
<h3 class="tsd-before-signature">Indexable</h3>
|
||||
<div class="tsd-signature tsd-kind-icon">{{#compact}}
|
||||
<span class="tsd-signature-symbol">[</span>
|
||||
{{#each model.indexSignature.parameters}}
|
||||
{{name}}: {{#with type}}{{>type}}{{/with}}
|
||||
{{/each}}
|
||||
<span class="tsd-signature-symbol">]: </span>
|
||||
{{#with model.indexSignature.type}}{{>type}}{{/with}}
|
||||
{{/compact}}</div>
|
||||
|
||||
{{#with model.indexSignature}}
|
||||
{{> comment}}
|
||||
{{/with}}
|
||||
|
||||
{{#if model.indexSignature.type.declaration}}
|
||||
{{#with model.indexSignature.type.declaration}}
|
||||
{{> parameter}}
|
||||
{{/with}}
|
||||
{{/if}}
|
||||
</section>
|
||||
{{/if}}
|
||||
|
||||
{{#with model}}
|
||||
{{> index}}
|
||||
{{> members}}
|
||||
{{/with}}
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 48 KiB |
109
Assets/SmallTile.svg
Normal file
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="disegno.svg"
|
||||
inkscape:version="1.0rc1 (09960d6, 2020-04-09)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 70 70"
|
||||
height="70"
|
||||
width="70">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="775"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:guide-bbox="true"
|
||||
showguides="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:showpageshadow="false"
|
||||
showborder="true"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cy="39.253064"
|
||||
inkscape:cx="25.246811"
|
||||
inkscape:zoom="5.8562241"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
units="px">
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1932"
|
||||
orientation="-1,0"
|
||||
position="12,70" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1934"
|
||||
orientation="-1,0"
|
||||
position="58,70" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1936"
|
||||
orientation="0,1"
|
||||
position="0,58" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1938"
|
||||
orientation="0,1"
|
||||
position="0,12" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide2021"
|
||||
orientation="-1,0"
|
||||
position="35,70" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Livello 1">
|
||||
<path
|
||||
inkscape:transform-center-y="23.027731"
|
||||
inkscape:transform-center-x="-17.510929"
|
||||
id="path30"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.133334;stop-opacity:1"
|
||||
d="M 52.1731,12 H 35.107236 c -0.161294,0 -0.291666,0.130494 -0.291666,0.291543 v 5.419239 c 0,0.182381 0.147678,0.330176 0.330178,0.330176 h 2.339824 c 0.94638,0 1.713811,0.727936 1.795988,1.652976 v 3.715485 2.069989 19.715998 0.139708 h -6.44e-4 c 0.0058,0.206545 -0.0023,0.409658 -0.02244,0.609702 -0.0023,0.02918 -0.0062,0.05801 -0.0097,0.08697 -0.01349,0.116897 -0.02846,0.233161 -0.05114,0.346981 -0.01243,0.06489 -0.02993,0.128044 -0.0455,0.191949 -0.02097,0.08499 -0.0379,0.171342 -0.06401,0.254505 -0.1543,0.493916 -0.39825,0.95202 -0.735666,1.355297 -0.01243,0.01438 -0.02771,0.02761 -0.03998,0.04182 -0.102908,0.119222 -0.210962,0.235367 -0.330548,0.34416 -0.120695,0.109778 -0.248492,0.211819 -0.382795,0.306628 -0.954719,0.676302 -2.23974,0.973854 -3.6755,0.836485 -1.830697,-0.172088 -3.646921,-1.002309 -5.114939,-2.337984 -1.467772,-1.335554 -2.380422,-2.988039 -2.569305,-4.653525 -0.169868,-1.489971 0.276578,-2.801116 1.256197,-3.692426 0.0027,-0.0019 0.005,-0.0037 0.0069,-0.0058 0.0379,-0.03398 0.0796,-0.06379 0.1186,-0.09654 0.701076,-0.58738 1.614951,-0.943313 2.657858,-1.041435 0.01172,-0.0011 0.02306,-0.003 0.03423,-0.0039 0.109777,-0.0097 0.221631,-0.01402 0.334471,-0.01827 0.05899,-0.0019 0.117251,-0.0062 0.177111,-0.0065 0.01986,-2.76e-4 0.03875,-0.0023 0.05864,-0.0023 0.03557,0 0.07248,0.0046 0.108055,0.0051 0.164347,0.0027 0.329933,0.0094 0.498825,0.02379 0.02134,0.0017 0.0417,9.78e-4 0.06365,0.003 0.01562,0.0016 0.03103,0.005 0.04662,0.0065 0.956682,0.09592 1.90392,0.381568 2.802834,0.814406 0.01876,8.39e-4 0.04047,0.0065 0.06759,0.02159 0.274004,0.151353 0.326498,-0.01101 0.334593,-0.118351 v -4.688237 -3.46883 c 0,-0.233653 -0.162519,-0.440321 -0.3904,-0.490484 -4.841795,-1.065597 -9.592336,0.04355 -12.944402,3.09499 -2.928307,2.663747 -4.344811,6.507647 -3.885849,10.545461 0.409535,3.596512 2.255685,7.05173 5.198956,9.730318 2.868698,2.609903 6.521262,4.242028 10.288996,4.596993 0.519184,0.04805 1.040822,0.07283 1.549826,0.07283 3.598351,0 6.937296,-1.233851 9.401735,-3.475688 2.33455,-2.125552 3.732902,-5.044294 3.938097,-8.219619 l 0.01901,-20.825138 h 0.0021 V 19.91155 h 7.7e-4 v -0.09714 c 0.02109,-0.982682 0.822378,-1.773296 1.81046,-1.773296 h 2.339824 c 0.182259,0 0.330177,-0.147802 0.330177,-0.330177 v -5.419299 c -2.1e-5,-0.161046 -0.130406,-0.291543 -0.291686,-0.291543"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<inkscape:templateinfo>
|
||||
<inkscape:name>SmallTile</inkscape:name>
|
||||
<inkscape:shortdesc>Small tile</inkscape:shortdesc>
|
||||
<inkscape:date>2020-04-15</inkscape:date>
|
||||
</inkscape:templateinfo>
|
||||
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
109
Assets/Square150x150Logo.svg
Normal file
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="disegno-1.svg"
|
||||
inkscape:version="1.0rc1 (09960d6, 2020-04-09)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 150 150"
|
||||
height="150"
|
||||
width="150">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="775"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:guide-bbox="true"
|
||||
showguides="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:showpageshadow="false"
|
||||
showborder="true"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cy="79.075594"
|
||||
inkscape:cx="91.835957"
|
||||
inkscape:zoom="3.1892627"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
units="px">
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1919"
|
||||
orientation="0,1"
|
||||
position="0,115" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1921"
|
||||
orientation="-1,0"
|
||||
position="25,150" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1923"
|
||||
orientation="-1,0"
|
||||
position="125,150" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1925"
|
||||
orientation="0,1"
|
||||
position="0,35" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide2879"
|
||||
orientation="-1,0"
|
||||
position="75,150" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Livello 1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 105.30102,35.000001 H 75.621261 c -0.280511,0 -0.507245,0.226946 -0.507245,0.507031 v 9.424762 c 0,0.317185 0.256831,0.574219 0.574223,0.574219 h 4.069258 c 1.645878,0 2.980541,1.265976 3.123457,2.874741 v 6.461712 3.599981 34.288687 0.24297 h -0.0011 c 0.01009,0.359209 -0.004,0.712449 -0.03903,1.060352 -0.004,0.05075 -0.01078,0.100887 -0.01687,0.151252 -0.02346,0.203299 -0.0495,0.405497 -0.08894,0.603445 -0.02162,0.112852 -0.05205,0.222685 -0.07913,0.333824 -0.03647,0.147809 -0.06591,0.297986 -0.111322,0.442618 -0.268348,0.858984 -0.692608,1.655686 -1.279419,2.357038 -0.02162,0.02501 -0.04819,0.04802 -0.06953,0.07273 -0.178971,0.207343 -0.366891,0.409334 -0.574866,0.598539 -0.209904,0.190918 -0.43216,0.368381 -0.66573,0.533266 -1.660381,1.176182 -3.8952,1.693662 -6.392174,1.454752 -3.18382,-0.29928 -6.34247,-1.743142 -8.895544,-4.066054 -2.552647,-2.322703 -4.139864,-5.196589 -4.468356,-8.093086 -0.295423,-2.591254 0.481005,-4.871506 2.18469,-6.42161 0.0047,-0.0033 0.0087,-0.0064 0.012,-0.01009 0.06591,-0.05909 0.138435,-0.110939 0.206261,-0.167895 1.219262,-1.021531 2.80861,-1.640544 4.622361,-1.811191 0.02038,-0.0019 0.0401,-0.0052 0.05953,-0.0068 0.190917,-0.01687 0.385445,-0.02438 0.581689,-0.03177 0.102591,-0.0033 0.203915,-0.01078 0.308019,-0.0113 0.03454,-4.8e-4 0.06739,-0.004 0.101982,-0.004 0.06186,0 0.126053,0.008 0.187922,0.0089 0.285821,0.0047 0.573797,0.01635 0.867522,0.04137 0.03711,0.003 0.07252,0.0017 0.110695,0.0052 0.02717,0.0028 0.05397,0.0087 0.08108,0.0113 1.663794,0.166817 3.311164,0.663596 4.874493,1.416358 0.03263,0.0015 0.07038,0.0113 0.117548,0.03755 0.476528,0.263222 0.567822,-0.01915 0.581901,-0.205828 V 73.11952 67.086773 c 0,-0.406353 -0.282642,-0.765776 -0.678957,-0.853016 -8.420512,-1.853212 -16.682323,0.07574 -22.512002,5.382591 -5.092707,4.632602 -7.556192,11.317645 -6.757997,18.339929 0.712234,6.254803 3.92293,12.263883 9.041661,16.922293 4.989039,4.53896 11.341325,7.37744 17.893905,7.99477 0.902929,0.0836 1.810125,0.12666 2.69535,0.12666 6.258001,0 12.064861,-2.14583 16.350841,-6.04467 4.060086,-3.69661 6.492006,-8.77269 6.848866,-14.294994 l 0.0331,-36.217627 h 0.004 v -9.683497 h 10e-4 v -0.16894 c 0.0367,-1.709012 1.43023,-3.083992 3.148627,-3.083992 h 4.06926 c 0.31697,0 0.57422,-0.257047 0.57422,-0.574221 v -9.424867 c -4e-5,-0.28008 -0.22679,-0.507031 -0.50728,-0.507031"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.133334;stop-opacity:1"
|
||||
id="path30"
|
||||
inkscape:transform-center-x="-30.453831"
|
||||
inkscape:transform-center-y="40.048222" />
|
||||
</g>
|
||||
<inkscape:templateinfo>
|
||||
<inkscape:name>Square150x150Logo</inkscape:name>
|
||||
<inkscape:shortdesc>Medium tile</inkscape:shortdesc>
|
||||
<inkscape:date>2020-04-15</inkscape:date>
|
||||
</inkscape:templateinfo>
|
||||
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
2
Assets/TinyMCE/IconPack/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
node_modules
|
||||
dist
|
BIN
Assets/TinyMCE/IconPack/IconDimensions.png
Normal file
After Width: | Height: | Size: 97 KiB |
19
Assets/TinyMCE/IconPack/README.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Joplin TinyMCE Icon Pack
|
||||
|
||||
Created from template: https://raw.githubusercontent.com/tinymce/oxide-icon-pack-template
|
||||
|
||||
## Adding an icon
|
||||
|
||||
- Get it from [Fork Awesome](https://forkaweso.me/)
|
||||
- Using https://vectr.com/Resize Resize vector graphics to between 15x15 to 20x20 max. Set page dimensions to 24x24 pixels
|
||||
- Save to src/svg
|
||||
|
||||

|
||||
|
||||
## Building
|
||||
|
||||
Open a terminal and navigate to the project folder, then
|
||||
|
||||
1. Install dependencies using `npm install`.
|
||||
2. Place your icons in `src/svg`
|
||||
3. Run `gulp` to build the icon pack
|
27
Assets/TinyMCE/IconPack/gulpfile.js
Normal file
@@ -0,0 +1,27 @@
|
||||
const iconPackager = require('@ephox/oxide-icons-tools').iconPackager;
|
||||
const clean = require('gulp-clean');
|
||||
const gulp = require('gulp');
|
||||
const fs = require('fs');
|
||||
|
||||
gulp.task('icon-packager', function() {
|
||||
const contents = fs.readFileSync('package.json');
|
||||
const name = JSON.parse(contents).iconPackName;
|
||||
|
||||
return gulp.src('src/svg/**/*.svg')
|
||||
.pipe(iconPackager({ name }))
|
||||
.pipe(gulp.dest('dist'));
|
||||
});
|
||||
|
||||
gulp.task('deploy', function() {
|
||||
fs.copyFileSync(`${__dirname}/dist/icons/Joplin/icons.js`, `${__dirname}/../../../packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/icons.js`);
|
||||
return Promise.resolve();
|
||||
});
|
||||
|
||||
gulp.task('clean', function() {
|
||||
return gulp.src('./dist', {
|
||||
read: false,
|
||||
allowEmpty: true,
|
||||
}).pipe(clean());
|
||||
});
|
||||
|
||||
gulp.task('default', gulp.series('clean', 'icon-packager', 'deploy'));
|
4116
Assets/TinyMCE/IconPack/package-lock.json
generated
Normal file
18
Assets/TinyMCE/IconPack/package.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "oxide-icon-pack-template",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"postinstall": "node postinstall.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@ephox/oxide-icons-tools": "^2.1.1",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-clean": "^0.4.0",
|
||||
"prompts": "^2.2.1"
|
||||
},
|
||||
"iconPackName": "Joplin"
|
||||
}
|
20
Assets/TinyMCE/IconPack/postinstall.js
Normal file
@@ -0,0 +1,20 @@
|
||||
const prompts = require('prompts');
|
||||
const fs = require('fs');
|
||||
|
||||
(async function() {
|
||||
const response = await prompts({
|
||||
type: 'text',
|
||||
name: 'iconPackName',
|
||||
message: 'Enter the name of the icon pack.',
|
||||
validate: function(iconPackName) { return iconPackName.length > 0; },
|
||||
});
|
||||
|
||||
try {
|
||||
const contents = fs.readFileSync('package.json');
|
||||
obj = JSON.parse(contents);
|
||||
obj.iconPackName = response.iconPackName;
|
||||
fs.writeFileSync('package.json', JSON.stringify(obj, undefined, 2));
|
||||
} catch (err) {
|
||||
console.error(err.message);
|
||||
}
|
||||
})();
|
3
Assets/TinyMCE/IconPack/src/svg/paperclip.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" width="24" height="24"><defs><path d="M17.53 21.82C16.44 21.82 15.38 21.35 14.61 20.58C13.64 19.61 5.91 11.89 4.95 10.93C4.07 10.03 3.54 8.82 3.54 7.56C3.54 4.92 5.62 2.82 8.26 2.82C9.52 2.82 10.74 3.33 11.65 4.23C12.4 4.98 18.42 11.01 19.18 11.76C19.25 11.84 19.3 11.94 19.3 12.04C19.3 12.3 18.6 12.99 18.34 12.99C18.23 12.99 18.13 12.94 18.06 12.87C17.3 12.11 11.27 6.08 10.52 5.32C9.92 4.74 9.11 4.36 8.27 4.36C6.5 4.36 5.14 5.79 5.14 7.55C5.14 8.39 5.48 9.2 6.08 9.8C7.05 10.76 14.77 18.49 15.73 19.46C16.2 19.93 16.86 20.24 17.53 20.24C18.59 20.24 19.37 19.46 19.37 18.4C19.37 17.72 19.06 17.07 18.59 16.6C17.87 15.88 12.09 10.1 11.37 9.38C11.17 9.19 10.89 9.08 10.62 9.08C10.15 9.08 9.79 9.42 9.79 9.91C9.79 10.18 9.91 10.44 10.1 10.64C10.61 11.15 14.69 15.23 15.2 15.74C15.27 15.82 15.32 15.92 15.32 16.02C15.32 16.28 14.61 16.99 14.35 16.99C14.25 16.99 14.15 16.94 14.08 16.86C13.57 16.35 9.49 12.27 8.98 11.76C8.48 11.28 8.19 10.59 8.19 9.91C8.19 8.54 9.26 7.47 10.63 7.47C11.33 7.47 12 7.76 12.48 8.26C13.21 8.98 18.99 14.76 19.71 15.48C20.49 16.25 20.95 17.31 20.95 18.4C20.95 20.34 19.47 21.82 17.53 21.82Z" id="a3MUovWvUV"></path></defs><g><g><g><use xlink:href="#a3MUovWvUV" opacity="1" fill="#000000" fill-opacity="1"></use><g><use xlink:href="#a3MUovWvUV" opacity="1" fill-opacity="0" stroke="#000000" stroke-width="1" stroke-opacity="0"></use></g></g></g></g></svg>
|
After Width: | Height: | Size: 1.6 KiB |
14
Assets/TinyMCE/JoplinLists/.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
.DS_Store
|
||||
*~
|
||||
*.iws
|
||||
*.sublime-workspace
|
||||
.cache
|
||||
/lib
|
||||
/dist
|
||||
/scratch
|
||||
node_modules
|
||||
/config/repl
|
||||
/*.log
|
||||
ephox-*.tgz
|
||||
package-lock.json
|
||||
jenkins-plumbing
|
196
Assets/TinyMCE/JoplinLists/Gruntfile.js
Normal file
@@ -0,0 +1,196 @@
|
||||
const { CheckerPlugin } = require('awesome-typescript-loader');
|
||||
const LiveReloadPlugin = require('webpack-livereload-plugin');
|
||||
const path = require('path');
|
||||
const swag = require('@ephox/swag');
|
||||
|
||||
module.exports = function(grunt) {
|
||||
const packageData = grunt.file.readJSON('package.json');
|
||||
const BUILD_VERSION = `${packageData.version}-${process.env.BUILD_NUMBER ? process.env.BUILD_NUMBER : '0'}`;
|
||||
const libPluginPath = 'lib/Main.js';
|
||||
const scratchPluginPath = 'scratch/compiled/joplinLists.js';
|
||||
const scratchPluginMinPath = 'scratch/compiled/joplinLists.min.js';
|
||||
const tsDemoSourceFile = path.resolve('src/demo/ts/Demo.ts');
|
||||
const jsDemoDestFile = path.resolve('scratch/compiled/demo.js');
|
||||
|
||||
grunt.initConfig({
|
||||
pkg: packageData,
|
||||
|
||||
clean: {
|
||||
dirs: ['dist', 'scratch'],
|
||||
},
|
||||
|
||||
// tslint: {
|
||||
// options: {
|
||||
// configuration: 'tslint.json'
|
||||
// },
|
||||
// plugin: ['src/**/*.ts']
|
||||
// },
|
||||
|
||||
shell: {
|
||||
command: 'tsc --project tsconfig.json',
|
||||
},
|
||||
|
||||
rollup: {
|
||||
options: {
|
||||
treeshake: true,
|
||||
external: [
|
||||
'tinymce/core/api/PluginManager',
|
||||
'tinymce/core/api/util/Tools',
|
||||
'tinymce/core/api/dom/BookmarkManager',
|
||||
'tinymce/core/api/Editor',
|
||||
'tinymce/core/api/dom/DOMUtils',
|
||||
'tinymce/core/api/dom/RangeUtils',
|
||||
'tinymce/core/api/dom/TreeWalker',
|
||||
'tinymce/core/api/util/VK',
|
||||
'tinymce/core/api/dom/DomQuery',
|
||||
],
|
||||
globals: {
|
||||
'tinymce/core/api/PluginManager': 'tinymce.PluginManager',
|
||||
'tinymce/core/api/util/Tools': 'tinymce.util.Tools',
|
||||
'tinymce/core/api/dom/BookmarkManager': 'tinymce.dom.BookmarkManager',
|
||||
'tinymce/core/api/Editor': 'tinymce.Editor',
|
||||
'tinymce/core/api/dom/DOMUtils': 'tinymce.dom.DOMUtils',
|
||||
'tinymce/core/api/dom/RangeUtils': 'tinymce.dom.RangeUtils',
|
||||
'tinymce/core/api/dom/TreeWalker': 'tinymce.dom.TreeWalker',
|
||||
'tinymce/core/api/util/VK': 'tinymce.util.VK',
|
||||
'tinymce/core/api/dom/DomQuery': 'tinymce.dom.DomQuery',
|
||||
},
|
||||
format: 'iife',
|
||||
onwarn: swag.onwarn,
|
||||
plugins: [
|
||||
swag.nodeResolve({
|
||||
basedir: __dirname,
|
||||
prefixes: {},
|
||||
}),
|
||||
swag.remapImports(),
|
||||
],
|
||||
},
|
||||
plugin: {
|
||||
files: [
|
||||
{
|
||||
src: libPluginPath,
|
||||
dest: scratchPluginPath,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
uglify: {
|
||||
plugin: {
|
||||
files: [
|
||||
{
|
||||
src: scratchPluginPath,
|
||||
dest: scratchPluginMinPath,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
concat: {
|
||||
license: {
|
||||
options: {
|
||||
process: function(src) {
|
||||
const buildSuffix = process.env.BUILD_NUMBER
|
||||
? `-${process.env.BUILD_NUMBER}`
|
||||
: '';
|
||||
return src.replace(
|
||||
/@BUILD_NUMBER@/g,
|
||||
packageData.version + buildSuffix
|
||||
);
|
||||
},
|
||||
},
|
||||
// scratchPluginMinPath is used twice on purpose, all outputs will be minified for premium plugins
|
||||
files: {
|
||||
'dist/joplinLists.js': [
|
||||
'src/text/license-header.js',
|
||||
scratchPluginPath,
|
||||
],
|
||||
'dist/joplinLists.min.js': [
|
||||
'src/text/license-header.js',
|
||||
scratchPluginMinPath,
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
copy: {
|
||||
css: {
|
||||
files: [
|
||||
// {
|
||||
// cwd: 'src/text',
|
||||
// src: ['license.txt'],
|
||||
// dest: 'dist',
|
||||
// expand: true,
|
||||
// },
|
||||
// { src: ['changelog.txt'], dest: 'dist', expand: true },
|
||||
{
|
||||
src: ['dist/joplinLists.js'],
|
||||
dest: '../../../packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
webpack: {
|
||||
options: {
|
||||
mode: 'development',
|
||||
watch: true,
|
||||
},
|
||||
dev: {
|
||||
entry: tsDemoSourceFile,
|
||||
devtool: 'source-map',
|
||||
|
||||
resolve: {
|
||||
extensions: ['.ts', '.js'],
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$/,
|
||||
use: ['source-map-loader'],
|
||||
enforce: 'pre',
|
||||
},
|
||||
{
|
||||
test: /\.ts$/,
|
||||
use: [
|
||||
{
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
transpileOnly: true,
|
||||
experimentalWatchApi: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [new LiveReloadPlugin(), new CheckerPlugin()],
|
||||
|
||||
output: {
|
||||
filename: path.basename(jsDemoDestFile),
|
||||
path: path.dirname(jsDemoDestFile),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
require('load-grunt-tasks')(grunt);
|
||||
grunt.loadNpmTasks('@ephox/swag');
|
||||
|
||||
// grunt.registerTask('version', 'Creates a version file', function() {
|
||||
// grunt.file.write('dist/version.txt', BUILD_VERSION);
|
||||
// });
|
||||
|
||||
grunt.registerTask('default', [
|
||||
'clean',
|
||||
// 'tslint',
|
||||
'shell',
|
||||
'rollup',
|
||||
'uglify',
|
||||
'concat',
|
||||
'copy',
|
||||
// 'version',
|
||||
]);
|
||||
};
|
502
Assets/TinyMCE/JoplinLists/LICENSE.txt
Normal file
@@ -0,0 +1,502 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
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 and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, 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 library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete 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 distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
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 Library or any portion
|
||||
of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
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 Library, 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 Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you 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.
|
||||
|
||||
If distribution of 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 satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be 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.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library 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.
|
||||
|
||||
9. 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 Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
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 with
|
||||
this License.
|
||||
|
||||
11. 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 Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library 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 Library.
|
||||
|
||||
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.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library 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.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser 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 Library
|
||||
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 Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
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
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "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
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. 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 LIBRARY 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
|
||||
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
13
Assets/TinyMCE/JoplinLists/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# TinyMCE Joplin Lists Plugin
|
||||
|
||||
**As of 2020-11-02 this module no longer builds (a ton of TypeScript errors). No idea why since nothing was changed but should be investigated if modifying this plugin is ever needed.**
|
||||
|
||||
This is based on https://github.com/tinymce/tinymce/tree/59748a11303fb7cf00fdb8c9392dcb082ee9d965/modules/tinymce/src/plugins/lists
|
||||
|
||||
But with support for Joplin checkboxes.
|
||||
|
||||
## Building
|
||||
|
||||
Use `npm i && npm run build` to build the plugin, which will also copy the compiled version to the right packages/app-desktop sub-directory.
|
||||
|
||||
To test the plugin, use `npm run buildAndStart`, which will build the plugin and start the desktop application.
|
57
Assets/TinyMCE/JoplinLists/global.d.ts
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
declare module 'tinymce/core/api/util/Tools' {
|
||||
const Tools:any;
|
||||
export default Tools;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/Editor' {
|
||||
export default interface Editor {
|
||||
on: Function,
|
||||
off: Function,
|
||||
execCommand: Function,
|
||||
getBody: Function,
|
||||
getParam: Function,
|
||||
fire: Function,
|
||||
nodeChanged: Function,
|
||||
selection: any,
|
||||
contentDocument: any,
|
||||
dom: any,
|
||||
schema: any,
|
||||
undoManager: any,
|
||||
ui: any,
|
||||
}
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/dom/BookmarkManager' {
|
||||
const BookmarkManager:any;
|
||||
export default BookmarkManager;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/dom/DOMUtils' {
|
||||
const DOMUtils:any;
|
||||
export default DOMUtils;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/dom/RangeUtils' {
|
||||
const RangeUtils:any;
|
||||
export default RangeUtils;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/dom/TreeWalker' {
|
||||
const TreeWalker:any;
|
||||
export default TreeWalker;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/util/VK' {
|
||||
const VK:any;
|
||||
export default VK;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/dom/DomQuery' {
|
||||
const DomQuery:any;
|
||||
export default DomQuery;
|
||||
}
|
||||
|
||||
declare module 'tinymce/core/api/PluginManager' {
|
||||
const PluginManager:any;
|
||||
export default PluginManager;
|
||||
}
|
54
Assets/TinyMCE/JoplinLists/package.json
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"name": "joplin-tinymce-lists",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"prepublishOnly": "npm run lint && npm run build",
|
||||
"lint": "tslint src/**/*.ts",
|
||||
"build": "grunt",
|
||||
"test": "bedrock-auto -b phantomjs -d src/test/ts/",
|
||||
"test-manual": "bedrock -d src/test/ts/",
|
||||
"start": "grunt webpack",
|
||||
"buildAndStart": "yarn build && cd .. && cd .. && cd .. && cd packages/app-desktop && npm start"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Tiny Technologies Inc.",
|
||||
"devDependencies": {
|
||||
"@ephox/agar": "latest",
|
||||
"@ephox/bedrock": "latest",
|
||||
"@ephox/mcagar": "latest",
|
||||
"@ephox/swag": "latest",
|
||||
"@ephox/tslint-rules": "latest",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"grunt": "^1.0.4",
|
||||
"grunt-contrib-clean": "^2.0.0",
|
||||
"grunt-contrib-concat": "^1.0.1",
|
||||
"grunt-contrib-copy": "^1.0.0",
|
||||
"grunt-contrib-uglify": "^4.0.0",
|
||||
"grunt-shell": "^2.1.0",
|
||||
"grunt-tslint": "^5.0.2",
|
||||
"grunt-webpack": "^3.1.3",
|
||||
"load-grunt-tasks": "^4.0.0",
|
||||
"tinymce": "latest",
|
||||
"ts-loader": "^5.3.0",
|
||||
"tslib": "^1.9.3",
|
||||
"tslint": "^5.11.0",
|
||||
"typescript": "^3.1.6",
|
||||
"webpack": "^4.25.1",
|
||||
"webpack-livereload-plugin": "^2.1.1"
|
||||
},
|
||||
"files": [
|
||||
"lib/main",
|
||||
"lib/demo",
|
||||
"lib/test",
|
||||
"src",
|
||||
"tsconfig.json",
|
||||
"readme.md",
|
||||
"LEGAL.txt",
|
||||
"LICENSE.txt"
|
||||
],
|
||||
"main": "./lib/main/ts/api/Main.js",
|
||||
"module": "./lib/main/ts/api/Main.js",
|
||||
"types": "./lib/main/ts/api/Main.d.ts",
|
||||
"license": "Apache-2.0"
|
||||
}
|
16
Assets/TinyMCE/JoplinLists/src/main/ts/Main.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import Plugin from './Plugin';
|
||||
|
||||
Plugin();
|
||||
|
||||
/*******
|
||||
* DO NOT EXPORT ANYTHING
|
||||
*
|
||||
* IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
|
||||
*******/
|
22
Assets/TinyMCE/JoplinLists/src/main/ts/Plugin.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import PluginManager from 'tinymce/core/api/PluginManager';
|
||||
import * as Api from './api/Api';
|
||||
import * as Commands from './api/Commands';
|
||||
import * as Keyboard from './core/Keyboard';
|
||||
import * as Buttons from './ui/Buttons';
|
||||
|
||||
export default function () {
|
||||
PluginManager.add('joplinLists', function (editor) {
|
||||
Keyboard.setup(editor);
|
||||
Buttons.register(editor);
|
||||
Commands.register(editor);
|
||||
|
||||
return Api.get(editor);
|
||||
});
|
||||
}
|
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Arr } from '@ephox/katamari';
|
||||
import { Element} from '@ephox/sugar';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import { Indentation } from '../listModel/Indentation';
|
||||
import { listIndentation } from '../listModel/ListsIndendation';
|
||||
import { dlIndentation } from '../core/DlIndentation';
|
||||
import * as Range from '../core/Range';
|
||||
import * as Selection from '../core/Selection';
|
||||
|
||||
const selectionIndentation = (editor: Editor, indentation: Indentation): boolean => {
|
||||
const lists = Arr.map(Selection.getSelectedListRoots(editor), Element.fromDom);
|
||||
const dlItems = Arr.map(Selection.getSelectedDlItems(editor), Element.fromDom);
|
||||
let isHandled = false;
|
||||
|
||||
if (lists.length || dlItems.length) {
|
||||
const bookmark = editor.selection.getBookmark();
|
||||
|
||||
listIndentation(editor, lists, indentation);
|
||||
dlIndentation(editor, indentation, dlItems);
|
||||
|
||||
editor.selection.moveToBookmark(bookmark);
|
||||
editor.selection.setRng(Range.normalizeRange(editor.selection.getRng()));
|
||||
editor.nodeChanged();
|
||||
isHandled = true;
|
||||
}
|
||||
|
||||
return isHandled;
|
||||
};
|
||||
|
||||
const indentListSelection = (editor: Editor): boolean => {
|
||||
return selectionIndentation(editor, Indentation.Indent);
|
||||
};
|
||||
|
||||
const outdentListSelection = (editor: Editor): boolean => {
|
||||
return selectionIndentation(editor, Indentation.Outdent);
|
||||
};
|
||||
|
||||
const flattenListSelection = (editor: Editor): boolean => {
|
||||
return selectionIndentation(editor, Indentation.Flatten);
|
||||
};
|
||||
|
||||
export {
|
||||
indentListSelection,
|
||||
outdentListSelection,
|
||||
flattenListSelection
|
||||
};
|
307
Assets/TinyMCE/JoplinLists/src/main/ts/actions/ToggleList.ts
Normal file
@@ -0,0 +1,307 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import BookmarkManager from 'tinymce/core/api/dom/BookmarkManager';
|
||||
import Tools from 'tinymce/core/api/util/Tools';
|
||||
import * as Bookmark from '../core/Bookmark';
|
||||
import * as NodeType from '../core/NodeType';
|
||||
import * as Selection from '../core/Selection';
|
||||
import { HTMLElement } from '@ephox/dom-globals';
|
||||
import { flattenListSelection } from './Indendation';
|
||||
import { fireListEvent } from '../api/Events';
|
||||
import { isCustomList } from '../core/Util';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import { listToggleActionFromListName } from '../core/ListAction';
|
||||
import { findContainerListTypeFromElement } from '../listModel/JoplinListUtil';
|
||||
|
||||
const updateListStyle = function (dom, el, detail) {
|
||||
const type = detail['list-style-type'] ? detail['list-style-type'] : null;
|
||||
dom.setStyle(el, 'list-style-type', type);
|
||||
};
|
||||
|
||||
const setAttribs = function (elm, attrs) {
|
||||
Tools.each(attrs, function (value, key) {
|
||||
elm.setAttribute(key, value);
|
||||
});
|
||||
};
|
||||
|
||||
const updateListAttrs = function (dom, el, detail) {
|
||||
setAttribs(el, detail['list-attributes']);
|
||||
Tools.each(dom.select('li', el), function (li) {
|
||||
setAttribs(li, detail['list-item-attributes']);
|
||||
});
|
||||
};
|
||||
|
||||
const updateListWithDetails = function (dom, el, detail) {
|
||||
updateListStyle(dom, el, detail);
|
||||
updateListAttrs(dom, el, detail);
|
||||
|
||||
if (detail.listType === 'joplinChecklist') {
|
||||
el.classList.add('joplin-checklist');
|
||||
} else {
|
||||
el.classList.remove('joplin-checklist');
|
||||
}
|
||||
};
|
||||
|
||||
const removeStyles = (dom, element: HTMLElement, styles: string[]) => {
|
||||
Tools.each(styles, (style) => dom.setStyle(element, { [style]: '' }));
|
||||
};
|
||||
|
||||
const getEndPointNode = function (editor, rng, start, root) {
|
||||
let container, offset;
|
||||
|
||||
container = rng[start ? 'startContainer' : 'endContainer'];
|
||||
offset = rng[start ? 'startOffset' : 'endOffset'];
|
||||
|
||||
// Resolve node index
|
||||
if (container.nodeType === 1) {
|
||||
container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
|
||||
}
|
||||
|
||||
if (!start && NodeType.isBr(container.nextSibling)) {
|
||||
container = container.nextSibling;
|
||||
}
|
||||
|
||||
while (container.parentNode !== root) {
|
||||
if (NodeType.isTextBlock(editor, container)) {
|
||||
return container;
|
||||
}
|
||||
|
||||
if (/^(TD|TH)$/.test(container.parentNode.nodeName)) {
|
||||
return container;
|
||||
}
|
||||
|
||||
container = container.parentNode;
|
||||
}
|
||||
|
||||
return container;
|
||||
};
|
||||
|
||||
const getSelectedTextBlocks = function (editor, rng, root) {
|
||||
const textBlocks = [], dom = editor.dom;
|
||||
|
||||
const startNode = getEndPointNode(editor, rng, true, root);
|
||||
const endNode = getEndPointNode(editor, rng, false, root);
|
||||
let block;
|
||||
const siblings = [];
|
||||
|
||||
for (let node = startNode; node; node = node.nextSibling) {
|
||||
siblings.push(node);
|
||||
|
||||
if (node === endNode) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Tools.each(siblings, function (node) {
|
||||
if (NodeType.isTextBlock(editor, node)) {
|
||||
textBlocks.push(node);
|
||||
block = null;
|
||||
return;
|
||||
}
|
||||
|
||||
if (dom.isBlock(node) || NodeType.isBr(node)) {
|
||||
if (NodeType.isBr(node)) {
|
||||
dom.remove(node);
|
||||
}
|
||||
|
||||
block = null;
|
||||
return;
|
||||
}
|
||||
|
||||
const nextSibling = node.nextSibling;
|
||||
if (BookmarkManager.isBookmarkNode(node)) {
|
||||
if (NodeType.isTextBlock(editor, nextSibling) || (!nextSibling && node.parentNode === root)) {
|
||||
block = null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!block) {
|
||||
block = dom.create('p');
|
||||
node.parentNode.insertBefore(block, node);
|
||||
textBlocks.push(block);
|
||||
}
|
||||
|
||||
block.appendChild(node);
|
||||
});
|
||||
|
||||
return textBlocks;
|
||||
};
|
||||
|
||||
const hasCompatibleStyle = function (dom, sib, detail) {
|
||||
const sibStyle = dom.getStyle(sib, 'list-style-type');
|
||||
let detailStyle = detail ? detail['list-style-type'] : '';
|
||||
|
||||
detailStyle = detailStyle === null ? '' : detailStyle;
|
||||
|
||||
return sibStyle === detailStyle;
|
||||
};
|
||||
|
||||
const applyList = function (editor, listName: string, detail:any = {}) {
|
||||
const rng = editor.selection.getRng(true);
|
||||
let bookmark;
|
||||
let listItemName = 'LI';
|
||||
const root = Selection.getClosestListRootElm(editor, editor.selection.getStart(true));
|
||||
const dom = editor.dom;
|
||||
|
||||
if (dom.getContentEditable(editor.selection.getNode()) === 'false') {
|
||||
return;
|
||||
}
|
||||
|
||||
listName = listName.toUpperCase();
|
||||
|
||||
if (listName === 'DL') {
|
||||
listItemName = 'DT';
|
||||
}
|
||||
|
||||
bookmark = Bookmark.createBookmark(rng);
|
||||
|
||||
Tools.each(getSelectedTextBlocks(editor, rng, root), function (block) {
|
||||
let listBlock, sibling;
|
||||
|
||||
sibling = block.previousSibling;
|
||||
if (sibling && NodeType.isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) {
|
||||
listBlock = sibling;
|
||||
block = dom.rename(block, listItemName);
|
||||
sibling.appendChild(block);
|
||||
} else {
|
||||
listBlock = dom.create(listName);
|
||||
if (detail.listType === 'joplinChecklist') {
|
||||
listBlock.classList.add('joplin-checklist');
|
||||
} else {
|
||||
listBlock.classList.remove('joplin-checklist');
|
||||
}
|
||||
block.parentNode.insertBefore(listBlock, block);
|
||||
listBlock.appendChild(block);
|
||||
block = dom.rename(block, listItemName);
|
||||
}
|
||||
|
||||
removeStyles(dom, block, [
|
||||
'margin', 'margin-right', 'margin-bottom', 'margin-left', 'margin-top',
|
||||
'padding', 'padding-right', 'padding-bottom', 'padding-left', 'padding-top',
|
||||
]);
|
||||
|
||||
updateListWithDetails(dom, listBlock, detail);
|
||||
mergeWithAdjacentLists(editor.dom, listBlock);
|
||||
});
|
||||
|
||||
editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
|
||||
};
|
||||
|
||||
const isValidLists = function (list1, list2) {
|
||||
return list1 && list2 && NodeType.isListNode(list1) && list1.nodeName === list2.nodeName;
|
||||
};
|
||||
|
||||
const hasSameListStyle = function (dom, list1, list2) {
|
||||
const targetStyle = dom.getStyle(list1, 'list-style-type', true);
|
||||
const style = dom.getStyle(list2, 'list-style-type', true);
|
||||
return targetStyle === style;
|
||||
};
|
||||
|
||||
const hasSameClasses = function (elm1, elm2) {
|
||||
return elm1.className === elm2.className;
|
||||
};
|
||||
|
||||
const shouldMerge = function (dom, list1, list2) {
|
||||
return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2);
|
||||
};
|
||||
|
||||
const mergeWithAdjacentLists = function (dom, listBlock) {
|
||||
let sibling, node;
|
||||
|
||||
sibling = listBlock.nextSibling;
|
||||
if (shouldMerge(dom, listBlock, sibling)) {
|
||||
while ((node = sibling.firstChild)) {
|
||||
listBlock.appendChild(node);
|
||||
}
|
||||
|
||||
dom.remove(sibling);
|
||||
}
|
||||
|
||||
sibling = listBlock.previousSibling;
|
||||
if (shouldMerge(dom, listBlock, sibling)) {
|
||||
while ((node = sibling.lastChild)) {
|
||||
listBlock.insertBefore(node, listBlock.firstChild);
|
||||
}
|
||||
|
||||
dom.remove(sibling);
|
||||
}
|
||||
};
|
||||
|
||||
const updateList = function (editor: Editor, list, listName, detail) {
|
||||
if (list.nodeName !== listName) {
|
||||
const newList = editor.dom.rename(list, listName);
|
||||
updateListWithDetails(editor.dom, newList, detail);
|
||||
fireListEvent(editor, listToggleActionFromListName(listName), newList);
|
||||
} else {
|
||||
updateListWithDetails(editor.dom, list, detail);
|
||||
fireListEvent(editor, listToggleActionFromListName(listName), list);
|
||||
}
|
||||
};
|
||||
|
||||
const toggleMultipleLists = function (editor, parentList, lists, listName, detail) {
|
||||
if (parentList.nodeName === listName && !hasListStyleDetail(detail)) {
|
||||
flattenListSelection(editor);
|
||||
} else {
|
||||
const bookmark = Bookmark.createBookmark(editor.selection.getRng(true));
|
||||
|
||||
Tools.each([parentList].concat(lists), function (elm) {
|
||||
updateList(editor, elm, listName, detail);
|
||||
});
|
||||
|
||||
editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
|
||||
}
|
||||
};
|
||||
|
||||
const hasListStyleDetail = function (detail) {
|
||||
return 'list-style-type' in detail;
|
||||
};
|
||||
|
||||
const toggleSingleList = function (editor, parentList, listName, detail) {
|
||||
if (parentList === editor.getBody()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (parentList) {
|
||||
const listType = findContainerListTypeFromElement(parentList);
|
||||
if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList) && listType === detail.listType) {
|
||||
flattenListSelection(editor);
|
||||
} else {
|
||||
const bookmark = Bookmark.createBookmark(editor.selection.getRng(true));
|
||||
updateListWithDetails(editor.dom, parentList, detail);
|
||||
const newList = editor.dom.rename(parentList, listName);
|
||||
mergeWithAdjacentLists(editor.dom, newList);
|
||||
editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
|
||||
fireListEvent(editor, listToggleActionFromListName(listName), newList);
|
||||
}
|
||||
} else {
|
||||
applyList(editor, listName, detail);
|
||||
fireListEvent(editor, listToggleActionFromListName(listName), parentList);
|
||||
}
|
||||
};
|
||||
|
||||
const toggleList = function (editor, listName, detail) {
|
||||
const parentList = Selection.getParentList(editor);
|
||||
const selectedSubLists = Selection.getSelectedSubLists(editor);
|
||||
|
||||
detail = {
|
||||
listType: 'regular',
|
||||
...detail,
|
||||
}
|
||||
|
||||
if (parentList && selectedSubLists.length > 0) {
|
||||
toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail);
|
||||
} else {
|
||||
toggleSingleList(editor, parentList, listName, detail);
|
||||
}
|
||||
};
|
||||
|
||||
export {
|
||||
toggleList,
|
||||
mergeWithAdjacentLists
|
||||
};
|
21
Assets/TinyMCE/JoplinLists/src/main/ts/api/Api.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import * as Delete from '../core/Delete';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
|
||||
const get = function (editor: Editor) {
|
||||
return {
|
||||
backspaceDelete (isForward: boolean) {
|
||||
Delete.backspaceDelete(editor, isForward);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
export {
|
||||
get
|
||||
};
|
55
Assets/TinyMCE/JoplinLists/src/main/ts/api/Commands.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import * as ToggleList from '../actions/ToggleList';
|
||||
import { indentListSelection, outdentListSelection, flattenListSelection } from '../actions/Indendation';
|
||||
import { addJoplinChecklistCommands } from '../listModel/JoplinListUtil';
|
||||
|
||||
const queryListCommandState = function (editor, listName) {
|
||||
return function () {
|
||||
const parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL');
|
||||
return parentList && parentList.nodeName === listName;
|
||||
};
|
||||
};
|
||||
|
||||
const register = function (editor) {
|
||||
editor.on('BeforeExecCommand', function (e) {
|
||||
const cmd = e.command.toLowerCase();
|
||||
|
||||
if (cmd === 'indent') {
|
||||
indentListSelection(editor);
|
||||
} else if (cmd === 'outdent') {
|
||||
outdentListSelection(editor);
|
||||
}
|
||||
});
|
||||
|
||||
editor.addCommand('InsertUnorderedList', function (ui, detail) {
|
||||
ToggleList.toggleList(editor, 'UL', detail);
|
||||
});
|
||||
|
||||
editor.addCommand('InsertOrderedList', function (ui, detail) {
|
||||
ToggleList.toggleList(editor, 'OL', detail);
|
||||
});
|
||||
|
||||
editor.addCommand('InsertDefinitionList', function (ui, detail) {
|
||||
ToggleList.toggleList(editor, 'DL', detail);
|
||||
});
|
||||
|
||||
editor.addCommand('RemoveList', () => {
|
||||
flattenListSelection(editor);
|
||||
});
|
||||
|
||||
editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL'));
|
||||
editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL'));
|
||||
editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL'));
|
||||
|
||||
addJoplinChecklistCommands(editor, ToggleList);
|
||||
};
|
||||
|
||||
export {
|
||||
register
|
||||
};
|
4
Assets/TinyMCE/JoplinLists/src/main/ts/api/Events.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import { ListAction } from '../core/ListAction';
|
||||
|
||||
export const fireListEvent = (editor: Editor, action: ListAction, element) => editor.fire('ListMutation', { action, element });
|
38
Assets/TinyMCE/JoplinLists/src/main/ts/api/Settings.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
|
||||
const shouldIndentOnTab = function (editor: Editor) {
|
||||
return editor.getParam('lists_indent_on_tab', true);
|
||||
};
|
||||
|
||||
const getForcedRootBlock = (editor: Editor): string => {
|
||||
const block = editor.getParam('forced_root_block', 'p');
|
||||
if (block === false) {
|
||||
return '';
|
||||
} else if (block === true) {
|
||||
return 'p';
|
||||
} else {
|
||||
return block;
|
||||
}
|
||||
};
|
||||
|
||||
const getForcedRootBlockAttrs = (editor: Editor): Record<string, string> => {
|
||||
return editor.getParam('forced_root_block_attrs', {});
|
||||
};
|
||||
|
||||
const getLocalizationFunction = (editor:Editor):Function => {
|
||||
return editor.getParam('localization_function', (s:string) => s);
|
||||
}
|
||||
|
||||
export {
|
||||
shouldIndentOnTab,
|
||||
getForcedRootBlock,
|
||||
getForcedRootBlockAttrs,
|
||||
getLocalizationFunction,
|
||||
};
|
126
Assets/TinyMCE/JoplinLists/src/main/ts/core/Bookmark.ts
Normal file
@@ -0,0 +1,126 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import DOMUtils from 'tinymce/core/api/dom/DOMUtils';
|
||||
import * as Range from './Range';
|
||||
|
||||
const DOM = DOMUtils.DOM;
|
||||
|
||||
/**
|
||||
* Returns a range bookmark. This will convert indexed bookmarks into temporary span elements with
|
||||
* index 0 so that they can be restored properly after the DOM has been modified. Text bookmarks will not have spans
|
||||
* added to them since they can be restored after a dom operation.
|
||||
*
|
||||
* So this: <p><b>|</b><b>|</b></p>
|
||||
* becomes: <p><b><span data-mce-type="bookmark">|</span></b><b data-mce-type="bookmark">|</span></b></p>
|
||||
*
|
||||
* @param {DOMRange} rng DOM Range to get bookmark on.
|
||||
* @return {Object} Bookmark object.
|
||||
*/
|
||||
const createBookmark = function (rng) {
|
||||
const bookmark = {};
|
||||
|
||||
const setupEndPoint = function (start?) {
|
||||
let offsetNode, container, offset;
|
||||
|
||||
container = rng[start ? 'startContainer' : 'endContainer'];
|
||||
offset = rng[start ? 'startOffset' : 'endOffset'];
|
||||
|
||||
if (container.nodeType === 1) {
|
||||
offsetNode = DOM.create('span', { 'data-mce-type': 'bookmark' });
|
||||
|
||||
if (container.hasChildNodes()) {
|
||||
offset = Math.min(offset, container.childNodes.length - 1);
|
||||
|
||||
if (start) {
|
||||
container.insertBefore(offsetNode, container.childNodes[offset]);
|
||||
} else {
|
||||
DOM.insertAfter(offsetNode, container.childNodes[offset]);
|
||||
}
|
||||
} else {
|
||||
container.appendChild(offsetNode);
|
||||
}
|
||||
|
||||
container = offsetNode;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
bookmark[start ? 'startContainer' : 'endContainer'] = container;
|
||||
bookmark[start ? 'startOffset' : 'endOffset'] = offset;
|
||||
};
|
||||
|
||||
setupEndPoint(true);
|
||||
|
||||
if (!rng.collapsed) {
|
||||
setupEndPoint();
|
||||
}
|
||||
|
||||
return bookmark;
|
||||
};
|
||||
|
||||
const resolveBookmark = function (bookmark) {
|
||||
function restoreEndPoint(start?) {
|
||||
let container, offset, node;
|
||||
|
||||
const nodeIndex = function (container) {
|
||||
let node = container.parentNode.firstChild, idx = 0;
|
||||
|
||||
while (node) {
|
||||
if (node === container) {
|
||||
return idx;
|
||||
}
|
||||
|
||||
// Skip data-mce-type=bookmark nodes
|
||||
if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') {
|
||||
idx++;
|
||||
}
|
||||
|
||||
node = node.nextSibling;
|
||||
}
|
||||
|
||||
return -1;
|
||||
};
|
||||
|
||||
container = node = bookmark[start ? 'startContainer' : 'endContainer'];
|
||||
offset = bookmark[start ? 'startOffset' : 'endOffset'];
|
||||
|
||||
if (!container) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (container.nodeType === 1) {
|
||||
offset = nodeIndex(container);
|
||||
container = container.parentNode;
|
||||
DOM.remove(node);
|
||||
|
||||
if (!container.hasChildNodes() && DOM.isBlock(container)) {
|
||||
container.appendChild(DOM.create('br'));
|
||||
}
|
||||
}
|
||||
|
||||
bookmark[start ? 'startContainer' : 'endContainer'] = container;
|
||||
bookmark[start ? 'startOffset' : 'endOffset'] = offset;
|
||||
}
|
||||
|
||||
restoreEndPoint(true);
|
||||
restoreEndPoint();
|
||||
|
||||
const rng = DOM.createRng();
|
||||
|
||||
rng.setStart(bookmark.startContainer, bookmark.startOffset);
|
||||
|
||||
if (bookmark.endContainer) {
|
||||
rng.setEnd(bookmark.endContainer, bookmark.endOffset);
|
||||
}
|
||||
|
||||
return Range.normalizeRange(rng);
|
||||
};
|
||||
|
||||
export {
|
||||
createBookmark,
|
||||
resolveBookmark
|
||||
};
|
285
Assets/TinyMCE/JoplinLists/src/main/ts/core/Delete.ts
Normal file
@@ -0,0 +1,285 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
interface DOMUtils {
|
||||
isBlock: Function,
|
||||
remove: Function,
|
||||
$: Function,
|
||||
getParent: Function,
|
||||
getParents: Function,
|
||||
getRoot: Function,
|
||||
isEmpty: Function,
|
||||
}
|
||||
|
||||
import { Element, HTMLLIElement, Node, Range as DomRange } from '@ephox/dom-globals';
|
||||
import { Arr } from '@ephox/katamari';
|
||||
import { Compare, Element as SugarElement } from '@ephox/sugar';
|
||||
// import DOMUtils from 'tinymce/core/api/dom/DOMUtils';
|
||||
import RangeUtils from 'tinymce/core/api/dom/RangeUtils';
|
||||
import TreeWalker from 'tinymce/core/api/dom/TreeWalker';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import VK from 'tinymce/core/api/util/VK';
|
||||
import { flattenListSelection, outdentListSelection } from '../actions/Indendation';
|
||||
import * as ToggleList from '../actions/ToggleList';
|
||||
import * as Bookmark from './Bookmark';
|
||||
import * as NodeType from './NodeType';
|
||||
import * as NormalizeLists from './NormalizeLists';
|
||||
import * as Range from './Range';
|
||||
import * as Selection from './Selection';
|
||||
|
||||
const findNextCaretContainer = function (editor: Editor, rng: DomRange, isForward: Boolean, root: Node): Node {
|
||||
let node = rng.startContainer;
|
||||
const offset = rng.startOffset;
|
||||
|
||||
if (NodeType.isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) {
|
||||
return node;
|
||||
}
|
||||
|
||||
const nonEmptyBlocks = editor.schema.getNonEmptyElements();
|
||||
if (node.nodeType === 1) {
|
||||
node = RangeUtils.getNode(node, offset);
|
||||
}
|
||||
|
||||
const walker = new TreeWalker(node, root);
|
||||
|
||||
// Delete at <li>|<br></li> then jump over the bogus br
|
||||
if (isForward) {
|
||||
if (NodeType.isBogusBr(editor.dom, node)) {
|
||||
walker.next();
|
||||
}
|
||||
}
|
||||
|
||||
while ((node = walker[isForward ? 'next' : 'prev2']())) {
|
||||
if (node.nodeName === 'LI' && !node.hasChildNodes()) {
|
||||
return node;
|
||||
}
|
||||
|
||||
if (nonEmptyBlocks[node.nodeName]) {
|
||||
return node;
|
||||
}
|
||||
|
||||
if (NodeType.isTextNode(node) && node.data.length > 0) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const hasOnlyOneBlockChild = function (dom: DOMUtils, elm: Element): boolean {
|
||||
const childNodes = elm.childNodes;
|
||||
return childNodes.length === 1 && !NodeType.isListNode(childNodes[0]) && dom.isBlock(childNodes[0]);
|
||||
};
|
||||
|
||||
const unwrapSingleBlockChild = function (dom: DOMUtils, elm: Element) {
|
||||
if (hasOnlyOneBlockChild(dom, elm)) {
|
||||
dom.remove(elm.firstChild, true);
|
||||
}
|
||||
};
|
||||
|
||||
const moveChildren = function (dom: DOMUtils, fromElm: Element, toElm: Element) {
|
||||
let node, targetElm;
|
||||
|
||||
targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm;
|
||||
unwrapSingleBlockChild(dom, fromElm);
|
||||
|
||||
if (!NodeType.isEmpty(dom, fromElm, true)) {
|
||||
while ((node = fromElm.firstChild)) {
|
||||
targetElm.appendChild(node);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const mergeLiElements = function (dom: DOMUtils, fromElm: Element, toElm: Element) {
|
||||
let node, listNode;
|
||||
const ul = fromElm.parentNode;
|
||||
|
||||
if (!NodeType.isChildOfBody(dom, fromElm) || !NodeType.isChildOfBody(dom, toElm)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (NodeType.isListNode(toElm.lastChild)) {
|
||||
listNode = toElm.lastChild;
|
||||
}
|
||||
|
||||
if (ul === toElm.lastChild) {
|
||||
if (NodeType.isBr(ul.previousSibling)) {
|
||||
dom.remove(ul.previousSibling);
|
||||
}
|
||||
}
|
||||
|
||||
node = toElm.lastChild;
|
||||
if (node && NodeType.isBr(node) && fromElm.hasChildNodes()) {
|
||||
dom.remove(node);
|
||||
}
|
||||
|
||||
if (NodeType.isEmpty(dom, toElm, true)) {
|
||||
dom.$(toElm).empty();
|
||||
}
|
||||
|
||||
moveChildren(dom, fromElm, toElm);
|
||||
|
||||
if (listNode) {
|
||||
toElm.appendChild(listNode);
|
||||
}
|
||||
|
||||
const contains = Compare.contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm));
|
||||
|
||||
const nestedLists = contains ? dom.getParents(fromElm, NodeType.isListNode, toElm) : [];
|
||||
|
||||
dom.remove(fromElm);
|
||||
|
||||
Arr.each(nestedLists, (list) => {
|
||||
if (NodeType.isEmpty(dom, list) && list !== dom.getRoot()) {
|
||||
dom.remove(list);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const mergeIntoEmptyLi = function (editor: Editor, fromLi: HTMLLIElement, toLi: HTMLLIElement) {
|
||||
editor.dom.$(toLi).empty();
|
||||
mergeLiElements(editor.dom, fromLi, toLi);
|
||||
editor.selection.setCursorLocation(toLi);
|
||||
};
|
||||
|
||||
const mergeForward = function (editor: Editor, rng: DomRange, fromLi: HTMLLIElement, toLi: HTMLLIElement) {
|
||||
const dom = editor.dom;
|
||||
|
||||
if (dom.isEmpty(toLi)) {
|
||||
mergeIntoEmptyLi(editor, fromLi, toLi);
|
||||
} else {
|
||||
const bookmark = Bookmark.createBookmark(rng);
|
||||
mergeLiElements(dom, fromLi, toLi);
|
||||
editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
|
||||
}
|
||||
};
|
||||
|
||||
const mergeBackward = function (editor: Editor, rng: DomRange, fromLi: HTMLLIElement, toLi: HTMLLIElement) {
|
||||
const bookmark = Bookmark.createBookmark(rng);
|
||||
mergeLiElements(editor.dom, fromLi, toLi);
|
||||
const resolvedBookmark = Bookmark.resolveBookmark(bookmark);
|
||||
editor.selection.setRng(resolvedBookmark);
|
||||
};
|
||||
|
||||
const backspaceDeleteFromListToListCaret = function (editor: Editor, isForward: boolean) {
|
||||
const dom = editor.dom, selection = editor.selection;
|
||||
const selectionStartElm = selection.getStart();
|
||||
const root = Selection.getClosestListRootElm(editor, selectionStartElm);
|
||||
const li = dom.getParent(selection.getStart(), 'LI', root) as HTMLLIElement;
|
||||
|
||||
if (li) {
|
||||
const ul = li.parentNode;
|
||||
if (ul === editor.getBody() && NodeType.isEmpty(dom, ul)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const rng = Range.normalizeRange(selection.getRng());
|
||||
const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root) as HTMLLIElement;
|
||||
|
||||
if (otherLi && otherLi !== li) {
|
||||
editor.undoManager.transact(() => {
|
||||
if (isForward) {
|
||||
mergeForward(editor, rng, otherLi, li);
|
||||
} else {
|
||||
if (NodeType.isFirstChild(li)) {
|
||||
outdentListSelection(editor);
|
||||
} else {
|
||||
mergeBackward(editor, rng, li, otherLi);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
} else if (!otherLi) {
|
||||
if (!isForward && rng.startOffset === 0 && rng.endOffset === 0) {
|
||||
editor.undoManager.transact(() => {
|
||||
flattenListSelection(editor);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
const removeBlock = function (dom: DOMUtils, block: Element, root: Node) {
|
||||
const parentBlock = dom.getParent(block.parentNode, dom.isBlock, root);
|
||||
|
||||
dom.remove(block);
|
||||
if (parentBlock && dom.isEmpty(parentBlock)) {
|
||||
dom.remove(parentBlock);
|
||||
}
|
||||
};
|
||||
|
||||
const backspaceDeleteIntoListCaret = function (editor: Editor, isForward: boolean) {
|
||||
const dom = editor.dom;
|
||||
const selectionStartElm = editor.selection.getStart();
|
||||
const root = Selection.getClosestListRootElm(editor, selectionStartElm);
|
||||
const block = dom.getParent(selectionStartElm, dom.isBlock, root);
|
||||
|
||||
if (block && dom.isEmpty(block)) {
|
||||
const rng = Range.normalizeRange(editor.selection.getRng());
|
||||
const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
|
||||
|
||||
if (otherLi) {
|
||||
editor.undoManager.transact(function () {
|
||||
removeBlock(dom, block, root);
|
||||
ToggleList.mergeWithAdjacentLists(dom, otherLi.parentNode);
|
||||
editor.selection.select(otherLi, true);
|
||||
editor.selection.collapse(isForward);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
const backspaceDeleteCaret = function (editor: Editor, isForward: boolean): boolean {
|
||||
return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward);
|
||||
};
|
||||
|
||||
const backspaceDeleteRange = function (editor: Editor): boolean {
|
||||
const selectionStartElm = editor.selection.getStart();
|
||||
const root = Selection.getClosestListRootElm(editor, selectionStartElm);
|
||||
const startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root);
|
||||
|
||||
if (startListParent || Selection.getSelectedListItems(editor).length > 0) {
|
||||
editor.undoManager.transact(function () {
|
||||
editor.execCommand('Delete');
|
||||
NormalizeLists.normalizeLists(editor.dom, editor.getBody());
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
const backspaceDelete = function (editor: Editor, isForward: boolean): boolean {
|
||||
return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor);
|
||||
};
|
||||
|
||||
const setup = function (editor: Editor) {
|
||||
editor.on('keydown', function (e) {
|
||||
if (e.keyCode === VK.BACKSPACE) {
|
||||
if (backspaceDelete(editor, false)) {
|
||||
e.preventDefault();
|
||||
}
|
||||
} else if (e.keyCode === VK.DELETE) {
|
||||
if (backspaceDelete(editor, true)) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export {
|
||||
setup,
|
||||
backspaceDelete
|
||||
};
|
38
Assets/TinyMCE/JoplinLists/src/main/ts/core/DlIndentation.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import { Compare, Replication, Element, Traverse } from '@ephox/sugar';
|
||||
import * as SplitList from './SplitList';
|
||||
import { Indentation } from '../listModel/Indentation';
|
||||
import { Arr } from '@ephox/katamari';
|
||||
|
||||
const outdentDlItem = (editor: Editor, item: Element): void => {
|
||||
if (Compare.is(item, 'dd')) {
|
||||
Replication.mutate(item, 'dt');
|
||||
} else if (Compare.is(item, 'dt')) {
|
||||
Traverse.parent(item).each((dl) => SplitList.splitList(editor, dl.dom(), item.dom()));
|
||||
}
|
||||
};
|
||||
|
||||
const indentDlItem = (item: Element): void => {
|
||||
if (Compare.is(item, 'dt')) {
|
||||
Replication.mutate(item, 'dd');
|
||||
}
|
||||
};
|
||||
|
||||
const dlIndentation = (editor: Editor, indentation: Indentation, dlItems: Element[]) => {
|
||||
if (indentation === Indentation.Indent) {
|
||||
Arr.each(dlItems, indentDlItem);
|
||||
} else {
|
||||
Arr.each(dlItems, (item) => outdentDlItem(editor, item));
|
||||
}
|
||||
};
|
||||
|
||||
export {
|
||||
dlIndentation
|
||||
};
|
38
Assets/TinyMCE/JoplinLists/src/main/ts/core/Keyboard.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import VK from 'tinymce/core/api/util/VK';
|
||||
import * as Settings from '../api/Settings';
|
||||
import * as Delete from './Delete';
|
||||
import { outdentListSelection, indentListSelection } from '../actions/Indendation';
|
||||
|
||||
const setupTabKey = function (editor) {
|
||||
editor.on('keydown', function (e) {
|
||||
// Check for tab but not ctrl/cmd+tab since it switches browser tabs
|
||||
if (e.keyCode !== VK.TAB || VK.metaKeyPressed(e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
editor.undoManager.transact(() => {
|
||||
if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const setup = function (editor) {
|
||||
if (Settings.shouldIndentOnTab(editor)) {
|
||||
setupTabKey(editor);
|
||||
}
|
||||
|
||||
Delete.setup(editor);
|
||||
};
|
||||
|
||||
export {
|
||||
setup
|
||||
};
|
15
Assets/TinyMCE/JoplinLists/src/main/ts/core/ListAction.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
export const enum ListAction {
|
||||
ToggleUlList = 'ToggleUlList',
|
||||
ToggleOlList = 'ToggleOlList',
|
||||
ToggleDLList = 'ToggleDLList',
|
||||
IndentList = 'IndentList',
|
||||
OutdentList = 'OutdentList'
|
||||
}
|
||||
|
||||
export const listToggleActionFromListName = (listName: 'UL' | 'OL' | 'DL'): ListAction => {
|
||||
switch (listName) {
|
||||
case 'UL': return ListAction.ToggleUlList;
|
||||
case 'OL': return ListAction.ToggleOlList;
|
||||
case 'DL': return ListAction.ToggleDLList;
|
||||
}
|
||||
};
|
95
Assets/TinyMCE/JoplinLists/src/main/ts/core/NodeType.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Node, Text } from '@ephox/dom-globals';
|
||||
|
||||
const isTextNode = function (node: Node): node is Text {
|
||||
return node && node.nodeType === 3;
|
||||
};
|
||||
|
||||
const isListNode = function (node: Node) {
|
||||
return node && (/^(OL|UL|DL)$/).test(node.nodeName);
|
||||
};
|
||||
|
||||
const isOlUlNode = function (node: Node) {
|
||||
return node && (/^(OL|UL)$/).test(node.nodeName);
|
||||
};
|
||||
|
||||
const isListItemNode = function (node: Node) {
|
||||
return node && /^(LI|DT|DD)$/.test(node.nodeName);
|
||||
};
|
||||
|
||||
const isDlItemNode = function (node: Node) {
|
||||
return node && /^(DT|DD)$/.test(node.nodeName);
|
||||
};
|
||||
|
||||
const isTableCellNode = function (node: Node) {
|
||||
return node && /^(TH|TD)$/.test(node.nodeName);
|
||||
};
|
||||
|
||||
const isBr = function (node: Node) {
|
||||
return node && node.nodeName === 'BR';
|
||||
};
|
||||
|
||||
const isFirstChild = function (node: Node) {
|
||||
return node.parentNode.firstChild === node;
|
||||
};
|
||||
|
||||
const isLastChild = function (node: Node) {
|
||||
return node.parentNode.lastChild === node;
|
||||
};
|
||||
|
||||
const isTextBlock = function (editor, node: Node) {
|
||||
return node && !!editor.schema.getTextBlockElements()[node.nodeName];
|
||||
};
|
||||
|
||||
const isBlock = function (node: Node, blockElements) {
|
||||
return node && node.nodeName in blockElements;
|
||||
};
|
||||
|
||||
const isBogusBr = function (dom, node: Node) {
|
||||
if (!isBr(node)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
const isEmpty = function (dom, elm, keepBookmarks?) {
|
||||
const empty = dom.isEmpty(elm);
|
||||
|
||||
if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return empty;
|
||||
};
|
||||
|
||||
const isChildOfBody = function (dom, elm) {
|
||||
return dom.isChildOf(elm, dom.getRoot());
|
||||
};
|
||||
|
||||
export {
|
||||
isTextNode,
|
||||
isListNode,
|
||||
isOlUlNode,
|
||||
isDlItemNode,
|
||||
isListItemNode,
|
||||
isTableCellNode,
|
||||
isBr,
|
||||
isFirstChild,
|
||||
isLastChild,
|
||||
isTextBlock,
|
||||
isBlock,
|
||||
isBogusBr,
|
||||
isEmpty,
|
||||
isChildOfBody
|
||||
};
|
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import DOMUtils from 'tinymce/core/api/dom/DOMUtils';
|
||||
import Tools from 'tinymce/core/api/util/Tools';
|
||||
import * as NodeType from './NodeType';
|
||||
|
||||
const DOM = DOMUtils.DOM;
|
||||
|
||||
const normalizeList = function (dom, ul) {
|
||||
let sibling;
|
||||
const parentNode = ul.parentNode;
|
||||
|
||||
// Move UL/OL to previous LI if it's the only child of a LI
|
||||
if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) {
|
||||
sibling = parentNode.previousSibling;
|
||||
if (sibling && sibling.nodeName === 'LI') {
|
||||
sibling.appendChild(ul);
|
||||
|
||||
if (NodeType.isEmpty(dom, parentNode)) {
|
||||
DOM.remove(parentNode);
|
||||
}
|
||||
} else {
|
||||
DOM.setStyle(parentNode, 'listStyleType', 'none');
|
||||
}
|
||||
}
|
||||
|
||||
// Append OL/UL to previous LI if it's in a parent OL/UL i.e. old HTML4
|
||||
if (NodeType.isListNode(parentNode)) {
|
||||
sibling = parentNode.previousSibling;
|
||||
if (sibling && sibling.nodeName === 'LI') {
|
||||
sibling.appendChild(ul);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const normalizeLists = function (dom, element) {
|
||||
Tools.each(Tools.grep(dom.select('ol,ul', element)), function (ul) {
|
||||
normalizeList(dom, ul);
|
||||
});
|
||||
};
|
||||
|
||||
export {
|
||||
normalizeList,
|
||||
normalizeLists
|
||||
};
|
58
Assets/TinyMCE/JoplinLists/src/main/ts/core/Range.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import RangeUtils from 'tinymce/core/api/dom/RangeUtils';
|
||||
import * as NodeType from './NodeType';
|
||||
import { Range, Node } from '@ephox/dom-globals';
|
||||
|
||||
interface Point {
|
||||
container: Node;
|
||||
offset: number;
|
||||
}
|
||||
|
||||
const getNormalizedPoint = (container: Node, offset: number): Point => {
|
||||
if (NodeType.isTextNode(container)) {
|
||||
return { container, offset };
|
||||
}
|
||||
|
||||
const node = RangeUtils.getNode(container, offset);
|
||||
if (NodeType.isTextNode(node)) {
|
||||
return {
|
||||
container: node,
|
||||
offset: offset >= container.childNodes.length ? node.data.length : 0
|
||||
};
|
||||
} else if (node.previousSibling && NodeType.isTextNode(node.previousSibling)) {
|
||||
return {
|
||||
container: node.previousSibling,
|
||||
offset: node.previousSibling.data.length
|
||||
};
|
||||
} else if (node.nextSibling && NodeType.isTextNode(node.nextSibling)) {
|
||||
return {
|
||||
container: node.nextSibling,
|
||||
offset: 0
|
||||
};
|
||||
}
|
||||
|
||||
return { container, offset };
|
||||
};
|
||||
|
||||
const normalizeRange = (rng: Range): Range => {
|
||||
const outRng = rng.cloneRange();
|
||||
|
||||
const rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset);
|
||||
outRng.setStart(rangeStart.container, rangeStart.offset);
|
||||
|
||||
const rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset);
|
||||
outRng.setEnd(rangeEnd.container, rangeEnd.offset);
|
||||
|
||||
return outRng;
|
||||
};
|
||||
|
||||
export {
|
||||
getNormalizedPoint,
|
||||
normalizeRange
|
||||
};
|
108
Assets/TinyMCE/JoplinLists/src/main/ts/core/Selection.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Node } from '@ephox/dom-globals';
|
||||
import { Arr, Option } from '@ephox/katamari';
|
||||
import { HTMLElement } from '@ephox/sand';
|
||||
import DomQuery from 'tinymce/core/api/dom/DomQuery';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import Tools from 'tinymce/core/api/util/Tools';
|
||||
import * as NodeType from './NodeType';
|
||||
|
||||
const getParentList = function (editor) {
|
||||
const selectionStart = editor.selection.getStart(true);
|
||||
|
||||
return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart));
|
||||
};
|
||||
|
||||
const isParentListSelected = function (parentList, selectedBlocks) {
|
||||
return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList;
|
||||
};
|
||||
|
||||
const findSubLists = function (parentList) {
|
||||
return Tools.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm: Node) {
|
||||
return NodeType.isListNode(elm);
|
||||
});
|
||||
};
|
||||
|
||||
const getSelectedSubLists = function (editor) {
|
||||
const parentList = getParentList(editor);
|
||||
const selectedBlocks = editor.selection.getSelectedBlocks();
|
||||
|
||||
if (isParentListSelected(parentList, selectedBlocks)) {
|
||||
return findSubLists(parentList);
|
||||
} else {
|
||||
return Tools.grep(selectedBlocks, function (elm: Node) {
|
||||
return NodeType.isListNode(elm) && parentList !== elm;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const findParentListItemsNodes = function (editor, elms) {
|
||||
const listItemsElms = Tools.map(elms, function (elm) {
|
||||
const parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm));
|
||||
|
||||
return parentLi ? parentLi : elm;
|
||||
});
|
||||
|
||||
return DomQuery.unique(listItemsElms);
|
||||
};
|
||||
|
||||
const getSelectedListItems = function (editor) {
|
||||
const selectedBlocks = editor.selection.getSelectedBlocks();
|
||||
return Tools.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) {
|
||||
return NodeType.isListItemNode(block);
|
||||
});
|
||||
};
|
||||
|
||||
const getSelectedDlItems = (editor: Editor): Node[] => {
|
||||
return Arr.filter(getSelectedListItems(editor), NodeType.isDlItemNode);
|
||||
};
|
||||
|
||||
const getClosestListRootElm = function (editor, elm) {
|
||||
const parentTableCell = editor.dom.getParents(elm, 'TD,TH');
|
||||
const root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody();
|
||||
|
||||
return root;
|
||||
};
|
||||
|
||||
const findLastParentListNode = (editor: Editor, elm: Node): Option<Node> => {
|
||||
const parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm));
|
||||
return Arr.last(parentLists);
|
||||
};
|
||||
|
||||
const getSelectedLists = (editor: Editor): Node[] => {
|
||||
const firstList = findLastParentListNode(editor, editor.selection.getStart());
|
||||
const subsequentLists = Arr.filter(editor.selection.getSelectedBlocks(), NodeType.isOlUlNode);
|
||||
|
||||
return firstList.toArray().concat(subsequentLists);
|
||||
};
|
||||
|
||||
const getSelectedListRoots = (editor: Editor): Node[] => {
|
||||
const selectedLists = getSelectedLists(editor);
|
||||
return getUniqueListRoots(editor, selectedLists);
|
||||
};
|
||||
|
||||
const getUniqueListRoots = (editor: Editor, lists: Node[]): Node[] => {
|
||||
const listRoots = Arr.map(lists, (list) => findLastParentListNode(editor, list).getOr(list));
|
||||
return DomQuery.unique(listRoots);
|
||||
};
|
||||
|
||||
const isList = (editor: Editor): boolean => {
|
||||
const list = getParentList(editor);
|
||||
return HTMLElement.isPrototypeOf(list);
|
||||
};
|
||||
|
||||
export {
|
||||
isList,
|
||||
getParentList,
|
||||
getSelectedSubLists,
|
||||
getSelectedListItems,
|
||||
getClosestListRootElm,
|
||||
getSelectedDlItems,
|
||||
getSelectedListRoots
|
||||
};
|
59
Assets/TinyMCE/JoplinLists/src/main/ts/core/SplitList.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import DOMUtils from 'tinymce/core/api/dom/DOMUtils';
|
||||
import * as NodeType from './NodeType';
|
||||
import { createTextBlock } from './TextBlock';
|
||||
import Tools from 'tinymce/core/api/util/Tools';
|
||||
|
||||
const DOM = DOMUtils.DOM;
|
||||
|
||||
const splitList = function (editor, ul, li) {
|
||||
let tmpRng, fragment, bookmarks, node, newBlock;
|
||||
|
||||
const removeAndKeepBookmarks = function (targetNode) {
|
||||
Tools.each(bookmarks, function (node) {
|
||||
targetNode.parentNode.insertBefore(node, li.parentNode);
|
||||
});
|
||||
|
||||
DOM.remove(targetNode);
|
||||
};
|
||||
|
||||
bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul);
|
||||
newBlock = createTextBlock(editor, li);
|
||||
tmpRng = DOM.createRng();
|
||||
tmpRng.setStartAfter(li);
|
||||
tmpRng.setEndAfter(ul);
|
||||
fragment = tmpRng.extractContents();
|
||||
|
||||
for (node = fragment.firstChild; node; node = node.firstChild) {
|
||||
if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) {
|
||||
DOM.remove(node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!editor.dom.isEmpty(fragment)) {
|
||||
DOM.insertAfter(fragment, ul);
|
||||
}
|
||||
|
||||
DOM.insertAfter(newBlock, ul);
|
||||
|
||||
if (NodeType.isEmpty(editor.dom, li.parentNode)) {
|
||||
removeAndKeepBookmarks(li.parentNode);
|
||||
}
|
||||
|
||||
DOM.remove(li);
|
||||
|
||||
if (NodeType.isEmpty(editor.dom, ul)) {
|
||||
DOM.remove(ul);
|
||||
}
|
||||
};
|
||||
|
||||
export {
|
||||
splitList
|
||||
};
|
72
Assets/TinyMCE/JoplinLists/src/main/ts/core/TextBlock.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import * as NodeType from './NodeType';
|
||||
import { DocumentFragment, Node } from '@ephox/dom-globals';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import * as Settings from '../api/Settings';
|
||||
|
||||
const createTextBlock = (editor: Editor, contentNode: Node): DocumentFragment => {
|
||||
const dom = editor.dom;
|
||||
const blockElements = editor.schema.getBlockElements();
|
||||
const fragment = dom.createFragment();
|
||||
const blockName = Settings.getForcedRootBlock(editor);
|
||||
let node, textBlock, hasContentNode;
|
||||
|
||||
if (blockName) {
|
||||
textBlock = dom.create(blockName);
|
||||
|
||||
if (textBlock.tagName === blockName.toUpperCase()) {
|
||||
dom.setAttribs(textBlock, Settings.getForcedRootBlockAttrs(editor));
|
||||
}
|
||||
|
||||
if (!NodeType.isBlock(contentNode.firstChild, blockElements)) {
|
||||
fragment.appendChild(textBlock);
|
||||
}
|
||||
}
|
||||
|
||||
if (contentNode) {
|
||||
while ((node = contentNode.firstChild)) {
|
||||
const nodeName = node.nodeName;
|
||||
|
||||
if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) {
|
||||
hasContentNode = true;
|
||||
}
|
||||
|
||||
if (NodeType.isBlock(node, blockElements)) {
|
||||
fragment.appendChild(node);
|
||||
textBlock = null;
|
||||
} else {
|
||||
if (blockName) {
|
||||
if (!textBlock) {
|
||||
textBlock = dom.create(blockName);
|
||||
fragment.appendChild(textBlock);
|
||||
}
|
||||
|
||||
textBlock.appendChild(node);
|
||||
} else {
|
||||
fragment.appendChild(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!blockName) {
|
||||
fragment.appendChild(dom.create('br'));
|
||||
} else {
|
||||
// BR is needed in empty blocks
|
||||
if (!hasContentNode) {
|
||||
textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' }));
|
||||
}
|
||||
}
|
||||
|
||||
return fragment;
|
||||
};
|
||||
|
||||
export {
|
||||
createTextBlock
|
||||
};
|
3
Assets/TinyMCE/JoplinLists/src/main/ts/core/Util.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import { HTMLElement } from '@ephox/dom-globals';
|
||||
|
||||
export const isCustomList = (list: HTMLElement) => /\btox\-/.test(list.className);
|
109
Assets/TinyMCE/JoplinLists/src/main/ts/listModel/ComposeList.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Document } from '@ephox/dom-globals';
|
||||
import { Arr, Option, Options } from '@ephox/katamari';
|
||||
import { Attr, Css, Element, Insert, InsertAll, Node, Replication } from '@ephox/sugar';
|
||||
import { Entry } from './Entry';
|
||||
import { ListType } from './Util';
|
||||
|
||||
interface Segment {
|
||||
list: Element;
|
||||
item: Element;
|
||||
}
|
||||
|
||||
const joinSegment = (parent: Segment, child: Segment): void => {
|
||||
Insert.append(parent.item, child.list);
|
||||
};
|
||||
|
||||
const joinSegments = (segments: Segment[]): void => {
|
||||
for (let i = 1; i < segments.length; i++) {
|
||||
joinSegment(segments[i - 1], segments[i]);
|
||||
}
|
||||
};
|
||||
|
||||
const appendSegments = (head: Segment[], tail: Segment[]): void => {
|
||||
Options.lift2(Arr.last(head), Arr.head(tail), joinSegment);
|
||||
};
|
||||
|
||||
const createSegment = (scope: Document, listType: ListType): Segment => {
|
||||
const segment: Segment = {
|
||||
list: Element.fromTag(listType, scope),
|
||||
item: Element.fromTag('li', scope)
|
||||
};
|
||||
Insert.append(segment.list, segment.item);
|
||||
return segment;
|
||||
};
|
||||
|
||||
const createSegments = (scope: Document, entry: Entry, size: number): Segment[] => {
|
||||
const segments: Segment[] = [];
|
||||
for (let i = 0; i < size; i++) {
|
||||
segments.push(createSegment(scope, entry.listType));
|
||||
}
|
||||
return segments;
|
||||
};
|
||||
|
||||
const populateSegments = (segments: Segment[], entry: Entry): void => {
|
||||
for (let i = 0; i < segments.length - 1; i++) {
|
||||
Css.set(segments[i].item, 'list-style-type', 'none');
|
||||
}
|
||||
Arr.last(segments).each((segment) => {
|
||||
Attr.setAll(segment.list, entry.listAttributes);
|
||||
Attr.setAll(segment.item, entry.itemAttributes);
|
||||
InsertAll.append(segment.item, entry.content);
|
||||
});
|
||||
};
|
||||
|
||||
const normalizeSegment = (segment: Segment, entry: Entry): void => {
|
||||
if (Node.name(segment.list) !== entry.listType) {
|
||||
segment.list = Replication.mutate(segment.list, entry.listType);
|
||||
}
|
||||
Attr.setAll(segment.list, entry.listAttributes);
|
||||
};
|
||||
|
||||
const createItem = (scope: Document, attr: Record<string, any>, content: Element[]): Element => {
|
||||
const item = Element.fromTag('li', scope);
|
||||
Attr.setAll(item, attr);
|
||||
InsertAll.append(item, content);
|
||||
return item;
|
||||
};
|
||||
|
||||
const appendItem = (segment: Segment, item: Element): void => {
|
||||
Insert.append(segment.list, item);
|
||||
segment.item = item;
|
||||
};
|
||||
|
||||
const writeShallow = (scope: Document, cast: Segment[], entry: Entry): Segment[] => {
|
||||
const newCast = cast.slice(0, entry.depth);
|
||||
|
||||
Arr.last(newCast).each((segment) => {
|
||||
const item = createItem(scope, entry.itemAttributes, entry.content);
|
||||
appendItem(segment, item);
|
||||
normalizeSegment(segment, entry);
|
||||
});
|
||||
|
||||
return newCast;
|
||||
};
|
||||
|
||||
const writeDeep = (scope: Document, cast: Segment[], entry: Entry): Segment[] => {
|
||||
const segments = createSegments(scope, entry, entry.depth - cast.length);
|
||||
joinSegments(segments);
|
||||
populateSegments(segments, entry);
|
||||
appendSegments(cast, segments);
|
||||
|
||||
return cast.concat(segments);
|
||||
};
|
||||
|
||||
const composeList = (scope: Document, entries: Entry[]): Option<Element> => {
|
||||
const cast: Segment[] = Arr.foldl(entries, (cast, entry) => {
|
||||
return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry);
|
||||
}, []);
|
||||
|
||||
return Arr.head(cast).map((segment) => segment.list);
|
||||
};
|
||||
|
||||
export { composeList };
|
67
Assets/TinyMCE/JoplinLists/src/main/ts/listModel/Entry.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Element, Traverse, Replication, Attr, Node } from '@ephox/sugar';
|
||||
import { Arr, Option } from '@ephox/katamari';
|
||||
import { hasLastChildList, ListType } from './Util';
|
||||
|
||||
/*
|
||||
General workflow: Parse lists to entries -> Manipulate entries -> Compose entries to lists
|
||||
|
||||
0-------1---2--------->Depth
|
||||
<ol> |
|
||||
<li>a</li> | Entry { depth: 1, content: [a], listType: ListType.OL, ... }
|
||||
<li>b | Entry { depth: 1, content: [b], listType: ListType.OL, ... }
|
||||
<ul> |
|
||||
<li>c</li> | Entry { depth: 2, content: [c], listType: ListType.UL, ... }
|
||||
</ul> |
|
||||
</li> |
|
||||
</ol> |
|
||||
0-------1---2--------->Depth
|
||||
*/
|
||||
|
||||
export interface Entry {
|
||||
depth: number;
|
||||
content: Element[];
|
||||
isSelected: boolean;
|
||||
listType: ListType;
|
||||
listAttributes: Record<string, any>;
|
||||
itemAttributes: Record<string, any>;
|
||||
}
|
||||
|
||||
const isIndented = (entry: Entry) => {
|
||||
return entry.depth > 0;
|
||||
};
|
||||
|
||||
const isSelected = (entry: Entry) => {
|
||||
return entry.isSelected;
|
||||
};
|
||||
|
||||
const cloneItemContent = (li: Element): Element[] => {
|
||||
const children = Traverse.children(li);
|
||||
const content = hasLastChildList(li) ? children.slice(0, -1) : children;
|
||||
return Arr.map(content, Replication.deep);
|
||||
};
|
||||
|
||||
const createEntry = (li: Element, depth: number, isSelected: boolean): Option<Entry> => {
|
||||
return Traverse.parent(li).filter(Node.isElement).map((list) => {
|
||||
return {
|
||||
depth,
|
||||
isSelected,
|
||||
content: cloneItemContent(li),
|
||||
itemAttributes: Attr.clone(li),
|
||||
listAttributes: Attr.clone(list),
|
||||
listType: Node.name(list) as ListType
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
export {
|
||||
createEntry,
|
||||
isIndented,
|
||||
isSelected
|
||||
};
|
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Entry } from './Entry';
|
||||
|
||||
export const enum Indentation {
|
||||
Indent = 'Indent',
|
||||
Outdent = 'Outdent',
|
||||
Flatten = 'Flatten'
|
||||
}
|
||||
|
||||
export const indentEntry = (indentation: Indentation, entry: Entry): void => {
|
||||
switch (indentation) {
|
||||
case Indentation.Indent:
|
||||
entry.depth ++;
|
||||
break;
|
||||
|
||||
case Indentation.Outdent:
|
||||
entry.depth --;
|
||||
break;
|
||||
|
||||
case Indentation.Flatten:
|
||||
entry.depth = 0;
|
||||
}
|
||||
};
|
@@ -0,0 +1,48 @@
|
||||
export function isCheckboxListItem(element) {
|
||||
return element.classList && element.classList.contains('joplin-checklist');
|
||||
}
|
||||
|
||||
export function findContainerListTypeFromEvent(event) {
|
||||
if (isCheckboxListItem(event.element)) return 'joplinChecklist';
|
||||
|
||||
for (const parent of event.parents) {
|
||||
if (isCheckboxListItem(parent)) return 'joplinChecklist';
|
||||
}
|
||||
|
||||
return 'regular';
|
||||
}
|
||||
|
||||
export function findContainerListTypeFromElement(element) {
|
||||
while (element) {
|
||||
if (element.nodeName === 'UL' || element.nodName === 'OL') {
|
||||
return isCheckboxListItem(element) ? 'joplinChecklist' : 'regular';
|
||||
}
|
||||
element = element.parentNode;
|
||||
}
|
||||
|
||||
return 'regular';
|
||||
}
|
||||
|
||||
export function isJoplinChecklistItem(element) {
|
||||
if (element.nodeName !== 'LI') return false;
|
||||
const listType = findContainerListTypeFromElement(element);
|
||||
return listType === 'joplinChecklist';
|
||||
}
|
||||
|
||||
export function addJoplinChecklistCommands(editor, ToggleList) {
|
||||
editor.addCommand('ToggleJoplinChecklistItem', function (ui, detail) {
|
||||
const element = detail.element;
|
||||
if (!isJoplinChecklistItem(element)) return;
|
||||
|
||||
if (!element.classList || !element.classList.contains('checked')) {
|
||||
element.classList.add('checked');
|
||||
} else {
|
||||
element.classList.remove('checked');
|
||||
}
|
||||
});
|
||||
|
||||
editor.addCommand('InsertJoplinChecklist', function (ui, detail) {
|
||||
detail = Object.assign({}, detail, { listType: 'joplinChecklist' });
|
||||
ToggleList.toggleList(editor, 'UL', detail);
|
||||
});
|
||||
}
|
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Arr, Fun, Option, Options } from '@ephox/katamari';
|
||||
import { Element, Fragment, InsertAll, Remove } from '@ephox/sugar';
|
||||
import Editor from 'tinymce/core/api/Editor';
|
||||
import { fireListEvent } from '../api/Events';
|
||||
import { ListAction } from '../core/ListAction';
|
||||
import * as Selection from '../core/Selection';
|
||||
import { createTextBlock } from '../core/TextBlock';
|
||||
import { composeList } from './ComposeList';
|
||||
import { Entry, isIndented, isSelected } from './Entry';
|
||||
import { Indentation, indentEntry } from './Indentation';
|
||||
import { normalizeEntries } from './NormalizeEntries';
|
||||
import { EntrySet, ItemSelection, parseLists } from './ParseLists';
|
||||
import { hasFirstChildList } from './Util';
|
||||
|
||||
const outdentedComposer = (editor: Editor, entries: Entry[]): Element[] => {
|
||||
return Arr.map(entries, (entry) => {
|
||||
const content = Fragment.fromElements(entry.content);
|
||||
return Element.fromDom(createTextBlock(editor, content.dom()));
|
||||
});
|
||||
};
|
||||
|
||||
const indentedComposer = (editor: Editor, entries: Entry[]): Element[] => {
|
||||
normalizeEntries(entries);
|
||||
return composeList(editor.contentDocument, entries).toArray();
|
||||
};
|
||||
|
||||
const composeEntries = (editor, entries: Entry[]): Element[] => {
|
||||
return Arr.bind(Arr.groupBy(entries, isIndented), (entries) => {
|
||||
const groupIsIndented = Arr.head(entries).map(isIndented).getOr(false);
|
||||
return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries);
|
||||
});
|
||||
};
|
||||
|
||||
const indentSelectedEntries = (entries: Entry[], indentation: Indentation): void => {
|
||||
Arr.each(Arr.filter(entries, isSelected), (entry) => indentEntry(indentation, entry));
|
||||
};
|
||||
|
||||
const getItemSelection = (editor: Editor): Option<ItemSelection> => {
|
||||
const selectedListItems = Arr.map(Selection.getSelectedListItems(editor), Element.fromDom);
|
||||
|
||||
return Options.lift2(
|
||||
Arr.find(selectedListItems, Fun.not(hasFirstChildList)),
|
||||
Arr.find(Arr.reverse(selectedListItems), Fun.not(hasFirstChildList)),
|
||||
(start, end) => ({ start, end }));
|
||||
};
|
||||
|
||||
const listIndentation = (editor: Editor, lists: Element[], indentation: Indentation) => {
|
||||
const entrySets: EntrySet[] = parseLists(lists, getItemSelection(editor));
|
||||
|
||||
Arr.each(entrySets, (entrySet) => {
|
||||
indentSelectedEntries(entrySet.entries, indentation);
|
||||
const composedLists = composeEntries(editor, entrySet.entries);
|
||||
Arr.each(composedLists, (composedList) => {
|
||||
fireListEvent(editor, indentation === Indentation.Indent ? ListAction.IndentList : ListAction.OutdentList, composedList.dom());
|
||||
});
|
||||
InsertAll.before(entrySet.sourceList, composedLists);
|
||||
Remove.remove(entrySet.sourceList);
|
||||
});
|
||||
};
|
||||
|
||||
export { listIndentation };
|
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Arr, Option } from '@ephox/katamari';
|
||||
import { Entry } from './Entry';
|
||||
|
||||
const cloneListProperties = (target: Entry, source: Entry): void => {
|
||||
target.listType = source.listType;
|
||||
target.listAttributes = { ...source.listAttributes };
|
||||
};
|
||||
|
||||
// Closest entry above in the same list
|
||||
const previousSiblingEntry = (entries: Entry[], start: number): Option<Entry> => {
|
||||
const depth = entries[start].depth;
|
||||
for (let i = start - 1; i >= 0; i--) {
|
||||
if (entries[i].depth === depth) {
|
||||
return Option.some(entries[i]);
|
||||
}
|
||||
if (entries[i].depth < depth) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Option.none();
|
||||
};
|
||||
|
||||
const normalizeEntries = (entries: Entry[]): void => {
|
||||
Arr.each(entries, (entry, i) => {
|
||||
previousSiblingEntry(entries, i).each((matchingEntry) => {
|
||||
cloneListProperties(entry, matchingEntry);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
export {
|
||||
normalizeEntries
|
||||
};
|
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
|
||||
import { Arr, Cell, Option } from '@ephox/katamari';
|
||||
import { Compare, Element, Traverse } from '@ephox/sugar';
|
||||
import { createEntry, Entry } from './Entry';
|
||||
import { isList } from './Util';
|
||||
|
||||
type Parser = (depth: number, itemSelection: Option<ItemSelection>, selectionState: Cell<boolean>, element: Element) => Entry[];
|
||||
|
||||
export interface ItemSelection {
|
||||
start: Element;
|
||||
end: Element;
|
||||
}
|
||||
|
||||
export interface EntrySet {
|
||||
entries: Entry[];
|
||||
sourceList: Element;
|
||||
}
|
||||
|
||||
const parseItem: Parser = (depth: number, itemSelection: Option<ItemSelection>, selectionState: Cell<boolean>, item: Element): Entry[] => {
|
||||
return Traverse.firstChild(item).filter(isList).fold(() => {
|
||||
|
||||
// Update selectionState (start)
|
||||
itemSelection.each((selection) => {
|
||||
if (Compare.eq(selection.start, item)) {
|
||||
selectionState.set(true);
|
||||
}
|
||||
});
|
||||
|
||||
const currentItemEntry = createEntry(item, depth, selectionState.get());
|
||||
|
||||
// Update selectionState (end)
|
||||
itemSelection.each((selection) => {
|
||||
if (Compare.eq(selection.end, item)) {
|
||||
selectionState.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
const childListEntries: Entry[] = Traverse.lastChild(item)
|
||||
.filter(isList)
|
||||
.map((list) => parseList(depth, itemSelection, selectionState, list))
|
||||
.getOr([]);
|
||||
|
||||
return currentItemEntry.toArray().concat(childListEntries);
|
||||
}, (list) => parseList(depth, itemSelection, selectionState, list));
|
||||
};
|
||||
|
||||
const parseList: Parser = (depth: number, itemSelection: Option<ItemSelection>, selectionState: Cell<boolean>, list: Element): Entry[] => {
|
||||
return Arr.bind(Traverse.children(list), (element) => {
|
||||
const parser = isList(element) ? parseList : parseItem;
|
||||
const newDepth = depth + 1;
|
||||
return parser(newDepth, itemSelection, selectionState, element);
|
||||
});
|
||||
};
|
||||
|
||||
const parseLists = (lists: Element[], itemSelection: Option<ItemSelection>): EntrySet[] => {
|
||||
const selectionState = Cell(false);
|
||||
const initialDepth = 0;
|
||||
|
||||
return Arr.map(lists, (list) => ({
|
||||
sourceList: list,
|
||||
entries: parseList(initialDepth, itemSelection, selectionState, list)
|
||||
}));
|
||||
};
|
||||
|
||||
export { parseLists };
|