Преглед изворни кода

:art: 状态栏实时统计文档信息 https://github.com/siyuan-note/siyuan/issues/6036

Liang Ding пре 2 година
родитељ
комит
a772b47287

+ 5 - 0
app/src/dialog/processSystem.ts

@@ -9,6 +9,7 @@ import {hideMessage, showMessage} from "./message";
 import {Dialog} from "./index";
 import {Dialog} from "./index";
 import {isMobile} from "../util/functions";
 import {isMobile} from "../util/functions";
 import {confirmDialog} from "./confirmDialog";
 import {confirmDialog} from "./confirmDialog";
+import {renderStatusbarCounter} from "../layout/status";
 
 
 export const lockFile = (id: string) => {
 export const lockFile = (id: string) => {
     const html = `<div class="b3-dialog__scrim"></div>
     const html = `<div class="b3-dialog__scrim"></div>
@@ -187,6 +188,10 @@ export const progressStatus = (data: IWebSocketData) => {
     document.querySelector("#status .status__msg").innerHTML = data.msg;
     document.querySelector("#status .status__msg").innerHTML = data.msg;
 };
 };
 
 
+export const handleStatusbarCounter = (data: IWebSocketData) => {
+    renderStatusbarCounter(data.data.runeCount, data.data.wordCount);
+};
+
 export const progressLoading = (data: IWebSocketData) => {
 export const progressLoading = (data: IWebSocketData) => {
     let progressElement = document.getElementById("progress");
     let progressElement = document.getElementById("progress");
     if (!progressElement) {
     if (!progressElement) {

+ 3 - 1
app/src/index.ts

@@ -12,7 +12,7 @@ import {addBaseURL, setNoteBook} from "./util/pathName";
 import {openFileById} from "./editor/util";
 import {openFileById} from "./editor/util";
 import {
 import {
     bootSync,
     bootSync,
-    downloadProgress,
+    downloadProgress, handleStatusbarCounter,
     progressLoading,
     progressLoading,
     progressStatus,
     progressStatus,
     setTitle,
     setTitle,
@@ -48,6 +48,8 @@ class App {
                             case"statusbar":
                             case"statusbar":
                                 progressStatus(data);
                                 progressStatus(data);
                                 break;
                                 break;
+                            case"statusbarCounter":
+                                handleStatusbarCounter(data)
                             case"downloadProgress":
                             case"downloadProgress":
                                 downloadProgress(data.data);
                                 downloadProgress(data.data);
                                 break;
                                 break;

+ 9 - 10
app/src/layout/status.ts

@@ -137,11 +137,7 @@ export const countSelectWord = (range: Range) => {
     const selectText = range.toString();
     const selectText = range.toString();
     if (selectText) {
     if (selectText) {
         fetchPost("/api/block/getContentWordCount", {"content": range.toString()}, (response) => {
         fetchPost("/api/block/getContentWordCount", {"content": range.toString()}, (response) => {
-            document.querySelector("#status .status__counter").innerHTML = `<span class="ft__on-surface">${window.siyuan.languages.runeCount}</span>
-&nbsp;${response.data.runeCount}
-<span class="fn__space"></span>
-<span class="ft__on-surface">${window.siyuan.languages.wordCount}</span>
-&nbsp;${response.data.wordCount}<span class="fn__space"></span>`;
+            renderStatusbarCounter(response.data.runeCount, response.data.wordCount);
         });
         });
     } else {
     } else {
         document.querySelector("#status .status__counter").innerHTML = "";
         document.querySelector("#status .status__counter").innerHTML = "";
@@ -156,11 +152,7 @@ export const countBlockWord = (ids: string[]) => {
     }
     }
     if (ids.length > 0) {
     if (ids.length > 0) {
         fetchPost("/api/block/getBlocksWordCount", {ids}, (response) => {
         fetchPost("/api/block/getBlocksWordCount", {ids}, (response) => {
-            document.querySelector("#status .status__counter").innerHTML = `<span class="ft__on-surface">${window.siyuan.languages.runeCount}</span>
-&nbsp;${response.data.runeCount}
-<span class="fn__space"></span>
-<span class="ft__on-surface">${window.siyuan.languages.wordCount}</span>
-&nbsp;${response.data.wordCount}<span class="fn__space"></span>`;
+            renderStatusbarCounter(response.data.runeCount, response.data.wordCount);
         });
         });
     } else {
     } else {
         document.querySelector("#status .status__counter").innerHTML = "";
         document.querySelector("#status .status__counter").innerHTML = "";
@@ -168,3 +160,10 @@ export const countBlockWord = (ids: string[]) => {
     /// #endif
     /// #endif
 };
 };
 
 
+export const renderStatusbarCounter = (runeCount: number, wordCount: number) => {
+    document.querySelector("#status .status__counter").innerHTML = `<span class="ft__on-surface">${window.siyuan.languages.runeCount}</span>
+&nbsp;${runeCount}
+<span class="fn__space"></span>
+<span class="ft__on-surface">${window.siyuan.languages.wordCount}</span>
+&nbsp;${wordCount}<span class="fn__space"></span>`;
+}

+ 7 - 0
kernel/model/transaction.go

@@ -997,6 +997,8 @@ func (tx *Transaction) begin() (err error) {
 
 
 func (tx *Transaction) commit() (err error) {
 func (tx *Transaction) commit() (err error) {
 	for _, tree := range tx.trees {
 	for _, tree := range tx.trees {
+		go pushTreeStat(tree)
+
 		if err = writeJSONQueue(tree); nil != err {
 		if err = writeJSONQueue(tree); nil != err {
 			return
 			return
 		}
 		}
@@ -1007,6 +1009,11 @@ func (tx *Transaction) commit() (err error) {
 	return
 	return
 }
 }
 
 
+func pushTreeStat(tree *parse.Tree) {
+	runeCount, wordCount := treenode.TreeStat(tree)
+	util.PushStatusBarCounter(runeCount, wordCount)
+}
+
 func (tx *Transaction) rollback() {
 func (tx *Transaction) rollback() {
 	tx.trees, tx.nodes = nil, nil
 	tx.trees, tx.nodes = nil, nil
 	return
 	return

+ 5 - 0
kernel/treenode/tree.go

@@ -31,6 +31,11 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
+func TreeStat(tree *parse.Tree) (runeCount, wordCount int) {
+	runeCount, wordCount = tree.Root.ContentLen()
+	return
+}
+
 func NodeHash(node *ast.Node, tree *parse.Tree, luteEngine *lute.Lute) string {
 func NodeHash(node *ast.Node, tree *parse.Tree, luteEngine *lute.Lute) string {
 	ialArray := node.KramdownIAL
 	ialArray := node.KramdownIAL
 	sort.Slice(ialArray, func(i, j int) bool {
 	sort.Slice(ialArray, func(i, j int) bool {

+ 7 - 0
kernel/util/websocket.go

@@ -151,6 +151,13 @@ func PushStatusBar(msg string) {
 	BroadcastByType("main", "statusbar", 0, msg, nil)
 	BroadcastByType("main", "statusbar", 0, msg, nil)
 }
 }
 
 
+func PushStatusBarCounter(runeCount, wordCount int) {
+	BroadcastByType("main", "statusbarCounter", 0, "", map[string]interface{}{
+		"runeCount": runeCount,
+		"wordCount": wordCount},
+	)
+}
+
 func ContextPushMsg(context map[string]interface{}, msg string) {
 func ContextPushMsg(context map[string]interface{}, msg string) {
 	switch context[eventbus.CtxPushMsg].(int) {
 	switch context[eventbus.CtxPushMsg].(int) {
 	case eventbus.CtxPushMsgToProgress:
 	case eventbus.CtxPushMsgToProgress: