Compare commits

...

487 commits

Author SHA1 Message Date
Daniel
f1c91863b9
🔖 Release v3.3.2
Some checks failed
Release Docker Image / build (push) Has been cancelled
Signed-off-by: Daniel <845765@qq.com>
2025-09-09 18:15:27 +08:00
Daniel
8a9e746891
🎨 Clean code
Signed-off-by: Daniel <845765@qq.com>
2025-09-09 18:11:49 +08:00
Jeffrey Chen
517f5c8453
🎨 Hide the separator line in the top bar plugin menu in publish service (#15809) 2025-09-09 18:08:21 +08:00
Vanessa
88431279bf 🎨 https://github.com/siyuan-note/siyuan/issues/15806 2025-09-09 17:32:35 +08:00
Vanessa
dc656d83a2 🎨 https://github.com/siyuan-note/siyuan/issues/15806 2025-09-09 16:43:39 +08:00
Vanessa
b69fd04137 🎨 https://github.com/siyuan-note/siyuan/issues/15806 2025-09-09 10:18:44 +08:00
Vanessa
ff909fa149 🎨 https://github.com/siyuan-note/siyuan/issues/15805 2025-09-09 10:02:51 +08:00
Vanessa
bfe50d9009 🚨 2025-09-09 09:29:00 +08:00
Daniel
93422c134d
🎨 Add field disabledInPublish to the code snippet to indicate whether it is disabled in the publish service https://github.com/siyuan-note/siyuan/issues/15806
Signed-off-by: Daniel <845765@qq.com>
2025-09-09 09:18:12 +08:00
Daniel
2f70ef43a1
🎨 Clean code
Signed-off-by: Daniel <845765@qq.com>
2025-09-09 09:07:23 +08:00
Daniel
5f6ddb4655
📝 Update changelogs
Signed-off-by: Daniel <845765@qq.com>
2025-09-08 19:41:02 +08:00
Daniel
39c4b3325e
🧑‍💻 Improve kernel API appendBlock, insertBlock and prependBlock https://github.com/siyuan-note/siyuan/issues/15798
Signed-off-by: Daniel <845765@qq.com>
2025-09-08 19:24:41 +08:00
Vanessa
393c53941a
🎨 https://github.com/siyuan-note/siyuan/issues/15801
Signed-off-by: Daniel <845765@qq.com>
2025-09-08 17:39:03 +08:00
Daniel
a4f03191fa
🎨 https://github.com/siyuan-note/siyuan/issues/15777 2025-09-08 10:58:58 +08:00
Vanessa
de9e648e9e 🎨 https://github.com/siyuan-note/siyuan/issues/15782 2025-09-08 10:52:40 +08:00
Vanessa
c1f14a33d9 🎨 https://github.com/siyuan-note/siyuan/pull/15731 2025-09-08 10:06:52 +08:00
Jeffrey Chen
adca241ed5
🎨 Improve slash menu (#15731)
fix https://github.com/siyuan-note/siyuan/issues/12518
2025-09-08 09:57:36 +08:00
Vanessa
006da6bc90 🎨 https://github.com/siyuan-note/siyuan/issues/15782 2025-09-08 09:48:36 +08:00
Vanessa
490234caab 🚨 2025-09-08 09:44:52 +08:00
Daniel
80c357564d
🎨 Regen pnpm-lock.yaml 2025-09-07 21:47:41 +08:00
Daniel
6852a49620
🎨 Improve build script 2025-09-07 21:40:17 +08:00
Daniel
93591ad44e
🐛 Fix NPE https://github.com/siyuan-note/siyuan/issues/15796 2025-09-07 21:05:54 +08:00
Daniel
6510d7dbf0
🧑‍💻 Improve kernel API appendBlock and insertBlock https://github.com/siyuan-note/siyuan/issues/15798 2025-09-07 20:58:38 +08:00
Daniel
29244a1f8c
🧑‍💻 https://github.com/siyuan-note/siyuan/issues/15798 2025-09-07 19:20:44 +08:00
Daniel
a85467751f
⬆️ Upgrade lute 2025-09-07 19:02:52 +08:00
Vanessa
14251d8dae 🎨 https://github.com/siyuan-note/siyuan/pull/15772 2025-09-07 18:40:12 +08:00
Jeffrey Chen
52a4815419
🐛 Improve database date field (#15772)
fix https://github.com/siyuan-note/siyuan/issues/13252 , https://github.com/siyuan-note/siyuan/issues/15747
2025-09-07 18:37:33 +08:00
Vanessa
45a6a190d0 🎨 https://github.com/siyuan-note/siyuan/issues/15185 2025-09-07 18:14:46 +08:00
Vanessa
c1a4aa3128 🐛 https://github.com/siyuan-note/siyuan/issues/15791 2025-09-07 11:01:11 +08:00
Vanessa
0fce405a05 Merge remote-tracking branch 'origin/dev' into dev 2025-09-07 09:59:48 +08:00
Vanessa
fe143bcb12 🎨 https://github.com/siyuan-note/siyuan/issues/8019 2025-09-07 09:59:35 +08:00
Daniel
0ad7c4cf23
🎨 Improve open the user guide https://github.com/siyuan-note/siyuan/issues/15792 2025-09-07 09:35:48 +08:00
Vanessa
c326989391 🎨 https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 22:47:16 +08:00
Vanessa
468b670bcc 🎨 https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 22:33:31 +08:00
Vanessa
4e4398ef47 🎨 https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 18:31:38 +08:00
Vanessa
fc1cbf46aa Merge remote-tracking branch 'origin/dev' into dev 2025-09-06 18:02:31 +08:00
Vanessa
80cccd41b5 🎨 https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 18:02:18 +08:00
Daniel
68991a6aef
🎨 Copy/Cut folded heading changed to copy/cut Headings and Bottom Blocks and support multiple headings copy/cut https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 17:30:35 +08:00
Daniel
2a8b47b518
🎨 Copy/Cut folded heading changed to copy/cut Headings and Bottom Blocks and support multiple headings copy/cut https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 17:15:42 +08:00
Daniel
8ad3cb00ad
🎨 Copy/Cut folded heading changed to copy/cut Headings and Bottom Blocks and support multiple headings copy/cut https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 17:11:21 +08:00
Daniel
c55c413365
🎨 Copy/Cut folded heading changed to copy/cut Headings and Bottom Blocks and support multiple headings copy/cut https://github.com/siyuan-note/siyuan/issues/8019 2025-09-06 17:10:43 +08:00
Vanessa
4767e399e2 Merge remote-tracking branch 'origin/dev' into dev 2025-09-06 10:22:29 +08:00
Vanessa
5ade06a3b6 🎨 https://github.com/siyuan-note/siyuan/issues/15609 2025-09-06 10:22:16 +08:00
Daniel
8ebb617072
📝 Database rollup field filtering rules support "Any", "All", and "None" https://github.com/siyuan-note/siyuan/issues/15609 2025-09-06 08:43:59 +08:00
Daniel
305bd9dfb0
🎨 Improve duplicating doc/av https://github.com/siyuan-note/siyuan/issues/15786 2025-09-06 08:28:54 +08:00
Vanessa
d2f990a830 🎨 https://github.com/siyuan-note/siyuan/issues/15609 2025-09-05 23:44:46 +08:00
Vanessa
5775aa9734 Merge remote-tracking branch 'origin/dev' into dev 2025-09-05 23:38:13 +08:00
Vanessa
80f1c6c3ec 🎨 https://github.com/siyuan-note/siyuan/issues/15609 2025-09-05 23:37:58 +08:00
Daniel
f220e3627f
📝 Database rollup field filtering rules support "Any", "All", and "None" https://github.com/siyuan-note/siyuan/issues/15609 2025-09-05 23:15:20 +08:00
Daniel
1fb4ed980b
⬆️ Upgrade lute 2025-09-05 22:51:41 +08:00
Daniel
04bf9e9848
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15775 2025-09-05 17:44:03 +08:00
Daniel
9447f1c5a8
🎨 Clean code 2025-09-05 17:38:46 +08:00
Vanessa
afa74ebb4b 🎨 https://github.com/siyuan-note/siyuan/issues/15771 2025-09-05 17:16:48 +08:00
Jeffrey Chen
17a96ee1b1
🎨 Dragging multiple files into the editor will cause them to be opened by the default program (#15773) 2025-09-05 12:10:44 +08:00
Vanessa
647204eee1 🎨 https://github.com/siyuan-note/siyuan/issues/15733 2025-09-05 12:01:46 +08:00
Vanessa
4eb91f2e40 Merge remote-tracking branch 'origin/dev' into dev 2025-09-05 11:26:31 +08:00
Vanessa
d48e3d5211 🎨 https://github.com/siyuan-note/siyuan/issues/15771 2025-09-05 11:26:18 +08:00
Jeffrey Chen
59265bfc94
📝 Improve text (#15774) 2025-09-05 10:27:07 +08:00
Daniel
16913fb065
⬆️ Upgrade pnpm 2025-09-05 10:16:25 +08:00
Vanessa
65b52a2bc6 🎨 https://github.com/siyuan-note/siyuan/issues/15771 2025-09-05 08:59:52 +08:00
Vanessa
ac6b1d6689 🎨 https://github.com/siyuan-note/siyuan/issues/15768 2025-09-04 21:45:25 +08:00
Vanessa
7ae90058c3 🎨 https://github.com/siyuan-note/siyuan/issues/15771 2025-09-04 20:48:40 +08:00
Daniel
fdfd453e2b
🎨 https://github.com/siyuan-note/siyuan/issues/15748 2025-09-04 19:53:53 +08:00
Vanessa
0aa5624495 Merge remote-tracking branch 'origin/dev' into dev 2025-09-04 19:48:31 +08:00
Vanessa
0b3cef8964 🎨 https://github.com/siyuan-note/siyuan/issues/15748 2025-09-04 19:48:18 +08:00
Daniel
2c5d4d47a4
🎨 https://github.com/siyuan-note/siyuan/issues/15749 2025-09-04 19:38:49 +08:00
Vanessa
3379d29e67 Merge remote-tracking branch 'origin/dev' into dev 2025-09-04 18:24:04 +08:00
Vanessa
ba95f45b92 🎨 https://github.com/siyuan-note/siyuan/issues/15751 2025-09-04 18:23:51 +08:00
Daniel
ed78e67af2
🎨 Clean code 2025-09-04 18:08:45 +08:00
Daniel
ba10d96a10
Revert "🎨 Add tags to the database when binding blocks to the database https://github.com/siyuan-note/siyuan/issues/15757"
This reverts commit 4d8bc1672c.
2025-09-04 18:00:47 +08:00
Daniel
4d8bc1672c
🎨 Add tags to the database when binding blocks to the database https://github.com/siyuan-note/siyuan/issues/15757 2025-09-04 17:43:18 +08:00
Vanessa
e91a37a98b 🎨 https://github.com/siyuan-note/siyuan/issues/15760 2025-09-04 16:38:07 +08:00
Vanessa
f6bd240a85 Merge remote-tracking branch 'origin/dev' into dev 2025-09-04 16:31:24 +08:00
Vanessa
c08f88156f 🎨 https://github.com/siyuan-note/siyuan/issues/15750 2025-09-04 16:31:12 +08:00
Daniel
74826fc0ce
🎨 Improve database performance https://github.com/siyuan-note/siyuan/issues/15764 2025-09-04 16:17:39 +08:00
Daniel
e1bb9874be
🎨 Clean code 2025-09-04 16:15:03 +08:00
Daniel
2b85cb1b6c
🎨 Improve database performance https://github.com/siyuan-note/siyuan/issues/15764 2025-09-04 16:14:38 +08:00
Daniel
cd8c3a41e6
🎨 Clean code 2025-09-04 15:40:23 +08:00
Jeffrey Chen
bdace41d97
📝 Improve User Guide (#15767)
https://github.com/siyuan-note/siyuan/issues/14430
2025-09-04 15:40:06 +08:00
Vanessa
ea2294e901 🎨 https://github.com/siyuan-note/siyuan/issues/15761 2025-09-04 12:11:22 +08:00
Vanessa
868c9d980a Merge remote-tracking branch 'origin/dev' into dev 2025-09-04 10:30:18 +08:00
Vanessa
2d53c81026 Merge remote-tracking branch 'origin/dev' into dev 2025-09-04 10:30:06 +08:00
Daniel
6ff4439be3
🧑‍💻 Add field disabledInPublish to the marketplace package metadata to indicate whether it is disabled in the publishing service https://github.com/siyuan-note/siyuan/issues/11730 2025-09-04 10:29:58 +08:00
Vanessa
d47a8ffe02 🎨 https://github.com/siyuan-note/siyuan/issues/15639 2025-09-04 10:29:54 +08:00
Daniel
9410a70a2b
🎨 Add marketplace package config item minAppVersion https://github.com/siyuan-note/siyuan/issues/8330 2025-09-04 10:22:57 +08:00
Daniel
3c3f34442f
🎨 Improve bazaar package 2025-09-04 10:14:41 +08:00
Daniel
9dc6f56bff
🎨 Improve bazaar package 2025-09-04 10:14:21 +08:00
Vanessa
22fdaa71ef 🎨 https://github.com/siyuan-note/siyuan/issues/15759 2025-09-03 23:44:04 +08:00
Daniel
fd7dba5ed4
🎨 Update text https://github.com/siyuan-note/siyuan/issues/15759 2025-09-03 23:26:43 +08:00
Daniel
d6a33c8c02
⬆️ Upgrade kernel deps 2025-09-03 22:10:26 +08:00
Daniel
6f2b8e47ae
⬆️ Upgrade lute 2025-09-03 21:50:57 +08:00
Vanessa
aa47a93501 Merge remote-tracking branch 'origin/dev' into dev 2025-09-03 21:36:30 +08:00
Vanessa
0b33edd213 🐛 https://github.com/siyuan-note/siyuan/issues/15741 2025-09-03 21:36:17 +08:00
Daniel
fe3ee14417
🎨 After dragging database entries across groups, groups in other views need to be updated https://github.com/siyuan-note/siyuan/issues/15755 2025-09-03 21:30:50 +08:00
Daniel
543ea20686
⬆️ Upgrade lute 2025-09-03 21:15:50 +08:00
Vanessa
f3358cc8b6 🐛 https://github.com/siyuan-note/siyuan/issues/15756 2025-09-03 21:12:56 +08:00
Vanessa
356356d888 🎨 https://github.com/siyuan-note/siyuan/issues/15226 2025-09-03 20:49:12 +08:00
Vanessa
78a7491173 Merge remote-tracking branch 'origin/dev' into dev 2025-09-03 18:28:26 +08:00
Vanessa
042768550d 🎨 https://github.com/siyuan-note/siyuan/issues/15699 2025-09-03 18:26:53 +08:00
Daniel
cfb976eb89
🐛 PDF files with too long file names cannot generate annotated images https://github.com/siyuan-note/siyuan/issues/15739 https://github.com/siyuan-note/siyuan/issues/10666 2025-09-03 17:37:27 +08:00
Jeffrey Chen
1e95b68df6
📝 Improve User Guide (#15753)
fix https://github.com/siyuan-note/siyuan/issues/14983
2025-09-03 16:40:29 +08:00
Daniel
f35a7f8892
🐛 PDF files with too long file names cannot generate annotated images https://github.com/siyuan-note/siyuan/issues/15739 https://github.com/siyuan-note/siyuan/issues/10666 2025-09-03 11:54:42 +08:00
Daniel
2f64492ee7
⬆️ Upgrade lute 2025-09-03 11:54:42 +08:00
Vanessa
125d18a0e1 🎨 https://github.com/siyuan-note/siyuan/issues/15699 1&3 2025-09-03 11:41:55 +08:00
Vanessa
2738b9adb0 🐛 https://github.com/siyuan-note/siyuan/issues/15742 2025-09-03 10:19:04 +08:00
Vanessa
d8bb794437 Merge remote-tracking branch 'origin/dev' into dev 2025-09-03 09:41:54 +08:00
Vanessa
91626c8fb5 🎨 https://github.com/siyuan-note/siyuan/issues/15639 2025-09-03 09:41:42 +08:00
Daniel
a5d268665d
🎨 Improve database date field filtering https://github.com/siyuan-note/siyuan/issues/15744 2025-09-03 08:56:30 +08:00
Daniel
a26c72d293
🎨 Database rollup field filtering rules support "Any", "All", and "None" https://github.com/siyuan-note/siyuan/issues/15609 2025-09-02 22:04:29 +08:00
Daniel
8cefe5ce47
♻️ Improve cache ds 2025-09-02 18:59:53 +08:00
Daniel
04c46b3a56
🎨 Improve database rollup field filtering https://github.com/siyuan-note/siyuan/issues/15740 2025-09-02 18:37:42 +08:00
Vanessa
7b2e48d54e 🎨 https://github.com/siyuan-note/siyuan/issues/15740 2025-09-02 18:36:38 +08:00
Vanessa
8d2e3bfd20 🎨 https://github.com/siyuan-note/siyuan/issues/15737 2025-09-02 17:16:56 +08:00
Vanessa
7f1f354d4e 🎨 https://github.com/siyuan-note/siyuan/issues/15728 2025-09-02 17:01:35 +08:00
Daniel
b699675b97
🔖 Release v3.3.1
Some checks failed
Release Docker Image / build (push) Has been cancelled
2025-09-02 09:31:45 +08:00
Daniel
74dd8c631c
🔖 Release v3.3.1 2025-09-02 09:24:41 +08:00
Daniel
deb7c5c4fe
🎨 Clean code 2025-09-02 09:24:31 +08:00
Vanessa
216308a511 Merge remote-tracking branch 'origin/dev' into dev 2025-09-01 22:43:45 +08:00
Vanessa
4b29bbcaf8 🎨 https://github.com/siyuan-note/siyuan/issues/15736 2025-09-01 22:43:31 +08:00
Daniel
56085829dd
📝 Update changelogs 2025-09-01 22:26:54 +08:00
Daniel
c202671085
📝 Move changelogs v3.2.x 2025-09-01 22:26:53 +08:00
Vanessa
ba2f7272ca Merge remote-tracking branch 'origin/dev' into dev 2025-09-01 22:19:37 +08:00
Vanessa
b371583899 🎨 https://github.com/siyuan-note/siyuan/pull/15610 2025-09-01 22:19:15 +08:00
Daniel
2de55d2e63
🎨 Improve database template field grouping https://github.com/siyuan-note/siyuan/issues/15687 2025-09-01 17:36:32 +08:00
Daniel
afdd605dd1
🎨 Improve database rollup template rendering https://github.com/siyuan-note/siyuan/issues/15722 2025-09-01 17:10:36 +08:00
Vanessa
aeb478a6b8 Merge remote-tracking branch 'origin/dev' into dev 2025-09-01 12:47:27 +08:00
Vanessa
5c60e8d567 🎨 反链面板移除元素后,文档分屏且为空会重复添加空块 2025-09-01 12:47:14 +08:00
Daniel
7952fec7cb
🎨 Improve database rollup template rendering https://github.com/siyuan-note/siyuan/issues/15722 2025-09-01 12:44:36 +08:00
Daniel
50956851c8
🎨 Improve av 2025-09-01 12:15:40 +08:00
Vanessa
e015f72945 https://github.com/siyuan-note/siyuan/issues/15734 2025-09-01 11:13:53 +08:00
Vanessa
22d34c755b Merge remote-tracking branch 'origin/dev' into dev 2025-09-01 11:12:01 +08:00
Vanessa
8a9a8e4548 🐛 https://github.com/siyuan-note/siyuan/issues/14269 2025-09-01 11:10:16 +08:00
Daniel
16d5055b09
🎨 Improve av 2025-09-01 10:36:42 +08:00
Daniel
1cac4ae55b
🎨 Block ref search and global search results display reference counts https://github.com/siyuan-note/siyuan/issues/15721 2025-08-31 13:07:50 +08:00
Vanessa
b8bcf76f75 🎨 https://github.com/siyuan-note/siyuan/pull/15693 2025-08-31 11:47:04 +08:00
Vanessa
be58df4d45 🚨 2025-08-31 11:44:12 +08:00
Vanessa
3404395cfa 🚨 2025-08-31 11:42:49 +08:00
Achuan-2
c8a3ec52d7
dynamic icon use current date as default (#15693)
*  dynamic icon use current date  as default

* 💄add dynamicIconDateEmptyInfo
2025-08-31 11:41:03 +08:00
Vanessa
698586bd4d 🎨 https://github.com/siyuan-note/siyuan/issues/14269 2025-08-31 11:38:30 +08:00
Daniel
c287dd080b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15708#issuecomment-3239639795 2025-08-31 10:44:56 +08:00
Daniel
4744429550
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15708#issuecomment-3239370576 2025-08-31 08:44:38 +08:00
Daniel
ef0e29a6fd
🎨 Improve av 2025-08-31 08:44:26 +08:00
Vanessa
cd65fa9d44 Merge remote-tracking branch 'origin/dev' into dev 2025-08-31 01:07:27 +08:00
Vanessa
d1f95b7df5 🎨 https://github.com/siyuan-note/siyuan/issues/14269 2025-08-31 01:07:13 +08:00
Daniel
74304e9cba
🎨 Block ref search and global search results display reference counts https://github.com/siyuan-note/siyuan/issues/15721 2025-08-30 21:09:16 +08:00
Daniel
ab66716178
🧑‍💻 Add internal kernel API /api/av/getAttributeViewBoundBlockIDs and getAttributeViewItemIDs https://github.com/siyuan-note/siyuan/issues/15708 2025-08-30 19:09:09 +08:00
Daniel
3c8c096d83
🐛 When searching for document tags, keyword highlighting will have extra pound signs https://github.com/siyuan-note/siyuan/issues/15690 2025-08-30 18:41:56 +08:00
Daniel
e4b2ffb188
🎨 Improve av 2025-08-30 17:38:09 +08:00
Daniel
7a2e5782d8
🐛 The update time of the database checkbox field keeps changing https://github.com/siyuan-note/siyuan/issues/15707 2025-08-30 17:26:23 +08:00
Daniel
b51f283e35
🐛 The update time of the database checkbox field keeps changing https://github.com/siyuan-note/siyuan/issues/15707 2025-08-30 17:26:23 +08:00
Jeffrey Chen
d60553983a
📝 Improve the confirmation popup text when deleting bidirectional relation fields in the database (#15720)
fix https://github.com/siyuan-note/siyuan/issues/15702
2025-08-30 09:36:03 +08:00
Daniel
ee34905f13
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15708 2025-08-29 22:21:24 +08:00
Daniel
0c295a9177
♻️ Upgrade to Electron v37.4.0 https://github.com/siyuan-note/siyuan/issues/15704 2025-08-29 22:17:58 +08:00
Daniel
6c1156afc8
🎨 Improve document tree custom sorting stability when creating a notebook or doc https://github.com/siyuan-note/siyuan/issues/15716 2025-08-29 16:20:53 +08:00
Daniel
c17a09d37e
🎨 Clean code 2025-08-29 16:00:39 +08:00
Daniel
a154ead980
🎨 Improve synchronization of database bound blocks when list blocks change https://github.com/siyuan-note/siyuan/issues/15697 2025-08-29 11:12:47 +08:00
Jeffrey Chen
15f116f344
💄 The height of the dividing line adjusts with font size (#15701) 2025-08-29 10:50:34 +08:00
Daniel
1c57d0b696
🐛 The folded state of the block under the folded heading is incorrect in some cases https://github.com/siyuan-note/siyuan/issues/15717 2025-08-29 10:47:29 +08:00
Vanessa
0a079a39ca 🎨 https://github.com/siyuan-note/siyuan/pull/15714 2025-08-29 10:45:36 +08:00
Jeffrey Chen
bf722a142a
🎨 The title of the plugin settings dialog displays the plugin name (#15714) 2025-08-29 10:43:24 +08:00
Vanessa
3ba4985126 Merge remote-tracking branch 'origin/dev' into dev 2025-08-28 17:47:16 +08:00
Vanessa
c4770d4f88 🎨 https://github.com/siyuan-note/siyuan/pull/15610 2025-08-28 17:47:01 +08:00
Daniel
4fd57efd68
🐛 When "Default fill created time" is enabled for database date fields, the automatically filled time value is incorrect https://github.com/siyuan-note/siyuan/issues/15684 2025-08-28 17:02:55 +08:00
Jeffrey Chen
f0f15673f0
Add plugin event bus code-languages-prepare and code-languages-change (#15610) 2025-08-28 16:37:54 +08:00
Yingyi / 颖逸
ff4d215f78
🎨 Add cookie-based auth in publish proxy (#15692)
* chore(publish-auth): Add TODO for cookie-based auth in publish proxy

A TODO comment was added to indicate future implementation of authentication using cookies in the PublishServiceTransport RoundTrip method.

* 🎨 Add session-based authentication for publish proxy

Introduces session management using cookies for the publish reverse proxy server. Adds session ID generation, storage, and validation in kernel/model/auth.go, and updates the proxy transport to check for valid sessions before falling back to basic authentication. Sets a session cookie upon successful basic auth login.

* 🐛 Fixed the issue of repeatedly setting cookies

* 🎨 Dynamically remove invalid session IDs

* ♻️ Revert changes in pnpm-lock.yaml
2025-08-28 16:20:12 +08:00
Daniel
2a4adf089f
🐛 The update time of the database checkbox field keeps changing https://github.com/siyuan-note/siyuan/issues/15707 2025-08-28 16:18:35 +08:00
Daniel
810ea23bfd
📝 New template functions ISOYear, ISOMonth and ISOWeekDate https://github.com/siyuan-note/siyuan/issues/15679 2025-08-28 15:54:31 +08:00
Daniel
0f087bf1e4
🐛 Database relative date filtering is incorrect https://github.com/siyuan-note/siyuan/issues/15710 2025-08-28 15:35:09 +08:00
Daniel
c2ef8de766
⬆️ Upgrade lute 2025-08-28 11:10:38 +08:00
Daniel
ca7e4ef503
🎨 New template functions ISOYear, ISOMonth and ISOWeekDate https://github.com/siyuan-note/siyuan/issues/15679 2025-08-28 09:21:18 +08:00
Achuan-2
029a6bd78d
🎨 Improve template syntax highlight (#15694)
* Improve Template Syntax highlight

- 去除缩进识别为代码块高亮规则
- 内置函数新增ISOYear和ISOMonth

* Add ISOWeekDate to built-in functions regex
2025-08-28 00:36:22 +08:00
Daniel
85a894a74d
⬆️ Upgrade lute 2025-08-27 22:07:36 +08:00
Daniel
138d6f57ee
🐛 Database rollup template calculations are incorrect https://github.com/siyuan-note/siyuan/issues/15695 2025-08-27 20:15:48 +08:00
Vanessa
23ed5c8627 Merge remote-tracking branch 'origin/dev' into dev 2025-08-27 16:59:49 +08:00
Daniel
6e985a5013
🎨 New template functions ISOYear, ISOMonth and ISOWeekDate https://github.com/siyuan-note/siyuan/issues/15679 2025-08-27 16:51:25 +08:00
Vanessa
42633061fc 🎨 https://github.com/siyuan-note/siyuan/issues/15682 2025-08-27 12:03:32 +08:00
Daniel
174a7befbe
🎨 Support opening assets through other apps on HarmonyOS NEXT https://github.com/siyuan-note/siyuan/issues/15691 2025-08-27 11:25:20 +08:00
Daniel
1bc68efd3a
🎨 New template functions ISOYear and ISOMonth https://github.com/siyuan-note/siyuan/issues/15679 2025-08-27 10:17:50 +08:00
Daniel
dcefed26eb
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 22:41:27 +08:00
Daniel
d684bb41b1
🎨 New template functions ISOYear and ISOMonth https://github.com/siyuan-note/siyuan/issues/15679 2025-08-26 21:16:34 +08:00
Daniel
d445163b2f
🎨 Clean code 2025-08-26 21:16:15 +08:00
Achuan-2
b5d47b9600
♻️ Refactor week number calculation to include ISO year (#15680) 2025-08-26 21:04:29 +08:00
Vanessa
2570a971a2 🚨
Some checks failed
Release Docker Image / build (push) Has been cancelled
2025-08-26 11:07:19 +08:00
Daniel
a4f025a2c2
🔖 Release v3.3.0 2025-08-26 11:05:10 +08:00
Vanessa
4d07212fee 🚨 2025-08-26 11:04:40 +08:00
Vanessa
877e2c4334 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 11:03:21 +08:00
Vanessa
1017610ec8 Merge remote-tracking branch 'origin/dev' into dev 2025-08-26 10:47:21 +08:00
Vanessa
92447342b6 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 10:47:08 +08:00
Daniel
7b995fd16c
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 10:46:41 +08:00
Daniel
b332574217
🎨 Improve av 2025-08-26 10:38:26 +08:00
Daniel
3182f7abb8
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 10:01:22 +08:00
Vanessa
ca9427cc82 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 00:51:02 +08:00
Vanessa
e775d0b5f8 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 00:36:07 +08:00
Vanessa
2535a64ff1 Merge remote-tracking branch 'origin/dev' into dev 2025-08-25 22:50:40 +08:00
Vanessa
b2ad366da3 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-25 22:50:19 +08:00
Daniel
bc08148dab
📝 Update changelogs 2025-08-25 17:59:16 +08:00
Vanessa
79a7f4e8e9 🐛 数据库分页 2025-08-25 17:35:36 +08:00
Vanessa
838f3977db Merge remote-tracking branch 'origin/dev' into dev 2025-08-25 17:21:32 +08:00
Vanessa
210e44ec12 🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 17:21:19 +08:00
Daniel
0a729d7c1b
🧑‍💻 Improve kernel API /api/filetree/moveDocsByID https://github.com/siyuan-note/siyuan/issues/15616 2025-08-25 16:33:38 +08:00
Daniel
29ac895046
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 16:24:16 +08:00
Daniel
55541f62b0
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 16:17:52 +08:00
Daniel
8ccb1e4143
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 16:13:43 +08:00
Daniel
662aaa6458
🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 16:12:23 +08:00
Daniel
86018c5f49
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 11:51:28 +08:00
Daniel
e4f0e02177
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 11:39:22 +08:00
Daniel
34360fb9e3
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 11:23:42 +08:00
Daniel
8895613f8b
🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 10:58:45 +08:00
Daniel
d0f350d215
🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 10:43:50 +08:00
Daniel
7e6752a8fb
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:28 +08:00
Daniel
1f3c3a53b4
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:27 +08:00
Daniel
f92074f386
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:26 +08:00
Daniel
58585356d6
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:25 +08:00
Vanessa
568cdb2f1b 🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 10:39:11 +08:00
Vanessa
7c23daab06 💄 https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 23:12:19 +08:00
Vanessa
e2d9010fca Revert "🎨 https://github.com/siyuan-note/siyuan/issues/15451"
This reverts commit 72c98874
2025-08-24 22:54:54 +08:00
Vanessa
39f965dca0 🎨 https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 15:46:45 +08:00
Vanessa
b3ea067792 Merge remote-tracking branch 'origin/dev' into dev 2025-08-24 15:44:39 +08:00
Vanessa
72c9887439 🎨 https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 15:44:25 +08:00
Daniel
a26dc51b21
🎨 Improve av 2025-08-24 15:27:04 +08:00
Daniel
202ccfa5cf
🎨 Limit the database title to 512 characters https://github.com/siyuan-note/siyuan/issues/15459 2025-08-24 15:16:10 +08:00
Daniel
014ecca54c
🎨 Alert users when .sy file or database .json exceed 8MB https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 11:39:31 +08:00
Daniel
af3220f241
🎨 Limit the database title to 512 characters https://github.com/siyuan-note/siyuan/issues/15459 2025-08-24 11:30:04 +08:00
Vanessa
4a5237dbd0 🎨 https://github.com/siyuan-note/siyuan/issues/15670 2025-08-24 11:28:15 +08:00
Vanessa
9457d55d14 Merge remote-tracking branch 'origin/dev' into dev 2025-08-24 11:18:11 +08:00
Vanessa
8889235bea 🎨 https://github.com/siyuan-note/siyuan/issues/15670 2025-08-24 11:17:57 +08:00
Daniel
eb13c34fe5
🎨 Alert users when .sy file or database .json exceed 8MB https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 10:50:03 +08:00
Vanessa
f3cc641005 🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-24 10:46:16 +08:00
Daniel
be5bf8978d
🎨 Improve av 2025-08-24 10:27:47 +08:00
Vanessa
7300a4849c 🎨 https://github.com/siyuan-note/siyuan/issues/15664 2025-08-24 10:14:58 +08:00
Vanessa
7206fc107d 🎨 https://github.com/siyuan-note/siyuan/issues/15664 2025-08-23 23:05:56 +08:00
Vanessa
b715625d89 Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 22:28:04 +08:00
Vanessa
28067deffa 🎨 https://github.com/siyuan-note/siyuan/issues/15595 2025-08-23 22:27:42 +08:00
Daniel
ef5236e0b1
🎨 Improve av 2025-08-23 22:16:05 +08:00
Vanessa
161dd7eb2a Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 22:09:41 +08:00
Vanessa
04fc8cfa97 🎨 https://github.com/siyuan-note/siyuan/issues/15668 2025-08-23 22:09:21 +08:00
Daniel
e98bb0a2d4
🎨 https://github.com/siyuan-note/siyuan/issues/15666 2025-08-23 21:54:27 +08:00
Daniel
1503363a7c
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 21:49:57 +08:00
Daniel
17924377ec
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 21:43:05 +08:00
Vanessa
eb578a3d9d Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 21:03:19 +08:00
Vanessa
3fafe0a1b6 🎨 https://github.com/siyuan-note/siyuan/issues/15667 2025-08-23 21:03:02 +08:00
Daniel
a5ca8efcae
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15665 2025-08-23 20:09:16 +08:00
Daniel
77c1aa49b3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15665 2025-08-23 19:57:40 +08:00
Daniel
e7eb62e660
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15665 2025-08-23 19:53:38 +08:00
Daniel
fb9f0f9a35
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 19:42:39 +08:00
Daniel
91a9b27789
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15528 2025-08-23 18:48:54 +08:00
Daniel
9eec8510b7
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15528 2025-08-23 18:44:26 +08:00
Vanessa
6b8bd6e8f2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 18:36:12 +08:00
Vanessa
7d9c120a86 🎨 https://github.com/siyuan-note/siyuan/issues/15603 2025-08-23 18:35:58 +08:00
Daniel
920291d52b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 18:31:54 +08:00
Vanessa
39e2b7adf6 Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 18:18:27 +08:00
Vanessa
e91b8e97f7 🎨 https://github.com/siyuan-note/siyuan/issues/15528 2025-08-23 18:18:14 +08:00
Daniel
d3e86ffcaa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 18:08:07 +08:00
Daniel
ef643e60d7
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 17:58:52 +08:00
Daniel
1b3e1b4efe
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 17:45:26 +08:00
Daniel
0a680d7d81
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 17:34:39 +08:00
Daniel
8c9efebbe3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 17:34:20 +08:00
Daniel
73dce6c5c4
🧑‍💻 /api/block/getBlockKramdown link/image URLs are no longer encoded with spaces https://github.com/siyuan-note/siyuan/issues/15611 2025-08-23 17:17:11 +08:00
Daniel
fefb674fc0
🧑‍💻 /api/block/getBlockKramdown link/image URLs are no longer encoded with spaces https://github.com/siyuan-note/siyuan/issues/15611 2025-08-23 17:16:47 +08:00
Daniel
94f8fc5b71
🎨 Improve av 2025-08-23 16:52:10 +08:00
Vanessa
52fe742a8c Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 12:17:57 +08:00
Vanessa
a475a77a3b 🎨 https://github.com/siyuan-note/siyuan/issues/15180 2025-08-23 12:17:43 +08:00
Daniel
005ae241e9
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-23 11:55:56 +08:00
Daniel
8aa8ad65f8
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-23 11:24:53 +08:00
Daniel
c521a0f985
🎨 Improve parsing <img> tags when importing https://github.com/siyuan-note/siyuan/issues/15638 2025-08-23 11:24:53 +08:00
Jeffrey Chen
cd7734ba91
🎨 Improve protyle slash (#15648)
fix https://github.com/siyuan-note/siyuan/issues/15647
2025-08-23 11:23:34 +08:00
Vanessa
1e5f514225 🎨 https://github.com/siyuan-note/siyuan/issues/15662 2025-08-23 11:19:11 +08:00
Vanessa
9d4ed40acd Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 10:25:43 +08:00
Vanessa
ab32bb9027 🎨 属性面板数据库关联设置 2025-08-23 10:25:31 +08:00
Jeffrey Chen
9993c2db4c
📝 Improve text (#15613) 2025-08-23 09:57:54 +08:00
Daniel
aa9e6fdf4c
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-23 09:53:16 +08:00
Daniel
c2075e6387
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-22 21:45:15 +08:00
Daniel
9bb6f4d134
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-22 21:30:59 +08:00
Daniel
ee95f9bf6f
🎨 https://github.com/siyuan-note/siyuan/issues/15662 2025-08-22 21:00:43 +08:00
Daniel
eea13b713d
🎨 https://github.com/siyuan-note/siyuan/issues/15661 2025-08-22 20:35:33 +08:00
Vanessa
4beccf5b93 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 19:32:50 +08:00
Vanessa
ddec6c0820 🎨 https://github.com/siyuan-note/siyuan/issues/15528 2025-08-22 19:32:33 +08:00
Daniel
73300c8408
🎨 https://github.com/siyuan-note/siyuan/issues/15660 2025-08-22 19:25:12 +08:00
Daniel
b14f057a76
🎨 https://github.com/siyuan-note/siyuan/issues/15659 2025-08-22 19:10:52 +08:00
Vanessa
8a6922b56f 🎨 https://github.com/siyuan-note/siyuan/issues/15614 2025-08-22 19:05:17 +08:00
Vanessa
c92240a085 🎨 https://github.com/siyuan-note/siyuan/issues/15658 2025-08-22 18:11:12 +08:00
Vanessa
691ef04f62 🎨 https://github.com/siyuan-note/siyuan/issues/15656 2025-08-22 17:55:17 +08:00
Daniel
53c41561c8
🎨 https://github.com/siyuan-note/siyuan/issues/15656 2025-08-22 17:31:18 +08:00
Vanessa
6007cf00b0 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 17:30:08 +08:00
Vanessa
00d80270a1 🎨 https://github.com/siyuan-note/siyuan/issues/15657 2025-08-22 17:29:52 +08:00
Daniel
ace97cbcf0
🎨 https://github.com/siyuan-note/siyuan/issues/15654 2025-08-22 16:53:33 +08:00
Vanessa
0db4daf183 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 16:37:24 +08:00
Vanessa
e08004c59e 🎨 https://github.com/siyuan-note/siyuan/issues/15649 2025-08-22 16:37:11 +08:00
Daniel
61d0e5a3d6
🐛 Incorrect results for database rollup field filtering https://github.com/siyuan-note/siyuan/issues/15608 2025-08-22 16:13:51 +08:00
Daniel
312be8a019
🐛 Incorrect results for database rollup field filtering https://github.com/siyuan-note/siyuan/issues/15608 2025-08-22 16:00:43 +08:00
Vanessa
fa7ec5ab95 🎨 https://github.com/siyuan-note/siyuan/issues/15649 2025-08-22 12:16:41 +08:00
Vanessa
365c1dfb19 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 12:00:42 +08:00
Vanessa
1d7a3abf28 🎨 https://github.com/siyuan-note/siyuan/issues/15652 2025-08-22 12:00:28 +08:00
Daniel
2058061bc3
⬆️ Upgrade lute 2025-08-22 12:00:11 +08:00
Vanessa
f4d11c59a2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 11:43:47 +08:00
Vanessa
a857aaa11e 🎨 https://github.com/siyuan-note/siyuan/issues/15424 2025-08-22 11:43:31 +08:00
Daniel
bd7e547ac0
♻️ Upgrade to Electron v37.3.1 https://github.com/siyuan-note/siyuan/issues/15410 2025-08-22 11:29:30 +08:00
Daniel
cd2b131dc9
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15653 2025-08-22 11:17:57 +08:00
Daniel
76266cac87
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15590 2025-08-22 11:06:54 +08:00
Daniel
980cf25745
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15590 2025-08-22 11:05:12 +08:00
Vanessa
85800b8085 🎨 https://github.com/siyuan-note/siyuan/issues/15424 2025-08-22 10:59:00 +08:00
Vanessa
be7ac73904 🎨 https://github.com/siyuan-note/siyuan/issues/15424 2025-08-22 10:57:53 +08:00
Daniel
1ce39eb85c
⬆️ Upgrade lute 2025-08-22 10:48:35 +08:00
Vanessa
1fa16ccb86 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 10:46:28 +08:00
Vanessa
bc27681e38 🎨 https://github.com/siyuan-note/siyuan/issues/15180 2025-08-22 10:46:14 +08:00
Daniel
5077ed3b56
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:48:15 +08:00
Daniel
4f073c85cd
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:34:41 +08:00
Daniel
c2ac34942b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:28:37 +08:00
Daniel
e3df9ab316
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15649 2025-08-22 00:16:28 +08:00
Daniel
b6b5b20daa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:07:54 +08:00
Daniel
83af400f65
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15643 2025-08-22 00:00:38 +08:00
Daniel
f8bccc2d9f
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 23:31:10 +08:00
Daniel
f74283f2a3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 23:31:09 +08:00
Daniel
9d7e0625ae
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 23:31:09 +08:00
Vanessa
0e8d07ac4d Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 23:12:44 +08:00
Vanessa
45c53b7da6 🎨 https://github.com/siyuan-note/siyuan/issues/15629 2025-08-21 23:12:26 +08:00
Daniel
4598e3237b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 22:25:41 +08:00
Daniel
35de72f64d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15575 2025-08-21 22:02:19 +08:00
Daniel
4210dad5b0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15603 2025-08-21 21:56:11 +08:00
Daniel
e451c1f60a
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15603 2025-08-21 21:50:34 +08:00
Daniel
65fd1fafc9
⬆️ Upgrade lute 2025-08-21 21:50:34 +08:00
Vanessa
540fe7cfde 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-21 21:29:26 +08:00
Vanessa
19c5a9952e 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-21 21:25:16 +08:00
Vanessa
38e7992e1a 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-21 21:12:16 +08:00
Vanessa
2c811c06d3 🎨 https://github.com/siyuan-note/siyuan/issues/15180 2025-08-21 20:40:50 +08:00
Vanessa
aee4c64006 🎨 https://github.com/siyuan-note/siyuan/issues/15453 2025-08-21 20:33:56 +08:00
Vanessa
e35b203201 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 20:28:35 +08:00
Vanessa
128b9d1f13 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 20:27:51 +08:00
Vanessa
3bd7c92710 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 20:25:10 +08:00
Vanessa
7a6cd95656 Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 18:05:50 +08:00
Vanessa
b6df6b2cee 🎨 https://github.com/siyuan-note/siyuan/issues/15642 2025-08-21 18:05:38 +08:00
Daniel
4a0c4506e8
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15645 2025-08-21 18:02:07 +08:00
Daniel
bbc788cfa5
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15644 2025-08-21 17:55:18 +08:00
Daniel
2899e3851d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15644 2025-08-21 15:27:10 +08:00
Daniel
e1fca0674d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15590 2025-08-21 14:44:34 +08:00
Daniel
8c3837deaa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15588 2025-08-21 14:10:40 +08:00
Vanessa
bf3023ec48 Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 14:10:02 +08:00
Vanessa
d1dc88c422 🎨 https://github.com/siyuan-note/siyuan/issues/15594 2025-08-21 14:09:37 +08:00
Daniel
a7ab91d509
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15586 2025-08-21 13:52:08 +08:00
Daniel
d4cc17c1c0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15589 2025-08-21 13:49:31 +08:00
Daniel
089080c818
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15587 2025-08-21 13:42:32 +08:00
Daniel
f97dab787b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15432 https://github.com/siyuan-note/siyuan/issues/15587 2025-08-21 13:42:21 +08:00
Daniel
9ee427d567
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15591 2025-08-21 13:31:22 +08:00
Daniel
30bde33dd2
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15591 2025-08-21 13:31:21 +08:00
Daniel
93580cc27f
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15592 2025-08-21 13:31:21 +08:00
Vanessa
e746093a0f Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 13:19:35 +08:00
Vanessa
8b21b8fd03 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 13:19:13 +08:00
Daniel
c7c7bdb950
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-21 12:01:12 +08:00
Daniel
6270d55fa3
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-08-21 11:25:15 +08:00
Daniel
ed4cc1faf6
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15600 2025-08-21 11:19:53 +08:00
Daniel
7d91781e8c
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-08-21 11:10:26 +08:00
Daniel
599cf0cf46
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15565 2025-08-21 10:55:51 +08:00
Vanessa
6803c6483e Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 10:50:56 +08:00
Vanessa
557f4866d5 🎨 https://github.com/siyuan-note/siyuan/issues/15565 2025-08-21 10:50:42 +08:00
Daniel
916c00e714
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-21 09:55:11 +08:00
Daniel
8934856d75
🎨 Parse <img> tags when pasting https://github.com/siyuan-note/siyuan/issues/15464 2025-08-20 19:36:08 +08:00
Daniel
752457b888
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-20 19:34:19 +08:00
Daniel
aabb85d895
🎨 Parse <img> tags when pasting https://github.com/siyuan-note/siyuan/issues/15464 2025-08-20 19:02:55 +08:00
Daniel
6e6522d56a
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-20 18:18:32 +08:00
Daniel
f0f5b6a824
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-08-20 17:44:03 +08:00
Vanessa
1c3ebf7f75 🎨 https://github.com/siyuan-note/siyuan/issues/15453 2025-08-20 16:58:10 +08:00
Vanessa
516d9aa52a 🎨 https://github.com/siyuan-note/siyuan/issues/15415 2025-08-20 12:09:37 +08:00
Vanessa
e7c90f4709 🎨 https://github.com/siyuan-note/siyuan/issues/15415 2025-08-20 12:08:47 +08:00
Vanessa
ca59b5f64c 🎨 https://github.com/siyuan-note/siyuan/issues/15574 2025-08-20 10:54:26 +08:00
Vanessa
6e590f2733 🎨 https://github.com/siyuan-note/siyuan/issues/15565 2025-08-19 21:11:50 +08:00
Vanessa
462469c490 🎨 https://github.com/siyuan-note/siyuan/issues/15573 2025-08-19 11:28:00 +08:00
Vanessa
dc90d05086 🎨 https://github.com/siyuan-note/siyuan/issues/15576 2025-08-19 11:20:30 +08:00
Vanessa
6564f0e138 Merge remote-tracking branch 'origin/dev' into dev 2025-08-15 11:28:15 +08:00
Vanessa
4cd439b771 🎨 https://github.com/siyuan-note/siyuan/issues/15578 2025-08-15 11:28:02 +08:00
Daniel
05f48e93d1
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15581 2025-08-15 11:22:45 +08:00
Vanessa
4ec53db203 🎨 https://github.com/siyuan-note/siyuan/issues/15580 2025-08-15 11:17:41 +08:00
Vanessa
ae9f936f81 Merge remote-tracking branch 'origin/dev' into dev 2025-08-15 11:09:06 +08:00
Vanessa
5a6b764ed4 🎨 https://github.com/siyuan-note/siyuan/issues/15566 2025-08-15 11:08:53 +08:00
Daniel
6a814abeb9
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15579 2025-08-15 11:03:51 +08:00
Vanessa
eb7066ff3e 🎨 https://github.com/siyuan-note/siyuan/issues/15570 2025-08-14 17:10:08 +08:00
Vanessa
3dcda6b2e2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 16:16:21 +08:00
Vanessa
91b12ef67f 🎨 https://github.com/siyuan-note/siyuan/issues/15561 2025-08-14 16:16:07 +08:00
Daniel
ae54b3edc0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15572 2025-08-14 15:50:18 +08:00
Daniel
69737d6c4b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15561#issuecomment-3184746195 2025-08-14 12:42:56 +08:00
Vanessa
2b3405fcca 🎨 https://github.com/siyuan-note/siyuan/issues/15561 2025-08-14 12:13:21 +08:00
Vanessa
1a6b80b5af 🎨 https://github.com/siyuan-note/siyuan/issues/12384 2025-08-14 12:03:48 +08:00
Vanessa
2ddff2a5d3 🎨 https://github.com/siyuan-note/siyuan/issues/12384 2025-08-14 11:57:24 +08:00
Vanessa
1c6538bf97 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-14 11:41:56 +08:00
Vanessa
f084f3d34f Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 11:22:01 +08:00
Vanessa
1b9b7e1c83 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-14 11:21:48 +08:00
Daniel
699afec920
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-14 11:19:47 +08:00
Vanessa
dd3f5cfacf Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 10:08:43 +08:00
Vanessa
f5468fead9 🎨 https://github.com/siyuan-note/siyuan/issues/15557 2025-08-14 10:08:30 +08:00
Daniel
57ac3a6687
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15567 2025-08-14 10:07:39 +08:00
Daniel
30b5473c76
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15567 2025-08-14 10:02:33 +08:00
Daniel
91207ba529
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15571 2025-08-14 09:54:20 +08:00
Daniel
04351d74bc
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-14 00:57:42 +08:00
Vanessa
b78616382b 🎨 https://github.com/siyuan-note/siyuan/issues/15562 2025-08-14 00:50:18 +08:00
Vanessa
c9a68c7b1d Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 00:22:43 +08:00
Vanessa
5e74bb89b9 🎨 https://github.com/siyuan-note/siyuan/issues/15562 2025-08-14 00:22:27 +08:00
Daniel
176308d7d2
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15521 2025-08-14 00:00:57 +08:00
Daniel
b78e2edfb8
🎨 Improve av 2025-08-13 23:35:16 +08:00
Daniel
cd10072554
🎨 Improve av 2025-08-13 19:15:10 +08:00
Vanessa
1712d4be68 🎨 https://github.com/siyuan-note/siyuan/issues/15558 2025-08-13 19:07:12 +08:00
Vanessa
c2d127d8f7 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 19:02:44 +08:00
Vanessa
8739ae5625 🎨 https://github.com/siyuan-note/siyuan/issues/15562 2025-08-13 19:02:32 +08:00
Daniel
c3a9b0f77b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 18:20:45 +08:00
Vanessa
085c72add5 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 18:17:30 +08:00
Vanessa
780a7decd8 🎨 https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 18:17:17 +08:00
Daniel
5efe525e3c
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15561 2025-08-13 18:15:02 +08:00
Vanessa
3e033079bd Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 18:04:04 +08:00
Vanessa
8436c07a1a 🎨 https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 18:03:48 +08:00
Daniel
3d1d0c6def
🐛 https://github.com/siyuan-note/siyuan/issues/15550 2025-08-13 17:32:03 +08:00
Daniel
e0f1f789c3
🐛 https://github.com/siyuan-note/siyuan/issues/13261 2025-08-13 17:23:27 +08:00
Daniel
7595477257
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 17:02:00 +08:00
Daniel
6a9eb455fc
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 17:01:59 +08:00
Vanessa
d1b2309e4a Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 16:54:46 +08:00
Vanessa
5abc9c31b0 🎨 https://github.com/siyuan-note/siyuan/issues/15557 2025-08-13 16:54:32 +08:00
Daniel
469d9e24db
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 16:49:53 +08:00
Daniel
bce519ae99
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 16:38:19 +08:00
Vanessa
c64214e754 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 16:32:41 +08:00
Vanessa
8a2aafcad4 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 16:32:23 +08:00
Daniel
e4cb124ffd
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560#issuecomment-3182691193 2025-08-13 16:29:31 +08:00
Daniel
e51e6d5662
🎨 Improve av 2025-08-13 13:42:45 +08:00
Daniel
6a0c0f8e1e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15559 2025-08-13 13:42:45 +08:00
Vanessa
d7c58357ea Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 12:09:01 +08:00
Vanessa
de670dfa8a 🎨 数据库分组划选 2025-08-13 12:08:46 +08:00
Daniel
6c3138b8bd
🎨 Improve av 2025-08-13 12:04:33 +08:00
Daniel
8d1693bd9b
🎨 Improve av 2025-08-13 11:48:44 +08:00
Daniel
db59bdf562
🎨 Improve av 2025-08-13 11:43:01 +08:00
Vanessa
34f1f6a3d4 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 11:33:36 +08:00
Vanessa
17b5e9acdc 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 11:33:22 +08:00
Daniel
418959d44a
🎨 Improve av 2025-08-13 11:21:29 +08:00
Daniel
68af39ba48
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15529 2025-08-13 11:18:26 +08:00
Daniel
dc39e18fc1
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15555 2025-08-13 11:02:25 +08:00
Vanessa
e6a88e2ad2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 10:46:48 +08:00
Vanessa
18377d0e9f 🎨 https://github.com/siyuan-note/siyuan/issues/15554 2025-08-13 10:46:35 +08:00
Daniel
52cd7d0bfa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 01:02:38 +08:00
Daniel
94d37ae47e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 00:55:48 +08:00
Daniel
1b9013ed0e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 00:38:00 +08:00
Daniel
be05b324d1
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 00:33:14 +08:00
Daniel
0f48f94704
🎨 Improve av http://github.com/siyuan-note/siyuan/issues/15544 2025-08-13 00:11:38 +08:00
Vanessa
83e6f5d664 🎨 https://github.com/siyuan-note/siyuan/issues/15533 2025-08-12 23:37:32 +08:00
Vanessa
34b44dc558 Merge remote-tracking branch 'origin/dev' into dev 2025-08-12 23:26:42 +08:00
Vanessa
97f74ea172 🎨 https://github.com/siyuan-note/siyuan/issues/15546 2025-08-12 23:26:19 +08:00
Daniel
7f004877ca
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15550 2025-08-12 22:28:52 +08:00
Daniel
8ba02f517c
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15549 2025-08-12 21:32:27 +08:00
Daniel
ff077158dc
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15549 2025-08-12 21:22:10 +08:00
Vanessa
bcbd895303 Merge remote-tracking branch 'origin/dev' into dev 2025-08-12 18:20:48 +08:00
Vanessa
98a9635dd3 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-12 18:20:33 +08:00
Jiangshuon
b1c0365e56
🎨 Imporve database image browsing (#15548) 2025-08-12 18:06:05 +08:00
Daniel
5becccc176
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15543 https://github.com/siyuan-note/siyuan/issues/15540 2025-08-12 17:55:49 +08:00
Daniel
7e11be9d25
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 https://github.com/siyuan-note/siyuan/issues/15535 2025-08-12 11:59:24 +08:00
Daniel
c9530ea1c2
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 https://github.com/siyuan-note/siyuan/issues/15535 2025-08-12 11:50:43 +08:00
Daniel
1136c1c493
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-12 11:37:53 +08:00
Daniel
120b0c1e57
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-12 11:37:53 +08:00
Vanessa
e103b5c2f0 🎨 https://github.com/siyuan-note/siyuan/issues/15453 2025-08-12 11:28:22 +08:00
Vanessa
1edd35029e 🎨 https://github.com/siyuan-note/siyuan/issues/15483 2025-08-12 10:43:32 +08:00
Vanessa
ec15f672c3 🎨 https://github.com/siyuan-note/siyuan/issues/15516 2025-08-12 10:27:37 +08:00
Vanessa
a30f229ade 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-12 01:23:47 +08:00
Vanessa
729fe0674f Merge remote-tracking branch 'origin/dev' into dev 2025-08-12 00:59:54 +08:00
Vanessa
9a9e3aaba3 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-12 00:59:39 +08:00
Daniel
8ddac77915
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15520 2025-08-12 00:37:48 +08:00
Daniel
7b3ac79d78
🎨 Improve av 2025-08-12 00:37:48 +08:00
Vanessa
62dbc08b9a 🚨 2025-08-11 23:46:39 +08:00
Vanessa
52e748ef17 Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 23:45:57 +08:00
Vanessa
135dd9889c 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-11 23:45:35 +08:00
Daniel
44831e464c
🎨 Improve av 2025-08-11 23:39:23 +08:00
Vanessa
e290d2a3fc 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-11 23:17:13 +08:00
Vanessa
fec603487b Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 23:13:04 +08:00
Vanessa
2d774f1cef 🎨 https://github.com/siyuan-note/siyuan/issues/15525 2025-08-11 23:12:45 +08:00
Daniel
c3cd7b96a0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15533 2025-08-11 22:50:53 +08:00
Vanessa
aeef9aef1d 💄 移除菜单 2025-08-11 22:44:08 +08:00
Vanessa
7d5ef46fd4 Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 22:33:37 +08:00
Vanessa
23c6843803 🎨 https://github.com/siyuan-note/siyuan/issues/15526 2025-08-11 22:33:18 +08:00
Daniel
c7745e3092
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15536 2025-08-11 22:26:39 +08:00
Vanessa
f15aca19d7 🎨 https://github.com/siyuan-note/siyuan/issues/15538 2025-08-11 22:14:47 +08:00
Vanessa
9e46eec911 Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 22:10:14 +08:00
Vanessa
9fb2f55979 🎨 https://github.com/siyuan-note/siyuan/issues/15530 2025-08-11 22:09:59 +08:00
Daniel
bbe2001366
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15540 2025-08-11 21:58:33 +08:00
Daniel
e9afbb6931
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15531 2025-08-11 21:48:19 +08:00
Daniel
93fdc69bec
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15527 2025-08-11 21:25:53 +08:00
Daniel
c3c467e3ee
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15534 2025-08-11 21:18:20 +08:00
Daniel
1479cb6c00
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15532 2025-08-11 20:51:57 +08:00
Daniel
e871f4913f
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15523 2025-08-11 09:44:38 +08:00
Daniel
31667b0964
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15524 2025-08-11 01:18:13 +08:00
Daniel
7b8d163723
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15524 2025-08-11 01:10:00 +08:00
Daniel
c640bfd91b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15524 2025-08-11 00:54:50 +08:00
Daniel
7ac0491a70
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-11 00:37:41 +08:00
Daniel
ffafbae979
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15522 2025-08-11 00:36:22 +08:00
Daniel
d47417a903
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-11 00:21:47 +08:00
Daniel
ac948ad3fb
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-10 23:50:23 +08:00
200 changed files with 8787 additions and 3196 deletions

View file

@ -7,17 +7,17 @@
## NPM dependencies
Install pnpm: `npm install -g pnpm@10.14.0`
Install pnpm: `npm install -g pnpm@10.15.1`
<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.6 -D`
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.4.0 -D`
* Windows:
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
* `pnpm install electron@37.2.6 -D`
* `pnpm install electron@37.4.0 -D`
NPM mirror:
@ -27,7 +27,7 @@ NPM mirror:
Enter the app folder and execute:
* `pnpm install electron@37.2.6 -D`
* `pnpm install electron@37.4.0 -D`
* `pnpm run dev`
* `pnpm run start`

View file

@ -7,17 +7,17 @@
## NPM 依赖
安装 pnpm`npm install -g pnpm@10.14.0`
安装 pnpm`npm install -g pnpm@10.15.1`
<details>
<summary>适用于中国大陆</summary>
设置 Electron 镜像环境变量并安装 Electron
* macOS/Linux`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.2.6 -D`
* macOS/Linux`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.4.0 -D`
* Windows
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
* `pnpm install electron@37.2.6 -D`
* `pnpm install electron@37.4.0 -D`
NPM 镜像:
@ -27,7 +27,7 @@ NPM 镜像:
进入 app 文件夹执行:
* `pnpm install electron@37.2.6 -D`
* `pnpm install electron@37.4.0 -D`
* `pnpm run dev`
* `pnpm run start`

2
API.md
View file

@ -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

View file

@ -478,7 +478,7 @@
```
* `fromIDs`:源文档 ID
* `toID`:目标父文档 ID
* `toID`:目标父文档 ID 或笔记本 ID
* 返回值
```json

View file

@ -1,4 +1,9 @@
{
"vacuumDataIndex": "تحسين الفهرس",
"vacuumDataIndexTip": "تحقق من فهرس البيانات، وحرر مساحة التخزين وحسّن أداء الفهرس",
"rebuildDataIndex": "إعادة بناء الفهرس",
"rebuildDataIndexTip": "إعادة بناء كاملة لفهرس البيانات، قد يستغرق ذلك بعض الوقت، يرجى الانتظار",
"displayFieldName": "عرض اسم الحقل",
"sortBySelectOption": "Nach Option sortieren",
"groupStep": "فاصل التجميع",
"groupRange": "نطاق التجميع",
@ -28,7 +33,7 @@
"small": "صغير",
"fitImage": "تعديل حجم الصورة تلقائيًا",
"showIcon": "عرض الأيقونة",
"showAllFieldsIcon": "عرض أيقونات الحقول",
"showAllEntriesIcons": "عرض أيقونات المدخلات",
"wrapAllFields": "التفاف الحقول تلقائيًا",
"gallery": "بطاقة",
"newTag": "علامة جديدة",
@ -36,7 +41,7 @@
"reconnectPrompt": "بعد تبديل التطبيقات، سيستغرق الأمر بعض الوقت لاستعادة تشغيل نواة SiYuan. يرجى الانتظار بضع ثوانٍ أو النقر فوق الزر \"إعادة المحاولة\"",
"relativeFontSize": "نسبة إلى حجم خط المحرر",
"localFileSystem": "نظام الملفات المحلي",
"deviceNotSupport": "الجهاز الحالي غير مدعوم",
"mobileNotSupport": "هذه الميزة غير مدعومة حاليًا على الأجهزة المحمولة (الهاتف أو الجهاز اللوحي)",
"second": "ثانية",
"syncInterval": "الفاصل الزمني للمزامنة",
"syncIntervalTip": "مزامنة البيانات تلقائياً بعد أن توقف عن التغيير",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "عدد أيام حفظ لقطة البيانات",
"dataRepoAutoPurgeRetentionIndexesDaily": "عدد لقطات البيانات في اليوم",
"fields": "حقول",
"dynamicEmoji": "أيقونة ديناميكية",
"dynamicIcon": "أيقونة ديناميكية",
"dynamicIconDateEmptyInfo": "مسح التاريخ، سيعرض رمز التقويم تاريخ اليوم ديناميكيًا",
"backlinkContainChildren": "جعل الروابط المرجعية تحتوي على كتل فرعية",
"backlinkContainChildrenTip": "عند التمكين، سيتم تضمين الكتل الفرعية في حساب الروابط المرجعية",
"entryNum": "عدد المدخلات",
"workspaceData": "بيانات مساحة العمل",
"confirmRemoveRelationField": "‫هل أنت متأكد من أنك تريد حذف الحقل المرتبط بـ <b>${x}</b>؟‬",
"removeButKeepRelationField": "احذف، لكن حفظ الحقل المرتبط",
"confirmRemoveRelationField": "‫هل أنت متأكد من أنك تريد حذف الحقل <b>${x}</b>؟ بعد حذف هذا الحقل، سيتم حذف حقل العلاقة ثنائية الاتجاه <b>${z}</b> في قاعدة البيانات <b>${y}</b> أيضًا بشكل متزامن.",
"removeBothRelationField": "حذف كلا الحقلين",
"removeButKeepRelationField": "احذف هذا الحقل فقط، احتفظ بحقل العلاقة ثنائية الاتجاه",
"exportPDFLowMemory": "‫الذاكرة المتاحة غير كافية لتصدير هذا PDF، يرجى تقليل المحتوى أو زيادة الذاكرة المتاحة ومحاولة التصدير مرة أخرى‬",
"exportConf": "إعدادات التصدير",
"exportConfTip": "‫لن يتم تصدير الحساب، رمز الإذن بالوصول، المزامنة، رمز API ومفتاح مستودع البيانات‬",
@ -124,6 +131,7 @@
"updateLayout": "تحديث التصميم",
"dndFolderTip": "‫يرجى ملاحظة أن ${x} يقوم فقط بإدراج رابط file:// ولا يقوم بنسخ الملف‬",
"removeCol": "‫هل أنت متأكد من أنك تريد حذف حقل <b>${x}</b> في قاعدة البيانات؟‬",
"removeColConfirm": "⚠️ حذف الحقل",
"video": "الفيديو",
"audio": "الصوت",
"updateAll": "تحديث الكل",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "بعد",
"filterOperatorIsOnOrBefore": "في أو قبل",
"filterOperatorIsOnOrAfter": "في أو بعد",
"filterQuantifierAny": "أي",
"filterQuantifierAll": "الكل",
"filterQuantifierNone": "لا شيء",
"asc": "تصاعدي",
"desc": "تنازلي",
"hideCol": "إخفاء الحقل",
@ -430,7 +441,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": "الطراز",
@ -1113,7 +1124,7 @@
"fileTree3": "لا يتطلب تأكيد عند حذف المستندات",
"fileTree4": "في حالة عدم التمكين، سوف يظهر مربع التأكيد في كل مرة تقوم فيها بحذف مستند",
"fileTree5": "موقع حفظ المستند الجديد المنشَأ من المرجع",
"fileTree6": "‫عند استخدام <code class='fn__code'>((</code>، مسار حفظ المستند الجديد (على سبيل المثال، <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "‫عند استخدام <code class='fn__code'>((</code> أو <code class='fn__code'>[[</code>، مسار حفظ المستند الجديد (على سبيل المثال، <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "فتح في علامة التبويب الحالية",
"fileTree8": "سيتم استبدال علامة التبويب المستند المفتوحة حديثا علامة التبويب غير المعدلة",
"fileTree9": "إغلاق جميع علامات التبويب عند بدء التشغيل",
@ -1129,6 +1140,8 @@
"fileTree19": "ولبعض نظم التشغيل قيود تقنية قد تحول دون النسخ اليدوي لبيانات مساحة العمل بعد وضع مستندات فرعية تزيد عن 7 مستويات",
"fileTree20": "حفظ بسطر واحد",
"fileTree21": "‫بعد التمكين، سيتم استخدام تنسيق JSON ذي السطر الواحد عند حفظ مستندات .sy وقاعدة بيانات .json، مما يقلل حجم الملف بحوالي 30٪ وتحسين كفاءة القراءة والكتابة بنسبة 50٪",
"fileTree22": "تنبيه ملف كبير",
"fileTree23": "إشعار عند تجاوز ملفات .sy أو قاعدة بيانات .json لهذا الحجم",
"export10": "‫على سبيل المثال <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>‬، إذا كان فارغاً، سيتم استخدام العلامة المائية من النص المخصص أو مسار ملف العلامة المائية.",
"export11": "طريقة معالجة محتوى المراجع عند التصدير",
"export12": "طريقة معالجة محتوى كتلة التضمين عند التصدير",
@ -1644,6 +1657,12 @@
"263": "التالي %d أيام",
"264": "الحقل [%s] فارغ",
"265": "خارج النطاق",
"266": "Tesseract OCR غير مثبت أو غير مهيأ، يرجى الرجوع إلى دليل المستخدم - قسم ملفات الموارد لإجراء الإعداد"
"266": "Tesseract OCR غير مثبت أو غير مهيأ، يرجى الرجوع إلى دليل المستخدم - قسم ملفات الموارد لإجراء الإعداد",
"267": "قاعدة بيانات غير مسماة",
"268": "يرجى ملاحظة أن الملف [%s] قد تجاوز بالفعل [%d MB]‎، وقد يؤدي ذلك إلى انخفاض الأداء",
"269": "تمت إضافة هذا المقطع بالفعل إلى قاعدة البيانات [%s]",
"270": "يتم تحسين فهرس البيانات، يرجى الانتظار...",
"271": "اكتملت عملية تحسين فهرس البيانات، تم تحرير [%s] من مساحة القرص",
"272": "حقل غير مسمى"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "Nach dem Wechseln der Anwendungen dauert es einige Zeit, bis der Betrieb des SiYuan-Kernels wiederhergestellt ist. Bitte warten Sie einige Sekunden oder klicken Sie auf die Schaltfläche „Erneut versuchen“",
"relativeFontSize": "relativ zur Schriftgröße des Editors",
"localFileSystem": "Lokales Dateisystem",
"deviceNotSupport": "Das aktuelle Gerät wird nicht unterstützt",
"mobileNotSupport": "Diese Funktion wird derzeit auf mobilen Geräten (Telefon oder Tablet) nicht unterstützt",
"second": "Sekunde",
"syncInterval": "Synchronisierungsintervall",
"syncIntervalTip": "Automatische Datensynchronisierung, nachdem die Daten nicht mehr geändert werden",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Daten-Snapshot-Aufbewahrungstage",
"dataRepoAutoPurgeRetentionIndexesDaily": "Daten-Snapshots pro Tag",
"fields": "Attribut",
"dynamicEmoji": "Dynamisches Icon",
"dynamicIcon": "Dynamisches Icon",
"dynamicIconDateEmptyInfo": "Datum löschen, das Kalender-Symbol zeigt dynamisch das heutige Datum an",
"backlinkContainChildren": "Enthalten Rückverweise untergeordnete Blöcke",
"backlinkContainChildrenTip": "Wenn aktiviert, werden untergeordnete Blöcke in die Berechnung der Rückverweise einbezogen",
"entryNum": "Anzahl der Einträge",
"workspaceData": "Arbeitsbereichsdaten",
"confirmRemoveRelationField": "Sind Sie sicher, dass Sie das Feld, das mit <b>${x}</b> verknüpft ist, löschen möchten?",
"removeButKeepRelationField": "Entfernen, aber verknüpftes Feld behalten",
"confirmRemoveRelationField": "Sind Sie sicher, dass Sie das <b>${x}</b> Feld löschen möchten? Nach dem Löschen dieses Feldes wird das bidirektionale Beziehungsfeld <b>${z}</b> in der <b>${y}</b> Datenbank ebenfalls synchron gelöscht.",
"removeBothRelationField": "Beide Felder entfernen",
"removeButKeepRelationField": "Nur dieses Feld entfernen, bidirektionales Beziehungsfeld behalten",
"exportPDFLowMemory": "Nicht genügend verfügbarer Speicher, um dieses PDF zu exportieren, bitte reduzieren Sie den Inhalt oder erhöhen Sie den verfügbaren Speicher und versuchen Sie es erneut",
"exportConf": "Export-Einstellungen",
"exportConfTip": "Konto, Zugriffscode, Synchronisation, API-Token und Daten-Repo-Schlüssel werden nicht exportiert",
@ -124,6 +131,7 @@
"updateLayout": "Layout aktualisieren",
"dndFolderTip": "Bitte beachten Sie, dass ${x} nur den file:// Hyperlink einfügt und die Datei nicht kopiert.",
"removeCol": "Sind Sie sicher, dass Sie die <b>${x}</b> Spalte in der Datenbank löschen möchten?",
"removeColConfirm": "⚠️ Spalte löschen",
"video": "Video",
"audio": "Audio",
"updateAll": "Alle aktualisieren",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "Ist nach",
"filterOperatorIsOnOrBefore": "Ist am oder vor",
"filterOperatorIsOnOrAfter": "Ist am oder nach",
"filterQuantifierAny": "Beliebig",
"filterQuantifierAll": "Alle",
"filterQuantifierNone": "Keine",
"asc": "Aufsteigend",
"desc": "Absteigend",
"hideCol": "Spalte ausblenden",
@ -430,7 +441,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",
@ -1113,7 +1124,7 @@
"fileTree3": "Keine Bestätigung erforderlich beim Löschen von Dokumenten",
"fileTree4": "Wenn nicht aktiviert, wird jedes Mal ein Bestätigungsfeld angezeigt, wenn Sie ein Dokument löschen",
"fileTree5": "Referenz erstellt Doc-Speicherort",
"fileTree6": "Beim Verwenden von <code class='fn__code'>((</code> der Speicherpfad des neuen Dokuments (z.B. <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "Beim Verwenden von <code class='fn__code'>((</code> oder <code class='fn__code'>[[</code> der Speicherpfad des neuen Dokuments (z.B. <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Im aktuellen Tab öffnen",
"fileTree8": "Der neu geöffnete Dokumenten-Tab ersetzt den nicht modifizierten Tab",
"fileTree9": "Alle Tabs beim Start schließen",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, wenn leer, verwenden Sie Wasserzeichentext oder den Pfad zur Wasserzeichen-Datei.",
"export11": "Inhaltsbehandlungsverfahren des Inhaltsreferenzblocks beim Exportieren",
"export12": "Inhaltsbehandlungsverfahren des Inhalteinbettungsblocks beim Exportieren",
@ -1644,6 +1657,12 @@
"263": "Nächste %d Tage",
"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"
"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",
"272": "Unbenanntes Feld"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "After switching applications, it will take some time to restore the SiYuan kernel operation. Please wait a few seconds or click the \"Retry\" button",
"relativeFontSize": "relative to the editor font size",
"localFileSystem": "Local file system",
"deviceNotSupport": "The current device is not supported",
"mobileNotSupport": "This feature is currently not supported on mobile devices (phone or tablet)",
"second": "second",
"syncInterval": "sync interval",
"syncIntervalTip": "Automatically sync data after it stops changing",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Data snapshot retention days",
"dataRepoAutoPurgeRetentionIndexesDaily": "Data snapshots per day",
"fields": "Fields",
"dynamicEmoji": "Dynamic icon",
"dynamicIcon": "Dynamic icon",
"dynamicIconDateEmptyInfo": "Clear the date, the calendar icon will dynamically display todays date",
"backlinkContainChildren": "Do backlinks contain child blocks",
"backlinkContainChildrenTip": "When enabled, child blocks will be included in the backlink calculation",
"entryNum": "Number of entries",
"workspaceData": "Workspace data",
"confirmRemoveRelationField": "Are you sure you want to delete the field associated with <b>${x}</b>?",
"removeButKeepRelationField": "Remove, but keep related field",
"confirmRemoveRelationField": "Are you sure you want to delete the <b>${x}</b> field? After deleting this field, the bidirectional relation field <b>${z}</b> in the <b>${y}</b> database will also be deleted synchronously.",
"removeBothRelationField": "Remove both fields",
"removeButKeepRelationField": "Remove only this field, keep bidirectional relation field",
"exportPDFLowMemory": "Insufficient available memory to export this PDF, please reduce the content or increase available memory and try exporting again",
"exportConf": "Export settings",
"exportConfTip": "Account, access authorization code, synchronization, API token and data repo key will not be exported",
@ -124,6 +131,7 @@
"updateLayout": "Update layout",
"dndFolderTip": "Please note that ${x} only inserts the file:// hyperlink and does not copy the file",
"removeCol": "Are you sure you want to delete the <b>${x}</b> field in the database?",
"removeColConfirm": "⚠️ Delete field",
"video": "Video",
"audio": "Audio",
"updateAll": "Update all",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "Is after",
"filterOperatorIsOnOrBefore": "Is on or before",
"filterOperatorIsOnOrAfter": "Is on or after",
"filterQuantifierAny": "Any",
"filterQuantifierAll": "All",
"filterQuantifierNone": "None",
"asc": "Ascending",
"desc": "Descending",
"hideCol": "Hide field",
@ -430,7 +441,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",
@ -1113,7 +1124,7 @@
"fileTree3": "No confirmation required when deleting documents",
"fileTree4": "If not enabled, a confirmation box will pop up every time you delete a document",
"fileTree5": "Ref create doc save location",
"fileTree6": "When using <code class='fn__code'>((</code>, the save path of the new document (for example, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "When using <code class='fn__code'>((</code> or <code class='fn__code'>[[</code>, the save path of the new document (for example, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Open in the current tab",
"fileTree8": "The newly opened document tab will replace the unmodified tab",
"fileTree9": "Close all tabs at startup",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</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",
@ -1644,6 +1657,12 @@
"263": "Next %d days",
"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"
"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",
"272": "Unnamed field"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "Después de cambiar de aplicación, tomará algún tiempo restaurar el funcionamiento del núcleo de SiYuan. Espere unos segundos o haga clic en el botón \"Reintentar\"",
"relativeFontSize": "en relación con el tamaño de fuente del editor",
"localFileSystem": "Sistema de archivos local",
"deviceNotSupport": "El dispositivo actual no es compatible",
"mobileNotSupport": "Esta función no está disponible actualmente en dispositivos móviles (teléfono o tableta)",
"second": "segundo",
"syncInterval": "intervalo de sincronización",
"syncIntervalTip": "Sincronización automática de datos después de que los datos dejen de cambiar",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Días de retención de instantáneas de datos",
"dataRepoAutoPurgeRetentionIndexesDaily": "Número de instantáneas de datos por día",
"fields": "Atributo",
"dynamicEmoji": "Icono dinámico",
"dynamicIcon": "Icono dinámico",
"dynamicIconDateEmptyInfo": "Borrar la fecha, el icono del calendario mostrará dinámicamente la fecha actual",
"backlinkContainChildren": "¿Los enlaces inversos contienen bloques secundarios?",
"backlinkContainChildrenTip": "Una vez habilitado, los bloques secundarios se incluirán en el cálculo de los enlaces inversos",
"entryNum": "Número de entradas",
"workspaceData": "Datos del espacio de trabajo",
"confirmRemoveRelationField": "¿Está seguro de que desea eliminar el campo asociado a <b>${x}</b>?",
"removeButKeepRelationField": "Eliminar, pero mantener el campo relacionado",
"confirmRemoveRelationField": "¿Está seguro de que desea eliminar el campo <b>${x}</b>? Después de eliminar este campo, el campo de relación bidireccional <b>${z}</b> en la base de datos <b>${y}</b> también se eliminará de forma sincrónica.",
"removeBothRelationField": "Eliminar ambos campos",
"removeButKeepRelationField": "Eliminar solo este campo, mantener el campo de relación bidireccional",
"exportPDFLowMemory": "Memoria disponible insuficiente para exportar este PDF, por favor reduzca el contenido o aumente la memoria disponible y vuelva a intentar exportar",
"exportConf": "Configuración de exportación",
"exportConfTip": "Las cuentas, los códigos de acceso, la sincronización, los tokens API y las claves del almacén de datos no se exportarán",
@ -124,6 +131,7 @@
"updateLayout": "Actualizar diseño",
"dndFolderTip": "Tenga en cuenta que ${x} solo inserta el hipervínculo file:// y no copia el archivo",
"removeCol": "¿Está seguro de que desea eliminar la columna <b>${x}</b> en la base de datos?",
"removeColConfirm": "⚠️ Eliminar columna",
"vídeo": "Vídeo",
"audio": "Audio",
"updateAll": "Actualizar todo",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "Es posterior a",
"filterOperatorIsOnOrBefore": "Está activado o antes",
"filterOperatorIsOnOrAfter": "Está encendido o después",
"filterQuantifierAny": "Cualquiera",
"filterQuantifierAll": "Todos",
"filterQuantifierNone": "Ninguno",
"asc": "Ascendente",
"desc": "Descendente",
"hideCol": "Ocultar columna",
@ -430,7 +441,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",
@ -1113,7 +1124,7 @@
"fileTree3": "No se requiere confirmación al borrar documentos",
"fileTree4": "Si no se activa, aparecerá un cuadro de confirmación cada vez que se elimine un documento",
"fileTree5": "Ref crear ubicación de guardado de documentos",
"fileTree6": "Al utilizar <code class='fn__code'>((</code>, la ruta de guardado del nuevo documento (por ejemplo, <code class='fn__code'>/carpeta1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "Al utilizar <code class='fn__code'>((</code> o <code class='fn__code'>[[</code>, la ruta de guardado del nuevo documento (por ejemplo, <code class='fn__code'>/carpeta1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Abrir en la pestaña actual",
"fileTree8": "La pestaña del documento recién abierto sustituirá a la pestaña no modificada",
"fileTree9": "Cerrar todas las pestañas al inicio",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</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",
@ -1644,6 +1657,12 @@
"263": "Próximos %d días",
"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"
"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",
"272": "Campo sin nombre"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "Après avoir changé d'application, il faudra un certain temps pour rétablir le fonctionnement du noyau SiYuan. Veuillez patienter quelques secondes ou cliquer sur le bouton « Réessayer »",
"relativeFontSize": "par rapport à la taille de la police de l'éditeur",
"localFileSystem": "Système de fichiers local",
"deviceNotSupport": "L'appareil actuel n'est pas pris en charge",
"mobileNotSupport": "Cette fonctionnalité n'est pas prise en charge sur les appareils mobiles (téléphone ou tablette) pour le moment",
"second": "seconde",
"syncInterval": "intervalle de synchronisation",
"syncIntervalTip": "Synchronisation automatique des données après l'arrêt des modifications",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Jours de rétention des instantanés de données",
"dataRepoAutoPurgeRetentionIndexesDaily": "Nombre d'instantanés de données par jour",
"fields": "Attribut",
"dynamicEmoji": "Icône dynamique",
"dynamicIcon": "Icône dynamique",
"dynamicIconDateEmptyInfo": "Effacer la date, licône du calendrier affichera dynamiquement la date du jour",
"backlinkContainChildren": "Les liens retour contiennent-ils des sous-blocs",
"backlinkContainChildrenTip": "Une fois activé, les sous-blocs seront inclus dans le calcul des liens retour",
"entryNum": "Nombre d'entrées",
"workspaceData": "Données de l'espace de travail",
"confirmRemoveRelationField": "Êtes-vous sûr de vouloir supprimer le champ associé à <b>${x}</b>?",
"removeButKeepRelationField": "Supprimer, mais conserver le champ associé",
"confirmRemoveRelationField": "Êtes-vous sûr de vouloir supprimer le champ <b>${x}</b> ? Après la suppression de ce champ, le champ de relation bidirectionnelle <b>${z}</b> dans la base de données <b>${y}</b> sera également supprimé de manière synchrone.",
"removeBothRelationField": "Supprimer les deux champs",
"removeButKeepRelationField": "Supprimer seulement ce champ, conserver le champ de relation bidirectionnelle",
"exportPDFLowMemory": "Mémoire disponible insuffisante pour exporter ce PDF, veuillez réduire le contenu ou augmenter la mémoire disponible et réessayer d'exporter",
"exportConf": "Exporter les paramètres",
"exportConfTip": "Les comptes, codes d'accès, synchronisation, tokens API et clés d'entrepôt de données ne seront pas exportés",
@ -124,6 +131,7 @@
"updateLayout": "Mettre à jour la mise en page",
"dndFolderTip": "Veuillez noter que ${x} insère uniquement le lien hypertexte file:// et ne copie pas le fichier",
"removeCol": "Êtes-vous sûr de vouloir supprimer la colonne <b>${x}</b> de la base de données ?",
"removeColConfirm": "⚠️ Supprimer la colonne",
"video": "Vidéo",
"audio": "Audio",
"updateAll": "Tout mettre à jour",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "Est après",
"filterOperatorIsOnOrBefore": "Est le ou avant",
"filterOperatorIsOnOrAfter": "Est allumé ou après",
"filterQuantifierAny": "N'importe lequel",
"filterQuantifierAll": "Tous",
"filterQuantifierNone": "Aucun",
"asc": "Ascendant",
"desc": "Descendant",
"hideCol": "Masquer la colonne",
@ -430,7 +441,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",
@ -490,7 +501,7 @@
"workspaceList": "Espaces de travail",
"removeWorkspaceTip": "Supprimer des espaces de travail",
"new": "Nouveau",
"share2LiandiConfirmTip": "Êtes-vous sûr de vouloir <b>publier</b> ce document dans la <a href=\"${accountServer}\" target=\"_blank\">communauté</a> ?<br>Après la publication, tout le monde pourra voir ce document, assurez-vous qu'il ne contient pas d'informations sensibles",
"share2LiandiConfirmTip": "Êtes-vous sûr de vouloir <b>publier</b> ce document dans la <a href=\"${accountServer}\" target=\"_blank\">communauté</a> ?<br>Après la publication, tout le monde pourra voir ce document, assurez-vous qu'il ne contient pas d'informations sensibles",
"share2Liandi": "Partager avec communauté",
"noDueCard": "Excellent travail ! Il n'y a plus de tâches de révision pour le moment, revenez plus tard !",
"createDeck": "Créer un deck",
@ -752,7 +763,7 @@
"findHighlight": "Tout surligner",
"findEntireWord": "Mots entiers",
"presentationMode": "Basculer en mode présentation",
"focusOutline": "Trouver lélément de plan actuel",
"focusOutline": "Trouver l'élément de plan actuel",
"previousLabel": "Précédent",
"nextLabel": "Suivant",
"pageScaleWidth": "Pleine largeur",
@ -763,12 +774,12 @@
"loading": "Chargement…",
"toggleSidebarNotification2Title": "Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes/calques)",
"toggleSidebarTitle": "Afficher/Masquer le panneau latéral",
"loadingError": "Une erreur sest produite lors du chargement du fichier PDF.",
"loadingError": "Une erreur s'est produite lors du chargement du fichier PDF.",
"invalidFileError": "Fichier PDF invalide ou corrompu.",
"missingFileError": "Fichier PDF manquant.",
"unexpectedResponseError": "Réponse inattendue du serveur.",
"printingNotSupported": "Attention : limpression nest pas totalement prise en charge par ce navigateur.",
"printingNotReady": "Attention : le PDF nest pas entièrement chargé pour pouvoir limprimer.",
"printingNotSupported": "Attention : l'impression n'est pas totalement prise en charge par ce navigateur.",
"printingNotReady": "Attention : le PDF n'est pas entièrement chargé pour pouvoir l'imprimer.",
"unitInches": "in",
"unitMillimeters": "mm",
"additionalLayers": "Calques additionnels",
@ -1113,7 +1124,7 @@
"fileTree3": "Aucune confirmation requise lors de la suppression de documents",
"fileTree4": "Si non activé, une boîte de confirmation apparaîtra à chaque fois que vous supprimerez un document",
"fileTree5": "Référence créer doc enregistrer emplacement",
"fileTree6": "Lors de l'utilisation de <code class='fn__code'>((</code>, le chemin d'enregistrement du nouveau document (par exemple, <code class='fn__code'>/dossier1/{{now | date \"20060102150405\"}}/</code>).",
"fileTree6": "Lors de l'utilisation de <code class='fn__code'>((</code> ou <code class='fn__code'>[[</code>, le chemin d'enregistrement du nouveau document (par exemple, <code class='fn__code'>/dossier1/{{now | date \"20060102150405\"}}/</code>).",
"fileTree7": "Ouvrir dans l'Onglet actuel",
"fileTree8": "L'onglet du document nouvellement ouvert remplacera l'Onglet non modifié.",
"fileTree9": "Fermer tous les onglets au démarrage",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</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",
@ -1644,6 +1657,12 @@
"263": "Les %d prochains jours",
"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"
"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é",
"272": "Champ sans nom"
}
}
}

View file

@ -1,4 +1,9 @@
{
"vacuumDataIndex": "אופטימיזציית אינדקס",
"vacuumDataIndexTip": "בדוק את אינדקס הנתונים, שחרר שטח אחסון ושפר את ביצועי האינדקס",
"rebuildDataIndex": "בנה מחדש את האינדקס",
"rebuildDataIndexTip": "בנייה מחדש מלאה של אינדקס הנתונים, עשוי להימשך זמן, נא להמתין",
"displayFieldName": "הצג שם שדה",
"sortBySelectOption": "מיין לפי אפשרות",
"groupStep": "מרווח קיבוץ",
"groupRange": "טווח קיבוץ",
@ -28,7 +33,7 @@
"small": "קטן",
"fitImage": "התאמה אוטומטית לגודל התמונה",
"showIcon": "הצג סמל",
"showAllFieldsIcon": "הצג סמלי שדות",
"showAllEntriesIcons": "הצג סמלי כניסות",
"wrapAllFields": "עטיפת שדות אוטומטית",
"gallery": "כרטיס",
"newTag": "תג חדש",
@ -36,7 +41,7 @@
"reconnectPrompt": "לאחר מעבר בין יישומים, יידרש זמן מה כדי לשחזר את פעולת ליבת SiYuan. אנא המתן מספר שניות או לחץ על כפתור \"נסה שוב\"",
"relativeFontSize": "יחסית לגודל הגופן של העורך",
"localFileSystem": "מערכת קבצים מקומית",
"deviceNotSupport": "המכשיר הנוכחי אינו נתמך",
"mobileNotSupport": "פונקציה זו אינה נתמכת כרגע במכשירים ניידים (טלפון או טאבלט)",
"second": "שנייה",
"syncInterval": "מרווח סנכרון",
"syncIntervalTip": "סנכרון נתונים אוטומטי לאחר שהנתונים מפסיקים להשתנות",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "ימי שמירת תמונות נתונים",
"dataRepoAutoPurgeRetentionIndexesDaily": "מספר תמונות נתונים ביום",
"fields": "מאפיין",
"dynamicEmoji": "אייקון דינמי",
"dynamicIcon": "אייקון דינמי",
"dynamicIconDateEmptyInfo": "נקה את התאריך, סמל לוח השנה יציג באופן דינמי את התאריך של היום",
"backlinkContainChildren": "האם קישורים חוזרים כוללים בלוקים משניים",
"backlinkContainChildrenTip": "לאחר ההפעלה, בלוקים משניים ייכללו בחישוב הקישורים החוזרים",
"entryNum": "מספר ערכים",
"workspaceData": "נתוני סביבת עבודה",
"confirmRemoveRelationField": "האם אתה בטוח שברצונך למחוק את השדה המשויך ל-<b>${x}</b>?",
"removeButKeepRelationField": "מחק, אך שמור על שדה הקשר",
"confirmRemoveRelationField": "האם אתה בטוח שברצונך למחוק את השדה <b>${x}</b>? לאחר מחיקת שדה זה, שדה הקשר הדו-כיווני <b>${z}</b> במסד הנתונים <b>${y}</b> יימחק גם הוא באופן סינכרוני.",
"removeBothRelationField": "מחק את שני השדות",
"removeButKeepRelationField": "מחק רק שדה זה, שמור על שדה הקשר הדו-כיווני",
"exportPDFLowMemory": "אין מספיק זיכרון זמין במערכת כדי לייצא את ה-PDF הזה, נא לצמצם את התוכן או להגדיל את הזיכרון הזמין ולנסות שוב לייצא",
"exportConf": "הגדרות ייצוא",
"exportConfTip": "פרטי חשבון, קוד אישור גישה, סנכרון, אסימון API ומפתח מאגר נתונים לא ייוצאו",
@ -124,6 +131,7 @@
"updateLayout": "עדכן עימוד",
"dndFolderTip": "שים לב כי ${x} ניחש את ה-hyperlink file:// ואינו מעתיק את הקובץ",
"removeCol": "האם אתה בטוח שברצונך למחוק את העמודה <b>${x}</b> במסד הנתונים?",
"removeColConfirm": "⚠️ מחק עמודה",
"video": "וידאו",
"audio": "אודיו",
"updateAll": "עדכן הכל",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "היה אחרי",
"filterOperatorIsOnOrBefore": "היה על או לפני",
"filterOperatorIsOnOrAfter": "היה על או אחרי",
"filterQuantifierAny": "כל אחד",
"filterQuantifierAll": "הכל",
"filterQuantifierNone": "אין",
"asc": "עולה",
"desc": "יורד",
"hideCol": "החבא עמודה",
@ -430,7 +441,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": "מודל",
@ -1113,7 +1124,7 @@
"fileTree3": "אין צורך באישור בעת מחיקת מסמכים",
"fileTree4": "אם לא הופק, תופיע תיבת אישור בכל פעם שמחקים מסמך",
"fileTree5": "מיקום שמירת מסמך להפניה",
"fileTree6": "בעת השימוש <code class='fn__code'>((</code>, מסלול השמירה של המסמך החדש (למשל, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}</code>)",
"fileTree6": "בעת השימוש <code class='fn__code'>((</code> או <code class='fn__code'>[[</code>, מסלול השמירה של המסמך החדש (למשל, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}</code>)",
"fileTree7": "פתח בטאב הנוכחי",
"fileTree8": "טאב המסמך הנפתח החדש יחליף את הטאב הלא משתנה",
"fileTree9": "סגור את כל הטאבים בעת אתחול",
@ -1129,6 +1140,8 @@
"fileTree19": "חלק ממערכות ההפעלה יש הגבלות טכניות שעלולות למנוע העתקה ידנית של נתוני החלל העבודה לאחר יצירת תתי מסמכים גדולים מ-7 רמות",
"fileTree20": "שמור בשורה אחת",
"fileTree21": "לאחר הפעלת אפשרות זו, פורמט ה-JSON בשורה אחת ישמש בעת שמירת קבצי .sy ומסדי נתונים .json, מה שיכול להפחית את גודל הקובץ בכ-30% ולשפר את יעילות הקריאה והכתיבה ב-50%",
"fileTree22": "התראה על קובץ גדול",
"fileTree23": "הצג התראה כאשר קובץ .sy או מסד נתונים .json חורג מגודל זה",
"export10": "למשל <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, אם ריק, השתמש בטקסט סימן מים או בנתיב קובץ סימן מים.",
"export11": "שיטת טיפול תוכן של בלוק תוכן בעת הייצוא",
"export12": "שיטת טיפול תוכן של בלוק הטמעה בעת הייצוא",
@ -1623,7 +1636,7 @@
"242": "מעט מקום נותר [%s], נדרש לפחות [%s] כדי לבצע פעולה זו",
"243": "רק רשום את %d התגים הראשונים (כולל תתי תגים), אם יש צורך להתאים, אנא שנה את [הגדרות - עץ המסמכים - מספר מקסימלי לרשימה]",
"244": "אינדוקס הנתונים לא הושלם לאחר השימוש האחרון. אנא הפעל את [עץ מסמכים - שכתוב אינדקס]. אנא צא מהתוכנית לחלוטין לפני כיבוי המחשב.",
"245": "אינדוקס הנתונים לא הושלם לאחר השימוש האחרון. אנא זכור לבצע [עץ המסמכים - שחזור אינדקס]. אנא השתמש [צא מהאפליקציה] בפאנל הטורי הימני כדי לצאת על פי סדר",
"245": "אינדוקס הנתונים לא הושלם לאחר השימוש האחרון. אנא זכור לבצע [עץ המסמכים - שחזור אינדקס]. אנא השתמש [צא מהאפליקציה] בפאנל הטורי הימני כדי לצאת על פי סדר",
"246": "כותרת המסמך לא יכולה להכיל / והחלפה ב- _ ",
"247": "הקובץ [%s] גדול יותר מהמגבלה המקסימלית [%s], והוזנח להעלות בענן",
"248": "הכותרת היעד ממוקמת בבלוק המיכל ואינה יכולה לשמש כנקודת זרימה",
@ -1644,6 +1657,12 @@
"263": "ה-%d ימים הבאים",
"264": "השדה [%s] ריק",
"265": "מחוץ לטווח",
"266": "Tesseract OCR לא הותקן או הוגדר, אנא עיין במדריך למשתמש - פרק קבצי משאבים לצורך הגדרה"
"266": "Tesseract OCR לא הותקן או הוגדר, אנא עיין במדריך למשתמש - פרק קבצי משאבים לצורך הגדרה",
"267": "מסד נתונים ללא שם",
"268": "שים לב שהקובץ [%s] כבר חרג מ-[%d MB], דבר שעלול לגרום לירידה בביצועים",
"269": "הבלוק נוסף כבר למסד הנתונים [%s]",
"270": "מתבצעת אופטימיזציה של אינדקס הנתונים, נא להמתין...",
"271": "אופטימיזציית אינדקס הנתונים הושלמה, שוחררו [%s] שטח דיסק",
"272": "שדה ללא שם"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "Dopo aver cambiato applicazione, ci vorrà un po' di tempo per ripristinare il funzionamento del kernel SiYuan. Attendere qualche secondo o fare clic sul pulsante \"Riprova\"",
"relativeFontSize": "rispetto alla dimensione del carattere dell'editor",
"localFileSystem": "File system locale",
"deviceNotSupport": "Il dispositivo corrente non è supportato",
"mobileNotSupport": "La funzione non è attualmente supportata su dispositivi mobili (telefono o tablet)",
"second": "secondo",
"syncInterval": "intervallo di sincronizzazione",
"syncIntervalTip": "Sincronizzazione automatica dei dati dopo che non ci sono più variazioni",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Giorni di conservazione degli snapshot dei dati",
"dataRepoAutoPurgeRetentionIndexesDaily": "Numero di snapshot dei dati al giorno",
"fields": "Campi",
"dynamicEmoji": "Emoji dinamica",
"dynamicIcon": "Emoji dinamica",
"dynamicIconDateEmptyInfo": "Cancella la data, l'icona del calendario mostrerà dinamicamente la data odierna",
"backlinkContainChildren": "I backlink contengono blocchi figli",
"backlinkContainChildrenTip": "Dopo l'attivazione, i blocchi figli saranno inclusi nel calcolo dei backlink",
"entryNum": "Numero di voci",
"workspaceData": "Dati dello spazio di lavoro",
"confirmRemoveRelationField": "Sei sicuro di voler eliminare il campo associato a <b>${x}</b>?",
"removeButKeepRelationField": "Rimuovi, ma mantieni il campo correlato",
"confirmRemoveRelationField": "Sei sicuro di voler eliminare il campo <b>${x}</b>? Dopo aver eliminato questo campo, il campo di relazione bidirezionale <b>${z}</b> nel database <b>${y}</b> verrà eliminato anche in modo sincrono.",
"removeBothRelationField": "Rimuovi entrambi i campi",
"removeButKeepRelationField": "Rimuovi solo questo campo, mantieni il campo di relazione bidirezionale",
"exportPDFLowMemory": "Memoria disponibile insufficiente per esportare questo PDF, riduci il contenuto o aumenta la memoria disponibile e riprova a esportare",
"exportConf": "Impostazioni di esportazione",
"exportConfTip": "Account, codici di accesso, sincronizzazione, token API e chiavi di data warehouse non verranno esportati",
@ -124,6 +131,7 @@
"updateLayout": "Aggiorna layout",
"dndFolderTip": "Nota che ${x} inserisce solo il collegamento file:// e non copia il file",
"removeCol": "Sei sicuro di voler eliminare la colonna <b>${x}</b> nel database?",
"removeColConfirm": "⚠️ Elimina colonna",
"video": "Video",
"audio": "Audio",
"updateAll": "Aggiorna tutto",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "È dopo",
"filterOperatorIsOnOrBefore": "È il giorno o prima di",
"filterOperatorIsOnOrAfter": "È il giorno o dopo di",
"filterQuantifierAny": "Qualsiasi",
"filterQuantifierAll": "Tutti",
"filterQuantifierNone": "Nessuno",
"asc": "Ascendente",
"desc": "Discendente",
"hideCol": "Nascondi campo",
@ -430,7 +441,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",
@ -1113,7 +1124,7 @@
"fileTree3": "Nessuna conferma richiesta durante l'eliminazione dei documenti",
"fileTree4": "Se non abilitato, ogni volta che elimini un documento verrà visualizzata una finestra di conferma",
"fileTree5": "Percorso di salvataggio dei nuovi documenti creati con riferimento",
"fileTree6": "Quando usi <code class='fn__code'>((</code>, il percorso di salvataggio del nuovo documento (ad esempio, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "Quando usi <code class='fn__code'>((</code> o <code class='fn__code'>[[</code>, il percorso di salvataggio del nuovo documento (ad esempio, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Apri nella scheda corrente",
"fileTree8": "La scheda del documento appena aperta sostituirà la scheda non modificata",
"fileTree9": "Chiudi tutte le schede all'avvio",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</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",
@ -1644,6 +1657,12 @@
"263": "Prossimi %d giorni",
"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"
"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",
"272": "Campo senza nome"
}
}
}

View file

@ -1,4 +1,9 @@
{
"vacuumDataIndex": "インデックスの最適化",
"vacuumDataIndexTip": "データインデックスを検証し、ストレージを解放してインデックス性能を向上させます",
"rebuildDataIndex": "インデックスの再構築",
"rebuildDataIndexTip": "データインデックスを完全に再構築します。時間がかかる場合がありますのでお待ちください",
"displayFieldName": "フィールド名を表示",
"sortBySelectOption": "オプションで並べ替え",
"groupStep": "グループ間隔",
"groupRange": "グループ範囲",
@ -28,7 +33,7 @@
"small": "小",
"fitImage": "画像サイズを自動調整",
"showIcon": "アイコンを表示",
"showAllFieldsIcon": "フィールドアイコンを表示",
"showAllEntriesIcons": "エントリアイコンを表示",
"wrapAllFields": "フィールドを自動折り返し",
"gallery": "カード",
"newTag": "新しいタグ",
@ -36,7 +41,7 @@
"reconnectPrompt": "アプリを切り替えた後、思源カーネルの実行を再開するには少し時間がかかります。数秒待つか、「再試行」ボタンをクリックしてください",
"relativeFontSize": "エディターのフォントサイズに対して",
"localFileSystem": "ローカルファイルシステム",
"deviceNotSupport": "現在のデバイスはサポートされていません",
"mobileNotSupport": "モバイル端末(スマートフォンまたはタブレット)では現在この機能はサポートされていません",
"second": "秒",
"syncInterval": "同期間隔",
"syncIntervalTip": "データが変動しなくなった後に自動的にデータを同期します",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "データスナップショットの保持日数",
"dataRepoAutoPurgeRetentionIndexesDaily": "データスナップショットの毎日の保持数",
"fields": "属性",
"dynamicEmoji": "動的アイコン",
"dynamicIcon": "動的アイコン",
"dynamicIconDateEmptyInfo": "日付をクリアすると、カレンダーアイコンが当日の日付を動的に表示します",
"backlinkContainChildren": "バックリンクに子ブロックを含めるかどうか",
"backlinkContainChildrenTip": "有効にすると、子ブロックがバックリンク計算に含まれます",
"entryNum": "エントリ数",
"workspaceData": "ワークスペースデータ",
"confirmRemoveRelationField": "<b>${x}</b> に関連するフィールドを同時に削除してもよろしいですか?",
"removeButKeepRelationField": "削除して関連フィールドを保持",
"confirmRemoveRelationField": "<b>${x}</b> フィールドを削除してもよろしいですか?このフィールドを削除すると、<b>${y}</b> データベースの双方向関連フィールド <b>${z}</b> も同時に削除されます。",
"removeBothRelationField": "両方のフィールドを削除",
"removeButKeepRelationField": "このフィールドのみ削除し、双方向関連フィールドを保持",
"exportPDFLowMemory": "システムの利用可能なメモリが不足しているため、この PDF をエクスポートできません。内容を減らすか、利用可能なメモリを増やしてから再試行してください",
"exportConf": "設定のエクスポート",
"exportConfTip": "アカウント、アクセスコード、同期、API トークン、データウェアハウスキーはエクスポートされません",
@ -124,6 +131,7 @@
"updateLayout": "レイアウトを更新",
"dndFolderTip": "${x} は file:// 形式のハイパーリンクを挿入するだけでファイルはコピーされないので注意してください",
"removeCol": "データベースの <b>${x}</b> 列を削除してもよろしいですか?",
"removeColConfirm": "⚠️ 列を削除",
"video": "ビデオ",
"audio": "音声",
"updateAll": "すべて更新",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "より後",
"filterOperatorIsOnOrBefore": "以前",
"filterOperatorIsOnOrAfter": "以降",
"filterQuantifierAny": "いずれか",
"filterQuantifierAll": "すべて",
"filterQuantifierNone": "なし",
"asc": "昇順",
"desc": "降順",
"hideCol": "列を非表示",
@ -430,7 +441,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": "モデル",
@ -1113,7 +1124,7 @@
"fileTree3": "ドキュメントを削除するときに確認しない",
"fileTree4": "ドキュメントを削除するときに確認ボックスを表示しません",
"fileTree5": "参照の保存場所",
"fileTree6": "<code class='fn__code'>((</code> を使用した時の参照の保存パス (例: <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "<code class='fn__code'>((</code> または <code class='fn__code'>[[</code> を使用した時の参照の保存パス (例: <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "現在のタブで開く",
"fileTree8": "新しく開いたドキュメントのタブが未変更のタブを置き換えます",
"fileTree9": "起動時にすべてのタブを閉じる",
@ -1129,6 +1140,8 @@
"fileTree19": "一部のオペレーティングシステムでは、7レベルより深いサブドキュメントにワークスペースデータの手動コピーができない場合があります",
"fileTree20": "一行で保存",
"fileTree21": "ドキュメントとデータベースファイルを保存する際に改行を行わない JSON フォーマットを使用します。これによりファイルサイズが約 30% 削減され、読み書きの効率が 50% 向上します",
"fileTree22": "大きなファイルの警告",
"fileTree23": ".sy ドキュメントやデータベース .json がこのサイズを超えると通知します",
"export10": "例: <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code><br>空の場合は透かしテキストまたは透かし画像ファイルのパスを使用します",
"export11": "エクスポート時のブロック参照コンテンツの処理方法",
"export12": "エクスポート時の埋め込みブロックコンテンツの処理方法",
@ -1644,6 +1657,12 @@
"263": "次の %d 日間",
"264": "フィールド [%s] が空です",
"265": "範囲外",
"266": "Tesseract OCR がインストールされていないか、設定されていません。ユーザーガイド - リソースファイルセクションを参照して設定してください"
"266": "Tesseract OCR がインストールされていないか、設定されていません。ユーザーガイド - リソースファイルセクションを参照して設定してください",
"267": "未命名のデータベース",
"268": "ファイル [%s] はすでに [%d MB] を超えており、パフォーマンスが低下する可能性があります",
"269": "このブロックはすでにデータベース [%s] に追加されています",
"270": "データインデックスを最適化しています。しばらくお待ちください...",
"271": "データインデックスの最適化が完了しました。合計 [%s] のディスク容量が解放されました",
"272": "未命名フィールド"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "Po przełączeniu aplikacji ponowne uruchomienie jądra SiYuan może zająć trochę czasu. Proszę poczekać kilka sekund lub kliknąć przycisk „Ponów próbę”",
"relativeFontSize": "względem rozmiaru czcionki edytora",
"localFileSystem": "Lokalny system plików",
"deviceNotSupport": "Bieżące urządzenie nie jest obsługiwane",
"mobileNotSupport": "Funkcja nie jest obecnie obsługiwana na urządzeniach mobilnych (telefon lub tablet)",
"second": "sekunda",
"syncInterval": "interwał synchronizacji",
"syncIntervalTip": "Automatyczna synchronizacja danych po zaprzestaniu zmian",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Dni przechowywania migawek danych",
"dataRepoAutoPurgeRetentionIndexesDaily": "Liczba migawek danych dziennie",
"fields": "Atrybut",
"dynamicEmoji": "Ikona dynamiczna",
"dynamicIcon": "Ikona dynamiczna",
"dynamicIconDateEmptyInfo": "Wyczyść datę, ikona kalendarza będzie dynamicznie wyświetlać bieżącą datę",
"backlinkContainChildren": "Czy linki zwrotne zawierają bloki podrzędne",
"backlinkContainChildrenTip": "Po włączeniu bloki podrzędne zostaną uwzględnione w obliczeniach linków zwrotnych",
"entryNum": "Количество записей",
"workspaceData": "Dane przestrzeni roboczej",
"confirmRemoveRelationField": "Czy na pewno chcesz usunąć pole powiązane z <b>${x}</b>?",
"removeButKeepRelationField": "Usuń, ale zachowaj powiązane pole",
"confirmRemoveRelationField": "Czy na pewno chcesz usunąć pole <b>${x}</b>? Po usunięciu tego pola, dwukierunkowe pole relacji <b>${z}</b> w bazie danych <b>${y}</b> również zostanie usunięte synchronicznie.",
"removeBothRelationField": "Usuń oba pola",
"removeButKeepRelationField": "Usuń tylko to pole, zachowaj dwukierunkowe pole relacji",
"exportPDFLowMemory": "Za mało dostępnej pamięci, aby wyeksportować ten PDF, proszę zmniejszyć zawartość lub zwiększyć dostępną pamięć i spróbować ponownie",
"exportConf": "Ustawienia eksportu",
"exportConfTip": "Konto, kod autoryzacji dostępu, synchronizacja, token API i klucz repozytorium danych nie będą eksportowane",
@ -124,6 +131,7 @@
"updateLayout": "Zaktualizuj układ",
"dndFolderTip": "Proszę pamiętać, że ${x} tylko wstawia link file:// i nie kopiuje pliku",
"removeCol": "Czy na pewno chcesz usunąć <b>${x}</b> kolumnę w bazie danych?",
"removeColConfirm": "⚠️ Usuń kolumnę",
"video": "Wideo",
"audio": "Audio",
"updateAll": "Zaktualizuj wszystko",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "Jest po",
"filterOperatorIsOnOrBefore": "Jest na lub przed",
"filterOperatorIsOnOrAfter": "Jest na lub po",
"filterQuantifierAny": "Dowolny",
"filterQuantifierAll": "Wszystkie",
"filterQuantifierNone": "Brak",
"asc": "Rosnąco",
"desc": "Malejąco",
"hideCol": "Ukryj kolumnę",
@ -430,7 +441,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",
@ -1113,7 +1124,7 @@
"fileTree3": "Nie wymaga potwierdzenia przy usuwaniu dokumentów",
"fileTree4": "Jeśli nie jest włączone, okno potwierdzenia pojawi się za każdym razem, gdy usuniesz dokument",
"fileTree5": "Ref stworzone miejsce zapisu dokumentu",
"fileTree6": "Kiedy używasz <code class='fn__code'>((</code>, ścieżka zapisu nowego dokumentu (na przykład <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "Kiedy używasz <code class='fn__code'>((</code> lub <code class='fn__code'>[[</code>, ścieżka zapisu nowego dokumentu (na przykład <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Otwórz w bieżącej zakładce",
"fileTree8": "Nowa otwarta zakładka dokumentu zastąpi niezmodyfikowaną zakładkę",
"fileTree9": "Zamknij wszystkie zakładki przy uruchamianiu",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</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",
@ -1644,6 +1657,12 @@
"263": "Następne %d dni",
"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ć"
"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",
"272": "Nienazwane pole"
}
}
}

View file

@ -1,4 +1,9 @@
{
"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",
@ -28,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",
@ -36,7 +41,7 @@
"reconnectPrompt": "Após alternar aplicativos, levará algum tempo para restaurar a operação do kernel SiYuan. Por favor, aguarde alguns segundos ou clique no botão \"Tentar novamente\"",
"relativeFontSize": "relativo ao tamanho da fonte do editor",
"localFileSystem": "Sistema de arquivos local",
"deviceNotSupport": "O dispositivo atual não é suportado",
"mobileNotSupport": "O recurso não é suportado em dispositivos móveis (celular ou tablet) no momento,",
"second": "segundo",
"syncInterval": "intervalo de sincronização",
"syncIntervalTip": "Sincronizar dados automaticamente após parar de alterar",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Dias de retenção de instantâneos de dados",
"dataRepoAutoPurgeRetentionIndexesDaily": "Instantâneos de dados por dia",
"fields": "Campos",
"dynamicEmoji": "Ícone dinâmico",
"dynamicIcon": "Ícone dinâmico",
"dynamicIconDateEmptyInfo": "Limpar a data, o ícone do calendário exibirá dinamicamente a data atual",
"backlinkContainChildren": "Os backlinks contêm blocos filhos",
"backlinkContainChildrenTip": "Quando ativado, os blocos filhos serão incluídos no cálculo do backlink",
"entryNum": "Número de entradas",
"workspaceData": "Dados do espaço de trabalho",
"confirmRemoveRelationField": "Tem certeza que deseja excluir o campo associado a <b>${x}</b>?",
"removeButKeepRelationField": "Remover, mas manter campo relacionado",
"confirmRemoveRelationField": "Tem certeza que deseja excluir o campo <b>${x}</b>? Após excluir este campo, o campo de relação bidirecional <b>${z}</b> no banco de dados <b>${y}</b> também será excluído de forma síncrona.",
"removeBothRelationField": "Remover ambos os campos",
"removeButKeepRelationField": "Remover apenas este campo, manter campo de relação bidirecional",
"exportPDFLowMemory": "Memória disponível insuficiente para exportar este PDF, reduza o conteúdo ou aumente a memória disponível e tente exportar novamente",
"exportConf": "Configurações de exportação",
"exportConfTip": "Conta, código de autorização de acesso, sincronização, token de API e chave do repositório de dados não serão exportados",
@ -124,6 +131,7 @@
"updateLayout": "Atualizar layout",
"dndFolderTip": "Observe que ${x} apenas insere o hiperlink file:// e não copia o arquivo",
"removeCol": "Tem certeza que deseja excluir o campo <b>${x}</b> no banco de dados?",
"removeColConfirm": "⚠️ Excluir campo",
"video": "Vídeo",
"audio": "Áudio",
"updateAll": "Atualizar tudo",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "É depois de",
"filterOperatorIsOnOrBefore": "É em ou antes de",
"filterOperatorIsOnOrAfter": "É em ou depois de",
"filterQuantifierAny": "Qualquer",
"filterQuantifierAll": "Todos",
"filterQuantifierNone": "Nenhum",
"asc": "Ascendente",
"desc": "Descendente",
"hideCol": "Ocultar campo",
@ -430,7 +441,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",
@ -1113,7 +1124,7 @@
"fileTree3": "Nenhuma confirmação necessária ao excluir documentos",
"fileTree4": "Se não estiver ativado, uma caixa de confirmação aparecerá toda vez que você excluir um documento",
"fileTree5": "Local de salvamento do documento criado por Ref",
"fileTree6": "Ao usar <code class='fn__code'>((</code>, o caminho de salvamento do novo documento (por exemplo, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "Ao usar <code class='fn__code'>((</code> ou <code class='fn__code'>[[</code>, o caminho de salvamento do novo documento (por exemplo, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Abrir na aba atual",
"fileTree8": "A nova aba de documento substituirá a aba não modificada",
"fileTree9": "Fechar todas as abas na inicialização",
@ -1129,6 +1140,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'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</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",
@ -1344,7 +1357,7 @@
"xy": "%d anos %s",
"max": "há muito tempo %s"
},
"_taskAction": {
"_taskAction": {
"task.repo.checkout": "Executar checkout do snapshot",
"task.database.index.full": "Executar reconstrução do índice",
"task.database.index": "Executar índice do banco de dados",
@ -1644,6 +1657,12 @@
"263": "Próximos %d dias",
"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"
"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",
"272": "Campo sem nome"
}
}
}

View file

@ -1,4 +1,9 @@
{
"vacuumDataIndex": "Оптимизация индекса",
"vacuumDataIndexTip": "Проверить индекс данных, освободить место и повысить производительность индекса",
"rebuildDataIndex": "Перестроить индекс",
"rebuildDataIndexTip": "Полная перестройка индекса данных, это может занять некоторое время, пожалуйста, подождите",
"displayFieldName": "Показать имя поля",
"sortBySelectOption": "Сортировать по опции",
"groupStep": "Интервал группировки",
"groupRange": "Диапазон группировки",
@ -28,7 +33,7 @@
"small": "Маленький",
"fitImage": "Автоматическая подгонка размера изображения",
"showIcon": "Показать значок",
"showAllFieldsIcon": "Показать значки полей",
"showAllEntriesIcons": "Показать значки записей",
"wrapAllFields": "Автоматический перенос полей",
"gallery": "Карточка",
"newTag": "Новый тег",
@ -36,7 +41,7 @@
"reconnectPrompt": "После переключения приложений потребуется некоторое время, чтобы восстановить работу ядра SiYuan. Пожалуйста, подождите несколько секунд или нажмите кнопку «Повторить»",
"relativeFontSize": "относительно размера шрифта редактора",
"localFileSystem": "Локальная файловая система",
"deviceNotSupport": "Текущее устройство не поддерживается",
"mobileNotSupport": "Мобильные устройства (телефон или планшет) в настоящее время не поддерживают эту функцию,",
"second": "секунда",
"syncInterval": "интервал синхронизации",
"syncIntervalTip": "Автоматическая синхронизация данных после прекращения изменений",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "Срок хранения снимков данных",
"dataRepoAutoPurgeRetentionIndexesDaily": "Количество снимков данных в день",
"fields": "Атрибут",
"dynamicEmoji": "Динамическая иконка",
"dynamicIcon": "Динамическая иконка",
"dynamicIconDateEmptyInfo": "Очистить дату, иконка календаря будет динамически отображать текущую дату",
"backlinkContainChildren": "Включать ли дочерние блоки в обратные ссылки",
"backlinkContainChildrenTip": "После включения дочерние блоки будут включены в расчет обратных ссылок",
"entryNum": "Количество записей",
"workspaceData": "Данные рабочей области",
"confirmRemoveRelationField": "Вы уверены, что хотите удалить поле, связанное с <b>${x}</b>?",
"removeButKeepRelationField": "Удалить, но сохранить связанное поле",
"confirmRemoveRelationField": "Вы уверены, что хотите удалить поле <b>${x}</b>? После удаления этого поля двунаправленное поле связи <b>${z}</b> в базе данных <b>${y}</b> также будет синхронно удалено.",
"removeBothRelationField": "Удалить оба поля",
"removeButKeepRelationField": "Удалить только это поле, сохранить двунаправленное поле связи",
"exportPDFLowMemory": "Недостаточно доступной памяти для экспорта этого PDF, пожалуйста, уменьшите содержимое или увеличьте доступную память и повторите попытку экспорта",
"exportConf": "Экспорт настроек",
"exportConfTip": "Учетная запись, код авторизации доступа, синхронизация, API токен и ключ репозитория данных не будут экспортированы",
@ -124,6 +131,7 @@
"updateLayout": "Обновить макет",
"dndFolderTip": "Пожалуйста, обратите внимание, что ${x} только вставляет файл:// гиперссылку и не копирует файл",
"removeCol": "Вы уверены, что хотите удалить колонку <b>${x}</b> в базе данных?",
"removeColConfirm": "⚠️ Удалить колонку",
"video": "Видео",
"audio": "Аудио",
"updateAll": "Обновить все",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "Находится после",
"filterOperatorIsOnOrBefore": "Находится на или до",
"filterOperatorIsOnOrAfter": "Находится на или после",
"filterQuantifierAny": "Любой",
"filterQuantifierAll": "Все",
"filterQuantifierNone": "Нет",
"asc": "По возрастанию",
"desc": "По убыванию",
"hideCol": "Скрыть колонку",
@ -430,7 +441,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": "Модель",
@ -1113,7 +1124,7 @@
"fileTree3": "Подтверждение не требуется при удалении документов",
"fileTree4": "Если не включено, будет появляться окно подтверждения каждый раз при удалении документа",
"fileTree5": "Сохранить местоположение созданного документа с ссылкой",
"fileTree6": "При использовании <code class='fn__code'>((</code> путь для нового документа (например, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree6": "При использовании <code class='fn__code'>((</code> или <code class='fn__code'>[[</code> путь для нового документа (например, <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>)",
"fileTree7": "Открыть в текущей вкладке",
"fileTree8": "Вкладка нового открытого документа заменит неизмененную вкладку",
"fileTree9": "Закрыть все вкладки при запуске",
@ -1129,6 +1140,8 @@
"fileTree19": "Некоторые операционные системы имеют технические ограничения, которые могут препятствовать ручному копированию данных рабочего пространства после создания поддокументов глубже 7 уровней",
"fileTree20": "Сохранять в однострочном формате",
"fileTree21": "После включения однострочный формат JSON будет использоваться при сохранении .sy документов и файлов баз данных .json, что может снизить размер файла примерно на 30% и улучшить эффективность чтения и записи на 50%",
"fileTree22": "Уведомление о большом файле",
"fileTree23": "Появится уведомление, если размер файла .sy или базы данных .json превышает этот предел",
"export10": "Например <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, если пусто, использовать текст водяного знака или путь к файлу водяного знака.",
"export11": "Обработка блока ссылок при экспорте",
"export12": "Обработка блока встроенного контента при экспорте",
@ -1644,6 +1657,12 @@
"263": "Следующие %d дней",
"264": "Поле [%s] пусто",
"265": "Вне диапазона",
"266": "Tesseract OCR не установлен или не настроен, пожалуйста, обратитесь к Руководству пользователя - Раздел ресурсов для настройки"
"266": "Tesseract OCR не установлен или не настроен, пожалуйста, обратитесь к Руководству пользователя - Раздел ресурсов для настройки",
"267": "База данных не названа",
"268": "Обратите внимание, что файл [%s] уже превышает [%d МБ], это может привести к снижению производительности",
"269": "Этот блок уже добавлен в базу данных [%s]",
"270": "Оптимизация индекса данных, пожалуйста, подождите...",
"271": "Оптимизация индекса данных завершена, освобождено [%s] дискового пространства",
"272": "Неименованное поле"
}
}
}

View file

@ -1,4 +1,9 @@
{
"vacuumDataIndex": "優化索引",
"vacuumDataIndexTip": "校驗資料索引,釋放儲存空間並提升索引效能",
"rebuildDataIndex": "重建索引",
"rebuildDataIndexTip": "完全重建資料索引,較為耗時,請耐心等待",
"displayFieldName": "顯示欄位名稱",
"sortBySelectOption": "按選項排序",
"groupStep": "分組間隔",
"groupRange": "分組範圍",
@ -17,8 +22,8 @@
"insertItemAfter": "在後方插入${x}條",
"allViews": "所有視圖",
"copyAVID": "複製資料庫 ID",
"hideEmptyFields": "隱藏空字段",
"displayEmptyFields": "顯示空字段",
"hideEmptyFields": "隱藏空欄位",
"displayEmptyFields": "顯示空欄位",
"cardAspectRatio": "預覽區寬高比",
"cardPreview1": "卡片預覽",
"contentImage": "內容圖片",
@ -28,15 +33,15 @@
"small": "小",
"fitImage": "自動調整圖片大小",
"showIcon": "顯示圖標",
"showAllFieldsIcon": "顯示字段圖標",
"wrapAllFields": "字段自動換行",
"showAllEntriesIcons": "顯示條目圖標",
"wrapAllFields": "欄位自動換行",
"gallery": "卡片",
"newTag": "新建標籤",
"pleaseWait": "請稍等片刻...",
"reconnectPrompt": "切換應用後再次進入需要一些時間恢復思源內核運行,請稍等幾秒或者點擊“重試”按鈕",
"relativeFontSize": "相對於編輯器字號",
"localFileSystem": "本地檔案系統",
"deviceNotSupport": "當前設備不支援",
"mobileNotSupport": "行動裝置(手機或平板)目前不支援此功能,",
"second": "秒",
"syncInterval": "同步間隔",
"syncIntervalTip": "數據不再變動後自動進行數據同步",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "數據快照保留天數",
"dataRepoAutoPurgeRetentionIndexesDaily": "數據快照每天保留個數",
"fields": "欄位",
"dynamicEmoji": "動態圖標",
"dynamicIcon": "動態圖標",
"dynamicIconDateEmptyInfo": "清除日期,日曆圖示將動態顯示當天日期",
"backlinkContainChildren": "反向鏈接包含子塊",
"backlinkContainChildrenTip": "啟用後子塊將被納入到反向鏈接計算中",
"entryNum": "條目數",
"workspaceData": "工作空間數據",
"confirmRemoveRelationField": "確定同時刪除關聯至 <b>${x}</b> 中的字段嗎?",
"removeButKeepRelationField": "刪除,但保留關聯字段",
"confirmRemoveRelationField": "確定要刪除 <b>${x}</b> 欄位嗎?刪除本欄位後,<b>${y}</b> 數據庫中的雙向關聯欄位 <b>${z}</b> 也會同步刪除。",
"removeBothRelationField": "同時刪除兩個欄位",
"removeButKeepRelationField": "僅刪除本欄位,保留雙向關聯欄位",
"exportPDFLowMemory": "系統可用記憶體不足,無法導出該 PDF請減少內容或者增加可用記憶體後再嘗試導出",
"exportConf": "匯出設定",
"exportConfTip": "帳號、存取授權碼、同步、API token 和資料倉儲金鑰不會被匯出",
@ -124,6 +131,7 @@
"updateLayout": "更新版面配置",
"dndFolderTip": "請注意 ${x} 僅插入 file:// 超鏈接,不複製檔案",
"removeCol": "確定刪除資料庫中的 <b>${x}</b> 欄位?",
"removeColConfirm": "⚠️ 刪除欄位",
"video": "影片",
"audio": "音訊",
"updateAll": "全部更新",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "晚於",
"filterOperatorIsOnOrBefore": "早於或等於",
"filterOperatorIsOnOrAfter": "晚於或等於",
"filterQuantifierAny": "任一",
"filterQuantifierAll": "所有",
"filterQuantifierNone": "沒有",
"asc": "升序",
"desc": "降序",
"hideCol": "隱藏欄位",
@ -430,7 +441,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": "模型",
@ -1113,7 +1124,7 @@
"fileTree3": "刪除文檔時不需要確認",
"fileTree4": "不啟用時每次刪除文檔都會彈出確認框",
"fileTree5": "塊引新建文檔存放位置",
"fileTree6": "使用 <code class='fn__code'>((</code> 時新建文檔的存放路徑(例如 <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>",
"fileTree6": "使用 <code class='fn__code'>((</code> 或 <code class='fn__code'>[[</code> 時新建文檔的存放路徑(例如 <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>",
"fileTree7": "在當前分頁中打開",
"fileTree8": "新打開的文檔分頁將會替換沒有修改過的分頁",
"fileTree9": "啟動時關閉所有分頁",
@ -1129,6 +1140,8 @@
"fileTree19": "一些操作系統存在技術限制導致建立大於 7 層的子文檔後可能無法正常手動複製工作空間資料",
"fileTree20": "使用單行保存",
"fileTree21": "啟用後儲存 .sy 文件和資料庫 .json 時將使用單行 JSON 格式,大約能減少 30% 檔案大小並提升 50% 讀寫效率",
"fileTree22": "超大檔案提醒",
"fileTree23": ".sy 文件和資料庫 .json 超過該大小時彈出通知提醒",
"export10": "例如 <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code> ,為空時使用水印文字或浮水印檔案路徑。",
"export11": "匯出時關於塊引用內容的處理方式",
"export12": "匯出時關於嵌入塊內容的處理方式",
@ -1642,8 +1655,14 @@
"261": "今天",
"262": "明天",
"263": "未來 %d 天",
"264": "字段 [%s] 為空",
"264": "欄位 [%s] 為空",
"265": "不在範圍內",
"266": "Tesseract OCR 未安裝或未配置,請參考 用戶指南-資料文件 章節進行配置"
"266": "Tesseract OCR 未安裝或未配置,請參考 用戶指南-資料文件 章節進行配置",
"267": "未命名資料庫",
"268": "請注意該檔案 [%s] 已經超過 [%d MB],可能會導致效能下降",
"269": "該塊已經添加到資料庫 [%s] 中",
"270": "正在優化資料索引,請稍等...",
"271": "資料索引優化完畢,共釋放 [%s] 磁碟空間",
"272": "未命名欄位"
}
}
}

View file

@ -1,4 +1,9 @@
{
"vacuumDataIndex": "优化索引",
"vacuumDataIndexTip": "校验数据索引,释放存储空间并提升索引性能",
"rebuildDataIndex": "重建索引",
"rebuildDataIndexTip": "完全重建数据索引,较为耗时,请耐心等待",
"displayFieldName": "显示字段名称",
"sortBySelectOption": "按选项排序",
"groupStep": "分组间隔",
"groupRange": "分组范围",
@ -28,7 +33,7 @@
"small": "小",
"fitImage": "自适应图片大小",
"showIcon": "显示图标",
"showAllFieldsIcon": "显示字段图标",
"showAllEntriesIcons": "显示条目图标",
"wrapAllFields": "字段自动换行",
"gallery": "卡片",
"newTag": "新建标签",
@ -36,7 +41,7 @@
"reconnectPrompt": "切换应用后再次进入需要一些时间恢复思源内核运行,请稍等几秒或者点击“重试”按钮",
"relativeFontSize": "相对于编辑器字号",
"localFileSystem": "本地文件系统",
"deviceNotSupport": "当前设备不支持",
"mobileNotSupport": "移动端(手机或平板)设备目前不支持该功能",
"second": "秒",
"syncInterval": "同步间隔",
"syncIntervalTip": "数据不再变动后自动进行数据同步",
@ -48,13 +53,15 @@
"dataRepoAutoPurgeIndexRetentionDays": "数据快照保留天数",
"dataRepoAutoPurgeRetentionIndexesDaily": "数据快照每天保留个数",
"fields": "字段",
"dynamicEmoji": "动态图标",
"dynamicIcon": "动态图标",
"dynamicIconDateEmptyInfo": "清除日期,日历图标将动态显示当天日期",
"backlinkContainChildren": "反向链接包含子块",
"backlinkContainChildrenTip": "启用后子块将被纳入到反向链接计算中",
"entryNum": "条目数",
"workspaceData": "工作空间数据",
"confirmRemoveRelationField": "确定同时删除关联至 <b>${x}</b> 中的字段吗?",
"removeButKeepRelationField": "删除,但保留关联字段",
"confirmRemoveRelationField": "确定要删除 <b>${x}</b> 字段吗?删除本字段后,<b>${y}</b> 数据库中的双向关联字段 <b>${z}</b> 也会同步删除。",
"removeBothRelationField": "同时删除两个字段",
"removeButKeepRelationField": "仅删除本字段,保留双向关联字段",
"exportPDFLowMemory": "系统可用内存不足,无法导出该 PDF请减少内容或者增加可用内存后再尝试导出",
"exportConf": "导出设置",
"exportConfTip": "账号、访问授权码、同步、API token 和数据仓库密钥不会被导出",
@ -124,6 +131,7 @@
"updateLayout": "更新布局",
"dndFolderTip": "请注意 ${x} 仅插入 file:// 超链接,不复制文件",
"removeCol": "确定删除数据库中的 <b>${x}</b> 字段?",
"removeColConfirm": "⚠️ 删除字段",
"video": "视频",
"audio": "音频",
"updateAll": "全部更新",
@ -332,6 +340,9 @@
"filterOperatorIsAfter": "晚于",
"filterOperatorIsOnOrBefore": "早于或等于",
"filterOperatorIsOnOrAfter": "晚于或等于",
"filterQuantifierAny": "任一",
"filterQuantifierAll": "所有",
"filterQuantifierNone": "没有",
"asc": "升序",
"desc": "降序",
"hideCol": "隐藏字段",
@ -430,7 +441,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": "模型",
@ -1113,7 +1124,7 @@
"fileTree3": "删除文档时不需要确认",
"fileTree4": "不启用时每次删除文档都会弹出确认框",
"fileTree5": "块引新建文档存放位置",
"fileTree6": "使用 <code class='fn__code'>((</code> 时新建文档的存放路径(例如 <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>",
"fileTree6": "使用 <code class='fn__code'>((</code> 或 <code class='fn__code'>[[</code> 时新建文档的存放路径(例如 <code class='fn__code'>/folder1/{{now | date \"20060102150405\"}}/</code>",
"fileTree7": "在当前页签中打开",
"fileTree8": "新打开的文档页签将会替换没有修改过的页签",
"fileTree9": "启动时关闭所有页签",
@ -1129,6 +1140,8 @@
"fileTree19": "一些操作系统存在技术限制导致创建大于 7 层的子文档后可能无法正常手动复制工作空间数据",
"fileTree20": "使用单行保存",
"fileTree21": "启用后保存 .sy 文档和数据库 .json 时将使用单行 JSON 格式,大约能减少 30% 文件大小并提升 50% 读写效率",
"fileTree22": "超大文件提醒",
"fileTree23": ".sy 文档和数据库 .json 超过该大小时弹出通知提醒",
"export10": "例如 <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code> ,为空时使用水印文本或水印文件路径。",
"export11": "导出时关于块引用内容的处理方式",
"export12": "导出时关于嵌入块内容的处理方式",
@ -1644,6 +1657,12 @@
"263": "未来 %d 天",
"264": "字段 [%s] 为空",
"265": "不在范围内",
"266": "Tesseract OCR 未安装或未配置,请参考 用户指南-资源文件 章节进行配置"
"266": "Tesseract OCR 未安装或未配置,请参考 用户指南-资源文件 章节进行配置",
"267": "未命名数据库",
"268": "请注意该文件 [%s] 已经超过 [%d MB],可能会导致性能下降",
"269": "该块已经添加到数据库 [%s] 中",
"270": "正在优化数据索引,请稍等...",
"271": "数据索引优化完毕,共释放 [%s] 磁盘空间",
"272": "未命名字段"
}
}
}

View file

@ -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.2.0"/>
<Properties>
<DisplayName>SiYuan</DisplayName>
<PublisherDisplayName>云南链滴科技有限公司</PublisherDisplayName>

View file

@ -21,7 +21,7 @@ Below are the detailed changes in this version.
* [Database cells support vertical dragging to fill values](https://github.com/siyuan-note/siyuan/issues/12907)
* [Improve document tree movement and its animation](https://github.com/siyuan-note/siyuan/issues/12914)
* [Improve S3/WebDAV data sync config](https://github.com/siyuan-note/siyuan/issues/12923)
* [The Publishing service no longer support export](https://github.com/siyuan-note/siyuan/issues/12928)
* [The Publish service no longer support export](https://github.com/siyuan-note/siyuan/issues/12928)
* [Display document title in data history preview area](https://github.com/siyuan-note/siyuan/issues/12948)
* [Improve parsing `<img>` when importing markdown](https://github.com/siyuan-note/siyuan/issues/12956)
* [Improve parsing of YAML Front Matter when importing Markdown](https://github.com/siyuan-note/siyuan/issues/12962)

View 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)

View 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)

View 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)

View file

@ -0,0 +1,49 @@
## Overview
This version improves some details.
## Changelogs
Below are the detailed changes in this version.
### Enhancement
* [Support reading file paths from the clipboard](https://github.com/siyuan-note/siyuan/issues/14269)
* [New template functions `ISOYear`, `ISOMonth` and `ISOWeekDate`](https://github.com/siyuan-note/siyuan/issues/15679)
* [The year is changed to ISOYear when the dynamic icon displays the week number](https://github.com/siyuan-note/siyuan/pull/15680)
* [Improve database template field grouping](https://github.com/siyuan-note/siyuan/issues/15687)
* [Support opening assets through other apps on HarmonyOS NEXT](https://github.com/siyuan-note/siyuan/issues/15691)
* [Add cookie-based auth in publish proxy](https://github.com/siyuan-note/siyuan/pull/15692)
* [Dynamic icon use current date as default](https://github.com/siyuan-note/siyuan/pull/15693)
* [Improve template syntax highlight](https://github.com/siyuan-note/siyuan/pull/15694)
* [Improve synchronization of database bound blocks when list blocks change](https://github.com/siyuan-note/siyuan/issues/15697)
* [Improve the display height of the Android keyboard toolbar](https://github.com/siyuan-note/siyuan/issues/15700)
* [The height of the dividing line adjusts with font size](https://github.com/siyuan-note/siyuan/pull/15701)
* [Improve document tree custom sorting stability when creating a notebook or doc](https://github.com/siyuan-note/siyuan/issues/15716)
* [Block ref search and global search results display reference counts](https://github.com/siyuan-note/siyuan/issues/15721)
* [Improve database rollup template rendering](https://github.com/siyuan-note/siyuan/issues/15722)
### Bugfix
* [Blockquote custom attributes are lost in some cases](https://github.com/siyuan-note/siyuan/issues/15601)
* [When "Default fill created time" is enabled for database date fields, the automatically filled time value is incorrect](https://github.com/siyuan-note/siyuan/issues/15684)
* [When searching for document tags, keyword highlighting will have extra pound signs](https://github.com/siyuan-note/siyuan/issues/15690)
* [Database rollup template calculations are incorrect](https://github.com/siyuan-note/siyuan/issues/15695)
* [The update time of the database checkbox field keeps changing](https://github.com/siyuan-note/siyuan/issues/15707)
* [Database relative date filtering is incorrect](https://github.com/siyuan-note/siyuan/issues/15710)
* [The folded state of the block under the folded heading is incorrect in some cases](https://github.com/siyuan-note/siyuan/issues/15717)
### Refactor
* [Upgrade to Electron v37.4.0](https://github.com/siyuan-note/siyuan/issues/15704)
### Development
* [Add plugin event bus `code-language-update` and `code-language-change`](https://github.com/siyuan-note/siyuan/pull/15610)
* [Add internal kernel API `/api/av/getAttributeViewBoundBlockIDs` and `getAttributeViewItemIDs`](https://github.com/siyuan-note/siyuan/issues/15708)
* [Improve the front-end compilation performance of the development environment](https://github.com/siyuan-note/siyuan/issues/15734)
## Download
* [B3log](https://b3log.org/siyuan/en/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,49 @@
## 概述
該版本改進了一些細節。
## 變更記錄
以下是此版本中的詳細變更。
### 改進功能
* [支援從剪貼簿讀取檔案路徑](https://github.com/siyuan-note/siyuan/issues/14269)
* [新增範本函數 `ISOYear`、`ISOMonth` 和 `ISOWeekDate`](https://github.com/siyuan-note/siyuan/issues/15679)
* [動態圖示顯示週數時年份改為 ISOYear](https://github.com/siyuan-note/siyuan/pull/15680)
* [改進資料庫範本欄位分組](https://github.com/siyuan-note/siyuan/issues/15687)
* [支援在 HarmonyOS NEXT 上透過其他應用程式開啟資源檔案](https://github.com/siyuan-note/siyuan/issues/15691)
* [發布代理商中增加基於 Cookie 的認證](https://github.com/siyuan-note/siyuan/pull/15692)
* [動態圖示預設使用目前日期](https://github.com/siyuan-note/siyuan/pull/15693)
* [改進模板語法高亮](https://github.com/siyuan-note/siyuan/pull/15694)
* [改進清單區塊變更時資料庫綁定區塊的同步](https://github.com/siyuan-note/siyuan/issues/15697)
* [改進 Android 鍵盤工具列的顯示高度](https://github.com/siyuan-note/siyuan/issues/15700)
* [分割線高度隨字體大小調整](https://github.com/siyuan-note/siyuan/pull/15701)
* [改進新筆記本或文件時文件樹自訂排序的穩定性](https://github.com/siyuan-note/siyuan/issues/15716)
* [區塊引用搜尋和全域搜尋結果顯示引用計數](https://github.com/siyuan-note/siyuan/issues/15721)
* [改進資料庫匯總範本渲染](https://github.com/siyuan-note/siyuan/issues/15722)
### 修復缺陷
* [某些情況下引用區塊自訂屬性遺失](https://github.com/siyuan-note/siyuan/issues/15601)
* [資料庫日期欄位啟用「預設填滿建立時間」時自動填入的時間值不正確](https://github.com/siyuan-note/siyuan/issues/15684)
* [搜尋文件標籤時,關鍵字高亮會多出井號](https://github.com/siyuan-note/siyuan/issues/15690)
* [資料庫總表範本計算不正確](https://github.com/siyuan-note/siyuan/issues/15695)
* [資料庫複選框欄位的更新時間不斷變化](https://github.com/siyuan-note/siyuan/issues/15707)
* [資料庫相對日期篩選不正確](https://github.com/siyuan-note/siyuan/issues/15710)
* [折疊標題下塊的折疊狀態在某些情況下不正確](https://github.com/siyuan-note/siyuan/issues/15717)
### 開發重構
* [升級至 Electron v37.4.0](https://github.com/siyuan-note/siyuan/issues/15704)
### 開發者
* [新增外掛事件匯流排 `code-language-update` 和 `code-language-change`](https://github.com/siyuan-note/siyuan/pull/15610)
* [新增核心介面 `/api/av/getAttributeViewBoundBlockIDs` 和 `getAttributeViewItemIDs`](https://github.com/siyuan-note/siyuan/issues/15708)
* [提升開發環境前端編譯效能](https://github.com/siyuan-note/siyuan/issues/15734)
## 下載
* [B3log](https://b3log.org/siyuan/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,49 @@
## 概述
该版本改进了一些细节。
## 变更记录
以下是此版本中的详细变更。
### 改进功能
* [支持从剪贴板读取文件路径](https://github.com/siyuan-note/siyuan/issues/14269)
* [新增模板函数 `ISOYear`、`ISOMonth` 和 `ISOWeekDate`](https://github.com/siyuan-note/siyuan/issues/15679)
* [动态图标显示周数时年份改为 ISOYear](https://github.com/siyuan-note/siyuan/pull/15680)
* [改进数据库模板字段分组](https://github.com/siyuan-note/siyuan/issues/15687)
* [支持在 HarmonyOS NEXT 上通过其他应用打开资源文件](https://github.com/siyuan-note/siyuan/issues/15691)
* [发布代理中增加基于 Cookie 的认证](https://github.com/siyuan-note/siyuan/pull/15692)
* [动态图标默认使用当前日期](https://github.com/siyuan-note/siyuan/pull/15693)
* [改进模板语法高亮](https://github.com/siyuan-note/siyuan/pull/15694)
* [改进列表块变动时数据库绑定块的同步](https://github.com/siyuan-note/siyuan/issues/15697)
* [改进 Android 键盘工具栏的显示高度](https://github.com/siyuan-note/siyuan/issues/15700)
* [分割线高度随字体大小调整](https://github.com/siyuan-note/siyuan/pull/15701)
* [改进新建笔记本或文档时文档树自定义排序的稳定性](https://github.com/siyuan-note/siyuan/issues/15716)
* [块引用搜索和全局搜索结果显示引用计数](https://github.com/siyuan-note/siyuan/issues/15721)
* [改进数据库汇总模板渲染](https://github.com/siyuan-note/siyuan/issues/15722)
### 修复缺陷
* [某些情况下引用块自定义属性丢失](https://github.com/siyuan-note/siyuan/issues/15601)
* [数据库日期字段启用“默认填充创建时间”时自动填充的时间值不正确](https://github.com/siyuan-note/siyuan/issues/15684)
* [搜索文档标签时,关键字高亮会多出井号](https://github.com/siyuan-note/siyuan/issues/15690)
* [数据库汇总模板计算不正确](https://github.com/siyuan-note/siyuan/issues/15695)
* [数据库复选框字段的更新时间不断变化](https://github.com/siyuan-note/siyuan/issues/15707)
* [数据库相对日期筛选不正确](https://github.com/siyuan-note/siyuan/issues/15710)
* [折叠标题下块的折叠状态在某些情况下不正确](https://github.com/siyuan-note/siyuan/issues/15717)
### 开发重构
* [升级至 Electron v37.4.0](https://github.com/siyuan-note/siyuan/issues/15704)
### 开发者
* [新增插件事件总线 `code-language-update` 和 `code-language-change`](https://github.com/siyuan-note/siyuan/pull/15610)
* [新增内核接口 `/api/av/getAttributeViewBoundBlockIDs` 和 `getAttributeViewItemIDs`](https://github.com/siyuan-note/siyuan/issues/15708)
* [提升开发环境前端编译性能](https://github.com/siyuan-note/siyuan/issues/15734)
## 下载
* [B3log](https://b3log.org/siyuan/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,48 @@
## Overview
This version improves some details.
## Changelogs
Below are the detailed changes in this version.
### Enhancement
* [Copy/Cut folded heading changed to copy/cut `Headings and Bottom Blocks` and support multiple headings copy/cut](https://github.com/siyuan-note/siyuan/issues/8019)
* [Improve database field editing menu](https://github.com/siyuan-note/siyuan/issues/15185)
* [Database rollup field filtering rules support "Any", "All", and "None"](https://github.com/siyuan-note/siyuan/issues/15609)
* [Improve flashcards](https://github.com/siyuan-note/siyuan/issues/15699)
* [If the new data created in the database is in a collapsed group, the edit box will not pop up](https://github.com/siyuan-note/siyuan/issues/15728)
* [Select Copy in the code block to copy only the plain text](https://github.com/siyuan-note/siyuan/issues/15733)
* [Use the default sorting when the search content in the code block language prompt is empty](https://github.com/siyuan-note/siyuan/issues/15737)
* [Improve database rollup field filtering](https://github.com/siyuan-note/siyuan/issues/15740)
* [Improve database date field filtering](https://github.com/siyuan-note/siyuan/issues/15744)
* [Disable editing when adding options to the database](https://github.com/siyuan-note/siyuan/issues/15751)
* [After dragging database entries across groups, groups in other views need to be updated](https://github.com/siyuan-note/siyuan/issues/15755)
* [Browser clipping extension supports clipping page to the database](https://github.com/siyuan-note/siyuan/issues/15758)
* [Hide the bottom gesture navigation bar on Android](https://github.com/siyuan-note/siyuan/issues/15763)
* [Improve database group view performance](https://github.com/siyuan-note/siyuan/issues/15764)
* [Dragging multiple files into the editor will cause them to be opened by the default program](https://github.com/siyuan-note/siyuan/pull/15773)
* [Improve HTML table clipping](https://github.com/siyuan-note/siyuan/issues/15781)
* [Automatically create a new document when clicking on a notebook without documents](https://github.com/siyuan-note/siyuan/issues/15782)
* [Add field `disabledInPublish` to the code snippet to indicate whether it is disabled in the publish service](https://github.com/siyuan-note/siyuan/issues/15806)
### Bugfix
* [PDF files with too long file names cannot generate annotated images](https://github.com/siyuan-note/siyuan/issues/15739)
* [The video block network address is incorrect](https://github.com/siyuan-note/siyuan/issues/15741)
* [The database date field cannot paste the time of 0 o'clock](https://github.com/siyuan-note/siyuan/issues/15742)
* [Read-only mode cannot be set in preview mode](https://github.com/siyuan-note/siyuan/issues/15756)
* [Exception when inserting batch files into the editor](https://github.com/siyuan-note/siyuan/issues/15768)
* [When using certain input methods, punctuation characters are inserted twice after pasting a link at the end of a block](https://github.com/siyuan-note/siyuan/issues/15801)
### Development
* [Add field `disabledInPublish` to the marketplace plugin package metadata to indicate whether it is disabled in the publish service](https://github.com/siyuan-note/siyuan/issues/11730)
* [Add plugin function `expandDocTree`](https://github.com/siyuan-note/siyuan/issues/15639)
* [Improve kernel API `appendBlock`, `insertBlock` and `prependBlock`](https://github.com/siyuan-note/siyuan/issues/15798)
## Download
* [B3log](https://b3log.org/siyuan/en/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,48 @@
## 概述
該版本改進了一些細節。
## 變更記錄
以下是此版本中的詳細變更。
### 改進功能
* [折疊標題的複製/剪切改為複製/剪切 `標題及其下方塊`,並支援多標題複製/剪切](https://github.com/siyuan-note/siyuan/issues/8019)
* [改進資料庫欄位編輯選單](https://github.com/siyuan-note/siyuan/issues/15185)
* [資料庫匯總欄位篩選規則支援「任一」、「所有」和「沒有」](https://github.com/siyuan-note/siyuan/issues/15609)
* [改良閃卡](https://github.com/siyuan-note/siyuan/issues/15699)
* [資料庫中新建資料如果在折疊分組內,不再彈出編輯框](https://github.com/siyuan-note/siyuan/issues/15728)
* [程式碼區塊選擇複製時僅複製純文字](https://github.com/siyuan-note/siyuan/issues/15733)
* [程式碼區塊語言提示搜尋內容為空時使用預設排序](https://github.com/siyuan-note/siyuan/issues/15737)
* [改進資料庫匯總欄位篩選](https://github.com/siyuan-note/siyuan/issues/15740)
* [改進資料庫日期欄位篩選](https://github.com/siyuan-note/siyuan/issues/15744)
* [資料庫新增選項時禁止編輯](https://github.com/siyuan-note/siyuan/issues/15751)
* [資料庫條目跨分組拖曳後,同步更新其他檢視中的分組](https://github.com/siyuan-note/siyuan/issues/15755)
* [瀏覽器剪藏擴充功能支援剪藏頁面到資料庫](https://github.com/siyuan-note/siyuan/issues/15758)
* [Android 隱藏底部手勢導覽列](https://github.com/siyuan-note/siyuan/issues/15763)
* [提升資料庫分組檢視效能](https://github.com/siyuan-note/siyuan/issues/15764)
* [拖入多個檔案到編輯器不再被預設程式開啟](https://github.com/siyuan-note/siyuan/pull/15773)
* [改進 HTML 表格剪藏](https://github.com/siyuan-note/siyuan/issues/15781)
* [點選無文件的筆記本時自動新建文件](https://github.com/siyuan-note/siyuan/issues/15782)
* [程式碼片段新增欄位 `disabledInPublish`,用於識別發佈服務中是否已停用](https://github.com/siyuan-note/siyuan/issues/15806)
### 修復缺陷
* [PDF 檔名過長無法產生標註圖片](https://github.com/siyuan-note/siyuan/issues/15739)
* [影片區塊網路網址不正確](https://github.com/siyuan-note/siyuan/issues/15741)
* [資料庫日期欄位無法貼上 0 點時間](https://github.com/siyuan-note/siyuan/issues/15742)
* [預覽模式下無法設定唯讀模式](https://github.com/siyuan-note/siyuan/issues/15756)
* [批次插入檔案到編輯器時異常](https://github.com/siyuan-note/siyuan/issues/15768)
* [部分輸入法在區塊末尾貼上連結後標點符號重複插入](https://github.com/siyuan-note/siyuan/issues/15801)
### 開發者
* [集市插件包元資料新增欄位 `disabledInPublish`,用於識別發布服務中是否已停用](https://github.com/siyuan-note/siyuan/issues/11730)
* [新增外掛程式 `expandDocTree`](https://github.com/siyuan-note/siyuan/issues/15639)
* [改進內核 API `appendBlock`、`insertBlock` 和 `prependBlock`](https://github.com/siyuan-note/siyuan/issues/15798)
## 下載
* [B3log](https://b3log.org/siyuan/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,48 @@
## 概述
该版本改进了一些细节。
## 变更记录
以下是此版本中的详细变更。
### 改进功能
* [折叠标题的复制/剪切改为复制/剪切 `标题及其下方块`,并支持多标题复制/剪切](https://github.com/siyuan-note/siyuan/issues/8019)
* [改进数据库字段编辑菜单](https://github.com/siyuan-note/siyuan/issues/15185)
* [数据库汇总字段筛选规则支持“任一”、“所有”和“没有”](https://github.com/siyuan-note/siyuan/issues/15609)
* [改进闪卡](https://github.com/siyuan-note/siyuan/issues/15699)
* [数据库中新建数据如果在折叠分组内,不再弹出编辑框](https://github.com/siyuan-note/siyuan/issues/15728)
* [代码块选择复制时仅复制纯文本](https://github.com/siyuan-note/siyuan/issues/15733)
* [代码块语言提示搜索内容为空时使用默认排序](https://github.com/siyuan-note/siyuan/issues/15737)
* [改进数据库汇总字段筛选](https://github.com/siyuan-note/siyuan/issues/15740)
* [改进数据库日期字段筛选](https://github.com/siyuan-note/siyuan/issues/15744)
* [数据库添加选项时禁止编辑](https://github.com/siyuan-note/siyuan/issues/15751)
* [数据库条目跨分组拖动后,同步更新其他视图中的分组](https://github.com/siyuan-note/siyuan/issues/15755)
* [浏览器剪藏扩展支持剪藏页面到数据库](https://github.com/siyuan-note/siyuan/issues/15758)
* [Android 隐藏底部手势导航栏](https://github.com/siyuan-note/siyuan/issues/15763)
* [提升数据库分组视图性能](https://github.com/siyuan-note/siyuan/issues/15764)
* [拖入多个文件到编辑器不再被默认程序打开](https://github.com/siyuan-note/siyuan/pull/15773)
* [改进 HTML 表格剪藏](https://github.com/siyuan-note/siyuan/issues/15781)
* [点击无文档的笔记本时自动新建文档](https://github.com/siyuan-note/siyuan/issues/15782)
* [代码片段新增字段 `disabledInPublish`,用于标识发布服务中是否禁用](https://github.com/siyuan-note/siyuan/issues/15806)
### 修复缺陷
* [PDF 文件名过长无法生成标注图片](https://github.com/siyuan-note/siyuan/issues/15739)
* [视频块网络地址不正确](https://github.com/siyuan-note/siyuan/issues/15741)
* [数据库日期字段无法粘贴 0 点时间](https://github.com/siyuan-note/siyuan/issues/15742)
* [预览模式下无法设置只读模式](https://github.com/siyuan-note/siyuan/issues/15756)
* [批量插入文件到编辑器时异常](https://github.com/siyuan-note/siyuan/issues/15768)
* [部分输入法在块末尾粘贴链接后标点符号重复插入](https://github.com/siyuan-note/siyuan/issues/15801)
### 开发者
* [集市插件包元数据新增字段 `disabledInPublish`,用于标识发布服务中是否禁用](https://github.com/siyuan-note/siyuan/issues/11730)
* [新增插件函数 `expandDocTree`](https://github.com/siyuan-note/siyuan/issues/15639)
* [改进内核 API `appendBlock`、`insertBlock` 和 `prependBlock`](https://github.com/siyuan-note/siyuan/issues/15798)
## 下载
* [B3log](https://b3log.org/siyuan/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -3820,7 +3820,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "In the code block, only select the content of the code block"
"Data": "Double press to select all loaded content blocks in the document; in the code block, only select the content of the code block"
}
]
}

View file

@ -6,7 +6,7 @@
"id": "20201204184532-3qm9l8n",
"title": "Template snippet",
"type": "doc",
"updated": "20250801152837"
"updated": "20250828155251"
},
"Children": [
{
@ -57,7 +57,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20210104091444-jy56z0p",
"updated": "20250801152821"
"updated": "20250828155251"
},
"Children": [
{
@ -215,7 +215,7 @@
"ListData": {},
"Properties": {
"id": "20210104091444-mwbvc9m",
"updated": "20250801152821"
"updated": "20250828155251"
},
"Children": [
{
@ -1190,7 +1190,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20240308162632-akk8sxn",
"updated": "20240308162632"
"updated": "20250828155241"
},
"Children": [
{
@ -1204,7 +1204,136 @@
},
{
"Type": "NodeText",
"Data": ": This function is used to return the week"
"Data": ": This function returns the current week"
}
]
}
]
},
{
"ID": "20250828155216-zn0i9zg",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828155216-zn0i9zg",
"updated": "20250828155216"
},
"Children": [
{
"ID": "20250828155216-p5tgk3f",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828155216-p5tgk3f",
"updated": "20250828155232"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOMonth"
},
{
"Type": "NodeText",
"Data": ": This function returns the current month"
}
]
}
]
},
{
"ID": "20250828155242-k9x8rc7",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828155242-k9x8rc7",
"updated": "20250828155242"
},
"Children": [
{
"ID": "20250828155242-zwalrdw",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828155242-zwalrdw",
"updated": "20250828155246"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOYear"
},
{
"Type": "NodeText",
"Data": ": This function returns the current year"
}
]
}
]
},
{
"ID": "20250828155247-992wou3",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828155247-992wou3",
"updated": "20250828155251"
},
"Children": [
{
"ID": "20250828155247-ow57gpr",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828155247-ow57gpr",
"updated": "20250828155251"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOWeekDate"
},
{
"Type": "NodeText",
"Data": ": This function returns the date of a specified day of the week using "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "time.Time"
},
{
"Type": "NodeText",
"Data": ". For example, "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".action{ now | ISOWeekDate 4 | date \"2006-01-02\" }"
},
{
"Type": "NodeText",
"Data": " returns the date of this Thursday"
}
]
}

View file

@ -102,7 +102,7 @@
},
{
"Type": "NodeText",
"Data": " to enter the publishing service settings panel."
"Data": " to enter the publish service settings panel."
}
]
}
@ -252,7 +252,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "If access control is required for the publishing service:"
"Data": "If access control is required for the publish service:"
}
]
},
@ -333,7 +333,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "When enabled, the publishing service will use the "
"Data": "When enabled, the publish service will use the "
},
{
"Type": "NodeTextMark",
@ -482,7 +482,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "After enabling the publishing service, visitors can browse the content of the entire workspace."
"Data": "After enabling the publish service, visitors can browse the content of the entire workspace."
}
]
}

View file

@ -5,7 +5,8 @@
"Properties": {
"id": "20230805232134-3d6mx2k",
"title": "Search asset content",
"updated": "20231026085302"
"type": "doc",
"updated": "20250903163017"
},
"Children": [
{
@ -46,7 +47,7 @@
"ListData": {},
"Properties": {
"id": "20230818102341-ny18orr",
"updated": "20230818102341"
"updated": "20250903163017"
},
"Children": [
{
@ -58,7 +59,7 @@
},
"Properties": {
"id": "20230818102341-eg8labw",
"updated": "20230818102341"
"updated": "20250903163017"
},
"Children": [
{
@ -66,12 +67,318 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102341-izc16tp",
"updated": "20230818102426"
"updated": "20250903163017"
},
"Children": [
{
"Type": "NodeText",
"Data": "Text files (.txt, .md, .json, .log, .sql, .html, .xml, .java, .h, .c, .cpp, .go, .rs, .swift, .kt, . py, .php, .js, .css, .ts, .sh, .bat, .cmd, .ini, .yaml, .rst, .adoc, .textile, .opml, .org, .wiki)"
"Data": "Text files ("
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".txt"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".md"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".markdown"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".json"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".log"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sql"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".html"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xml"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".java"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".h"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".c"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cpp"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".go"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rs"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".swift"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".kt"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".py"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".php"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".js"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".css"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ts"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sh"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".bat"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cmd"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ini"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".yaml"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rst"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".adoc"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".textile"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".opml"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".org"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".wiki"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".epub"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cs"
},
{
"Type": "NodeText",
"Data": ")"
}
]
}
@ -85,7 +392,8 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818102427-os9c4nm"
"id": "20230818102427-os9c4nm",
"updated": "20250903162955"
},
"Children": [
{
@ -93,12 +401,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102427-dyojs23",
"updated": "20230818102429"
"updated": "20250903162955"
},
"Children": [
{
"Type": "NodeText",
"Data": ".docx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".docx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -112,7 +429,8 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818102430-sw9p4uf"
"id": "20230818102430-sw9p4uf",
"updated": "20250903162956"
},
"Children": [
{
@ -120,12 +438,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102430-boci4wf",
"updated": "20230818102431"
"updated": "20250903162956"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pptx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pptx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -139,7 +466,8 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818102432-6uclx4n"
"id": "20230818102432-6uclx4n",
"updated": "20250903162957"
},
"Children": [
{
@ -147,12 +475,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102432-3n95b7k",
"updated": "20230818102433"
"updated": "20250903162957"
},
"Children": [
{
"Type": "NodeText",
"Data": ".xlsx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xlsx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -166,19 +503,30 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818102434-9xgwy7r"
"id": "20230818102434-9xgwy7r",
"updated": "20250903162959"
},
"Children": [
{
"ID": "20230818102434-1efdkw9",
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102434-1efdkw9"
"id": "20230818102434-1efdkw9",
"updated": "20250903162959"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pdf"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pdf"
},
{
"Type": "NodeText",
"Data": ""
}
]
}

View file

@ -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": "."
}
]
}
]
}

View file

@ -3818,7 +3818,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "代码块中使用时仅选中代码块中的内容"
"Data": "连续按下两次以选中文档中所有已加载的内容块;代码块中使用时仅选中代码块中的内容"
}
]
}

View file

@ -6,7 +6,7 @@
"id": "20201204181006-7bkppue",
"title": "模板片段",
"type": "doc",
"updated": "20250801152724"
"updated": "20250828154937"
},
"Children": [
{
@ -69,7 +69,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20210104091309-fhb549c",
"updated": "20250801152510"
"updated": "20250828154937"
},
"Children": [
{
@ -237,7 +237,7 @@
"ListData": {},
"Properties": {
"id": "20210104091309-gjkg3u5",
"updated": "20250801152510"
"updated": "20250828154937"
},
"Children": [
{
@ -271,7 +271,15 @@
},
{
"Type": "NodeText",
"Data": "​:该变量用于插入当前文档名。比如模板内容为 "
"Data": "​:该变量用于插入当前文档名。比如"
},
{
"Type": "NodeText",
"Data": "模板"
},
{
"Type": "NodeText",
"Data": "内容为 "
},
{
"Type": "NodeTextMark",
@ -391,7 +399,11 @@
},
{
"Type": "NodeText",
"Data": "​:该变量用于插入当前文档别名"
"Data": "​:该变量用于插入当前"
},
{
"Type": "NodeText",
"Data": "文档别名"
}
]
}
@ -465,7 +477,19 @@
},
{
"Type": "NodeText",
"Data": "​:该函数用于查询数据库,返回值为 blocks 列表"
"Data": "​:该函数用于查询"
},
{
"Type": "NodeText",
"Data": "数据库"
},
{
"Type": "NodeText",
"Data": ",返回值为 blocks "
},
{
"Type": "NodeText",
"Data": "列表"
}
]
},
@ -530,7 +554,15 @@
},
{
"Type": "NodeText",
"Data": "​:该函数用于根据块 ID 查询数据库,返回值为 block"
"Data": "​:该函数用于根据块 ID 查询"
},
{
"Type": "NodeText",
"Data": "数据库"
},
{
"Type": "NodeText",
"Data": ",返回值为 block"
}
]
},
@ -594,7 +626,19 @@
},
{
"Type": "NodeText",
"Data": "​:该函数用于查询数据库,返回值为 spans 列表"
"Data": "​:该函数用于查询"
},
{
"Type": "NodeText",
"Data": "数据库"
},
{
"Type": "NodeText",
"Data": ",返回值为 spans "
},
{
"Type": "NodeText",
"Data": "列表"
}
]
},
@ -659,7 +703,15 @@
},
{
"Type": "NodeText",
"Data": "​:该函数用于查询数据库,返回值为结果集"
"Data": "​:该函数用于查询"
},
{
"Type": "NodeText",
"Data": "数据库"
},
{
"Type": "NodeText",
"Data": ",返回值为结果集"
}
]
},
@ -1204,7 +1256,7 @@
},
"Properties": {
"id": "20240308162139-yt96e2z",
"updated": "20240308162139"
"updated": "20250828154937"
},
"Children": [
{
@ -1212,7 +1264,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20240308162139-x4evb04",
"updated": "20240308162153"
"updated": "20250828154937"
},
"Children": [
{
@ -1226,7 +1278,136 @@
},
{
"Type": "NodeText",
"Data": "​:该函数用于返回第几周"
"Data": "​:该函数用于返回当前周"
}
]
}
]
},
{
"ID": "20250828154237-r8vhx3a",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828154237-r8vhx3a",
"updated": "20250828154248"
},
"Children": [
{
"ID": "20250828154237-2kgeyrr",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828154237-2kgeyrr",
"updated": "20250828154248"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOMonth"
},
{
"Type": "NodeText",
"Data": "​:该函数用于返回当前月份"
}
]
}
]
},
{
"ID": "20250828154157-thdko4b",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828154157-thdko4b",
"updated": "20250828154157"
},
"Children": [
{
"ID": "20250828154157-s8wsy4j",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828154157-s8wsy4j",
"updated": "20250828154231"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOYear"
},
{
"Type": "NodeText",
"Data": "​:该函数用于返回当前年份"
}
]
}
]
},
{
"ID": "20250828154232-7ryi07m",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828154232-7ryi07m",
"updated": "20250828154731"
},
"Children": [
{
"ID": "20250828154232-97gwy4i",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828154232-97gwy4i",
"updated": "20250828154731"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOWeekDate"
},
{
"Type": "NodeText",
"Data": "​:该函数用于返回指定周几的日期 "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "time.Time"
},
{
"Type": "NodeText",
"Data": "​,例如返回本周四的日期 "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".action{ now | ISOWeekDate 4 | date \"2006-01-02\" }"
},
{
"Type": "NodeText",
"Data": ""
}
]
}

View file

@ -5,7 +5,8 @@
"Properties": {
"id": "20230805230218-aea8icj",
"title": "搜索资源文件内容",
"updated": "20231026085139"
"type": "doc",
"updated": "20250903162923"
},
"Children": [
{
@ -46,7 +47,7 @@
"ListData": {},
"Properties": {
"id": "20230818101450-4a6lzdg",
"updated": "20230818101545"
"updated": "20250903162923"
},
"Children": [
{
@ -58,7 +59,7 @@
},
"Properties": {
"id": "20230818101510-rfacaaf",
"updated": "20230818101800"
"updated": "20250903162915"
},
"Children": [
{
@ -66,12 +67,318 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818101510-duzarcy",
"updated": "20230818101800"
"updated": "20250903162915"
},
"Children": [
{
"Type": "NodeText",
"Data": "文本文件(.txt、.md、.json、.log、.sql、.html、.xml、.java、.h、.c、.cpp、.go、.rs、.swift、.kt、.py、.php、.js、.css、.ts、.sh、.bat、.cmd、.ini、.yaml、.rst、.adoc、.textile、.opml、.org、.wiki"
"Data": "文本文件("
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".txt"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".md"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".markdown"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".json"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".log"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sql"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".html"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xml"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".java"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".h"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".c"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cpp"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".go"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rs"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".swift"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".kt"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".py"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".php"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".js"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".css"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ts"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sh"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".bat"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cmd"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ini"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".yaml"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rst"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".adoc"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".textile"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".opml"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".org"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".wiki"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".epub"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cs"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -85,7 +392,8 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818101513-x5baw16"
"id": "20230818101513-x5baw16",
"updated": "20250903162918"
},
"Children": [
{
@ -93,12 +401,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818101513-558ntbl",
"updated": "20230818101520"
"updated": "20250903162918"
},
"Children": [
{
"Type": "NodeText",
"Data": ".docx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".docx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -112,7 +429,8 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818101521-n1r8yqv"
"id": "20230818101521-n1r8yqv",
"updated": "20250903162920"
},
"Children": [
{
@ -120,12 +438,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818101521-mutuxqo",
"updated": "20230818101526"
"updated": "20250903162920"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pptx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pptx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -139,7 +466,8 @@
"Marker": "Kg=="
},
"Properties": {
"id": "20230818101526-oortrwo"
"id": "20230818101526-oortrwo",
"updated": "20250903162921"
},
"Children": [
{
@ -147,12 +475,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818101526-t4uvb3w",
"updated": "20230818101529"
"updated": "20250903162921"
},
"Children": [
{
"Type": "NodeText",
"Data": ".xlsx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xlsx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -167,7 +504,7 @@
},
"Properties": {
"id": "20230818101543-ejcoq3j",
"updated": "20230818101545"
"updated": "20250903162923"
},
"Children": [
{
@ -175,12 +512,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818101543-36waszk",
"updated": "20230818101545"
"updated": "20250903162923"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pdf"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pdf"
},
{
"Type": "NodeText",
"Data": ""
}
]
}

View file

@ -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": "​。"
}
]
}
]
}

View file

@ -3808,7 +3808,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "代碼塊中使用時僅選中代碼塊中的內容"
"Data": "連續按下兩次以選中文檔中所有已加載的內容塊;代碼塊中使用時僅選中代碼塊中的內容"
}
]
}

View file

@ -6,7 +6,7 @@
"id": "20211226123004-dplpw0o",
"title": "範本片段",
"type": "doc",
"updated": "20250801152721"
"updated": "20250828155154"
},
"Children": [
{
@ -53,7 +53,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20211226123024-eyagqur",
"updated": "20250801152602"
"updated": "20250828155154"
},
"Children": [
{
@ -208,7 +208,7 @@
"ListData": {},
"Properties": {
"id": "20211226123024-pjvw31z",
"updated": "20250801152602"
"updated": "20250828155154"
},
"Children": [
{
@ -436,7 +436,19 @@
},
{
"Type": "NodeText",
"Data": "​:該函數用於查詢資料庫,返回值為 blocks 列表"
"Data": "​:該函數用於查詢"
},
{
"Type": "NodeText",
"Data": "資料庫"
},
{
"Type": "NodeText",
"Data": ",返回值為 blocks "
},
{
"Type": "NodeText",
"Data": "列表"
}
]
},
@ -501,7 +513,15 @@
},
{
"Type": "NodeText",
"Data": "​:函數用於根據塊 ID 查詢資料庫,傳回值為 block"
"Data": "​:函數用於根據塊 ID 查詢"
},
{
"Type": "NodeText",
"Data": "資料庫"
},
{
"Type": "NodeText",
"Data": ",傳回值為 block"
}
]
},
@ -565,7 +585,19 @@
},
{
"Type": "NodeText",
"Data": "​:該函數用於查詢資料庫,返回值為 spans 列表"
"Data": "​:該函數用於查詢"
},
{
"Type": "NodeText",
"Data": "資料庫"
},
{
"Type": "NodeText",
"Data": ",返回值為 spans "
},
{
"Type": "NodeText",
"Data": "列表"
}
]
},
@ -630,7 +662,15 @@
},
{
"Type": "NodeText",
"Data": "​:函數用於查詢資料庫,傳回值為結果集"
"Data": "​:函數用於查詢"
},
{
"Type": "NodeText",
"Data": "資料庫"
},
{
"Type": "NodeText",
"Data": ",傳回值為結果集"
}
]
},
@ -1183,7 +1223,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20240308162753-tde2ifs",
"updated": "20240308162753"
"updated": "20250828154943"
},
"Children": [
{
@ -1197,7 +1237,136 @@
},
{
"Type": "NodeText",
"Data": "​:此函數用於傳回第幾週"
"Data": "​:此函數用於傳回目前週"
}
]
}
]
},
{
"ID": "20250828154909-wxnydc5",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828154909-wxnydc5",
"updated": "20250828154909"
},
"Children": [
{
"ID": "20250828154909-3grwety",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828154909-3grwety",
"updated": "20250828154910"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOMonth"
},
{
"Type": "NodeText",
"Data": "​:此函數用於傳回目前月份"
}
]
}
]
},
{
"ID": "20250828154911-8n67tvc",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828154911-8n67tvc",
"updated": "20250828154911"
},
"Children": [
{
"ID": "20250828154911-bb7z59o",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828154911-bb7z59o",
"updated": "20250828154916"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOYear"
},
{
"Type": "NodeText",
"Data": "​:此函數用於傳回目前年份"
}
]
}
]
},
{
"ID": "20250828154949-xhbwn4e",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828154949-xhbwn4e",
"updated": "20250828155154"
},
"Children": [
{
"ID": "20250828154949-5lcfpbs",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828154949-5lcfpbs",
"updated": "20250828155154"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOWeekDate"
},
{
"Type": "NodeText",
"Data": "​:此函數用於傳回指定週幾的日期 "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "time.Time"
},
{
"Type": "NodeText",
"Data": "​,例如傳回本週四的日期 "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".action{ now | ISOWeekDate 4 | date \"2006-01-02\" }"
},
{
"Type": "NodeText",
"Data": ""
}
]
}

View file

@ -5,7 +5,8 @@
"Properties": {
"id": "20230805232920-5fdco36",
"title": "搜索資源文件內容",
"updated": "20231026085346"
"type": "doc",
"updated": "20250903162952"
},
"Children": [
{
@ -46,7 +47,7 @@
"ListData": {},
"Properties": {
"id": "20230818102501-gq9fesz",
"updated": "20230818102519"
"updated": "20250903162952"
},
"Children": [
{
@ -58,7 +59,7 @@
},
"Properties": {
"id": "20230818102501-2qu8flm",
"updated": "20230818102519"
"updated": "20250903162947"
},
"Children": [
{
@ -66,12 +67,318 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102501-p1l631d",
"updated": "20230818102519"
"updated": "20250903162947"
},
"Children": [
{
"Type": "NodeText",
"Data": "文本文件(.txt、.md、.json、.log、.sql、.html、.xml、.java、.h、.c、.cpp、.go、.rs、.swift、.kt、.py、.php、.js、.css、.ts、.sh、.bat、.cmd、.ini、.yaml、.rst、.adoc、.textile、.opml、.org、.wiki"
"Data": "文本文件("
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".txt"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".md"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".markdown"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".json"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".log"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sql"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".html"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xml"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".java"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".h"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".c"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cpp"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".go"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rs"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".swift"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".kt"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".py"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".php"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".js"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".css"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ts"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sh"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".bat"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cmd"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ini"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".yaml"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rst"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".adoc"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".textile"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".opml"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".org"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".wiki"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".epub"
},
{
"Type": "NodeText",
"Data": "​、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cs"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -86,7 +393,7 @@
},
"Properties": {
"id": "20230818102501-8jue7y8",
"updated": "20230818102501"
"updated": "20250903162949"
},
"Children": [
{
@ -94,12 +401,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102501-fom9qf4",
"updated": "20230818102501"
"updated": "20250903162949"
},
"Children": [
{
"Type": "NodeText",
"Data": ".docx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".docx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -114,7 +430,7 @@
},
"Properties": {
"id": "20230818102501-609htp0",
"updated": "20230818102501"
"updated": "20250903162950"
},
"Children": [
{
@ -122,12 +438,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102501-fu9up7s",
"updated": "20230818102501"
"updated": "20250903162950"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pptx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pptx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -142,7 +467,7 @@
},
"Properties": {
"id": "20230818102501-cjozdv1",
"updated": "20230818102501"
"updated": "20250903162951"
},
"Children": [
{
@ -150,12 +475,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102501-ewonoc2",
"updated": "20230818102501"
"updated": "20250903162951"
},
"Children": [
{
"Type": "NodeText",
"Data": ".xlsx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xlsx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -170,7 +504,7 @@
},
"Properties": {
"id": "20230818102501-ljun2c0",
"updated": "20230818102501"
"updated": "20250903162952"
},
"Children": [
{
@ -178,12 +512,21 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20230818102501-w0e68xh",
"updated": "20230818102501"
"updated": "20250903162952"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pdf"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pdf"
},
{
"Type": "NodeText",
"Data": ""
}
]
}

View file

@ -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": "​。"
}
]
}
]
}

View file

@ -7,7 +7,7 @@
"id": "20240530101000-5k5d5i3",
"title": "アセットの内容検索",
"type": "doc",
"updated": "20240530101000"
"updated": "20250903163024"
},
"Children": [
{
@ -50,7 +50,7 @@
"Properties": {
"ID": "20240530101000-gui4fuq",
"id": "20240530101000-dy607mr",
"updated": "20240530101000"
"updated": "20250903163024"
},
"Children": [
{
@ -63,21 +63,326 @@
"Properties": {
"ID": "20240530101000-d6fzgev",
"id": "20240530101000-423ygdo",
"updated": "20240530101000"
"updated": "20250903163024"
},
"Children": [
{
"ID": "20240530101000-5htsgo0",
"Type": "NodeParagraph",
"Properties": {
"ID": "20240530101000-lunnpt0",
"id": "20240530101000-5htsgo0",
"updated": "20240530101000"
"updated": "20250903163024"
},
"Children": [
{
"Type": "NodeText",
"Data": "テキストファイル (.txt, .md, .json, .log, .sql, .html, .xml, .java, .h, .c, .cpp, .go, .rs, .swift, .kt, . py, .php, .js, .css, .ts, .sh, .bat, .cmd, .ini, .yaml, .rst, .adoc, .textile, .opml, .org, .wiki)"
"Data": "テキストファイル ("
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".txt"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".md"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".markdown"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".json"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".log"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sql"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".html"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xml"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".java"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".h"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".c"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cpp"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".go"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rs"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".swift"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".kt"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".py"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".php"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".js"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".css"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ts"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".sh"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".bat"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cmd"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".ini"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".yaml"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".rst"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".adoc"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".textile"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".opml"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".org"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".wiki"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".epub"
},
{
"Type": "NodeText",
"Data": ", "
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".cs"
},
{
"Type": "NodeText",
"Data": ")"
}
]
}
@ -92,21 +397,30 @@
},
"Properties": {
"ID": "20240530101000-jhc3a4i",
"id": "20240530101000-ddgjyye"
"id": "20240530101000-ddgjyye",
"updated": "20250903163001"
},
"Children": [
{
"ID": "20240530101000-alu1ygl",
"Type": "NodeParagraph",
"Properties": {
"ID": "20240530101000-cznhpu3",
"id": "20240530101000-alu1ygl",
"updated": "20240530101000"
"updated": "20250903163001"
},
"Children": [
{
"Type": "NodeText",
"Data": ".docx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".docx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -121,21 +435,30 @@
},
"Properties": {
"ID": "20240530101000-0t3jtob",
"id": "20240530101000-t8ewu5o"
"id": "20240530101000-t8ewu5o",
"updated": "20250903163002"
},
"Children": [
{
"ID": "20240530101000-afub9kt",
"Type": "NodeParagraph",
"Properties": {
"ID": "20240530101000-isl867u",
"id": "20240530101000-afub9kt",
"updated": "20240530101000"
"updated": "20250903163002"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pptx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pptx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -150,21 +473,30 @@
},
"Properties": {
"ID": "20240530101000-79w2hmi",
"id": "20240530101000-6c3or97"
"id": "20240530101000-6c3or97",
"updated": "20250903163003"
},
"Children": [
{
"ID": "20240530101000-p5qs8ir",
"Type": "NodeParagraph",
"Properties": {
"ID": "20240530101000-zo7jhc4",
"id": "20240530101000-p5qs8ir",
"updated": "20240530101000"
"updated": "20250903163003"
},
"Children": [
{
"Type": "NodeText",
"Data": ".xlsx"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".xlsx"
},
{
"Type": "NodeText",
"Data": ""
}
]
}
@ -179,20 +511,30 @@
},
"Properties": {
"ID": "20240530101000-nm831gm",
"id": "20240530101000-napqxcr"
"id": "20240530101000-napqxcr",
"updated": "20250903163004"
},
"Children": [
{
"ID": "20240530101000-vknnawk",
"Type": "NodeParagraph",
"Properties": {
"ID": "20240530101000-l05rbi9",
"id": "20240530101000-vknnawk"
"id": "20240530101000-vknnawk",
"updated": "20250903163004"
},
"Children": [
{
"Type": "NodeText",
"Data": ".pdf"
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".pdf"
},
{
"Type": "NodeText",
"Data": ""
}
]
}

View file

@ -7,7 +7,7 @@
"id": "20240530101000-6x9ivi7",
"title": "テンプレートスニペット",
"type": "doc",
"updated": "20250801152939"
"updated": "20250828155138"
},
"Children": [
{
@ -66,7 +66,7 @@
"Properties": {
"ID": "20240530101000-5nvn9ad",
"id": "20240530101000-pi05yzt",
"updated": "20250801152922"
"updated": "20250828155138"
},
"Children": [
{
@ -226,7 +226,7 @@
"ListData": {},
"Properties": {
"id": "20240530101000-by5hqnb",
"updated": "20250801152922"
"updated": "20250828155138"
},
"Children": [
{
@ -260,7 +260,15 @@
},
{
"Type": "NodeText",
"Data": ": この変数は現在のドキュメント名を挿入します。たとえば、テンプレートの内容が "
"Data": ": この変数は現在のドキュメント名を挿入します。たとえば、"
},
{
"Type": "NodeText",
"Data": "テンプレート"
},
{
"Type": "NodeText",
"Data": "の内容が "
},
{
"Type": "NodeTextMark",
@ -454,7 +462,15 @@
},
{
"Type": "NodeText",
"Data": ": この関数はデータベースをクエリしてブロックのリストを返します"
"Data": ": この関数は"
},
{
"Type": "NodeText",
"Data": "データベース"
},
{
"Type": "NodeText",
"Data": "をクエリしてブロックのリストを返します"
}
]
},
@ -519,7 +535,15 @@
},
{
"Type": "NodeText",
"Data": ": この関数はブロックIDに基づいてデータベースを照会するために使用され、戻り値はブロックです"
"Data": ": この関数はブロックIDに基づいて"
},
{
"Type": "NodeText",
"Data": "データベース"
},
{
"Type": "NodeText",
"Data": "を照会するために使用され、戻り値はブロックです"
}
]
},
@ -583,7 +607,15 @@
},
{
"Type": "NodeText",
"Data": ": この関数はデータベースをクエリしてスパンのリストを返します"
"Data": ": この関数は"
},
{
"Type": "NodeText",
"Data": "データベース"
},
{
"Type": "NodeText",
"Data": "をクエリしてスパンのリストを返します"
}
]
},
@ -648,7 +680,15 @@
},
{
"Type": "NodeText",
"Data": ": この関数はデータベースへのクエリに使用され、戻り値は結果セットです"
"Data": ": この関数は"
},
{
"Type": "NodeText",
"Data": "データベース"
},
{
"Type": "NodeText",
"Data": "へのクエリに使用され、戻り値は結果セットです"
}
]
},
@ -1221,6 +1261,135 @@
}
]
},
{
"ID": "20250828155049-69k1o8n",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828155049-69k1o8n",
"updated": "20250828155049"
},
"Children": [
{
"ID": "20250828155049-vbcmh76",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828155049-vbcmh76",
"updated": "20250828155051"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOMonth"
},
{
"Type": "NodeText",
"Data": ": この関数は現在の月を返します"
}
]
}
]
},
{
"ID": "20250828155051-8r71644",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828155051-8r71644",
"updated": "20250828155051"
},
"Children": [
{
"ID": "20250828155051-d8e3faa",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828155051-d8e3faa",
"updated": "20250828155057"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOYear"
},
{
"Type": "NodeText",
"Data": ": この関数は現在の年を返します"
}
]
}
]
},
{
"ID": "20250828155057-hqlahyc",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20250828155057-hqlahyc",
"updated": "20250828155138"
},
"Children": [
{
"ID": "20250828155057-s2ugs9d",
"Type": "NodeParagraph",
"Properties": {
"id": "20250828155057-s2ugs9d",
"updated": "20250828155138"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "ISOWeekDate"
},
{
"Type": "NodeText",
"Data": ": この関数は、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": "time.Time"
},
{
"Type": "NodeText",
"Data": " を使用して指定された曜日の日付を返します。例えば、"
},
{
"Type": "NodeTextMark",
"TextMarkType": "code",
"TextMarkTextContent": ".action{now | ISOWeekDate 4 | date \"2006-01-02\" }"
},
{
"Type": "NodeText",
"Data": " は今週の木曜日の日付を返します"
}
]
}
]
},
{
"ID": "20240530101000-q2rf0ys",
"Type": "NodeListItem",

View file

@ -3775,7 +3775,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "コードブロックではコードのみが選択されます"
"Data": "文書内のすべてのロード済みコンテンツブロックを選択するにはダブルプレスしてください;コードブロックではコードのみが選択されます"
}
]
}

View file

@ -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": " から、定期的にインデックスを最適化することをお勧めします。"
}
]
}
]
}

View file

@ -1,10 +1,10 @@
{
"name": "SiYuan",
"version": "3.2.1",
"version": "3.3.2",
"description": "Refactor your thinking",
"homepage": "https://b3log.org/siyuan",
"main": "./electron/main.js",
"packageManager": "pnpm@10.14.0",
"packageManager": "pnpm@10.15.1",
"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.6",
"electron": "37.4.0",
"electron-builder": "26.0.12",
"encoding": "^0.1.13",
"esbuild-loader": "^3.0.1",

1004
app/pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -62,7 +62,7 @@ export const pdfResize = () => {
export const genAssetHTML = (type: string, pathString: string, imgName: string, linkName: string) => {
let html = "";
if (Constants.SIYUAN_ASSETS_AUDIO.includes(type)) {
html = `<div data-node-id="${Lute.NewNodeID()}" data-type="NodeAudio" class="iframe" updated="${dayjs().format("YYYYMMDDHHmmss")}"><div class="iframe-content"><audio controls="controls" src="${pathString}" data-src="${pathString}"></audio>${Constants.ZWSP}</div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
html = `<div data-node-id="${Lute.NewNodeID()}" data-type="NodeAudio" class="iframe" updated="${dayjs().format("YYYYMMDDHHmmss")}"><div class="iframe-content"><audio controls="controls" src="${pathString}"></audio>${Constants.ZWSP}</div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
} else if (Constants.SIYUAN_ASSETS_IMAGE.includes(type)) {
let netHTML = "";
if (!pathString.startsWith("assets/")) {
@ -70,7 +70,7 @@ export const genAssetHTML = (type: string, pathString: string, imgName: string,
}
html = `<span contenteditable="false" data-type="img" class="img"><span> </span><span><span class="protyle-action protyle-icons"><span class="protyle-icon protyle-icon--only"><svg><use xlink:href="#iconMore"></use></svg></span></span><img src="${pathString}" data-src="${pathString}" alt="${imgName}" /><span class="protyle-action__drag"></span>${netHTML}<span class="protyle-action__title"></span></span><span> </span></span>`;
} else if (Constants.SIYUAN_ASSETS_VIDEO.includes(type)) {
html = `<div data-node-id="${Lute.NewNodeID()}" data-type="NodeVideo" class="iframe" updated="${dayjs().format("YYYYMMDDHHmmss")}"><div class="iframe-content">${Constants.ZWSP}<video controls="controls" src="${pathString}" data-src="${pathString}"></video><span class="protyle-action__drag" contenteditable="false"></span></div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
html = `<div data-node-id="${Lute.NewNodeID()}" data-type="NodeVideo" class="iframe" updated="${dayjs().format("YYYYMMDDHHmmss")}"><div class="iframe-content">${Constants.ZWSP}<video controls="controls" src="${pathString}"></video><span class="protyle-action__drag" contenteditable="false"></span></div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
} else {
html = `<span data-type="a" data-href="${pathString}">${linkName}</span>`;
}

View file

@ -7,17 +7,15 @@
margin-bottom: 4px !important;
&:hover {
.av__views .block__icon {
opacity: 1;
}
.av__views .block__icon,
.av__group-icon--hover {
display: block;
opacity: 1;
}
}
&--touch {
.av__views .block__icon,
.av__group-icon--hover,
.av__row--footer .av__calc {
opacity: 1;
}
@ -399,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);
@ -420,30 +413,66 @@
cursor: default;
}
&[data-dtype="mAsset"],
&[data-dtype="mSelect"],
&[data-dtype="select"] {
margin-left: -2px;
&[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;
}
}
&--edit .av__cell {
padding: 2px 4px !important;
min-height: calc(1.625em + 4px) !important;
&--edit .av__gallery-field[data-empty="true"] .av__gallery-tip {
display: block;
}
&[data-dtype="mAsset"][data-empty="true"],
&[data-dtype="mSelect"][data-empty="true"],
&[data-dtype="select"][data-empty="true"] {
margin-left: 0;
}
&:not(.av__gallery-fields--edit) [data-empty="true"] {
display: none;
}
}
.b3-menu__avemoji {
display: none;
}
&-field {
position: relative;
}
&[data-empty="true"] .av__gallery-tip {
display: flex;
}
&-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;
}
}
@ -479,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 {
@ -580,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;
}
@ -685,10 +677,10 @@
}
&--relation {
margin-left: 12px;
margin-right: 12px;
&:first-child {
margin-left: 0;
&:last-child {
margin-right: 0;
}
}
@ -841,6 +833,7 @@
&__label {
overflow: hidden;
min-height: 30px;
}
&__icon.fn__grab {
@ -947,7 +940,7 @@
&-icon {
cursor: pointer;
color: var(--b3-theme-on-surface-light);
translate: var(--b3-transition);
transition: var(--b3-transition), opacity 0.3s cubic-bezier(0, 0, 0.2, 1) 0ms;
border-radius: var(--b3-border-radius);
&:hover {
@ -960,12 +953,12 @@
float: left;
width: calc(1.625em - 12px);
height: calc(1.625em - 12px);
transition: transform 0.15s cubic-bezier(0, 0, 0.2, 1), opacity 1s cubic-bezier(0, 0, 0.2, 1);
transition: transform 0.15s cubic-bezier(0, 0, 0.2, 1);
font-size: 87.5%;
}
&--hover {
display: none;
opacity: 0;
svg {
padding: 4px;
@ -990,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;
}
}
}

View file

@ -28,6 +28,14 @@
&[data-type="select"] {
padding-left: 6px;
}
span.b3-menu__avemoji {
line-height: 26px;
img {
margin-top: 6px;
}
}
}
&__avheader {

View file

@ -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;

View file

@ -29,6 +29,11 @@
&:hover {
background-color: transparent;
}
svg, img {
height: 20px;
width: 20px;
}
}
&__graphic {

View file

@ -86,16 +86,16 @@
& > div {
padding-left: 100%;
position: relative;
height: 26px;
min-height: 1.625em;
&::after {
position: absolute;
content: " ";
height: 1px;
height: calc(1em / 16);
background-color: var(--b3-theme-background-light);
width: calc(100% - 1px);
left: 0;
top: 13px;
top: calc(1.625em / 2);
}
}
}

View file

@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, viewport-fit=cover, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<link rel="apple-touch-icon" href="../../icon.png">
<style id="editorAttr" type="text/css"></style>

View file

@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, viewport-fit=cover, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials">
<link rel="apple-touch-icon" href="../../icon.png">

View file

@ -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) {
@ -308,7 +309,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
}
});
if (hasToolbar) {
break;
break;
}
item.destroy();
}

View file

@ -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");

View file

@ -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)) {
if (currentLiElement.previousElementSibling) {
currentLiElement.previousElementSibling.classList.add("b3-list-item--focus");
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.parentElement.lastElementChild.classList.add("b3-list-item--focus");
currentLiElement.removeAttribute("data-original");
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.lastElementChild) {
currentLiElement.parentElement.nextElementSibling.lastElementChild.classList.add("b3-list-item--focus");
} else {
currentLiElement.parentElement.lastElementChild.classList.add("b3-list-item--focus");
while (true) {
if (currentLiElement.previousElementSibling) {
currentLiElement = currentLiElement.previousElementSibling;
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.removeAttribute("data-original");
currentLiElement = currentLiElement.parentElement.lastElementChild;
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.lastElementChild) {
currentLiElement = currentLiElement.parentElement.nextElementSibling.lastElementChild;
} else {
currentLiElement = currentLiElement.parentElement.lastElementChild;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement = currentLiElement.parentElement.previousElementSibling.lastElementChild;
} else if (isWindow()) {
currentLiElement = currentLiElement.parentElement.lastElementChild;
}
if (currentLiElement.getBoundingClientRect().height !== 0) {
break;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement.parentElement.previousElementSibling.lastElementChild.classList.add("b3-list-item--focus");
}
currentLiElement.classList.add("b3-list-item--focus");
} else {
if (currentLiElement.nextElementSibling) {
currentLiElement.nextElementSibling.classList.add("b3-list-item--focus");
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.parentElement.firstElementChild.classList.add("b3-list-item--focus");
currentLiElement.removeAttribute("data-original");
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.firstElementChild) {
currentLiElement.parentElement.nextElementSibling.firstElementChild.classList.add("b3-list-item--focus");
} else {
currentLiElement.parentElement.firstElementChild.classList.add("b3-list-item--focus");
while (true) {
if (currentLiElement.nextElementSibling) {
currentLiElement = currentLiElement.nextElementSibling;
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.removeAttribute("data-original");
currentLiElement = currentLiElement.parentElement.firstElementChild;
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.firstElementChild) {
currentLiElement = currentLiElement.parentElement.nextElementSibling.firstElementChild;
} else {
currentLiElement = currentLiElement.parentElement.firstElementChild;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement = currentLiElement.parentElement.previousElementSibling.firstElementChild;
} else if (isWindow()) {
currentLiElement = currentLiElement.parentElement.firstElementChild;
}
if (currentLiElement.getBoundingClientRect().height !== 0) {
break;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement.parentElement.previousElementSibling.firstElementChild.classList.add("b3-list-item--focus");
}
currentLiElement.classList.add("b3-list-item--focus");
}
currentLiElement = switchDialog.element.querySelector(".b3-list-item--focus");
if (currentLiElement) {
const rootId = currentLiElement.getAttribute("data-node-id");
if (rootId) {

View file

@ -67,10 +67,14 @@ export const viewCards = (app: App, deckID: string, title: string, deckType: "Tr
if (response.data.blocks.length > 0) {
edit = new Protyle(app, dialog.element.querySelector("#cardPreview") as HTMLElement, {
blockId: "",
action: [Constants.CB_GET_ALL],
render: {
gutter: true,
breadcrumbDocName: true
breadcrumbDocName: true,
title: true,
hideTitleOnZoom: true,
},
typewriterMode: false
});
if (window.siyuan.mobile) {
window.siyuan.mobile.popEditor = edit;
@ -310,6 +314,10 @@ const getArticle = (edit: Protyle, id: string) => {
data: getResponse,
protyle: edit.protyle,
action: getResponse.data.rootID === getResponse.data.id ? [Constants.CB_GET_HTML] : [Constants.CB_GET_ALL, Constants.CB_GET_HTML],
afterCB() {
edit.protyle.title.element.removeAttribute("data-render");
edit.protyle.title.render(edit.protyle, response);
}
});
});
});

View file

@ -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);

View file

@ -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">

View file

@ -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 => {

View file

@ -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);

View file

@ -6,7 +6,6 @@ import {processSync} from "../dialog/processSystem";
import {getCloudURL} from "./util/about";
import {openByMobile} from "../protyle/util/compatibility";
import {confirmDialog} from "../dialog/confirmDialog";
import {isKernelInMobile} from "../util/functions";
const renderProvider = (provider: number) => {
if (provider === 0) {
@ -41,7 +40,13 @@ const renderProvider = (provider: number) => {
</div>`;
}
if (!isPaidUser()) {
return `<div class="b3-label b3-label--inner">${window.siyuan.languages["_kernel"][214].replaceAll("${accountServer}", getCloudURL(""))}</div>`;
return `<div>
${window.siyuan.languages["_kernel"][214].replaceAll("${accountServer}", getCloudURL(""))}
</div>
<div class="ft__error${provider == 4 ? "" : " fn__none"}">
<div class="fn__hr--b"></div>
${window.siyuan.languages.mobileNotSupport}
</div>`;
}
if (provider === 2) {
return `<div class="b3-label b3-label--inner">
@ -180,16 +185,11 @@ const renderProvider = (provider: number) => {
</button>
</div>`;
} else if (provider === 4) {
if (isKernelInMobile()) {
return `<div class="b3-label b3-label--inner">
${window.siyuan.languages.syncThirdPartyProviderLocalIntro}
<div class="fn__hr"></div>
<em>${window.siyuan.languages.proFeature}</em>
<div class="fn__hr"></div>
${window.siyuan.languages.deviceNotSupport}
</div>`;
}
return `<div class="b3-label b3-label--inner">
<div class="ft__error">
${window.siyuan.languages.mobileNotSupport}
</div>
<div class="fn__hr"></div>
${window.siyuan.languages.syncThirdPartyProviderLocalIntro}
<div class="fn__hr"></div>
<em>${window.siyuan.languages.proFeature}</em>

View file

@ -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

View file

@ -62,33 +62,31 @@ export const openSnippets = () => {
<div class="fn__flex-1" style="overflow:auto;padding: 16px 24px">
<div>
<div class="fn__flex">
<div class="fn__flex-1"></div>
<div class="b3-form__icon">
<div class="b3-form__icon fn__flex-1">
<svg class="b3-form__icon-icon"><use xlink:href="#iconSearch"></use></svg>
<input data-type="css" data-action="search" type="text" placeholder="${window.siyuan.languages.search}" class="b3-text-field b3-form__icon-input">
<input data-type="css" data-action="search" type="text" placeholder="${window.siyuan.languages.search}" class="b3-text-field b3-form__icon-input fn__block">
</div>
<div class="fn__space"></div>
<span aria-label="${window.siyuan.languages.addAttr} CSS" id="addCodeSnippetCSS" class="b3-tooltips b3-tooltips__sw block__icon block__icon--show">
<svg><use xlink:href="#iconAdd"></use></svg>
</span>
<div class="fn__space"></div>
<input data-action="toggleCSS" class="b3-switch b3-switch--side fn__flex-center" type="checkbox"${window.siyuan.config.snippet.enabledCSS ? " checked" : ""}>
<input data-action="toggleCSS" class="b3-switch fn__flex-center" type="checkbox"${window.siyuan.config.snippet.enabledCSS ? " checked" : ""}>
</div>
${cssHTML}
</div>
<div class="fn__none">
<div class="fn__flex">
<div class="fn__flex-1"></div>
<div class="b3-form__icon">
<div class="b3-form__icon fn__flex-1">
<svg class="b3-form__icon-icon"><use xlink:href="#iconSearch"></use></svg>
<input data-type="js" data-action="search" type="text" placeholder="${window.siyuan.languages.search}" class="b3-text-field b3-form__icon-input">
<input data-type="js" data-action="search" type="text" placeholder="${window.siyuan.languages.search}" class="b3-text-field b3-form__icon-input fn__block">
</div>
<div class="fn__space"></div>
<span aria-label="${window.siyuan.languages.addAttr} JS" id="addCodeSnippetJS" class="b3-tooltips b3-tooltips__sw block__icon block__icon--show">
<svg><use xlink:href="#iconAdd"></use></svg>
</span>
<div class="fn__space"></div>
<input data-action="toggleJS" class="b3-switch b3-switch--side fn__flex-center" type="checkbox"${window.siyuan.config.snippet.enabledJS ? " checked" : ""}>
<input data-action="toggleJS" class="b3-switch fn__flex-center" type="checkbox"${window.siyuan.config.snippet.enabledJS ? " checked" : ""}>
</div>
${jsHTML}
</div>
@ -120,7 +118,8 @@ export const openSnippets = () => {
type: target.id === "addCodeSnippetCSS" ? "css" : "js",
name: "",
content: "",
enabled: false
enabled: false,
disabledInPublish: false,
}));
event.stopPropagation();
event.preventDefault();
@ -195,13 +194,19 @@ const genSnippet = (options: ISnippet) => {
<div class="fn__hr--b"></div>
<div class="fn__flex">
<input type="text" class="fn__size200 b3-text-field" placeholder="${window.siyuan.languages.title}">
<div class="fn__space"></div>
<label class="fn__flex${window.siyuan.config.publish.enable ? "" : " fn__none"}">
<input data-type="disabledInPublish" type="checkbox" class="b3-switch fn__flex-center" ${options.disabledInPublish ? "" : " checked"}>
<div class="fn__space"></div>
<span class="fn__flex-center">${window.siyuan.languages.publishService}</span>
</label>
<div class="fn__flex-1"></div>
<div class="fn__space"></div>
<span aria-label="${window.siyuan.languages.remove}" data-action="remove" class="b3-tooltips b3-tooltips__sw block__icon block__icon--show">
<svg><use xlink:href="#iconTrashcan"></use></svg>
</span>
<div class="fn__space"></div>
<input data-type="snippet" class="b3-switch b3-switch--side fn__flex-center" type="checkbox"${options.enabled ? " checked" : ""}>
<input data-type="snippet" class="b3-switch fn__flex-center" type="checkbox"${options.enabled ? " checked" : ""}>
</div>
<div class="fn__hr"></div>
<textarea class="fn__block b3-text-field" placeholder="${window.siyuan.languages.codeSnippet}" style="resize: vertical;font-family:var(--b3-font-family-code)" spellcheck="false"></textarea>
@ -229,11 +234,12 @@ const setSnippet = (dialog: Dialog, oldSnippets: ISnippet[], removeIds: string[]
const snippets: ISnippet[] = [];
dialog.element.querySelectorAll("[data-id]").forEach((item) => {
snippets.push({
disabledInPublish: !(item.querySelector('.b3-switch[data-type="disabledInPublish"]') as HTMLInputElement).checked,
id: item.getAttribute("data-id"),
name: item.querySelector("input").value,
type: item.getAttribute("data-type"),
content: item.querySelector("textarea").value,
enabled: (item.querySelector(".b3-switch") as HTMLInputElement).checked
enabled: (item.querySelector('.b3-switch[data-type="snippet"]') as HTMLInputElement).checked
});
});
if (objEquals(oldSnippets, snippets) &&

View file

@ -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();
}

View file

@ -240,7 +240,7 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
const dynamicCurrentObj: IObject = {
color: "#d23f31",
lang: "",
date: "",
date: dayjs().format("YYYY-MM-DD"),
weekdayType: "1",
type: "1",
content: "SiYuan",
@ -268,7 +268,7 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
<div class="emojis__tabheader">
<div data-type="tab-emoji" class="ariaLabel block__icon block__icon--show" aria-label="${window.siyuan.languages.emoji}"><svg><use xlink:href="#iconEmoji"></use></svg></div>
<div class="fn__space"></div>
<div data-type="tab-dynamic" class="ariaLabel block__icon block__icon--show" aria-label="${window.siyuan.languages.dynamicEmoji}"><svg><use xlink:href="#iconCalendar"></use></svg></div>
<div data-type="tab-dynamic" class="ariaLabel block__icon block__icon--show" aria-label="${window.siyuan.languages.dynamicIcon}"><svg><use xlink:href="#iconCalendar"></use></svg></div>
<div class="fn__flex-1"></div>
<span class="block__icon block__icon--show fn__flex-center ariaLabel" data-action="remove" aria-label="${window.siyuan.languages.remove}"><svg><use xlink:href="#iconTrashcan"></use></svg></span>
</div>
@ -334,6 +334,8 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
<span class="fn__flex-center ft__on-surface" style="width: 89px">${window.siyuan.languages.date}</span>
<span class="fn__space--small"></span>
<input type="date" max="9999-12-31" class="b3-text-field fn__flex-1" value="${dynamicCurrentObj.date}"/>
<span class="fn__space--small"></span>
<span data-action="clearDate" class="ariaLabel block__icon block__icon--show" aria-label="${window.siyuan.languages.dynamicIconDateEmptyInfo}"><svg><use xlink:href="#iconTrashcan"></use></svg></span>
<span class="fn__space"></span>
</div>
<div class="fn__hr"></div>
@ -628,6 +630,10 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
dynamicTextElements[0].value = target.getAttribute("style").replace("background-color:", "");
dynamicTextElements[0].dispatchEvent(new CustomEvent("input"));
break;
} else if ("clearDate" === target.dataset.action) {
dynamicDateElement.value = "";
dynamicDateElement.dispatchEvent(new CustomEvent("change"));
break;
}
target = target.parentElement;
}

View file

@ -866,7 +866,7 @@ data-type="navigation-root" data-path="/">
}
window.siyuan.storage[Constants.LOCAL_FILESPATHS].forEach((item: IFilesPath) => {
item.openPaths.forEach((openPath) => {
this.selectItem(item.notebookId, openPath, undefined, false);
this.selectItem(item.notebookId, openPath, undefined, false, false);
});
});
if (!init) {
@ -1081,7 +1081,11 @@ data-type="navigation-root" data-path="/">
}, 2);
}
private onLsSelect(data: { files: IFile[], box: string, path: string }, filePath: string, setStorage: boolean) {
private async onLsSelect(data: {
files: IFile[],
box: string,
path: string
}, filePath: string, setStorage: boolean, isSetCurrent: boolean) {
let fileHTML = "";
data.files.forEach((item: IFile) => {
fileHTML += this.genFileHTML(item);
@ -1102,28 +1106,30 @@ data-type="navigation-root" data-path="/">
emojiElement.textContent = unicode2Emoji(window.siyuan.storage[Constants.LOCAL_IMAGES].folder);
}
liElement.insertAdjacentHTML("afterend", `<ul>${fileHTML}</ul>`);
data.files.forEach((item: IFile) => {
let newLiElement;
for (let i = 0; i < data.files.length; i++) {
const item = data.files[i];
if (filePath === item.path) {
this.selectItem(data.box, filePath, undefined, setStorage);
newLiElement = await this.selectItem(data.box, filePath, undefined, setStorage, isSetCurrent);
} else if (filePath.startsWith(item.path.replace(".sy", ""))) {
fetchPost("/api/filetree/listDocsByPath", {
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
notebook: data.box,
path: item.path
}, response => {
this.selectItem(response.data.box, filePath, response.data, setStorage);
});
newLiElement = await this.selectItem(response.data.box, filePath, response.data, setStorage, isSetCurrent);
}
});
if (setStorage) {
this.setCurrent(this.element.querySelector(`ul[data-url="${data.box}"] li[data-path="${filePath}"]`));
}
if (isSetCurrent) {
this.setCurrent(newLiElement);
}
return newLiElement;
}
private setCurrent(target: HTMLElement, isScroll = true) {
public setCurrent(target: HTMLElement, isScroll = true) {
if (!target) {
return;
}
this.element.querySelectorAll("li").forEach((liItem) => {
this.element.querySelectorAll("li.b3-list-item--focus").forEach((liItem) => {
liItem.classList.remove("b3-list-item--focus");
});
target.classList.add("b3-list-item--focus");
@ -1147,7 +1153,13 @@ data-type="navigation-root" data-path="/">
path: liElement.getAttribute("data-path"),
}, response => {
if (response.data.path === "/" && response.data.files.length === 0) {
showMessage(window.siyuan.languages.emptyContent);
newFile({
app: this.app,
notebookId,
currentPath: "/",
useSavePath: false,
listDocTree: true,
});
return;
}
this.onLsHTML(response.data);
@ -1155,11 +1167,11 @@ data-type="navigation-root" data-path="/">
});
}
public selectItem(notebookId: string, filePath: string, data?: {
public async selectItem(notebookId: string, filePath: string, data?: {
files: IFile[],
box: string,
path: string
}, setStorage = true) {
}, setStorage = true, isSetCurrent = true) {
const treeElement = this.element.querySelector(`[data-url="${notebookId}"]`);
if (!treeElement) {
// 有文件树和编辑器的布局初始化时,文件树还未挂载
@ -1181,24 +1193,24 @@ data-type="navigation-root" data-path="/">
if (liElement.getAttribute("data-path") === filePath) {
if (setStorage) {
this.setCurrent(liElement);
this.getOpenPaths();
} else {
this.element.querySelector(".b3-list-item--focus")?.classList.remove("b3-list-item--focus");
}
return;
if (isSetCurrent) {
this.setCurrent(liElement);
}
return liElement;
}
if (data && data.path === currentPath) {
this.onLsSelect(data, filePath, setStorage);
liElement = await this.onLsSelect(data, filePath, setStorage, isSetCurrent);
} else {
fetchPost("/api/filetree/listDocsByPath", {
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
notebook: notebookId,
path: currentPath
}, response => {
this.onLsSelect(response.data, filePath, setStorage);
});
liElement = await this.onLsSelect(response.data, filePath, setStorage, isSetCurrent);
}
return liElement;
}
private getOpenPaths() {

View file

@ -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");

View file

@ -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", {
@ -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(() => {

View file

@ -4,8 +4,7 @@ import {Model} from "../../layout/Model";
import {Constants} from "../../constants";
import {getDisplayName, pathPosix, setNoteBook} from "../../util/pathName";
import {initFileMenu, initNavigationMenu, sortMenu} from "../../menus/navigation";
import {showMessage} from "../../dialog/message";
import {fetchPost} from "../../util/fetch";
import {fetchPost, fetchSyncPost} from "../../util/fetch";
import {genUUID} from "../../util/genID";
import {openMobileFileById} from "../editor";
import {unicode2Emoji} from "../../emoji";
@ -361,7 +360,7 @@ export class MobileFiles extends Model {
}
window.siyuan.storage[Constants.LOCAL_FILESPATHS].forEach((item: IFilesPath) => {
item.openPaths.forEach((openPath) => {
this.selectItem(item.notebookId, openPath, undefined, false);
this.selectItem(item.notebookId, openPath, undefined, false, false);
});
});
if (!init) {
@ -577,20 +576,14 @@ export class MobileFiles extends Model {
}, 2);
}
private onLsSelect(data: { files: IFile[], box: string, path: string }, filePath: string, setStorage: boolean) {
private async onLsSelect(data: {
files: IFile[],
box: string,
path: string
}, filePath: string, setStorage: boolean, isSetCurrent: boolean) {
let fileHTML = "";
data.files.forEach((item: IFile) => {
fileHTML += this.genFileHTML(item);
if (filePath === item.path) {
this.selectItem(data.box, filePath, undefined, setStorage);
} else if (filePath.startsWith(item.path.replace(".sy", ""))) {
fetchPost("/api/filetree/listDocsByPath", {
notebook: data.box,
path: item.path
}, response => {
this.selectItem(response.data.box, filePath, response.data, setStorage);
});
}
});
if (fileHTML === "") {
return;
@ -600,26 +593,45 @@ export class MobileFiles extends Model {
// 文件展开时,刷新
liElement.nextElementSibling.remove();
}
liElement.querySelector(".b3-list-item__arrow").classList.add("b3-list-item__arrow--open");
liElement.insertAdjacentHTML("afterend", `<ul>${fileHTML}</ul>`);
if (setStorage) {
this.setCurrent(this.element.querySelector(`ul[data-url="${data.box}"] li[data-path="${filePath}"]`));
const arrowElement = liElement.querySelector(".b3-list-item__arrow");
arrowElement.classList.add("b3-list-item__arrow--open");
arrowElement.parentElement.classList.remove("fn__hidden");
const emojiElement = liElement.querySelector(".b3-list-item__icon");
if (emojiElement.textContent === unicode2Emoji(window.siyuan.storage[Constants.LOCAL_IMAGES].file)) {
emojiElement.textContent = unicode2Emoji(window.siyuan.storage[Constants.LOCAL_IMAGES].folder);
}
liElement.insertAdjacentHTML("afterend", `<ul>${fileHTML}</ul>`);
let newLiElement;
for (let i = 0; i < data.files.length; i++) {
const item = data.files[i];
if (filePath === item.path) {
newLiElement = await this.selectItem(data.box, filePath, undefined, setStorage, isSetCurrent);
} else if (filePath.startsWith(item.path.replace(".sy", ""))) {
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
notebook: data.box,
path: item.path
});
newLiElement = await this.selectItem(response.data.box, filePath, response.data, setStorage, isSetCurrent);
}
}
if (isSetCurrent) {
this.setCurrent(newLiElement);
}
return newLiElement;
}
private setCurrent(target: HTMLElement) {
public setCurrent(target: HTMLElement, isScroll = true) {
if (!target) {
return;
}
this.element.querySelectorAll("li").forEach((liItem) => {
this.element.querySelectorAll("li.b3-list-item--focus").forEach((liItem) => {
liItem.classList.remove("b3-list-item--focus");
});
target.classList.add("b3-list-item--focus");
const titleHeight = this.actionsElement.clientHeight;
if (target.offsetTop - titleHeight < this.element.scrollTop) {
this.element.scrollTop = target.offsetTop - titleHeight;
} else if (target.offsetTop - this.element.clientHeight - titleHeight + target.clientHeight > this.element.scrollTop) {
this.element.scrollTop = target.offsetTop - this.element.clientHeight - titleHeight + target.clientHeight;
if (isScroll) {
const elementRect = this.element.getBoundingClientRect();
this.element.scrollTop = this.element.scrollTop + (target.getBoundingClientRect().top - (elementRect.top + elementRect.height / 2));
}
}
@ -636,7 +648,13 @@ export class MobileFiles extends Model {
path: liElement.getAttribute("data-path"),
}, response => {
if (response.data.path === "/" && response.data.files.length === 0) {
showMessage(window.siyuan.languages.emptyContent);
newFile({
app: this.app,
notebookId,
currentPath: "/",
useSavePath: false,
listDocTree: true,
});
return;
}
this.onLsHTML(response.data);
@ -644,11 +662,11 @@ export class MobileFiles extends Model {
});
}
public selectItem(notebookId: string, filePath: string, data?: {
public async selectItem(notebookId: string, filePath: string, data?: {
files: IFile[],
box: string,
path: string
}, setStorage = true) {
}, setStorage = true, isSetCurrent = true) {
const treeElement = this.element.querySelector(`[data-url="${notebookId}"]`);
if (!treeElement) {
// 有文件树和编辑器的布局初始化时,文件树还未挂载
@ -670,24 +688,24 @@ export class MobileFiles extends Model {
if (liElement.getAttribute("data-path") === filePath) {
if (setStorage) {
this.setCurrent(liElement);
this.getOpenPaths();
} else {
this.element.querySelector(".b3-list-item--focus")?.classList.remove("b3-list-item--focus");
}
return;
if (isSetCurrent) {
this.setCurrent(liElement);
}
return liElement;
}
if (data && data.path === currentPath) {
this.onLsSelect(data, filePath, setStorage);
liElement = await this.onLsSelect(data, filePath, setStorage, isSetCurrent);
} else {
fetchPost("/api/filetree/listDocsByPath", {
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
notebook: notebookId,
path: currentPath
}, response => {
this.onLsSelect(response.data, filePath, setStorage);
});
liElement = await this.onLsSelect(response.data, filePath, setStorage, isSetCurrent);
}
return liElement;
}
private getOpenPaths() {

View file

@ -59,6 +59,7 @@ export const openMobileFileById = (app: App, id: string, action: TProtyleAction[
render: {
scroll: true,
title: true,
titleShowTop: true,
background: true,
gutter: true,
},

View file

@ -186,7 +186,7 @@ ${unicode2Emoji(getNotebookIcon(item.box) || window.siyuan.storage[Constants.LOC
<svg class="b3-list-item__graphic"><use xlink:href="#${getIconByType(childItem.type)}"></use></svg>
${unicode2Emoji(childItem.ial.icon, "b3-list-item__graphic", true)}
<span class="b3-list-item__text">${childItem.content}</span>
${childItem.tag ? `<span class="b3-list-item__meta b3-list-item__meta--ellipsis">${childItem.tag.split("# #").map(tag => `${tag.replace("#", "")}`).join(" ").replace("#", "")}</span>` : ""}
${childItem.tag ? `<span class="b3-list-item__meta b3-list-item__meta--ellipsis">${childItem.tag.replace(/#/g, "")}</span>` : ""}
</div>`;
});
resultHTML += "</div>";
@ -206,7 +206,7 @@ ${childItem.tag ? `<span class="b3-list-item__meta b3-list-item__meta--ellipsis"
<span class="b3-list-item__text">${item.content}</span>
</div>
<div class="fn__flex">
${item.tag ? `<span class="b3-list-item__meta b3-list-item__meta--ellipsis">${item.tag.split("# #").map(tag => `${tag.replace("#", "")}`).join(" ").replace("#", "")}</span><span class="fn__space"></span>` : ""}
${item.tag ? `<span class="b3-list-item__meta b3-list-item__meta--ellipsis">${item.tag.replace(/#/g, "")}</span><span class="fn__space"></span>` : ""}
<span class="b3-list-item__text b3-list-item__meta">${escapeGreat(title)}</span>
</div>
</div>`;

View file

@ -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>
@ -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);

View file

@ -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 => {

View file

@ -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,8 @@ 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";
import {Files} from "../layout/dock/Files";
let openTab;
let openWindow;
@ -212,6 +214,94 @@ 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 => {
let headerElement = item.protyle.model?.parent.headElement;
if (!headerElement && item.protyle.element.getBoundingClientRect().height > 0) {
const tabBodyElement = item.protyle.element.closest(".fn__flex-1[data-id]");
if (tabBodyElement) {
headerElement = document.querySelector(`.layout-tab-bar .item[data-id="${tabBodyElement.getAttribute("data-id")}"]`);
}
}
if (headerElement) {
if (headerElement.classList.contains("item--focus") && parseInt(headerElement.dataset.activetime) > activeTime) {
activeTime = parseInt(headerElement.dataset.activetime);
editor = item;
}
} else if (item.protyle.element.getBoundingClientRect().height > 0) {
editor = item;
}
});
}
/// #else
editor = window.siyuan.mobile.popEditor || window.siyuan.mobile.editor;
if (editor?.protyle.element.classList.contains("fn__none")) {
return undefined;
}
/// #endif
return editor;
};
export const expandDocTree = async (options: {
id: string,
isSetCurrent?: boolean
}) => {
let isNotebook = false;
window.siyuan.notebooks.find(item => {
if (options.id === item.id) {
isNotebook = true;
return true;
}
});
let liElement: HTMLElement;
let notebookId = options.id;
const file = getModelByDockType("file") as Files;
if (typeof options.isSetCurrent === "undefined") {
options.isSetCurrent = true;
}
if (isNotebook) {
liElement = file.element.querySelector(`.b3-list[data-url="${options.id}"]`)?.firstElementChild as HTMLElement;
} else {
const response = await fetchSyncPost("api/block/getBlockInfo", {id: options.id});
if (response.code === -1) {
return;
}
notebookId = response.data.box;
liElement = await file.selectItem(response.data.box, response.data.path, undefined, undefined, options.isSetCurrent);
}
if (!liElement) {
return;
}
if (options.isSetCurrent || typeof options.isSetCurrent === "undefined") {
file.setCurrent(liElement);
}
const toggleElement = liElement.querySelector(".b3-list-item__arrow");
if (toggleElement.classList.contains("b3-list-item__arrow--open")) {
return;
}
file.getLeaf(liElement, notebookId);
};
export const API = {
adaptHotkey: updateHotkeyTip,
confirm: confirmDialog,
@ -236,11 +326,14 @@ export const API = {
Setting,
getAllEditor,
/// #if !MOBILE
getActiveTab,
getAllModels,
/// #endif
getActiveEditor,
platformUtils,
openSetting,
openAttributePanel,
saveLayout,
globalCommand,
expandDocTree
};

View file

@ -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,8 +155,19 @@ export class Plugin {
}
public addIcons(svg: string) {
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">
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: {
@ -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
}
@ -203,7 +233,7 @@ export class Plugin {
if (!this.setting) {
return;
}
this.setting.open(this.name);
this.setting.open(this.displayName || this.name);
}
public loadData(storageName: string) {

View file

@ -9,7 +9,7 @@ import {getFrontend, isMobile, isWindow} from "../util/functions";
import {Constants} from "../constants";
import {uninstall} from "./uninstall";
import {setStorageVal} from "../protyle/util/compatibility";
import { getAllEditor } from "../layout/getAll";
import {getAllEditor} from "../layout/getAll";
const requireFunc = (key: string) => {
const modules = {
@ -92,7 +92,7 @@ export const loadPlugin = async (app: App, item: IPluginData) => {
afterLoadPlugin(plugin);
saveLayout();
getAllEditor().forEach(editor => {
editor.protyle.toolbar.update(editor.protyle);
editor.protyle.toolbar.update(editor.protyle);
});
return plugin;
};
@ -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);
@ -167,7 +173,7 @@ export const afterLoadPlugin = (plugin: Plugin) => {
updateDock(dockItem, index, plugin, "Bottom");
});
Object.keys(plugin.docks).forEach(key => {
if (window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name] && window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name][key]) {
if (window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name] && window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name][key]) {
plugin.docks[key].config = window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name][key];
}
const dock = plugin.docks[key];

View file

@ -9,23 +9,29 @@ import {Constants} from "../constants";
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,
click() {
openSetting(app).element.querySelector('.b3-tab-bar [data-name="bazaar"]').dispatchEvent(new CustomEvent("click"));
}
});
menu.addSeparator({id: "separator_1"}, isHuawei() || window.siyuan.config.readonly);
menu.addItem({
id: "manage",
icon: "iconSettings",
label: window.siyuan.languages.manage,
ignore: isHuawei() || window.siyuan.config.readonly,
click() {
openSetting(app).element.querySelector('.b3-tab-bar [data-name="bazaar"]').dispatchEvent(new CustomEvent("click"));
}
});
menu.addSeparator({id: "separator_1", ignore: 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",
@ -85,7 +91,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
menu.addItem(menuOption);
hasPlugin = true;
hasTopBar = true;
});
}
if (!hasTopBar && hasSetting) {
hasPlugin = true;
menu.addItem({

View file

@ -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);

View file

@ -111,7 +111,6 @@ const renderPDF = async (id: string) => {
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" type="text/css" id="baseStyle" href="${servePath}/stage/build/export/base.css?v=${Constants.SIYUAN_VERSION}"/>
@ -663,7 +662,6 @@ const onExport = async (data: IWebSocketData, filePath: string, exportOption: IE
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" type="text/css" id="baseStyle" href="stage/build/export/base.css?v=${Constants.SIYUAN_VERSION}"/>

View file

@ -95,11 +95,18 @@ export class Gutter {
}
});
if (avElement.querySelector('.block__icon[data-type="av-sort"]')?.classList.contains("block__icon--active")) {
event.preventDefault();
event.stopPropagation();
return;
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");
@ -110,7 +117,8 @@ export class Gutter {
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 {
@ -1674,7 +1682,7 @@ export class Gutter {
icon: "iconCopy",
label: `${window.siyuan.languages.copy} ${window.siyuan.languages.headings1}`,
click() {
fetchPost("/api/block/getHeadingChildrenDOM", {id}, (response) => {
fetchPost("/api/block/getHeadingChildrenDOM", {id, removeFoldAttr: true}, (response) => {
if (isInAndroid()) {
window.JSAndroid.writeHTMLClipboard(protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
} else if (isInHarmony()) {
@ -1690,7 +1698,7 @@ export class Gutter {
icon: "iconCut",
label: `${window.siyuan.languages.cut} ${window.siyuan.languages.headings1}`,
click() {
fetchPost("/api/block/getHeadingChildrenDOM", {id}, (response) => {
fetchPost("/api/block/getHeadingChildrenDOM", {id, removeFoldAttr: true}, (response) => {
if (isInAndroid()) {
window.JSAndroid.writeHTMLClipboard(protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
} else if (isInHarmony()) {
@ -2313,9 +2321,9 @@ export class Gutter {
} 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}" 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>`;
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}" 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}`;
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;
}

View file

@ -14,7 +14,9 @@ import {Constants} from "../../constants";
import {matchHotKey} from "../util/hotKey";
import {isMac, readText} from "../util/compatibility";
import * as dayjs from "dayjs";
/// #if !MOBILE
import {openFileById} from "../../editor/util";
/// #endif
import {setTitle} from "../../dialog/processSystem";
import {getContenteditableElement, getNoContainerElement} from "../wysiwyg/getBlock";
import {commonHotkey} from "../wysiwyg/commonHotkey";
@ -38,232 +40,68 @@ export class Title {
if (window.siyuan.config.editor.displayBookmarkIcon) {
this.element.classList.add("protyle-wysiwyg--attr");
}
/// #if !MOBILE
// 标题内需要一个空格,避免首次加载出现`请输入文档名`干扰
this.element.innerHTML = `<span aria-label="${isMac() ? window.siyuan.languages.gutterTip2 : window.siyuan.languages.gutterTip2.replace("⇧", "Shift+")}" data-position="west" class="protyle-title__icon ariaLabel"><svg><use xlink:href="#iconFile"></use></svg></span>
if (protyle.options.render?.titleShowTop) {
this.element.innerHTML = '<div class="protyle-attr"></div>';
} else {
// 标题内需要一个空格,避免首次加载出现`请输入文档名`干扰
this.element.innerHTML = `<span aria-label="${isMac() ? window.siyuan.languages.gutterTip2 : window.siyuan.languages.gutterTip2.replace("⇧", "Shift+")}" data-position="west" class="protyle-title__icon ariaLabel"><svg><use xlink:href="#iconFile"></use></svg></span>
<div contenteditable="true" spellcheck="${window.siyuan.config.editor.spellcheck}" class="protyle-title__input" data-tip="${window.siyuan.languages._kernel[16]}"> </div><div class="protyle-attr"></div>`;
this.editElement = this.element.querySelector(".protyle-title__input");
this.editElement.addEventListener("paste", (event: ClipboardEvent) => {
event.stopPropagation();
event.preventDefault();
// 不能使用 range.insertNode否则无法撤销
let text = event.clipboardData.getData("text/siyuan");
if (text) {
try {
JSON.parse(text);
text = event.clipboardData.getData("text/plain");
} catch (e) {
// 不为数据库,保持 text 不变
}
text = protyle.lute.BlockDOM2Content(text);
} else {
text = event.clipboardData.getData("text/plain");
}
// 阻止右键复制菜单报错
setTimeout(function () {
document.execCommand("insertText", false, replaceFileName(text));
}, 0);
this.rename(protyle);
});
this.editElement.addEventListener("click", () => {
protyle.toolbar?.element.classList.add("fn__none");
});
this.editElement.addEventListener("input", (event: InputEvent) => {
if (event.isComposing) {
return;
}
if (this.editElement.textContent === "") {
this.editElement.querySelectorAll("br").forEach(item => {
item.remove();
});
}
this.rename(protyle);
});
this.editElement.addEventListener("compositionend", () => {
this.rename(protyle);
});
this.editElement.addEventListener("drop", (event: DragEvent) => {
// https://ld246.com/article/1661911210429
event.stopPropagation();
event.preventDefault();
});
this.editElement.addEventListener("keydown", (event: KeyboardEvent) => {
if (event.isComposing) {
return;
}
if (commonHotkey(protyle, event)) {
return true;
}
if (matchHotKey("⇧⌘V", event)) {
navigator.clipboard.readText().then(textPlain => {
// 对 HTML 标签进行内部转义,避免被 Lute 解析以后变为小写 https://github.com/siyuan-note/siyuan/issues/10620
textPlain = textPlain.replace(/</g, ";;;lt;;;").replace(/>/g, ";;;gt;;;");
enableLuteMarkdownSyntax(protyle);
let content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
restoreLuteMarkdownSyntax(protyle);
// 移除 ;;;lt;;; 和 ;;;gt;;; 转义及其包裹的内容
content = content.replace(/;;;lt;;;[^;]+;;;gt;;;/g, "");
document.execCommand("insertText", false, replaceFileName(content));
this.rename(protyle);
});
event.preventDefault();
this.editElement = this.element.querySelector(".protyle-title__input");
this.editElement.addEventListener("paste", (event: ClipboardEvent) => {
event.stopPropagation();
}
if (matchHotKey(window.siyuan.config.keymap.general.enterBack.custom, event)) {
const ids = protyle.path.split("/");
if (ids.length > 2) {
openFileById({
app: protyle.app,
id: ids[ids.length - 2],
action: [Constants.CB_GET_FOCUS, Constants.CB_GET_SCROLL]
event.preventDefault();
// 不能使用 range.insertNode否则无法撤销
let text = event.clipboardData.getData("text/siyuan");
if (text) {
try {
JSON.parse(text);
text = event.clipboardData.getData("text/plain");
} catch (e) {
// 不为数据库,保持 text 不变
}
text = protyle.lute.BlockDOM2Content(text);
} else {
text = event.clipboardData.getData("text/plain");
}
// 阻止右键复制菜单报错
setTimeout(function () {
document.execCommand("insertText", false, replaceFileName(text));
}, 0);
this.rename(protyle);
});
this.editElement.addEventListener("click", () => {
protyle.toolbar?.element.classList.add("fn__none");
});
this.editElement.addEventListener("input", (event: InputEvent) => {
if (event.isComposing) {
return;
}
if (this.editElement.textContent === "") {
this.editElement.querySelectorAll("br").forEach(item => {
item.remove();
});
}
event.preventDefault();
this.rename(protyle);
});
this.editElement.addEventListener("compositionend", () => {
this.rename(protyle);
});
this.editElement.addEventListener("drop", (event: DragEvent) => {
// https://ld246.com/article/1661911210429
event.stopPropagation();
return;
}
if (electronUndo(event)) {
return;
}
if (event.key === "ArrowDown") {
const rects = getSelection().getRangeAt(0).getClientRects();
// https://github.com/siyuan-note/siyuan/issues/11729
if (rects.length === 0 // 标题为空时时
|| this.editElement.getBoundingClientRect().bottom - rects[rects.length - 1].bottom < 25) {
const noContainerElement = getNoContainerElement(protyle.wysiwyg.element.firstElementChild);
// https://github.com/siyuan-note/siyuan/issues/4923
if (noContainerElement) {
focusBlock(noContainerElement, protyle.wysiwyg.element);
}
event.preventDefault();
event.stopPropagation();
event.preventDefault();
});
this.editElement.addEventListener("keydown", (event: KeyboardEvent) => {
if (event.isComposing) {
return;
}
} else if (event.key === "Enter") {
const editElement = getContenteditableElement(protyle.wysiwyg.element.firstElementChild);
if (editElement && editElement.textContent === "" && editElement.getAttribute("placeholder")) {
// 配合提示文本使用,避免提示文本挤压到第二个块中
focusBlock(protyle.wysiwyg.element.firstElementChild, protyle.wysiwyg.element);
} else {
const newId = Lute.NewNodeID();
const newElement = genEmptyElement(false, true, newId);
protyle.wysiwyg.element.insertAdjacentElement("afterbegin", newElement);
focusByWbr(newElement, protyle.toolbar.range || getEditorRange(newElement));
transaction(protyle, [{
action: "insert",
data: newElement.outerHTML,
id: newId,
parentID: protyle.block.parentID
}], [{
action: "delete",
id: newId,
}]);
if (commonHotkey(protyle, event)) {
return true;
}
event.preventDefault();
event.stopPropagation();
} else if (matchHotKey(window.siyuan.config.keymap.editor.general.attr.custom, event)) {
fetchPost("/api/block/getDocInfo", {
id: protyle.block.rootID
}, (response) => {
openFileAttr(response.data.ial, "bookmark", protyle);
});
event.preventDefault();
event.stopPropagation();
} else if (matchHotKey("⌘A", event)) {
getEditorRange(this.editElement).selectNodeContents(this.editElement);
event.preventDefault();
event.stopPropagation();
}
});
const iconElement = this.element.querySelector(".protyle-title__icon");
iconElement.addEventListener("click", () => {
if (window.siyuan.shiftIsPressed) {
fetchPost("/api/block/getDocInfo", {
id: protyle.block.rootID
}, (response) => {
openFileAttr(response.data.ial, "bookmark", protyle);
});
} else {
const iconRect = iconElement.getBoundingClientRect();
openTitleMenu(protyle, {x: iconRect.left, y: iconRect.bottom});
}
});
this.element.addEventListener("contextmenu", (event) => {
if (event.shiftKey) {
return;
}
if (getSelection().rangeCount === 0) {
openTitleMenu(protyle, {x: event.clientX, y: event.clientY});
return;
}
protyle.toolbar?.element.classList.add("fn__none");
window.siyuan.menus.menu.remove();
const range = getEditorRange(this.editElement);
if (range.toString() !== "") {
window.siyuan.menus.menu.append(new MenuItem({
id: "copy",
icon: "iconCopy",
accelerator: "⌘C",
label: window.siyuan.languages.copy,
click: () => {
focusByRange(getEditorRange(this.editElement));
document.execCommand("copy");
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "cut",
icon: "iconCut",
accelerator: "⌘X",
label: window.siyuan.languages.cut,
click: () => {
focusByRange(getEditorRange(this.editElement));
document.execCommand("cut");
setTimeout(() => {
this.rename(protyle);
}, Constants.TIMEOUT_INPUT);
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "delete",
icon: "iconTrashcan",
accelerator: "⌫",
label: window.siyuan.languages.delete,
click: () => {
const range = getEditorRange(this.editElement);
range.extractContents();
focusByRange(range);
setTimeout(() => {
this.rename(protyle);
}, Constants.TIMEOUT_INPUT);
}
}).element);
}
window.siyuan.menus.menu.append(new MenuItem({
id: "paste",
label: window.siyuan.languages.paste,
icon: "iconPaste",
accelerator: "⌘V",
click: async () => {
focusByRange(getEditorRange(this.editElement));
if (document.queryCommandSupported("paste")) {
document.execCommand("paste");
} else {
try {
const text = await readText();
document.execCommand("insertText", false, replaceFileName(text));
this.rename(protyle);
} catch (e) {
console.log(e);
}
}
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "pasteAsPlainText",
label: window.siyuan.languages.pasteAsPlainText,
accelerator: "⇧⌘V",
click: async () => {
if (matchHotKey("⇧⌘V", event)) {
navigator.clipboard.readText().then(textPlain => {
// 对 HTML 标签进行内部转义,避免被 Lute 解析以后变为小写 https://github.com/siyuan-note/siyuan/issues/10620
textPlain = textPlain.replace(/</g, ";;;lt;;;").replace(/>/g, ";;;gt;;;");
enableLuteMarkdownSyntax(protyle);
let content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
@ -273,23 +111,189 @@ export class Title {
document.execCommand("insertText", false, replaceFileName(content));
this.rename(protyle);
});
event.preventDefault();
event.stopPropagation();
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "selectAll",
label: window.siyuan.languages.selectAll,
icon: "iconSelect",
accelerator: "⌘A",
click: () => {
range.selectNodeContents(this.editElement);
focusByRange(range);
if (matchHotKey(window.siyuan.config.keymap.general.enterBack.custom, event)) {
const ids = protyle.path.split("/");
if (ids.length > 2) {
/// #if !MOBILE
openFileById({
app: protyle.app,
id: ids[ids.length - 2],
action: [Constants.CB_GET_FOCUS, Constants.CB_GET_SCROLL]
});
/// #endif
}
event.preventDefault();
event.stopPropagation();
return;
}
}).element);
window.siyuan.menus.menu.popup({x: event.clientX, y: event.clientY});
});
/// #else
this.element.innerHTML = '<div class="protyle-attr"></div>';
/// #endif
if (electronUndo(event)) {
return;
}
if (event.key === "ArrowDown") {
const rects = getSelection().getRangeAt(0).getClientRects();
// https://github.com/siyuan-note/siyuan/issues/11729
if (rects.length === 0 // 标题为空时时
|| this.editElement.getBoundingClientRect().bottom - rects[rects.length - 1].bottom < 25) {
const noContainerElement = getNoContainerElement(protyle.wysiwyg.element.firstElementChild);
// https://github.com/siyuan-note/siyuan/issues/4923
if (noContainerElement) {
focusBlock(noContainerElement, protyle.wysiwyg.element);
}
event.preventDefault();
event.stopPropagation();
}
} else if (event.key === "Enter") {
const editElement = getContenteditableElement(protyle.wysiwyg.element.firstElementChild);
if (editElement && editElement.textContent === "" && editElement.getAttribute("placeholder")) {
// 配合提示文本使用,避免提示文本挤压到第二个块中
focusBlock(protyle.wysiwyg.element.firstElementChild, protyle.wysiwyg.element);
} else {
const newId = Lute.NewNodeID();
const newElement = genEmptyElement(false, true, newId);
protyle.wysiwyg.element.insertAdjacentElement("afterbegin", newElement);
focusByWbr(newElement, protyle.toolbar.range || getEditorRange(newElement));
transaction(protyle, [{
action: "insert",
data: newElement.outerHTML,
id: newId,
parentID: protyle.block.parentID
}], [{
action: "delete",
id: newId,
}]);
}
event.preventDefault();
event.stopPropagation();
} else if (matchHotKey(window.siyuan.config.keymap.editor.general.attr.custom, event)) {
fetchPost("/api/block/getDocInfo", {
id: protyle.block.rootID
}, (response) => {
openFileAttr(response.data.ial, "bookmark", protyle);
});
event.preventDefault();
event.stopPropagation();
} else if (matchHotKey("⌘A", event)) {
getEditorRange(this.editElement).selectNodeContents(this.editElement);
event.preventDefault();
event.stopPropagation();
}
});
const iconElement = this.element.querySelector(".protyle-title__icon");
iconElement.addEventListener("click", () => {
if (window.siyuan.shiftIsPressed) {
fetchPost("/api/block/getDocInfo", {
id: protyle.block.rootID
}, (response) => {
openFileAttr(response.data.ial, "bookmark", protyle);
});
} else {
const iconRect = iconElement.getBoundingClientRect();
openTitleMenu(protyle, {x: iconRect.left, y: iconRect.bottom});
}
});
this.element.addEventListener("contextmenu", (event) => {
if (event.shiftKey) {
return;
}
if (getSelection().rangeCount === 0) {
openTitleMenu(protyle, {x: event.clientX, y: event.clientY});
return;
}
protyle.toolbar?.element.classList.add("fn__none");
window.siyuan.menus.menu.remove();
const range = getEditorRange(this.editElement);
if (range.toString() !== "") {
window.siyuan.menus.menu.append(new MenuItem({
id: "copy",
icon: "iconCopy",
accelerator: "⌘C",
label: window.siyuan.languages.copy,
click: () => {
focusByRange(getEditorRange(this.editElement));
document.execCommand("copy");
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "cut",
icon: "iconCut",
accelerator: "⌘X",
label: window.siyuan.languages.cut,
click: () => {
focusByRange(getEditorRange(this.editElement));
document.execCommand("cut");
setTimeout(() => {
this.rename(protyle);
}, Constants.TIMEOUT_INPUT);
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "delete",
icon: "iconTrashcan",
accelerator: "⌫",
label: window.siyuan.languages.delete,
click: () => {
const range = getEditorRange(this.editElement);
range.extractContents();
focusByRange(range);
setTimeout(() => {
this.rename(protyle);
}, Constants.TIMEOUT_INPUT);
}
}).element);
}
window.siyuan.menus.menu.append(new MenuItem({
id: "paste",
label: window.siyuan.languages.paste,
icon: "iconPaste",
accelerator: "⌘V",
click: async () => {
focusByRange(getEditorRange(this.editElement));
if (document.queryCommandSupported("paste")) {
document.execCommand("paste");
} else {
try {
const text = await readText();
document.execCommand("insertText", false, replaceFileName(text));
this.rename(protyle);
} catch (e) {
console.log(e);
}
}
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "pasteAsPlainText",
label: window.siyuan.languages.pasteAsPlainText,
accelerator: "⇧⌘V",
click: async () => {
navigator.clipboard.readText().then(textPlain => {
textPlain = textPlain.replace(/</g, ";;;lt;;;").replace(/>/g, ";;;gt;;;");
enableLuteMarkdownSyntax(protyle);
let content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
restoreLuteMarkdownSyntax(protyle);
// 移除 ;;;lt;;; 和 ;;;gt;;; 转义及其包裹的内容
content = content.replace(/;;;lt;;;[^;]+;;;gt;;;/g, "");
document.execCommand("insertText", false, replaceFileName(content));
this.rename(protyle);
});
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "selectAll",
label: window.siyuan.languages.selectAll,
icon: "iconSelect",
accelerator: "⌘A",
click: () => {
range.selectNodeContents(this.editElement);
focusByRange(range);
}
}).element);
window.siyuan.menus.menu.popup({x: event.clientX, y: event.clientY});
});
}
this.element.querySelector(".protyle-attr").addEventListener("click", (event: MouseEvent & {
target: HTMLElement
}) => {
@ -329,9 +333,15 @@ export class Title {
public setTitle(title: string) {
/// #if MOBILE
const inputElement = document.getElementById("toolbarName") as HTMLInputElement;
if (code160to32(title) !== code160to32(inputElement.value)) {
inputElement.value = title === window.siyuan.languages.untitled ? "" : title;
if (this.editElement) {
if (code160to32(title) !== code160to32(this.editElement.textContent)) {
this.editElement.textContent = title === window.siyuan.languages.untitled ? "" : title;
}
} else {
const inputElement = document.getElementById("toolbarName") as HTMLInputElement;
if (code160to32(title) !== code160to32(inputElement.value)) {
inputElement.value = title === window.siyuan.languages.untitled ? "" : title;
}
}
/// #else
if (code160to32(title) !== code160to32(this.editElement.textContent)) {

View file

@ -6,6 +6,8 @@ import {updateHotkeyTip} from "../util/compatibility";
/// #if !MOBILE
import {openBacklink, openGraph, openOutline} from "../../layout/dock/util";
import * as path from "path";
/// #else
import {openMobileFileById} from "../../mobile/editor";
/// #endif
import {Constants} from "../../constants";
import {openCardByData} from "../../card/openCard";
@ -214,22 +216,24 @@ export const openTitleMenu = (protyle: IProtyle, position: IPosition) => {
transferBlockRef(protyle.block.rootID);
}
window.siyuan.menus.menu.append(new MenuItem({id: "separator_3", type: "separator"}).element);
/// #if !MOBILE
if (!protyle.model) {
window.siyuan.menus.menu.append(new MenuItem({
id: "openBy",
label: window.siyuan.languages.openBy,
icon: "iconOpen",
click() {
/// #if !MOBILE
openFileById({
app: protyle.app,
id: protyle.block.id,
action: protyle.block.rootID !== protyle.block.id ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_CONTEXT],
});
/// #else
openMobileFileById(protyle.app, protyle.block.id, protyle.block.rootID !== protyle.block.id ? [Constants.CB_GET_ALL] : [Constants.CB_GET_CONTEXT]);
/// #endif
}
}).element);
}
/// #endif
/// #if !BROWSER
window.siyuan.menus.menu.append(new MenuItem({
id: "openByNewWindow",

View file

@ -415,10 +415,14 @@ export const genHintItemHTML = (item: IBlock) => {
if (attrHTML) {
attrHTML = `<div class="fn__flex b3-list-item__meta b3-list-item__showall">${attrHTML}</div>`;
}
return `${attrHTML}<div class="b3-list-item__first">
let countHTML = "";
if (item.refCount) {
countHTML = `<span class="popover__block counter b3-tooltips b3-tooltips__w" aria-label="${window.siyuan.languages.ref}">${item.refCount}</span>`;
}
// data-node-id 用于获取引用面板
return `${attrHTML}<div class="b3-list-item__first" data-node-id="${item.id}">
${iconHTML}
<span class="b3-list-item__text">${item.content}</span>
<span class="b3-list-item__text">${item.content}</span>${countHTML}
</div>
<div class="b3-list-item__meta b3-list-item__showall">${item.hPath}</div>`;
};

View file

@ -6,7 +6,7 @@ import {
focusByWbr,
getEditorRange,
getSelectionOffset,
getSelectionPosition, setLastNodeRange
getSelectionPosition,
} from "../util/selection";
import {genHintItemHTML, hintEmbed, hintRef, hintSlash} from "./extend";
import {getSavePath, newFile} from "../../util/newFile";
@ -559,16 +559,12 @@ ${genHintItemHTML(item)}
}, response => {
// https://github.com/siyuan-note/siyuan/issues/10133
protyle.toolbar.range = range;
protyle.toolbar.setInlineMark(protyle, "block-ref", "range", {
const refElement = protyle.toolbar.setInlineMark(protyle, "block-ref", "range", {
type: "id",
color: `${response.data}${Constants.ZWSP}${refIsS ? "s" : "d"}${Constants.ZWSP}${(refIsS ? fileNames[0] : realFileName).substring(0, window.siyuan.config.editor.blockRefDynamicAnchorTextMaxLen)}`
});
if (protyle.toolbar.range.endContainer.nodeType === 1 &&
protyle.toolbar.range.endContainer.childNodes[protyle.toolbar.range.endOffset]) {
const refElement = hasPreviousSibling(protyle.toolbar.range.endContainer.childNodes[protyle.toolbar.range.endOffset]) as HTMLElement;
if (refElement && refElement.nodeType === 1 && refElement.getAttribute("data-type") === "block-ref") {
setLastNodeRange(refElement as HTMLElement, protyle.toolbar.range, false);
}
if (refElement[0]) {
protyle.toolbar.range.setEnd(refElement[0].lastChild, refElement[0].lastChild.textContent.length);
}
protyle.toolbar.range.collapse(false);
});
@ -600,16 +596,12 @@ ${genHintItemHTML(item)}
tempElement.innerText = dynamicTexts[1];
}
}
protyle.toolbar.setInlineMark(protyle, "block-ref", "range", {
const refElement = protyle.toolbar.setInlineMark(protyle, "block-ref", "range", {
type: "id",
color: `${tempElement.getAttribute("data-id")}${Constants.ZWSP}${tempElement.getAttribute("data-subtype")}${Constants.ZWSP}${tempElement.textContent}`
});
if (protyle.toolbar.range.endContainer.nodeType === 1 &&
protyle.toolbar.range.endContainer.childNodes[protyle.toolbar.range.endOffset]) {
const refElement = hasPreviousSibling(protyle.toolbar.range.endContainer.childNodes[protyle.toolbar.range.endOffset]) as HTMLElement;
if (refElement && refElement.nodeType === 1 && refElement.getAttribute("data-type") === "block-ref") {
setLastNodeRange(refElement as HTMLElement, protyle.toolbar.range, false);
}
if (refElement[0]) {
protyle.toolbar.range.setEnd(refElement[0].lastChild, refElement[0].lastChild.textContent.length);
}
protyle.toolbar.range.collapse(false);
return;
@ -727,7 +719,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 +850,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);

View file

@ -47,7 +47,6 @@ import {getAllModels} from "../layout/getAll";
/// #endif
import {isSupportCSSHL} from "./render/searchMarkRender";
import {renderAVAttribute} from "./render/av/blockAttr";
import {genEmptyElement} from "../block/util";
import {zoomOut} from "../menus/protyle";
export class Protyle {
@ -159,50 +158,7 @@ export class Protyle {
}
break;
case "transactions":
data.data[0].doOperations.find((item: IOperation) => {
if (!this.protyle.preview.element.classList.contains("fn__none")) {
this.protyle.preview.render(this.protyle);
} else if (options.backlinkData && ["delete", "move"].includes(item.action)) {
// 只对特定情况刷新,否则展开、编辑等操作刷新会频繁
/// #if !MOBILE
getAllModels().backlink.find(backlinkItem => {
if (backlinkItem.element.contains(this.protyle.element)) {
backlinkItem.refresh();
return true;
}
});
/// #endif
return true;
} else {
onTransaction(this.protyle, item, false);
// 反链面板移除元素后,文档为空
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);
transaction(this.protyle, [{
action: "insert",
data: emptyElement.outerHTML,
id: newID,
parentID: this.protyle.block.parentID
}]);
this.protyle.undo.clear();
}
}
}
});
this.onTransaction(data);
break;
case "readonly":
window.siyuan.config.editor.readOnly = data.data;
@ -329,6 +285,52 @@ export class Protyle {
}
}
private onTransaction(data: IWebSocketData) {
let needCreateAction = "";
data.data[0].doOperations.find((item: IOperation) => {
if (!this.protyle.preview.element.classList.contains("fn__none")) {
this.protyle.preview.render(this.protyle);
if (item.action === "updateAttrs") {
onTransaction(this.protyle, item, false);
}
} else if (this.protyle.options.backlinkData && ["delete", "move"].includes(item.action)) {
// 只对特定情况刷新,否则展开、编辑等操作刷新会频繁
/// #if !MOBILE
getAllModels().backlink.find(backlinkItem => {
if (backlinkItem.element.contains(this.protyle.element)) {
backlinkItem.refresh();
return true;
}
});
/// #endif
return true;
} else {
onTransaction(this.protyle, item, false);
// 反链面板移除元素后,文档为空
if (!(item.action === "delete" && typeof item.data?.createEmptyParagraph === "boolean" && !item.data.createEmptyParagraph)) {
needCreateAction = item.action;
}
}
});
if (this.protyle.wysiwyg.element.childElementCount === 0 && this.protyle.block.parentID && needCreateAction) {
if (needCreateAction === "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 {
// 不能使用 transaction否则分屏后会重复添加
this.protyle.undo.clear();
this.reload(false);
}
}
}
private getDoc(mergedOptions: IProtyleOptions) {
fetchPost("/api/filetree/getDoc", {
id: mergedOptions.blockId,

View file

@ -1,5 +1,5 @@
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";
@ -199,7 +199,7 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
return true;
} 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,
@ -356,7 +356,7 @@ 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-dtype="block"]') as HTMLElement;
const ids = Array.from(rowElements).map(item => item.getAttribute("data-id"));
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];
@ -573,16 +573,20 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi
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,
srcs,
context: {ignoreTip: "true"},
blockID: listItemElement.dataset.blockId,
groupID: rowElement.parentElement.getAttribute("data-group-id")
}, {
@ -714,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);
@ -829,12 +833,11 @@ export const updateAttrViewCellAnimation = (cellElement: HTMLElement, value: IAV
if (value.type === "checkbox") {
value.checkbox = {
checked: value.checkbox?.checked || false,
content: cellElement.getAttribute("aria-label"),
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.querySelector(".av__gallery-tip").outerHTML;
cellElement.setAttribute("data-empty", cellValueIsEmpty(value).toString());
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);
}

View file

@ -19,8 +19,11 @@ 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,
srcs,
blockID: listItemElement.dataset.blockId
@ -37,8 +40,11 @@ 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,
srcs: [{
itemID: Lute.NewNodeID(),
@ -89,8 +95,11 @@ export const addEditorToDatabase = (protyle: IProtyle, range: Range, type?: stri
});
});
const avID = listItemElement.dataset.avId;
const viewID = listItemElement.dataset.viewId;
transaction(protyle, [{
action: "insertAttrViewBlock",
ignoreDefaultFill: viewID ? false : true,
viewID,
avID,
srcs,
blockID: listItemElement.dataset.blockId

View file

@ -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) ||

View file

@ -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,6 +20,7 @@ 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) {
@ -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");
}
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")}`;
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 (html) {
html = `<span class="av__celltext">${html}</span>`;
@ -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">${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 + ",&nbsp;";
html += rollupText.replace("fn__flex-1", "") + ",&nbsp;";
}
});
if (html && html.endsWith(",&nbsp;")) {
@ -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}">
@ -211,7 +219,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
if (element.innerHTML) {
// 防止 blockElement 找不到
element.querySelector(`.av[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 === "") {
@ -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();
@ -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.rowId,
itemID: item.parentElement.dataset.rowId,
value
}, (setResponse) => {
if (type === "number") {
@ -457,7 +465,20 @@ const openEdit = (protyle: IProtyle, element: HTMLElement, event: MouseEvent) =>
}
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) => {

View file

@ -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 {
@ -306,7 +309,7 @@ export const genCellValue = (colType: TAVCol, value: string | any) => {
content2: dateObj2.valueOf() || 0,
isNotEmpty2: !isNaN(dateObj2.valueOf()),
hasEndDate: !isNaN(dateObj2.valueOf()),
isNotTime: dateObj1.hour() === 0,
isNotTime: dateObj1.hour() === 0 && values[0].split(":").length === 1,
formattedContent: "",
}
};
@ -427,14 +430,18 @@ 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");
const footerElement = bodyElement.querySelector(".av__row--footer");
if (footerElement?.querySelector(".av__calc--ashow")) {
const avFooterRect = footerElement.getBoundingClientRect();
if (avFooterRect.top < cellRect.bottom) {
@ -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");
@ -510,6 +517,9 @@ export const popTextCell = (protyle: IProtyle, cellElements: HTMLElement[], type
html = `<input type="number" spellcheck="false" value="${cellElements[0].firstElementChild.getAttribute("data-content")}" ${style} class="b3-text-field">`;
} else {
if (["select", "mSelect"].includes(type)) {
if (blockElement.getAttribute("data-rendering") === "true") {
return;
}
openMenuPanel({protyle, blockElement, type: "select", cellElements});
} else if (type === "mAsset") {
openMenuPanel({protyle, blockElement, type: "asset", cellElements});
@ -989,13 +999,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>`;
}
}
});
@ -1035,8 +1046,8 @@ const renderRollup = (cellValue: IAVCellValue) => {
}
} 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 {
@ -1101,7 +1112,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) => {
@ -1127,6 +1138,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) ||
@ -1149,8 +1161,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;
@ -1176,6 +1187,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>`);
}
};

View file

@ -192,15 +192,11 @@ export const getEditHTML = (options: {
<input type="checkbox" data-type="wrap" class="b3-switch b3-switch--menu"${colData.wrap ? " checked" : ""}>
</label>`;
if (colData.type !== "block") {
html += `<button class="b3-menu__item" data-type="${colData.hidden ? "showCol" : "hideCol"}">
<svg class="b3-menu__icon" style=""><use xlink:href="#icon${colData.hidden ? "Eye" : "Eyeoff"}"></use></svg>
<span class="b3-menu__label">${colData.hidden ? window.siyuan.languages.showCol : window.siyuan.languages.hideCol}</span>
</button>
<button class="b3-menu__item${colData.type === "relation" ? " fn__none" : ""}" data-type="duplicateCol">
html += `<button class="b3-menu__item${colData.type === "relation" ? " fn__none" : ""}" data-type="duplicateCol">
<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>`;
@ -468,11 +464,11 @@ export const bindEditEvent = (options: {
});
if (oldValue.avID) {
fetchPost("/api/av/getAttributeView", {id: oldValue.avID}, (response) => {
goSearchElement.querySelector(".b3-menu__accelerator").textContent = oldValue.avID === avID ? window.siyuan.languages.thisDatabase : (response.data.av.name || window.siyuan.languages.title);
goSearchElement.querySelector(".b3-menu__accelerator").textContent = oldValue.avID === avID ? window.siyuan.languages.thisDatabase : (response.data.av.name || window.siyuan.languages._kernel[267]);
response.data.av.keyValues.find((item: { key: { id: string, name: string } }) => {
if (item.key.id === oldValue.backKeyID) {
inputElement.setAttribute("data-old-value", item.key.name || window.siyuan.languages.title);
inputElement.value = item.key.name || window.siyuan.languages.title;
inputElement.setAttribute("data-old-value", item.key.name || window.siyuan.languages._kernel[272]);
inputElement.value = item.key.name || window.siyuan.languages._kernel[272];
return true;
}
});
@ -571,20 +567,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 +801,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 +812,7 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
avData.view.filters.push(filter);
}
setFilter({
empty,
filter,
protyle,
data: avData,
@ -875,8 +873,88 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
});
}
});
menu.addSeparator({id: "separator_2"});
}
const isPin = cellElement.dataset.pin === "true";
menu.addItem({
id: isPin ? "unfreezeCol" : "freezeCol",
icon: isPin ? "iconUnpin" : "iconPin",
label: isPin ? window.siyuan.languages.unfreezeCol : window.siyuan.languages.freezeCol,
click() {
transaction(protyle, [{
action: "setAttrViewColPin",
id: colId,
avID,
data: !isPin,
blockID
}], [{
action: "setAttrViewColPin",
id: colId,
avID,
data: isPin,
blockID
}]);
updateAttrViewCellAnimation(blockElement.querySelector(`.av__row--header .av__cell[data-col-id="${colId}"]`), undefined, {pin: !isPin});
}
});
if (type !== "block") {
menu.addItem({
id: "hide",
icon: "iconEyeoff",
label: window.siyuan.languages.hide,
click() {
transaction(protyle, [{
action: "setAttrViewColHidden",
id: colId,
avID,
data: true,
blockID
}], [{
action: "setAttrViewColHidden",
id: colId,
avID,
data: false,
blockID
}]);
}
});
}
menu.addItem({
icon: "iconRefresh",
label: window.siyuan.languages.syncColWidth,
click() {
transaction(protyle, [{
action: "syncAttrViewTableColWidth",
keyID: colId,
avID,
id: blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
}]);
}
});
menu.addItem({
icon: "iconSoftWrap",
label: `<label class="fn__flex" style="margin-bottom: 4px"><span>${window.siyuan.languages.wrap}</span><span class="fn__space fn__flex-1"></span>
<input type="checkbox" class="b3-switch b3-switch--menu"${cellElement.dataset.wrap === "true" ? " checked" : ""}></label>`,
bind(element) {
const wrapElement = element.querySelector(".b3-switch") as HTMLInputElement;
wrapElement.addEventListener("change", () => {
transaction(protyle, [{
action: "setAttrViewColWrap",
id: colId,
avID,
data: wrapElement.checked,
blockID
}], [{
action: "setAttrViewColWrap",
id: colId,
avID,
data: !wrapElement.checked,
blockID
}]);
menu.close();
});
}
});
menu.addSeparator({id: "separator_2"});
menu.addItem({
id: "insertColumnLeft",
icon: "iconInsertLeft",
@ -911,62 +989,6 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
});
}
});
if (type !== "block") {
menu.addItem({
id: "hide",
icon: "iconEyeoff",
label: window.siyuan.languages.hide,
click() {
transaction(protyle, [{
action: "setAttrViewColHidden",
id: colId,
avID,
data: true,
blockID
}], [{
action: "setAttrViewColHidden",
id: colId,
avID,
data: false,
blockID
}]);
}
});
}
const isPin = cellElement.dataset.pin === "true";
menu.addItem({
id: isPin ? "unfreezeCol" : "freezeCol",
icon: isPin ? "iconUnpin" : "iconPin",
label: isPin ? window.siyuan.languages.unfreezeCol : window.siyuan.languages.freezeCol,
click() {
transaction(protyle, [{
action: "setAttrViewColPin",
id: colId,
avID,
data: !isPin,
blockID
}], [{
action: "setAttrViewColPin",
id: colId,
avID,
data: isPin,
blockID
}]);
updateAttrViewCellAnimation(blockElement.querySelector(`.av__row--header .av__cell[data-col-id="${colId}"]`), undefined, {pin: !isPin});
}
});
menu.addItem({
icon: "iconRefresh",
label: window.siyuan.languages.syncColWidth,
click() {
transaction(protyle, [{
action: "syncAttrViewTableColWidth",
keyID: colId,
avID,
id: blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
}]);
}
});
if (type !== "block") {
if (type !== "relation") {
menu.addItem({
@ -1001,16 +1023,22 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
if (colData.key.relation?.isTwoWay) {
const relResponse = await fetchSyncPost("/api/av/getAttributeView", {id: colData.key.relation.avID});
const dialog = new Dialog({
title: window.siyuan.languages.removeCol.replace("${x}", colData.key.name),
title: window.siyuan.languages.removeColConfirm,
content: `<div class="b3-dialog__content">
${window.siyuan.languages.confirmRemoveRelationField.replace("${x}", relResponse.data.av.name)}
${window.siyuan.languages.confirmRemoveRelationField
.replace("${x}", colData.key.name || window.siyuan.languages._kernel[272])
.replace("${y}", relResponse.data.av.name || window.siyuan.languages._kernel[267])
.replace("${z}", relResponse.data.av.keyValues.find((item: {
key: { id: string }
}) => item.key.id === colData.key.relation.backKeyID).key.name || window.siyuan.languages._kernel[272])}
<div class="fn__hr--b"></div>
<button class="fn__block b3-button b3-button--remove" data-action="delete">${window.siyuan.languages.delete}</button>
<button class="fn__block b3-button b3-button--remove" data-action="delete">${window.siyuan.languages.removeBothRelationField}</button>
<div class="fn__hr"></div>
<button class="fn__block b3-button b3-button--remove" data-action="keep-relation">${window.siyuan.languages.removeButKeepRelationField}</button>
<div class="fn__hr"></div>
<button class="fn__block b3-button b3-button--cancel">${window.siyuan.languages.cancel}</button>
</div>`,
width: "520px",
});
dialog.element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
@ -1816,7 +1844,7 @@ const genColDataByType = (type: TAVCol, id: string, name: string) => {
template: "",
type,
width: "",
wrap: false,
wrap: undefined,
calc: null
};
return colData;

Some files were not shown because too many files have changed in this diff Show more