mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-09-22 00:20:47 +02:00
Compare commits
709 commits
5f0f4e3ba6
...
2570a971a2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2570a971a2 | ||
![]() |
a4f025a2c2 | ||
![]() |
4d07212fee | ||
![]() |
877e2c4334 | ||
![]() |
1017610ec8 | ||
![]() |
92447342b6 | ||
![]() |
7b995fd16c | ||
![]() |
b332574217 | ||
![]() |
3182f7abb8 | ||
![]() |
ca9427cc82 | ||
![]() |
e775d0b5f8 | ||
![]() |
2535a64ff1 | ||
![]() |
b2ad366da3 | ||
![]() |
bc08148dab | ||
![]() |
79a7f4e8e9 | ||
![]() |
838f3977db | ||
![]() |
210e44ec12 | ||
![]() |
0a729d7c1b | ||
![]() |
29ac895046 | ||
![]() |
55541f62b0 | ||
![]() |
8ccb1e4143 | ||
![]() |
662aaa6458 | ||
![]() |
86018c5f49 | ||
![]() |
e4f0e02177 | ||
![]() |
34360fb9e3 | ||
![]() |
8895613f8b | ||
![]() |
d0f350d215 | ||
![]() |
7e6752a8fb | ||
![]() |
1f3c3a53b4 | ||
![]() |
f92074f386 | ||
![]() |
58585356d6 | ||
![]() |
568cdb2f1b | ||
![]() |
7c23daab06 | ||
![]() |
e2d9010fca | ||
![]() |
39f965dca0 | ||
![]() |
b3ea067792 | ||
![]() |
72c9887439 | ||
![]() |
a26dc51b21 | ||
![]() |
202ccfa5cf | ||
![]() |
014ecca54c | ||
![]() |
af3220f241 | ||
![]() |
4a5237dbd0 | ||
![]() |
9457d55d14 | ||
![]() |
8889235bea | ||
![]() |
eb13c34fe5 | ||
![]() |
f3cc641005 | ||
![]() |
be5bf8978d | ||
![]() |
7300a4849c | ||
![]() |
7206fc107d | ||
![]() |
b715625d89 | ||
![]() |
28067deffa | ||
![]() |
ef5236e0b1 | ||
![]() |
161dd7eb2a | ||
![]() |
04fc8cfa97 | ||
![]() |
e98bb0a2d4 | ||
![]() |
1503363a7c | ||
![]() |
17924377ec | ||
![]() |
eb578a3d9d | ||
![]() |
3fafe0a1b6 | ||
![]() |
a5ca8efcae | ||
![]() |
77c1aa49b3 | ||
![]() |
e7eb62e660 | ||
![]() |
fb9f0f9a35 | ||
![]() |
91a9b27789 | ||
![]() |
9eec8510b7 | ||
![]() |
6b8bd6e8f2 | ||
![]() |
7d9c120a86 | ||
![]() |
920291d52b | ||
![]() |
39e2b7adf6 | ||
![]() |
e91b8e97f7 | ||
![]() |
d3e86ffcaa | ||
![]() |
ef643e60d7 | ||
![]() |
1b3e1b4efe | ||
![]() |
0a680d7d81 | ||
![]() |
8c9efebbe3 | ||
![]() |
73dce6c5c4 | ||
![]() |
fefb674fc0 | ||
![]() |
94f8fc5b71 | ||
![]() |
52fe742a8c | ||
![]() |
a475a77a3b | ||
![]() |
005ae241e9 | ||
![]() |
8aa8ad65f8 | ||
![]() |
c521a0f985 | ||
![]() |
cd7734ba91 | ||
![]() |
1e5f514225 | ||
![]() |
9d4ed40acd | ||
![]() |
ab32bb9027 | ||
![]() |
9993c2db4c | ||
![]() |
aa9e6fdf4c | ||
![]() |
c2075e6387 | ||
![]() |
9bb6f4d134 | ||
![]() |
ee95f9bf6f | ||
![]() |
eea13b713d | ||
![]() |
4beccf5b93 | ||
![]() |
ddec6c0820 | ||
![]() |
73300c8408 | ||
![]() |
b14f057a76 | ||
![]() |
8a6922b56f | ||
![]() |
c92240a085 | ||
![]() |
691ef04f62 | ||
![]() |
53c41561c8 | ||
![]() |
6007cf00b0 | ||
![]() |
00d80270a1 | ||
![]() |
ace97cbcf0 | ||
![]() |
0db4daf183 | ||
![]() |
e08004c59e | ||
![]() |
61d0e5a3d6 | ||
![]() |
312be8a019 | ||
![]() |
fa7ec5ab95 | ||
![]() |
365c1dfb19 | ||
![]() |
1d7a3abf28 | ||
![]() |
2058061bc3 | ||
![]() |
f4d11c59a2 | ||
![]() |
a857aaa11e | ||
![]() |
bd7e547ac0 | ||
![]() |
cd2b131dc9 | ||
![]() |
76266cac87 | ||
![]() |
980cf25745 | ||
![]() |
85800b8085 | ||
![]() |
be7ac73904 | ||
![]() |
1ce39eb85c | ||
![]() |
1fa16ccb86 | ||
![]() |
bc27681e38 | ||
![]() |
5077ed3b56 | ||
![]() |
4f073c85cd | ||
![]() |
c2ac34942b | ||
![]() |
e3df9ab316 | ||
![]() |
b6b5b20daa | ||
![]() |
83af400f65 | ||
![]() |
f8bccc2d9f | ||
![]() |
f74283f2a3 | ||
![]() |
9d7e0625ae | ||
![]() |
0e8d07ac4d | ||
![]() |
45c53b7da6 | ||
![]() |
4598e3237b | ||
![]() |
35de72f64d | ||
![]() |
4210dad5b0 | ||
![]() |
e451c1f60a | ||
![]() |
65fd1fafc9 | ||
![]() |
540fe7cfde | ||
![]() |
19c5a9952e | ||
![]() |
38e7992e1a | ||
![]() |
2c811c06d3 | ||
![]() |
aee4c64006 | ||
![]() |
e35b203201 | ||
![]() |
128b9d1f13 | ||
![]() |
3bd7c92710 | ||
![]() |
7a6cd95656 | ||
![]() |
b6df6b2cee | ||
![]() |
4a0c4506e8 | ||
![]() |
bbc788cfa5 | ||
![]() |
2899e3851d | ||
![]() |
e1fca0674d | ||
![]() |
8c3837deaa | ||
![]() |
bf3023ec48 | ||
![]() |
d1dc88c422 | ||
![]() |
a7ab91d509 | ||
![]() |
d4cc17c1c0 | ||
![]() |
089080c818 | ||
![]() |
f97dab787b | ||
![]() |
9ee427d567 | ||
![]() |
30bde33dd2 | ||
![]() |
93580cc27f | ||
![]() |
e746093a0f | ||
![]() |
8b21b8fd03 | ||
![]() |
c7c7bdb950 | ||
![]() |
6270d55fa3 | ||
![]() |
ed4cc1faf6 | ||
![]() |
7d91781e8c | ||
![]() |
599cf0cf46 | ||
![]() |
6803c6483e | ||
![]() |
557f4866d5 | ||
![]() |
916c00e714 | ||
![]() |
8934856d75 | ||
![]() |
752457b888 | ||
![]() |
aabb85d895 | ||
![]() |
6e6522d56a | ||
![]() |
f0f5b6a824 | ||
![]() |
1c3ebf7f75 | ||
![]() |
516d9aa52a | ||
![]() |
e7c90f4709 | ||
![]() |
ca59b5f64c | ||
![]() |
6e590f2733 | ||
![]() |
462469c490 | ||
![]() |
dc90d05086 | ||
![]() |
6564f0e138 | ||
![]() |
4cd439b771 | ||
![]() |
05f48e93d1 | ||
![]() |
4ec53db203 | ||
![]() |
ae9f936f81 | ||
![]() |
5a6b764ed4 | ||
![]() |
6a814abeb9 | ||
![]() |
eb7066ff3e | ||
![]() |
3dcda6b2e2 | ||
![]() |
91b12ef67f | ||
![]() |
ae54b3edc0 | ||
![]() |
69737d6c4b | ||
![]() |
2b3405fcca | ||
![]() |
1a6b80b5af | ||
![]() |
2ddff2a5d3 | ||
![]() |
1c6538bf97 | ||
![]() |
f084f3d34f | ||
![]() |
1b9b7e1c83 | ||
![]() |
699afec920 | ||
![]() |
dd3f5cfacf | ||
![]() |
f5468fead9 | ||
![]() |
57ac3a6687 | ||
![]() |
30b5473c76 | ||
![]() |
91207ba529 | ||
![]() |
04351d74bc | ||
![]() |
b78616382b | ||
![]() |
c9a68c7b1d | ||
![]() |
5e74bb89b9 | ||
![]() |
176308d7d2 | ||
![]() |
b78e2edfb8 | ||
![]() |
cd10072554 | ||
![]() |
1712d4be68 | ||
![]() |
c2d127d8f7 | ||
![]() |
8739ae5625 | ||
![]() |
c3a9b0f77b | ||
![]() |
085c72add5 | ||
![]() |
780a7decd8 | ||
![]() |
5efe525e3c | ||
![]() |
3e033079bd | ||
![]() |
8436c07a1a | ||
![]() |
3d1d0c6def | ||
![]() |
e0f1f789c3 | ||
![]() |
7595477257 | ||
![]() |
6a9eb455fc | ||
![]() |
d1b2309e4a | ||
![]() |
5abc9c31b0 | ||
![]() |
469d9e24db | ||
![]() |
bce519ae99 | ||
![]() |
c64214e754 | ||
![]() |
8a2aafcad4 | ||
![]() |
e4cb124ffd | ||
![]() |
e51e6d5662 | ||
![]() |
6a0c0f8e1e | ||
![]() |
d7c58357ea | ||
![]() |
de670dfa8a | ||
![]() |
6c3138b8bd | ||
![]() |
8d1693bd9b | ||
![]() |
db59bdf562 | ||
![]() |
34f1f6a3d4 | ||
![]() |
17b5e9acdc | ||
![]() |
418959d44a | ||
![]() |
68af39ba48 | ||
![]() |
dc39e18fc1 | ||
![]() |
e6a88e2ad2 | ||
![]() |
18377d0e9f | ||
![]() |
52cd7d0bfa | ||
![]() |
94d37ae47e | ||
![]() |
1b9013ed0e | ||
![]() |
be05b324d1 | ||
![]() |
0f48f94704 | ||
![]() |
83e6f5d664 | ||
![]() |
34b44dc558 | ||
![]() |
97f74ea172 | ||
![]() |
7f004877ca | ||
![]() |
8ba02f517c | ||
![]() |
ff077158dc | ||
![]() |
bcbd895303 | ||
![]() |
98a9635dd3 | ||
![]() |
b1c0365e56 | ||
![]() |
5becccc176 | ||
![]() |
7e11be9d25 | ||
![]() |
c9530ea1c2 | ||
![]() |
1136c1c493 | ||
![]() |
120b0c1e57 | ||
![]() |
e103b5c2f0 | ||
![]() |
1edd35029e | ||
![]() |
ec15f672c3 | ||
![]() |
a30f229ade | ||
![]() |
729fe0674f | ||
![]() |
9a9e3aaba3 | ||
![]() |
8ddac77915 | ||
![]() |
7b3ac79d78 | ||
![]() |
62dbc08b9a | ||
![]() |
52e748ef17 | ||
![]() |
135dd9889c | ||
![]() |
44831e464c | ||
![]() |
e290d2a3fc | ||
![]() |
fec603487b | ||
![]() |
2d774f1cef | ||
![]() |
c3cd7b96a0 | ||
![]() |
aeef9aef1d | ||
![]() |
7d5ef46fd4 | ||
![]() |
23c6843803 | ||
![]() |
c7745e3092 | ||
![]() |
f15aca19d7 | ||
![]() |
9e46eec911 | ||
![]() |
9fb2f55979 | ||
![]() |
bbe2001366 | ||
![]() |
e9afbb6931 | ||
![]() |
93fdc69bec | ||
![]() |
c3c467e3ee | ||
![]() |
1479cb6c00 | ||
![]() |
e871f4913f | ||
![]() |
31667b0964 | ||
![]() |
7b8d163723 | ||
![]() |
c640bfd91b | ||
![]() |
7ac0491a70 | ||
![]() |
ffafbae979 | ||
![]() |
d47417a903 | ||
![]() |
ac948ad3fb | ||
![]() |
a88d23f461 | ||
![]() |
93b5ca14c4 | ||
![]() |
ff29ab920b | ||
![]() |
7bd690ecec | ||
![]() |
334e80f8d5 | ||
![]() |
2f847b73ba | ||
![]() |
62fe52fa47 | ||
![]() |
8bcb5de0c3 | ||
![]() |
2d8b6c6edb | ||
![]() |
5a1c885e76 | ||
![]() |
a664fe7f07 | ||
![]() |
73b80d3c82 | ||
![]() |
ae3f6b906f | ||
![]() |
2b19d903b4 | ||
![]() |
35813e4b2a | ||
![]() |
9df352efdb | ||
![]() |
3de6b66f0c | ||
![]() |
1eb824ef8e | ||
![]() |
1247f6735b | ||
![]() |
548ae028cc | ||
![]() |
0220f38d94 | ||
![]() |
4154fd0150 | ||
![]() |
a0e98ea35d | ||
![]() |
0deda92cac | ||
![]() |
22ba714020 | ||
![]() |
fcd44f41da | ||
![]() |
ac37d580f6 | ||
![]() |
2cd76dc288 | ||
![]() |
7b358cfaa3 | ||
![]() |
de8eb72393 | ||
![]() |
aaf1d9896a | ||
![]() |
f2afd11a84 | ||
![]() |
86e4228a3c | ||
![]() |
2415c7a81c | ||
![]() |
f05a8b5d4e | ||
![]() |
97684b411a | ||
![]() |
207eb6b086 | ||
![]() |
9e72b8d91e | ||
![]() |
d75fac21aa | ||
![]() |
a31e79001e | ||
![]() |
7e7acf27cf | ||
![]() |
f0280bc537 | ||
![]() |
d7aa181eb9 | ||
![]() |
087d2522fe | ||
![]() |
7b1b36d3ab | ||
![]() |
51766ed0c0 | ||
![]() |
96346a94ad | ||
![]() |
c1682895ef | ||
![]() |
c6f91f09c6 | ||
![]() |
8754e8e5fd | ||
![]() |
7d478190bb | ||
![]() |
a9c2ae7351 | ||
![]() |
8ca9f119d0 | ||
![]() |
e6decd35cc | ||
![]() |
ca4a8fac64 | ||
![]() |
a783a3d26e | ||
![]() |
2f6b5861ec | ||
![]() |
5bd101e31b | ||
![]() |
3f9c7db2d3 | ||
![]() |
362e1536ba | ||
![]() |
6c88dcd087 | ||
![]() |
eba15bb41a | ||
![]() |
580ecd617d | ||
![]() |
7b3acc642c | ||
![]() |
a76c29f5c9 | ||
![]() |
e9b41d881c | ||
![]() |
02196ef3d1 | ||
![]() |
07bc33cac7 | ||
![]() |
7b95da0740 | ||
![]() |
41b8271c5d | ||
![]() |
ec7ca366ba | ||
![]() |
a01c44a03d | ||
![]() |
eb524b2e72 | ||
![]() |
72373ccff9 | ||
![]() |
36c7a99311 | ||
![]() |
e179a0a200 | ||
![]() |
5ad8b148a5 | ||
![]() |
30802ca97f | ||
![]() |
9f5f5e128b | ||
![]() |
90296016e3 | ||
![]() |
8b4e53d65d | ||
![]() |
eee43ae107 | ||
![]() |
694e84bcb4 | ||
![]() |
6f132842a7 | ||
![]() |
683ba32918 | ||
![]() |
b40f8c898a | ||
![]() |
dae0cd0608 | ||
![]() |
f5a36b9459 | ||
![]() |
a5166bea39 | ||
![]() |
851bc1750f | ||
![]() |
d3a3b5e7e4 | ||
![]() |
0309225ccc | ||
![]() |
634a211a7a | ||
![]() |
fc4938829f | ||
![]() |
0239128a29 | ||
![]() |
2c8d9757df | ||
![]() |
4855b522e3 | ||
![]() |
ffad6048fd | ||
![]() |
f56ef490b1 | ||
![]() |
99fca2f716 | ||
![]() |
c2c927ecc2 | ||
![]() |
1d8c020aa7 | ||
![]() |
fe6fae1cdb | ||
![]() |
aecd230a61 | ||
![]() |
2b4067df9a | ||
![]() |
a0fb8d694f | ||
![]() |
0bea81578f | ||
![]() |
4d78010ee5 | ||
![]() |
ac3f7e272f | ||
![]() |
3fda003401 | ||
![]() |
0d3a2479cb | ||
![]() |
3d9b0bfa6f | ||
![]() |
377f78ec66 | ||
![]() |
d86f20bcdb | ||
![]() |
f4ad69faa9 | ||
![]() |
10f31a9274 | ||
![]() |
b8c10bb718 | ||
![]() |
4a23e40561 | ||
![]() |
92265f95c9 | ||
![]() |
00d559f9d9 | ||
![]() |
f2dda8b389 | ||
![]() |
bc16cd658f | ||
![]() |
d67a041633 | ||
![]() |
f6694810e2 | ||
![]() |
511c174e65 | ||
![]() |
0b1cb34fea | ||
![]() |
05a78c7cea | ||
![]() |
d01dcad956 | ||
![]() |
6b79e543a4 | ||
![]() |
3d0068f3fb | ||
![]() |
d782689572 | ||
![]() |
fadd3c2120 | ||
![]() |
f4699c9fad | ||
![]() |
34647490f2 | ||
![]() |
6c0eed5d09 | ||
![]() |
3c6ce60525 | ||
![]() |
10f408513d | ||
![]() |
69068b0c78 | ||
![]() |
501f657f7c | ||
![]() |
6ce0cbb0cb | ||
![]() |
3b505a20f2 | ||
![]() |
8b383d09a5 | ||
![]() |
827eb214bf | ||
![]() |
e6243664a3 | ||
![]() |
b1f4443e5f | ||
![]() |
7ac5b0010d | ||
![]() |
e2114dffd8 | ||
![]() |
11f7ad6a70 | ||
![]() |
d3ec7aa4bb | ||
![]() |
8d593833ab | ||
![]() |
037619368a | ||
![]() |
3afaa2551e | ||
![]() |
9098b3f874 | ||
![]() |
5d4ef9890f | ||
![]() |
eeb0551230 | ||
![]() |
0ab9f5c5b0 | ||
![]() |
3f8777be96 | ||
![]() |
0e5e32126b | ||
![]() |
5690081332 | ||
![]() |
34e3dfe479 | ||
![]() |
1549bd3f9f | ||
![]() |
83800a7ff1 | ||
![]() |
ee957ff9e2 | ||
![]() |
35d60162d1 | ||
![]() |
adfbe0b452 | ||
![]() |
bf465e5bbf | ||
![]() |
3caeeaf29d | ||
![]() |
9c99c6f8ef | ||
![]() |
bb989bcb35 | ||
![]() |
2f01f3224d | ||
![]() |
dc765676aa | ||
![]() |
f17288d1ca | ||
![]() |
ae42686ad4 | ||
![]() |
7a80c48977 | ||
![]() |
aafae43a9f | ||
![]() |
1c8d1871dc | ||
![]() |
ed2898a942 | ||
![]() |
8e182e803c | ||
![]() |
ca6088ac36 | ||
![]() |
a717029b84 | ||
![]() |
d9a3d2b150 | ||
![]() |
5fbc57a55a | ||
![]() |
564117575a | ||
![]() |
d115103f10 | ||
![]() |
fedc074ade | ||
![]() |
25678e401f | ||
![]() |
432d8547cc | ||
![]() |
dba61a299c | ||
![]() |
eee6bd074c | ||
![]() |
46f81b93ed | ||
![]() |
f1bf15146a | ||
![]() |
95a5b46800 | ||
![]() |
ef80bbd230 | ||
![]() |
621bee1f14 | ||
![]() |
3b41b73367 | ||
![]() |
f1feaf603e | ||
![]() |
11d2741e68 | ||
![]() |
65a6145545 | ||
![]() |
deb781023a | ||
![]() |
b78ef33135 | ||
![]() |
8695d86cf1 | ||
![]() |
141c139782 | ||
![]() |
75ff695dc9 | ||
![]() |
2b9a2df233 | ||
![]() |
9a89a0eb4c | ||
![]() |
77ead023f8 | ||
![]() |
30dbbf1231 | ||
![]() |
561d4cc891 | ||
![]() |
be684aee76 | ||
![]() |
27f412658b | ||
![]() |
381a7b88ff | ||
![]() |
d0f2fd173d | ||
![]() |
a90df6841c | ||
![]() |
61bc821754 | ||
![]() |
b126d34dde | ||
![]() |
03b83d1247 | ||
![]() |
167cce0a05 | ||
![]() |
309a9995d8 | ||
![]() |
a088cf8706 | ||
![]() |
857a795189 | ||
![]() |
022a4e7d23 | ||
![]() |
08b952f272 | ||
![]() |
55bc708582 | ||
![]() |
16d3b65b2a | ||
![]() |
211648b95e | ||
![]() |
3d7191b13d | ||
![]() |
0203a482b3 | ||
![]() |
1b384980dc | ||
![]() |
ab92cbc184 | ||
![]() |
459a35d0b3 | ||
![]() |
e4959774e8 | ||
![]() |
de55ea9315 | ||
![]() |
9e7426a6f4 | ||
![]() |
2a07997ba2 | ||
![]() |
c222e0d6f7 | ||
![]() |
a105227e65 | ||
![]() |
7569fec509 | ||
![]() |
1fd3f92137 | ||
![]() |
9da208ec52 | ||
![]() |
2f57e57b92 | ||
![]() |
b358d4b70f | ||
![]() |
f0ff16c60a | ||
![]() |
692665f100 | ||
![]() |
78c3479fc3 | ||
![]() |
789aed4aee | ||
![]() |
842dbb6863 | ||
![]() |
48933e62f3 | ||
![]() |
009a68aa7e | ||
![]() |
2994969286 | ||
![]() |
449b537104 | ||
![]() |
4554182d87 | ||
![]() |
227802b83c | ||
![]() |
95dfaea666 | ||
![]() |
f44f9dd5c0 | ||
![]() |
feef48d624 | ||
![]() |
bf9721bf40 | ||
![]() |
ba3bf8705e | ||
![]() |
8dd1585adb | ||
![]() |
c64d68c71d | ||
![]() |
548857dc4b | ||
![]() |
287edba74c | ||
![]() |
b138ff9d7f | ||
![]() |
1b07033cd3 | ||
![]() |
e575324483 | ||
![]() |
a6f5705681 | ||
![]() |
1af2dba150 | ||
![]() |
99a5d4c214 | ||
![]() |
008cce474a | ||
![]() |
445a738e74 | ||
![]() |
89f32a43f7 | ||
![]() |
77fd025a04 | ||
![]() |
18c6e7bcdc | ||
![]() |
2ce3f00724 | ||
![]() |
1a918dd946 | ||
![]() |
df73431112 | ||
![]() |
10364e281f | ||
![]() |
f91e87b953 | ||
![]() |
62288da3d9 | ||
![]() |
fa2ec80cb1 | ||
![]() |
8dac657846 | ||
![]() |
f7cb4db291 | ||
![]() |
1812e84219 | ||
![]() |
05e495406d | ||
![]() |
446c81cf80 | ||
![]() |
36b2299206 | ||
![]() |
7906e8f516 | ||
![]() |
396450a2ec | ||
![]() |
155b2de260 | ||
![]() |
99cf987465 | ||
![]() |
f7d28dc1de | ||
![]() |
0816925e76 | ||
![]() |
49d233d92a | ||
![]() |
81644059ac | ||
![]() |
e758739116 | ||
![]() |
4694a8c6c1 | ||
![]() |
400153319e | ||
![]() |
75b2ccfe82 | ||
![]() |
4ccdd38de0 | ||
![]() |
425882cda0 | ||
![]() |
99ad5a0f77 | ||
![]() |
a9a453e144 | ||
![]() |
0f2e044c7e | ||
![]() |
9a72ef1472 | ||
![]() |
08af24ae9e | ||
![]() |
f970f5c848 | ||
![]() |
15a17393b3 | ||
![]() |
cf0467a7ac | ||
![]() |
e91a8b0619 | ||
![]() |
d0662b5fde | ||
![]() |
ff539bab03 | ||
![]() |
21acf690e7 | ||
![]() |
6d7637850a | ||
![]() |
fd89e77f37 | ||
![]() |
9e819955ef | ||
![]() |
cd7c6fdb17 | ||
![]() |
48c64f98f4 | ||
![]() |
cff71aa720 | ||
![]() |
759c12be06 | ||
![]() |
fc67bcc9e8 | ||
![]() |
ccbcb4b809 | ||
![]() |
7308536ded | ||
![]() |
de8da071d0 | ||
![]() |
a9f5cac024 | ||
![]() |
33d25372f7 | ||
![]() |
cf6c905930 | ||
![]() |
3cb666d397 | ||
![]() |
d555eec852 | ||
![]() |
7c692e8273 | ||
![]() |
9d392bd663 | ||
![]() |
7476372054 | ||
![]() |
3e0d825437 | ||
![]() |
19485ca720 | ||
![]() |
829fc886d4 | ||
![]() |
7136967a73 | ||
![]() |
ed302633f6 | ||
![]() |
9ea5b148c7 | ||
![]() |
e1471ff585 | ||
![]() |
a76a520996 | ||
![]() |
04587ca695 | ||
![]() |
ddb20a368d | ||
![]() |
e492c973ac | ||
![]() |
f1f363d77b | ||
![]() |
3c0933beac | ||
![]() |
59d8db4f24 | ||
![]() |
9cf009d9d9 | ||
![]() |
2eadefed6f | ||
![]() |
cbbca634f5 | ||
![]() |
49dd247b8a | ||
![]() |
01a2e07dcc | ||
![]() |
45aee043c8 | ||
![]() |
da5f4bb42c | ||
![]() |
382cd6a8af | ||
![]() |
70d4af6e7c | ||
![]() |
5f91cffc4d | ||
![]() |
582cce1b92 | ||
![]() |
70741fffcc | ||
![]() |
7787ac6e1d | ||
![]() |
b15489a4cf | ||
![]() |
0e8ce9ddf9 | ||
![]() |
e7a8a9906e | ||
![]() |
06139eb3cc | ||
![]() |
33a1bedb41 | ||
![]() |
49cc87381c | ||
![]() |
526bd76c4c | ||
![]() |
0c0d02c6a6 | ||
![]() |
8cb40edce3 | ||
![]() |
acc2ba1cea | ||
![]() |
9ae527c9a5 | ||
![]() |
917a5125af | ||
![]() |
262957d4de | ||
![]() |
f3427dcf5f | ||
![]() |
accf89a5ca | ||
![]() |
c726af0494 | ||
![]() |
94c70ae638 | ||
![]() |
ddba6b1fd8 | ||
![]() |
cbddce4d25 | ||
![]() |
0d5320f08b | ||
![]() |
9d4c47ee87 | ||
![]() |
c5bfa68058 | ||
![]() |
0abbe9ec21 | ||
![]() |
61d08370dc | ||
![]() |
2c5ea4bb45 | ||
![]() |
0d3978f407 | ||
![]() |
546742b43c | ||
![]() |
9480403d2f | ||
![]() |
bfc0daf6e5 | ||
![]() |
c339d1b9bc | ||
![]() |
10fa284a1b | ||
![]() |
10a760b97a | ||
![]() |
684286fc8a | ||
![]() |
54f2d8599e | ||
![]() |
fc2e1030a5 | ||
![]() |
abcd7b3157 | ||
![]() |
81b511042c | ||
![]() |
a89a2000f3 | ||
![]() |
534ad7a8cf | ||
![]() |
be3db79688 | ||
![]() |
963cbfe15f | ||
![]() |
508eb93183 | ||
![]() |
c88f99646c | ||
![]() |
a730a575d5 | ||
![]() |
76e1a4b169 | ||
![]() |
69987028ae | ||
![]() |
76e4aad584 |
198 changed files with 12135 additions and 8229 deletions
8
.github/CONTRIBUTING.md
vendored
8
.github/CONTRIBUTING.md
vendored
|
@ -7,17 +7,17 @@
|
|||
|
||||
## NPM dependencies
|
||||
|
||||
Install pnpm: `npm install -g pnpm@10.13.1`
|
||||
Install pnpm: `npm install -g pnpm@10.15.0`
|
||||
|
||||
<details>
|
||||
<summary>For China mainland</summary>
|
||||
|
||||
Set the Electron mirror environment variable and install Electron:
|
||||
|
||||
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.2.3 -D`
|
||||
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.3.1 -D`
|
||||
* Windows:
|
||||
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
||||
* `pnpm install electron@37.2.3 -D`
|
||||
* `pnpm install electron@37.3.1 -D`
|
||||
|
||||
NPM mirror:
|
||||
|
||||
|
@ -27,7 +27,7 @@ NPM mirror:
|
|||
|
||||
Enter the app folder and execute:
|
||||
|
||||
* `pnpm install electron@37.2.3 -D`
|
||||
* `pnpm install electron@37.3.1 -D`
|
||||
* `pnpm run dev`
|
||||
* `pnpm run start`
|
||||
|
||||
|
|
8
.github/CONTRIBUTING_zh_CN.md
vendored
8
.github/CONTRIBUTING_zh_CN.md
vendored
|
@ -7,17 +7,17 @@
|
|||
|
||||
## NPM 依赖
|
||||
|
||||
安装 pnpm:`npm install -g pnpm@10.13.1`
|
||||
安装 pnpm:`npm install -g pnpm@10.15.0`
|
||||
|
||||
<details>
|
||||
<summary>适用于中国大陆</summary>
|
||||
|
||||
设置 Electron 镜像环境变量并安装 Electron:
|
||||
|
||||
* macOS/Linux:`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.2.3 -D`
|
||||
* macOS/Linux:`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.3.1 -D`
|
||||
* Windows:
|
||||
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
||||
* `pnpm install electron@37.2.3 -D`
|
||||
* `pnpm install electron@37.3.1 -D`
|
||||
|
||||
NPM 镜像:
|
||||
|
||||
|
@ -27,7 +27,7 @@ NPM 镜像:
|
|||
|
||||
进入 app 文件夹执行:
|
||||
|
||||
* `pnpm install electron@37.2.3 -D`
|
||||
* `pnpm install electron@37.3.1 -D`
|
||||
* `pnpm run dev`
|
||||
* `pnpm run start`
|
||||
|
||||
|
|
2
API.md
2
API.md
|
@ -480,7 +480,7 @@ Move documents by `id`:
|
|||
```
|
||||
|
||||
* `fromIDs`: Source docs' IDs
|
||||
* `toID`: Target parent ID
|
||||
* `toID`: Target parent doc's ID or notebook ID
|
||||
* Return value
|
||||
|
||||
```json
|
||||
|
|
|
@ -478,7 +478,7 @@
|
|||
```
|
||||
|
||||
* `fromIDs`:源文档 ID
|
||||
* `toID`:目标父文档 ID
|
||||
* `toID`:目标父文档 ID 或笔记本 ID
|
||||
* 返回值
|
||||
|
||||
```json
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "تحسين الفهرس",
|
||||
"vacuumDataIndexTip": "تحقق من فهرس البيانات، وحرر مساحة التخزين وحسّن أداء الفهرس",
|
||||
"rebuildDataIndex": "إعادة بناء الفهرس",
|
||||
"rebuildDataIndexTip": "إعادة بناء كاملة لفهرس البيانات، قد يستغرق ذلك بعض الوقت، يرجى الانتظار",
|
||||
"displayFieldName": "عرض اسم الحقل",
|
||||
"sortBySelectOption": "Nach Option sortieren",
|
||||
"groupStep": "فاصل التجميع",
|
||||
"groupRange": "نطاق التجميع",
|
||||
"groupMethodDateRelative": "تاريخ نسبي",
|
||||
"groupMethodDateDay": "يوم",
|
||||
"groupMethodDateWeek": "أسبوع",
|
||||
"groupMethodDateMonth": "شهر",
|
||||
"groupMethodDateYear": "سنة",
|
||||
"syncColWidth": "مزامنة عرض العمود",
|
||||
"groupMethod": "طريقة التجميع",
|
||||
"hideEmptyGroup": "إخفاء المجموعة الفارغة",
|
||||
"hideEmptyGroup": "إخفاء المجموعات الفارغة",
|
||||
"groups": "المجموعات",
|
||||
"removeGroup": "إزالة المجموعة",
|
||||
"contentBlock": "كتلة المحتوى",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "صغير",
|
||||
"fitImage": "تعديل حجم الصورة تلقائيًا",
|
||||
"showIcon": "عرض الأيقونة",
|
||||
"showAllFieldsIcon": "عرض أيقونات الحقول",
|
||||
"showAllEntriesIcons": "عرض أيقونات المدخلات",
|
||||
"wrapAllFields": "التفاف الحقول تلقائيًا",
|
||||
"gallery": "بطاقة",
|
||||
"newTag": "علامة جديدة",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "وقت المراجعة الأخيرة",
|
||||
"cardStatus": "وضع البطاقة",
|
||||
"noSupportTip": "لا تدعم هذه الوظيفة استخدام طواقم البطاقات",
|
||||
"insertRowTip": "تم تصفية المدخلات المضافة حديثا ويمكن مشاهدتها عن طريق إلغاء التصفية/البحث/الفرز",
|
||||
"insertRowTip": "تم تصفية العنصر الجديد، قم بإلغاء التصفية أو تعديل إعدادات التجميع لعرضه",
|
||||
"insertPhoto": "التقاط صورة وإدراجها",
|
||||
"relativeToToday": "بالنسبة إلى اليوم",
|
||||
"current": "هذا/هذه",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "مفتاح API",
|
||||
"apiKeyTip": "من المستحسن تعيين مفتاح API لـSiYuan بشكل منفصل للإدارة اللاحقة. إذا ترك هذا البند فارغاً، سيتم تعطيل الوظائف المتصلة بـAI",
|
||||
"apiTimeout": "المهلة الزمنية",
|
||||
"apiTimeoutTip": "المهلة الزمنية لتقديم طلب، الوحدة: ثانية",
|
||||
"apiTimeoutTip": "مهلة الطلب",
|
||||
"apiProxy": "وكيل الشبكة",
|
||||
"apiProxyTip": "وكيل الشبكة الذي يبدأ الطلب، مثل <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "الطراز",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "بعد التمكين، تم عرض شريط التنقل في الكتل المضمنة؛ تم مجاهلة هذا الخيار عند شريط التنقل للكتل المضمنة في الكتل الخارقة ولا يظهر أبداً",
|
||||
"appearanceMode": "وضع المظهر",
|
||||
"editReadonly": "وضع القراءة فقط",
|
||||
"editReadonlyTip": "بعد التمكين، سيقوم المحرر بتحميل المستند في وضع القراءة فقط",
|
||||
"editReadonlyTip": "عند التمكين، سيكون المستند للقراءة فقط افتراضيًا",
|
||||
"generateConflictDoc": "توليد مستندات التعارض عند ظهور تضاربات المزامنة",
|
||||
"generateConflictDocTip": "بعد التمكين، سيتم إنشاء مستندات التعارض عند حدوث تضاربات المزامنة، بحيث يمكن فتحها وعرضها مباشرة. سيتم تسجيل مستندات التعارض في [تاريخ البيانات] سواء تمكين هذا الخيار أو عدم تمكينه",
|
||||
"deleteOpConfirm": "⚠️ تأكيد عملية حذف",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "سيؤدي مسح مستودع البيانات إلى حذف جميع اللقطات غير المرجعية وعناصر البيانات ذات الصلة، هل أنت متأكد من المسح؟",
|
||||
"purge": "مسح",
|
||||
"plsChoose": "الرجاء الاختيار أولاً",
|
||||
"clearMessage": "مقروء",
|
||||
"freeSub": "الاشتراك التجريبي المجاني",
|
||||
"sortByUpdateTimeDesc": "تنازلياً بوقت التحديث",
|
||||
"sortByUpdateTimeAsc": "تصاعدياً بوقت التحديث",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "ولبعض نظم التشغيل قيود تقنية قد تحول دون النسخ اليدوي لبيانات مساحة العمل بعد وضع مستندات فرعية تزيد عن 7 مستويات",
|
||||
"fileTree20": "حفظ بسطر واحد",
|
||||
"fileTree21": "بعد التمكين، سيتم استخدام تنسيق JSON ذي السطر الواحد عند حفظ مستندات .sy وقاعدة بيانات .json، مما يقلل حجم الملف بحوالي 30٪ وتحسين كفاءة القراءة والكتابة بنسبة 50٪",
|
||||
"fileTree22": "تنبيه ملف كبير",
|
||||
"fileTree23": "إشعار عند تجاوز ملفات .sy أو قاعدة بيانات .json لهذا الحجم",
|
||||
"export10": "على سبيل المثال <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>، إذا كان فارغاً، سيتم استخدام العلامة المائية من النص المخصص أو مسار ملف العلامة المائية.",
|
||||
"export11": "طريقة معالجة محتوى المراجع عند التصدير",
|
||||
"export12": "طريقة معالجة محتوى كتلة التضمين عند التصدير",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "الرجاء فتح دفتر الملاحظات أولاً",
|
||||
"copyBlockRef": "نسخ كمرجع كتلة",
|
||||
"copyBlockEmbed": "نسخ ككتلة تضمين",
|
||||
"copyMarkdown": "نسخ كـ Markdown",
|
||||
"linkLevel": "العمق",
|
||||
"mark": "تمييز",
|
||||
"splitLR": "تقسيم لليمين",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "اليوم",
|
||||
"262": "غدًا",
|
||||
"263": "التالي %d أيام",
|
||||
"264": "الحقل [%s] فارغ"
|
||||
"264": "الحقل [%s] فارغ",
|
||||
"265": "خارج النطاق",
|
||||
"266": "Tesseract OCR غير مثبت أو غير مهيأ، يرجى الرجوع إلى دليل المستخدم - قسم ملفات الموارد لإجراء الإعداد",
|
||||
"267": "قاعدة بيانات غير مسماة",
|
||||
"268": "يرجى ملاحظة أن الملف [%s] قد تجاوز بالفعل [%d MB]، وقد يؤدي ذلك إلى انخفاض الأداء",
|
||||
"269": "تمت إضافة هذا المقطع بالفعل إلى قاعدة البيانات [%s]",
|
||||
"270": "يتم تحسين فهرس البيانات، يرجى الانتظار...",
|
||||
"271": "اكتملت عملية تحسين فهرس البيانات، تم تحرير [%s] من مساحة القرص"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Index optimieren",
|
||||
"vacuumDataIndexTip": "Datenindex prüfen, Speicherplatz freigeben und Indexleistung verbessern",
|
||||
"rebuildDataIndex": "Index neu erstellen",
|
||||
"rebuildDataIndexTip": "Kompletter Neuaufbau des Datenindex, dies kann einige Zeit dauern. Bitte warten",
|
||||
"displayFieldName": "Feldnamen anzeigen",
|
||||
"sortBySelectOption": "Nach Option sortieren",
|
||||
"groupStep": "Gruppierungsintervall",
|
||||
"groupRange": "Gruppierungsbereich",
|
||||
"groupMethodDateRelative": "Relatives Datum",
|
||||
"groupMethodDateDay": "Tag",
|
||||
"groupMethodDateWeek": "Woche",
|
||||
"groupMethodDateMonth": "Monat",
|
||||
"groupMethodDateYear": "Jahr",
|
||||
"syncColWidth": "Spaltenbreite synchronisieren",
|
||||
"groupMethod": "Gruppierungsmethode",
|
||||
"hideEmptyGroup": "Leere Gruppe ausblenden",
|
||||
"hideEmptyGroup": "Leere Gruppen ausblenden",
|
||||
"groups": "Gruppen",
|
||||
"removeGroup": "Gruppe entfernen",
|
||||
"contentBlock": "Inhaltsblock",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Klein",
|
||||
"fitImage": "Bildgröße automatisch anpassen",
|
||||
"showIcon": "Symbol anzeigen",
|
||||
"showAllFieldsIcon": "Feldsymbole anzeigen",
|
||||
"showAllEntriesIcons": "Eintragssymbole anzeigen",
|
||||
"wrapAllFields": "Felder automatisch umbrechen",
|
||||
"gallery": "Karte",
|
||||
"newTag": "Neuer Tag",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Letzte Überprüfungszeit",
|
||||
"cardStatus": "Kartenstatus",
|
||||
"noSupportTip": "Diese Funktion unterstützt die Verwendung von Kartenstapeln nicht.",
|
||||
"insertRowTip": "Die neu hinzugefügten Reihen wurden gefiltert und können eingesehen werden, indem das Filtern/Suchen/Sortieren aufgehoben wird.",
|
||||
"insertRowTip": "Das neue Element wurde gefiltert, heben Sie die Filterung auf oder passen Sie die Gruppierungseinstellungen an, um es anzuzeigen",
|
||||
"insertPhoto": "Foto aufnehmen und einfügen",
|
||||
"relativeToToday": "Bezogen auf heute",
|
||||
"current": "Aktuell",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "API-Schlüssel",
|
||||
"apiKeyTip": "Es wird empfohlen, einen API-Schlüssel getrennt für SiYuan zuzuweisen, um eine spätere Verwaltung zu ermöglichen. Wenn dieses Feld leer bleibt, werden AI-bezogene Funktionen deaktiviert.",
|
||||
"apiTimeout": "Timeout",
|
||||
"apiTimeoutTip": "Der Timeout-Zeitraum für die Initiierung einer Anfrage, Einheit: Sekunde",
|
||||
"apiTimeoutTip": "Der Timeout-Zeitraum für die Initiierung einer Anfrage",
|
||||
"apiProxy": "Netzwerk-Proxy",
|
||||
"apiProxyTip": "Der Netzwerkproxy, der die Anfrage initiiert, z. B. <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Modell",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "Nach der Aktivierung zeigen eingebettete Blöcke Breadcrumbs an, eingebettete Blöcke in Superblöcken ignorieren diese Option und zeigen niemals Breadcrumbs.",
|
||||
"appearanceMode": "Darstellungsmodus",
|
||||
"editReadonly": "Schreibgeschützter Modus",
|
||||
"editReadonlyTip": "Nach der Aktivierung wird das Dokument im schreibgeschützten Modus geladen.",
|
||||
"editReadonlyTip": "Nach der Aktivierung ist das Dokument standardmäßig schreibgeschützt.",
|
||||
"generateConflictDoc": "Konfliktdokument generieren, wenn Synchronisationskonflikte auftreten.",
|
||||
"generateConflictDocTip": "Nach der Aktivierung wird ein Konfliktdokument generiert, wenn ein Synchronisationskonflikt auftritt, sodass es direkt geöffnet und angezeigt werden kann. Egal ob aktiviert oder nicht, die [Datenhistorie] wird das Konfliktdokument aufzeichnen.",
|
||||
"deleteOpConfirm": "⚠️ Bestätigung der Löschoperation",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "Das Bereinigen des Daten-Repo löscht alle nicht referenzierten Schnappschüsse und zugehörigen Datenobjekte vollständig. Sind Sie sicher, dass Sie bereinigen möchten?",
|
||||
"purge": "Bereinigen",
|
||||
"plsChoose": "Bitte zuerst auswählen",
|
||||
"clearMessage": "Lesen",
|
||||
"freeSub": "Kostenlose Testversion",
|
||||
"sortByUpdateTimeDesc": "Absteigend nach Aktualisierungszeit",
|
||||
"sortByUpdateTimeAsc": "Aufsteigend nach Aktualisierungszeit",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Einige Betriebssysteme haben technische Einschränkungen, die das manuelle Kopieren von Arbeitsbereichsdaten nach der Erstellung von Unterdokumenten mit mehr als 7 Ebenen verhindern können",
|
||||
"fileTree20": "Speichern mit einer einzigen Zeile",
|
||||
"fileTree21": "Nach der Aktivierung wird beim Speichern von .sy-Dokumenten und Datenbank-.json-Dateien das Einzeilige JSON-Format verwendet, was die Dateigröße um etwa 30 % reduzieren und die Lese- und Schreibgeschwindigkeit um 50 % verbessern kann",
|
||||
"fileTree22": "Großdatei-Warnung",
|
||||
"fileTree23": "Benachrichtigen, wenn .sy-Dateien oder die Datenbank .json diese Größe überschreiten",
|
||||
"export10": "Beispiel <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, wenn leer, verwenden Sie Wasserzeichentext oder den Pfad zur Wasserzeichen-Datei.",
|
||||
"export11": "Inhaltsbehandlungsverfahren des Inhaltsreferenzblocks beim Exportieren",
|
||||
"export12": "Inhaltsbehandlungsverfahren des Inhalteinbettungsblocks beim Exportieren",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Bitte öffnen Sie zuerst ein Notizbuch",
|
||||
"copyBlockRef": "Blockreferenz kopieren",
|
||||
"copyBlockEmbed": "Blockeinbettung kopieren",
|
||||
"copyMarkdown": "Als Markdown kopieren",
|
||||
"linkLevel": "Tiefe",
|
||||
"mark": "Markieren",
|
||||
"splitLR": "Rechts aufteilen",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Heute",
|
||||
"262": "Morgen",
|
||||
"263": "Nächste %d Tage",
|
||||
"264": "Das Feld [%s] ist leer"
|
||||
"264": "Das Feld [%s] ist leer",
|
||||
"265": "Außerhalb des Bereichs",
|
||||
"266": "Tesseract OCR ist nicht installiert oder konfiguriert, bitte lesen Sie das Benutzerhandbuch - Abschnitt Ressourcen-Dateien zur Konfiguration",
|
||||
"267": "Unbenannte Datenbank",
|
||||
"268": "Bitte beachten Sie, dass die Datei [%s] bereits [%d MB] überschritten hat, was die Leistung beeinträchtigen kann",
|
||||
"269": "Dieser Block wurde bereits zur Datenbank [%s] hinzugefügt",
|
||||
"270": "Datenindex wird optimiert, bitte warten...",
|
||||
"271": "Datenindex-Optimierung abgeschlossen, [%s] Speicherplatz freigegeben"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optimize Index",
|
||||
"vacuumDataIndexTip": "Check data index, free up storage, and improve index performance",
|
||||
"rebuildDataIndex": "Rebuild Index",
|
||||
"rebuildDataIndexTip": "Fully rebuild the data index, which may take some time. Please wait",
|
||||
"displayFieldName": "Display field name",
|
||||
"sortBySelectOption": "Sort by option",
|
||||
"groupStep": "Group interval",
|
||||
"groupRange": "Group range",
|
||||
"groupMethodDateRelative": "Relative date",
|
||||
"groupMethodDateDay": "Day",
|
||||
"groupMethodDateWeek": "Week",
|
||||
"groupMethodDateMonth": "Month",
|
||||
"groupMethodDateYear": "Year",
|
||||
"syncColWidth": "Sync column width",
|
||||
"groupMethod": "Grouping method",
|
||||
"hideEmptyGroup": "Hide empty group",
|
||||
"hideEmptyGroup": "Hide empty groups",
|
||||
"groups": "Groups",
|
||||
"removeGroup": "Remove group",
|
||||
"contentBlock": "Content block",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Small",
|
||||
"fitImage": "Auto-fit image size",
|
||||
"showIcon": "Show icon",
|
||||
"showAllFieldsIcon": "Show field icons",
|
||||
"showAllEntriesIcons": "Show entry icons",
|
||||
"wrapAllFields": "Auto-wrap fields",
|
||||
"gallery": "Card",
|
||||
"newTag": "New tag",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Last review time",
|
||||
"cardStatus": "Card status",
|
||||
"noSupportTip": "This function does not support the use of card decks",
|
||||
"insertRowTip": "The newly added entries have been filtered and can be viewed by canceling filtering/searching/sorting",
|
||||
"insertRowTip": "The new item has been filtered, cancel the filter or adjust the grouping settings to view it",
|
||||
"insertPhoto": "Take a photo and insert it",
|
||||
"relativeToToday": "Relative to today",
|
||||
"current": "This",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "API Key",
|
||||
"apiKeyTip": "It is recommended to assign an API Key to SiYuan separately for subsequent management. If this item is left blank, AI-related functions will be disabled",
|
||||
"apiTimeout": "Timeout",
|
||||
"apiTimeoutTip": "The timeout period for initiating a request, unit: second",
|
||||
"apiTimeoutTip": "The timeout period for initiating a request",
|
||||
"apiProxy": "Network Proxy",
|
||||
"apiProxyTip": "The network proxy that initiates the request, such as <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Model",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "When enabled, embed blocks will display breadcrumbs, embed blocks in super blocks ignore this option and never show breadcrumbs",
|
||||
"appearanceMode": "Appearance Mode",
|
||||
"editReadonly": "Read-only mode",
|
||||
"editReadonlyTip": "When enabled, the editor will load the document in read-only mode",
|
||||
"editReadonlyTip": "When enabled, the document will be read-only by default",
|
||||
"generateConflictDoc": "Generate conflict documentation when syncing conflicts",
|
||||
"generateConflictDocTip": "When enabled, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the [Data History] will record the conflict document",
|
||||
"deleteOpConfirm": "⚠️ Delete operation confirmation",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "Purging the data repo will completely delete all unreferenced snapshots and related data objects, are you sure to purge?",
|
||||
"purge": "Purge",
|
||||
"plsChoose": "Please choose first",
|
||||
"clearMessage": "Read",
|
||||
"freeSub": "Free Trial Subscription",
|
||||
"sortByUpdateTimeDesc": "Descending by update time",
|
||||
"sortByUpdateTimeAsc": "Ascending by update time",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Some operating systems have technical limitations that may prevent manual copying of workspace data after creating sub-documents greater than 7 levels",
|
||||
"fileTree20": "Save with a single line",
|
||||
"fileTree21": "When enabled, the single-line JSON format will be used when saving .sy docs and database .json files, which can reduce the file size by about 30% and improve read and write efficiency by 50%",
|
||||
"fileTree22": "Large File Warning",
|
||||
"fileTree23": "Notify when .sy files or database .json exceed this size",
|
||||
"export10": "For example <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, if empty, use watermark text or watermark file path.",
|
||||
"export11": "Content handling method of content ref block when exporting",
|
||||
"export12": "Content handling method of content embed block when exporting",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Please open a notebook first",
|
||||
"copyBlockRef": "Copy block ref",
|
||||
"copyBlockEmbed": "Copy block embed",
|
||||
"copyMarkdown": "Copy as Markdown",
|
||||
"linkLevel": "Depth",
|
||||
"mark": "Mark",
|
||||
"splitLR": "Split Right",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Today",
|
||||
"262": "Tomorrow",
|
||||
"263": "Next %d days",
|
||||
"264": "Field [%s] is empty"
|
||||
"264": "Field [%s] is empty",
|
||||
"265": "Out of range",
|
||||
"266": "Tesseract OCR is not installed or configured, please refer to the User Guide - Assets section for configuration",
|
||||
"267": "Unnamed database",
|
||||
"268": "Please note that the file [%s] has already exceeded [%d MB], which may cause performance degradation",
|
||||
"269": "This block has already been added to the database [%s]",
|
||||
"270": "Optimizing data index, please wait...",
|
||||
"271": "Data index optimization completed, [%s] disk space freed"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optimizar índice",
|
||||
"vacuumDataIndexTip": "Verifique el índice de datos, libere espacio y mejore el rendimiento del índice",
|
||||
"rebuildDataIndex": "Reconstruir índice",
|
||||
"rebuildDataIndexTip": "Reconstrucción completa del índice de datos, puede tardar, por favor espere",
|
||||
"displayFieldName": "Mostrar nombre de campo",
|
||||
"sortBySelectOption": "Ordenar por opción",
|
||||
"groupStep": "Intervalo de agrupación",
|
||||
"groupRange": "Rango de agrupación",
|
||||
"groupMethodDateRelative": "Fecha relativa",
|
||||
"groupMethodDateDay": "Día",
|
||||
"groupMethodDateWeek": "Semana",
|
||||
"groupMethodDateMonth": "Mes",
|
||||
"groupMethodDateYear": "Año",
|
||||
"syncColWidth": "Sincronizar ancho de columna",
|
||||
"groupMethod": "Método de agrupación",
|
||||
"hideEmptyGroup": "Ocultar grupo vacío",
|
||||
"hideEmptyGroup": "Ocultar grupos vacíos",
|
||||
"groups": "Grupos",
|
||||
"removeGroup": "Eliminar grupo",
|
||||
"contentBlock": "Bloque de contenido",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Pequeño",
|
||||
"fitImage": "Ajustar automáticamente el tamaño de la imagen",
|
||||
"showIcon": "Mostrar ícono",
|
||||
"showAllFieldsIcon": "Mostrar íconos de campos",
|
||||
"showAllEntriesIcons": "Mostrar íconos de entradas",
|
||||
"wrapAllFields": "Ajuste automático de campos",
|
||||
"gallery": "Tarjeta",
|
||||
"newTag": "Nueva etiqueta",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Última hora de revisión",
|
||||
"cardStatus": "Estado de la tarjeta",
|
||||
"noSupportTip": "Esta función no admite el uso de paquetes de tarjetas",
|
||||
"insertRowTip": "Las filas recién agregadas se han filtrado y se pueden ver cancelando el filtrado/búsqueda/clasificación",
|
||||
"insertRowTip": "El nuevo elemento ha sido filtrado, cancele el filtro o ajuste la configuración de agrupación para verlo",
|
||||
"insertPhoto": "Toma una foto e insértala",
|
||||
"relativeToToday": "Relativa a hoy",
|
||||
"current": "Esto",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "Clave API",
|
||||
"apiKeyTip": "Se recomienda asignar una clave API a SiYuan por separado para su posterior administración. Si este elemento se deja en blanco, las funciones relacionadas con la IA se desactivarán",
|
||||
"apiTimeout": "Tiempo de espera",
|
||||
"apiTimeoutTip": "El tiempo de espera para iniciar una solicitud, unidad: segundo",
|
||||
"apiTimeoutTip": "El tiempo de espera para iniciar una solicitud",
|
||||
"apiProxy": "Proxy web",
|
||||
"apiProxyTip": "El proxy de red que inicia la solicitud, como <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Modelo",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "Después de habilitar los bloques incrustados, se mostrarán migas de pan, incrustar bloques en superbloques ignora esta opción y nunca muestra migas de pan",
|
||||
"appearanceMode": "Modo de apariencia",
|
||||
"editReadonly": "Modo de solo lectura",
|
||||
"editReadonlyTip": "Después de habilitarlo, el editor cargará el documento en modo de solo lectura",
|
||||
"editReadonlyTip": "Después de habilitarlo, el documento será de solo lectura por defecto",
|
||||
"generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos",
|
||||
"generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el [Historial de datos] registrará el documento de conflicto",
|
||||
"deleteOpConfirm": "⚠️ Confirmación de operación de eliminación",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"purge": "Purgar",
|
||||
"dataRepoPurgeTip": "Purga todas las instantáneas sin referencia y los objetos de datos relacionados",
|
||||
"plsChoose": "Por favor, elija primero",
|
||||
"clearMessage": "Leer",
|
||||
"freeSub": "Suscripción de prueba gratuita",
|
||||
"sortByUpdateTimeDesc": "Descendente por tiempo de actualización",
|
||||
"sortByUpdateTimeAsc": "Ascendente por tiempo de actualización",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Algunos sistemas operativos tienen limitaciones técnicas que pueden impedir la copia manual de los datos del espacio de trabajo después de crear subdocumentos de más de 7 niveles",
|
||||
"fileTree20": "Guardar con una sola línea",
|
||||
"fileTree21": "Después de habilitarlo, se utilizará el formato JSON de una sola línea al guardar documentos .sy y archivos .json de bases de datos, lo que puede reducir el tamaño del archivo en aproximadamente un 30 % y mejorar la eficiencia de lectura y escritura en un 50 %.",
|
||||
"fileTree22": "Aviso de archivo grande",
|
||||
"fileTree23": "Notificar cuando los archivos .sy o la base de datos .json superen este tamaño",
|
||||
"export10": "Por ejemplo <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, si está vacío, utilice texto de marca de agua o ruta del archivo de marca de agua.",
|
||||
"export11": "Método de manejo de contenido del bloque de referencia de contenido al exportar",
|
||||
"export12": "Método de manejo de contenido del bloque de incrustación de contenido al exportar",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Por favor, abra primero un cuaderno de notas",
|
||||
"copyBlockRef": "Copiar bloque referencia",
|
||||
"copyBlockEmbed": "Copiar bloque incrustado",
|
||||
"copyMarkdown": "Copiar como Markdown",
|
||||
"linkLevel": "Profundidad",
|
||||
"mark": "Marca",
|
||||
"splitLR": "Dividir a la derecha",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Hoy",
|
||||
"262": "Mañana",
|
||||
"263": "Próximos %d días",
|
||||
"264": "El campo [%s] está vacío"
|
||||
"264": "El campo [%s] está vacío",
|
||||
"265": "Fuera de rango",
|
||||
"266": "Tesseract OCR no está instalado o configurado, consulte la Guía del Usuario - Sección de archivos de recursos para la configuración",
|
||||
"267": "Base de datos sin nombre",
|
||||
"268": "Atención: el archivo [%s] ya ha superado los [%d MB], lo que puede causar una disminución del rendimiento",
|
||||
"269": "Este bloque ya ha sido añadido a la base de datos [%s]",
|
||||
"270": "Optimizando el índice de datos, por favor espere...",
|
||||
"271": "Optimización del índice de datos completada, se liberaron [%s] de espacio en disco"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optimiser l’index",
|
||||
"vacuumDataIndexTip": "Vérifiez l’index des données, libérez de l’espace et améliorez les performances de l’index",
|
||||
"rebuildDataIndex": "Reconstruire l’index",
|
||||
"rebuildDataIndexTip": "Reconstruction complète de l’index des données, cela peut prendre du temps, veuillez patienter",
|
||||
"displayFieldName": "Afficher le nom du champ",
|
||||
"sortBySelectOption": "Trier par option",
|
||||
"groupStep": "Intervalle de regroupement",
|
||||
"groupRange": "Plage de regroupement",
|
||||
"groupMethodDateRelative": "Date relative",
|
||||
"groupMethodDateDay": "Jour",
|
||||
"groupMethodDateWeek": "Semaine",
|
||||
"groupMethodDateMonth": "Mois",
|
||||
"groupMethodDateYear": "Année",
|
||||
"syncColWidth": "Synchroniser la largeur de la colonne",
|
||||
"groupMethod": "Méthode de regroupement",
|
||||
"hideEmptyGroup": "Masquer le groupe vide",
|
||||
"hideEmptyGroup": "Masquer les groupes vides",
|
||||
"groups": "Groupes",
|
||||
"removeGroup": "Supprimer le groupe",
|
||||
"contentBlock": "Bloc de contenu",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Petit",
|
||||
"fitImage": "Ajuster automatiquement la taille de l'image",
|
||||
"showIcon": "Afficher l'icône",
|
||||
"showAllFieldsIcon": "Afficher les icônes des champs",
|
||||
"showAllEntriesIcons": "Afficher les icônes des entrées",
|
||||
"wrapAllFields": "Retour automatique des champs",
|
||||
"gallery": "Carte",
|
||||
"newTag": "Nouvelle étiquette",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Heure de la dernière révision",
|
||||
"cardStatus": "Statut de la carte",
|
||||
"noSupportTip": "Cette fonction ne prend pas en charge l'utilisation de packages de cartes",
|
||||
"insertRowTip": "Les lignes nouvellement ajoutées ont été filtrées et peuvent être visualisées en annulant le filtrage/recherche/tri",
|
||||
"insertRowTip": "Le nouvel élément a été filtré, annulez le filtre ou ajustez les paramètres de regroupement pour le voir",
|
||||
"insertPhoto": "Prendre une photo et l'insérer",
|
||||
"relativeToToday": "Par rapport à aujourd'hui",
|
||||
"current": "Ceci",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "Clé API",
|
||||
"apiKeyTip": "Il est recommandé d'attribuer une clé API à SiYuan séparément pour une gestion ultérieure. Si cet élément est laissé vide, les fonctions liées à l'IA seront désactivées",
|
||||
"apiTimeout": "Délai d'expiration",
|
||||
"apiTimeoutTip": "Le délai d'attente pour lancer une requête, unité : seconde",
|
||||
"apiTimeoutTip": "Le délai d'attente pour lancer une requête",
|
||||
"apiProxy": "Proxy Web",
|
||||
"apiProxyTip": "Le proxy réseau qui lance la requête, tel que <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Modelo",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "Après avoir activé l'intégration, les blocs afficheront le fil d'Ariane, intégrer des blocs dans des super blocs ignorent cette option et n'affichent jamais le fil d'Ariane",
|
||||
"appearanceMode": "Mode d'apparence",
|
||||
"editReadonly": "Mode lecture seule",
|
||||
"editReadonlyTip": "Lorsqu'il est activé, l'éditeur charge le document en mode lecture seule",
|
||||
"editReadonlyTip": "Lorsqu'il est activé, le document sera en lecture seule par défaut",
|
||||
"generateConflictDoc": "Générer une documentation sur les conflits lors de la synchronisation des conflits",
|
||||
"generateConflictDocTip": "Lorsqu'il est activé, un document de conflit sera généré lorsqu'un conflit de synchronisation se produit, afin qu'il puisse être ouvert et visualisé directement. Qu'il soit activé ou non, l'historique des données enregistrera le document de conflit",
|
||||
"deleteOpConfirm": "⚠️ Supprimer la confirmation de l'opération",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "La purge du référentiel de données supprimera complètement tous les instantanés non référencés et les objets de données associés, êtes-vous sûr de purger ?",
|
||||
"purge": "Purger",
|
||||
"plsChoose": "Veuillez d'abord choisir",
|
||||
"clearMessage": "Lire",
|
||||
"freeSub": "Abonnement d'essai gratuit",
|
||||
"sortByUpdateTimeDesc": "Descendant par heure de mise à jour",
|
||||
"sortByUpdateTimeAsc": "Croissant par heure de mise à jour",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Certains systèmes d'exploitation ont des limitations techniques qui peuvent empêcher la copie manuelle des données de l'espace de travail après la création de sous-documents supérieurs à 7 niveaux",
|
||||
"fileTree20": "Enregistrer avec une seule ligne",
|
||||
"fileTree21": "Après activation, le format JSON sur une seule ligne sera utilisé lors de l'enregistrement des documents .sy et des fichiers .json de base de données, ce qui peut réduire la taille du fichier d'environ 30 % et améliorer l'efficacité de lecture et d'écriture de 50 %",
|
||||
"fileTree22": "Alerte de fichier volumineux",
|
||||
"fileTree23": "Notifier lorsque les fichiers .sy ou la base de données .json dépassent cette taille",
|
||||
"export10": "Par exemple <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, s'il est vide, utilisez le texte du filigrane ou le chemin du fichier du filigrane.",
|
||||
"export11": "Traitement du contenu des blocs de référence lors de l'exportation",
|
||||
"export12": "Gestion du contenu des blocs intégrés lors de l'exportation",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Veuillez d'abord ouvrir un carnet de notes",
|
||||
"copyBlockRef": "Copier bloc réf",
|
||||
"copyBlockEmbed": "Copier le bloc en tant que bloc incorporé",
|
||||
"copyMarkdown": "Copier comme Markdown",
|
||||
"linkLevel": "Niveaux",
|
||||
"mark": "Mark",
|
||||
"splitLR": "Split Droit",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Aujourd'hui",
|
||||
"262": "Demain",
|
||||
"263": "Les %d prochains jours",
|
||||
"264": "Le champ [%s] est vide"
|
||||
"264": "Le champ [%s] est vide",
|
||||
"265": "Hors de portée",
|
||||
"266": "Tesseract OCR n'est pas installé ou configuré, veuillez consulter le Guide de l'utilisateur - Section des fichiers de ressources pour la configuration",
|
||||
"267": "Base de données sans nom",
|
||||
"268": "Attention : le fichier [%s] a déjà dépassé [%d MB], ce qui peut entraîner une baisse des performances",
|
||||
"269": "Ce bloc a déjà été ajouté à la base de données [%s]",
|
||||
"270": "Optimisation de l’index des données en cours, veuillez patienter...",
|
||||
"271": "Optimisation de l’index des données terminée, [%s] d’espace disque libéré"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "אופטימיזציית אינדקס",
|
||||
"vacuumDataIndexTip": "בדוק את אינדקס הנתונים, שחרר שטח אחסון ושפר את ביצועי האינדקס",
|
||||
"rebuildDataIndex": "בנה מחדש את האינדקס",
|
||||
"rebuildDataIndexTip": "בנייה מחדש מלאה של אינדקס הנתונים, עשוי להימשך זמן, נא להמתין",
|
||||
"displayFieldName": "הצג שם שדה",
|
||||
"sortBySelectOption": "מיין לפי אפשרות",
|
||||
"groupStep": "מרווח קיבוץ",
|
||||
"groupRange": "טווח קיבוץ",
|
||||
"groupMethodDateRelative": "תאריך יחסי",
|
||||
"groupMethodDateDay": "יום",
|
||||
"groupMethodDateWeek": "שבוע",
|
||||
"groupMethodDateMonth": "חודש",
|
||||
"groupMethodDateYear": "שנה",
|
||||
"syncColWidth": "סנכרון רוחב עמודה",
|
||||
"groupMethod": "שיטת קיבוץ",
|
||||
"hideEmptyGroup": "הסתר קבוצה ריקה",
|
||||
"hideEmptyGroup": "הסתר קבוצות ריקות",
|
||||
"groups": "קבוצות",
|
||||
"removeGroup": "הסר קבוצה",
|
||||
"contentBlock": "בלוק תוכן",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "קטן",
|
||||
"fitImage": "התאמה אוטומטית לגודל התמונה",
|
||||
"showIcon": "הצג סמל",
|
||||
"showAllFieldsIcon": "הצג סמלי שדות",
|
||||
"showAllEntriesIcons": "הצג סמלי כניסות",
|
||||
"wrapAllFields": "עטיפת שדות אוטומטית",
|
||||
"gallery": "כרטיס",
|
||||
"newTag": "תג חדש",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "זמן הסקירה האחרון",
|
||||
"cardStatus": "סטטוס כרטיס",
|
||||
"noSupportTip": "תכונה זו אינה תומכת בשימוש בערימות כרטיסים",
|
||||
"insertRowTip": "השורות שנוספו חדשות סוננו וניתן לראותן על ידי ביטול סינון/חיפוש/מיון",
|
||||
"insertRowTip": "הפריט החדש סונן, בטל את הסינון או שנה את הגדרות הקיבוץ לצפייה",
|
||||
"insertPhoto": "צלם תמונה והכנס אותה",
|
||||
"relativeToToday": "יחסי להיום",
|
||||
"current": "זה",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "מפתח API",
|
||||
"apiKeyTip": "מומלץ להקצות מפתח API לסִייוּן בנפרד לשם ניהול מאוחר יותר. אם פריט זה נשאר ריק, הפונקציות הקשורות ל-AI יידחו",
|
||||
"apiTimeout": "זמן החזרה",
|
||||
"apiTimeoutTip": "תקופת הזמן ליזום בקשה, יחידה: שנייה",
|
||||
"apiTimeoutTip": "הבקשה פגה",
|
||||
"apiProxy": "פרוקסי רשת",
|
||||
"apiProxyTip": "הפרוקסי רשת המוזמן, כמו <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "מודל",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "לאחר הפעולה, בלוקים מוטמעים יראו נתיב, בלוקים מוטמעים בבלוקים עליוניים מתעלמים מהאפשרות הזו ולא יראו נתיבים",
|
||||
"appearanceMode": "מצב מראה",
|
||||
"editReadonly": "מצב קריאה בלבד",
|
||||
"editReadonlyTip": "לאחר ההפעלה, העורך יטען את המסמך במצב קריאה בלבד",
|
||||
"editReadonlyTip": "כאשר מופעל, המסמך יהיה לקריאה בלבד כברירת מחדל",
|
||||
"generateConflictDoc": "צור תיעוד שהוקסם כאשר נוצרו סכסוכים",
|
||||
"generateConflictDocTip": "לאחר ההפעלה, תיעוד סכסוך ייווצר כאשר מתהווה סכסוך סנכרון, כך שהוא יכול להיפתח ולהיות נצפה ישירות. בין אם מופעל ובין אם לא, היסטוריית הנתונים תקלוט את תיעוד הסכסוך",
|
||||
"deleteOpConfirm": "⚠️ אישור פעולה מחיקה",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "ניקוי מאגר הנתונים ימחק לחלוטין את כל הצילומים הלא מתייחסים ואת האוביקטים הנתונים הקשורים, האם אתה בטוח לבצע ניקוי?",
|
||||
"purge": "נקה",
|
||||
"plsChoose": "אנא בחר קודם",
|
||||
"clearMessage": "קרא",
|
||||
"freeSub": "מנוי ניסיון חינם",
|
||||
"sortByUpdateTimeDesc": "יורד לפי זמן עדכון",
|
||||
"sortByUpdateTimeAsc": "עולה לפי זמן עדכון",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "חלק ממערכות ההפעלה יש הגבלות טכניות שעלולות למנוע העתקה ידנית של נתוני החלל העבודה לאחר יצירת תתי מסמכים גדולים מ-7 רמות",
|
||||
"fileTree20": "שמור בשורה אחת",
|
||||
"fileTree21": "לאחר הפעלת אפשרות זו, פורמט ה-JSON בשורה אחת ישמש בעת שמירת קבצי .sy ומסדי נתונים .json, מה שיכול להפחית את גודל הקובץ בכ-30% ולשפר את יעילות הקריאה והכתיבה ב-50%",
|
||||
"fileTree22": "התראה על קובץ גדול",
|
||||
"fileTree23": "הצג התראה כאשר קובץ .sy או מסד נתונים .json חורג מגודל זה",
|
||||
"export10": "למשל <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, אם ריק, השתמש בטקסט סימן מים או בנתיב קובץ סימן מים.",
|
||||
"export11": "שיטת טיפול תוכן של בלוק תוכן בעת הייצוא",
|
||||
"export12": "שיטת טיפול תוכן של בלוק הטמעה בעת הייצוא",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "אנא פתח מחברת קודם",
|
||||
"copyBlockRef": "העתק הפניה לבלוק",
|
||||
"copyBlockEmbed": "העתק הטמעה לבלוק",
|
||||
"copyMarkdown": "העתק כ-Markdown",
|
||||
"linkLevel": "עומק",
|
||||
"mark": "סמן",
|
||||
"splitLR": "חלק ימינה",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "היום",
|
||||
"262": "מחר",
|
||||
"263": "ה-%d ימים הבאים",
|
||||
"264": "השדה [%s] ריק"
|
||||
"264": "השדה [%s] ריק",
|
||||
"265": "מחוץ לטווח",
|
||||
"266": "Tesseract OCR לא הותקן או הוגדר, אנא עיין במדריך למשתמש - פרק קבצי משאבים לצורך הגדרה",
|
||||
"267": "מסד נתונים ללא שם",
|
||||
"268": "שים לב שהקובץ [%s] כבר חרג מ-[%d MB], דבר שעלול לגרום לירידה בביצועים",
|
||||
"269": "הבלוק נוסף כבר למסד הנתונים [%s]",
|
||||
"270": "מתבצעת אופטימיזציה של אינדקס הנתונים, נא להמתין...",
|
||||
"271": "אופטימיזציית אינדקס הנתונים הושלמה, שוחררו [%s] שטח דיסק"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Ottimizza indice",
|
||||
"vacuumDataIndexTip": "Verifica l'indice dei dati, libera spazio e migliora le prestazioni dell'indice",
|
||||
"rebuildDataIndex": "Ricostruisci indice",
|
||||
"rebuildDataIndexTip": "Ricostruzione completa dell'indice dei dati, potrebbe richiedere tempo, attendere prego",
|
||||
"displayFieldName": "Mostra nome campo",
|
||||
"sortBySelectOption": "Ordina per opzione",
|
||||
"groupStep": "Intervallo di raggruppamento",
|
||||
"groupRange": "Intervallo di gruppo",
|
||||
"groupMethodDateRelative": "Data relativa",
|
||||
"groupMethodDateDay": "Giorno",
|
||||
"groupMethodDateWeek": "Settimana",
|
||||
"groupMethodDateMonth": "Mese",
|
||||
"groupMethodDateYear": "Anno",
|
||||
"syncColWidth": "Sincronizza larghezza colonna",
|
||||
"groupMethod": "Metodo di raggruppamento",
|
||||
"hideEmptyGroup": "Nascondi gruppo vuoto",
|
||||
"hideEmptyGroup": "Nascondi gruppi vuoti",
|
||||
"groups": "Gruppi",
|
||||
"removeGroup": "Rimuovi gruppo",
|
||||
"contentBlock": "Blocco di contenuto",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Piccolo",
|
||||
"fitImage": "Adatta automaticamente la dimensione dell'immagine",
|
||||
"showIcon": "Mostra icona",
|
||||
"showAllFieldsIcon": "Mostra icone dei campi",
|
||||
"showAllEntriesIcons": "Mostra icone delle voci",
|
||||
"wrapAllFields": "Avvolgi automaticamente i campi",
|
||||
"gallery": "Scheda",
|
||||
"newTag": "Nuova etichetta",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Ultima revisione",
|
||||
"cardStatus": "Stato della carta",
|
||||
"noSupportTip": "Questa funzione non supporta l'uso di mazzi di carte",
|
||||
"insertRowTip": "L'elemento aggiunto è stato filtrato, è possibile annullare filtro/ricerca/ordinamento per visualizzarlo",
|
||||
"insertRowTip": "Il nuovo elemento è stato filtrato, annulla il filtro o modifica le impostazioni di raggruppamento per visualizzarlo",
|
||||
"insertPhoto": "Scatta una foto e inseriscila",
|
||||
"relativeToToday": "Relativo a oggi",
|
||||
"current": "Questo",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "Chiave API",
|
||||
"apiKeyTip": "Si consiglia di assegnare una chiave API separata a SiYuan per una successiva gestione. Se questo campo è lasciato vuoto, le funzioni relative all'AI saranno disabilitate",
|
||||
"apiTimeout": "Timeout",
|
||||
"apiTimeoutTip": "Il periodo di timeout per l'invio di una richiesta, unità: secondi",
|
||||
"apiTimeoutTip": "Il periodo di timeout per l'invio di una richiesta",
|
||||
"apiProxy": "Proxy di rete",
|
||||
"apiProxyTip": "Il proxy di rete che avvia la richiesta, ad esempio <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Modello",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "Dopo l'abilitazione, i blocchi incorporati mostreranno i breadcrumb. I blocchi incorporati nei super blocchi ignorano questa opzione e non mostreranno mai breadcrumb",
|
||||
"appearanceMode": "Modalità aspetto",
|
||||
"editReadonly": "Modalità di sola lettura",
|
||||
"editReadonlyTip": "Dopo l'abilitazione, l'editor caricherà il documento in modalità di sola lettura",
|
||||
"editReadonlyTip": "Quando abilitato, il documento sarà in sola lettura per impostazione predefinita",
|
||||
"generateConflictDoc": "Genera documento di conflitto quando si verificano conflitti di sincronizzazione",
|
||||
"generateConflictDocTip": "Dopo l'abilitazione, verrà generato un documento di conflitto quando si verifica un conflitto di sincronizzazione, in modo che possa essere aperto e visualizzato direttamente. Sia che sia abilitato o meno, la [Cronologia dati] registrerà il documento di conflitto",
|
||||
"deleteOpConfirm": "⚠️ Conferma operazione di eliminazione",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "La pulizia del repository dei dati eliminerà completamente tutti gli snapshot non referenziati e gli oggetti dati correlati, sei sicuro di voler pulire?",
|
||||
"purge": "Pulisci",
|
||||
"plsChoose": "Si prega di scegliere prima",
|
||||
"clearMessage": "Segna come letto",
|
||||
"freeSub": "Prova gratuita",
|
||||
"sortByUpdateTimeDesc": "Discendente per ora di aggiornamento",
|
||||
"sortByUpdateTimeAsc": "Ascendente per ora di aggiornamento",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Alcuni sistemi operativi hanno limitazioni tecniche che possono impedire la copia manuale dei dati dell'area di lavoro dopo la creazione di sotto-documenti superiori a 7 livelli",
|
||||
"fileTree20": "Salva con una singola riga",
|
||||
"fileTree21": "Dopo l'abilitazione, il formato JSON a riga singola verrà utilizzato quando si salvano documenti .sy e file di database .json, il che può ridurre le dimensioni del file del 30% circa e migliorare l'efficienza di lettura e scrittura del 50%",
|
||||
"fileTree22": "Avviso file di grandi dimensioni",
|
||||
"fileTree23": "Notifica quando i file .sy e il database .json superano questa dimensione",
|
||||
"export10": "Ad esempio <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, se vuoto, utilizza il testo della filigrana o il percorso del file della filigrana.",
|
||||
"export11": "Metodo di gestione del contenuto del blocco di riferimento durante l'esportazione",
|
||||
"export12": "Metodo di gestione del contenuto del blocco incorporato durante l'esportazione",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Si prega di aprire prima un taccuino",
|
||||
"copyBlockRef": "Copia riferimento blocco",
|
||||
"copyBlockEmbed": "Copia incorporamento blocco",
|
||||
"copyMarkdown": "Copia come Markdown",
|
||||
"linkLevel": "Profondità",
|
||||
"mark": "Segna",
|
||||
"splitLR": "Dividi a destra",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Oggi",
|
||||
"262": "Domani",
|
||||
"263": "Prossimi %d giorni",
|
||||
"264": "Il campo [%s] è vuoto"
|
||||
"264": "Il campo [%s] è vuoto",
|
||||
"265": "Fuori intervallo",
|
||||
"266": "Tesseract OCR non è installato o configurato, fare riferimento alla Guida utente - Sezione file di risorse per la configurazione",
|
||||
"267": "Database senza nome",
|
||||
"268": "Attenzione: il file [%s] ha già superato [%d MB], il che potrebbe causare un calo delle prestazioni",
|
||||
"269": "Questo blocco è già stato aggiunto al database [%s]",
|
||||
"270": "Ottimizzazione dell'indice dei dati in corso, attendere prego...",
|
||||
"271": "Ottimizzazione dell'indice dei dati completata, liberati [%s] di spazio su disco"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "インデックスの最適化",
|
||||
"vacuumDataIndexTip": "データインデックスを検証し、ストレージを解放してインデックス性能を向上させます",
|
||||
"rebuildDataIndex": "インデックスの再構築",
|
||||
"rebuildDataIndexTip": "データインデックスを完全に再構築します。時間がかかる場合がありますのでお待ちください",
|
||||
"displayFieldName": "フィールド名を表示",
|
||||
"sortBySelectOption": "オプションで並べ替え",
|
||||
"groupStep": "グループ間隔",
|
||||
"groupRange": "グループ範囲",
|
||||
"groupMethodDateRelative": "相対日付",
|
||||
"groupMethodDateDay": "日",
|
||||
"groupMethodDateWeek": "週",
|
||||
"groupMethodDateMonth": "月",
|
||||
"groupMethodDateYear": "年",
|
||||
"syncColWidth": "列幅を同期",
|
||||
"groupMethod": "グループ方法",
|
||||
"hideEmptyGroup": "空のグループを隠す",
|
||||
"hideEmptyGroup": "空のグループを非表示",
|
||||
"groups": "グループ",
|
||||
"removeGroup": "グループを削除",
|
||||
"contentBlock": "コンテンツブロック",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "小",
|
||||
"fitImage": "画像サイズを自動調整",
|
||||
"showIcon": "アイコンを表示",
|
||||
"showAllFieldsIcon": "フィールドアイコンを表示",
|
||||
"showAllEntriesIcons": "エントリアイコンを表示",
|
||||
"wrapAllFields": "フィールドを自動折り返し",
|
||||
"gallery": "カード",
|
||||
"newTag": "新しいタグ",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "最後の復習時間",
|
||||
"cardStatus": "カードの状態",
|
||||
"noSupportTip": "この機能はカードデッキの使用をサポートしていません",
|
||||
"insertRowTip": "新しく追加された行はフィルタリングされており、フィルタリング/検索/並べ替えを解除すると表示されます",
|
||||
"insertRowTip": "新しい項目はフィルタリングされています。フィルタリングまたはグループ設定を解除して確認してください",
|
||||
"insertPhoto": "画像を挿入",
|
||||
"relativeToToday": "今日からの相対的な期間",
|
||||
"current": "現在",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "API キー",
|
||||
"apiKeyTip": "以降の管理のために SiYuan に API キーを個別に割り当てることをお勧めします。この項目を空白のままにすると AI 関連機能が無効になります",
|
||||
"apiTimeout": "タイムアウト",
|
||||
"apiTimeoutTip": "リクエストのタイムアウト時間 (単位: 秒)",
|
||||
"apiTimeoutTip": "リクエストのタイムアウト時間",
|
||||
"apiProxy": "ネットワークプロキシ",
|
||||
"apiProxyTip": "リクエストを開始するネットワークプロキシ (例: <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>)",
|
||||
"apiModel": "モデル",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "埋め込みブロックにパンくずリストを表示します<br>この設定にかかわらずスーパーブロック内の埋め込みブロックは常にパンくずリストが表示されません",
|
||||
"appearanceMode": "表示モード",
|
||||
"editReadonly": "読み取り専用モード",
|
||||
"editReadonlyTip": "エディタが読み取り専用モードでドキュメントを読み込みます",
|
||||
"editReadonlyTip": "有効にすると、ドキュメントはデフォルトで読み取り専用になります",
|
||||
"generateConflictDoc": "同期の競合時に競合ドキュメントを生成する",
|
||||
"generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらず [データ履歴] には競合ドキュメントが記録されます",
|
||||
"deleteOpConfirm": "⚠️ 削除操作の確認",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "データリポジトリを消去すると、参照されていないすべてのスナップショットと関連するデータオブジェクトが完全に削除されます。消去してもよろしいですか?",
|
||||
"purge": "消去",
|
||||
"plsChoose": "最初にノートを選択してください",
|
||||
"clearMessage": "既読",
|
||||
"freeSub": "無料体験版",
|
||||
"sortByUpdateTimeDesc": "更新時間 (降順)",
|
||||
"sortByUpdateTimeAsc": "更新時間 (昇順)",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "一部のオペレーティングシステムでは、7レベルより深いサブドキュメントにワークスペースデータの手動コピーができない場合があります",
|
||||
"fileTree20": "一行で保存",
|
||||
"fileTree21": "ドキュメントとデータベースファイルを保存する際に改行を行わない JSON フォーマットを使用します。これによりファイルサイズが約 30% 削減され、読み書きの効率が 50% 向上します",
|
||||
"fileTree22": "大きなファイルの警告",
|
||||
"fileTree23": ".sy ドキュメントやデータベース .json がこのサイズを超えると通知します",
|
||||
"export10": "例: <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code><br>空の場合は透かしテキストまたは透かし画像ファイルのパスを使用します",
|
||||
"export11": "エクスポート時のブロック参照コンテンツの処理方法",
|
||||
"export12": "エクスポート時の埋め込みブロックコンテンツの処理方法",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "最初にノートブックを開いてください",
|
||||
"copyBlockRef": "ブロック参照としてコピー",
|
||||
"copyBlockEmbed": "埋め込みブロックとしてコピー",
|
||||
"copyMarkdown": "Markdown としてコピー",
|
||||
"linkLevel": "深さ",
|
||||
"mark": "ハイライト",
|
||||
"splitLR": "右に分割",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "今日",
|
||||
"262": "明日",
|
||||
"263": "次の %d 日間",
|
||||
"264": "フィールド [%s] の値が空です"
|
||||
"264": "フィールド [%s] が空です",
|
||||
"265": "範囲外",
|
||||
"266": "Tesseract OCR がインストールされていないか、設定されていません。ユーザーガイド - リソースファイルセクションを参照して設定してください",
|
||||
"267": "未命名のデータベース",
|
||||
"268": "ファイル [%s] はすでに [%d MB] を超えており、パフォーマンスが低下する可能性があります",
|
||||
"269": "このブロックはすでにデータベース [%s] に追加されています",
|
||||
"270": "データインデックスを最適化しています。しばらくお待ちください...",
|
||||
"271": "データインデックスの最適化が完了しました。合計 [%s] のディスク容量が解放されました"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optymalizuj indeks",
|
||||
"vacuumDataIndexTip": "Sprawdź indeks danych, zwolnij miejsce i popraw wydajność indeksu",
|
||||
"rebuildDataIndex": "Odbuduj indeks",
|
||||
"rebuildDataIndexTip": "Pełna odbudowa indeksu danych, może to potrwać, proszę czekać",
|
||||
"displayFieldName": "Wyświetl nazwę pola",
|
||||
"sortBySelectOption": "Sortuj według opcji",
|
||||
"groupStep": "Odstęp grupowania",
|
||||
"groupRange": "Zakres grupowania",
|
||||
"groupMethodDateRelative": "Data względna",
|
||||
"groupMethodDateDay": "Dzień",
|
||||
"groupMethodDateWeek": "Tydzień",
|
||||
"groupMethodDateMonth": "Miesiąc",
|
||||
"groupMethodDateYear": "Rok",
|
||||
"syncColWidth": "Synchronizuj szerokość kolumny",
|
||||
"groupMethod": "Metoda grupowania",
|
||||
"hideEmptyGroup": "Ukryj pustą grupę",
|
||||
"hideEmptyGroup": "Ukryj puste grupy",
|
||||
"groups": "Grupy",
|
||||
"removeGroup": "Usuń grupę",
|
||||
"contentBlock": "Blok treści",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Mały",
|
||||
"fitImage": "Automatyczne dopasowanie rozmiaru obrazu",
|
||||
"showIcon": "Pokaż ikonę",
|
||||
"showAllFieldsIcon": "Pokaż ikony pól",
|
||||
"showAllEntriesIcons": "Pokaż ikony wpisów",
|
||||
"wrapAllFields": "Automatyczne zawijanie pól",
|
||||
"gallery": "Karta",
|
||||
"newTag": "Nowy tag",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Ostatni czas przeglądu",
|
||||
"cardStatus": "Status karty",
|
||||
"noSupportTip": "Ta funkcja nie wspiera użycia zestawów kart",
|
||||
"insertRowTip": "Nowo dodane wiersze zostały przefiltrowane i mogą być wyświetlane po anulowaniu filtrowania/szukań/sortowań",
|
||||
"insertRowTip": "Nowy element został przefiltrowany, anuluj filtrowanie lub ustawienia grupowania, aby wyświetlić",
|
||||
"insertPhoto": "Zrób zdjęcie i wstaw je",
|
||||
"relativeToToday": "W odniesieniu do dzisiaj",
|
||||
"current": "Ten",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "Klucz API",
|
||||
"apiKeyTip": "Zaleca się przypisanie klucza API do SiYuan oddzielnie do późniejszego zarządzania. Jeśli ten element jest pusty, funkcje związane z AI będą wyłączone",
|
||||
"apiTimeout": "Limit czasu",
|
||||
"apiTimeoutTip": "Okres timeoutu dla inicjowania zapytania, jednostka: sekunda",
|
||||
"apiTimeoutTip": "Okres timeoutu dla inicjowania zapytania",
|
||||
"apiProxy": "Proxy sieciowe",
|
||||
"apiProxyTip": "Proxy sieciowe, które inicjuje zapytanie, np. <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Model",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "Po włączeniu wbudowane bloki będą wyświetlać okruszki, wbudowane bloki w super blokach ignorują tę opcję i nigdy nie pokazują okruszków",
|
||||
"appearanceMode": "Tryb wyglądu",
|
||||
"editReadonly": "Tryb tylko do odczytu",
|
||||
"editReadonlyTip": "Po włączeniu edytor załaduje dokument w trybie tylko do odczytu",
|
||||
"editReadonlyTip": "Po włączeniu dokument będzie domyślnie tylko do odczytu",
|
||||
"generateConflictDoc": "Generuj dokument konfliktowy podczas synchronizacji konfliktów",
|
||||
"generateConflictDocTip": "Po włączeniu, dokument konfliktowy zostanie wygenerowany, gdy wystąpi konflikt synchronizacji, aby można go było otworzyć i przeglądać bezpośrednio. Niezależnie od tego, czy włączone, [Historia danych] zarejestruje dokument konfliktowy",
|
||||
"deleteOpConfirm": "⚠️ Potwierdzenie operacji usunięcia",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "Oczyszczenie repozytorium danych całkowicie usunie wszystkie nieodwołane zrzuty i powiązane obiekty danych, czy na pewno chcesz przeprowadzić oczyszczenie?",
|
||||
"purge": "Oczyść",
|
||||
"plsChoose": "Proszę najpierw wybrać",
|
||||
"clearMessage": "Przeczytaj",
|
||||
"freeSub": "Bezpłatna subskrypcja próbna",
|
||||
"sortByUpdateTimeDesc": "Malejąco wg czasu aktualizacji",
|
||||
"sortByUpdateTimeAsc": "Rosnąco wg czasu aktualizacji",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Niektóre systemy operacyjne mają ograniczenia techniczne, które mogą uniemożliwić ręczne kopiowanie danych obszaru roboczego po utworzeniu poddokumentów głębszych niż 7 poziomów",
|
||||
"fileTree20": "Zapisz w pojedynczej linii",
|
||||
"fileTree21": "Po włączeniu, format JSON w pojedynczej linii będzie używany przy zapisywaniu .sy dokumentów i plików .json bazy danych, co może zmniejszyć rozmiar pliku o około 30% i poprawić wydajność odczytu i zapisu o 50%",
|
||||
"fileTree22": "Powiadomienie o dużym pliku",
|
||||
"fileTree23": "Powiadom, gdy plik .sy lub baza danych .json przekroczy ten rozmiar",
|
||||
"export10": "Na przykład <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, jeśli jest puste, użyj tekstu znaków wodnych lub ścieżki pliku znaku wodnego.",
|
||||
"export11": "Sposób obsługi treści bloku odniesienia podczas eksportu",
|
||||
"export12": "Sposób obsługi treści bloku osadzonego podczas eksportu",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Proszę najpierw otworzyć notes",
|
||||
"copyBlockRef": "Skopiuj odniesienie do bloku",
|
||||
"copyBlockEmbed": "Skopiuj blok osadzony",
|
||||
"copyMarkdown": "Skopiuj jako Markdown",
|
||||
"linkLevel": "Głębokość",
|
||||
"mark": "Zaznacz",
|
||||
"splitLR": "Podziel w prawo",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Dzisiaj",
|
||||
"262": "Jutro",
|
||||
"263": "Następne %d dni",
|
||||
"264": "Pole [%s] jest puste"
|
||||
"264": "Pole [%s] jest puste",
|
||||
"265": "Poza zakresem",
|
||||
"266": "Tesseract OCR nie jest zainstalowany lub skonfigurowany, zapoznaj się z Podręcznikiem użytkownika - Sekcja plików zasobów, aby skonfigurować",
|
||||
"267": "Nienazwana baza danych",
|
||||
"268": "Uwaga: plik [%s] przekroczył już [%d MB], co może spowodować spadek wydajności",
|
||||
"269": "Ten blok został już dodany do bazy danych [%s]",
|
||||
"270": "Optymalizacja indeksu danych, proszę czekać...",
|
||||
"271": "Optymalizacja indeksu danych zakończona, zwolniono [%s] miejsca na dysku"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Otimizar índice",
|
||||
"vacuumDataIndexTip": "Verifique o índice de dados, libere espaço e melhore o desempenho do índice",
|
||||
"rebuildDataIndex": "Reconstruir índice",
|
||||
"rebuildDataIndexTip": "Reconstrução completa do índice de dados, pode demorar, por favor aguarde",
|
||||
"displayFieldName": "Exibir nome do campo",
|
||||
"sortBySelectOption": "Classificar por opção",
|
||||
"groupStep": "Intervalo de agrupamento",
|
||||
"groupRange": "Intervalo de grupo",
|
||||
"groupMethodDateRelative": "Data relativa",
|
||||
"groupMethodDateDay": "Dia",
|
||||
"groupMethodDateWeek": "Semana",
|
||||
"groupMethodDateMonth": "Mês",
|
||||
"groupMethodDateYear": "Ano",
|
||||
"syncColWidth": "Sincronizar largura da coluna",
|
||||
"groupMethod": "Método de agrupamento",
|
||||
"hideEmptyGroup": "Ocultar grupo vazio",
|
||||
"hideEmptyGroup": "Ocultar grupos vazios",
|
||||
"groups": "Grupos",
|
||||
"removeGroup": "Remover grupo",
|
||||
"contentBlock": "Bloco de conteúdo",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Pequeno",
|
||||
"fitImage": "Ajustar automaticamente o tamanho da imagem",
|
||||
"showIcon": "Mostrar ícone",
|
||||
"showAllFieldsIcon": "Mostrar ícones de campos",
|
||||
"showAllEntriesIcons": "Mostrar ícones de entradas",
|
||||
"wrapAllFields": "Quebrar automaticamente os campos",
|
||||
"gallery": "Cartão",
|
||||
"newTag": "Nova tag",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Última hora de revisão",
|
||||
"cardStatus": "Status do cartão",
|
||||
"noSupportTip": "Esta função não suporta o uso de baralhos de cartas",
|
||||
"insertRowTip": "As entradas recém-adicionadas foram filtradas e podem ser visualizadas cancelando o filtro/pesquisa/ordenação",
|
||||
"insertRowTip": "O novo item foi filtrado, cancele o filtro ou ajuste a configuração de agrupamento para visualizar",
|
||||
"insertPhoto": "Tirar uma foto e inserir",
|
||||
"relativeToToday": "Relativo a hoje",
|
||||
"current": "Este",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "Chave API",
|
||||
"apiKeyTip": "Recomenda-se atribuir uma Chave API separada ao SiYuan para gerenciamento subsequente. Se este item estiver em branco, as funções relacionadas à IA serão desativadas",
|
||||
"apiTimeout": "Tempo limite",
|
||||
"apiTimeoutTip": "O período de tempo limite para iniciar uma solicitação, unidade: segundo",
|
||||
"apiTimeoutTip": "O período de tempo limite para iniciar uma solicitação",
|
||||
"apiProxy": "Proxy de rede",
|
||||
"apiProxyTip": "O proxy de rede que inicia a solicitação, como <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Modelo",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "Quando ativado, blocos incorporados exibirão navegação estrutural, blocos incorporados em super blocos ignoram esta opção e nunca mostram navegação estrutural",
|
||||
"appearanceMode": "Modo de Aparência",
|
||||
"editReadonly": "Modo somente leitura",
|
||||
"editReadonlyTip": "Quando ativado, o editor carregará o documento em modo somente leitura",
|
||||
"editReadonlyTip": "Quando ativado, o documento ficará somente leitura por padrão",
|
||||
"generateConflictDoc": "Gerar documentação de conflito quando houver conflitos de sincronização",
|
||||
"generateConflictDocTip": "Quando ativado, um documento de conflito será gerado quando ocorrer um conflito de sincronização, para que possa ser aberto e visualizado diretamente. Independentemente de estar ativado ou não, o [Histórico de Dados] registrará o documento de conflito",
|
||||
"deleteOpConfirm": "⚠️ Confirmação de operação de exclusão",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "Limpar o repositório de dados excluirá completamente todos os instantâneos não referenciados e objetos de dados relacionados, tem certeza que deseja limpar?",
|
||||
"purge": "Limpar",
|
||||
"plsChoose": "Por favor, escolha primeiro",
|
||||
"clearMessage": "Ler",
|
||||
"freeSub": "Assinatura de Teste Gratuita",
|
||||
"sortByUpdateTimeDesc": "Decrescente por hora de atualização",
|
||||
"sortByUpdateTimeAsc": "Crescente por hora de atualização",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Alguns sistemas operacionais têm limitações técnicas que podem impedir a cópia manual de dados do espaço de trabalho após a criação de subdocumentos maiores que 7 níveis",
|
||||
"fileTree20": "Salvar com uma única linha",
|
||||
"fileTree21": "Quando ativado, o formato JSON de linha única será usado ao salvar documentos .sy e arquivos .json de banco de dados, o que pode reduzir o tamanho do arquivo em cerca de 30% e melhorar a eficiência de leitura/gravação em 50%",
|
||||
"fileTree22": "Aviso de arquivo grande",
|
||||
"fileTree23": "Notificar quando arquivos .sy e banco de dados .json excederem este tamanho",
|
||||
"export10": "Por exemplo <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, se vazio, use texto de marca d'água ou caminho do arquivo de marca d'água.",
|
||||
"export11": "Método de manipulação de conteúdo do bloco de referência ao exportar",
|
||||
"export12": "Método de manipulação de conteúdo do bloco incorporado ao exportar",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Por favor, abra um bloco de notas primeiro",
|
||||
"copyBlockRef": "Copiar referência de bloco",
|
||||
"copyBlockEmbed": "Copiar bloco incorporado",
|
||||
"copyMarkdown": "Copiar como Markdown",
|
||||
"linkLevel": "Profundidade",
|
||||
"mark": "Marca",
|
||||
"splitLR": "Dividir à Direita",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Hoje",
|
||||
"262": "Amanhã",
|
||||
"263": "Próximos %d dias",
|
||||
"264": "O campo [%s] está vazio"
|
||||
"264": "O campo [%s] está vazio",
|
||||
"265": "Fora do intervalo",
|
||||
"266": "Tesseract OCR não está instalado ou configurado, consulte o Guia do Usuário - Seção de Arquivos de Recursos para configuração",
|
||||
"267": "Banco de dados sem nome",
|
||||
"268": "Atenção: o arquivo [%s] já excedeu [%d MB], o que pode causar queda de desempenho",
|
||||
"269": "Este bloco já foi adicionado ao banco de dados [%s]",
|
||||
"270": "Otimizando o índice de dados, por favor aguarde...",
|
||||
"271": "Otimização do índice de dados concluída, [%s] de espaço liberado"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "Оптимизация индекса",
|
||||
"vacuumDataIndexTip": "Проверить индекс данных, освободить место и повысить производительность индекса",
|
||||
"rebuildDataIndex": "Перестроить индекс",
|
||||
"rebuildDataIndexTip": "Полная перестройка индекса данных, это может занять некоторое время, пожалуйста, подождите",
|
||||
"displayFieldName": "Показать имя поля",
|
||||
"sortBySelectOption": "Сортировать по опции",
|
||||
"groupStep": "Интервал группировки",
|
||||
"groupRange": "Диапазон группировки",
|
||||
"groupMethodDateRelative": "Относительная дата",
|
||||
"groupMethodDateDay": "День",
|
||||
"groupMethodDateWeek": "Неделя",
|
||||
"groupMethodDateMonth": "Месяц",
|
||||
"groupMethodDateYear": "Год",
|
||||
"syncColWidth": "Синхронизация ширины столбца",
|
||||
"groupMethod": "Способ группировки",
|
||||
"hideEmptyGroup": "Скрыть пустую группу",
|
||||
"hideEmptyGroup": "Скрыть пустые группы",
|
||||
"groups": "Группы",
|
||||
"removeGroup": "Удалить группу",
|
||||
"contentBlock": "Блок контента",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "Маленький",
|
||||
"fitImage": "Автоматическая подгонка размера изображения",
|
||||
"showIcon": "Показать значок",
|
||||
"showAllFieldsIcon": "Показать значки полей",
|
||||
"showAllEntriesIcons": "Показать значки записей",
|
||||
"wrapAllFields": "Автоматический перенос полей",
|
||||
"gallery": "Карточка",
|
||||
"newTag": "Новый тег",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "Время последнего обзора",
|
||||
"cardStatus": "Статус карточки",
|
||||
"noSupportTip": "Эта функция не поддерживает использование колод карточек",
|
||||
"insertRowTip": "Новые добавленные строки отфильтрованы. Чтобы увидеть их, отмените фильтрацию/поиск/сортировку",
|
||||
"insertRowTip": "Новый элемент был отфильтрован, отмените фильтрацию или настройку группировки для просмотра",
|
||||
"insertPhoto": "Сделать фотографию и вставить её",
|
||||
"relativeToToday": "Относительно сегодня",
|
||||
"current": "Этот",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "API ключ",
|
||||
"apiKeyTip": "Рекомендуется назначить отдельный API ключ для SiYuan для последующего управления. Если этот пункт оставить пустым, функции, связанные с ИИ, будут отключены",
|
||||
"apiTimeout": "Тайм-аут",
|
||||
"apiTimeoutTip": "Период времени для инициации запроса, единица: секунда",
|
||||
"apiTimeoutTip": "Период времени для инициации запроса",
|
||||
"apiProxy": "Сетевой прокси",
|
||||
"apiProxyTip": "Сетевой прокси, который инициирует запрос, например, <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "Модель",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "После включения вложенные блоки будут отображать крошки, вложенные блоки в супер блоках игнорируют эту опцию и никогда не показывают крошки",
|
||||
"appearanceMode": "Режим внешнего вида",
|
||||
"editReadonly": "Режим только для чтения",
|
||||
"editReadonlyTip": "После включения редактор загрузит документ в режиме только для чтения",
|
||||
"editReadonlyTip": "После включения документ будет по умолчанию только для чтения",
|
||||
"generateConflictDoc": "Создавать документацию конфликтов при возникновении конфликтов синхронизации",
|
||||
"generateConflictDocTip": "После включения при возникновении конфликта синхронизации будет генерироваться документ конфликта, чтобы его можно было открывать и просматривать напрямую. Независимо от включения или нет, [История данных] зарегистрирует документ конфликта",
|
||||
"deleteOpConfirm": "⚠️ Подтверждение операции удаления",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "Очистка репозитория данных полностью удалит все нереференсированные снимки и связанные объекты данных, вы уверены, что хотите очистить?",
|
||||
"purge": "Очистить",
|
||||
"plsChoose": "Пожалуйста, выберите сначала",
|
||||
"clearMessage": "Читать",
|
||||
"freeSub": "Бесплатная пробная подписка",
|
||||
"sortByUpdateTimeDesc": "По убыванию времени обновления",
|
||||
"sortByUpdateTimeAsc": "По возрастанию времени обновления",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "Некоторые операционные системы имеют технические ограничения, которые могут препятствовать ручному копированию данных рабочего пространства после создания поддокументов глубже 7 уровней",
|
||||
"fileTree20": "Сохранять в однострочном формате",
|
||||
"fileTree21": "После включения однострочный формат JSON будет использоваться при сохранении .sy документов и файлов баз данных .json, что может снизить размер файла примерно на 30% и улучшить эффективность чтения и записи на 50%",
|
||||
"fileTree22": "Уведомление о большом файле",
|
||||
"fileTree23": "Появится уведомление, если размер файла .sy или базы данных .json превышает этот предел",
|
||||
"export10": "Например <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code>, если пусто, использовать текст водяного знака или путь к файлу водяного знака.",
|
||||
"export11": "Обработка блока ссылок при экспорте",
|
||||
"export12": "Обработка блока встроенного контента при экспорте",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "Пожалуйста, сначала откройте блокнот",
|
||||
"copyBlockRef": "Скопировать ссылку на блок",
|
||||
"copyBlockEmbed": "Скопировать встроенный блок",
|
||||
"copyMarkdown": "Скопировать как Markdown",
|
||||
"linkLevel": "Глубина",
|
||||
"mark": "Значить",
|
||||
"splitLR": "Разделить направо",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "Сегодня",
|
||||
"262": "Завтра",
|
||||
"263": "Следующие %d дней",
|
||||
"264": "Поле [%s] имеет пустое значение"
|
||||
"264": "Поле [%s] пусто",
|
||||
"265": "Вне диапазона",
|
||||
"266": "Tesseract OCR не установлен или не настроен, пожалуйста, обратитесь к Руководству пользователя - Раздел ресурсов для настройки",
|
||||
"267": "База данных не названа",
|
||||
"268": "Обратите внимание, что файл [%s] уже превышает [%d МБ], это может привести к снижению производительности",
|
||||
"269": "Этот блок уже добавлен в базу данных [%s]",
|
||||
"270": "Оптимизация индекса данных, пожалуйста, подождите...",
|
||||
"271": "Оптимизация индекса данных завершена, освобождено [%s] дискового пространства"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "優化索引",
|
||||
"vacuumDataIndexTip": "校驗資料索引,釋放儲存空間並提升索引效能",
|
||||
"rebuildDataIndex": "重建索引",
|
||||
"rebuildDataIndexTip": "完全重建資料索引,較為耗時,請耐心等待",
|
||||
"displayFieldName": "顯示欄位名稱",
|
||||
"sortBySelectOption": "按選項排序",
|
||||
"groupStep": "分組間隔",
|
||||
"groupRange": "分組範圍",
|
||||
"groupMethodDateRelative": "相對日期",
|
||||
"groupMethodDateDay": "天",
|
||||
"groupMethodDateWeek": "週",
|
||||
"groupMethodDateMonth": "月",
|
||||
"groupMethodDateYear": "年",
|
||||
"syncColWidth": "同步列寬",
|
||||
"groupMethod": "分組方式",
|
||||
"hideEmptyGroup": "隱藏空白分組",
|
||||
"hideEmptyGroup": "隱藏無條目分組",
|
||||
"groups": "分組",
|
||||
"removeGroup": "移除分組",
|
||||
"contentBlock": "內容塊",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "小",
|
||||
"fitImage": "自動調整圖片大小",
|
||||
"showIcon": "顯示圖標",
|
||||
"showAllFieldsIcon": "顯示字段圖標",
|
||||
"showAllEntriesIcons": "顯示條目圖標",
|
||||
"wrapAllFields": "字段自動換行",
|
||||
"gallery": "卡片",
|
||||
"newTag": "新建標籤",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "最後複習時間",
|
||||
"cardStatus": "卡片狀態",
|
||||
"noSupportTip": "此功能不支援卡包使用",
|
||||
"insertRowTip": "新增條目已被過濾,可取消過濾/搜尋/排序進行查看",
|
||||
"insertRowTip": "新增條目已被過濾,可取消過濾或分組設置後進行查看",
|
||||
"insertPhoto": "拍照並插入",
|
||||
"relativeToToday": "相對於今天",
|
||||
"current": "當前",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "API Key",
|
||||
"apiKeyTip": "建議為思源單獨分配 API Key 以便於後續管理。該項留空則禁用 AI 相關功能",
|
||||
"apiTimeout": "超時時間",
|
||||
"apiTimeoutTip": "發起請求的超時時間,單位:秒",
|
||||
"apiTimeoutTip": "發起請求的超時時間",
|
||||
"apiProxy": "網絡代理",
|
||||
"apiProxyTip": "發起請求的網絡代理,如 <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "模型",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "啟用後嵌入塊將顯示導覽路徑,在超級塊中的嵌入塊忽略該選項,始終不顯示導覽路徑",
|
||||
"appearanceMode": "外觀模式",
|
||||
"editReadonly": "只讀模式",
|
||||
"editReadonlyTip": "啟用後編輯器將以只讀模式載入文檔",
|
||||
"editReadonlyTip": "啟用後文檔將預設鎖定編輯",
|
||||
"generateConflictDoc": "同步衝突時生成衝突文檔",
|
||||
"generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,[資料歷史] 都會記錄衝突文檔",
|
||||
"deleteOpConfirm": "⚠️ Delete operation confirmation",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "清理資料倉庫會徹底刪除所有未引用的快照和相關資料對象,確定進行清理嗎?",
|
||||
"purge": "清理",
|
||||
"plsChoose": "請先進行選擇",
|
||||
"clearMessage": "已讀",
|
||||
"freeSub": "免費試用訂閱",
|
||||
"sortByUpdateTimeDesc": "更新時間降序",
|
||||
"sortByUpdateTimeAsc": "更新時間升序",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "一些操作系統存在技術限制導致建立大於 7 層的子文檔後可能無法正常手動複製工作空間資料",
|
||||
"fileTree20": "使用單行保存",
|
||||
"fileTree21": "啟用後儲存 .sy 文件和資料庫 .json 時將使用單行 JSON 格式,大約能減少 30% 檔案大小並提升 50% 讀寫效率",
|
||||
"fileTree22": "超大檔案提醒",
|
||||
"fileTree23": ".sy 文件和資料庫 .json 超過該大小時彈出通知提醒",
|
||||
"export10": "例如 <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code> ,為空時使用水印文字或浮水印檔案路徑。",
|
||||
"export11": "匯出時關於塊引用內容的處理方式",
|
||||
"export12": "匯出時關於嵌入塊內容的處理方式",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "請先打開一個筆記本",
|
||||
"copyBlockRef": "複製為塊引用",
|
||||
"copyBlockEmbed": "複製為嵌入塊",
|
||||
"copyMarkdown": "複製為 Markdown",
|
||||
"linkLevel": "層級",
|
||||
"mark": "標記",
|
||||
"splitLR": "向右並排顯示",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "今天",
|
||||
"262": "明天",
|
||||
"263": "未來 %d 天",
|
||||
"264": "字段 [%s] 值為空"
|
||||
"264": "字段 [%s] 為空",
|
||||
"265": "不在範圍內",
|
||||
"266": "Tesseract OCR 未安裝或未配置,請參考 用戶指南-資料文件 章節進行配置",
|
||||
"267": "未命名資料庫",
|
||||
"268": "請注意該檔案 [%s] 已經超過 [%d MB],可能會導致效能下降",
|
||||
"269": "該塊已經添加到資料庫 [%s] 中",
|
||||
"270": "正在優化資料索引,請稍等...",
|
||||
"271": "資料索引優化完畢,共釋放 [%s] 磁碟空間"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
{
|
||||
"vacuumDataIndex": "优化索引",
|
||||
"vacuumDataIndexTip": "校验数据索引,释放存储空间并提升索引性能",
|
||||
"rebuildDataIndex": "重建索引",
|
||||
"rebuildDataIndexTip": "完全重建数据索引,较为耗时,请耐心等待",
|
||||
"displayFieldName": "显示字段名称",
|
||||
"sortBySelectOption": "按选项排序",
|
||||
"groupStep": "分组间隔",
|
||||
"groupRange": "分组范围",
|
||||
"groupMethodDateRelative": "相对日期",
|
||||
"groupMethodDateDay": "天",
|
||||
"groupMethodDateWeek": "周",
|
||||
"groupMethodDateMonth": "月",
|
||||
"groupMethodDateYear": "年",
|
||||
"syncColWidth": "同步列宽",
|
||||
"groupMethod": "分组方式",
|
||||
"hideEmptyGroup": "隐藏空白分组",
|
||||
"hideEmptyGroup": "隐藏无条目分组",
|
||||
"groups": "分组",
|
||||
"removeGroup": "移除分组",
|
||||
"contentBlock": "内容块",
|
||||
|
@ -20,7 +33,7 @@
|
|||
"small": "小",
|
||||
"fitImage": "自适应图片大小",
|
||||
"showIcon": "显示图标",
|
||||
"showAllFieldsIcon": "显示字段图标",
|
||||
"showAllEntriesIcons": "显示条目图标",
|
||||
"wrapAllFields": "字段自动换行",
|
||||
"gallery": "卡片",
|
||||
"newTag": "新建标签",
|
||||
|
@ -129,7 +142,7 @@
|
|||
"lastReviewTime": "最后复习时间",
|
||||
"cardStatus": "卡片状态",
|
||||
"noSupportTip": "该功能不支持卡包使用",
|
||||
"insertRowTip": "新增条目已被过滤,可取消过滤/搜索/排序进行查看",
|
||||
"insertRowTip": "新增条目已被过滤,可取消过滤或分组设置后进行查看",
|
||||
"insertPhoto": "拍照并插入",
|
||||
"relativeToToday": "相对于今天",
|
||||
"current": "当前",
|
||||
|
@ -422,7 +435,7 @@
|
|||
"apiKey": "API Key",
|
||||
"apiKeyTip": "建议为思源单独分配 API Key 以便于后续管理。该项留空则禁用 AI 相关功能",
|
||||
"apiTimeout": "超时时间",
|
||||
"apiTimeoutTip": "发起请求的超时时间,单位:秒",
|
||||
"apiTimeoutTip": "发起请求的超时时间",
|
||||
"apiProxy": "网络代理",
|
||||
"apiProxyTip": "发起请求的网络代理,如 <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
|
||||
"apiModel": "模型",
|
||||
|
@ -546,7 +559,7 @@
|
|||
"embedBlockBreadcrumbTip": "启用后嵌入块将显示面包屑,在超级块中的嵌入块忽略该选项,始终不显示面包屑",
|
||||
"appearanceMode": "外观模式",
|
||||
"editReadonly": "只读模式",
|
||||
"editReadonlyTip": "启用后编辑器将以只读模式载入文档",
|
||||
"editReadonlyTip": "启用后文档将默认锁定编辑",
|
||||
"generateConflictDoc": "同步冲突时生成冲突文档",
|
||||
"generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,[数据历史] 都会记录冲突文档",
|
||||
"deleteOpConfirm": "⚠️ 删除操作确认",
|
||||
|
@ -629,7 +642,6 @@
|
|||
"dataRepoPurgeConfirm": "清理数据仓库会彻底删除所有未引用的快照和相关数据对象,确定进行清理吗?",
|
||||
"purge": "清理",
|
||||
"plsChoose": "请先进行选择",
|
||||
"clearMessage": "已读",
|
||||
"freeSub": "免费试用订阅",
|
||||
"sortByUpdateTimeDesc": "更新时间降序",
|
||||
"sortByUpdateTimeAsc": "更新时间升序",
|
||||
|
@ -1122,6 +1134,8 @@
|
|||
"fileTree19": "一些操作系统存在技术限制导致创建大于 7 层的子文档后可能无法正常手动复制工作空间数据",
|
||||
"fileTree20": "使用单行保存",
|
||||
"fileTree21": "启用后保存 .sy 文档和数据库 .json 时将使用单行 JSON 格式,大约能减少 30% 文件大小并提升 50% 读写效率",
|
||||
"fileTree22": "超大文件提醒",
|
||||
"fileTree23": ".sy 文档和数据库 .json 超过该大小时弹出通知提醒",
|
||||
"export10": "例如 <code class='fn__code'><span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span></code> ,为空时使用水印文本或水印文件路径。",
|
||||
"export11": "导出时关于块引用内容的处理方式",
|
||||
"export12": "导出时关于嵌入块内容的处理方式",
|
||||
|
@ -1173,6 +1187,7 @@
|
|||
"newFileTip": "请先打开一个笔记本",
|
||||
"copyBlockRef": "复制为块引用",
|
||||
"copyBlockEmbed": "复制为嵌入块",
|
||||
"copyMarkdown": "复制为 Markdown",
|
||||
"linkLevel": "层级",
|
||||
"mark": "标记",
|
||||
"splitLR": "向右分屏",
|
||||
|
@ -1634,6 +1649,13 @@
|
|||
"261": "今天",
|
||||
"262": "明天",
|
||||
"263": "未来 %d 天",
|
||||
"264": "字段 [%s] 值为空"
|
||||
"264": "字段 [%s] 为空",
|
||||
"265": "不在范围内",
|
||||
"266": "Tesseract OCR 未安装或未配置,请参考 用户指南-资源文件 章节进行配置",
|
||||
"267": "未命名数据库",
|
||||
"268": "请注意该文件 [%s] 已经超过 [%d MB],可能会导致性能下降",
|
||||
"269": "该块已经添加到数据库 [%s] 中",
|
||||
"270": "正在优化数据索引,请稍等...",
|
||||
"271": "数据索引优化完毕,共释放 [%s] 磁盘空间"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<Identity Name="89C2A984.SiYuan"
|
||||
ProcessorArchitecture="x64"
|
||||
Publisher="CN=087C656E-C1D9-42D8-8807-CED45A74FC0F"
|
||||
Version="3.2.1.0"/>
|
||||
Version="3.3.0.0"/>
|
||||
<Properties>
|
||||
<DisplayName>SiYuan</DisplayName>
|
||||
<PublisherDisplayName>云南链滴科技有限公司</PublisherDisplayName>
|
||||
|
|
93
app/changelogs/v3.3.0/v3.3.0.md
Normal file
93
app/changelogs/v3.3.0/v3.3.0.md
Normal file
|
@ -0,0 +1,93 @@
|
|||
## Overview
|
||||
|
||||
This version supports database grouping by field and improves many details.
|
||||
|
||||
Please note:
|
||||
|
||||
* Old versions cannot open new version databases. If you installed the mobile version from a store, it is recommended to wait for the new version to be available in the store before updating the desktop version
|
||||
* The multi-select field value of the database template has changed from a string to a string array. Please refer to [here](https://github.com/siyuan-note/siyuan/issues/15575#issuecomment-3210963948) for adaptation
|
||||
|
||||
## Changelogs
|
||||
|
||||
Below are the detailed changes in this version.
|
||||
|
||||
### Feature
|
||||
|
||||
* [Database grouping by field](https://github.com/siyuan-note/siyuan/issues/10964)
|
||||
|
||||
### Enhancement
|
||||
|
||||
* [Improve `Add to Database`](https://github.com/siyuan-note/siyuan/issues/10659)
|
||||
* [Improve database field default filling](https://github.com/siyuan-note/siyuan/issues/11966)
|
||||
* [The database rollup field supports using the template field](https://github.com/siyuan-note/siyuan/issues/12384)
|
||||
* [Display title when flashcard is a document](https://github.com/siyuan-note/siyuan/issues/14201)
|
||||
* [Improve the database block binding](https://github.com/siyuan-note/siyuan/issues/14511)
|
||||
* [Improve export preview mode CSS variable value filling](https://github.com/siyuan-note/siyuan/pull/15110)
|
||||
* [Card view supports displaying field names](https://github.com/siyuan-note/siyuan/issues/15180)
|
||||
* [Improve document title carriage return processing](https://github.com/siyuan-note/siyuan/issues/15294)
|
||||
* [Improve pasting performance for large amounts of content](https://github.com/siyuan-note/siyuan/issues/15306)
|
||||
* [Improve the line number display when custom code block](https://github.com/siyuan-note/siyuan/pull/15324)
|
||||
* [Improve data sync to avoid conflicts caused by folding block](https://github.com/siyuan-note/siyuan/issues/15329)
|
||||
* [Deleting a block no longer adds an empty block to the beginning of the doc in some cases](https://github.com/siyuan-note/siyuan/issues/15336)
|
||||
* [Improve template search highlighting](https://github.com/siyuan-note/siyuan/issues/15338)
|
||||
* [Export preview mode supports focus use](https://github.com/siyuan-note/siyuan/issues/15340)
|
||||
* [Code blocks retain attributes when exporting preview](https://github.com/siyuan-note/siyuan/issues/15343)
|
||||
* [Support code block highlighting template syntax and export code block templates as paragraphs](https://github.com/siyuan-note/siyuan/pull/15345)
|
||||
* [`Re OCR` popup prompt when Tesseract is not enabled](https://github.com/siyuan-note/siyuan/issues/15367)
|
||||
* [Improve `<br>` input parsing](https://github.com/siyuan-note/siyuan/issues/15373)
|
||||
* [Update plugins of highlight.js](https://github.com/siyuan-note/siyuan/pull/15386)
|
||||
* [Improve card view display](https://github.com/siyuan-note/siyuan/issues/15389)
|
||||
* [Improve the status bar index creation information prompt](https://github.com/siyuan-note/siyuan/issues/15390)
|
||||
* [Improve search for emojis in tags](https://github.com/siyuan-note/siyuan/issues/15391)
|
||||
* [Document supports copying as Markdown](https://github.com/siyuan-note/siyuan/pull/15397)
|
||||
* [The database rollup field supports duplicating as a copy](https://github.com/siyuan-note/siyuan/issues/15417)
|
||||
* [Improve HTML clipping](https://github.com/siyuan-note/siyuan/issues/15438)
|
||||
* [Alert users when .sy file or database .json exceed 8MB](https://github.com/siyuan-note/siyuan/issues/15451)
|
||||
* [Limit the database title to 512 characters](https://github.com/siyuan-note/siyuan/issues/15459)
|
||||
* [`Upload asset files to cloud` supports focus use](https://github.com/siyuan-note/siyuan/issues/15462)
|
||||
* [Improve the style of exporting PDF](https://github.com/siyuan-note/siyuan/pull/15463)
|
||||
* [Parse `<img>` tags when pasting](https://github.com/siyuan-note/siyuan/issues/15464)
|
||||
* [The database template field supports using other template fields](https://github.com/siyuan-note/siyuan/issues/15517)
|
||||
* [Improve database `Drag vertically to fill value`](https://github.com/siyuan-note/siyuan/issues/15518)
|
||||
* [Tab switching improvements](https://github.com/siyuan-note/siyuan/issues/15546)
|
||||
* [Filter hidden columns when browsing the current view image of a database table](https://github.com/siyuan-note/siyuan/pull/15548)
|
||||
* [Database drag and drop, performance and interaction optimization](https://github.com/siyuan-note/siyuan/issues/15552)
|
||||
* [Remove highlighting when database filter conditions do not perform filter calculations](https://github.com/siyuan-note/siyuan/issues/15558)
|
||||
* [Improve database template field to use multiple-select field](https://github.com/siyuan-note/siyuan/issues/15575)
|
||||
* [Improve parsing `<img>` tags when importing](https://github.com/siyuan-note/siyuan/issues/15638)
|
||||
* [The database rollup field supports using the updated/created field](https://github.com/siyuan-note/siyuan/issues/15662)
|
||||
* [Manually optimize the data index to reduce space usage and improve performance](https://github.com/siyuan-note/siyuan/issues/15663)
|
||||
* [Improved database attribute panel](https://github.com/siyuan-note/siyuan/issues/15664)
|
||||
* [Improve focus positioning when exiting folded blocks](https://github.com/siyuan-note/siyuan/issues/15670)
|
||||
|
||||
### Bugfix
|
||||
|
||||
* [Database select fields will lose options if options are added too quickly](https://github.com/siyuan-note/siyuan/issues/13261)
|
||||
* [Inline formulas are not rendered when superblock is canceled](https://github.com/siyuan-note/siyuan/issues/15341)
|
||||
* [Dragging a file from the assets folder into the editor causes the kernel to exit](https://github.com/siyuan-note/siyuan/issues/15355)
|
||||
* [The tray is generated repeatedly after the new window is locked and then entered](https://github.com/siyuan-note/siyuan/issues/15357)
|
||||
* [Find-replace incorrectly converts tags to text](https://github.com/siyuan-note/siyuan/issues/15372)
|
||||
* [The insertion position is wrong after converting the list to paragraph block in the floating window](https://github.com/siyuan-note/siyuan/issues/15396)
|
||||
* [Formula-related editor status abnormal](https://github.com/siyuan-note/siyuan/issues/15554)
|
||||
* [Incorrect results for database rollup field filtering](https://github.com/siyuan-note/siyuan/issues/15608)
|
||||
|
||||
### Refactor
|
||||
|
||||
* [Upgrade to Electron v37.3.1](https://github.com/siyuan-note/siyuan/issues/15410)
|
||||
|
||||
### Development
|
||||
|
||||
* [Add plugin function `IProtyleOptions.handleEmptyContent`](https://github.com/siyuan-note/siyuan/issues/15398)
|
||||
* [Add plugin function `getActiveTab`](https://github.com/siyuan-note/siyuan/issues/15415)
|
||||
* [Add parameter `imgTag` for kernel API `exportMdContent` and `copyStdMarkdown`](https://github.com/siyuan-note/siyuan/issues/15454)
|
||||
* [Adjust `addTopBar` and `addStatusBar` from `onload` lifecycle to `onLayoutReady`](https://github.com/siyuan-note/siyuan/issues/15455)
|
||||
* [Add plugin function `hideMessage`](https://github.com/siyuan-note/siyuan/issues/15485)
|
||||
* [Add plugin event bus `switch-protyle-mode`](https://github.com/siyuan-note/siyuan/issues/15516)
|
||||
* [`/api/block/getBlockKramdown` link/image URLs are no longer encoded with spaces](https://github.com/siyuan-note/siyuan/issues/15611)
|
||||
* [Improve kernel API `/api/filetree/moveDocsByID`](https://github.com/siyuan-note/siyuan/issues/15616)
|
||||
* [Add plugin function `getActiveEditor`](https://github.com/siyuan-note/siyuan/issues/15641)
|
||||
|
||||
## Download
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/en/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
93
app/changelogs/v3.3.0/v3.3.0_zh_CHT.md
Normal file
93
app/changelogs/v3.3.0/v3.3.0_zh_CHT.md
Normal file
|
@ -0,0 +1,93 @@
|
|||
## 概述
|
||||
|
||||
該版本支援了資料庫按字段分組並改進了大量細節。
|
||||
|
||||
請注意:
|
||||
|
||||
* 舊版無法開啟新版的資料庫,如果你使用的行動端是在商店安裝的,建議等商店上架新版本後再更新桌面端
|
||||
* 資料庫範本的多選欄位值從字串變更為字串數組,請參考[這裡](https://github.com/siyuan-note/siyuan/issues/15575#issuecomment-3210963948)進行適配
|
||||
|
||||
## 變更記錄
|
||||
|
||||
以下是此版本中的詳細變更。
|
||||
|
||||
### 引入特性
|
||||
|
||||
* [資料庫依欄位分組](https://github.com/siyuan-note/siyuan/issues/10964)
|
||||
|
||||
### 改進功能
|
||||
|
||||
* [改進「加入資料庫」](https://github.com/siyuan-note/siyuan/issues/10659)
|
||||
* [改進資料庫欄位預設填入](https://github.com/siyuan-note/siyuan/issues/11966)
|
||||
* [資料庫匯總欄位支援使用範本欄位](https://github.com/siyuan-note/siyuan/issues/12384)
|
||||
* [閃卡為文件時顯示標題](https://github.com/siyuan-note/siyuan/issues/14201)
|
||||
* [改進資料庫區塊綁定](https://github.com/siyuan-note/siyuan/issues/14511)
|
||||
* [改進匯出預覽模式 CSS 變數值填色](https://github.com/siyuan-note/siyuan/pull/15110)
|
||||
* [卡片視圖支援顯示欄位名稱](https://github.com/siyuan-note/siyuan/issues/15180)
|
||||
* [改進文件標題回車處理](https://github.com/siyuan-note/siyuan/issues/15294)
|
||||
* [提升大量內容貼上效能](https://github.com/siyuan-note/siyuan/issues/15306)
|
||||
* [改進自訂程式碼區塊行號顯示](https://github.com/siyuan-note/siyuan/pull/15324)
|
||||
* [改善資料同步,避免因折疊塊導致的衝突](https://github.com/siyuan-note/siyuan/issues/15329)
|
||||
* [刪除區塊時在某些情況下不再在文件開頭新增空區塊](https://github.com/siyuan-note/siyuan/issues/15336)
|
||||
* [改進範本搜尋高亮](https://github.com/siyuan-note/siyuan/issues/15338)
|
||||
* [匯出預覽模式支援聚焦使用](https://github.com/siyuan-note/siyuan/issues/15340)
|
||||
* [匯出預覽時程式碼區塊保留屬性](https://github.com/siyuan-note/siyuan/issues/15343)
|
||||
* [支援程式碼區塊高亮模板語法並將程式碼區塊範本匯出為段落](https://github.com/siyuan-note/siyuan/pull/15345)
|
||||
* [「重新 OCR」在 Tesseract 未啟用時彈出視窗提示](https://github.com/siyuan-note/siyuan/issues/15367)
|
||||
* [改進 `<br>` 輸入解析](https://github.com/siyuan-note/siyuan/issues/15373)
|
||||
* [更新 highlight.js 插件](https://github.com/siyuan-note/siyuan/pull/15386)
|
||||
* [改進卡片視圖顯示](https://github.com/siyuan-note/siyuan/issues/15389)
|
||||
* [改進狀態列索引建立資訊提示](https://github.com/siyuan-note/siyuan/issues/15390)
|
||||
* [改進標籤中表情符號的搜尋](https://github.com/siyuan-note/siyuan/issues/15391)
|
||||
* [文件支援複製為 Markdown](https://github.com/siyuan-note/siyuan/pull/15397)
|
||||
* [資料庫匯總欄位支援複製為副本](https://github.com/siyuan-note/siyuan/issues/15417)
|
||||
* [改進 HTML 剪藏](https://github.com/siyuan-note/siyuan/issues/15438)
|
||||
* [當 .sy 檔案或資料庫 .json 超過 8MB 時提醒使用者](https://github.com/siyuan-note/siyuan/issues/15451)
|
||||
* [限制資料庫標題為 512 個字元](https://github.com/siyuan-note/siyuan/issues/15459)
|
||||
* [「上傳資源檔案到雲端」支援聚焦使用](https://github.com/siyuan-note/siyuan/issues/15462)
|
||||
* [改進匯出 PDF 樣式](https://github.com/siyuan-note/siyuan/pull/15463)
|
||||
* [貼上時解析 `<img>` 標籤](https://github.com/siyuan-note/siyuan/issues/15464)
|
||||
* [資料庫範本欄位支援使用其他範本欄位](https://github.com/siyuan-note/siyuan/issues/15517)
|
||||
* [改進資料庫「垂直拖曳填充值」](https://github.com/siyuan-note/siyuan/issues/15518)
|
||||
* [標籤頁切換改進](https://github.com/siyuan-note/siyuan/issues/15546)
|
||||
* [瀏覽資料庫表格目前視圖圖片時過濾隱藏列](https://github.com/siyuan-note/siyuan/pull/15548)
|
||||
* [資料庫拖曳、效能與互動最佳化](https://github.com/siyuan-note/siyuan/issues/15552)
|
||||
* [資料庫篩選條件未進行篩選計算時移除高亮](https://github.com/siyuan-note/siyuan/issues/15558)
|
||||
* [改進資料庫範本欄位使用多重選取欄位](https://github.com/siyuan-note/siyuan/issues/15575)
|
||||
* [改進導入時 `<img>` 標籤解析](https://github.com/siyuan-note/siyuan/issues/15638)
|
||||
* [資料庫匯總欄位支援使用更新時間/建立時間欄位](https://github.com/siyuan-note/siyuan/issues/15662)
|
||||
* [手動最佳化資料索引以減少空間佔用並提升效能](https://github.com/siyuan-note/siyuan/issues/15663)
|
||||
* [改進資料庫屬性面板](https://github.com/siyuan-note/siyuan/issues/15664)
|
||||
* [退出折疊塊時改進聚焦定位](https://github.com/siyuan-note/siyuan/issues/15670)
|
||||
|
||||
### 修復缺陷
|
||||
|
||||
* [資料庫選擇欄位若新增選項過快會遺失選項](https://github.com/siyuan-note/siyuan/issues/13261)
|
||||
* [取消超級區塊時行內公式未渲染](https://github.com/siyuan-note/siyuan/issues/15341)
|
||||
* [從資源資料夾拖曳檔案到編輯器導致內核退出](https://github.com/siyuan-note/siyuan/issues/15355)
|
||||
* [新視窗鎖定後再進入會重複產生托盤](https://github.com/siyuan-note/siyuan/issues/15357)
|
||||
* [尋找替換會錯誤地將標籤轉換為文字](https://github.com/siyuan-note/siyuan/issues/15372)
|
||||
* [浮窗中將清單轉為段落區塊後插入位置錯誤](https://github.com/siyuan-note/siyuan/issues/15396)
|
||||
* [公式相關編輯器狀態異常](https://github.com/siyuan-note/siyuan/issues/15554)
|
||||
* [資料庫匯總欄位篩選結果不正確](https://github.com/siyuan-note/siyuan/issues/15608)
|
||||
|
||||
### 開發重構
|
||||
|
||||
* [升級至 Electron v37.3.1](https://github.com/siyuan-note/siyuan/issues/15410)
|
||||
|
||||
### 開發者
|
||||
|
||||
* [新增外掛程式 `IProtyleOptions.handleEmptyContent`](https://github.com/siyuan-note/siyuan/issues/15398)
|
||||
* [新增外掛程式 `getActiveTab`](https://github.com/siyuan-note/siyuan/issues/15415)
|
||||
* [內核 API `exportMdContent` 和 `copyStdMarkdown` 新增參數 `imgTag`](https://github.com/siyuan-note/siyuan/issues/15454)
|
||||
* [將 `addTopBar` 和 `addStatusBar` 從 `onload` 生命週期調整到 `onLayoutReady`](https://github.com/siyuan-note/siyuan/issues/15455)
|
||||
* [新增外掛程式 `hideMessage`](https://github.com/siyuan-note/siyuan/issues/15485)
|
||||
* [新增外掛事件匯流排 `switch-protyle-mode`](https://github.com/siyuan-note/siyuan/issues/15516)
|
||||
* [`/api/block/getBlockKramdown` 連結/圖片 URL 不再用空格編碼](https://github.com/siyuan-note/siyuan/issues/15611)
|
||||
* [改進內核 API `/api/filetree/moveDocsByID`](https://github.com/siyuan-note/siyuan/issues/15616)
|
||||
* [新增外掛程式 `getActiveEditor`](https://github.com/siyuan-note/siyuan/issues/15641)
|
||||
|
||||
## 下載
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
93
app/changelogs/v3.3.0/v3.3.0_zh_CN.md
Normal file
93
app/changelogs/v3.3.0/v3.3.0_zh_CN.md
Normal file
|
@ -0,0 +1,93 @@
|
|||
## 概述
|
||||
|
||||
该版本支持了数据库按字段分组并改进了大量细节。
|
||||
|
||||
请注意:
|
||||
|
||||
* 旧版本无法打开新版本的数据库,如果你使用的移动端是在商店安装的,建议等商店上架新版本后再更新桌面端
|
||||
* 数据库模板的多选字段值从字符串变更为字符串数组,请参考[这里](https://github.com/siyuan-note/siyuan/issues/15575#issuecomment-3210963948)进行适配
|
||||
|
||||
## 变更记录
|
||||
|
||||
以下是此版本中的详细变更。
|
||||
|
||||
### 引入特性
|
||||
|
||||
* [数据库按字段分组](https://github.com/siyuan-note/siyuan/issues/10964)
|
||||
|
||||
### 改进功能
|
||||
|
||||
* [改进“添加到数据库”](https://github.com/siyuan-note/siyuan/issues/10659)
|
||||
* [改进数据库字段默认填充](https://github.com/siyuan-note/siyuan/issues/11966)
|
||||
* [数据库汇总字段支持使用模板字段](https://github.com/siyuan-note/siyuan/issues/12384)
|
||||
* [闪卡为文档时显示标题](https://github.com/siyuan-note/siyuan/issues/14201)
|
||||
* [改进数据库块绑定](https://github.com/siyuan-note/siyuan/issues/14511)
|
||||
* [改进导出预览模式 CSS 变量值填充](https://github.com/siyuan-note/siyuan/pull/15110)
|
||||
* [卡片视图支持显示字段名](https://github.com/siyuan-note/siyuan/issues/15180)
|
||||
* [改进文档标题回车处理](https://github.com/siyuan-note/siyuan/issues/15294)
|
||||
* [提升大量内容粘贴性能](https://github.com/siyuan-note/siyuan/issues/15306)
|
||||
* [改进自定义代码块行号显示](https://github.com/siyuan-note/siyuan/pull/15324)
|
||||
* [改进数据同步,避免因折叠块导致的冲突](https://github.com/siyuan-note/siyuan/issues/15329)
|
||||
* [删除块时在某些情况下不再在文档开头添加空块](https://github.com/siyuan-note/siyuan/issues/15336)
|
||||
* [改进模板搜索高亮](https://github.com/siyuan-note/siyuan/issues/15338)
|
||||
* [导出预览模式支持聚焦使用](https://github.com/siyuan-note/siyuan/issues/15340)
|
||||
* [导出预览时代码块保留属性](https://github.com/siyuan-note/siyuan/issues/15343)
|
||||
* [支持代码块高亮模板语法并将代码块模板导出为段落](https://github.com/siyuan-note/siyuan/pull/15345)
|
||||
* [“重新 OCR”在 Tesseract 未启用时弹窗提示](https://github.com/siyuan-note/siyuan/issues/15367)
|
||||
* [改进 `<br>` 输入解析](https://github.com/siyuan-note/siyuan/issues/15373)
|
||||
* [更新 highlight.js 插件](https://github.com/siyuan-note/siyuan/pull/15386)
|
||||
* [改进卡片视图显示](https://github.com/siyuan-note/siyuan/issues/15389)
|
||||
* [改进状态栏索引创建信息提示](https://github.com/siyuan-note/siyuan/issues/15390)
|
||||
* [改进标签中表情符号的搜索](https://github.com/siyuan-note/siyuan/issues/15391)
|
||||
* [文档支持复制为 Markdown](https://github.com/siyuan-note/siyuan/pull/15397)
|
||||
* [数据库汇总字段支持复制为副本](https://github.com/siyuan-note/siyuan/issues/15417)
|
||||
* [改进 HTML 剪藏](https://github.com/siyuan-note/siyuan/issues/15438)
|
||||
* [当 .sy 文件或数据库 .json 超过 8MB 时提醒用户](https://github.com/siyuan-note/siyuan/issues/15451)
|
||||
* [限制数据库标题为 512 个字符](https://github.com/siyuan-note/siyuan/issues/15459)
|
||||
* [“上传资源文件到云端”支持聚焦使用](https://github.com/siyuan-note/siyuan/issues/15462)
|
||||
* [改进导出 PDF 样式](https://github.com/siyuan-note/siyuan/pull/15463)
|
||||
* [粘贴时解析 `<img>` 标签](https://github.com/siyuan-note/siyuan/issues/15464)
|
||||
* [数据库模板字段支持使用其他模板字段](https://github.com/siyuan-note/siyuan/issues/15517)
|
||||
* [改进数据库“垂直拖动填充值”](https://github.com/siyuan-note/siyuan/issues/15518)
|
||||
* [标签页切换改进](https://github.com/siyuan-note/siyuan/issues/15546)
|
||||
* [浏览数据库表当前视图图片时过滤隐藏列](https://github.com/siyuan-note/siyuan/pull/15548)
|
||||
* [数据库拖拽、性能与交互优化](https://github.com/siyuan-note/siyuan/issues/15552)
|
||||
* [数据库筛选条件未进行筛选计算时移除高亮](https://github.com/siyuan-note/siyuan/issues/15558)
|
||||
* [改进数据库模板字段使用多选字段](https://github.com/siyuan-note/siyuan/issues/15575)
|
||||
* [改进导入时 `<img>` 标签解析](https://github.com/siyuan-note/siyuan/issues/15638)
|
||||
* [数据库汇总字段支持使用更新时间/创建时间字段](https://github.com/siyuan-note/siyuan/issues/15662)
|
||||
* [手动优化数据索引以减少空间占用并提升性能](https://github.com/siyuan-note/siyuan/issues/15663)
|
||||
* [改进数据库属性面板](https://github.com/siyuan-note/siyuan/issues/15664)
|
||||
* [退出折叠块时改进聚焦定位](https://github.com/siyuan-note/siyuan/issues/15670)
|
||||
|
||||
### 修复缺陷
|
||||
|
||||
* [数据库选择字段若添加选项过快会丢失选项](https://github.com/siyuan-note/siyuan/issues/13261)
|
||||
* [取消超级块时行内公式未渲染](https://github.com/siyuan-note/siyuan/issues/15341)
|
||||
* [从资源文件夹拖动文件到编辑器导致内核退出](https://github.com/siyuan-note/siyuan/issues/15355)
|
||||
* [新窗口锁定后再进入会重复生成托盘](https://github.com/siyuan-note/siyuan/issues/15357)
|
||||
* [查找替换会错误地将标签转换为文本](https://github.com/siyuan-note/siyuan/issues/15372)
|
||||
* [浮窗中将列表转为段落块后插入位置错误](https://github.com/siyuan-note/siyuan/issues/15396)
|
||||
* [公式相关编辑器状态异常](https://github.com/siyuan-note/siyuan/issues/15554)
|
||||
* [数据库汇总字段筛选结果不正确](https://github.com/siyuan-note/siyuan/issues/15608)
|
||||
|
||||
### 开发重构
|
||||
|
||||
* [升级至 Electron v37.3.1](https://github.com/siyuan-note/siyuan/issues/15410)
|
||||
|
||||
### 开发者
|
||||
|
||||
* [新增插件函数 `IProtyleOptions.handleEmptyContent`](https://github.com/siyuan-note/siyuan/issues/15398)
|
||||
* [新增插件函数 `getActiveTab`](https://github.com/siyuan-note/siyuan/issues/15415)
|
||||
* [内核 API `exportMdContent` 和 `copyStdMarkdown` 新增参数 `imgTag`](https://github.com/siyuan-note/siyuan/issues/15454)
|
||||
* [将 `addTopBar` 和 `addStatusBar` 从 `onload` 生命周期调整到 `onLayoutReady`](https://github.com/siyuan-note/siyuan/issues/15455)
|
||||
* [新增插件函数 `hideMessage`](https://github.com/siyuan-note/siyuan/issues/15485)
|
||||
* [新增插件事件总线 `switch-protyle-mode`](https://github.com/siyuan-note/siyuan/issues/15516)
|
||||
* [`/api/block/getBlockKramdown` 链接/图片 URL 不再用空格编码](https://github.com/siyuan-note/siyuan/issues/15611)
|
||||
* [改进内核 API `/api/filetree/moveDocsByID`](https://github.com/siyuan-note/siyuan/issues/15616)
|
||||
* [新增插件函数 `getActiveEditor`](https://github.com/siyuan-note/siyuan/issues/15641)
|
||||
|
||||
## 下载
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
|
@ -678,6 +678,10 @@ for (let i = argStart; i < process.argv.length; i++) {
|
|||
|
||||
app.whenReady().then(() => {
|
||||
const resetTrayMenu = (tray, lang, mainWindow) => {
|
||||
if (!mainWindow || mainWindow.isDestroyed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const trayMenuTemplate = [{
|
||||
label: mainWindow.isVisible() ? lang.hideWindow : lang.showWindow, click: () => {
|
||||
showHideWindow(tray, lang, mainWindow);
|
||||
|
@ -726,6 +730,10 @@ app.whenReady().then(() => {
|
|||
}
|
||||
};
|
||||
const showHideWindow = (tray, lang, mainWindow) => {
|
||||
if (!mainWindow || mainWindow.isDestroyed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mainWindow.isVisible()) {
|
||||
if (mainWindow.isMinimized()) {
|
||||
mainWindow.restore();
|
||||
|
@ -1113,13 +1121,17 @@ app.whenReady().then(() => {
|
|||
if (exitWS) {
|
||||
return;
|
||||
}
|
||||
|
||||
workspaces.find(item => {
|
||||
if (!item.workspaceDir) {
|
||||
item.workspaceDir = data.workspaceDir;
|
||||
let tray;
|
||||
if ("win32" === process.platform || "linux" === process.platform) {
|
||||
// 系统托盘
|
||||
tray = new Tray(path.join(appDir, "stage", "icon-large.png"));
|
||||
tray.setToolTip(`${path.basename(data.workspaceDir)} - SiYuan v${appVer}`);
|
||||
const mainWindow = getWindowByContentId(event.sender.id);
|
||||
if (!mainWindow) {
|
||||
if (!mainWindow || mainWindow.isDestroyed()) {
|
||||
return;
|
||||
}
|
||||
resetTrayMenu(tray, data.languages, mainWindow);
|
||||
|
@ -1127,9 +1139,6 @@ app.whenReady().then(() => {
|
|||
showHideWindow(tray, data.languages, mainWindow);
|
||||
});
|
||||
}
|
||||
workspaces.find(item => {
|
||||
if (!item.workspaceDir) {
|
||||
item.workspaceDir = data.workspaceDir;
|
||||
item.tray = tray;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"id": "20201204184532-3qm9l8n",
|
||||
"title": "Template snippet",
|
||||
"type": "doc",
|
||||
"updated": "20250331163727"
|
||||
"updated": "20250801152837"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -57,7 +57,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20210104091444-jy56z0p",
|
||||
"updated": "20250331163727"
|
||||
"updated": "20250801152821"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -215,7 +215,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20210104091444-mwbvc9m",
|
||||
"updated": "20250331163727"
|
||||
"updated": "20250801152821"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -421,7 +421,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20210121193829-wfzsf6m",
|
||||
"updated": "20250331163727"
|
||||
"updated": "20250801152749"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -454,7 +454,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215602-dk7iion",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20250331163727"
|
||||
"updated": "20250801152749"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -462,7 +462,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -485,7 +486,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20250331163529-vixv1we",
|
||||
"updated": "20250331163604"
|
||||
"updated": "20250801152801"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -517,7 +518,7 @@
|
|||
"IsFencedCodeBlock": true,
|
||||
"Properties": {
|
||||
"id": "20250331163550-2r69a54",
|
||||
"updated": "20250331163604"
|
||||
"updated": "20250801152801"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -525,7 +526,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -548,7 +550,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20210504093232-vukp34t",
|
||||
"updated": "20241224162810"
|
||||
"updated": "20250801152807"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -581,7 +583,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215606-a1mq6zf",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241224162810"
|
||||
"updated": "20250801152807"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -589,7 +591,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -612,7 +615,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241213214939-he4wmcd",
|
||||
"updated": "20241213214939"
|
||||
"updated": "20250801152813"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -645,7 +648,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215554-rox3jk7",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215554"
|
||||
"updated": "20250801152813"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -653,7 +656,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -676,7 +680,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241212102027-j293sei",
|
||||
"updated": "20241213215714"
|
||||
"updated": "20250801152821"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -709,7 +713,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215714-u0j3i4k",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215714"
|
||||
"updated": "20250801152821"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -717,11 +721,12 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
|
||||
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
|
@ -1411,7 +1416,8 @@
|
|||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20210104091444-xz57sof"
|
||||
"id": "20210104091444-xz57sof",
|
||||
"updated": "20250801152837"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -1428,36 +1434,26 @@
|
|||
"ID": "20210104091444-cclnk66",
|
||||
"Type": "NodeCodeBlock",
|
||||
"IsFencedCodeBlock": true,
|
||||
"CodeBlockFenceChar": 96,
|
||||
"CodeBlockFenceLen": 3,
|
||||
"CodeBlockOpenFence": "YGBg",
|
||||
"CodeBlockInfo": "cGxhaW50ZXh0",
|
||||
"CodeBlockCloseFence": "YGBg",
|
||||
"Properties": {
|
||||
"id": "20210104091444-cclnk66"
|
||||
"id": "20210104091444-cclnk66",
|
||||
"updated": "20250801152837"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceOpenMarker",
|
||||
"Data": "```",
|
||||
"CodeBlockFenceLen": 3
|
||||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "cGxhaW50ZXh0"
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"ID": "20220307092214-3y1eex2",
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\nToday is `.action{now | date \"2006-01-02\"}`.\n\n* `.action{$before}` days have passed since `2020-02-19`\n* There are `.action{$after}` days left from `2048-02-19`\n",
|
||||
"Properties": {
|
||||
"id": "20220307092214-3y1eex2"
|
||||
}
|
||||
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\nToday is `.action{ now | date \"2006-01-02\" }`.\n\n* `.action{ $before }` days have passed since `2020-02-19`\n* There are `.action{ $after }` days left from `2048-02-19`\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
"Data": "```",
|
||||
"CodeBlockFenceLen": 3
|
||||
"Data": "```"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20230405172236-pg3l9eu",
|
||||
"title": "Performance Optimization",
|
||||
"type": "doc",
|
||||
"updated": "20240420104851"
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -379,7 +379,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20230405172238-v4hbjbe",
|
||||
"updated": "20230405172238"
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -637,6 +637,62 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114750-j9t49j2",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114750-j9t49j2",
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Optimizing the Index"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114750-qtm8i82",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20250825114750-qtm8i82",
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "It is recommended to regularly optimize the index by going to "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Settings"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "About"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Optimize Index"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
"id": "20201204181006-7bkppue",
|
||||
"title": "模板片段",
|
||||
"type": "doc",
|
||||
"updated": "20250331163228"
|
||||
"updated": "20250801152724"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -69,7 +69,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20210104091309-fhb549c",
|
||||
"updated": "20250331163228"
|
||||
"updated": "20250801152510"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -237,7 +237,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20210104091309-gjkg3u5",
|
||||
"updated": "20250331163228"
|
||||
"updated": "20250801152510"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -443,7 +443,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20210121193601-uwo8s5h",
|
||||
"updated": "20250331163052"
|
||||
"updated": "20250801152331"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -476,7 +476,7 @@
|
|||
"Properties": {
|
||||
"id": "20210604111446-p6vadfc",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20250331163052"
|
||||
"updated": "20250801152331"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -484,7 +484,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -507,7 +508,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20250331162928-53comqi",
|
||||
"updated": "20250331163228"
|
||||
"updated": "20250801152339"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -539,7 +540,7 @@
|
|||
"IsFencedCodeBlock": true,
|
||||
"Properties": {
|
||||
"id": "20250331163038-6j2ttlc",
|
||||
"updated": "20250331163228"
|
||||
"updated": "20250801152339"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -547,7 +548,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -570,7 +572,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20210504093313-4aoyxd0",
|
||||
"updated": "20241224162826"
|
||||
"updated": "20250801152509"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -603,7 +605,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215337-rhkoc8k",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241224162826"
|
||||
"updated": "20250801152509"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -611,7 +613,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -634,7 +637,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241213214733-ro4xcjm",
|
||||
"updated": "20241213215421"
|
||||
"updated": "20250801152510"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -667,7 +670,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215240-f33bsqs",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215421"
|
||||
"updated": "20250801152510"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -675,7 +678,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -698,7 +702,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241212101708-0euo6is",
|
||||
"updated": "20241213215655"
|
||||
"updated": "20250801152415"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -731,7 +735,7 @@
|
|||
"Properties": {
|
||||
"id": "20241212101810-6ffociu",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215655"
|
||||
"updated": "20250801152415"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -739,11 +743,12 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
|
||||
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
|
@ -1433,7 +1438,8 @@
|
|||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20210104091309-2p68yju"
|
||||
"id": "20210104091309-2p68yju",
|
||||
"updated": "20250801152724"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -1450,36 +1456,26 @@
|
|||
"ID": "20210104091309-9ppkq6j",
|
||||
"Type": "NodeCodeBlock",
|
||||
"IsFencedCodeBlock": true,
|
||||
"CodeBlockFenceChar": 96,
|
||||
"CodeBlockFenceLen": 3,
|
||||
"CodeBlockOpenFence": "YGBg",
|
||||
"CodeBlockInfo": "cGxhaW50ZXh0",
|
||||
"CodeBlockCloseFence": "YGBg",
|
||||
"Properties": {
|
||||
"id": "20210104091309-9ppkq6j"
|
||||
"id": "20210104091309-9ppkq6j",
|
||||
"updated": "20250801152724"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceOpenMarker",
|
||||
"Data": "```",
|
||||
"CodeBlockFenceLen": 3
|
||||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "cGxhaW50ZXh0"
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"ID": "20220307091943-k77h7sb",
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\n今天是 `.action{now | date \"2006-01-02\"}`。\n\n* 距离 `2020-02-19` 已经过去 `.action{$before}` 天\n* 距离 `2048-02-19` 还剩 `.action{$after}` 天\n",
|
||||
"Properties": {
|
||||
"id": "20220307091943-k77h7sb"
|
||||
}
|
||||
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\n今天是 `.action{ now | date \"2006-01-02\" }`。\n\n* 距离 `2020-02-19` 已经过去 `.action{ $before }` 天\n* 距离 `2048-02-19` 还剩 `.action{ $after }` 天\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
"Data": "```",
|
||||
"CodeBlockFenceLen": 3
|
||||
"Data": "```"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20230405155631-leo4vc6",
|
||||
"title": "性能优化",
|
||||
"type": "doc",
|
||||
"updated": "20240420104842"
|
||||
"updated": "20250825114628"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -375,7 +375,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20230405171407-ltaakx8",
|
||||
"updated": "20230405171419"
|
||||
"updated": "20250825114421"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -633,6 +633,62 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114421-fq73tbi",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114421-fq73tbi",
|
||||
"updated": "20250825114628"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "优化索引"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114436-jm8dekc",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20250825114436-jm8dekc",
|
||||
"updated": "20250825114628"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "建议定期执行优化索引 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "设置"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "关于"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "优化索引"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "。"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
"id": "20211226123004-dplpw0o",
|
||||
"title": "範本片段",
|
||||
"type": "doc",
|
||||
"updated": "20250331163725"
|
||||
"updated": "20250801152721"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -53,7 +53,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20211226123024-eyagqur",
|
||||
"updated": "20250331163725"
|
||||
"updated": "20250801152602"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -208,7 +208,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20211226123024-pjvw31z",
|
||||
"updated": "20250331163725"
|
||||
"updated": "20250801152602"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -414,7 +414,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20211226123024-e42d7xq",
|
||||
"updated": "20250331163725"
|
||||
"updated": "20250801152535"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -447,7 +447,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215519-mfgruqs",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20250331163725"
|
||||
"updated": "20250801152535"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -455,7 +455,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -478,7 +479,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20250331163425-s5u08ng",
|
||||
"updated": "20250331163515"
|
||||
"updated": "20250801152542"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -510,7 +511,7 @@
|
|||
"IsFencedCodeBlock": true,
|
||||
"Properties": {
|
||||
"id": "20250331163435-irjmxt9",
|
||||
"updated": "20250331163452"
|
||||
"updated": "20250801152542"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -518,7 +519,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -541,7 +543,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20211226123024-69kddle",
|
||||
"updated": "20241224162821"
|
||||
"updated": "20250801152548"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -574,7 +576,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215524-9an3khb",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241224162821"
|
||||
"updated": "20250801152548"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -582,7 +584,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -605,7 +608,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241213214930-4votv1n",
|
||||
"updated": "20241213214930"
|
||||
"updated": "20250801152554"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -638,7 +641,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215530-f2iwrjz",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215530"
|
||||
"updated": "20250801152554"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -646,7 +649,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -669,7 +673,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241212102019-gassjqt",
|
||||
"updated": "20241213215707"
|
||||
"updated": "20250801152602"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -702,7 +706,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215707-lxpmd6b",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215707"
|
||||
"updated": "20250801152602"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -710,11 +714,12 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
|
||||
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
|
@ -1401,7 +1406,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20211226123024-yrgnp4o",
|
||||
"updated": "20211225221841"
|
||||
"updated": "20250801152721"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -1416,7 +1421,7 @@
|
|||
"IsFencedCodeBlock": true,
|
||||
"Properties": {
|
||||
"id": "20211226123024-s56q5uh",
|
||||
"updated": "20211225221841"
|
||||
"updated": "20250801152721"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -1425,15 +1430,11 @@
|
|||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "cGxhaW50ZXh0"
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"ID": "20220307092237-cf60m2o",
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\n今天是 `.action{now | date \"2006-01-02\"}`。\n\n* 距離 `2020-02-19` 已經過去 `.action{$before}` 天\n* 距離 `2048-02-19` 還剩 `.action{$after}` 天\n",
|
||||
"Properties": {
|
||||
"id": "20220307092237-cf60m2o"
|
||||
}
|
||||
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\n今天是 `.action{ now | date \"2006-01-02\" }`。\n\n* 距離 `2020-02-19` 已經過去 `.action{ $before }` 天\n* 距離 `2048-02-19` 還剩 `.action{ $after }` 天\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20230405172131-yb16aax",
|
||||
"title": "性能最佳化",
|
||||
"type": "doc",
|
||||
"updated": "20240420104915"
|
||||
"updated": "20250825114942"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -379,7 +379,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20230405172204-kitngfu",
|
||||
"updated": "20230405172204"
|
||||
"updated": "20250825114815"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -637,6 +637,62 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114815-of1bnnd",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114815-of1bnnd",
|
||||
"updated": "20250825114942"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "優化索引"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114815-ck2ln4u",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20250825114815-ck2ln4u",
|
||||
"updated": "20250825114936"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "建議定期執行最佳化索引 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "設定"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "關於"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "優化索引"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "。"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20240530101000-6x9ivi7",
|
||||
"title": "テンプレートスニペット",
|
||||
"type": "doc",
|
||||
"updated": "20250331163729"
|
||||
"updated": "20250801152939"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -66,7 +66,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-5nvn9ad",
|
||||
"id": "20240530101000-pi05yzt",
|
||||
"updated": "20250331163729"
|
||||
"updated": "20250801152922"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -226,7 +226,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20240530101000-by5hqnb",
|
||||
"updated": "20250331163729"
|
||||
"updated": "20250801152922"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -432,7 +432,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20240530101000-0y2zlji",
|
||||
"updated": "20250331163729"
|
||||
"updated": "20250801152859"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -465,7 +465,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215628-5gixpmp",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20250331163729"
|
||||
"updated": "20250801152859"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -473,7 +473,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -496,7 +497,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20250331163610-n3e9zft",
|
||||
"updated": "20250331163642"
|
||||
"updated": "20250801152903"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -528,7 +529,7 @@
|
|||
"IsFencedCodeBlock": true,
|
||||
"Properties": {
|
||||
"id": "20250331163621-j4iofxv",
|
||||
"updated": "20250331163642"
|
||||
"updated": "20250801152903"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -536,7 +537,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -559,7 +561,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20240530101000-238ctfi",
|
||||
"updated": "20241224162728"
|
||||
"updated": "20250801152909"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -592,7 +594,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215619-gkqs282",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241224162728"
|
||||
"updated": "20250801152909"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -600,7 +602,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -623,7 +626,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241213215009-qrtc56j",
|
||||
"updated": "20241213215009"
|
||||
"updated": "20250801152915"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -656,7 +659,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215633-69ltmv1",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215633"
|
||||
"updated": "20250801152915"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -664,7 +667,8 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
|
@ -687,7 +691,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20241212102033-rn9u6t8",
|
||||
"updated": "20241213215720"
|
||||
"updated": "20250801152922"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -720,7 +724,7 @@
|
|||
"Properties": {
|
||||
"id": "20241213215720-ueqpsna",
|
||||
"style": "line-height: 22px;",
|
||||
"updated": "20241213215720"
|
||||
"updated": "20250801152922"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -728,11 +732,12 @@
|
|||
"Data": "```"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker"
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
|
||||
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
|
@ -1422,7 +1427,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-h8k78jq",
|
||||
"id": "20240530101000-3jhyboz",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250801152939"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -1436,9 +1441,8 @@
|
|||
"Type": "NodeCodeBlock",
|
||||
"IsFencedCodeBlock": true,
|
||||
"Properties": {
|
||||
"ID": "20240530101000-3sja27a",
|
||||
"id": "20240530101000-v44hxz6",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250801152939"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -1447,11 +1451,11 @@
|
|||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceInfoMarker",
|
||||
"CodeBlockInfo": "cGxhaW50ZXh0"
|
||||
"CodeBlockInfo": "dGVtcGxhdGU="
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockCode",
|
||||
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\n今日は `.action{now | date \"2006-01-02\"}` 日です。\n\n* `2020-02-19` 日から `.action{$before}` 日経過しました\n* `2048-02-19` 日まであと `.action{$after}` 日です\n"
|
||||
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\n今日は `.action{ now | date \"2006-01-02\" }` 日です。\n\n* `2020-02-19` 日から `.action{ $before }` 日経過しました\n* `2048-02-19` 日まであと `.action{ $after }` 日です\n"
|
||||
},
|
||||
{
|
||||
"Type": "NodeCodeBlockFenceCloseMarker",
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"id": "20240530101000-flot1gj",
|
||||
"title": "パフォーマンスの最適化",
|
||||
"type": "doc",
|
||||
"updated": "20250115145306"
|
||||
"updated": "20250825115021"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -421,7 +421,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-utjkzhs",
|
||||
"id": "20240530101000-9doivgv",
|
||||
"updated": "20250115145306"
|
||||
"updated": "20250825114907"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
@ -755,12 +755,60 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"ID": "20240530101000-9swho08",
|
||||
"ID": "20250825114907-tkuwv3h",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114907-tkuwv3h",
|
||||
"updated": "20250825115021"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "インデックスの最適化"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114907-av6973u",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"ID": "20240530101000-ugpv1is",
|
||||
"id": "20240530101000-9swho08"
|
||||
}
|
||||
"id": "20250825114907-av6973u",
|
||||
"updated": "20250825115021"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "設定"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "バージョン情報"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "インデックスの最適化"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " から、定期的にインデックスを最適化することをお勧めします。"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"name": "SiYuan",
|
||||
"version": "3.2.1",
|
||||
"version": "3.3.0",
|
||||
"description": "Refactor your thinking",
|
||||
"homepage": "https://b3log.org/siyuan",
|
||||
"main": "./electron/main.js",
|
||||
"packageManager": "pnpm@10.13.1",
|
||||
"packageManager": "pnpm@10.15.0",
|
||||
"scripts": {
|
||||
"lint": "eslint . --fix --cache",
|
||||
"dev": "webpack --mode development",
|
||||
|
@ -58,7 +58,7 @@
|
|||
"clean-webpack-plugin": "^4.0.0",
|
||||
"css-loader": "^7.1.2",
|
||||
"dayjs": "^1.11.5",
|
||||
"electron": "37.2.3",
|
||||
"electron": "37.3.1",
|
||||
"electron-builder": "26.0.12",
|
||||
"encoding": "^0.1.13",
|
||||
"esbuild-loader": "^3.0.1",
|
||||
|
|
6568
app/pnpm-lock.yaml
generated
6568
app/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
@ -255,7 +255,7 @@ export const AIActions = (elements: Element[], protyle: IProtyle) => {
|
|||
});
|
||||
element.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isSameNode(element)) {
|
||||
while (target && (target !== element)) {
|
||||
if (target.classList.contains("b3-list-item__action")) {
|
||||
const subItem = window.siyuan.storage[Constants.LOCAL_AI][target.parentElement.dataset.index];
|
||||
editDialog(subItem.name, subItem.memo);
|
||||
|
|
|
@ -6,12 +6,16 @@
|
|||
margin-top: 4px !important;
|
||||
margin-bottom: 4px !important;
|
||||
|
||||
&:hover .av__views .block__icon {
|
||||
&:hover {
|
||||
.av__views .block__icon,
|
||||
.av__group-icon--hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&--touch {
|
||||
.av__views .block__icon,
|
||||
.av__group-icon--hover,
|
||||
.av__row--footer .av__calc {
|
||||
opacity: 1;
|
||||
}
|
||||
|
@ -35,7 +39,7 @@
|
|||
|
||||
&__pulse {
|
||||
width: 70%;
|
||||
height: 23px;
|
||||
height: 22px;
|
||||
display: block;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
@ -56,8 +60,7 @@
|
|||
}
|
||||
|
||||
&__header {
|
||||
top: -43px;
|
||||
z-index: 2;
|
||||
position: relative;
|
||||
|
||||
.layout-tab-bar {
|
||||
background-color: transparent;
|
||||
|
@ -128,10 +131,6 @@
|
|||
overflow: auto hidden;
|
||||
}
|
||||
|
||||
&__body {
|
||||
float: left;
|
||||
}
|
||||
|
||||
&__row {
|
||||
display: flex;
|
||||
border-bottom: 1px solid var(--b3-theme-surface-lighter);
|
||||
|
@ -257,6 +256,7 @@
|
|||
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
|
||||
gap: 16px;
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
|
||||
&--top {
|
||||
margin-top: 16px;
|
||||
|
@ -397,11 +397,6 @@
|
|||
border-right: 0;
|
||||
min-height: calc(1.625em + 4px);
|
||||
|
||||
&:not([data-dtype="block"])[data-empty="true"] {
|
||||
padding: 0 4px;
|
||||
min-height: auto;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: var(--b3-list-hover);
|
||||
border-radius: var(--b3-border-radius);
|
||||
|
@ -418,26 +413,66 @@
|
|||
cursor: default;
|
||||
}
|
||||
|
||||
&[data-dtype="mAsset"],
|
||||
&[data-dtype="mSelect"],
|
||||
&[data-dtype="select"] {
|
||||
margin-left: -2px;
|
||||
}
|
||||
}
|
||||
|
||||
&--edit .av__cell {
|
||||
padding: 2px 4px !important;
|
||||
min-height: calc(1.625em + 4px) !important;
|
||||
|
||||
&[data-dtype="mAsset"][data-empty="true"],
|
||||
&[data-dtype="mSelect"][data-empty="true"],
|
||||
&[data-dtype="select"][data-empty="true"] {
|
||||
&[data-dtype="mAsset"] .av__cellassetimg:first-child,
|
||||
&[data-dtype="mAsset"] .b3-chip:first-child,
|
||||
&[data-dtype="mSelect"] .b3-chip:first-child,
|
||||
&[data-dtype="select"] .b3-chip:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
&[data-empty="true"] .av__gallery-tip {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
&--edit .av__gallery-field[data-empty="true"] .av__gallery-tip {
|
||||
display: block;
|
||||
}
|
||||
|
||||
&:not(.av__gallery-fields--edit) [data-empty="true"] {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&-field {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&-name {
|
||||
opacity: 0.38;
|
||||
padding: 2px 4px;
|
||||
width: 100%;
|
||||
white-space: normal;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
box-sizing: border-box;
|
||||
display: none;
|
||||
opacity: 0.38;
|
||||
padding: 2px 4px;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
&-tip,
|
||||
&-name {
|
||||
img:first-child, svg:first-child, svg.ariaLabel {
|
||||
height: 1.625em;
|
||||
width: calc(1.625em - 10px);
|
||||
margin: 0 5px 0 0;
|
||||
font-size: 1em;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
img:first-child {
|
||||
height: calc(1.625em - 10px);
|
||||
float: left;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
span:first-child {
|
||||
width: calc(1.9em - 10px);
|
||||
margin: 0 5px 0 0;
|
||||
height: 1.625em;
|
||||
font-size: .85em;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -473,26 +508,6 @@
|
|||
z-index: 2;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
display: none;
|
||||
align-items: center;
|
||||
opacity: 0.38;
|
||||
|
||||
img, svg {
|
||||
height: calc(1.625em - 10px);
|
||||
width: calc(1.625em - 10px);
|
||||
margin: 0 5px 0 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
span {
|
||||
width: calc(1.9em - 10px);
|
||||
margin: 0 5px 0 0;
|
||||
height: 1.625em;
|
||||
font-size: .85em;
|
||||
}
|
||||
}
|
||||
|
||||
&-item, &-add {
|
||||
&.dragover__left::after,
|
||||
&.dragover__right::after {
|
||||
|
@ -574,23 +589,6 @@
|
|||
color: var(--b3-protyle-inline-blockref-color);
|
||||
}
|
||||
|
||||
.b3-menu__avemoji {
|
||||
display: inline-block;
|
||||
font-size: 1em;
|
||||
line-height: 1.625;
|
||||
height: auto;
|
||||
margin: 0 5px 0 -4px;
|
||||
vertical-align: top;
|
||||
|
||||
img {
|
||||
height: calc(1.625em - 8px);
|
||||
font-size: 1em;
|
||||
width: calc(1.625em - 8px);
|
||||
float: left;
|
||||
margin: 4px 0;
|
||||
}
|
||||
}
|
||||
|
||||
&[data-wrap="true"] {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
@ -599,7 +597,7 @@
|
|||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&[data-block-id] > .block__icon[data-type="copy"] {
|
||||
&[data-dtype="block"] > .block__icon[data-type="copy"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
@ -679,10 +677,10 @@
|
|||
}
|
||||
|
||||
&--relation {
|
||||
margin-left: 12px;
|
||||
margin-right: 12px;
|
||||
|
||||
&:first-child {
|
||||
margin-left: 0;
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -794,8 +792,8 @@
|
|||
position: relative;
|
||||
|
||||
.b3-menu {
|
||||
min-width: 200px;
|
||||
max-width: 50vw;
|
||||
min-width: 290px;
|
||||
max-width: 290px;
|
||||
|
||||
&__item .b3-chip {
|
||||
max-width: 100%;
|
||||
|
@ -835,6 +833,7 @@
|
|||
|
||||
&__label {
|
||||
overflow: hidden;
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
&__icon.fn__grab {
|
||||
|
@ -911,6 +910,68 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
&__group {
|
||||
&-title {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
clear: both;
|
||||
padding: 16px 0 8px 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.b3-chip {
|
||||
padding: 2px 6px;
|
||||
line-height: calc(1.625em - 6px);
|
||||
font-size: 87.5%;
|
||||
}
|
||||
|
||||
& + .av__body .av__gallery {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&-counter {
|
||||
font-size: 87.5%;
|
||||
color: var(--b3-theme-on-surface-light);
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
&-icon {
|
||||
cursor: pointer;
|
||||
color: var(--b3-theme-on-surface-light);
|
||||
transition: var(--b3-transition), opacity 0.3s cubic-bezier(0, 0, 0.2, 1) 0ms;
|
||||
border-radius: var(--b3-border-radius);
|
||||
|
||||
&:hover {
|
||||
color: var(--b3-theme-on-background);
|
||||
background-color: var(--b3-list-icon-hover);
|
||||
}
|
||||
|
||||
svg {
|
||||
padding: 5px;
|
||||
float: left;
|
||||
width: calc(1.625em - 12px);
|
||||
height: calc(1.625em - 12px);
|
||||
transition: transform 0.15s cubic-bezier(0, 0, 0.2, 1);
|
||||
font-size: 87.5%;
|
||||
}
|
||||
|
||||
&--hover {
|
||||
opacity: 0;
|
||||
|
||||
svg {
|
||||
padding: 4px;
|
||||
width: calc(1.625em - 10px);
|
||||
height: calc(1.625em - 10px);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-arrow--open {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
img.av__cellassetimg {
|
||||
|
@ -922,3 +983,21 @@ img.av__cellassetimg {
|
|||
font-size: inherit;
|
||||
cursor: zoom-in;
|
||||
}
|
||||
|
||||
.av__cell,
|
||||
.custom-attr__avvalue {
|
||||
.b3-menu__avemoji {
|
||||
font-size: 1em;
|
||||
line-height: 1.625;
|
||||
height: auto;
|
||||
margin: 0 5px 0 -4px;
|
||||
vertical-align: top;
|
||||
|
||||
img {
|
||||
height: calc(1.625em - 8px);
|
||||
font-size: 1em;
|
||||
width: calc(1.625em - 8px);
|
||||
margin: 4px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,14 @@
|
|||
&[data-type="select"] {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
span.b3-menu__avemoji {
|
||||
line-height: 26px;
|
||||
|
||||
img {
|
||||
margin-top: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&__avheader {
|
||||
|
|
|
@ -174,7 +174,7 @@
|
|||
padding: 0 4px;
|
||||
flex-shrink: 0;
|
||||
border-radius: var(--b3-border-radius);
|
||||
display: flex;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
|
|
|
@ -267,6 +267,10 @@
|
|||
opacity: .38;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
&--hidden {
|
||||
opacity: .38;
|
||||
}
|
||||
}
|
||||
|
||||
&__action {
|
||||
|
@ -281,6 +285,10 @@
|
|||
box-sizing: border-box;
|
||||
translate: var(--b3-transition);
|
||||
|
||||
&--show {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: var(--b3-theme-on-background);
|
||||
background-color: var(--b3-list-icon-hover);
|
||||
|
@ -296,6 +304,13 @@
|
|||
min-width: 84px;
|
||||
}
|
||||
|
||||
&__labels {
|
||||
font-size: 12px;
|
||||
margin-bottom: 4px;
|
||||
line-height: 20px;
|
||||
color: var(--b3-theme-on-surface);
|
||||
}
|
||||
|
||||
&__icon {
|
||||
align-self: center;
|
||||
height: 14px;
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
.b3-snackbar {
|
||||
margin-bottom: 16px;
|
||||
position: relative;
|
||||
transition: transform 256ms cubic-bezier(.45, .05, .55, .95) 0ms;
|
||||
text-align: right;
|
||||
justify-self: end;
|
||||
font-size: var(--b3-font-size);
|
||||
pointer-events: auto;
|
||||
|
||||
&:not(:first-child) {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
&--hide {
|
||||
transform: translate3d(calc(20vw + 48px), 0, 0);
|
||||
|
@ -12,7 +16,7 @@
|
|||
|
||||
&s {
|
||||
position: fixed;
|
||||
right: 12px;
|
||||
right: 30px;
|
||||
top: 22px;
|
||||
// 不能设置死,否则右键菜单会被遮盖 z-index: 999999;
|
||||
max-height: calc(100vh - 32px);
|
||||
|
@ -20,24 +24,16 @@
|
|||
flex-direction: column;
|
||||
transform: translate3d(calc(20vw + 48px), 0, 0);
|
||||
transition: transform .15s cubic-bezier(.4, 0, 1, 1) 0ms;
|
||||
pointer-events: none;
|
||||
|
||||
&--show {
|
||||
transform: translate3d(0, 0, 0) !important;
|
||||
}
|
||||
|
||||
& > .b3-button {
|
||||
align-self: flex-end;
|
||||
margin-right: 18px;
|
||||
}
|
||||
|
||||
& > .fn__flex-1 {
|
||||
padding: 0 18px 0 18px;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
& > .fn__flex-1::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&--error .b3-snackbar__content {
|
||||
padding-left: 47px;
|
||||
|
|
|
@ -183,7 +183,29 @@
|
|||
line-height: calc(1.625em + 8px);
|
||||
|
||||
& ~ [data-type="NodeHeading"] {
|
||||
line-height: 1em;
|
||||
&.h1 {
|
||||
line-height: calc(1.625em / 1.75);
|
||||
}
|
||||
|
||||
&.h2 {
|
||||
line-height: calc(1.625em / 1.55);
|
||||
}
|
||||
|
||||
&.h3 {
|
||||
line-height: calc(1.625em / 1.38);
|
||||
}
|
||||
|
||||
&.h4 {
|
||||
line-height: calc(1.625em / 1.25);
|
||||
}
|
||||
|
||||
&.h5 {
|
||||
line-height: calc(1.625em / 1.13);
|
||||
}
|
||||
|
||||
&.h6 {
|
||||
line-height: 1.625em;
|
||||
}
|
||||
|
||||
& > [spellcheck] {
|
||||
min-height: 1em;
|
||||
|
@ -783,6 +805,10 @@
|
|||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover .av__group-icon--hover {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.av__row--footer .av__calc:hover,
|
||||
.av__cell--header:hover {
|
||||
background-color: transparent;
|
||||
|
@ -797,7 +823,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
.av__row .av__cell[data-block-id] > .block__icon[data-type="copy"] {
|
||||
.av__row .av__cell[data-dtype="block"] > .block__icon[data-type="copy"] {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ export const initBlockPopover = (app: App) => {
|
|||
if (aElement) {
|
||||
let tooltipClass = "";
|
||||
let tip = aElement.getAttribute("aria-label") || "";
|
||||
if (aElement.classList.contains("av__cell")) {
|
||||
if (aElement.classList.contains("av__cell") && !aElement.classList.contains("ariaLabel")) {
|
||||
if (aElement.classList.contains("av__cell--header")) {
|
||||
const textElement = aElement.querySelector(".av__celltext");
|
||||
const desc = aElement.getAttribute("data-desc");
|
||||
|
@ -49,6 +49,7 @@ export const initBlockPopover = (app: App) => {
|
|||
tooltipClass = "href";
|
||||
}
|
||||
}
|
||||
tip = "";
|
||||
if (!tip && aElement.dataset.wrap !== "true" && event.target.dataset.type !== "block-more" && !hasClosestByClassName(event.target, "block__icon")) {
|
||||
aElement.style.overflow = "auto";
|
||||
if (aElement.scrollWidth > aElement.clientWidth + 2) {
|
||||
|
@ -117,7 +118,7 @@ export const initBlockPopover = (app: App) => {
|
|||
const boxData = response.data.boxInfo;
|
||||
const tip = `${boxData.name} <small class='ft__on-surface'>${boxData.hSize}</small>${boxData.docCount !== 0 ? window.siyuan.languages.includeSubFile.replace("x", boxData.docCount) : ""}<br>${window.siyuan.languages.modifiedAt} ${boxData.hMtime}<br>${window.siyuan.languages.createdAt} ${boxData.hCtime}`;
|
||||
const scopeNotebookItemElement = hasClosestByClassName(event.target, "b3-list-item__text");
|
||||
if (notebookItemElement && scopeNotebookItemElement && notebookItemElement.isSameNode(scopeNotebookItemElement)) {
|
||||
if (notebookItemElement && scopeNotebookItemElement && (notebookItemElement === scopeNotebookItemElement)) {
|
||||
showTooltip(tip, notebookItemElement);
|
||||
}
|
||||
if (scopeNotebookItemElement &&
|
||||
|
@ -242,7 +243,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
|
|||
if (!popoverTargetElement && linkElement && linkElement.getAttribute("data-href")?.startsWith("siyuan://blocks")) {
|
||||
popoverTargetElement = linkElement;
|
||||
}
|
||||
if (!popoverTargetElement || (popoverTargetElement && window.siyuan.menus.menu.data?.isSameNode(popoverTargetElement))) {
|
||||
if (!popoverTargetElement || (popoverTargetElement && window.siyuan.menus.menu.data && window.siyuan.menus.menu.data === popoverTargetElement)) {
|
||||
// 移动到弹窗的 loading 元素上,但经过 settimeout 后 loading 已经被移除了
|
||||
// https://ld246.com/article/1673596577519/comment/1673767749885#comments
|
||||
let targetElement = target;
|
||||
|
@ -356,7 +357,7 @@ const getTarget = (event: MouseEvent & { target: HTMLElement }, aElement: false
|
|||
};
|
||||
|
||||
export const showPopover = async (app: App, showRef = false) => {
|
||||
if (!popoverTargetElement || window.siyuan.menus.menu.data?.isSameNode(popoverTargetElement)) {
|
||||
if (!popoverTargetElement || (window.siyuan.menus.menu.data && window.siyuan.menus.menu.data === popoverTargetElement)) {
|
||||
return;
|
||||
}
|
||||
let refDefs: IRefDefs[] = [];
|
||||
|
|
|
@ -10,6 +10,7 @@ import {blockRender} from "../protyle/render/blockRender";
|
|||
import {fetchPost, fetchSyncPost} from "../util/fetch";
|
||||
import {openFileById} from "../editor/util";
|
||||
import {openMobileFileById} from "../mobile/editor";
|
||||
import {mathRender} from "../protyle/render/mathRender";
|
||||
|
||||
export const cancelSB = async (protyle: IProtyle, nodeElement: Element, range?: Range) => {
|
||||
const doOperations: IOperation[] = [];
|
||||
|
@ -73,6 +74,7 @@ export const cancelSB = async (protyle: IProtyle, nodeElement: Element, range?:
|
|||
});
|
||||
previousId = item.getAttribute("data-node-id");
|
||||
});
|
||||
mathRender(protyle.wysiwyg.element);
|
||||
// 超级块内嵌入块无面包屑,需重新渲染 https://github.com/siyuan-note/siyuan/issues/7574
|
||||
doOperations.forEach(item => {
|
||||
const element = protyle.wysiwyg.element.querySelector(`[data-node-id="${item.id}"]`);
|
||||
|
|
|
@ -23,6 +23,7 @@ import {globalCommand} from "./global";
|
|||
import {getDisplayName, getNotebookName, getTopPaths, movePathTo, moveToPath, pathPosix} from "../../../util/pathName";
|
||||
import {hintMoveBlock} from "../../../protyle/hint/extend";
|
||||
import {fetchSyncPost} from "../../../util/fetch";
|
||||
import {focusByRange} from "../../../protyle/util/selection";
|
||||
|
||||
export const commandPanel = (app: App) => {
|
||||
const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : undefined;
|
||||
|
@ -41,7 +42,12 @@ export const commandPanel = (app: App) => {
|
|||
<kbd>${window.siyuan.languages.enterKey}/${window.siyuan.languages.click}</kbd> ${window.siyuan.languages.confirm}
|
||||
<kbd>Esc</kbd> ${window.siyuan.languages.close}
|
||||
</div>
|
||||
</div>`
|
||||
</div>`,
|
||||
destroyCallback() {
|
||||
if (range) {
|
||||
focusByRange(range);
|
||||
}
|
||||
},
|
||||
});
|
||||
dialog.element.setAttribute("data-key", Constants.DIALOG_COMMANDPANEL);
|
||||
const listElement = dialog.element.querySelector("#commands");
|
||||
|
|
|
@ -16,7 +16,7 @@ import {
|
|||
import {newFile} from "../../util/newFile";
|
||||
import {Constants} from "../../constants";
|
||||
import {openSetting} from "../../config";
|
||||
import {getInstanceById} from "../../layout/util";
|
||||
import {getInstanceById, saveLayout} from "../../layout/util";
|
||||
import {getActiveTab, getDockByType, switchTabByIndex} from "../../layout/tabUtil";
|
||||
import {Tab} from "../../layout/Tab";
|
||||
import {Editor} from "../../editor";
|
||||
|
@ -80,7 +80,7 @@ import {bindAVPanelKeydown} from "../../protyle/render/av/keydown";
|
|||
const switchDialogEvent = (app: App, event: MouseEvent) => {
|
||||
event.preventDefault();
|
||||
let target = event.target as HTMLElement;
|
||||
while (!target.isSameNode(switchDialog.element)) {
|
||||
while (target !== switchDialog.element) {
|
||||
if (target.classList.contains("b3-list-item")) {
|
||||
const currentType = target.getAttribute("data-type");
|
||||
if (currentType) {
|
||||
|
@ -490,6 +490,7 @@ const editKeydown = (app: App, event: KeyboardEvent) => {
|
|||
}
|
||||
if (matchHotKey(window.siyuan.config.keymap.editor.general.preview.custom, event)) {
|
||||
setEditMode(protyle, "preview");
|
||||
saveLayout();
|
||||
event.preventDefault();
|
||||
return true;
|
||||
}
|
||||
|
@ -497,11 +498,16 @@ const editKeydown = (app: App, event: KeyboardEvent) => {
|
|||
setEditMode(protyle, "wysiwyg");
|
||||
protyle.scroll.lastScrollTop = 0;
|
||||
fetchPost("/api/filetree/getDoc", {
|
||||
id: protyle.block.parentID,
|
||||
size: window.siyuan.config.editor.dynamicLoadBlocks,
|
||||
id: protyle.block.id,
|
||||
size: protyle.block.id === protyle.block.rootID ? window.siyuan.config.editor.dynamicLoadBlocks : Constants.SIZE_GET_MAX,
|
||||
}, getResponse => {
|
||||
onGet({data: getResponse, protyle});
|
||||
onGet({
|
||||
data: getResponse,
|
||||
protyle,
|
||||
action: protyle.block.id === protyle.block.rootID ? [Constants.CB_GET_FOCUS, Constants.CB_GET_HTML, Constants.CB_GET_UNUNDO] : [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS, Constants.CB_GET_UNUNDO, Constants.CB_GET_HTML]
|
||||
});
|
||||
});
|
||||
saveLayout();
|
||||
event.preventDefault();
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import {getAllTabs} from "../../layout/getAll";
|
|||
import {App} from "../../index";
|
||||
import {Constants} from "../../constants";
|
||||
import {matchHotKey} from "../../protyle/util/hotKey";
|
||||
import {isWindow} from "../../util/functions";
|
||||
|
||||
export const windowKeyUp = (app: App, event: KeyboardEvent) => {
|
||||
window.siyuan.ctrlIsPressed = false;
|
||||
|
@ -22,37 +23,52 @@ export const windowKeyUp = (app: App, event: KeyboardEvent) => {
|
|||
let currentLiElement = switchDialog.element.querySelector(".b3-list-item--focus");
|
||||
currentLiElement.classList.remove("b3-list-item--focus");
|
||||
if (matchHotKey(window.siyuan.config.keymap.general.goToEditTabPrev.custom, event)) {
|
||||
while (true) {
|
||||
if (currentLiElement.previousElementSibling) {
|
||||
currentLiElement.previousElementSibling.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.previousElementSibling;
|
||||
} else if (currentLiElement.getAttribute("data-original")) {
|
||||
currentLiElement.parentElement.lastElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement.removeAttribute("data-original");
|
||||
currentLiElement = currentLiElement.parentElement.lastElementChild;
|
||||
} else if (currentLiElement.parentElement.nextElementSibling) {
|
||||
if (currentLiElement.parentElement.nextElementSibling.lastElementChild) {
|
||||
currentLiElement.parentElement.nextElementSibling.lastElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.parentElement.nextElementSibling.lastElementChild;
|
||||
} else {
|
||||
currentLiElement.parentElement.lastElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.parentElement.lastElementChild;
|
||||
}
|
||||
} else if (currentLiElement.parentElement.previousElementSibling) {
|
||||
currentLiElement.parentElement.previousElementSibling.lastElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.parentElement.previousElementSibling.lastElementChild;
|
||||
} else if (isWindow()) {
|
||||
currentLiElement = currentLiElement.parentElement.lastElementChild;
|
||||
}
|
||||
if (currentLiElement.getBoundingClientRect().height !== 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
currentLiElement.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
while (true) {
|
||||
if (currentLiElement.nextElementSibling) {
|
||||
currentLiElement.nextElementSibling.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.nextElementSibling;
|
||||
} else if (currentLiElement.getAttribute("data-original")) {
|
||||
currentLiElement.parentElement.firstElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement.removeAttribute("data-original");
|
||||
currentLiElement = currentLiElement.parentElement.firstElementChild;
|
||||
} else if (currentLiElement.parentElement.nextElementSibling) {
|
||||
if (currentLiElement.parentElement.nextElementSibling.firstElementChild) {
|
||||
currentLiElement.parentElement.nextElementSibling.firstElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.parentElement.nextElementSibling.firstElementChild;
|
||||
} else {
|
||||
currentLiElement.parentElement.firstElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.parentElement.firstElementChild;
|
||||
}
|
||||
} else if (currentLiElement.parentElement.previousElementSibling) {
|
||||
currentLiElement.parentElement.previousElementSibling.firstElementChild.classList.add("b3-list-item--focus");
|
||||
currentLiElement = currentLiElement.parentElement.previousElementSibling.firstElementChild;
|
||||
} else if (isWindow()) {
|
||||
currentLiElement = currentLiElement.parentElement.firstElementChild;
|
||||
}
|
||||
if (currentLiElement.getBoundingClientRect().height !== 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
currentLiElement = switchDialog.element.querySelector(".b3-list-item--focus");
|
||||
currentLiElement.classList.add("b3-list-item--focus");
|
||||
}
|
||||
if (currentLiElement) {
|
||||
const rootId = currentLiElement.getAttribute("data-node-id");
|
||||
if (rootId) {
|
||||
|
|
|
@ -111,7 +111,7 @@ export const windowMouseMove = (event: MouseEvent, mouseIsEnter: boolean) => {
|
|||
const allModels = getAllModels();
|
||||
let findNode = false;
|
||||
allModels.editor.find(item => {
|
||||
if (item.editor.protyle.wysiwyg.element.isSameNode(eventPath0)) {
|
||||
if (item.editor.protyle.wysiwyg.element === eventPath0) {
|
||||
item.editor.protyle.gutter.render(item.editor.protyle, targetBlockElement, item.editor.protyle.wysiwyg.element, rowElement);
|
||||
findNode = true;
|
||||
return true;
|
||||
|
@ -134,7 +134,7 @@ export const windowMouseMove = (event: MouseEvent, mouseIsEnter: boolean) => {
|
|||
if (!findNode) {
|
||||
allModels.backlink.find(item => {
|
||||
item.editors.find(eItem => {
|
||||
if (eItem.protyle.wysiwyg.element.isSameNode(eventPath0)) {
|
||||
if (eItem.protyle.wysiwyg.element === eventPath0) {
|
||||
eItem.protyle.gutter.render(eItem.protyle, targetBlockElement, eItem.protyle.wysiwyg.element, rowElement);
|
||||
findNode = true;
|
||||
return true;
|
||||
|
|
|
@ -71,7 +71,7 @@ export const makeCard = (app: App, ids: string[]) => {
|
|||
dialog.element.setAttribute("data-key", Constants.DIALOG_MAKECARD);
|
||||
dialog.element.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isSameNode(dialog.element)) {
|
||||
while (target && target !== dialog.element) {
|
||||
const type = target.getAttribute("data-type");
|
||||
if (type === "create") {
|
||||
let msgId = "";
|
||||
|
|
|
@ -150,8 +150,8 @@ export const genCardHTML = (options: {
|
|||
const getEditor = (id: string, protyle: IProtyle, element: Element, currentCard: ICard) => {
|
||||
fetchPost("/api/block/getDocInfo", {
|
||||
id,
|
||||
}, (response) => {
|
||||
protyle.wysiwyg.renderCustom(response.data.ial);
|
||||
}, (docResponse) => {
|
||||
protyle.wysiwyg.renderCustom(docResponse.data.ial);
|
||||
fetchPost("/api/filetree/getDoc", {
|
||||
id,
|
||||
mode: 0,
|
||||
|
@ -163,6 +163,8 @@ const getEditor = (id: string, protyle: IProtyle, element: Element, currentCard:
|
|||
protyle,
|
||||
action: response.data.rootID === response.data.id ? [Constants.CB_GET_HTML] : [Constants.CB_GET_ALL, Constants.CB_GET_HTML],
|
||||
afterCB: () => {
|
||||
protyle.title.element.removeAttribute("data-render");
|
||||
protyle.title.render(protyle, docResponse);
|
||||
let hasHide = false;
|
||||
if (!window.siyuan.config.flashcard.superBlock &&
|
||||
!window.siyuan.config.flashcard.heading &&
|
||||
|
@ -250,6 +252,8 @@ export const bindCardEvent = async (options: {
|
|||
background: false,
|
||||
gutter: true,
|
||||
breadcrumbDocName: true,
|
||||
title: true,
|
||||
hideTitleOnZoom: true,
|
||||
},
|
||||
typewriterMode: false
|
||||
});
|
||||
|
|
|
@ -115,7 +115,7 @@ export const viewCards = (app: App, deckID: string, title: string, deckType: "Tr
|
|||
return;
|
||||
}
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !dialog.element.isSameNode(target)) {
|
||||
while (target && (dialog.element !== target)) {
|
||||
const type = target.getAttribute("data-type");
|
||||
if (type === "close") {
|
||||
dialog.destroy();
|
||||
|
|
|
@ -156,6 +156,26 @@ export const about = {
|
|||
<input class="b3-text-field fn__flex-center fn__size200" min="1" type="number" id="retentionIndexesDaily" value="${window.siyuan.config.repo.retentionIndexesDaily}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.vacuumDataIndex}
|
||||
<div class="b3-label__text">${window.siyuan.languages.vacuumDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="fn__space"></div>
|
||||
<button id="vacuumDataIndex" class="b3-button b3-button--outline fn__size200 fn__flex-center">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.vacuumDataIndex}
|
||||
</button>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.rebuildDataIndex}
|
||||
<div class="b3-label__text">${window.siyuan.languages.rebuildDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="fn__space"></div>
|
||||
<button id="rebuildDataIndex" class="b3-button b3-button--outline fn__size200 fn__flex-center">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.rebuildDataIndex}
|
||||
</button>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.systemLog}
|
||||
|
@ -234,6 +254,12 @@ ${checkUpdateHTML}
|
|||
about.element.querySelector("#tokenTip").innerHTML = window.siyuan.languages.about14.replace("${token}", window.siyuan.config.api.token);
|
||||
});
|
||||
});
|
||||
about.element.querySelector("#vacuumDataIndex").addEventListener("click", () => {
|
||||
fetchPost("/api/system/vacuumDataIndex", {}, () => {});
|
||||
});
|
||||
about.element.querySelector("#rebuildDataIndex").addEventListener("click", () => {
|
||||
fetchPost("/api/system/rebuildDataIndex", {}, () => {});
|
||||
});
|
||||
about.element.querySelector("#exportLog").addEventListener("click", () => {
|
||||
fetchPost("/api/system/exportLog", {}, (response) => {
|
||||
openByMobile(response.data.zip);
|
||||
|
|
|
@ -20,7 +20,11 @@ export const ai = {
|
|||
<div class="b3-label">
|
||||
${window.siyuan.languages.apiTimeout}
|
||||
<div class="fn__hr"></div>
|
||||
<input class="b3-text-field fn__flex-center fn__block" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
|
||||
<div class="fn__flex">
|
||||
<input class="b3-text-field fn__flex-1" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
|
||||
<span class="fn__space"></span>
|
||||
<span class="ft__on-surface fn__flex-center">s</span>
|
||||
</div>
|
||||
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
|
@ -98,7 +102,11 @@ export const ai = {
|
|||
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
|
||||
</div>
|
||||
<span class="fn__space"></span>
|
||||
<input class="b3-text-field fn__flex-center fn__size200" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
|
||||
<div class="fn__size200 fn__flex-center fn__flex">
|
||||
<input class="b3-text-field fn__flex-1" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
|
||||
<span class="fn__space"></span>
|
||||
<span class="ft__on-surface fn__flex-center">s</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fn__flex b3-label">
|
||||
<div class="fn__flex-1">
|
||||
|
|
|
@ -263,6 +263,7 @@ export const appearance = {
|
|||
});
|
||||
return;
|
||||
}
|
||||
|
||||
window.siyuan.config.appearance = data;
|
||||
if (appearance.element) {
|
||||
const modeElement = appearance.element.querySelector("#mode") as HTMLSelectElement;
|
||||
|
|
|
@ -52,6 +52,18 @@ export const fileTree = {
|
|||
<span class="fn__space"></span>
|
||||
<input class="b3-switch fn__flex-center" id="useSingleLineSave" type="checkbox"${window.siyuan.config.fileTree.useSingleLineSave ? " checked" : ""}/>
|
||||
</label>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.fileTree22}
|
||||
<div class="b3-label__text">${window.siyuan.languages.fileTree23}</div>
|
||||
</div>
|
||||
<span class="fn__space"></span>
|
||||
<div class="fn__size200 fn__flex-center fn__flex">
|
||||
<input class="b3-text-field fn__flex-1" id="largeFileWarningSize" type="number" min="2" max="10240" value="${window.siyuan.config.fileTree.largeFileWarningSize}">
|
||||
<span class="fn__space"></span>
|
||||
<span class="ft__on-surface fn__flex-center">MB</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.fileTree16}
|
||||
|
@ -113,6 +125,7 @@ export const fileTree = {
|
|||
allowCreateDeeper: (fileTree.element.querySelector("#allowCreateDeeper") as HTMLInputElement).checked,
|
||||
removeDocWithoutConfirm: (fileTree.element.querySelector("#removeDocWithoutConfirm") as HTMLInputElement).checked,
|
||||
useSingleLineSave: (fileTree.element.querySelector("#useSingleLineSave") as HTMLInputElement).checked,
|
||||
largeFileWarningSize: parseInt((fileTree.element.querySelector("#largeFileWarningSize") as HTMLInputElement).value),
|
||||
maxListCount: parseInt((fileTree.element.querySelector("#maxListCount") as HTMLInputElement).value),
|
||||
maxOpenTabCount: inputMaxOpenTabCount,
|
||||
}, response => {
|
||||
|
|
|
@ -20,6 +20,7 @@ import {publish} from "./publish";
|
|||
import {App} from "../index";
|
||||
import {isHuawei, isInHarmony} from "../protyle/util/compatibility";
|
||||
import {Constants} from "../constants";
|
||||
import {focusByRange} from "../protyle/util/selection";
|
||||
/// #endif
|
||||
|
||||
export const genItemPanel = (type: string, containerElement: Element, app: App) => {
|
||||
|
@ -107,6 +108,10 @@ export const openSetting = (app: App) => {
|
|||
if (exitDialog) {
|
||||
return exitDialog;
|
||||
}
|
||||
let range: Range;
|
||||
if (getSelection().rangeCount > 0) {
|
||||
range = getSelection().getRangeAt(0);
|
||||
}
|
||||
const dialog = new Dialog({
|
||||
content: `<div class="fn__flex-1 fn__flex config__panel" style="overflow: hidden;position: relative">
|
||||
<ul class="b3-tab-bar b3-list b3-list--background">
|
||||
|
@ -152,6 +157,11 @@ export const openSetting = (app: App) => {
|
|||
</div>`,
|
||||
width: "90vw",
|
||||
height: "90vh",
|
||||
destroyCallback() {
|
||||
if (range) {
|
||||
focusByRange(range);
|
||||
}
|
||||
},
|
||||
});
|
||||
dialog.element.setAttribute("data-key", Constants.DIALOG_SETTING);
|
||||
|
||||
|
|
|
@ -475,7 +475,7 @@ export const keymap = {
|
|||
hasConflict = true;
|
||||
}
|
||||
Array.from(keymap.element.querySelectorAll("label.b3-list-item input")).find((inputItem: HTMLElement) => {
|
||||
if (!inputItem.isSameNode(this) && inputItem.getAttribute("data-value") === keymapStr) {
|
||||
if ((inputItem !== this) && inputItem.getAttribute("data-value") === keymapStr) {
|
||||
const inputValueList = inputItem.getAttribute("data-key").split(Constants.ZWSP);
|
||||
if (inputValueList[1] === "list") {
|
||||
inputValueList[1] = "list1";
|
||||
|
|
|
@ -33,7 +33,7 @@ export const initConfigSearch = (element: HTMLElement, app: App) => {
|
|||
// 文档树
|
||||
getLang(["selectOpen", "tabLimit", "fileTree", "fileTree2", "fileTree3", "fileTree4", "fileTree5",
|
||||
"fileTree6", "fileTree7", "fileTree8", "fileTree9", "fileTree10", "fileTree12", "fileTree13", "fileTree15",
|
||||
"fileTree16", "fileTree17", "fileTree21"]),
|
||||
"fileTree16", "fileTree17", "fileTree18", "fileTree19", "fileTree20", "fileTree21", "fileTree22", "fileTree23"]),
|
||||
|
||||
// 闪卡
|
||||
getLang(["riffCard", "flashcardNewCardLimit", "flashcardNewCardLimitTip", "flashcardReviewCardLimit",
|
||||
|
@ -101,8 +101,8 @@ export const initConfigSearch = (element: HTMLElement, app: App) => {
|
|||
"systemLog", "importKey", "genKey", "genKeyByPW", "copyKey", "resetRepo", "systemLogTip", "export",
|
||||
"downloadLatestVer", "safeQuit", "directConnection", "siyuanNote", "key", "password", "copied", "resetRepoTip",
|
||||
"autoDownloadUpdatePkg", "autoDownloadUpdatePkgTip", "networkProxy", "keyPlaceholder", "initRepoKeyTip",
|
||||
"dataRepoPurge", "dataRepoPurgeTip", "dataRepoAutoPurgeIndexRetentionDays",
|
||||
"dataRepoAutoPurgeRetentionIndexesDaily"]),
|
||||
"dataRepoPurge", "dataRepoPurgeTip", "dataRepoAutoPurgeIndexRetentionDays", "dataRepoAutoPurgeRetentionIndexesDaily",
|
||||
"vacuumDataIndex", "vacuumDataIndexTip", "rebuildDataIndex", "rebuildDataIndexTip"]),
|
||||
];
|
||||
const inputElement = element.querySelector(".b3-form__icon input") as HTMLInputElement;
|
||||
/// #if !BROWSER
|
||||
|
|
|
@ -114,7 +114,7 @@ export const openSnippets = () => {
|
|||
dialog.element.setAttribute("data-key", Constants.DIALOG_SNIPPETS);
|
||||
dialog.element.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isSameNode(dialog.element)) {
|
||||
while (target && target !== dialog.element) {
|
||||
if (target.id === "addCodeSnippetCSS" || target.id === "addCodeSnippetJS") {
|
||||
target.parentElement.insertAdjacentHTML("afterend", genSnippet({
|
||||
type: target.id === "addCodeSnippetCSS" ? "css" : "js",
|
||||
|
|
|
@ -225,6 +225,7 @@ export abstract class Constants {
|
|||
public static readonly DIALOG_SAVEWORKSPACE = "dialog-saveworkspace"; // 保存工作空间
|
||||
|
||||
// timeout
|
||||
public static readonly TIMEOUT_OPENDIALOG = 50;
|
||||
public static readonly TIMEOUT_DBLCLICK = 190;
|
||||
public static readonly TIMEOUT_INPUT = 256;
|
||||
public static readonly TIMEOUT_LOAD = 300;
|
||||
|
@ -758,7 +759,7 @@ export abstract class Constants {
|
|||
// common: "bash", "c", "csharp", "cpp", "css", "diff", "go", "xml", "json", "java", "javascript", "kotlin", "less", "lua", "makefile", "markdown", "objectivec", "php", "php-template", "perl", "plaintext", "python", "python-repl", "r", "ruby", "rust", "scss", "sql", "shell", "swift", "ini", "typescript", "vbnet", "yaml", "properties", "1c", "armasm", "avrasm", "actionscript", "ada", "angelscript", "accesslog", "apache", "applescript", "arcade", "arduino", "asciidoc", "aspectj", "abnf", "autohotkey", "autoit", "awk", "basic", "bnf", "dos", "brainfuck", "cal", "cmake", "csp", "cos", "capnproto", "ceylon", "clean", "clojure", "clojure-repl", "coffeescript", "coq", "crystal", "d", "dns", "dart", "delphi", "dts", "django", "dockerfile", "dust", "erb", "elixir", "elm", "erlang", "erlang-repl", "excel", "ebnf", "fsharp", "fix", "flix", "fortran", "gcode", "gams", "gauss", "glsl", "gml", "gherkin", "golo", "gradle", "groovy", "haml", "hsp", "http", "handlebars", "haskell", "haxe", "hy", "irpf90", "isbl", "inform7", "x86asm", "jboss-cli", "julia", "julia-repl", "ldif", "llvm", "lsl", "latex", "lasso", "leaf", "lisp", "livecodeserver", "livescript", "mel", "mipsasm", "matlab", "maxima", "mercury", "axapta", "routeros", "mizar", "mojolicious", "monkey", "moonscript", "n1ql", "nsis", "nestedtext", "nginx", "nim", "nix", "node-repl", "ocaml", "openscad", "ruleslanguage", "oxygene", "pf", "parser3", "pony", "pgsql", "powershell", "processing", "prolog", "protobuf", "puppet", "purebasic", "profile", "q", "qml", "reasonml", "rib", "rsl", "roboconf", "sas", "sml", "sqf", "step21", "scala", "scheme", "scilab", "smali", "smalltalk", "stan", "stata", "stylus", "subunit", "tp", "taggerscript", "tcl", "tap", "thrift", "twig", "vbscript", "vbscript-html", "vhdl", "vala", "verilog", "vim", "wasm", "mathematica", "wren", "xl", "xquery", "zephir", "crmsh", "dsconfig", "graphql",
|
||||
// third: "yul", "solidity", "abap", "hlsl", "gdscript"
|
||||
public static readonly ALIAS_CODE_LANGUAGES: string[] = [
|
||||
"js", "ts", "html", "toml", "c#", "bat",
|
||||
"js", "ts", "html", "toml", "c#", "bat"
|
||||
];
|
||||
public static readonly SIYUAN_RENDER_CODE_LANGUAGES: string[] = [
|
||||
"abc", "plantuml", "mermaid", "flowchart", "echarts", "mindmap", "graphviz", "math"
|
||||
|
|
|
@ -25,7 +25,7 @@ export const confirmDialog = (title: string, text: string,
|
|||
dialog.element.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
const isDispatch = typeof event.detail === "string";
|
||||
while (target && !target.isSameNode(dialog.element) || isDispatch) {
|
||||
while (target && target !== dialog.element || isDispatch) {
|
||||
if (target.id === "cancelDialogConfirmBtn" || (isDispatch && event.detail=== "Escape")) {
|
||||
if (cancel) {
|
||||
cancel(dialog);
|
||||
|
|
|
@ -78,7 +78,7 @@ left:${left || "auto"};top:${top || "auto"}">
|
|||
} else {
|
||||
setTimeout(() => {
|
||||
this.element.classList.add("b3-dialog--open");
|
||||
});
|
||||
}, Constants.TIMEOUT_OPENDIALOG);
|
||||
}
|
||||
/// #if !MOBILE
|
||||
moveResize(this.element.querySelector(".b3-dialog__container"), options.resizeCallback);
|
||||
|
@ -110,8 +110,9 @@ left:${left || "auto"};top:${top || "auto"}">
|
|||
|
||||
public bindInput(inputElement: HTMLInputElement | HTMLTextAreaElement, enterEvent?: () => void, bindEnter = true) {
|
||||
inputElement.focus();
|
||||
let timeStamp: number;
|
||||
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
if (event.isComposing) {
|
||||
if (event.isComposing || event.repeat) {
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
@ -122,6 +123,10 @@ left:${left || "auto"};top:${top || "auto"}">
|
|||
return;
|
||||
}
|
||||
if (!event.shiftKey && isNotCtrl(event) && event.key === "Enter" && enterEvent && bindEnter) {
|
||||
if (timeStamp && event.timeStamp - timeStamp < 124) {
|
||||
return;
|
||||
}
|
||||
timeStamp = event.timeStamp;
|
||||
enterEvent();
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
|
|
@ -3,8 +3,7 @@ import {Constants} from "../constants";
|
|||
|
||||
export const initMessage = () => {
|
||||
const messageElement = document.getElementById("message");
|
||||
messageElement.innerHTML = `<div class="fn__flex-1"></div>
|
||||
<button class="b3-button ft__smaller fn__none">${window.siyuan.languages.clearMessage}</button>`;
|
||||
messageElement.innerHTML = '<div class="fn__flex-1"></div>';
|
||||
messageElement.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isEqualNode(messageElement)) {
|
||||
|
@ -12,13 +11,6 @@ export const initMessage = () => {
|
|||
hideMessage(target.parentElement.getAttribute("data-id"));
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (target.isSameNode(messageElement.lastElementChild)) {
|
||||
target.parentElement.classList.remove("b3-snackbars--show");
|
||||
setTimeout(() => {
|
||||
target.parentElement.firstElementChild.innerHTML = "";
|
||||
}, Constants.TIMEOUT_INPUT);
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (target.tagName === "A" || target.tagName === "BUTTON") {
|
||||
break;
|
||||
} else if (target.classList.contains("b3-snackbar")) {
|
||||
|
@ -45,7 +37,7 @@ export const showMessage = (message: string, timeout = 6000, type = "info", mess
|
|||
if (!messagesElement) {
|
||||
let tempMessages = document.getElementById("tempMessage");
|
||||
if (!tempMessages) {
|
||||
document.body.insertAdjacentHTML("beforeend", `<div style="top: 22px;position: fixed;z-index: 100;right: 12px;line-height: 20px;word-break: break-word;display: flex;flex-direction: column;align-items: flex-end;"
|
||||
document.body.insertAdjacentHTML("beforeend", `<div style="font-size: 14px;top: 22px;position: fixed;z-index: 100;right: 30px;line-height: 20px;word-break: break-word;display: flex;flex-direction: column;align-items: flex-end;"
|
||||
id="tempMessage"></div>`);
|
||||
tempMessages = document.getElementById("tempMessage");
|
||||
}
|
||||
|
|
|
@ -386,7 +386,7 @@ export const transactionError = () => {
|
|||
export const refreshFileTree = (cb?: () => void) => {
|
||||
window.siyuan.storage[Constants.LOCAL_FILEPOSITION] = {};
|
||||
setStorageVal(Constants.LOCAL_FILEPOSITION, window.siyuan.storage[Constants.LOCAL_FILEPOSITION]);
|
||||
fetchPost("/api/filetree/refreshFiletree", {}, () => {
|
||||
fetchPost("/api/system/rebuildDataIndex", {}, () => {
|
||||
if (cb) {
|
||||
cb();
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ export const historyKeydown = (event: KeyboardEvent, dialog: Dialog) => {
|
|||
currentItem = items[items.length - 1];
|
||||
} else {
|
||||
items.find((item, index) => {
|
||||
if (item.isSameNode(currentItem)) {
|
||||
if (item === currentItem) {
|
||||
if (event.key === "ArrowUp") {
|
||||
if (index === 0) {
|
||||
currentItem = items[items.length - 1];
|
||||
|
|
|
@ -128,7 +128,7 @@ export class Tab {
|
|||
// 按 esc 取消的时候应该还原在 dragover 时交换的 tab
|
||||
this.parent.children.forEach((item, index) => {
|
||||
const currentElement = this.headElement.parentElement.children[index];
|
||||
if (!item.headElement.isSameNode(currentElement)) {
|
||||
if (item.headElement !== currentElement) {
|
||||
if (index === 0) {
|
||||
this.headElement.parentElement.firstElementChild.before(item.headElement);
|
||||
} else {
|
||||
|
|
|
@ -170,7 +170,7 @@ export class Wnd {
|
|||
if (!window.siyuan.currentDragOverTabHeadersElement) {
|
||||
window.siyuan.currentDragOverTabHeadersElement = it;
|
||||
} else {
|
||||
if (!window.siyuan.currentDragOverTabHeadersElement.isSameNode(it)) {
|
||||
if (window.siyuan.currentDragOverTabHeadersElement !== it) {
|
||||
window.siyuan.currentDragOverTabHeadersElement.classList.remove("layout-tab-bars--drag");
|
||||
window.siyuan.currentDragOverTabHeadersElement.querySelectorAll(".layout-tab-bar li[data-clone='true']").forEach(item => {
|
||||
item.remove();
|
||||
|
@ -220,7 +220,7 @@ export class Wnd {
|
|||
return;
|
||||
}
|
||||
it.classList.remove("layout-tab-bars--drag");
|
||||
if (!newTabHeaderElement.isSameNode(oldTabHeaderElement) &&
|
||||
if (newTabHeaderElement !== oldTabHeaderElement &&
|
||||
((oldTabHeaderElement.classList.contains("item--pin") && newTabHeaderElement.classList.contains("item--pin")) ||
|
||||
(!oldTabHeaderElement.classList.contains("item--pin") && !newTabHeaderElement.classList.contains("item--pin")))) {
|
||||
const rect = newTabHeaderElement.getClientRects()[0];
|
||||
|
@ -816,7 +816,7 @@ export class Wnd {
|
|||
if (item.headElement.classList.contains("item--focus")) {
|
||||
let latestHeadElement: HTMLElement;
|
||||
Array.from(item.headElement.parentElement.children).forEach((headItem: HTMLElement) => {
|
||||
if (!headItem.isSameNode(item.headElement) &&
|
||||
if (headItem !== item.headElement &&
|
||||
headItem.style.maxWidth !== "0px" // 不对比已移除但还在动画效果中的元素 https://github.com/siyuan-note/siyuan/issues/7878
|
||||
) {
|
||||
if (!latestHeadElement) {
|
||||
|
|
|
@ -278,7 +278,7 @@ export class Backlink extends Model {
|
|||
this.setFocus();
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isEqualNode(this.element)) {
|
||||
if (target.classList.contains("block__icon") && target.parentElement.parentElement.isSameNode(this.element)) {
|
||||
if (target.classList.contains("block__icon") && target.parentElement.parentElement === this.element) {
|
||||
const type = target.getAttribute("data-type");
|
||||
switch (type) {
|
||||
case "refresh":
|
||||
|
@ -433,7 +433,7 @@ export class Backlink extends Model {
|
|||
if (svgElement.classList.contains("b3-list-item__arrow--open")) {
|
||||
svgElement.classList.remove("b3-list-item__arrow--open");
|
||||
this.editors.find((item, index) => {
|
||||
if (item.protyle.block.rootID === docId && liElement.nextElementSibling && item.protyle.element.isSameNode(liElement.nextElementSibling)) {
|
||||
if (item.protyle.block.rootID === docId && liElement.nextElementSibling && item.protyle.element === liElement.nextElementSibling) {
|
||||
item.destroy();
|
||||
this.editors.splice(index, 1);
|
||||
liElement.nextElementSibling.remove();
|
||||
|
|
|
@ -178,7 +178,7 @@ export class Outline extends Model {
|
|||
break;
|
||||
}
|
||||
break;
|
||||
} else if (this.blockId && (target.isSameNode(this.headerElement.nextElementSibling) || target.classList.contains("block__icons"))) {
|
||||
} else if (this.blockId && (target === this.headerElement.nextElementSibling || target.classList.contains("block__icons"))) {
|
||||
openFileById({
|
||||
app: options.app,
|
||||
id: this.blockId,
|
||||
|
@ -269,7 +269,7 @@ export class Outline extends Model {
|
|||
this.element.querySelectorAll(".dragover__top, .dragover__bottom, .dragover, .dragover__current").forEach(item => {
|
||||
item.classList.remove("dragover__top", "dragover__bottom", "dragover", "dragover__current");
|
||||
});
|
||||
if (selectItem.isSameNode(item)) {
|
||||
if (selectItem === item) {
|
||||
selectItem.classList.add("dragover__current");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -186,13 +186,13 @@ export class Dock {
|
|||
const targetItem = hasClosestByClassName(moveEvent.target as HTMLElement, "dock__item") ||
|
||||
hasClosestByClassName(moveEvent.target as HTMLElement, "dock__items") as HTMLElement ||
|
||||
hasClosestByClassName(moveEvent.target as HTMLElement, "dock__item--space") as HTMLElement;
|
||||
if (targetItem && selectItem && targetItem.isSameNode(selectItem)) {
|
||||
if (targetItem && selectItem && targetItem === selectItem) {
|
||||
if (selectItem.classList.contains("dock__item--space")) {
|
||||
const selectRect = selectItem.getBoundingClientRect();
|
||||
if (selectItem.parentElement.id === "dockBottom") {
|
||||
if (moveEvent.clientX < selectRect.right && moveEvent.clientX > selectRect.right - 40) {
|
||||
const lastFirstElement = selectItem.nextElementSibling.firstElementChild;
|
||||
if (lastFirstElement && lastFirstElement.isSameNode(item)) {
|
||||
if (lastFirstElement && lastFirstElement === item) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
|
@ -202,7 +202,7 @@ export class Dock {
|
|||
} else {
|
||||
if (moveEvent.clientY < selectRect.bottom && moveEvent.clientY > selectRect.bottom - 40) {
|
||||
const lastFirstElement = selectItem.nextElementSibling.firstElementChild;
|
||||
if (lastFirstElement && lastFirstElement.isSameNode(item)) {
|
||||
if (lastFirstElement && lastFirstElement === item) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
|
@ -211,7 +211,7 @@ export class Dock {
|
|||
}
|
||||
}
|
||||
} else if (selectItem.classList.contains("dock__item--pin")) {
|
||||
if (item.nextElementSibling?.isSameNode(selectItem)) {
|
||||
if (item.nextElementSibling && item.nextElementSibling === selectItem) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
|
@ -221,14 +221,14 @@ export class Dock {
|
|||
const selectRect = selectItem.getBoundingClientRect();
|
||||
if (selectItem.parentElement.parentElement.id === "dockBottom") {
|
||||
if (selectRect.left + selectRect.width / 2 > moveEvent.clientX) {
|
||||
if (item.nextElementSibling?.isSameNode(selectItem)) {
|
||||
if (item.nextElementSibling && item.nextElementSibling === selectItem) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
selectItem.before(moveItem);
|
||||
}
|
||||
} else {
|
||||
if (item.previousElementSibling?.isSameNode(selectItem)) {
|
||||
if (item.previousElementSibling && item.previousElementSibling === selectItem) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
|
@ -237,14 +237,14 @@ export class Dock {
|
|||
}
|
||||
} else {
|
||||
if (selectRect.top + selectRect.height / 2 > moveEvent.clientY) {
|
||||
if (item.nextElementSibling?.isSameNode(selectItem)) {
|
||||
if (item.nextElementSibling && item.nextElementSibling === selectItem) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
selectItem.before(moveItem);
|
||||
}
|
||||
} else {
|
||||
if (item.previousElementSibling?.isSameNode(selectItem)) {
|
||||
if (item.previousElementSibling && item.previousElementSibling === selectItem) {
|
||||
moveItem.classList.add("fn__none");
|
||||
} else {
|
||||
moveItem.classList.remove("fn__none");
|
||||
|
@ -266,8 +266,8 @@ export class Dock {
|
|||
}
|
||||
return;
|
||||
}
|
||||
if (!targetItem || targetItem.style.position === "fixed" || targetItem.isSameNode(item) || targetItem.id === "dockMoveItem") {
|
||||
if (targetItem && targetItem.isSameNode(item)) {
|
||||
if (!targetItem || targetItem.style.position === "fixed" || (targetItem === item) || targetItem.id === "dockMoveItem") {
|
||||
if (targetItem && targetItem === item) {
|
||||
moveItem.classList.add("fn__none");
|
||||
}
|
||||
return;
|
||||
|
@ -295,7 +295,7 @@ export class Dock {
|
|||
} else if (moveItem.parentElement.parentElement.id === "dockRight") {
|
||||
dock = window.siyuan.layout.rightDock;
|
||||
}
|
||||
dock.add(moveItem.parentElement.isSameNode(dock.element.firstElementChild) ? 0 : 1, item, moveItem.previousElementSibling?.getAttribute("data-type"));
|
||||
dock.add(moveItem.parentElement === dock.element.firstElementChild ? 0 : 1, item, moveItem.previousElementSibling?.getAttribute("data-type"));
|
||||
}
|
||||
moveItem.remove();
|
||||
};
|
||||
|
|
|
@ -134,6 +134,7 @@ export const initBar = (app: App) => {
|
|||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "barmode");
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "themeLight",
|
||||
label: window.siyuan.languages.themeLight,
|
||||
icon: "iconLight",
|
||||
current: window.siyuan.config.appearance.mode === 0 && !window.siyuan.config.appearance.modeOS,
|
||||
|
@ -142,6 +143,7 @@ export const initBar = (app: App) => {
|
|||
}
|
||||
}).element);
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "themeDark",
|
||||
label: window.siyuan.languages.themeDark,
|
||||
current: window.siyuan.config.appearance.mode === 1 && !window.siyuan.config.appearance.modeOS,
|
||||
icon: "iconDark",
|
||||
|
@ -150,6 +152,7 @@ export const initBar = (app: App) => {
|
|||
}
|
||||
}).element);
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "themeOS",
|
||||
label: window.siyuan.languages.themeOS,
|
||||
current: window.siyuan.config.appearance.modeOS,
|
||||
icon: "iconMode",
|
||||
|
|
|
@ -667,7 +667,9 @@ export const resizeTopBar = () => {
|
|||
return;
|
||||
}
|
||||
const dragElement = toolbarElement.querySelector("#drag") as HTMLElement;
|
||||
|
||||
if (!dragElement) {
|
||||
return;
|
||||
}
|
||||
dragElement.style.padding = "";
|
||||
const barMoreElement = toolbarElement.querySelector("#barMore");
|
||||
barMoreElement.classList.remove("fn__none");
|
||||
|
@ -857,17 +859,17 @@ export const addResize = (obj: Layout | Wnd) => {
|
|||
if (previousNowSize < 8 || nextNowSize < 8) {
|
||||
return;
|
||||
}
|
||||
if (window.siyuan.layout.leftDock?.layout.element.isSameNode(previousElement) &&
|
||||
if (window.siyuan.layout.leftDock && window.siyuan.layout.leftDock.layout.element === previousElement &&
|
||||
previousNowSize < getMinSize(previousElement) &&
|
||||
// https://github.com/siyuan-note/siyuan/issues/10506
|
||||
previousNowSize < previousSize) {
|
||||
return;
|
||||
}
|
||||
if (window.siyuan.layout.rightDock?.layout.element.isSameNode(nextElement) &&
|
||||
if (window.siyuan.layout.rightDock && window.siyuan.layout.rightDock.layout.element === nextElement &&
|
||||
nextNowSize < getMinSize(nextElement) && nextNowSize < nextSize) {
|
||||
return;
|
||||
}
|
||||
if (window.siyuan.layout.bottomDock?.layout.element.isSameNode(nextElement) &&
|
||||
if (window.siyuan.layout.bottomDock && window.siyuan.layout.bottomDock.layout.element === nextElement &&
|
||||
nextNowSize < 64 && nextNowSize < nextSize) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ export class Menu {
|
|||
}
|
||||
const subMenuElement = itemElement.querySelector(".b3-menu__submenu") as HTMLElement;
|
||||
this.element.querySelectorAll(".b3-menu__item--show").forEach((item) => {
|
||||
if (!item.contains(itemElement) && !item.isSameNode(itemElement) && !itemElement.contains(item)) {
|
||||
if (!item.contains(itemElement) && item !== itemElement && !itemElement.contains(item)) {
|
||||
item.classList.remove("b3-menu__item--show");
|
||||
}
|
||||
});
|
||||
|
|
|
@ -6,7 +6,7 @@ import {getSearch, isMobile, isValidAttrName} from "../util/functions";
|
|||
import {isLocalPath, movePathTo, moveToPath, pathPosix} from "../util/pathName";
|
||||
import {MenuItem} from "./Menu";
|
||||
import {saveExport} from "../protyle/export";
|
||||
import {isInAndroid, isInHarmony, openByMobile} from "../protyle/util/compatibility";
|
||||
import {isInAndroid, isInHarmony, openByMobile, writeText} from "../protyle/util/compatibility";
|
||||
import {fetchPost, fetchSyncPost} from "../util/fetch";
|
||||
import {hideMessage, showMessage} from "../dialog/message";
|
||||
import {Dialog} from "../dialog";
|
||||
|
@ -259,7 +259,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
|
|||
if (typeof event.detail === "string") {
|
||||
target = dialog.element.querySelector(`.item--full[data-type="${event.detail}"]`);
|
||||
}
|
||||
while (!target.isSameNode(dialog.element)) {
|
||||
while (target !== dialog.element) {
|
||||
const type = target.dataset.action;
|
||||
if (target.classList.contains("item--full")) {
|
||||
target.parentElement.querySelector(".item--focus").classList.remove("item--focus");
|
||||
|
@ -380,8 +380,8 @@ export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?:
|
|||
});
|
||||
};
|
||||
|
||||
export const copySubMenu = (ids: string[], accelerator = true, focusElement?: Element) => {
|
||||
return [{
|
||||
export const copySubMenu = (ids: string[], accelerator = true, focusElement?: Element, stdMarkdownId?: string) => {
|
||||
const menuItems = [{
|
||||
id: "copyBlockRef",
|
||||
iconHTML: "",
|
||||
accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyBlockRef.custom : undefined,
|
||||
|
@ -448,6 +448,32 @@ export const copySubMenu = (ids: string[], accelerator = true, focusElement?: El
|
|||
}
|
||||
}
|
||||
}];
|
||||
|
||||
if (stdMarkdownId) {
|
||||
menuItems.push({
|
||||
id: "copyMarkdown",
|
||||
iconHTML: "",
|
||||
label: window.siyuan.languages.copyMarkdown,
|
||||
accelerator: undefined,
|
||||
click: async () => {
|
||||
const response = await fetchSyncPost("/api/export/exportMdContent", {
|
||||
id: stdMarkdownId,
|
||||
refMode: 3,
|
||||
embedMode: 1,
|
||||
yfm: false,
|
||||
fillCSSVar: false,
|
||||
adjustHeadingLevel: false
|
||||
});
|
||||
const text = response.data.content;
|
||||
writeText(text);
|
||||
if (focusElement) {
|
||||
focusBlock(focusElement);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return menuItems;
|
||||
};
|
||||
|
||||
export const exportMd = (id: string) => {
|
||||
|
|
|
@ -447,7 +447,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
|
|||
const paths: string[] = [];
|
||||
Array.from(liElement.parentElement.children).forEach((item) => {
|
||||
if (item.tagName === "LI") {
|
||||
if (item.isSameNode(liElement)) {
|
||||
if (item === liElement) {
|
||||
paths.push(undefined);
|
||||
}
|
||||
paths.push(item.getAttribute("data-path"));
|
||||
|
@ -472,7 +472,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
|
|||
Array.from(liElement.parentElement.children).forEach((item) => {
|
||||
if (item.tagName === "LI") {
|
||||
paths.push(item.getAttribute("data-path"));
|
||||
if (item.isSameNode(liElement)) {
|
||||
if (item === liElement) {
|
||||
paths.push(undefined);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -66,6 +66,7 @@ import {showMessage} from "../dialog/message";
|
|||
import {img3115} from "../boot/compatibleVersion";
|
||||
import {hideTooltip} from "../dialog/tooltip";
|
||||
import {clearSelect} from "../protyle/util/clearSelect";
|
||||
import {scrollCenter} from "../util/highlightById";
|
||||
|
||||
const renderAssetList = (element: Element, k: string, position: IPosition, exts: string[] = []) => {
|
||||
fetchPost("/api/search/searchAsset", {
|
||||
|
@ -620,7 +621,7 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
|
|||
}
|
||||
});
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "iconRefresh",
|
||||
id: "turnInto",
|
||||
label: window.siyuan.languages.turnInto,
|
||||
icon: "iconRefresh",
|
||||
submenu
|
||||
|
@ -1020,7 +1021,7 @@ export const zoomOut = (options: {
|
|||
}
|
||||
focusBlock(showElement);
|
||||
const resizeObserver = new ResizeObserver(() => {
|
||||
showElement.scrollIntoView();
|
||||
scrollCenter(options.protyle, focusElement, true, "smooth");
|
||||
});
|
||||
resizeObserver.observe(options.protyle.wysiwyg.element);
|
||||
setTimeout(() => {
|
||||
|
@ -2142,7 +2143,7 @@ export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement:
|
|||
if (prueTrElement) {
|
||||
const tbodyElement = nodeElement.querySelector("tbody");
|
||||
const theadElement = nodeElement.querySelector("thead");
|
||||
while (!prueTrElement.isSameNode(theadElement.lastElementChild)) {
|
||||
while (prueTrElement !== theadElement.lastElementChild) {
|
||||
tbodyElement.insertAdjacentElement("afterbegin", theadElement.lastElementChild);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -352,7 +352,7 @@ const initSearchEvent = (app: App, element: Element, config: Config.IUILayoutTab
|
|||
const localSearch = window.siyuan.storage[Constants.LOCAL_SEARCHASSET] as ISearchAssetOption;
|
||||
element.addEventListener("click", (event: MouseEvent) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isSameNode(element)) {
|
||||
while (target && (target !== element)) {
|
||||
const type = target.getAttribute("data-type");
|
||||
if (type === "replaceHistory") {
|
||||
toggleReplaceHistory(target.nextElementSibling as HTMLInputElement);
|
||||
|
|
|
@ -94,6 +94,22 @@ export const initAbout = () => {
|
|||
<input class="b3-text-field fn__block" style="padding-right: 64px;" id="retentionIndexesDaily" min="1" type="number" class="b3-text-field" value="${window.siyuan.config.repo.retentionIndexesDaily}">
|
||||
<div class="b3-label__text">${window.siyuan.languages.dataRepoAutoPurgeRetentionIndexesDaily}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.vacuumDataIndex}
|
||||
<div class="fn__hr"></div>
|
||||
<button class="b3-button b3-button--outline fn__block" id="vacuumDataIndex">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.vacuumDataIndex}
|
||||
</button>
|
||||
<div class="b3-label__text">${window.siyuan.languages.vacuumDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.rebuildDataIndex}
|
||||
<div class="fn__hr"></div>
|
||||
<button class="b3-button b3-button--outline fn__block" id="rebuildDataIndex">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.rebuildDataIndex}
|
||||
</button>
|
||||
<div class="b3-label__text">${window.siyuan.languages.rebuildDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.systemLog}
|
||||
<div class="fn__hr"></div>
|
||||
|
@ -182,7 +198,7 @@ export const initAbout = () => {
|
|||
const importKeyElement = modelMainElement.querySelector("#importKey");
|
||||
modelMainElement.firstElementChild.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isSameNode(modelMainElement)) {
|
||||
while (target && (target !== modelMainElement)) {
|
||||
if (target.id === "authCode") {
|
||||
setAccessAuthCode();
|
||||
event.preventDefault();
|
||||
|
@ -283,6 +299,16 @@ export const initAbout = () => {
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "vacuumDataIndex") {
|
||||
fetchPost("/api/system/vacuumDataIndex", {}, () => {});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "rebuildDataIndex") {
|
||||
fetchPost("/api/system/rebuildDataIndex", {}, () => {});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "exportLog") {
|
||||
fetchPost("/api/system/exportLog", {}, (response) => {
|
||||
openByMobile(response.data.zip);
|
||||
|
|
|
@ -135,7 +135,7 @@ ${renewHTML}<div class="fn__hr--b"></div>`;
|
|||
if (typeof event.detail !== "number") {
|
||||
target = event.detail;
|
||||
}
|
||||
while (target && !target.isSameNode(modelMainElement)) {
|
||||
while (target && target !== modelMainElement) {
|
||||
if (target.getAttribute("data-action") === "iOSPay") {
|
||||
iOSPurchase(target.getAttribute("data-type"));
|
||||
event.preventDefault();
|
||||
|
|
|
@ -30,6 +30,16 @@ export const initFileTree = () => {
|
|||
<span class="fn__space"></span>
|
||||
<input class="b3-switch fn__flex-center" id="useSingleLineSave" type="checkbox"${window.siyuan.config.fileTree.useSingleLineSave ? " checked" : ""}/>
|
||||
</label>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.fileTree22}
|
||||
<span class="fn__hr"></span>
|
||||
<div class="fn__flex">
|
||||
<input class="b3-text-field fn__flex-1" id="largeFileWarningSize" type="number" min="2" max="10240" value="${window.siyuan.config.fileTree.largeFileWarningSize}">
|
||||
<span class="fn__space"></span>
|
||||
<span class="ft__on-surface fn__flex-center">MB</span>
|
||||
</div>
|
||||
<div class="b3-label__text">${window.siyuan.languages.fileTree23}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.fileTree16}
|
||||
<span class="fn__hr"></span>
|
||||
|
@ -69,6 +79,7 @@ export const initFileTree = () => {
|
|||
allowCreateDeeper: (modelMainElement.querySelector("#allowCreateDeeper") as HTMLInputElement).checked,
|
||||
removeDocWithoutConfirm: (modelMainElement.querySelector("#removeDocWithoutConfirm") as HTMLInputElement).checked,
|
||||
useSingleLineSave: (modelMainElement.querySelector("#useSingleLineSave") as HTMLInputElement).checked,
|
||||
largeFileWarningSize: parseInt((modelMainElement.querySelector("#largeFileWarningSize") as HTMLInputElement).value),
|
||||
maxListCount: parseInt((modelMainElement.querySelector("#maxListCount") as HTMLInputElement).value),
|
||||
maxOpenTabCount: window.siyuan.config.fileTree.maxOpenTabCount,
|
||||
}, response => {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import {confirmDialog} from "../dialog/confirmDialog";
|
||||
import {Plugin} from "./index";
|
||||
import {showMessage} from "../dialog/message";
|
||||
import {hideMessage, showMessage} from "../dialog/message";
|
||||
import {Dialog} from "../dialog";
|
||||
import {fetchGet, fetchPost, fetchSyncPost} from "../util/fetch";
|
||||
import {getBackend, getFrontend} from "../util/functions";
|
||||
|
@ -19,7 +19,7 @@ import {Protyle} from "../protyle";
|
|||
import {openMobileFileById} from "../mobile/editor";
|
||||
import {lockScreen, exitSiYuan} from "../dialog/processSystem";
|
||||
import {Model} from "../layout/Model";
|
||||
import {getDockByType} from "../layout/tabUtil";
|
||||
import {getActiveTab, getDockByType} from "../layout/tabUtil";
|
||||
/// #if !MOBILE
|
||||
import {getAllModels} from "../layout/getAll";
|
||||
/// #endif
|
||||
|
@ -29,6 +29,7 @@ import {openAttr, openFileAttr} from "../menus/commonMenuItem";
|
|||
import {globalCommand} from "../boot/globalEvent/command/global";
|
||||
import {exportLayout} from "../layout/util";
|
||||
import {saveScroll} from "../protyle/scroll/saveScroll";
|
||||
import {hasClosestByClassName} from "../protyle/util/hasClosest";
|
||||
|
||||
let openTab;
|
||||
let openWindow;
|
||||
|
@ -212,11 +213,47 @@ const saveLayout = (cb: () => void) => {
|
|||
/// #endif
|
||||
};
|
||||
|
||||
const getActiveEditor = (wndActive = true) => {
|
||||
let editor;
|
||||
/// #if !MOBILE
|
||||
const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : null;
|
||||
const allEditor = getAllEditor();
|
||||
if (range) {
|
||||
editor = allEditor.find(item => {
|
||||
if (item.protyle.element.contains(range.startContainer)) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!editor) {
|
||||
editor = allEditor.find(item => {
|
||||
if (hasClosestByClassName(item.protyle.element, "layout__wnd--active", true)) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!editor && !wndActive) {
|
||||
let activeTime = 0;
|
||||
allEditor.forEach(item => {
|
||||
const headerElement = item.protyle?.model.parent.headElement;
|
||||
if (headerElement && headerElement.classList.contains("item--focus") && parseInt(headerElement.dataset.activetime) > activeTime) {
|
||||
activeTime = parseInt(headerElement.dataset.activetime);
|
||||
editor = item;
|
||||
}
|
||||
});
|
||||
}
|
||||
/// #else
|
||||
editor = window.siyuan.mobile.popEditor || window.siyuan.mobile.editor;
|
||||
/// #endif
|
||||
return editor;
|
||||
};
|
||||
|
||||
export const API = {
|
||||
adaptHotkey: updateHotkeyTip,
|
||||
confirm: confirmDialog,
|
||||
Constants,
|
||||
showMessage,
|
||||
hideMessage,
|
||||
fetchPost,
|
||||
fetchSyncPost,
|
||||
fetchGet,
|
||||
|
@ -235,8 +272,10 @@ export const API = {
|
|||
Setting,
|
||||
getAllEditor,
|
||||
/// #if !MOBILE
|
||||
getActiveTab,
|
||||
getAllModels,
|
||||
/// #endif
|
||||
getActiveEditor,
|
||||
platformUtils,
|
||||
openSetting,
|
||||
openAttributePanel,
|
||||
|
|
|
@ -6,7 +6,7 @@ import {isMobile, isWindow} from "../util/functions";
|
|||
import {Custom} from "../layout/dock/Custom";
|
||||
import {getAllModels} from "../layout/getAll";
|
||||
import {Tab} from "../layout/Tab";
|
||||
import {setPanelFocus} from "../layout/util";
|
||||
import {resizeTopBar, setPanelFocus} from "../layout/util";
|
||||
import {getDockByType} from "../layout/tabUtil";
|
||||
///#else
|
||||
import {MobileCustom} from "../mobile/dock/MobileCustom";
|
||||
|
@ -155,9 +155,20 @@ export class Plugin {
|
|||
}
|
||||
|
||||
public addIcons(svg: string) {
|
||||
const svgElement = document.querySelector(`svg[data-name="${this.name}"] defs`);
|
||||
if (svgElement) {
|
||||
svgElement.insertAdjacentHTML("afterbegin", svg);
|
||||
} else {
|
||||
const lastSvgElement = document.querySelector("body > svg:last-of-type");
|
||||
if (lastSvgElement) {
|
||||
lastSvgElement.insertAdjacentHTML("afterend", `<svg data-name="${this.name}" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>${svg}</defs></svg>`);
|
||||
} else {
|
||||
document.body.insertAdjacentHTML("afterbegin", `<svg data-name="${this.name}" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>${svg}</defs></svg>`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public addTopBar(options: {
|
||||
icon: string,
|
||||
|
@ -183,6 +194,17 @@ export class Plugin {
|
|||
iconElement.innerHTML = options.icon.startsWith("icon") ? `<svg><use xlink:href="#${options.icon}"></use></svg>` : options.icon;
|
||||
iconElement.addEventListener("click", options.callback);
|
||||
iconElement.setAttribute("data-location", options.position || "right");
|
||||
resizeTopBar();
|
||||
}
|
||||
if (isMobile() && window.siyuan.storage) {
|
||||
if (!window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(iconElement.id)) {
|
||||
document.querySelector("#menuAbout")?.after(iconElement);
|
||||
}
|
||||
} else if (!isWindow() && window.siyuan.storage) {
|
||||
if (window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(iconElement.id)) {
|
||||
iconElement.classList.add("fn__none");
|
||||
}
|
||||
document.querySelector("#" + (iconElement.getAttribute("data-location") === "right" ? "barPlugins" : "drag"))?.before(iconElement);
|
||||
}
|
||||
this.topBarIcons.push(iconElement);
|
||||
return iconElement;
|
||||
|
@ -195,6 +217,14 @@ export class Plugin {
|
|||
/// #if !MOBILE
|
||||
options.element.setAttribute("data-location", options.position || "right");
|
||||
this.statusBarIcons.push(options.element);
|
||||
const statusElement = document.getElementById("status");
|
||||
if (statusElement) {
|
||||
if (options.element.getAttribute("data-location") === "right") {
|
||||
statusElement.insertAdjacentElement("beforeend", options.element);
|
||||
} else {
|
||||
statusElement.insertAdjacentElement("afterbegin", options.element);
|
||||
}
|
||||
}
|
||||
return options.element;
|
||||
/// #endif
|
||||
}
|
||||
|
|
|
@ -129,6 +129,9 @@ export const afterLoadPlugin = (plugin: Plugin) => {
|
|||
|
||||
if (!isWindow() || isMobile()) {
|
||||
plugin.topBarIcons.forEach(element => {
|
||||
if (document.contains(element)) {
|
||||
return;
|
||||
}
|
||||
if (isMobile()) {
|
||||
if (!window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(element.id)) {
|
||||
document.querySelector("#menuAbout").after(element);
|
||||
|
@ -144,6 +147,9 @@ export const afterLoadPlugin = (plugin: Plugin) => {
|
|||
/// #if !MOBILE
|
||||
resizeTopBar();
|
||||
plugin.statusBarIcons.forEach(element => {
|
||||
if (document.contains(element)) {
|
||||
return;
|
||||
}
|
||||
const statusElement = document.getElementById("status");
|
||||
if (element.getAttribute("data-location") === "right") {
|
||||
statusElement.insertAdjacentElement("beforeend", element);
|
||||
|
|
|
@ -10,6 +10,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
const menu = new Menu("topBarPlugin");
|
||||
/// #if !MOBILE
|
||||
menu.addItem({
|
||||
id: "manage",
|
||||
icon: "iconSettings",
|
||||
label: window.siyuan.languages.manage,
|
||||
ignore: isHuawei() || window.siyuan.config.readonly,
|
||||
|
@ -17,16 +18,23 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
openSetting(app).element.querySelector('.b3-tab-bar [data-name="bazaar"]').dispatchEvent(new CustomEvent("click"));
|
||||
}
|
||||
});
|
||||
menu.addSeparator(undefined, isHuawei() || window.siyuan.config.readonly);
|
||||
menu.addSeparator({id: "separator_1"}, isHuawei() || window.siyuan.config.readonly);
|
||||
/// #endif
|
||||
let hasPlugin = false;
|
||||
app.plugins.forEach((plugin) => {
|
||||
// @ts-ignore
|
||||
const hasSetting = plugin.setting || plugin.__proto__.hasOwnProperty("openSetting");
|
||||
let hasTopBar = false;
|
||||
plugin.topBarIcons.forEach(item => {
|
||||
for (let i = 0; i < plugin.topBarIcons.length; i++) {
|
||||
const item = plugin.topBarIcons[i];
|
||||
if (!document.contains(item)) {
|
||||
plugin.topBarIcons.splice(i, 1);
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
const hasUnpin = window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(item.id);
|
||||
const submenu = [{
|
||||
id: hasUnpin ? "pin" : "unpin",
|
||||
icon: hasUnpin ? "iconPin" : "iconUnpin",
|
||||
label: hasUnpin ? window.siyuan.languages.pin : window.siyuan.languages.unpin,
|
||||
click() {
|
||||
|
@ -43,6 +51,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
}];
|
||||
if (hasSetting) {
|
||||
submenu.push({
|
||||
id: "config",
|
||||
icon: "iconSettings",
|
||||
label: window.siyuan.languages.config,
|
||||
click() {
|
||||
|
@ -53,6 +62,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
const itemLabel = target ? item.getAttribute("aria-label") : item.textContent.trim();
|
||||
if (!target) {
|
||||
submenu.push({
|
||||
id: "play",
|
||||
icon: "iconPlay",
|
||||
label: itemLabel,
|
||||
click() {
|
||||
|
@ -62,6 +72,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
});
|
||||
}
|
||||
const menuOption: IMenu = {
|
||||
id: item.id,
|
||||
icon: "iconInfo",
|
||||
label: itemLabel,
|
||||
click: target ? () => {
|
||||
|
@ -80,10 +91,11 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
menu.addItem(menuOption);
|
||||
hasPlugin = true;
|
||||
hasTopBar = true;
|
||||
});
|
||||
}
|
||||
if (!hasTopBar && hasSetting) {
|
||||
hasPlugin = true;
|
||||
menu.addItem({
|
||||
id: plugin.name,
|
||||
icon: "iconSettings",
|
||||
label: plugin.displayName,
|
||||
click() {
|
||||
|
@ -97,6 +109,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
|
|||
window.siyuan.menus.menu.element.querySelector(".b3-menu__separator")?.remove();
|
||||
} else {
|
||||
menu.addItem({
|
||||
id: "emptyContent",
|
||||
iconHTML: "",
|
||||
type: "readonly",
|
||||
label: window.siyuan.languages.emptyContent,
|
||||
|
|
|
@ -32,9 +32,12 @@ export const uninstall = (app: App, name: string, isUninstall = false) => {
|
|||
});
|
||||
/// #endif
|
||||
// rm topBar
|
||||
plugin.topBarIcons.forEach(item => {
|
||||
for (let i = 0; i < plugin.topBarIcons.length; i++) {
|
||||
const item = plugin.topBarIcons[i];
|
||||
item.remove();
|
||||
});
|
||||
plugin.topBarIcons.splice(i, 1);
|
||||
i--;
|
||||
}
|
||||
/// #if !MOBILE
|
||||
resizeTopBar();
|
||||
// rm statusBar
|
||||
|
@ -62,6 +65,8 @@ export const uninstall = (app: App, name: string, isUninstall = false) => {
|
|||
});
|
||||
// rm plugin
|
||||
app.plugins.splice(index, 1);
|
||||
// rm icons
|
||||
document.querySelector(`svg[data-name="${plugin.name}"]`)?.remove();
|
||||
// rm protyle toolbar
|
||||
getAllEditor().forEach(editor => {
|
||||
editor.protyle.toolbar.update(editor.protyle);
|
||||
|
|
|
@ -26,7 +26,7 @@ export const net2LocalAssets = (protyle: IProtyle, type: "Assets" | "Img") => {
|
|||
/// #else
|
||||
getAllEditor().forEach(item => {
|
||||
if (item.protyle.block.rootID === protyle.block.rootID) {
|
||||
reloadProtyle(item.protyle, item.protyle.element.isSameNode(protyle.element));
|
||||
reloadProtyle(item.protyle, item.protyle.element === protyle.element);
|
||||
}
|
||||
});
|
||||
/// #endif
|
||||
|
@ -95,7 +95,7 @@ export const fullscreen = (element: Element, btnElement?: Element) => {
|
|||
window.siyuan.editorIsFullscreen = !isFullscreen;
|
||||
}
|
||||
getAllModels().editor.forEach(item => {
|
||||
if (!element.isSameNode(item.element)) {
|
||||
if (element !== item.element) {
|
||||
if (window.siyuan.editorIsFullscreen) {
|
||||
if (item.element.classList.contains("fullscreen")) {
|
||||
item.element.classList.remove("fullscreen");
|
||||
|
|
|
@ -363,7 +363,7 @@ ${padHTML}
|
|||
click() {
|
||||
if (!needSubscribe()) {
|
||||
confirmDialog("📦 " + window.siyuan.languages.uploadAssets2CDN, window.siyuan.languages.uploadAssets2CDNConfirmTip, () => {
|
||||
fetchPost("/api/asset/uploadCloud", {id: protyle.block.parentID});
|
||||
fetchPost("/api/asset/uploadCloud", {id: protyle.block.id});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -444,10 +444,14 @@ ${padHTML}
|
|||
setEditMode(protyle, "wysiwyg");
|
||||
protyle.scroll.lastScrollTop = 0;
|
||||
fetchPost("/api/filetree/getDoc", {
|
||||
id: protyle.block.parentID,
|
||||
size: window.siyuan.config.editor.dynamicLoadBlocks,
|
||||
id: protyle.block.id,
|
||||
size: protyle.block.id === protyle.block.rootID ? window.siyuan.config.editor.dynamicLoadBlocks : Constants.SIZE_GET_MAX,
|
||||
}, getResponse => {
|
||||
onGet({data: getResponse, protyle});
|
||||
onGet({
|
||||
data: getResponse,
|
||||
protyle,
|
||||
action: protyle.block.id === protyle.block.rootID ? [Constants.CB_GET_FOCUS, Constants.CB_GET_HTML, Constants.CB_GET_UNUNDO] : [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS, Constants.CB_GET_UNUNDO, Constants.CB_GET_HTML]
|
||||
});
|
||||
});
|
||||
/// #if !MOBILE
|
||||
saveLayout();
|
||||
|
|
|
@ -85,7 +85,7 @@ const getSnippetCSS = () => {
|
|||
let snippetCSS = "";
|
||||
document.querySelectorAll("style").forEach((item) => {
|
||||
if (item.id.startsWith("snippet")) {
|
||||
snippetCSS += item.innerHTML;
|
||||
snippetCSS += item.outerHTML;
|
||||
}
|
||||
});
|
||||
return snippetCSS;
|
||||
|
@ -182,8 +182,8 @@ const renderPDF = async (id: string) => {
|
|||
}
|
||||
${await setInlineStyle(false)}
|
||||
${await getPluginStyle()}
|
||||
${getSnippetCSS()}
|
||||
</style>
|
||||
${getSnippetCSS()}
|
||||
</head>
|
||||
<body style="-webkit-print-color-adjust: exact;">
|
||||
<div id="action">
|
||||
|
@ -676,8 +676,8 @@ const onExport = async (data: IWebSocketData, filePath: string, exportOption: IE
|
|||
body {font-family: var(--b3-font-family);background-color: var(--b3-theme-background);color: var(--b3-theme-on-background)}
|
||||
${await setInlineStyle(false)}
|
||||
${await getPluginStyle()}
|
||||
${getSnippetCSS()}
|
||||
</style>
|
||||
${getSnippetCSS()}
|
||||
</head>
|
||||
<body>
|
||||
<div class="${["htmlmd", "word"].includes(exportOption.type) ? "b3-typography" : "protyle-wysiwyg" + (window.siyuan.config.editor.displayBookmarkIcon ? " protyle-wysiwyg--attr" : "")}"
|
||||
|
|
|
@ -95,16 +95,30 @@ export class Gutter {
|
|||
}
|
||||
});
|
||||
if (avElement.querySelector('.block__icon[data-type="av-sort"]')?.classList.contains("block__icon--active")) {
|
||||
const bodyElements = avElement.querySelectorAll(".av__body");
|
||||
if (bodyElements.length === 1) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return;
|
||||
} else if (["template", "created", "updated"].includes(bodyElements[0].getAttribute("data-dtype"))) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return;
|
||||
}
|
||||
const rowElement = avElement.querySelector(`.av__row[data-id="${buttonElement.dataset.rowId}"]`);
|
||||
}
|
||||
const rowElement = avElement.querySelector(`.av__body${buttonElement.dataset.groupId ? `[data-group-id="${buttonElement.dataset.groupId}"]` : ""} .av__row[data-id="${buttonElement.dataset.rowId}"]`);
|
||||
if (!rowElement.classList.contains("av__row--select")) {
|
||||
avElement.querySelectorAll(".av__row--select:not(.av__row--header)").forEach(item => {
|
||||
item.classList.remove("av__row--select");
|
||||
item.querySelector("use").setAttribute("xlink:href", "#iconUncheck");
|
||||
});
|
||||
}
|
||||
rowElement.classList.add("av__row--select");
|
||||
rowElement.querySelector(".av__firstcol use").setAttribute("xlink:href", "#iconCheck");
|
||||
updateHeader(rowElement as HTMLElement);
|
||||
avElement.querySelectorAll(".av__row--select:not(.av__row--header)").forEach(item => {
|
||||
selectIds.push(item.getAttribute("data-id"));
|
||||
const groupId = (hasClosestByClassName(item, "av__body") as HTMLElement)?.dataset.groupId || "";
|
||||
selectIds.push(item.getAttribute("data-id") + (groupId ? "@" + groupId : ""));
|
||||
selectElements.push(item);
|
||||
});
|
||||
} else {
|
||||
|
@ -269,16 +283,19 @@ export class Gutter {
|
|||
const srcIDs = [Lute.NewNodeID()];
|
||||
const previousID = event.altKey ? (rowElement.previousElementSibling.getAttribute("data-id") || "") : buttonElement.dataset.rowId;
|
||||
const newUpdated = dayjs().format("YYYYMMDDHHmmss");
|
||||
const groupID = rowElement.parentElement.getAttribute("data-group-id");
|
||||
transaction(protyle, [{
|
||||
action: "insertAttrViewBlock",
|
||||
avID,
|
||||
previousID,
|
||||
srcs: [{
|
||||
itemID: Lute.NewNodeID(),
|
||||
id: srcIDs[0],
|
||||
isDetached: true,
|
||||
content: ""
|
||||
}],
|
||||
blockID: id,
|
||||
groupID,
|
||||
}, {
|
||||
action: "doUpdateUpdated",
|
||||
id,
|
||||
|
@ -292,7 +309,7 @@ export class Gutter {
|
|||
id,
|
||||
data: blockElement.getAttribute("updated")
|
||||
}]);
|
||||
insertAttrViewBlockAnimation(protyle, blockElement, srcIDs, previousID, avID);
|
||||
insertAttrViewBlockAnimation({protyle, blockElement, srcIDs, previousId: previousID, groupID});
|
||||
if (event.altKey) {
|
||||
this.element.querySelectorAll("button").forEach(item => {
|
||||
item.dataset.rowId = srcIDs[0];
|
||||
|
@ -553,17 +570,13 @@ export class Gutter {
|
|||
public renderMultipleMenu(protyle: IProtyle, selectsElement: Element[]) {
|
||||
let isList = false;
|
||||
let isContinue = false;
|
||||
let hasEmbedBlock = false;
|
||||
selectsElement.find((item, index) => {
|
||||
if (item.classList.contains("li")) {
|
||||
isList = true;
|
||||
return true;
|
||||
}
|
||||
if (item.classList.contains("sb") || item.classList.contains("p")) {
|
||||
hasEmbedBlock = true;
|
||||
}
|
||||
if (item.nextElementSibling && selectsElement[index + 1] &&
|
||||
item.nextElementSibling.isSameNode(selectsElement[index + 1])) {
|
||||
item.nextElementSibling === selectsElement[index + 1]) {
|
||||
isContinue = true;
|
||||
} else if (index !== selectsElement.length - 1) {
|
||||
isContinue = false;
|
||||
|
@ -610,8 +623,6 @@ export class Gutter {
|
|||
type: "Blocks2Blockquote"
|
||||
}));
|
||||
}
|
||||
// 多选引用转换为块的时候 id 不一致
|
||||
if (!hasEmbedBlock) {
|
||||
turnIntoSubmenu.push(this.turnsInto({
|
||||
menuId: "paragraph",
|
||||
icon: "iconParagraph",
|
||||
|
@ -622,7 +633,6 @@ export class Gutter {
|
|||
type: "Blocks2Ps",
|
||||
isContinue
|
||||
}));
|
||||
}
|
||||
turnIntoSubmenu.push(this.turnsInto({
|
||||
menuId: "heading1",
|
||||
icon: "iconH1",
|
||||
|
@ -2302,17 +2312,18 @@ export class Gutter {
|
|||
let dataNodeId = nodeElement.getAttribute("data-node-id");
|
||||
if (type === "NodeAttributeView" && target) {
|
||||
const rowElement = hasClosestByClassName(target, "av__row");
|
||||
if (rowElement && !rowElement.classList.contains("av__row--header")) {
|
||||
if (rowElement && !rowElement.classList.contains("av__row--header") && rowElement.dataset.id) {
|
||||
element = rowElement;
|
||||
const bodyElement = hasClosestByClassName(rowElement, "av__body") as HTMLElement;
|
||||
let iconAriaLabel = isMac() ? window.siyuan.languages.rowTip : window.siyuan.languages.rowTip.replace("⇧", "Shift+");
|
||||
if (protyle.disabled) {
|
||||
iconAriaLabel = window.siyuan.languages.rowTip.substring(0, window.siyuan.languages.rowTip.indexOf("<br"));
|
||||
} else if (rowElement.querySelector('[data-dtype="block"]')?.getAttribute("data-detached") === "true") {
|
||||
iconAriaLabel = window.siyuan.languages.rowTip.substring(0, window.siyuan.languages.rowTip.lastIndexOf("<br"));
|
||||
}
|
||||
html = `<button data-type="NodeAttributeViewRowMenu" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" class="ariaLabel" data-position="parentW" aria-label="${iconAriaLabel}"><svg><use xlink:href="#iconDrag"></use></svg><span ${protyle.disabled ? "" : 'draggable="true" class="fn__grab"'}></span></button>`;
|
||||
html = `<button data-type="NodeAttributeViewRowMenu" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" data-group-id="${bodyElement.dataset.groupId || ""}" class="ariaLabel" data-position="parentW" aria-label="${iconAriaLabel}"><svg><use xlink:href="#iconDrag"></use></svg><span ${protyle.disabled ? "" : 'draggable="true" class="fn__grab"'}></span></button>`;
|
||||
if (!protyle.disabled) {
|
||||
html = `<button data-type="NodeAttributeViewRow" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" class="ariaLabel" data-position="parentW" aria-label="${isMac() ? window.siyuan.languages.addBelowAbove : window.siyuan.languages.addBelowAbove.replace("⌥", "Alt+")}"><svg><use xlink:href="#iconAdd"></use></svg></button>${html}`;
|
||||
html = `<button data-type="NodeAttributeViewRow" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" data-group-id="${bodyElement.dataset.groupId || ""}" class="ariaLabel" data-position="parentW" aria-label="${isMac() ? window.siyuan.languages.addBelowAbove : window.siyuan.languages.addBelowAbove.replace("⌥", "Alt+")}"><svg><use xlink:href="#iconAdd"></use></svg></button>${html}`;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -2329,7 +2340,7 @@ export class Gutter {
|
|||
listItem = undefined;
|
||||
}
|
||||
// 标题必须显示
|
||||
if (!topElement.isSameNode(nodeElement) && type !== "NodeHeading") {
|
||||
if (topElement !== nodeElement && type !== "NodeHeading") {
|
||||
nodeElement = topElement;
|
||||
parentElement = hasClosestBlock(nodeElement.parentElement);
|
||||
type = nodeElement.getAttribute("data-type");
|
||||
|
|
|
@ -140,8 +140,8 @@ export class Title {
|
|||
event.stopPropagation();
|
||||
}
|
||||
} else if (event.key === "Enter") {
|
||||
const editElment = getContenteditableElement(protyle.wysiwyg.element.firstElementChild);
|
||||
if (editElment && editElment.textContent === "" && !protyle.wysiwyg.element.firstElementChild.classList.contains("av")) {
|
||||
const editElement = getContenteditableElement(protyle.wysiwyg.element.firstElementChild);
|
||||
if (editElement && editElement.textContent === "" && editElement.getAttribute("placeholder")) {
|
||||
// 配合提示文本使用,避免提示文本挤压到第二个块中
|
||||
focusBlock(protyle.wysiwyg.element.firstElementChild, protyle.wysiwyg.element);
|
||||
} else {
|
||||
|
@ -344,6 +344,13 @@ export class Title {
|
|||
if (this.element.getAttribute("data-render") === "true") {
|
||||
return false;
|
||||
}
|
||||
if (protyle.options.render.hideTitleOnZoom) {
|
||||
if (protyle.block.showAll) {
|
||||
this.element.classList.add("fn__none");
|
||||
} else {
|
||||
this.element.classList.remove("fn__none");
|
||||
}
|
||||
}
|
||||
this.element.setAttribute("data-node-id", protyle.block.rootID);
|
||||
if (response.data.ial[Constants.CUSTOM_RIFF_DECKS]) {
|
||||
this.element.setAttribute(Constants.CUSTOM_RIFF_DECKS, response.data.ial[Constants.CUSTOM_RIFF_DECKS]);
|
||||
|
|
|
@ -42,7 +42,7 @@ export const openTitleMenu = (protyle: IProtyle, position: IPosition) => {
|
|||
label: window.siyuan.languages.copy,
|
||||
icon: "iconCopy",
|
||||
type: "submenu",
|
||||
submenu: copySubMenu([protyle.block.rootID])
|
||||
submenu: copySubMenu([protyle.block.rootID], true, undefined, protyle.block.showAll ? protyle.block.id : protyle.block.rootID)
|
||||
}).element);
|
||||
if (!protyle.disabled) {
|
||||
window.siyuan.menus.menu.append(movePathToMenu([protyle.path]));
|
||||
|
|
|
@ -332,6 +332,7 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
|
|||
plugin.protyleSlash.forEach(slash => {
|
||||
allList.push({
|
||||
filter: slash.filter,
|
||||
id: slash.id,
|
||||
value: `plugin${Constants.ZWSP}${plugin.name}${Constants.ZWSP}${slash.id}`,
|
||||
html: slash.html
|
||||
});
|
||||
|
@ -564,7 +565,7 @@ export const hintMoveBlock = (pathString: string, sourceElements: Element[], pro
|
|||
item.parentElement) {
|
||||
topSourceElement = getTopAloneElement(item);
|
||||
sideElement = topSourceElement.nextElementSibling || topSourceElement.previousElementSibling;
|
||||
if (topSourceElement.isSameNode(item)) {
|
||||
if (topSourceElement === item) {
|
||||
topSourceElement = undefined;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -439,7 +439,7 @@ ${genHintItemHTML(item)}
|
|||
if (!rowElement) {
|
||||
return;
|
||||
}
|
||||
const previousID = cellElement.dataset.blockId;
|
||||
const previousID = rowElement.dataset.id;
|
||||
const avID = nodeElement.getAttribute("data-av-id");
|
||||
let tempElement = document.createElement("div");
|
||||
tempElement.innerHTML = value.replace(/<mark>/g, "").replace(/<\/mark>/g, "");
|
||||
|
@ -727,7 +727,7 @@ ${genHintItemHTML(item)}
|
|||
focusByRange(range);
|
||||
this.genEmojiHTML(protyle);
|
||||
return;
|
||||
} else if (value.indexOf("style") > -1) {
|
||||
} else if (value.startsWith("style")) {
|
||||
range.deleteContents();
|
||||
this.fixImageCursor(range);
|
||||
nodeElement.setAttribute("style", value.split(Constants.ZWSP)[1] || "");
|
||||
|
@ -858,7 +858,11 @@ ${genHintItemHTML(item)}
|
|||
focusBlock(nodeElement);
|
||||
} else if (nodeElement.classList.contains("av")) {
|
||||
avRender(nodeElement, protyle, () => {
|
||||
(nodeElement.querySelector(".av__title") as HTMLInputElement).focus();
|
||||
const titleHTMLElement = nodeElement.querySelector(".av__title") as HTMLInputElement;
|
||||
titleHTMLElement.focus();
|
||||
range.setStart(titleHTMLElement, 0);
|
||||
range.collapse(true);
|
||||
focusByRange(range);
|
||||
});
|
||||
} else {
|
||||
focusByWbr(nodeElement, range);
|
||||
|
|
|
@ -48,6 +48,7 @@ import {getAllModels} from "../layout/getAll";
|
|||
import {isSupportCSSHL} from "./render/searchMarkRender";
|
||||
import {renderAVAttribute} from "./render/av/blockAttr";
|
||||
import {genEmptyElement} from "../block/util";
|
||||
import {zoomOut} from "../menus/protyle";
|
||||
|
||||
export class Protyle {
|
||||
|
||||
|
@ -147,7 +148,7 @@ export class Protyle {
|
|||
}
|
||||
break;
|
||||
case "refreshAttributeView":
|
||||
Array.from(this.protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${data.data.id}"]`)).forEach((item: HTMLElement) => {
|
||||
Array.from(this.protyle.wysiwyg.element.querySelectorAll(`.av[data-av-id="${data.data.id}"]`)).forEach((item: HTMLElement) => {
|
||||
item.removeAttribute("data-render");
|
||||
avRender(item, this.protyle);
|
||||
});
|
||||
|
@ -159,9 +160,7 @@ export class Protyle {
|
|||
break;
|
||||
case "transactions":
|
||||
data.data[0].doOperations.find((item: IOperation) => {
|
||||
if (!this.protyle.preview.element.classList.contains("fn__none") &&
|
||||
item.action !== "updateAttrs" // 预览模式下点击只读
|
||||
) {
|
||||
if (!this.protyle.preview.element.classList.contains("fn__none")) {
|
||||
this.protyle.preview.render(this.protyle);
|
||||
} else if (options.backlinkData && ["delete", "move"].includes(item.action)) {
|
||||
// 只对特定情况刷新,否则展开、编辑等操作刷新会频繁
|
||||
|
@ -179,6 +178,17 @@ export class Protyle {
|
|||
// 反链面板移除元素后,文档为空
|
||||
if (this.protyle.wysiwyg.element.childElementCount === 0 && this.protyle.block.parentID &&
|
||||
!(item.action === "delete" && typeof item.data?.createEmptyParagraph === "boolean" && !item.data.createEmptyParagraph)) {
|
||||
if (item.action === "delete" && this.protyle.block.showAll) {
|
||||
if (this.protyle.options.handleEmptyContent) {
|
||||
this.protyle.options.handleEmptyContent();
|
||||
} else {
|
||||
zoomOut({
|
||||
protyle: this.protyle,
|
||||
id: this.protyle.block.rootID,
|
||||
focusId: this.protyle.block.id
|
||||
});
|
||||
}
|
||||
} else {
|
||||
const newID = Lute.NewNodeID();
|
||||
const emptyElement = genEmptyElement(false, false, newID);
|
||||
this.protyle.wysiwyg.element.append(emptyElement);
|
||||
|
@ -191,6 +201,7 @@ export class Protyle {
|
|||
this.protyle.undo.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "readonly":
|
||||
|
|
|
@ -184,7 +184,7 @@ export class Preview {
|
|||
}
|
||||
this.mdTimeoutId = window.setTimeout(() => {
|
||||
fetchPost("/api/export/preview", {
|
||||
id: protyle.block.parentID || protyle.options.blockId,
|
||||
id: protyle.block.id || protyle.options.blockId || protyle.block.parentID,
|
||||
}, response => {
|
||||
const oldScrollTop = protyle.preview.previewElement.scrollTop;
|
||||
protyle.preview.previewElement.innerHTML = response.data.html;
|
||||
|
@ -277,14 +277,17 @@ export class Preview {
|
|||
this.processZHTable(copyElement);
|
||||
} else if (type === "yuque") {
|
||||
fetchPost("/api/lute/copyStdMarkdown", {
|
||||
id: protyle.block.rootID,
|
||||
id: protyle.block.id || protyle.options.blockId || protyle.block.parentID,
|
||||
assetsDestSpace2Underscore: true,
|
||||
fillCSSVar: true,
|
||||
adjustHeadingLevel: true,
|
||||
}, (response) => {
|
||||
writeText(response.data);
|
||||
showMessage(`${window.siyuan.languages.pasteToYuque}`);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 防止背景色被粘贴到公众号中
|
||||
copyElement.style.backgroundColor = "#fff";
|
||||
// 代码背景
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import {Menu} from "../../../plugin/Menu";
|
||||
import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../../util/hasClosest";
|
||||
import {hasClosestBlock, hasClosestByClassName} from "../../util/hasClosest";
|
||||
import {transaction} from "../../wysiwyg/transaction";
|
||||
import {openEditorTab} from "../../../menus/util";
|
||||
import {openFileAttr} from "../../../menus/commonMenuItem";
|
||||
import {
|
||||
addDragFill, cellValueIsEmpty,
|
||||
addDragFill,
|
||||
cellValueIsEmpty,
|
||||
genCellValueByElement,
|
||||
getCellText,
|
||||
getTypeByCellElement,
|
||||
|
@ -47,100 +48,11 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
return false;
|
||||
}
|
||||
|
||||
const loadMoreElement = hasClosestByAttribute(event.target, "data-type", "av-load-more");
|
||||
if (loadMoreElement && !hasClosestByAttribute(event.target, "data-type", "set-page-size")) {
|
||||
const rowFooterElement = blockElement.querySelector(".av__row--footer") as HTMLElement;
|
||||
if (rowFooterElement) {
|
||||
rowFooterElement.style.transform = "";
|
||||
}
|
||||
blockElement.removeAttribute("data-render");
|
||||
blockElement.dataset.pageSize = (parseInt(blockElement.dataset.pageSize) + parseInt(blockElement.querySelector('[data-type="set-page-size"]').getAttribute("data-size"))).toString();
|
||||
avRender(blockElement, protyle);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
const firstColElement = hasClosestByClassName(event.target, "av__firstcol");
|
||||
if (firstColElement) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
selectRow(firstColElement, "toggle");
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
const imgElement = hasClosestByClassName(event.target, "av__cellassetimg");
|
||||
if (imgElement) {
|
||||
previewAttrViewImages(
|
||||
removeCompressURL((imgElement as HTMLImageElement).getAttribute("src")),
|
||||
blockElement.getAttribute("data-av-id"),
|
||||
blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
|
||||
(blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement)?.value.trim() || ""
|
||||
);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
if (event.shiftKey) {
|
||||
const rowElement = hasClosestByClassName(event.target, "av__row");
|
||||
if (rowElement && !rowElement.classList.contains("av__row--header")) {
|
||||
selectRow(rowElement.querySelector(".av__firstcol"), "toggle");
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
const copyElement = hasClosestByAttribute(event.target, "data-type", "copy");
|
||||
if (copyElement) {
|
||||
writeText(getCellText(hasClosestByClassName(copyElement, "av__cell")));
|
||||
showMessage(window.siyuan.languages.copied);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
|
||||
const searchIconElement = hasClosestByAttribute(event.target, "data-type", "av-search-icon");
|
||||
if (searchIconElement) {
|
||||
const searchElement = blockElement.querySelector('input[data-type="av-search"]') as HTMLInputElement;
|
||||
searchElement.style.width = "128px";
|
||||
searchElement.style.paddingLeft = "";
|
||||
searchElement.style.paddingRight = "";
|
||||
const viewsElement = hasClosestByClassName(searchElement, "av__views");
|
||||
if (viewsElement) {
|
||||
viewsElement.classList.add("av__views--show");
|
||||
}
|
||||
setTimeout(() => {
|
||||
searchElement.focus();
|
||||
}, Constants.TIMEOUT_TRANSITION);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
const viewItemElement = hasClosestByClassName(event.target, "item");
|
||||
if (viewItemElement && viewItemElement.parentElement.classList.contains("layout-tab-bar")) {
|
||||
if (viewItemElement.classList.contains("item--focus")) {
|
||||
openViewMenu({protyle, blockElement, element: viewItemElement});
|
||||
} else {
|
||||
transaction(protyle, [{
|
||||
action: "setAttrViewBlockView",
|
||||
blockID: blockElement.getAttribute("data-node-id"),
|
||||
id: viewItemElement.dataset.id,
|
||||
avID: blockElement.getAttribute("data-av-id"),
|
||||
}]);
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if (protyle.disabled) {
|
||||
return false;
|
||||
}
|
||||
const viewType = blockElement.getAttribute("data-av-type") as TAVView;
|
||||
let target = event.target;
|
||||
while (target && !target.isEqualNode(blockElement)) {
|
||||
const type = target.getAttribute("data-type");
|
||||
if (type === "av-header-add") {
|
||||
if (type === "av-header-add" && !protyle.disabled) {
|
||||
const addMenu = addCol(protyle, blockElement);
|
||||
const addRect = target.getBoundingClientRect();
|
||||
addMenu.open({
|
||||
|
@ -151,42 +63,48 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-header-more") {
|
||||
} else if (type === "av-header-more" && !protyle.disabled) {
|
||||
openMenuPanel({protyle, blockElement, type: "properties"});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-add-more") {
|
||||
insertRows(blockElement, protyle, 1, undefined);
|
||||
} else if (type === "av-add-more" && !protyle.disabled) {
|
||||
insertRows({
|
||||
blockElement,
|
||||
protyle,
|
||||
count: 1,
|
||||
previousID: "",
|
||||
groupID: blockElement.querySelector(".av__body")?.getAttribute("data-group-id") || ""
|
||||
});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-more") {
|
||||
} else if (type === "av-more" && !protyle.disabled) {
|
||||
openMenuPanel({protyle, blockElement, type: "config"});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-switcher") {
|
||||
} else if (type === "av-switcher" && !protyle.disabled) {
|
||||
openMenuPanel({protyle, blockElement, type: "switcher"});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-sort") {
|
||||
} else if (type === "av-sort" && !protyle.disabled) {
|
||||
openMenuPanel({protyle, blockElement, type: "sorts"});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-filter") {
|
||||
} else if (type === "av-filter" && !protyle.disabled) {
|
||||
openMenuPanel({protyle, blockElement, type: "filters"});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-add") {
|
||||
} else if (type === "av-add" && !protyle.disabled) {
|
||||
addView(protyle, blockElement);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "block-more") {
|
||||
} else if (type === "block-more" && !protyle.disabled) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
protyle.toolbar.range = document.createRange();
|
||||
protyle.toolbar.range.selectNodeContents(target);
|
||||
|
@ -199,7 +117,7 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "set-page-size") {
|
||||
} else if (type === "set-page-size" && !protyle.disabled) {
|
||||
setPageSize({
|
||||
target,
|
||||
protyle,
|
||||
|
@ -209,20 +127,36 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-add-bottom") {
|
||||
insertRows(blockElement, protyle, 1,
|
||||
blockElement.querySelector(".av__row--util")?.previousElementSibling?.getAttribute("data-id") ||
|
||||
target.previousElementSibling?.getAttribute("data-id") || undefined
|
||||
);
|
||||
} else if (type === "av-add-bottom" && !protyle.disabled) {
|
||||
const bodyElement = hasClosestByClassName(target, "av__body");
|
||||
insertRows({
|
||||
blockElement, protyle,
|
||||
count: 1,
|
||||
previousID: (bodyElement && bodyElement.querySelector(".av__row--util")?.previousElementSibling?.getAttribute("data-id")) ||
|
||||
target.previousElementSibling?.getAttribute("data-id") || undefined,
|
||||
groupID: bodyElement ? bodyElement.getAttribute("data-group-id") : ""
|
||||
});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__cell--header")) {
|
||||
} else if (type === "av-add-top" && !protyle.disabled) {
|
||||
const titleElement = hasClosestByClassName(target, "av__group-title");
|
||||
insertRows({
|
||||
blockElement,
|
||||
protyle,
|
||||
count: 1,
|
||||
previousID: "",
|
||||
groupID: titleElement ? titleElement.nextElementSibling.getAttribute("data-group-id") : ""
|
||||
});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__cell--header") && !protyle.disabled) {
|
||||
showColMenu(protyle, blockElement, target);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__cell")) {
|
||||
} else if (target.classList.contains("av__cell") && !protyle.disabled) {
|
||||
if (!hasClosestByClassName(target, "av__row--header")) {
|
||||
if (target.querySelector(".av__pulse")) {
|
||||
return;
|
||||
|
@ -258,14 +192,14 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__calc")) {
|
||||
} else if (target.classList.contains("av__calc") && !protyle.disabled) {
|
||||
openCalcMenu(protyle, target, undefined, event.clientX - 64);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("b3-menu__avemoji")) {
|
||||
} else if (target.classList.contains("b3-menu__avemoji") && !protyle.disabled) {
|
||||
const rect = target.getBoundingClientRect();
|
||||
openEmojiPanel(target.parentElement.getAttribute("data-block-id"), "doc", {
|
||||
openEmojiPanel(target.nextElementSibling.getAttribute("data-id"), "doc", {
|
||||
x: rect.left,
|
||||
y: rect.bottom,
|
||||
h: rect.height,
|
||||
|
@ -276,12 +210,12 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-gallery-edit") {
|
||||
} else if (type === "av-gallery-edit" && !protyle.disabled) {
|
||||
editGalleryItem(target);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-gallery-more") {
|
||||
} else if (type === "av-gallery-more" && !protyle.disabled) {
|
||||
const rect = target.getBoundingClientRect();
|
||||
openGalleryItemMenu({
|
||||
target,
|
||||
|
@ -294,6 +228,101 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-group-fold") {
|
||||
if (target.getAttribute("data-folding") !== "true") {
|
||||
target.setAttribute("data-folding", "true");
|
||||
const isOpen = target.firstElementChild.classList.contains("av__group-arrow--open");
|
||||
transaction(protyle, [{
|
||||
action: "foldAttrViewGroup",
|
||||
avID: blockElement.dataset.avId,
|
||||
blockID: blockElement.dataset.nodeId,
|
||||
id: target.dataset.id,
|
||||
data: isOpen
|
||||
}], [{
|
||||
action: "foldAttrViewGroup",
|
||||
avID: blockElement.dataset.avId,
|
||||
blockID: blockElement.dataset.nodeId,
|
||||
id: target.dataset.id,
|
||||
data: !isOpen
|
||||
}]);
|
||||
if (isOpen) {
|
||||
target.firstElementChild.classList.remove("av__group-arrow--open");
|
||||
target.parentElement.nextElementSibling.classList.add("fn__none");
|
||||
} else {
|
||||
target.firstElementChild.classList.add("av__group-arrow--open");
|
||||
target.parentElement.nextElementSibling.classList.remove("fn__none");
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-load-more") {
|
||||
blockElement.querySelectorAll(".av__row--footer").forEach((item: HTMLElement) => {
|
||||
item.style.transform = "";
|
||||
});
|
||||
blockElement.removeAttribute("data-render");
|
||||
const bodyElement = hasClosestByClassName(target, "av__body") as HTMLElement;
|
||||
bodyElement.dataset.pageSize = (parseInt(bodyElement.dataset.pageSize) + parseInt(bodyElement.querySelector('[data-type="set-page-size"]').getAttribute("data-size"))).toString();
|
||||
avRender(blockElement, protyle);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__firstcol")) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
selectRow(target, "toggle");
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("item") && target.parentElement.classList.contains("layout-tab-bar")) {
|
||||
if (target.classList.contains("item--focus")) {
|
||||
openViewMenu({protyle, blockElement, element: target});
|
||||
} else {
|
||||
transaction(protyle, [{
|
||||
action: "setAttrViewBlockView",
|
||||
blockID: blockElement.getAttribute("data-node-id"),
|
||||
id: target.dataset.id,
|
||||
avID: blockElement.getAttribute("data-av-id"),
|
||||
}]);
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__cellassetimg")) {
|
||||
previewAttrViewImages(
|
||||
removeCompressURL((target as HTMLImageElement).getAttribute("src")),
|
||||
blockElement.getAttribute("data-av-id"),
|
||||
blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
|
||||
(blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement)?.value.trim() || ""
|
||||
);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__row") && event.shiftKey && !target.classList.contains("av__row--header")) {
|
||||
selectRow(target.querySelector(".av__firstcol"), "toggle");
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "copy") {
|
||||
writeText(getCellText(hasClosestByClassName(target, "av__cell")));
|
||||
showMessage(window.siyuan.languages.copied);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (type === "av-search-icon") {
|
||||
const searchElement = blockElement.querySelector('input[data-type="av-search"]') as HTMLInputElement;
|
||||
searchElement.style.width = "128px";
|
||||
searchElement.style.paddingLeft = "";
|
||||
searchElement.style.paddingRight = "";
|
||||
const viewsElement = hasClosestByClassName(searchElement, "av__views");
|
||||
if (viewsElement) {
|
||||
viewsElement.classList.add("av__views--show");
|
||||
}
|
||||
setTimeout(() => {
|
||||
searchElement.focus();
|
||||
}, Constants.TIMEOUT_TRANSITION);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
}
|
||||
target = target.parentElement;
|
||||
}
|
||||
|
@ -326,8 +355,8 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi
|
|||
}
|
||||
const menu = new Menu();
|
||||
const rowElements = blockElement.querySelectorAll(".av__row--select:not(.av__row--header), .av__gallery-item--select");
|
||||
const keyCellElement = rowElements[0].querySelector(".av__cell[data-block-id]") as HTMLElement;
|
||||
const ids = Array.from(rowElements).map(item => item.getAttribute("data-id"));
|
||||
const keyCellElement = rowElements[0].querySelector('.av__cell[data-dtype="block"]') as HTMLElement;
|
||||
const ids = Array.from(rowElements).map(item => item.querySelector('[data-dtype="block"] .av__celltext').getAttribute("data-id"));
|
||||
if (rowElements.length === 1 && keyCellElement.getAttribute("data-detached") !== "true") {
|
||||
/// #if !MOBILE
|
||||
const blockId = ids[0];
|
||||
|
@ -540,21 +569,26 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi
|
|||
const sourceIds: string[] = [];
|
||||
rowElements.forEach(item => {
|
||||
const rowId = item.getAttribute("data-id");
|
||||
const blockValue = genCellValueByElement("block", item.querySelector(".av__cell[data-block-id]"));
|
||||
const blockValue = genCellValueByElement("block", item.querySelector('.av__cell[data-dtype="block"]'));
|
||||
srcs.push({
|
||||
itemID: Lute.NewNodeID(),
|
||||
content: blockValue.block.content,
|
||||
id: rowId,
|
||||
id: blockValue.block.id || "",
|
||||
isDetached: blockValue.isDetached,
|
||||
});
|
||||
sourceIds.push(rowId);
|
||||
});
|
||||
const avID = listItemElement.dataset.avId;
|
||||
const viewID = listItemElement.dataset.viewId;
|
||||
transaction(protyle, [{
|
||||
action: "insertAttrViewBlock",
|
||||
ignoreDefaultFill: viewID ? false : true,
|
||||
viewID,
|
||||
avID,
|
||||
ignoreFillFilter: true,
|
||||
srcs,
|
||||
blockID: listItemElement.dataset.blockId
|
||||
context: {ignoreTip: "true"},
|
||||
blockID: listItemElement.dataset.blockId,
|
||||
groupID: rowElement.parentElement.getAttribute("data-group-id")
|
||||
}, {
|
||||
action: "doUpdateUpdated",
|
||||
id: listItemElement.dataset.blockId,
|
||||
|
@ -580,15 +614,27 @@ ${window.siyuan.languages[avType === "table" ? "insertRowBefore" : "insertItemBe
|
|||
bind(element) {
|
||||
const inputElement = element.querySelector("input");
|
||||
element.addEventListener("click", () => {
|
||||
if (document.activeElement.isSameNode(inputElement)) {
|
||||
if (document.activeElement === inputElement) {
|
||||
return;
|
||||
}
|
||||
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].previousElementSibling.getAttribute("data-id"));
|
||||
insertRows({
|
||||
blockElement,
|
||||
protyle,
|
||||
count: parseInt(inputElement.value),
|
||||
previousID: rowElements[0].previousElementSibling.getAttribute("data-id"),
|
||||
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
|
||||
});
|
||||
menu.close();
|
||||
});
|
||||
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
if (!event.isComposing && event.key === "Enter") {
|
||||
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].previousElementSibling.getAttribute("data-id"));
|
||||
insertRows({
|
||||
blockElement,
|
||||
protyle,
|
||||
count: parseInt(inputElement.value),
|
||||
previousID: rowElements[0].previousElementSibling.getAttribute("data-id"),
|
||||
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
|
||||
});
|
||||
menu.close();
|
||||
}
|
||||
});
|
||||
|
@ -603,15 +649,27 @@ ${window.siyuan.languages[avType === "table" ? "insertRowAfter" : "insertItemAft
|
|||
bind(element) {
|
||||
const inputElement = element.querySelector("input");
|
||||
element.addEventListener("click", () => {
|
||||
if (document.activeElement.isSameNode(inputElement)) {
|
||||
if (document.activeElement === inputElement) {
|
||||
return;
|
||||
}
|
||||
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].getAttribute("data-id"));
|
||||
insertRows({
|
||||
blockElement,
|
||||
protyle,
|
||||
count: parseInt(inputElement.value),
|
||||
previousID: rowElements[0].getAttribute("data-id"),
|
||||
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
|
||||
});
|
||||
menu.close();
|
||||
});
|
||||
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
if (!event.isComposing && event.key === "Enter") {
|
||||
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].getAttribute("data-id"));
|
||||
insertRows({
|
||||
blockElement,
|
||||
protyle,
|
||||
count: parseInt(inputElement.value),
|
||||
previousID: rowElements[0].getAttribute("data-id"),
|
||||
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
|
||||
});
|
||||
menu.close();
|
||||
}
|
||||
});
|
||||
|
@ -660,11 +718,11 @@ ${window.siyuan.languages[avType === "table" ? "insertRowAfter" : "insertItemAft
|
|||
const selectElements: HTMLElement[] = Array.from(blockElement.querySelectorAll(`.av__gallery-item--select .av__cell[data-field-id="${cellElement.dataset.fieldId}"]`));
|
||||
const type = cellElement.getAttribute("data-dtype") as TAVCol;
|
||||
if (!["updated", "created"].includes(type)) {
|
||||
const iconElement = cellElement.querySelector(".av__gallery-tip").firstElementChild.cloneNode(true) as HTMLElement;
|
||||
const iconElement = cellElement.parentElement.querySelector(".av__gallery-tip, .av__gallery-name").firstElementChild.cloneNode(true) as HTMLElement;
|
||||
iconElement.classList.add("b3-menu__icon");
|
||||
editAttrSubmenu.push({
|
||||
iconHTML: iconElement.outerHTML,
|
||||
label: escapeHtml(cellElement.getAttribute("aria-label")),
|
||||
label: escapeHtml(cellElement.getAttribute("aria-label").split('<div class="ft__on-surface">')[0]),
|
||||
click() {
|
||||
rowElement.querySelector(".av__gallery-fields").classList.add("av__gallery-fields--edit");
|
||||
rowElement.querySelector('[data-type="av-gallery-edit"]').setAttribute("aria-label", window.siyuan.languages.hideEmptyFields);
|
||||
|
@ -712,6 +770,10 @@ export const updateAVName = (protyle: IProtyle, blockElement: Element) => {
|
|||
if (newData === nameElement.dataset.title.trim()) {
|
||||
return;
|
||||
}
|
||||
if (newData.length > Constants.SIZE_TITLE) {
|
||||
showMessage(window.siyuan.languages["_kernel"]["106"]);
|
||||
return false;
|
||||
}
|
||||
const newUpdated = dayjs().format("YYYYMMDDHHmmss");
|
||||
transaction(protyle, [{
|
||||
action: "setAttrViewName",
|
||||
|
@ -734,8 +796,8 @@ export const updateAVName = (protyle: IProtyle, blockElement: Element) => {
|
|||
nameElement.dataset.title = newData;
|
||||
|
||||
// 当前页面不能进行推送,否则光标会乱跳
|
||||
Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => {
|
||||
if (blockElement.isSameNode(item)) {
|
||||
Array.from(protyle.wysiwyg.element.querySelectorAll(`.av[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => {
|
||||
if (blockElement === item) {
|
||||
return;
|
||||
}
|
||||
const titleElement = item.querySelector(".av__title") as HTMLElement;
|
||||
|
@ -768,9 +830,14 @@ export const updateAttrViewCellAnimation = (cellElement: HTMLElement, value: IAV
|
|||
const viewType = blockElement.getAttribute("data-av-type") as TAVView;
|
||||
const iconElement = cellElement.querySelector(".b3-menu__avemoji");
|
||||
if (viewType === "gallery") {
|
||||
cellElement.innerHTML = renderCell(value, 0, iconElement ? !iconElement.classList.contains("fn__none") : false, viewType) +
|
||||
cellElement.querySelector(".av__gallery-tip").outerHTML;
|
||||
cellElement.setAttribute("data-empty", cellValueIsEmpty(value).toString());
|
||||
if (value.type === "checkbox") {
|
||||
value.checkbox = {
|
||||
checked: value.checkbox?.checked || false,
|
||||
content: cellElement.getAttribute("aria-label").split('<div class="ft__on-surface">')[0],
|
||||
};
|
||||
}
|
||||
cellElement.innerHTML = renderCell(value, 0, iconElement ? !iconElement.classList.contains("fn__none") : false, viewType);
|
||||
cellElement.parentElement.setAttribute("data-empty", cellValueIsEmpty(value).toString());
|
||||
} else {
|
||||
cellElement.innerHTML = renderCell(value, 0, iconElement ? !iconElement.classList.contains("fn__none") : false);
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ export const addFilesToDatabase = (fileLiElements: Element[]) => {
|
|||
const id = item.getAttribute("data-node-id");
|
||||
if (id) {
|
||||
srcs.push({
|
||||
itemID: Lute.NewNodeID(),
|
||||
id,
|
||||
isDetached: false
|
||||
});
|
||||
|
@ -18,10 +19,12 @@ export const addFilesToDatabase = (fileLiElements: Element[]) => {
|
|||
if (srcs.length > 0) {
|
||||
openSearchAV("", fileLiElements[0] as HTMLElement, (listItemElement) => {
|
||||
const avID = listItemElement.dataset.avId;
|
||||
const viewID = listItemElement.dataset.viewId;
|
||||
transaction(undefined, [{
|
||||
action: "insertAttrViewBlock",
|
||||
ignoreDefaultFill: viewID ? false : true,
|
||||
viewID,
|
||||
avID,
|
||||
ignoreFillFilter: true,
|
||||
srcs,
|
||||
blockID: listItemElement.dataset.blockId
|
||||
}, {
|
||||
|
@ -37,11 +40,14 @@ export const addEditorToDatabase = (protyle: IProtyle, range: Range, type?: stri
|
|||
if ((range && protyle.title?.editElement?.contains(range.startContainer)) || type === "title") {
|
||||
openSearchAV("", protyle.breadcrumb.element, (listItemElement) => {
|
||||
const avID = listItemElement.dataset.avId;
|
||||
const viewID = listItemElement.dataset.viewId;
|
||||
transaction(protyle, [{
|
||||
action: "insertAttrViewBlock",
|
||||
ignoreDefaultFill: viewID ? false : true,
|
||||
viewID,
|
||||
avID,
|
||||
ignoreFillFilter: true,
|
||||
srcs: [{
|
||||
itemID: Lute.NewNodeID(),
|
||||
id: protyle.block.rootID,
|
||||
isDetached: false
|
||||
}],
|
||||
|
@ -83,15 +89,18 @@ export const addEditorToDatabase = (protyle: IProtyle, range: Range, type?: stri
|
|||
ids.forEach(item => {
|
||||
srcIDs.push(item);
|
||||
srcs.push({
|
||||
itemID: Lute.NewNodeID(),
|
||||
id: item,
|
||||
isDetached: false
|
||||
});
|
||||
});
|
||||
const avID = listItemElement.dataset.avId;
|
||||
const viewID = listItemElement.dataset.viewId;
|
||||
transaction(protyle, [{
|
||||
action: "insertAttrViewBlock",
|
||||
ignoreDefaultFill: viewID ? false : true,
|
||||
viewID,
|
||||
avID,
|
||||
ignoreFillFilter: true,
|
||||
srcs,
|
||||
blockID: listItemElement.dataset.blockId
|
||||
}, {
|
||||
|
|
|
@ -21,7 +21,7 @@ import {renameAsset} from "../../../editor/rename";
|
|||
import * as dayjs from "dayjs";
|
||||
import {getColId} from "./col";
|
||||
import {getFieldIdByCellElement} from "./row";
|
||||
import {getCompressURL} from "../../../util/image";
|
||||
import {getCompressURL, removeCompressURL} from "../../../util/image";
|
||||
|
||||
export const bindAssetEvent = (options: {
|
||||
protyle: IProtyle,
|
||||
|
@ -197,7 +197,7 @@ export const editAssetItem = (options: {
|
|||
index: number,
|
||||
rect: DOMRect
|
||||
}) => {
|
||||
const linkAddress = options.content;
|
||||
const linkAddress = removeCompressURL(options.content);
|
||||
const type = options.type as "image" | "file";
|
||||
const menu = new Menu("av-asset-edit", () => {
|
||||
if ((!textElements[1] && textElements[0].value === linkAddress) ||
|
||||
|
|
|
@ -4,7 +4,7 @@ import {escapeAriaLabel, escapeAttr, escapeHtml} from "../../../util/escape";
|
|||
import * as dayjs from "dayjs";
|
||||
import {popTextCell, updateCellsValue} from "./cell";
|
||||
import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../../util/hasClosest";
|
||||
import {unicode2Emoji} from "../../../emoji";
|
||||
import {openEmojiPanel, unicode2Emoji} from "../../../emoji";
|
||||
import {transaction} from "../../wysiwyg/transaction";
|
||||
import {openMenuPanel} from "./openMenuPanel";
|
||||
import {uploadFiles} from "../../upload";
|
||||
|
@ -20,12 +20,13 @@ import {getCompressURL} from "../../../util/image";
|
|||
|
||||
const genAVRollupHTML = (value: IAVCellValue) => {
|
||||
let html = "";
|
||||
const dataValue: IAVCellDateValue = value[value.type as "date"];
|
||||
switch (value.type) {
|
||||
case "block":
|
||||
if (value?.isDetached) {
|
||||
html = `<span data-id="${value.block?.id}">${value.block?.content || window.siyuan.languages.untitled}</span>`;
|
||||
html = `<span>${value.block?.content || window.siyuan.languages.untitled}</span>`;
|
||||
} else {
|
||||
html = `<span data-type="block-ref" data-id="${value.block?.id}" data-subtype="s" class="av__celltext--ref">${value.block?.content || window.siyuan.languages.untitled}</span>`;
|
||||
html = `<span data-type="block-ref" data-id="${value.block.id}" data-subtype="s" class="av__celltext--ref">${value.block?.content || window.siyuan.languages.untitled}</span>`;
|
||||
}
|
||||
break;
|
||||
case "text":
|
||||
|
@ -35,11 +36,17 @@ const genAVRollupHTML = (value: IAVCellValue) => {
|
|||
html = value.number.formattedContent || value.number.content.toString();
|
||||
break;
|
||||
case "date":
|
||||
if (value[value.type] && value[value.type].isNotEmpty) {
|
||||
html = dayjs(value[value.type].content).format(value[value.type].isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm");
|
||||
case "updated":
|
||||
case "created":
|
||||
if (dataValue.formattedContent) {
|
||||
html = dataValue.formattedContent;
|
||||
} else {
|
||||
if (dataValue && dataValue.isNotEmpty) {
|
||||
html = dayjs(dataValue.content).format(dataValue.isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm");
|
||||
}
|
||||
if (dataValue && dataValue.hasEndDate && dataValue.isNotEmpty && dataValue.isNotEmpty2) {
|
||||
html = `<svg class="av__cellicon"><use xlink:href="#iconForward"></use></svg>${dayjs(dataValue.content2).format(dataValue.isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm")}`;
|
||||
}
|
||||
if (value[value.type] && value[value.type].hasEndDate && value[value.type].isNotEmpty && value[value.type].isNotEmpty2) {
|
||||
html += `<svg class="av__cellicon"><use xlink:href="#iconForward"></use></svg>${dayjs(value[value.type].content2).format(value[value.type].isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm")}`;
|
||||
}
|
||||
if (html) {
|
||||
html = `<span class="av__celltext">${html}</span>`;
|
||||
|
@ -62,7 +69,7 @@ export const genAVValueHTML = (value: IAVCellValue) => {
|
|||
let html = "";
|
||||
switch (value.type) {
|
||||
case "block":
|
||||
html = `<input value="${escapeAttr(value.block.content)}" type="text" class="b3-text-field b3-text-field--text fn__flex-1" placeholder="${window.siyuan.languages.empty}">`;
|
||||
html = `<input data-id="${value.block.id}" value="${escapeAttr(value.block.content)}" type="text" class="b3-text-field b3-text-field--text fn__flex-1" placeholder="${window.siyuan.languages.empty}">`;
|
||||
break;
|
||||
case "text":
|
||||
html = `<textarea style="resize: vertical" rows="${(value.text?.content || "").split("\n").length}" class="b3-text-field b3-text-field--text fn__flex-1" placeholder="${window.siyuan.languages.empty}">${value.text?.content || ""}</textarea>`;
|
||||
|
@ -127,13 +134,14 @@ export const genAVValueHTML = (value: IAVCellValue) => {
|
|||
<a ${value.email.content ? `href="mailto:${value.email.content}"` : ""} target="_blank" aria-label="${window.siyuan.languages.openBy}" class="block__icon block__icon--show fn__flex-center b3-tooltips__w b3-tooltips"><svg><use xlink:href="#iconEmail"></use></svg></a>`;
|
||||
break;
|
||||
case "relation":
|
||||
value?.relation?.contents?.forEach((item) => {
|
||||
value?.relation?.contents?.forEach((item, index) => {
|
||||
if (item && item.block) {
|
||||
const rowID = value.relation.blockIDs[index];
|
||||
if (item?.isDetached) {
|
||||
html += `<span class="av__cell--relation"><span>➖ </span><span class="av__celltext" data-id="${item.block?.id}">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
html += `<span data-row-id="${rowID}" class="av__cell--relation"><span class="b3-menu__avemoji">➖</span><span class="av__celltext">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
} else {
|
||||
// data-block-id 用于更新 emoji
|
||||
html += `<span class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
html += `<span data-row-id="${rowID}" class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -143,9 +151,9 @@ export const genAVValueHTML = (value: IAVCellValue) => {
|
|||
break;
|
||||
case "rollup":
|
||||
value?.rollup?.contents?.forEach((item) => {
|
||||
const rollupText = ["select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? genAVValueHTML(item) : genAVRollupHTML(item);
|
||||
const rollupText = ["template", "select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? genAVValueHTML(item) : genAVRollupHTML(item);
|
||||
if (rollupText) {
|
||||
html += rollupText + ", ";
|
||||
html += rollupText.replace("fn__flex-1", "") + ", ";
|
||||
}
|
||||
});
|
||||
if (html && html.endsWith(", ")) {
|
||||
|
@ -189,7 +197,7 @@ export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IPr
|
|||
<span class="fn__ellipsis">${table.avName || window.siyuan.languages.database}</span>
|
||||
</div>
|
||||
<div class="fn__flex-1"></div>
|
||||
<span data-type="remove" class="block__icon block__icon--warning block__icon--show b3-tooltips__w b3-tooltips" aria-label="${window.siyuan.languages.removeAV}"><svg><use xlink:href="#iconTrashcan"></use></svg></span>
|
||||
<span data-type="remove" data-row-id="${table.keyValues && table.keyValues[0].values[0].blockID}" class="block__icon block__icon--warning block__icon--show b3-tooltips__w b3-tooltips" aria-label="${window.siyuan.languages.removeAV}"><svg><use xlink:href="#iconTrashcan"></use></svg></span>
|
||||
</div>`;
|
||||
table.keyValues?.forEach(item => {
|
||||
innerHTML += `<div class="block__icons av__row" data-id="${id}" data-col-id="${item.key.id}">
|
||||
|
@ -198,7 +206,7 @@ export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IPr
|
|||
${item.key.icon ? unicode2Emoji(item.key.icon, "block__logoicon", true) : `<svg class="block__logoicon"><use xlink:href="#${getColIconByType(item.key.type)}"></use></svg>`}
|
||||
<span>${escapeHtml(item.key.name)}</span>
|
||||
</div>
|
||||
<div data-av-id="${table.avID}" data-col-id="${item.values[0].keyID}" data-block-id="${item.values[0].blockID}" data-id="${item.values[0].id}" data-type="${item.values[0].type}"
|
||||
<div data-av-id="${table.avID}" data-col-id="${item.values[0].keyID}" data-row-id="${item.values[0].blockID}" data-id="${item.values[0].id}" data-type="${item.values[0].type}"
|
||||
data-options="${item.key?.options ? escapeAttr(JSON.stringify(item.key.options)) : "[]"}"
|
||||
${["text", "number", "date", "url", "phone", "template", "email"].includes(item.values[0].type) ? "" : `placeholder="${window.siyuan.languages.empty}"`}
|
||||
class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"].includes(item.values[0].type) ? "" : " custom-attr__avvalue"}${["created", "updated"].includes(item.values[0].type) ? " custom-attr__avvalue--readonly" : ""}">${genAVValueHTML(item.values[0])}</div>
|
||||
|
@ -211,7 +219,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
|
|||
|
||||
if (element.innerHTML) {
|
||||
// 防止 blockElement 找不到
|
||||
element.querySelector(`div[data-node-id="${id}"][data-av-id="${table.avID}"]`).innerHTML = innerHTML;
|
||||
element.querySelector(`[data-node-id="${id}"][data-av-id="${table.avID}"]`).innerHTML = innerHTML;
|
||||
}
|
||||
});
|
||||
if (element.innerHTML === "") {
|
||||
|
@ -298,11 +306,11 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
|
|||
if (!targetElement) {
|
||||
targetElement = hasClosestByClassName(document.elementFromPoint(event.clientX, event.clientY - 1), "av__row");
|
||||
}
|
||||
if (!targetElement || targetElement.isSameNode(window.siyuan.dragElement) || !dragBlockElement) {
|
||||
if (!targetElement || targetElement === window.siyuan.dragElement || !dragBlockElement) {
|
||||
return;
|
||||
}
|
||||
const targetBlockElement = hasClosestBlock(targetElement);
|
||||
if (!targetBlockElement || !targetBlockElement.isSameNode(dragBlockElement)) {
|
||||
if (!targetBlockElement || targetBlockElement !== dragBlockElement) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
|
@ -359,11 +367,11 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
|
|||
if (blockElement) {
|
||||
transaction(protyle, [{
|
||||
action: "removeAttrViewBlock",
|
||||
srcIDs: [id],
|
||||
srcIDs: [removeElement.dataset.rowId],
|
||||
avID: blockElement.dataset.avId,
|
||||
}, {
|
||||
action: "doUpdateUpdated",
|
||||
id,
|
||||
id: removeElement.dataset.rowId,
|
||||
data: dayjs().format("YYYYMMDDHHmmss"),
|
||||
}]);
|
||||
blockElement.remove();
|
||||
|
@ -424,7 +432,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
|
|||
value = {
|
||||
block: {
|
||||
content: item.value,
|
||||
id: item.parentElement.dataset.blockId,
|
||||
id: item.dataset.id,
|
||||
},
|
||||
isDetached: false
|
||||
};
|
||||
|
@ -432,7 +440,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
|
|||
fetchPost("/api/av/setAttributeViewBlockAttr", {
|
||||
avID: item.parentElement.dataset.avId,
|
||||
keyID: item.parentElement.dataset.colId,
|
||||
rowID: item.parentElement.dataset.blockId,
|
||||
rowID: item.parentElement.dataset.rowId,
|
||||
value
|
||||
}, (setResponse) => {
|
||||
if (type === "number") {
|
||||
|
@ -455,13 +463,26 @@ const openEdit = (protyle: IProtyle, element: HTMLElement, event: MouseEvent) =>
|
|||
if (!blockElement) {
|
||||
return;
|
||||
}
|
||||
while (target && !element.isSameNode(target)) {
|
||||
while (target && element !== target) {
|
||||
const type = target.getAttribute("data-type");
|
||||
if (target.classList.contains("av__celltext--url") || target.classList.contains("av__cellassetimg")) {
|
||||
if (target.classList.contains("b3-menu__avemoji")) {
|
||||
const rect = target.getBoundingClientRect();
|
||||
openEmojiPanel(target.nextElementSibling.getAttribute("data-id"), "doc", {
|
||||
x: rect.left,
|
||||
y: rect.bottom,
|
||||
h: rect.height,
|
||||
w: rect.width,
|
||||
}, (unicode) => {
|
||||
target.innerHTML = unicode2Emoji(unicode || window.siyuan.storage[Constants.LOCAL_IMAGES].file);
|
||||
}, target.querySelector("img"));
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return true;
|
||||
} else if (target.classList.contains("av__celltext--url") || target.classList.contains("av__cellassetimg")) {
|
||||
if (event.type === "contextmenu" || (!target.dataset.url && target.tagName !== "IMG")) {
|
||||
let index = 0;
|
||||
Array.from(target.parentElement.children).find((item, i) => {
|
||||
if (item.isSameNode(target)) {
|
||||
if (item === target) {
|
||||
index = i;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ export const genCellValueByElement = (colType: TAVCol, cellElement: HTMLElement)
|
|||
const contents: IAVCellValue[] = [];
|
||||
Array.from(cellElement.querySelectorAll(".av__cell--relation")).forEach((relationItem: HTMLElement) => {
|
||||
const item = relationItem.querySelector(".av__celltext") as HTMLElement;
|
||||
blockIDs.push(item.dataset.id);
|
||||
blockIDs.push(relationItem.dataset.rowId);
|
||||
contents.push({
|
||||
isDetached: !item.classList.contains("av__celltext--ref"),
|
||||
block: {
|
||||
|
@ -195,6 +195,9 @@ const transformCellValue = (colType: TAVCol, value: IAVCellValue): IAVCellValue
|
|||
content: getCellValueContent(value).toString(),
|
||||
color: "1"
|
||||
}];
|
||||
if (!newValue.mSelect[0].content) {
|
||||
newValue.mSelect = [];
|
||||
}
|
||||
} else if (colType === "rollup") {
|
||||
newValue.rollup = {contents: [value]};
|
||||
} else if (colType === "checkbox") {
|
||||
|
@ -204,7 +207,7 @@ const transformCellValue = (colType: TAVCol, value: IAVCellValue): IAVCellValue
|
|||
} else if (colType === "relation") {
|
||||
if (value.type === "block") {
|
||||
newValue.relation = {
|
||||
blockIDs: [value.block.id],
|
||||
blockIDs: [value.blockID],
|
||||
contents: [value]
|
||||
};
|
||||
} else {
|
||||
|
@ -380,7 +383,7 @@ export const genCellValue = (colType: TAVCol, value: string | any) => {
|
|||
}
|
||||
}
|
||||
if (colType === "block") {
|
||||
if (typeof value === "object" && value.id) {
|
||||
if (typeof value === "object" && value && value.id) {
|
||||
cellValue.isDetached = false;
|
||||
} else {
|
||||
cellValue.isDetached = true;
|
||||
|
@ -427,15 +430,19 @@ export const cellScrollIntoView = (blockElement: HTMLElement, cellElement: Eleme
|
|||
// 属性面板
|
||||
return;
|
||||
}
|
||||
const avHeaderRect = blockElement.querySelector(".av__row--header").getBoundingClientRect();
|
||||
const bodyElement = hasClosestByClassName(cellElement, "av__body");
|
||||
if (!bodyElement) {
|
||||
return;
|
||||
}
|
||||
const avHeaderRect = bodyElement.querySelector(".av__row--header").getBoundingClientRect();
|
||||
if (avHeaderRect.bottom > cellRect.top) {
|
||||
const contentElement = hasClosestByClassName(blockElement, "protyle-content", true);
|
||||
if (contentElement) {
|
||||
contentElement.scrollTop = contentElement.scrollTop + cellRect.top - avHeaderRect.bottom;
|
||||
}
|
||||
} else {
|
||||
const footerElement = blockElement.querySelector(".av__row--footer");
|
||||
if (footerElement.querySelector(".av__calc--ashow")) {
|
||||
const footerElement = bodyElement.querySelector(".av__row--footer");
|
||||
if (footerElement?.querySelector(".av__calc--ashow")) {
|
||||
const avFooterRect = footerElement.getBoundingClientRect();
|
||||
if (avFooterRect.top < cellRect.bottom) {
|
||||
const contentElement = hasClosestByClassName(blockElement, "protyle-content", true);
|
||||
|
@ -457,7 +464,7 @@ export const cellScrollIntoView = (blockElement: HTMLElement, cellElement: Eleme
|
|||
};
|
||||
|
||||
export const getTypeByCellElement = (cellElement: Element) => {
|
||||
if (cellElement.parentElement.classList.contains("av__gallery-fields")) {
|
||||
if (cellElement.parentElement.classList.contains("av__gallery-field")) {
|
||||
return cellElement.getAttribute("data-dtype") as TAVCol;
|
||||
}
|
||||
const scrollElement = hasClosestByClassName(cellElement, "av__scroll");
|
||||
|
@ -743,9 +750,9 @@ export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, va
|
|||
const cellId = item.dataset.id; // 刚创建时无 id,更新需和 oldValue 保持一致
|
||||
const colId = getColId(item, viewType);
|
||||
|
||||
text += getCellText(item) + ((cellElements[elementIndex + 1] && item.nextElementSibling && item.nextElementSibling.isSameNode(cellElements[elementIndex + 1])) ? "\t" : "\n\n");
|
||||
text += getCellText(item) + ((cellElements[elementIndex + 1] && item.nextElementSibling && item.nextElementSibling === cellElements[elementIndex + 1]) ? "\t" : "\n\n");
|
||||
const oldValue = genCellValueByElement(type, item);
|
||||
if (elementIndex === 0 || !cellElements[elementIndex - 1].isSameNode(item.previousElementSibling)) {
|
||||
if (elementIndex === 0 || cellElements[elementIndex - 1] !== item.previousElementSibling) {
|
||||
json.push([]);
|
||||
}
|
||||
json[json.length - 1].push(oldValue);
|
||||
|
@ -909,13 +916,10 @@ export const renderCellAttr = (cellElement: Element, value: IAVCellValue) => {
|
|||
cellElement.classList.add("av__cell-uncheck");
|
||||
}
|
||||
} else if (value.type === "block") {
|
||||
if (value.block.id) {
|
||||
// 不能设置为空,否则编辑后会临时无 id
|
||||
cellElement.setAttribute("data-block-id", value.block.id);
|
||||
}
|
||||
if (value.isDetached) {
|
||||
cellElement.setAttribute("data-detached", "true");
|
||||
} else {
|
||||
cellElement.querySelector(".av__celltext").setAttribute("data-id", value.block.id);
|
||||
cellElement.removeAttribute("data-detached");
|
||||
}
|
||||
}
|
||||
|
@ -977,13 +981,13 @@ export const renderCell = (cellValue: IAVCellValue, rowIndex = 0, showIcon = tru
|
|||
});
|
||||
} else if (cellValue.type === "checkbox") {
|
||||
text += `<div class="fn__flex"><svg class="av__checkbox"><use xlink:href="#icon${cellValue?.checkbox?.checked ? "Check" : "Uncheck"}"></use></svg>`;
|
||||
if (type === "gallery") {
|
||||
text += `<span class="fn__space"></span>${window.siyuan.languages.checkbox}`;
|
||||
if (type === "gallery" && cellValue?.checkbox?.content) {
|
||||
text += `<span class="fn__space"></span>${cellValue?.checkbox?.content}`;
|
||||
}
|
||||
text += "</div>";
|
||||
} else if (cellValue.type === "rollup") {
|
||||
cellValue?.rollup?.contents?.forEach((item) => {
|
||||
const rollupText = ["select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? renderCell(item, rowIndex, showIcon, type) : renderRollup(item);
|
||||
const rollupText = ["template", "select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? renderCell(item, rowIndex, showIcon, type) : renderRollup(item);
|
||||
if (rollupText) {
|
||||
text += rollupText + ", ";
|
||||
}
|
||||
|
@ -992,13 +996,14 @@ export const renderCell = (cellValue: IAVCellValue, rowIndex = 0, showIcon = tru
|
|||
text = text.substring(0, text.length - 2);
|
||||
}
|
||||
} else if (cellValue.type === "relation") {
|
||||
cellValue?.relation?.contents?.forEach((item) => {
|
||||
cellValue?.relation?.contents?.forEach((item, index) => {
|
||||
if (item && item.block) {
|
||||
const rowID = cellValue.relation.blockIDs[index];
|
||||
if (item?.isDetached) {
|
||||
text += `<span class="av__cell--relation"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}">➖</span><span class="av__celltext" data-id="${item.block?.id}">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
text += `<span data-row-id="${rowID}" class="av__cell--relation"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}">➖</span><span class="av__celltext">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
} else {
|
||||
// data-block-id 用于更新 emoji
|
||||
text += `<span class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
text += `<span data-row-id="${rowID}" class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -1032,14 +1037,14 @@ const renderRollup = (cellValue: IAVCellValue) => {
|
|||
}
|
||||
} else if (cellValue.type === "block") {
|
||||
if (cellValue?.isDetached) {
|
||||
text = `<span class="av__celltext" data-id="${cellValue.block?.id}">${Lute.EscapeHTMLStr(cellValue.block?.content || window.siyuan.languages.untitled)}</span>`;
|
||||
text = `<span class="av__celltext">${Lute.EscapeHTMLStr(cellValue.block?.content || window.siyuan.languages.untitled)}</span>`;
|
||||
} else {
|
||||
text = `<span data-type="block-ref" data-id="${cellValue.block?.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(cellValue.block?.content || window.siyuan.languages.untitled)}</span>`;
|
||||
}
|
||||
} else if (cellValue.type === "number") {
|
||||
text = cellValue?.number.formattedContent || cellValue?.number.content.toString() || "";
|
||||
} else if (cellValue.type === "date") {
|
||||
const dataValue = cellValue ? cellValue.date : null;
|
||||
} else if (["date", "updated", "created"].includes(cellValue.type)) {
|
||||
const dataValue = cellValue ? cellValue[cellValue.type as "date"] : null;
|
||||
if (dataValue.formattedContent) {
|
||||
text = dataValue.formattedContent;
|
||||
} else {
|
||||
|
@ -1104,7 +1109,7 @@ export const getPositionByCellElement = (cellElement: HTMLElement) => {
|
|||
|
||||
export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, originData: {
|
||||
[key: string]: IAVCellValue[]
|
||||
}, originCellIds: string[]) => {
|
||||
}, originCellIds: string[], activeElement: Element) => {
|
||||
nodeElement.querySelector(".av__drag-fill")?.remove();
|
||||
const newData: { [key: string]: Array<IAVCellValue & { colId?: string, element?: HTMLElement }> } = {};
|
||||
nodeElement.querySelectorAll(".av__cell--active").forEach((item: HTMLElement) => {
|
||||
|
@ -1130,6 +1135,7 @@ export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement,
|
|||
const undoOperations: IOperation[] = [];
|
||||
const avID = nodeElement.dataset.avId;
|
||||
const originKeys = Object.keys(originData);
|
||||
const showIcon = activeElement.querySelector(".b3-menu__avemoji") ? true : false;
|
||||
Object.keys(newData).forEach((rowID, index) => {
|
||||
newData[rowID].forEach((item, cellIndex) => {
|
||||
if (["rollup", "template", "created", "updated"].includes(item.type) ||
|
||||
|
@ -1152,8 +1158,7 @@ export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement,
|
|||
rowID,
|
||||
data
|
||||
});
|
||||
const iconElement = item.element.querySelector(".b3-menu__avemoji");
|
||||
item.element.innerHTML = renderCell(data, 0, iconElement ? !iconElement.classList.contains("fn__none") : false);
|
||||
item.element.innerHTML = renderCell(data, 0, showIcon);
|
||||
renderCellAttr(item.element, data);
|
||||
delete item.colId;
|
||||
delete item.element;
|
||||
|
@ -1179,6 +1184,10 @@ export const addDragFill = (cellElement: Element) => {
|
|||
}
|
||||
cellElement.classList.add("av__cell--active");
|
||||
if (!cellElement.querySelector(".av__drag-fill")) {
|
||||
const cellType = cellElement.getAttribute("data-dtype") as TAVCol;
|
||||
if (["template", "rollup", "lineNumber", "created", "updated"].includes(cellType)) {
|
||||
return;
|
||||
}
|
||||
cellElement.insertAdjacentHTML("beforeend", `<div aria-label="${window.siyuan.languages.dragFill}" class="av__drag-fill ariaLabel"></div>`);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -200,7 +200,7 @@ export const getEditHTML = (options: {
|
|||
<svg class="b3-menu__icon" style=""><use xlink:href="#iconCopy"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.duplicate}</span>
|
||||
</button>
|
||||
<button class="b3-menu__item" data-type="removeCol">
|
||||
<button class="b3-menu__item b3-menu__item--warning" data-type="removeCol">
|
||||
<svg class="b3-menu__icon" style=""><use xlink:href="#iconTrashcan"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.delete}</span>
|
||||
</button>`;
|
||||
|
@ -571,20 +571,19 @@ const addAttrViewColAnimation = (options: {
|
|||
}
|
||||
const nodeId = options.blockElement.getAttribute("data-node-id");
|
||||
if (options.blockElement.classList.contains("av")) {
|
||||
options.blockElement.querySelectorAll(".av__row").forEach((item, index) => {
|
||||
options.blockElement.querySelectorAll(".av__row").forEach((item) => {
|
||||
let previousElement;
|
||||
if (options.previousID) {
|
||||
previousElement = item.querySelector(`[data-col-id="${options.previousID}"]`);
|
||||
} else {
|
||||
previousElement = item.lastElementChild.previousElementSibling;
|
||||
previousElement = item.querySelector(".av__cell").previousElementSibling;
|
||||
}
|
||||
let html = "";
|
||||
if (index === 0) {
|
||||
// av__pulse 用于检测是否新增,和 render 中 isPulse 配合弹出菜单
|
||||
if (item.classList.contains("av__row--header")) {
|
||||
html = `<div class="av__cell av__cell--header" draggable="true" data-icon="${options.icon || ""}" data-col-id="${options.id}" data-dtype="${options.type}" data-wrap="false" style="width: 200px;">
|
||||
${options.icon ? unicode2Emoji(options.icon, "av__cellheadericon", true) : `<svg class="av__cellheadericon"><use xlink:href="#${getColIconByType(options.type)}"></use></svg>`}
|
||||
<span class="av__celltext fn__flex-1">${options.name}</span>
|
||||
<div class="av__widthdrag av__pulse"></div>
|
||||
<div class="av__widthdrag"></div>
|
||||
</div>`;
|
||||
} else {
|
||||
html = '<div class="av__cell" style="width: 200px"><span class="av__pulse"></span></div>';
|
||||
|
@ -806,7 +805,9 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
|
|||
return true;
|
||||
}
|
||||
});
|
||||
let empty = false;
|
||||
if (!filter) {
|
||||
empty = true;
|
||||
filter = {
|
||||
column: colId,
|
||||
operator: getDefaultOperatorByType(type),
|
||||
|
@ -815,6 +816,7 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
|
|||
avData.view.filters.push(filter);
|
||||
}
|
||||
setFilter({
|
||||
empty,
|
||||
filter,
|
||||
protyle,
|
||||
data: avData,
|
||||
|
@ -1015,7 +1017,7 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
|
|||
dialog.element.addEventListener("click", (event) => {
|
||||
let target = event.target as HTMLElement;
|
||||
const isDispatch = typeof event.detail === "string";
|
||||
while (target && !target.isSameNode(dialog.element) || isDispatch) {
|
||||
while (target && target !== dialog.element || isDispatch) {
|
||||
const action = target.getAttribute("data-action");
|
||||
if (action === "delete" || (isDispatch && event.detail === "Enter")) {
|
||||
removeColByMenu({
|
||||
|
@ -1816,7 +1818,7 @@ const genColDataByType = (type: TAVCol, id: string, name: string) => {
|
|||
template: "",
|
||||
type,
|
||||
width: "",
|
||||
wrap: false,
|
||||
wrap: undefined,
|
||||
calc: null
|
||||
};
|
||||
return colData;
|
||||
|
|
|
@ -75,7 +75,8 @@ export const setFilter = async (options: {
|
|||
protyle: IProtyle,
|
||||
data: IAV,
|
||||
target: HTMLElement,
|
||||
blockElement: Element
|
||||
blockElement: Element,
|
||||
empty: boolean
|
||||
}) => {
|
||||
let rectTarget = options.target.getBoundingClientRect();
|
||||
if (rectTarget.height === 0) {
|
||||
|
@ -175,7 +176,7 @@ export const setFilter = async (options: {
|
|||
return true;
|
||||
}
|
||||
});
|
||||
if (isSame || !hasMatch) {
|
||||
if (!options.empty && (isSame || !hasMatch)) {
|
||||
return;
|
||||
}
|
||||
transaction(options.protyle, [{
|
||||
|
@ -598,6 +599,7 @@ export const addFilter = (options: {
|
|||
setPosition(options.menuElement, options.tabRect.right - options.menuElement.clientWidth, options.tabRect.bottom, options.tabRect.height);
|
||||
const filterElement = options.menuElement.querySelector(`[data-id="${column.id}"] .b3-chip`) as HTMLElement;
|
||||
setFilter({
|
||||
empty: true,
|
||||
filter,
|
||||
protyle: options.protyle,
|
||||
data: options.data,
|
||||
|
@ -648,12 +650,16 @@ export const getFiltersHTML = (data: IAV) => {
|
|||
${filter.relativeDate2.direction ? filter.relativeDate2.count : ""}
|
||||
${window.siyuan.languages[["day", "week", "month", "year"][filter.relativeDate2.unit]]}`;
|
||||
}
|
||||
} else if (filterValue && filterValue[filterValue.type as "date"]?.content) {
|
||||
} else if (filterValue) {
|
||||
if (filterValue[filterValue.type as "date"]?.content) {
|
||||
dateValue = dayjs(filterValue[filterValue.type as "date"].content).format("YYYY-MM-DD");
|
||||
}
|
||||
if (filterValue && filterValue[filterValue.type as "date"]?.content2) {
|
||||
dateValue2 = dayjs(filterValue[filterValue.type as "date"].content2).format("YYYY-MM-DD");
|
||||
}
|
||||
}
|
||||
if (dateValue) {
|
||||
if (filter.operator === "Is between") {
|
||||
if (filter.operator === "Is between" && dateValue2) {
|
||||
filterText = ` ${window.siyuan.languages.filterOperatorIsBetween} ${dateValue} ${dateValue2}`;
|
||||
} else if ("=" === filter.operator) {
|
||||
filterText = `: ${dateValue}`;
|
||||
|
@ -691,8 +697,8 @@ export const getFiltersHTML = (data: IAV) => {
|
|||
filterText = ` ≤ ${filterValue.number.content}`;
|
||||
}
|
||||
} else if (["text", "block", "url", "phone", "email", "relation", "template"].includes(filterValue.type) && filterValue[filterValue.type as "text"]) {
|
||||
const content = filterValue[filterValue.type as "text"].content ||
|
||||
filterValue.relation?.blockIDs[0] || "";
|
||||
const content = filterValue[filterValue.type as "text"].content || filterValue.relation?.blockIDs[0] || "";
|
||||
if (content) {
|
||||
if (["=", "Contains"].includes(filter.operator)) {
|
||||
filterText = `: ${content}`;
|
||||
} else if (filter.operator === "Does not contains") {
|
||||
|
@ -711,6 +717,7 @@ export const getFiltersHTML = (data: IAV) => {
|
|||
filterText = ` ≤ ${content}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
filterHTML += `<span data-type="setFilter" class="b3-chip${filterText ? " b3-chip--primary" : ""}">
|
||||
${item.icon ? unicode2Emoji(item.icon, "icon", true) : `<svg class="icon"><use xlink:href="#${getColIconByType(item.type)}"></use></svg>`}
|
||||
<span class="fn__ellipsis">${item.name}${filterText}</span>
|
||||
|
@ -743,7 +750,7 @@ ${html}
|
|||
<svg class="b3-menu__icon"><use xlink:href="#iconAdd"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.addFilter}</span>
|
||||
</button>
|
||||
<button class="b3-menu__item${html ? "" : " fn__none"}" data-type="removeFilters">
|
||||
<button class="b3-menu__item b3-menu__item--warning${html ? "" : " fn__none"}" data-type="removeFilters">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconTrashcan"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.removeFilters}</span>
|
||||
</button>
|
||||
|
|
|
@ -1,135 +1,97 @@
|
|||
import {showMessage} from "../../../../dialog/message";
|
||||
import {
|
||||
genCellValueByElement,
|
||||
getTypeByCellElement,
|
||||
renderCell,
|
||||
renderCellAttr
|
||||
} from "../cell";
|
||||
import {genCellValue, getTypeByCellElement, renderCell, renderCellAttr} from "../cell";
|
||||
import {fetchPost} from "../../../../util/fetch";
|
||||
import {setPage} from "../row";
|
||||
import {Constants} from "../../../../constants";
|
||||
import {clearSelect} from "../../../util/clearSelect";
|
||||
|
||||
export const insertGalleryItemAnimation = (options: {
|
||||
blockElement: HTMLElement;
|
||||
protyle: IProtyle;
|
||||
srcIDs: string[];
|
||||
previousId: string;
|
||||
groupID?: string
|
||||
}) => {
|
||||
if ((options.blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement).value !== "") {
|
||||
showMessage(window.siyuan.languages.insertRowTip);
|
||||
(options.blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement).value = "";
|
||||
const groupQuery = options.groupID ? `.av__body[data-group-id="${options.groupID}"] ` : "";
|
||||
let sideItemElement = options.previousId ? options.blockElement.querySelector(groupQuery + `.av__gallery-item[data-id="${options.previousId}"]`) : options.blockElement.querySelector(groupQuery + ".av__gallery-item");
|
||||
const hasSort = options.blockElement.querySelector('.av__views [data-type="av-sort"]').classList.contains("block__icon--active");
|
||||
if (hasSort) {
|
||||
sideItemElement = options.blockElement.querySelector(groupQuery + ".av__gallery-add").previousElementSibling;
|
||||
}
|
||||
const bodyElement = options.blockElement.querySelector(`.av__body[data-group-id="${options.groupID}"] `);
|
||||
if (bodyElement && ["updated", "created"].includes(bodyElement.getAttribute("data-dtype")) &&
|
||||
bodyElement.getAttribute("data-content") !== "_@today@_") {
|
||||
sideItemElement = options.blockElement.querySelector('.av__body[data-content="_@today@_"] .av__gallery-add')?.previousElementSibling;
|
||||
if (!sideItemElement) {
|
||||
return;
|
||||
}
|
||||
const avId = options.blockElement.getAttribute("data-av-id");
|
||||
const sideItemElement = options.previousId ? options.blockElement.querySelector(`.av__gallery-item[data-id="${options.previousId}"]`) : options.blockElement.querySelector(".av__gallery-item");
|
||||
let html = "";
|
||||
let needUpdate = "";
|
||||
if (options.blockElement.querySelector('.av__views [data-type="av-sort"]').classList.contains("block__icon--active") &&
|
||||
!options.blockElement.querySelector('[data-type="av-load-more"]').classList.contains("fn__none")) {
|
||||
needUpdate = ' data-need-update="true"';
|
||||
}
|
||||
const coverClass = sideItemElement?.querySelector(".av__gallery-cover")?.className || "fn__none";
|
||||
options.srcIDs.forEach((id) => {
|
||||
html += `<div class="av__gallery-item"${needUpdate} data-type="ghost" data-id="${id}">
|
||||
<div class="${coverClass}"><span style="width: 100%;height: 100%;border-radius: var(--b3-border-radius) var(--b3-border-radius) 0 0;" class="av__pulse"></span></div>
|
||||
<div class="av__gallery-fields"><span class="av__pulse"></span></div>
|
||||
</div>`;
|
||||
});
|
||||
if (options.previousId && sideItemElement) {
|
||||
sideItemElement.insertAdjacentHTML("afterend", html);
|
||||
} else {
|
||||
options.blockElement.querySelector(".av__gallery").insertAdjacentHTML("afterbegin", html);
|
||||
let cellsHTML = "";
|
||||
sideItemElement?.querySelectorAll(".av__cell").forEach((item: HTMLElement) => {
|
||||
let lineNumber = 1;
|
||||
const fieldType = getTypeByCellElement(item);
|
||||
if (fieldType === "lineNumber") {
|
||||
const lineNumberValue = item.querySelector(".av__celltext")?.getAttribute("data-value");
|
||||
if (lineNumberValue) {
|
||||
lineNumber = parseInt(lineNumberValue);
|
||||
}
|
||||
const currentItemElement = options.blockElement.querySelector(`.av__gallery-item[data-id="${options.srcIDs[0]}"]`);
|
||||
fetchPost("/api/av/getAttributeViewFilterSort", {
|
||||
id: avId,
|
||||
blockID: options.blockElement.getAttribute("data-node-id")
|
||||
}, (response) => {
|
||||
// https://github.com/siyuan-note/siyuan/issues/10517
|
||||
let hideTextCell = false;
|
||||
response.data.filters.find((item: IAVFilter) => {
|
||||
const itemCellElement = options.blockElement.querySelector(`.av__cell[data-field-id="${item.column}"]`);
|
||||
if (!itemCellElement) {
|
||||
return;
|
||||
}
|
||||
const filterType = itemCellElement.getAttribute("data-dtype");
|
||||
if (item.value && filterType !== item.value.type) {
|
||||
return;
|
||||
}
|
||||
if (["relation", "rollup", "template"].includes(filterType)) {
|
||||
hideTextCell = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 根据后台计算出显示与否的结果进行标识,以便于在 refreshAV 中更新 UI
|
||||
if (["created", "updated"].includes(filterType)) {
|
||||
currentItemElement.setAttribute("data-need-update", "true");
|
||||
const cellHTML = `<div class="av__cell${fieldType === "checkbox" ? " av__cell-uncheck" : ""}"
|
||||
data-field-id="${item.dataset.fieldId}"
|
||||
data-wrap="${item.dataset.wrap}"
|
||||
data-dtype="${item.dataset.dtype}"
|
||||
${fieldType === "block" ? ' data-detached="true"' : ""}>${renderCell(genCellValue(fieldType, null), lineNumber, false, "gallery")}</div>`;
|
||||
if (item.previousElementSibling.classList.contains("av__gallery-name")) {
|
||||
cellsHTML += `<div class="av__gallery-field av__gallery-field--name" data-empty="${item.parentElement.dataset.empty}">
|
||||
${item.previousElementSibling.outerHTML}
|
||||
${cellHTML}
|
||||
</div>`;
|
||||
} else {
|
||||
response.data.sorts.find((sortItem: IAVSort) => {
|
||||
if (sortItem.column === item.column) {
|
||||
currentItemElement.setAttribute("data-need-update", "true");
|
||||
return true;
|
||||
cellsHTML += `<div class="av__gallery-field" data-empty="${item.parentElement.dataset.empty}">
|
||||
${item.previousElementSibling.outerHTML}
|
||||
${cellHTML}
|
||||
</div>`;
|
||||
}
|
||||
});
|
||||
clearSelect(["galleryItem"], options.blockElement);
|
||||
let html = "";
|
||||
const coverClass = sideItemElement?.querySelector(".av__gallery-cover")?.className || "fn__none";
|
||||
options.srcIDs.forEach(() => {
|
||||
html += `<div class="av__gallery-item" data-type="ghost">
|
||||
<div class="${coverClass}"><span style="width: 100%;height: 100%;border-radius: var(--b3-border-radius) var(--b3-border-radius) 0 0;" class="av__pulse"></span></div>
|
||||
<div class="av__gallery-fields">${cellsHTML}</div>
|
||||
</div>`;
|
||||
});
|
||||
if (sideItemElement) {
|
||||
sideItemElement.insertAdjacentHTML("afterend", html);
|
||||
} else {
|
||||
options.blockElement.querySelector(groupQuery + ".av__gallery")?.insertAdjacentHTML("afterbegin", html);
|
||||
}
|
||||
// 当空或非空外,需要根据值进行判断
|
||||
let isRenderValue = true;
|
||||
if (item.operator !== "Is empty" && item.operator !== "Is not empty") {
|
||||
switch (item.value.type) {
|
||||
case "select":
|
||||
case "mSelect":
|
||||
if (!item.value.mSelect || item.value.mSelect.length === 0) {
|
||||
isRenderValue = false;
|
||||
fetchPost("/api/av/getAttributeViewAddingBlockDefaultValues", {
|
||||
avID: options.blockElement.getAttribute("data-av-id"),
|
||||
viewID: options.blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
|
||||
groupID: options.groupID,
|
||||
previousID: options.previousId,
|
||||
}, (response) => {
|
||||
if (response.data.values) {
|
||||
let popCellElement: HTMLElement;
|
||||
const updateIds = Object.keys(response.data.values);
|
||||
options.blockElement.querySelectorAll('[data-type="ghost"]').forEach(rowItem => {
|
||||
rowItem.querySelectorAll(".av__cell").forEach((cellItem: HTMLElement) => {
|
||||
if (!popCellElement && cellItem.getAttribute("data-detached") === "true") {
|
||||
popCellElement = cellItem;
|
||||
}
|
||||
break;
|
||||
case "block":
|
||||
if (!item.value.block || !item.value.block.content) {
|
||||
isRenderValue = false;
|
||||
if (updateIds.includes(cellItem.dataset.fieldId)) {
|
||||
const cellValue = response.data.values[cellItem.dataset.fieldId];
|
||||
if (cellValue.type === "checkbox" && cellItem.parentElement.querySelector(".av__gallery-tip")) {
|
||||
cellValue.checkbox.content = cellItem.getAttribute("aria-label").split('<div class="ft__on-surface">')[0];
|
||||
}
|
||||
break;
|
||||
case "number":
|
||||
if (!item.value.number || !item.value.number.isNotEmpty) {
|
||||
isRenderValue = false;
|
||||
}
|
||||
break;
|
||||
case "date":
|
||||
case "created":
|
||||
case "updated":
|
||||
if (!item.value[item.value.type] || !item.value[item.value.type].isNotEmpty) {
|
||||
isRenderValue = false;
|
||||
}
|
||||
break;
|
||||
case "mAsset":
|
||||
if (!item.value.mAsset || item.value.mAsset.length === 0) {
|
||||
isRenderValue = false;
|
||||
}
|
||||
break;
|
||||
case "checkbox":
|
||||
if (!item.value.checkbox) {
|
||||
isRenderValue = false;
|
||||
}
|
||||
break;
|
||||
case "text":
|
||||
case "url":
|
||||
case "phone":
|
||||
case "email":
|
||||
if (!item.value[item.value.type] || !item.value[item.value.type].content) {
|
||||
isRenderValue = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (sideItemElement.classList.contains("av__row") && isRenderValue) {
|
||||
const sideItemCellElement = sideItemElement.querySelector(`.av__cell[data-field-id="${item.column}"]`) as HTMLElement;
|
||||
const cellElement = currentItemElement.querySelector(`.av__cell[data-field-id="${item.column}"]`);
|
||||
const cellValue = genCellValueByElement(getTypeByCellElement(sideItemCellElement), sideItemCellElement);
|
||||
const iconElement = cellElement.querySelector(".b3-menu__avemoji");
|
||||
cellElement.innerHTML = renderCell(cellValue, undefined,
|
||||
iconElement ? !iconElement.classList.contains("fn__none") : false, "gallery");
|
||||
renderCellAttr(cellElement, cellValue);
|
||||
cellItem.innerHTML = renderCell(cellValue, undefined, false, "gallery");
|
||||
renderCellAttr(cellItem, cellValue);
|
||||
}
|
||||
});
|
||||
if (hideTextCell) {
|
||||
currentItemElement.remove();
|
||||
showMessage(window.siyuan.languages.insertRowTip);
|
||||
});
|
||||
}
|
||||
setPage(options.blockElement);
|
||||
});
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue