From 35c89e086ee7732e51cc83c9b3dba55abb96ff4c Mon Sep 17 00:00:00 2001 From: landaiqing Date: Sun, 22 Jun 2025 12:08:50 +0800 Subject: [PATCH] :art: Updated --- build/linux/appimage/appicon.png | Bin 0 -> 7019 bytes build/linux/voidraft.desktop | 10 +++++ frontend/src/stores/editorStore.ts | 11 +++--- .../views/editor/extensions/statsExtension.ts | 36 +++++++++++++++--- internal/models/config.go | 13 +------ internal/models/document.go | 2 +- internal/services/startup_linux.go | 1 - 7 files changed, 47 insertions(+), 26 deletions(-) create mode 100644 build/linux/appimage/appicon.png create mode 100644 build/linux/voidraft.desktop diff --git a/build/linux/appimage/appicon.png b/build/linux/appimage/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..613d22351886f3b3382d9c1cb1442702def45659 GIT binary patch literal 7019 zcmV-x8Py5B}qgVSw z?RB`Dm;hL0vsf(RoJ4}JLjCyBBnV{Y$u|IN%CAtMP~a*BY@tn|K%u~O3KW18=_nMK zpg;jg5syNF0+1pDg#t1P6bmAwTY2k7C{O@$BaAM~lu@7nL`Jvr){Ri00OUp(U6v`M zKmmx1Zsn~Tp+Eu1jWD__Q$~RT5E42cNBxeGEoUzBsR9|lqGzB1P(v)u?4~EtnWCH^{eRmAj$Ajjn`n-25Qvd=B#=H*( zP~@}@YRhrQJ%gnHL`_iA2iguOuC3J_tu>#`--qK~EK31Mx?CrX-~;R0xu2GIosyO@ z^0GTxbNI0JxTOF@TQ0!yJTRPjzBk6c0bkkXW6nI<%6-_XRVe_OS?s(U<(&Cx_rMs^ zb)!Hj0GSCOHw%ml`fe*uDFDd~kN}L@-e;*(WS)E8;kN;l0+38n5Mm5hKgHT_cKfGAHOz*#aE{SqkX;$wHE)JFFb~ddxqlUm_>OyykBe9s{kYe zK%Rg2=YzE_RJwEh&cKi1>iHoR9D4>v4xlUrk^&F{AOReQ`b$do#xwfx?c)dHv%7fI z)2=?a`!v^U{5MK0fkT)7@&n{VQxZy47ELQe$3_6o3GdnhK6vwHi~T zO-gY1;QhIJJ4ZsJ03-sCrpeGg05~dEgCtUtHJJ${1t1elO#w%-8W>u-*hJErGXqEp zK(6pn>{fZE+3NkR#~K(sUY>e>{mZ?yeZ@Xi-{*3-3P8pjqmat2|74kLj5}7}KE37N zD{puTh_i$lElB~$KsK8?M*+uDkX;){3P1*uAghoU%b^Jao__BA8g3lQufnFS#H#W4BK zZKcwMCGJ=~qL|E!9Eg3mQ(=3Xyz2kGYcDjhnZt> ztx~wO%)1PK{R~l8D+wS;o9=~lL>JZ{zE}?-u{ZWwj(}YZ5H>i{qP4_|FxsV94=qm3 zKMu9g3T$Q+0fZ5_9AsjwNUI0Hlqte z;t+V=#d^dgcZMfo{9-^78>_#ZDOrjFM11_FutglLiXs3(-76-hnL$o&@)Kw>1>w6V zAd}IW>YA7Y2s-H@M;W9K-$gA*%*BG;t71J?0Z3F4GqQy$+YstpiAAmgghAk$xk@++ z2L>b{)F^Qng0Di7Ry>Jtulni71l2*~qo?SD^@}hj(a3nsi?|99RKPlZ30zFaj1Pl?o1zbXPy1r|8AB zJ{+I{mS}cq+t>%EvYRnJN!@ENZ|L~|6!1petWkhaDP6+kUBoKF3o&CUSyXGV4BVLP zW}hyih!_ivjMuqvgyl!$+OfG_0E9tY2yTQi2jx=rSq*3pIC~|Wdv?j&$Oj-rN-9uP zn3=04P~eSavn~LFPtbc-@*7(r;*JPPOe4YWApo?E$mwF!L}i7M6I7U|GEWzt3KOgk z+^jQzFq2~tJe)B1oipkf_z-ItK2Voa{CgRcy zYCw&Tf{)Q^>7umH5l~t;c^ur^V8%rYhj3gvICr@N2<)1Wi%l_i-Mb(-g7$g+^A}_6 zo0v#SW2e}-xAylON|mX>#a!-|AE;+BRQ?@6VAK-AIwmaecV5tOwC3;uy@vx0&|{VO zTM~3%qzmi)`*36nd>lXVE^MjBpW+(|=Dzam0D=k@V=Bici)#3QWHQSHTfsz-?*%;L z!p$GGgbE(xnoBkQ6mMYA_1wV#5LmE`F{zptoh0g8p2as{wt@-n_5ubrQNqxlu_BCu zMS+JZQn;O^cUy4)2);nvL|zjt6d)1{g06#M(jEbVDMZeapu!xwF2Ex|QCVRW9yHIM zhYtmk6wa!y2D(nIVAmx_d3A zO`3iywEtyFa2P_iIu;rPGZ`&(%$UMsvu;_&iwSp=$he;3MFn#T-RKxo85MMl0+4g4 zG66d(fNUTfQyxo=7uK5!5LElef_%t5ngS}?W(v1WsJW+la8N5W zCEVy3sGGnD*dCsR1sbSFg<>Sy_7gcgx}_~VKVUpYA!8O~!W5!tY(g3H+wi1r_Wi@R zj~~Va5(Ws_Lca&$N7jJS4~^kaiym{m=|Ei@AR0(V(cK38&e&sD+W?vikvfRRIuJqH z>od5b0{wij?F6;x+Wf_0BzLs%hbK%cs(q4#E0$^o?*T!JQ%Q5(=*y7MWbpH^c?Eqk z!g2~&5I-)oR^yI%FV;k_3zI68%8o{muho$(UBlYnLp=ecAjkOmhd=)PK1LfDAfOA4 z1B3{&r`p}KT9Js>Lcd)ySkqz%3!$=>uD*SG8wCh>l^z(fdq2{_VLF)j*b%} z#_;c2-z@+s0HLyCEkIDs5zAoYaJ6DV9BMs0VM_e5U4Xz@F)$5{D)Z*h1~B8`pN;vS zTm#%R!(!lItY3*g;&vNVlrf9mX=xyF5>vYESg4F5GSdX<==o`<8K8(l+6^=;39?Ye zdKC8x0Eo7qzh;0SVMXg=dD5ZUBUlm8j0FL9<{f(PN3dqj{$4%X53vKx&@4$S7R9}a z0|eEo2rW_mpcVvGhNx^p2B8lSyijzyFb6!kC4etzCiliTdp8aicXY0LM1T=MDD1K{AlkB>K8yxzTJzlUIH-n(0ixaR4rIhocN&$aupeZMsVMp{-t|FEvT?I&RwZNSCH7130t+k&e zu9q(g)phkFa?bAf_pz32Edks5I54jXmsM4u;akZtzN1CQNq~5!qgr5EKwQ}S;rD=4 zruynLSN^~I*(+};jD5Zfpz!Hnd&+W2B#&UCWcWS40|_&c@IWmRS_6SyBJgxYR3QWx zeTw01y@3)QXC9M)FzS=xN9$8_-SNYyumq(BcJZQPqHeJIcxZg&Ybprubu0<;rG#gE z{4+x~En$YMdll96Vd8{kMlF(d21|RqaIzxGHMCHJj;H$^=6mXX^L(`Sp1<1J?}q#C zbAC5vY&3J#-~+p*76x4gz#%E#5IPVUF&H3zVARy5FpYnAS#Vsd&!9bJ{CaiXpm<3L zGdeCDf1m+6I7b%16hML|@hLJ_Kd8qK0=_R@=ZF)VyT(jF0?{k+c@L~3Xgz{oFg0X(*S8n7gA-ly?C zF`%n@Uu|iZe<`KtDF15wO&lP>Ib9SaxqI0d>#=OWkM(qQcNE6OfPbQ?RGOcz@BfI8 z89-6hU+sTB{T_dMnI|}aEC&*4Jqt~nvI!h*_X_PWhBH__itB)%-FO9#W=6d)oZ@%YRCmNIv=ZI?g0DCmkM7nIKdxg#w zp6BqMbPZv-)iHQ0(xo}Fx?Elu>VvzN^|NuQb4F31)p!Qj+7_t~xa<~W?ZD}_1BdI$S_lv`>5aF^hWA-i5OK70b*@^my!s%h>bu2Zr@{EE6RGHTP+A{2fJ*8F>ewe5MzOR z*)IZH;cmA(YHmBXAKWN(;c~60vGZbXU~}Kad&D`;{#{1Fpj%oEVKPW#V@MhuSze%-D?dN9 za_*mnfp;ZkoCP3=KrC*+6S4Y{;{!M{`!bh*K<3_--lyL^5fcE z<^V^d;j#XxuzZrVN!rW0h6g&$m)$qlV_T=e+mK063?X20=e_N zT@%Gq(rse^J_Woi0AUu+XayK}jkVU*eh&`9mhx>iipJm^L+>xsB+*#N?r zX(kQHj4N@qXyy&2B|`uo)BGuaPu@RbILi@~5ZbMKS{SS77$p~T#j^n0*}6%4ve6GkJYzNZ_#hE+PxW<`vzk@kg>A@gwYg?6=7X1Nj#G3 zZuNb0-#swb9`u;7ro|a&4y6nnOiDeo>xL-KtN@_|nTSP1W*WR+dMIFeeN<^X24jLB z`@7bT!=Tf_YX*jMVp6)nJtjABF_|kguE`1zR*+d=lXZjG@mmJ#AGdk}i>ba!E*Oe| zp__Mm{8HjJ+%vmD)*{+>S#U@|$jAc7WSnp- zm$To6t++W(x=ctuFhO$@c9_TNkB{FY>u#T6+<9jF>;Pe{2ogB;2}cp;^db}QT)13w z9kuE&7z%!d3;%4-4-5Oy!~d|&KgpI9M(AFiI@^&WyD1#hfvm&MA}Yyin^Mc7zJ3nY4J)42g~?R)9<8#?9)lFr8+ zT+M@TcAV9Mh|n(aMVUPNNk%jp4!tI;o%<>`dK>Pw&9+QNe0PhbS7Qs4vgR-3@<`ny_FVZXSX2jq^Z=LpzWY@w~YCX z6{O~QU2D?0+yD6W&ivo=o9=?4#?hs=*P`nQ+i*`i5G5zc#JKVt0jm>I*&MI|Yz!YPsc3x)zdfkI%fm>3F)GhISNyEp^FNG&uA4oTX0 z$iu}fh)l!Fw0de`Pt#u)gUDN+(=W#!baY<4ke-h$i8(~FBFtK?3Luh&OH;C`APJt( zj8~_j0z21pvcg|)cEW5`Fs9^jr;XPtk2_Z3V)ZA%R>7ryCGFN-k-l33ib|Wj&^->| z5F`Pl@-fElMP00RLK4B15<&8CE!R&>8=(a5?3pb zUbr_Qd@tc}hBHF$3@8B@wY}HLtj!M&_9UB_Vp)X+X(uVET}U$`o%we4gN`sX+R~q# z?(Z#GGLVijeeCbLz~EZShw~9x4#l`*buq|UJi@dtpI%G>iK;c}$E1FXuj1{s5}}X1 zqYaAYd$LSp=WYvP4*#xJP(GyDsw_x5IW}ky1WK$|nfbC zhhZ;zAX-y>&kKh0^`u&jFn@tt-MVw^xm*Z0`p>KuAc5b)JN~4_#3AwWxm_%q*7v+d zcR`xPmS@NqYOWd}DIiG=7W+gjKzX5t1~59ln)(YPti4&#ht|oyGvl6g=>$9fRMK#m z(B3dM-%vZ*%tojbieJ8~1&ofL!Y*scd08oxSiJ>l7bo2*7_^o09Uiv?6ir~Ho(DWP zIGT8FLqBOu(gt+)>F{1N&6@L$!DZRf+(xX~MkCEqwRA|$P)g~!DS)KKBn^o)vMyu9 z-ac6LLGco6Jm06J&U5h$0nO$B5{ORkYafy#J#Rln+?>TYgsIFknl9AvyBhs&xhmu+ zjW!7o9gyh9Cf6)Ww;w%R!kK4#EynPs-r{e<)pVaO)Q@2Q#zy#TuF0)V1iaTYz+o$kMvL?1h|K%%5_h{63OAeP`Qp zU3U+VT-M}8xYo5}Pzs)QbCtF3opg-YdrMZtV{_Ym77HPOUY>sHYk68Wko7Uobby$l zJ9&vFLxvVp&)$Ru84_UL{T<6&7{6XmgM4n&mGp-2Zh9@@))?m|0n!pqr@$y+gFkfI zy2rBvr+bAyKO$P}>k5qh?YHe!&|#qYTU+*&%(!WQEDjVDTiq${^9wsV#SrW5z+w#7 zTL99d$h@u>BYNw8c8|blDP90FB73Pj-_|Y8TC;1C5jigA(VC&gI0YaRR17!Q`m56< z`{6aXv%)d<6kj0ZEdW8NbUK1)+t)mU3mvnlKDMapuY0!^V-zX?5y;KpvA50Ozta&OG{)<%4DL`_TRG@52!-LS`n-CWbEnS&&WP`saX} z^X;|af7$x{?(_gE7Y?)Tw%vvYoB!9iNA9lz0$qj{faub*jJ7ih6oBlEp=CL`6es}E zrDqv!XA~#^*%?F2a&#$B0HRCJGTP24Pyn(shL+{%QlJ1tm!4&`ol&3wWM>R5%h9Dk z0f;U=%V;~JKmo|k7+RL2OMwCqU3!+$c1D2$kexBKEJv3D{{uNI9-%l}e767q002ov JPDHLkV1ljL1djj! literal 0 HcmV?d00001 diff --git a/build/linux/voidraft.desktop b/build/linux/voidraft.desktop new file mode 100644 index 0000000..680f1db --- /dev/null +++ b/build/linux/voidraft.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=voidraft +Exec=voidraft +Icon=appicon +Categories=Development; +Terminal=false +Keywords=wails +Version=1.0 +StartupNotify=false diff --git a/frontend/src/stores/editorStore.ts b/frontend/src/stores/editorStore.ts index 44d6bd6..d4dc165 100644 --- a/frontend/src/stores/editorStore.ts +++ b/frontend/src/stores/editorStore.ts @@ -9,7 +9,6 @@ import {createBasicSetup} from '@/views/editor/extensions/basicSetup'; import { createStatsUpdateExtension, getTabExtensions, - updateStats, updateTabConfig, createAutoSavePlugin, createSaveShortcutPlugin, @@ -22,7 +21,7 @@ import { useThemeStore } from './themeStore'; import { useI18n } from 'vue-i18n'; import { SystemThemeType } from '@/../bindings/voidraft/internal/models/models'; import { DocumentService } from '@/../bindings/voidraft/internal/services'; - +import {ensureSyntaxTree } from "@codemirror/language" export interface DocumentStats { lines: number; characters: number; @@ -199,15 +198,15 @@ export const useEditorStore = defineStore('editor', () => { // 将编辑器实例保存到store setEditorView(view); + isEditorInitialized.value = true; - // 确保编辑器已渲染后再滚动到底部 scrollToBottom(view); + + ensureSyntaxTree(view.state, view.state.doc.length, 5000) + // 应用初始字体大小 applyFontSize(); - - // 立即更新统计信息 - updateStats(view, updateDocumentStats); }; // 重新配置编辑器 diff --git a/frontend/src/views/editor/extensions/statsExtension.ts b/frontend/src/views/editor/extensions/statsExtension.ts index a7db4f0..429ae1a 100644 --- a/frontend/src/views/editor/extensions/statsExtension.ts +++ b/frontend/src/views/editor/extensions/statsExtension.ts @@ -1,6 +1,8 @@ import {Extension} from '@codemirror/state'; import {EditorView} from '@codemirror/view'; import {DocumentStats} from '@/stores/editorStore'; +import {getActiveNoteBlock} from '@/views/editor/extensions/codeblock/state'; + // 更新编辑器文档统计信息 export const updateStats = ( view: EditorView, @@ -9,22 +11,44 @@ export const updateStats = ( if (!view) return; const state = view.state; - const doc = state.doc; - const text = doc.toString(); - // 计算选中的字符数 + // 获取当前光标所在的代码块 + const activeBlock = getActiveNoteBlock(state as any); + + if (!activeBlock) { + // 如果没有活动块,显示空统计 + updateDocumentStats({ + lines: 0, + characters: 0, + selectedCharacters: 0 + }); + return; + } + + // 获取当前块的内容范围 + const blockContent = state.doc.sliceString(activeBlock.content.from, activeBlock.content.to); + + // 计算块内容的行数 + const blockLines = blockContent.split('\n').length; + + // 计算选中的字符数(只统计在当前块内的选中内容) let selectedChars = 0; const selections = state.selection; if (selections) { for (let i = 0; i < selections.ranges.length; i++) { const range = selections.ranges[i]; - selectedChars += range.to - range.from; + // 计算选中范围与当前块内容范围的交集 + const selectionStart = Math.max(range.from, activeBlock.content.from); + const selectionEnd = Math.min(range.to, activeBlock.content.to); + if (selectionStart < selectionEnd) { + selectedChars += selectionEnd - selectionStart; + } } } updateDocumentStats({ - lines: doc.lines, - characters: text.length, + lines: blockLines, + characters: blockContent.length, selectedCharacters: selectedChars }); }; diff --git a/internal/models/config.go b/internal/models/config.go index 35366de..3d6e04b 100644 --- a/internal/models/config.go +++ b/internal/models/config.go @@ -1,8 +1,6 @@ package models import ( - "os" - "path/filepath" "time" ) @@ -103,19 +101,10 @@ type ConfigMetadata struct { // NewDefaultAppConfig 创建默认应用配置 func NewDefaultAppConfig() *AppConfig { - // 获取当前工作目录 - currentDir, err := os.Getwd() - if err != nil { - currentDir = "." - } - - // 默认路径配置 - 使用当前目录 - dataDir := filepath.Join(currentDir, "data") - return &AppConfig{ General: GeneralConfig{ AlwaysOnTop: false, - DataPath: dataDir, + DataPath: "./data", EnableSystemTray: true, StartAtLogin: false, EnableGlobalHotkey: false, diff --git a/internal/models/document.go b/internal/models/document.go index 0d1306b..99569af 100644 --- a/internal/models/document.go +++ b/internal/models/document.go @@ -36,6 +36,6 @@ func NewDefaultDocument() *Document { LastUpdated: now, CreatedAt: now, }, - Content: "\n∞∞∞text-a\n", + Content: "∞∞∞text-a\n", } } diff --git a/internal/services/startup_linux.go b/internal/services/startup_linux.go index c51fe9b..6268645 100644 --- a/internal/services/startup_linux.go +++ b/internal/services/startup_linux.go @@ -6,7 +6,6 @@ import ( "fmt" "os" "path/filepath" - "strings" "text/template" "github.com/wailsapp/wails/v3/pkg/services/log"