From c2d3812e191d71d26178b729b5039a008e8c2585 Mon Sep 17 00:00:00 2001
From: frostime <frostime@foxmail.com>
Date: Fri, 27 Oct 2023 20:41:40 +0800
Subject: [PATCH 1/3] misc

---
 CHANGELOG.md        | 16 ++++++++++++++++
 README.md           |  2 +-
 README_zh_CN.md     |  2 +-
 package.json        |  8 ++++----
 plugin.json         | 15 +++++++++++----
 src/i18n/en_US.json |  1 +
 src/i18n/zh_CN.json |  1 +
 7 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7310325..aadd6ee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,23 @@
 # Changelog
 
+## 0.2.7 2023-10
+
+## 0.2.6 2023-10-24
+
+* [Deprecated `loaded-protyle` use `loaded-protyle-static` instead](https://github.com/siyuan-note/siyuan/issues/9468)
+
+## 0.2.5 2023-10-10
+
+* [Add plugin event bus `open-menu-doctree`](https://github.com/siyuan-note/siyuan/issues/9351)
+
+## 0.2.4 2023-09-19
+
+* Supports use in windows
+* [Add plugin function `transaction`](https://github.com/siyuan-note/siyuan/issues/9172)
+
 ## 0.2.3 2023-09-05
 
+* [Add plugin function `transaction`](https://github.com/siyuan-note/siyuan/issues/9172)
 * [Plugin API add openWindow and command.globalCallback](https://github.com/siyuan-note/siyuan/issues/9032)
 
 ## 0.2.2 2023-08-29
diff --git a/README.md b/README.md
index 279abc8..4a2b21b 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 
 [中文版](./README_zh_CN.md)
 
-> Consistent with [siyuan/plugin-sample](https://github.com/siyuan-note/plugin-sample) [v0.2.3](https://github.com/siyuan-note/plugin-sample/tree/v0.2.3)
+> Consistent with [siyuan/plugin-sample](https://github.com/siyuan-note/plugin-sample) [v0.2.6](https://github.com/siyuan-note/plugin-sample/tree/v0.2.6)
 
 
 
diff --git a/README_zh_CN.md b/README_zh_CN.md
index 198be1d..bf72da3 100644
--- a/README_zh_CN.md
+++ b/README_zh_CN.md
@@ -4,7 +4,7 @@
 [English](./README.md)
 
 
-> 本例和 [siyuan/plugin-sample](https://github.com/siyuan-note/plugin-sample) [v0.2.3](https://github.com/siyuan-note/plugin-sample/tree/v0.2.3)
+> 本例和 [siyuan/plugin-sample](https://github.com/siyuan-note/plugin-sample) [v0.2.6](https://github.com/siyuan-note/plugin-sample/tree/v0.2.6)
 
 1. 使用 vite 打包
 2. 使用符号链接、而不是把项目放到插件目录下的模式进行开发
diff --git a/package.json b/package.json
index 528917a..bfe4eb0 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
 {
   "name": "plugin-sample-vite-svelte",
-  "version": "0.2.3",
+  "version": "0.2.6",
   "type": "module",
-  "description": "",
+  "description": "This is a sample plugin based on vite and svelte for Siyuan (https://b3log.org/siyuan)",
   "repository": "",
   "homepage": "",
   "author": "",
-  "license": "GPL-3.0",
+  "license": "MIT",
   "scripts": {
     "make-link": "node  --no-warnings ./scripts/make_dev_link.js",
     "dev": "vite build --watch",
@@ -22,7 +22,7 @@
     "minimist": "^1.2.8",
     "rollup-plugin-livereload": "^2.0.5",
     "sass": "^1.62.1",
-    "siyuan": "0.8.3",
+    "siyuan": "0.8.7",
     "svelte": "^3.57.0",
     "ts-node": "^10.9.1",
     "typescript": "^5.0.4",
diff --git a/plugin.json b/plugin.json
index 41c9250..04236da 100644
--- a/plugin.json
+++ b/plugin.json
@@ -2,10 +2,17 @@
   "name": "plugin-sample-vite-svelte",
   "author": "frostime",
   "url": "https://github.com/siyuan-note/plugin-sample-vite-svelte",
-  "version": "0.2.3",
-  "minAppVersion": "2.10.3",
-  "backends": ["all"],
-  "frontends": ["all"],
+  "version": "0.2.6",
+  "minAppVersion": "2.10.12",
+  "backends": [
+    "windows",
+    "linux",
+    "darwin"
+  ],
+  "frontends": [
+    "desktop",
+    "desktop-window"
+  ],
   "displayName": {
     "en_US": "Plugin sample with vite and svelte",
     "zh_CN": "插件样例 vite + svelte 版"
diff --git a/src/i18n/en_US.json b/src/i18n/en_US.json
index 4f21f86..c7ed102 100644
--- a/src/i18n/en_US.json
+++ b/src/i18n/en_US.json
@@ -9,6 +9,7 @@
     "removedData": "Data deleted",
     "confirmRemove": "Confirm to delete the data in ${name}?",
     "insertEmoji": "Insert Emoji",
+    "removeSpace": "Remove Space",
     "getTab": "Print out all opened custom tabs in the debugger",
     "name": "SiYuan",
     "hello": {
diff --git a/src/i18n/zh_CN.json b/src/i18n/zh_CN.json
index 5a586e1..49a7af8 100644
--- a/src/i18n/zh_CN.json
+++ b/src/i18n/zh_CN.json
@@ -9,6 +9,7 @@
     "removedData": "数据已删除",
     "confirmRemove": "确认删除 ${name} 中的数据?",
     "insertEmoji": "插入表情",
+    "removeSpace": "移除空格",
     "getTab": "在日志中打印出已打开的所有自定义页签",
     "name": "思源",
     "hello": {

From 8be20e023ce21b890c172f59fc5c8e560abd0f15 Mon Sep 17 00:00:00 2001
From: frostime <frostime@foxmail.com>
Date: Fri, 27 Oct 2023 20:52:25 +0800
Subject: [PATCH 2/3] update typescript

---
 src/index.ts | 69 ++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 56 insertions(+), 13 deletions(-)

diff --git a/src/index.ts b/src/index.ts
index f65b4e1..353d472 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -11,7 +11,7 @@ import {
     IModel,
     Setting,
     fetchPost,
-    Protyle, openWindow
+    Protyle, openWindow, IOperation
 } from "siyuan";
 import "@/index.scss";
 
@@ -68,7 +68,7 @@ export default class PluginSample extends Plugin {
         });
 
         const statusIconTemp = document.createElement("template");
-        statusIconTemp.innerHTML = `<div class="toolbar__item b3-tooltips b3-tooltips__w" aria-label="Remove plugin-sample Data">
+        statusIconTemp.innerHTML = `<div class="toolbar__item ariaLabel" aria-label="Remove plugin-sample Data">
     <svg>
         <use xlink:href="#iconTrashcan"></use>
     </svg>
@@ -272,19 +272,38 @@ export default class PluginSample extends Plugin {
         });
     }
 
+    private eventBusPaste(event: any) {
+        // 如果需异步处理请调用 preventDefault, 否则会进行默认处理
+        event.preventDefault();
+        // 如果使用了 preventDefault,必须调用 resolve,否则程序会卡死
+        event.detail.resolve({
+            textPlain: event.detail.textPlain.trim(),
+        });
+    }
+
     private eventBusLog({ detail }: any) {
         console.log(detail);
     }
 
     private blockIconEvent({ detail }: any) {
-        const ids: string[] = [];
-        detail.blockElements.forEach((item: HTMLElement) => {
-            ids.push(item.getAttribute("data-node-id"));
-        });
         detail.menu.addItem({
             iconHTML: "",
-            type: "readonly",
-            label: "IDs<br>" + ids.join("<br>"),
+            label: this.i18n.removeSpace,
+            click: () => {
+                const doOperations: IOperation[] = [];
+                detail.blockElements.forEach((item: HTMLElement) => {
+                    const editElement = item.querySelector('[contenteditable="true"]');
+                    if (editElement) {
+                        editElement.textContent = editElement.textContent.replace(/ /g, "");
+                        doOperations.push({
+                            id: item.dataset.nodeId,
+                            data: item.outerHTML,
+                            action: "update"
+                        });
+                    }
+                });
+                detail.protyle.getInstance().transaction(doOperations);
+            }
         });
     }
 
@@ -488,9 +507,15 @@ export default class PluginSample extends Plugin {
                 }
             }, {
                 icon: "iconSelect",
-                label: "On loaded-protyle",
+                label: "On loaded-protyle-static",
                 click: () => {
-                    this.eventBus.on("loaded-protyle", this.eventBusLog);
+                    this.eventBus.on("loaded-protyle-static", this.eventBusLog);
+                }
+            }, {
+                icon: "iconClose",
+                label: "Off loaded-protyle-static",
+                click: () => {
+                    this.eventBus.off("loaded-protyle-static", this.eventBusLog);
                 }
             }, {
                 icon: "iconSelect",
@@ -517,10 +542,16 @@ export default class PluginSample extends Plugin {
                     this.eventBus.off("destroy-protyle", this.eventBusLog);
                 }
             }, {
-                icon: "iconClose",
-                label: "Off loaded-protyle",
+                icon: "iconSelect",
+                label: "On open-menu-doctree",
                 click: () => {
-                    this.eventBus.off("loaded-protyle", this.eventBusLog);
+                    this.eventBus.on("open-menu-doctree", this.eventBusLog);
+                }
+            }, {
+                icon: "iconClose",
+                label: "Off open-menu-doctree",
+                click: () => {
+                    this.eventBus.off("open-menu-doctree", this.eventBusLog);
                 }
             }, {
                 icon: "iconSelect",
@@ -630,6 +661,18 @@ export default class PluginSample extends Plugin {
                 click: () => {
                     this.eventBus.off("input-search", this.eventBusLog);
                 }
+            }, {
+                icon: "iconSelect",
+                label: "On paste",
+                click: () => {
+                    this.eventBus.on("paste", this.eventBusPaste);
+                }
+            }, {
+                icon: "iconClose",
+                label: "Off paste",
+                click: () => {
+                    this.eventBus.off("paste", this.eventBusPaste);
+                }
             }, {
                 icon: "iconSelect",
                 label: "On open-siyuan-url-plugin",

From bc635356dc37fb74e7a34a6ba2912931f27872f7 Mon Sep 17 00:00:00 2001
From: frostime <frostime@foxmail.com>
Date: Fri, 27 Oct 2023 21:04:12 +0800
Subject: [PATCH 3/3] fix protyle bug

---
 src/hello.svelte |  2 +-
 src/index.ts     | 41 ++++++++++++++++++++---------------------
 2 files changed, 21 insertions(+), 22 deletions(-)

diff --git a/src/hello.svelte b/src/hello.svelte
index 6d10108..63a54a2 100644
--- a/src/hello.svelte
+++ b/src/hello.svelte
@@ -6,7 +6,7 @@
     export let app;
 
     let time: string = "";
-    let ver: string;
+    let ver: string = "";
 
     let divProtyle: HTMLDivElement;
     let protyle: any;
diff --git a/src/index.ts b/src/index.ts
index 353d472..aa7bd75 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -85,27 +85,6 @@ export default class PluginSample extends Plugin {
             element: statusIconTemp.content.firstElementChild as HTMLElement,
         });
 
-        let tabDiv = document.createElement("div");
-        new HelloExample({
-            target: tabDiv,
-            props: {
-                app: this.app,
-            }
-        });
-        this.customTab = this.addTab({
-            type: TAB_TYPE,
-            init() {
-                this.element.appendChild(tabDiv);
-                console.log(this.element);
-            },
-            beforeDestroy() {
-                console.log("before destroy tab:", TAB_TYPE);
-            },
-            destroy() {
-                console.log("destroy tab:", TAB_TYPE);
-            }
-        });
-
         this.addCommand({
             langKey: "showDialog",
             hotkey: "⇧⌘O",
@@ -244,6 +223,26 @@ export default class PluginSample extends Plugin {
         // this.loadData(STORAGE_NAME);
         this.settingUtils.load();
         console.log(`frontend: ${getFrontend()}; backend: ${getBackend()}`);
+        let tabDiv = document.createElement("div");
+        new HelloExample({
+            target: tabDiv,
+            props: {
+                app: this.app,
+            }
+        });
+        this.customTab = this.addTab({
+            type: TAB_TYPE,
+            init() {
+                this.element.appendChild(tabDiv);
+                console.log(this.element);
+            },
+            beforeDestroy() {
+                console.log("before destroy tab:", TAB_TYPE);
+            },
+            destroy() {
+                console.log("destroy tab:", TAB_TYPE);
+            }
+        });
     }
 
     async onunload() {