diff --git a/CHANGELOG.md b/CHANGELOG.md index 49f5775..2ce703e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,23 @@ All notable changes to this project will be documented in this file. -## [0.0.2] - 2026-04-15 +## [0.0.4] - 2026-04-21 + +### Fixed +- **UI Text Standardization**: Converted all remaining Chinese UI text to English sentence case to comply with Obsidian community plugin standards. +- Updated command names, setting labels/descriptions, modal text, and context menu items. +- Fixed `aria-label` casing and language issues. + +## [0.0.3] - 2026-04-16 + +### Fixed +- **Plugin Submission Fixes**: Addressed 10 critical code quality and guideline validation issues reported by the `ObsidianReviewBot`. + - Removed unnecessary type assertions to comply with strict TypeScript guidelines. + - Resolved "Floating Promise" warnings using the `void` operator. + - Aligned UI naming conventions to Obsidian defaults ("Side bookmark"). + - Stripped plugin ID prefix from command IDs. + - Standardized heading layouts in settings. -### Added -- **拦截笔记链接**:新增设置项「拦截笔记链接」,开启后单击笔记中的外部链接(http/https)将自动在 Side Bookmark 内置浏览器中打开,取代系统浏览器。按住 Cmd/Ctrl 单击可临时绕过,仍使用系统浏览器。 ## [0.0.1] - 2026-04-01 diff --git a/main.js b/main.js index f59747b..2042865 100644 --- a/main.js +++ b/main.js @@ -3,5 +3,5 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ -var C=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var O=(n,e)=>{for(var t in e)C(n,t,{get:e[t],enumerable:!0})},A=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of M(e))!_.call(n,s)&&s!==t&&C(n,s,{get:()=>e[s],enumerable:!(r=F(e,s))||r.enumerable});return n};var U=n=>A(C({},"__esModule",{value:!0}),n);var N={};O(N,{default:()=>T});module.exports=U(N);var S=require("obsidian");var P={bookmarks:[],folders:[],defaultUrl:"https://www.google.com",showBookmarkPanel:!0,interceptLinks:!1},h="side-bookmark-view";function x(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}var f=class{constructor(e){this.listeners=[];this.plugin=e,this.data={...P}}async load(){let e=await this.plugin.loadData();e&&(this.data={...P,...e})}async save(){await this.plugin.saveData(this.data)}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notify(){for(let e of this.listeners)e()}get defaultUrl(){return this.data.defaultUrl}set defaultUrl(e){this.data.defaultUrl=e}get showBookmarkPanel(){return this.data.showBookmarkPanel}set showBookmarkPanel(e){this.data.showBookmarkPanel=e}get interceptLinks(){return this.data.interceptLinks}set interceptLinks(e){this.data.interceptLinks=e}get bookmarks(){return this.data.bookmarks}get folders(){return this.data.folders}async addBookmark(e,t,r=null){let s=this.data.bookmarks.filter(l=>l.folderId===r),o=s.length>0?Math.max(...s.map(l=>l.order)):-1,i={id:x(),type:"bookmark",title:e,url:t,folderId:r,order:o+1};return this.data.bookmarks.push(i),await this.save(),this.notify(),i}async removeBookmark(e){this.data.bookmarks=this.data.bookmarks.filter(t=>t.id!==e),await this.save(),this.notify()}async updateBookmark(e,t){let r=this.data.bookmarks.find(s=>s.id===e);r&&(Object.assign(r,t),await this.save(),this.notify())}async moveBookmark(e,t){await this.updateBookmark(e,{folderId:t})}async addFolder(e,t=null){let r=this.data.folders.filter(i=>i.parentId===t),s=r.length>0?Math.max(...r.map(i=>i.order)):-1,o={id:x(),type:"folder",name:e,parentId:t,collapsed:!1,order:s+1};return this.data.folders.push(o),await this.save(),this.notify(),o}async removeFolder(e){let t=this.getDescendantFolderIds(e),r=[e,...t];this.data.bookmarks=this.data.bookmarks.filter(s=>{var o;return!r.includes((o=s.folderId)!=null?o:"")}),this.data.folders=this.data.folders.filter(s=>!r.includes(s.id)),await this.save(),this.notify()}async updateFolder(e,t){let r=this.data.folders.find(s=>s.id===e);r&&(Object.assign(r,t),await this.save(),this.notify())}async toggleFolder(e){let t=this.data.folders.find(r=>r.id===e);t&&(t.collapsed=!t.collapsed,await this.save(),this.notify())}getBookmarksByFolder(e){return this.data.bookmarks.filter(t=>t.folderId===e).sort((t,r)=>t.order-r.order)}getSubFolders(e){return this.data.folders.filter(t=>t.parentId===e).sort((t,r)=>t.order-r.order)}getFolder(e){return this.data.folders.find(t=>t.id===e)}getBookmark(e){return this.data.bookmarks.find(t=>t.id===e)}getTreeItems(e){let t=this.getSubFolders(e),r=this.getBookmarksByFolder(e);return[...t,...r].sort((o,i)=>o.order-i.order)}hasBookmarkWithUrl(e){return this.data.bookmarks.some(t=>t.url===e)}getDescendantFolderIds(e){let t=this.data.folders.filter(s=>s.parentId===e),r=[];for(let s of t)r.push(s.id),r.push(...this.getDescendantFolderIds(s.id));return r}};var D=require("obsidian");var u=require("obsidian"),b=class{constructor(e){this.webviewEl=null;this.currentUrl="";this.currentTitle="";this.onAddBookmark=null;this.containerEl=e.createDiv({cls:"sb-browser-panel"}),this.navBarEl=this.containerEl.createDiv({cls:"sb-nav-bar"});let t=this.navBarEl.createDiv({cls:"sb-nav-buttons"});this.backBtn=t.createDiv({cls:"sb-nav-btn",attr:{"aria-label":"\u540E\u9000"}}),(0,u.setIcon)(this.backBtn,"arrow-left"),this.backBtn.addEventListener("click",()=>this.goBack()),this.forwardBtn=t.createDiv({cls:"sb-nav-btn",attr:{"aria-label":"\u524D\u8FDB"}}),(0,u.setIcon)(this.forwardBtn,"arrow-right"),this.forwardBtn.addEventListener("click",()=>this.goForward()),this.refreshBtn=t.createDiv({cls:"sb-nav-btn",attr:{"aria-label":"\u5237\u65B0"}}),(0,u.setIcon)(this.refreshBtn,"refresh-cw"),this.refreshBtn.addEventListener("click",()=>this.reload()),this.urlInput=this.navBarEl.createEl("input",{cls:"sb-url-input",attr:{type:"text",placeholder:"\u8F93\u5165\u7F51\u5740...",spellcheck:"false"}}),this.urlInput.addEventListener("keydown",r=>{r.key==="Enter"&&this.navigateToInput()}),this.urlInput.addEventListener("focus",()=>{this.urlInput.select()}),this.bookmarkBtn=this.navBarEl.createDiv({cls:"sb-nav-btn sb-bookmark-btn",attr:{"aria-label":"\u6DFB\u52A0\u4E66\u7B7E"}}),(0,u.setIcon)(this.bookmarkBtn,"star"),this.bookmarkBtn.addEventListener("click",()=>{this.onAddBookmark&&this.currentUrl&&this.onAddBookmark(this.currentTitle||this.currentUrl,this.currentUrl)}),this.webviewContainer=this.containerEl.createDiv({cls:"sb-webview-container"})}navigate(e){let t=e.trim();t&&(/^https?:\/\//i.test(t)||(t="https://"+t),this.currentUrl=t,this.urlInput.value=t,this.createOrUpdateWebview(t))}goBack(){var e,t;this.webviewEl&&((t=(e=this.webviewEl).goBack)==null||t.call(e))}goForward(){var e,t;this.webviewEl&&((t=(e=this.webviewEl).goForward)==null||t.call(e))}reload(){var e,t;this.webviewEl&&((t=(e=this.webviewEl).reload)==null||t.call(e))}getUrl(){return this.currentUrl}getTitle(){return this.currentTitle}destroy(){this.webviewEl&&(this.webviewEl.remove(),this.webviewEl=null),this.containerEl.remove()}navigateToInput(){let e=this.urlInput.value.trim();e&&this.navigate(e)}createOrUpdateWebview(e){this.webviewEl&&this.webviewEl.remove();let t=document.createElement("webview");t.setAttribute("src",e),t.setAttribute("allowpopups",""),t.addClass("sb-webview"),t.addEventListener("did-navigate",r=>{let s=r;s.url&&(this.currentUrl=s.url,this.urlInput.value=s.url)}),t.addEventListener("did-navigate-in-page",r=>{let s=r;s.url&&(this.currentUrl=s.url,this.urlInput.value=s.url)}),t.addEventListener("page-title-updated",r=>{let s=r;s.title&&(this.currentTitle=s.title)}),t.addEventListener("dom-ready",()=>{let r=t;r.getURL&&(this.currentUrl=r.getURL(),this.urlInput.value=this.currentUrl),r.getTitle&&(this.currentTitle=r.getTitle())}),t.addEventListener("new-window",r=>{r.url&&this.navigate(r.url)}),this.webviewContainer.empty(),this.webviewContainer.appendChild(t),this.webviewEl=t}};var d=require("obsidian");var a=require("obsidian"),m=class extends a.Modal{constructor(e,t,r="",s="",o=null,i){super(e),this.store=t,this.title=r,this.url=s,this.folderId=o,this.onSave=i!=null?i:null}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u6DFB\u52A0\u4E66\u7B7E"}),new a.Setting(e).setName("\u6807\u9898").addText(t=>t.setPlaceholder("\u8F93\u5165\u4E66\u7B7E\u6807\u9898").setValue(this.title).onChange(r=>{this.title=r})),new a.Setting(e).setName("\u7F51\u5740").addText(t=>t.setPlaceholder("https://example.com").setValue(this.url).onChange(r=>{this.url=r})),new a.Setting(e).setName("\u6587\u4EF6\u5939").addDropdown(t=>{var r;t.addOption("__root__","\uFF08\u65E0\u6587\u4EF6\u5939\uFF09");for(let s of this.store.folders)t.addOption(s.id,this.getFolderPath(s));t.setValue((r=this.folderId)!=null?r:"__root__"),t.onChange(s=>{this.folderId=s==="__root__"?null:s})}),new a.Setting(e).addButton(t=>t.setButtonText("\u4FDD\u5B58").setCta().onClick(async()=>{if(!this.url.trim())return;this.title.trim()||(this.title=this.url);let r=this.url.trim();/^https?:\/\//i.test(r)||(r="https://"+r),this.onSave?this.onSave(this.title.trim(),r,this.folderId):await this.store.addBookmark(this.title.trim(),r,this.folderId),this.close()})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}getFolderPath(e){let t=[e.name],r=e;for(;r!=null&&r.parentId;)r=this.store.getFolder(r.parentId),r&&t.unshift(r.name);return t.join(" / ")}},w=class extends a.Modal{constructor(e,t,r,s,o,i){super(e),this.store=t,this.bookmarkId=r,this.title=s,this.url=o,this.folderId=i}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u7F16\u8F91\u4E66\u7B7E"}),new a.Setting(e).setName("\u6807\u9898").addText(t=>t.setPlaceholder("\u8F93\u5165\u4E66\u7B7E\u6807\u9898").setValue(this.title).onChange(r=>{this.title=r})),new a.Setting(e).setName("\u7F51\u5740").addText(t=>t.setPlaceholder("https://example.com").setValue(this.url).onChange(r=>{this.url=r})),new a.Setting(e).setName("\u6587\u4EF6\u5939").addDropdown(t=>{var r;t.addOption("__root__","\uFF08\u65E0\u6587\u4EF6\u5939\uFF09");for(let s of this.store.folders)t.addOption(s.id,this.getFolderPath(s));t.setValue((r=this.folderId)!=null?r:"__root__"),t.onChange(s=>{this.folderId=s==="__root__"?null:s})}),new a.Setting(e).addButton(t=>t.setButtonText("\u4FDD\u5B58").setCta().onClick(async()=>{if(!this.url.trim())return;this.title.trim()||(this.title=this.url);let r=this.url.trim();/^https?:\/\//i.test(r)||(r="https://"+r),await this.store.updateBookmark(this.bookmarkId,{title:this.title.trim(),url:r,folderId:this.folderId}),this.close()})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}getFolderPath(e){let t=[e.name],r=e;for(;r!=null&&r.parentId;)r=this.store.getFolder(r.parentId),r&&t.unshift(r.name);return t.join(" / ")}},v=class extends a.Modal{constructor(e,t,r=null){super(e),this.store=t,this.folderName="",this.parentId=r}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u65B0\u5EFA\u6587\u4EF6\u5939"}),new a.Setting(e).setName("\u6587\u4EF6\u5939\u540D\u79F0").addText(t=>t.setPlaceholder("\u8F93\u5165\u6587\u4EF6\u5939\u540D\u79F0").setValue(this.folderName).onChange(r=>{this.folderName=r})),new a.Setting(e).setName("\u7236\u6587\u4EF6\u5939").addDropdown(t=>{var r;t.addOption("__root__","\uFF08\u6839\u7EA7\u522B\uFF09");for(let s of this.store.folders)t.addOption(s.id,this.getFolderPath(s));t.setValue((r=this.parentId)!=null?r:"__root__"),t.onChange(s=>{this.parentId=s==="__root__"?null:s})}),new a.Setting(e).addButton(t=>t.setButtonText("\u521B\u5EFA").setCta().onClick(async()=>{this.folderName.trim()&&(await this.store.addFolder(this.folderName.trim(),this.parentId),this.close())})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}getFolderPath(e){let t=[e.name],r=e;for(;r!=null&&r.parentId;)r=this.store.getFolder(r.parentId),r&&t.unshift(r.name);return t.join(" / ")}},B=class extends a.Modal{constructor(e,t,r,s){super(e),this.store=t,this.folderId=r,this.folderName=s}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u7F16\u8F91\u6587\u4EF6\u5939"}),new a.Setting(e).setName("\u6587\u4EF6\u5939\u540D\u79F0").addText(t=>t.setPlaceholder("\u8F93\u5165\u6587\u4EF6\u5939\u540D\u79F0").setValue(this.folderName).onChange(r=>{this.folderName=r})),new a.Setting(e).addButton(t=>t.setButtonText("\u4FDD\u5B58").setCta().onClick(async()=>{this.folderName.trim()&&(await this.store.updateFolder(this.folderId,{name:this.folderName.trim()}),this.close())})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}},g=class extends a.Modal{constructor(e,t,r){super(e),this.message=t,this.onConfirm=r}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u786E\u8BA4\u5220\u9664"}),e.createEl("p",{text:this.message}),new a.Setting(e).addButton(t=>t.setButtonText("\u5220\u9664").setWarning().onClick(async()=>{await this.onConfirm(),this.close()})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}};var E=class{constructor(e,t,r){this.collapsed=!1;this.unsubscribe=null;this.onNavigate=null;this.app=e,this.store=r,this.containerEl=t.createDiv({cls:"sb-bookmark-panel"}),this.headerEl=this.containerEl.createDiv({cls:"sb-bookmark-header"});let s=this.headerEl.createDiv({cls:"sb-bookmark-header-left"}),o=s.createDiv({cls:"sb-collapse-icon"});(0,d.setIcon)(o,"chevron-down"),s.createSpan({text:"\u4E66\u7B7E",cls:"sb-bookmark-title"}),s.addEventListener("click",()=>{this.toggleCollapse()});let l=this.headerEl.createDiv({cls:"sb-bookmark-header-right"}).createDiv({cls:"sb-add-btn-group"}),p=l.createDiv({cls:"sb-header-btn",attr:{"aria-label":"\u6DFB\u52A0\u4E66\u7B7E"}});(0,d.setIcon)(p,"plus"),p.addEventListener("click",L=>{L.stopPropagation(),new m(this.app,this.store).open()});let c=l.createDiv({cls:"sb-header-btn",attr:{"aria-label":"\u65B0\u5EFA\u6587\u4EF6\u5939"}});(0,d.setIcon)(c,"folder-plus"),c.addEventListener("click",L=>{L.stopPropagation(),new v(this.app,this.store).open()}),this.listEl=this.containerEl.createDiv({cls:"sb-bookmark-list"}),this.unsubscribe=this.store.onChange(()=>{this.renderList()}),this.renderList()}toggleCollapse(){this.collapsed=!this.collapsed,this.containerEl.toggleClass("sb-collapsed",this.collapsed);let e=this.headerEl.querySelector(".sb-collapse-icon");e&&(e.empty(),(0,d.setIcon)(e,this.collapsed?"chevron-right":"chevron-down"))}destroy(){this.unsubscribe&&this.unsubscribe(),this.containerEl.remove()}renderList(){if(this.listEl.empty(),this.store.getTreeItems(null).length===0){let t=this.listEl.createDiv({cls:"sb-empty-state"}),r=t.createDiv({cls:"sb-empty-icon"});(0,d.setIcon)(r,"bookmark"),t.createDiv({text:"\u6682\u65E0\u4E66\u7B7E",cls:"sb-empty-text"}),t.createDiv({text:"\u70B9\u51FB + \u6309\u94AE\u6216 \u2B50 \u6309\u94AE\u6DFB\u52A0\u4E66\u7B7E",cls:"sb-empty-hint"});return}this.renderTreeLevel(this.listEl,null,0)}renderTreeLevel(e,t,r){let s=this.store.getTreeItems(t);for(let o of s)o.type==="folder"?this.renderFolder(e,o,r):this.renderBookmark(e,o,r)}renderFolder(e,t,r){let s=e.createDiv({cls:"sb-tree-item sb-folder-item",attr:{"data-id":t.id,"data-type":"folder",draggable:"true"}});s.style.paddingLeft=`${r*16+4}px`;let o=s.createDiv({cls:"sb-tree-item-row"}),i=o.createDiv({cls:"sb-folder-collapse"});(0,d.setIcon)(i,t.collapsed?"chevron-right":"chevron-down");let l=o.createDiv({cls:"sb-item-icon"});(0,d.setIcon)(l,t.collapsed?"folder":"folder-open"),o.createSpan({text:t.name,cls:"sb-item-label"});let p=this.store.getBookmarksByFolder(t.id).length+this.store.getSubFolders(t.id).length;if(p>0&&o.createSpan({text:`${p}`,cls:"sb-count-badge"}),o.addEventListener("click",()=>{this.store.toggleFolder(t.id)}),o.addEventListener("contextmenu",c=>{c.preventDefault(),c.stopPropagation(),this.showFolderContextMenu(c,t)}),this.setupDragEvents(s,t),!t.collapsed){let c=e.createDiv({cls:"sb-folder-children"});this.renderTreeLevel(c,t.id,r+1)}}renderBookmark(e,t,r){let s=e.createDiv({cls:"sb-tree-item sb-bookmark-item",attr:{"data-id":t.id,"data-type":"bookmark",draggable:"true"}});s.style.paddingLeft=`${r*16+24}px`;let o=s.createDiv({cls:"sb-tree-item-row"}),i=o.createDiv({cls:"sb-item-icon"});(0,d.setIcon)(i,"globe"),o.createSpan({text:t.title,cls:"sb-item-label"}),o.addEventListener("click",()=>{this.onNavigate&&this.onNavigate(t.url)}),o.addEventListener("contextmenu",l=>{l.preventDefault(),l.stopPropagation(),this.showBookmarkContextMenu(l,t)}),this.setupDragEvents(s,t)}showBookmarkContextMenu(e,t){let r=new d.Menu;r.addItem(s=>{s.setTitle("\u6253\u5F00"),s.setIcon("external-link"),s.onClick(()=>{this.onNavigate&&this.onNavigate(t.url)})}),r.addSeparator(),r.addItem(s=>{s.setTitle("\u7F16\u8F91"),s.setIcon("pencil"),s.onClick(()=>{new w(this.app,this.store,t.id,t.title,t.url,t.folderId).open()})}),r.addItem(s=>{s.setTitle("\u79FB\u52A8\u5230..."),s.setIcon("folder-input"),s.onClick(()=>{this.showMoveMenu(e,t)})}),r.addSeparator(),r.addItem(s=>{s.setTitle("\u5220\u9664"),s.setIcon("trash-2"),s.onClick(()=>{new g(this.app,`\u786E\u5B9A\u8981\u5220\u9664\u4E66\u7B7E"${t.title}"\u5417\uFF1F`,async()=>{await this.store.removeBookmark(t.id)}).open()})}),r.showAtMouseEvent(e)}showFolderContextMenu(e,t){let r=new d.Menu;r.addItem(s=>{s.setTitle("\u6DFB\u52A0\u4E66\u7B7E\u5230\u6B64\u6587\u4EF6\u5939"),s.setIcon("plus"),s.onClick(()=>{new m(this.app,this.store,"","",t.id).open()})}),r.addItem(s=>{s.setTitle("\u6DFB\u52A0\u5B50\u6587\u4EF6\u5939"),s.setIcon("folder-plus"),s.onClick(()=>{new v(this.app,this.store,t.id).open()})}),r.addSeparator(),r.addItem(s=>{s.setTitle("\u91CD\u547D\u540D"),s.setIcon("pencil"),s.onClick(()=>{new B(this.app,this.store,t.id,t.name).open()})}),r.addSeparator(),r.addItem(s=>{s.setTitle("\u5220\u9664\u6587\u4EF6\u5939"),s.setIcon("trash-2"),s.onClick(()=>{let o=this.store.getBookmarksByFolder(t.id).length,i=this.store.getSubFolders(t.id).length,l=`\u786E\u5B9A\u8981\u5220\u9664\u6587\u4EF6\u5939"${t.name}"\u5417\uFF1F`;(o>0||i>0)&&(l+=` -\u5176\u4E2D\u5305\u542B ${o} \u4E2A\u4E66\u7B7E\u548C ${i} \u4E2A\u5B50\u6587\u4EF6\u5939\uFF0C\u5C06\u4E00\u5E76\u5220\u9664\u3002`),new g(this.app,l,async()=>{await this.store.removeFolder(t.id)}).open()})}),r.showAtMouseEvent(e)}showMoveMenu(e,t){let r=new d.Menu;t.folderId!==null&&(r.addItem(s=>{s.setTitle("\uFF08\u6839\u7EA7\u522B\uFF09"),s.setIcon("corner-left-up"),s.onClick(async()=>{await this.store.moveBookmark(t.id,null)})}),r.addSeparator());for(let s of this.store.folders)s.id!==t.folderId&&r.addItem(o=>{o.setTitle(s.name),o.setIcon("folder"),o.onClick(async()=>{await this.store.moveBookmark(t.id,s.id)})});r.showAtMouseEvent(e)}setupDragEvents(e,t){e.addEventListener("dragstart",r=>{r.dataTransfer&&(r.dataTransfer.setData("text/plain",JSON.stringify({id:t.id,type:t.type})),r.dataTransfer.effectAllowed="move"),e.addClass("sb-dragging")}),e.addEventListener("dragend",()=>{e.removeClass("sb-dragging"),this.listEl.querySelectorAll(".sb-drop-target").forEach(r=>r.removeClass("sb-drop-target"))}),e.addEventListener("dragover",r=>{r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="move"),e.addClass("sb-drop-target")}),e.addEventListener("dragleave",()=>{e.removeClass("sb-drop-target")}),e.addEventListener("drop",async r=>{if(r.preventDefault(),e.removeClass("sb-drop-target"),!!r.dataTransfer)try{let s=JSON.parse(r.dataTransfer.getData("text/plain"));if(!s.id||!s.type)return;s.type==="bookmark"&&t.type==="folder"&&await this.store.moveBookmark(s.id,t.id)}catch(s){}})}};var y=class extends D.ItemView{constructor(t,r){super(t);this.browserPanel=null;this.bookmarkPanel=null;this.plugin=r}getViewType(){return h}getDisplayText(){return"Side Bookmark"}getIcon(){return"bookmark"}async onOpen(){let t=this.contentEl;t.empty(),t.addClass("sb-container"),this.browserPanel=new b(t),this.browserPanel.onAddBookmark=(s,o)=>{new m(this.app,this.plugin.store,s,o,null,async(i,l,p)=>{await this.plugin.store.addBookmark(i,l,p)}).open()};let r=this.plugin.store.defaultUrl;r&&this.browserPanel.navigate(r),this.bookmarkPanel=new E(this.app,t,this.plugin.store),this.bookmarkPanel.onNavigate=s=>{this.browserPanel&&this.browserPanel.navigate(s)},this.plugin.store.showBookmarkPanel||this.bookmarkPanel.toggleCollapse()}async onClose(){this.browserPanel&&(this.browserPanel.destroy(),this.browserPanel=null),this.bookmarkPanel&&(this.bookmarkPanel.destroy(),this.bookmarkPanel=null)}navigateTo(t){this.browserPanel&&this.browserPanel.navigate(t)}};var k=require("obsidian"),I=class extends k.PluginSettingTab{constructor(e,t){super(e,t),this.plugin=t}display(){let{containerEl:e}=this;e.empty(),e.createEl("h2",{text:"Side Bookmark \u8BBE\u7F6E"}),new k.Setting(e).setName("\u9ED8\u8BA4\u9996\u9875").setDesc("\u6253\u5F00\u63D2\u4EF6\u65F6\u9ED8\u8BA4\u52A0\u8F7D\u7684\u7F51\u5740").addText(r=>r.setPlaceholder("https://www.google.com").setValue(this.plugin.store.defaultUrl).onChange(async s=>{this.plugin.store.defaultUrl=s,await this.plugin.store.save()})),new k.Setting(e).setName("\u9ED8\u8BA4\u663E\u793A\u4E66\u7B7E\u9762\u677F").setDesc("\u6253\u5F00\u63D2\u4EF6\u65F6\u662F\u5426\u9ED8\u8BA4\u5C55\u5F00\u4E66\u7B7E\u5217\u8868\u9762\u677F").addToggle(r=>r.setValue(this.plugin.store.showBookmarkPanel).onChange(async s=>{this.plugin.store.showBookmarkPanel=s,await this.plugin.store.save()})),new k.Setting(e).setName("\u62E6\u622A\u7B14\u8BB0\u94FE\u63A5").setDesc("\u5F00\u542F\u540E\uFF0C\u5355\u51FB\u7B14\u8BB0\u4E2D\u7684\u5916\u90E8\u94FE\u63A5\uFF08http/https\uFF09\u5C06\u81EA\u52A8\u5728 Side Bookmark \u5185\u7F6E\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\uFF0C\u800C\u975E\u4F7F\u7528\u7CFB\u7EDF\u6D4F\u89C8\u5668\u3002\u6309\u4F4F Cmd/Ctrl \u5355\u51FB\u53EF\u4E34\u65F6\u7ED5\u8FC7\uFF0C\u4ECD\u4F7F\u7528\u7CFB\u7EDF\u6D4F\u89C8\u5668\u6253\u5F00\u3002").addToggle(r=>r.setValue(this.plugin.store.interceptLinks).onChange(async s=>{this.plugin.store.interceptLinks=s,await this.plugin.store.save()})),e.createEl("h3",{text:"\u7EDF\u8BA1"});let t=e.createDiv({cls:"sb-settings-stats"});t.createEl("p",{text:`\u4E66\u7B7E\u6570\u91CF: ${this.plugin.store.bookmarks.length}`}),t.createEl("p",{text:`\u6587\u4EF6\u5939\u6570\u91CF: ${this.plugin.store.folders.length}`})}};var T=class extends S.Plugin{constructor(){super(...arguments);this.modifierKeyPressed=!1}async onload(){this.store=new f(this),await this.store.load(),this.registerView(h,t=>new y(t,this)),this.addRibbonIcon("bookmark","Side Bookmark",()=>{this.activateView()}),this.addCommand({id:"open-side-bookmark",name:"\u6253\u5F00\u4FA7\u8FB9\u680F\u4E66\u7B7E",callback:()=>{this.activateView()}}),this.addSettingTab(new I(this.app,this)),this.registerDomEvent(document,"click",this.handleLinkClick.bind(this),!0),this.registerDomEvent(document,"keydown",t=>{(t.key==="Meta"||t.key==="Control"||t.metaKey||t.ctrlKey)&&(this.modifierKeyPressed=!0)}),this.registerDomEvent(document,"keyup",t=>{(t.key==="Meta"||t.key==="Control"||!t.metaKey&&!t.ctrlKey)&&(this.modifierKeyPressed=!1)}),this.registerDomEvent(window,"blur",()=>{this.modifierKeyPressed=!1}),this.originalWindowOpen=window.open,window.open=(t,r,s)=>{if(this.store.interceptLinks&&t&&!this.modifierKeyPressed){let o=t.toString();if(/^https?:\/\//i.test(o))return this.openUrlInSideBookmark(o),null}return this.originalWindowOpen.call(window,t,r,s)}}onunload(){this.originalWindowOpen&&(window.open=this.originalWindowOpen),this.app.workspace.detachLeavesOfType(h)}handleLinkClick(t){if(!this.store.interceptLinks)return;let s=t.target.closest("a");if(!s)return;let o=s.getAttribute("href")||s.href;!o||!/^https?:\/\//i.test(o)||t.metaKey||t.ctrlKey||s.closest(".sb-browser-panel")||s.closest("webview")||(t.preventDefault(),t.stopPropagation(),this.openUrlInSideBookmark(o))}async openUrlInSideBookmark(t){let{workspace:r}=this.app,s=r.getLeavesOfType(h);if(s.length===0)await this.activateView(),s=r.getLeavesOfType(h);else{let i=s[0];i&&r.revealLeaf(i)}let o=s[0];if(o){let i=o.view;typeof i.navigateTo=="function"&&i.navigateTo(t)}}async activateView(){let{workspace:t}=this.app,r=t.getLeavesOfType(h);if(r.length>0)t.revealLeaf(r[0]);else{let s=t.getRightLeaf(!1);s&&(await s.setViewState({type:h,active:!0}),t.revealLeaf(s))}}}; +var C=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var O=(a,e)=>{for(var t in e)C(a,t,{get:e[t],enumerable:!0})},A=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of M(e))!_.call(a,o)&&o!==t&&C(a,o,{get:()=>e[o],enumerable:!(r=F(e,o))||r.enumerable});return a};var N=a=>A(C({},"__esModule",{value:!0}),a);var U={};O(U,{default:()=>T});module.exports=N(U);var S=require("obsidian");var L={bookmarks:[],folders:[],defaultUrl:"https://www.google.com",showBookmarkPanel:!0,interceptLinks:!1},c="side-bookmark-view";function x(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}var f=class{constructor(e){this.listeners=[];this.plugin=e,this.data={...L}}async load(){let e=await this.plugin.loadData();e&&(this.data={...L,...e})}async save(){await this.plugin.saveData(this.data)}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notify(){for(let e of this.listeners)e()}get defaultUrl(){return this.data.defaultUrl}set defaultUrl(e){this.data.defaultUrl=e}get showBookmarkPanel(){return this.data.showBookmarkPanel}set showBookmarkPanel(e){this.data.showBookmarkPanel=e}get interceptLinks(){return this.data.interceptLinks}set interceptLinks(e){this.data.interceptLinks=e}get bookmarks(){return this.data.bookmarks}get folders(){return this.data.folders}async addBookmark(e,t,r=null){let o=this.data.bookmarks.filter(l=>l.folderId===r),s=o.length>0?Math.max(...o.map(l=>l.order)):-1,i={id:x(),type:"bookmark",title:e,url:t,folderId:r,order:s+1};return this.data.bookmarks.push(i),await this.save(),this.notify(),i}async removeBookmark(e){this.data.bookmarks=this.data.bookmarks.filter(t=>t.id!==e),await this.save(),this.notify()}async updateBookmark(e,t){let r=this.data.bookmarks.find(o=>o.id===e);r&&(Object.assign(r,t),await this.save(),this.notify())}async moveBookmark(e,t){await this.updateBookmark(e,{folderId:t})}async addFolder(e,t=null){let r=this.data.folders.filter(i=>i.parentId===t),o=r.length>0?Math.max(...r.map(i=>i.order)):-1,s={id:x(),type:"folder",name:e,parentId:t,collapsed:!1,order:o+1};return this.data.folders.push(s),await this.save(),this.notify(),s}async removeFolder(e){let t=this.getDescendantFolderIds(e),r=[e,...t];this.data.bookmarks=this.data.bookmarks.filter(o=>{var s;return!r.includes((s=o.folderId)!=null?s:"")}),this.data.folders=this.data.folders.filter(o=>!r.includes(o.id)),await this.save(),this.notify()}async updateFolder(e,t){let r=this.data.folders.find(o=>o.id===e);r&&(Object.assign(r,t),await this.save(),this.notify())}async toggleFolder(e){let t=this.data.folders.find(r=>r.id===e);t&&(t.collapsed=!t.collapsed,await this.save(),this.notify())}getBookmarksByFolder(e){return this.data.bookmarks.filter(t=>t.folderId===e).sort((t,r)=>t.order-r.order)}getSubFolders(e){return this.data.folders.filter(t=>t.parentId===e).sort((t,r)=>t.order-r.order)}getFolder(e){return this.data.folders.find(t=>t.id===e)}getBookmark(e){return this.data.bookmarks.find(t=>t.id===e)}getTreeItems(e){let t=this.getSubFolders(e),r=this.getBookmarksByFolder(e);return[...t,...r].sort((s,i)=>s.order-i.order)}hasBookmarkWithUrl(e){return this.data.bookmarks.some(t=>t.url===e)}getDescendantFolderIds(e){let t=this.data.folders.filter(o=>o.parentId===e),r=[];for(let o of t)r.push(o.id),r.push(...this.getDescendantFolderIds(o.id));return r}};var D=require("obsidian");var u=require("obsidian"),w=class{constructor(e){this.webviewEl=null;this.currentUrl="";this.currentTitle="";this.onAddBookmark=null;this.containerEl=e.createDiv({cls:"sb-browser-panel"}),this.navBarEl=this.containerEl.createDiv({cls:"sb-nav-bar"});let t=this.navBarEl.createDiv({cls:"sb-nav-buttons"});this.backBtn=t.createDiv({cls:"sb-nav-btn",attr:{"aria-label":"\u540E\u9000"}}),(0,u.setIcon)(this.backBtn,"arrow-left"),this.backBtn.addEventListener("click",()=>this.goBack()),this.forwardBtn=t.createDiv({cls:"sb-nav-btn",attr:{"aria-label":"\u524D\u8FDB"}}),(0,u.setIcon)(this.forwardBtn,"arrow-right"),this.forwardBtn.addEventListener("click",()=>this.goForward()),this.refreshBtn=t.createDiv({cls:"sb-nav-btn",attr:{"aria-label":"\u5237\u65B0"}}),(0,u.setIcon)(this.refreshBtn,"refresh-cw"),this.refreshBtn.addEventListener("click",()=>this.reload()),this.urlInput=this.navBarEl.createEl("input",{cls:"sb-url-input",attr:{type:"text",placeholder:"\u8F93\u5165\u7F51\u5740...",spellcheck:"false"}}),this.urlInput.addEventListener("keydown",r=>{r.key==="Enter"&&this.navigateToInput()}),this.urlInput.addEventListener("focus",()=>{this.urlInput.select()}),this.bookmarkBtn=this.navBarEl.createDiv({cls:"sb-nav-btn sb-bookmark-btn",attr:{"aria-label":"\u6DFB\u52A0\u4E66\u7B7E"}}),(0,u.setIcon)(this.bookmarkBtn,"star"),this.bookmarkBtn.addEventListener("click",()=>{this.onAddBookmark&&this.currentUrl&&this.onAddBookmark(this.currentTitle||this.currentUrl,this.currentUrl)}),this.webviewContainer=this.containerEl.createDiv({cls:"sb-webview-container"})}navigate(e){let t=e.trim();t&&(/^https?:\/\//i.test(t)||(t="https://"+t),this.currentUrl=t,this.urlInput.value=t,this.createOrUpdateWebview(t))}goBack(){if(this.webviewEl){let e=this.webviewEl;typeof e.goBack=="function"&&e.goBack()}}goForward(){if(this.webviewEl){let e=this.webviewEl;typeof e.goForward=="function"&&e.goForward()}}reload(){if(this.webviewEl){let e=this.webviewEl;typeof e.reload=="function"&&e.reload()}}getUrl(){return this.currentUrl}getTitle(){return this.currentTitle}destroy(){this.webviewEl&&(this.webviewEl.remove(),this.webviewEl=null),this.containerEl.remove()}navigateToInput(){let e=this.urlInput.value.trim();e&&this.navigate(e)}createOrUpdateWebview(e){this.webviewEl&&this.webviewEl.remove();let t=document.createElement("webview");t.setAttribute("src",e),t.setAttribute("allowpopups",""),t.addClass("sb-webview"),t.addEventListener("did-navigate",r=>{let o=r;typeof o.url=="string"&&(this.currentUrl=o.url,this.urlInput.value=o.url)}),t.addEventListener("did-navigate-in-page",r=>{let o=r;typeof o.url=="string"&&(this.currentUrl=o.url,this.urlInput.value=o.url)}),t.addEventListener("page-title-updated",r=>{let o=r;typeof o.title=="string"&&(this.currentTitle=o.title)}),t.addEventListener("dom-ready",()=>{let r=t;typeof r.getURL=="function"&&(this.currentUrl=r.getURL(),this.urlInput.value=this.currentUrl),typeof r.getTitle=="function"&&(this.currentTitle=r.getTitle())}),t.addEventListener("new-window",r=>{let o=r;typeof o.url=="string"&&this.navigate(o.url)}),this.webviewContainer.empty(),this.webviewContainer.appendChild(t),this.webviewEl=t}};var d=require("obsidian");var n=require("obsidian"),k=class extends n.Modal{constructor(e,t,r="",o="",s=null,i){super(e),this.store=t,this.title=r,this.url=o,this.folderId=s,this.onSave=i!=null?i:null}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u6DFB\u52A0\u4E66\u7B7E"}),new n.Setting(e).setName("\u6807\u9898").addText(t=>t.setPlaceholder("\u8F93\u5165\u4E66\u7B7E\u6807\u9898").setValue(this.title).onChange(r=>{this.title=r})),new n.Setting(e).setName("\u7F51\u5740").addText(t=>t.setPlaceholder("https://example.com").setValue(this.url).onChange(r=>{this.url=r})),new n.Setting(e).setName("\u6587\u4EF6\u5939").addDropdown(t=>{var r;t.addOption("__root__","\uFF08\u65E0\u6587\u4EF6\u5939\uFF09");for(let o of this.store.folders)t.addOption(o.id,this.getFolderPath(o));t.setValue((r=this.folderId)!=null?r:"__root__"),t.onChange(o=>{this.folderId=o==="__root__"?null:o})}),new n.Setting(e).addButton(t=>t.setButtonText("\u4FDD\u5B58").setCta().onClick(async()=>{if(!this.url.trim())return;this.title.trim()||(this.title=this.url);let r=this.url.trim();/^https?:\/\//i.test(r)||(r="https://"+r),this.onSave?this.onSave(this.title.trim(),r,this.folderId):await this.store.addBookmark(this.title.trim(),r,this.folderId),this.close()})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}getFolderPath(e){let t=[e.name],r=e;for(;r!=null&&r.parentId;)r=this.store.getFolder(r.parentId),r&&t.unshift(r.name);return t.join(" / ")}},b=class extends n.Modal{constructor(e,t,r,o,s,i){super(e),this.store=t,this.bookmarkId=r,this.title=o,this.url=s,this.folderId=i}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u7F16\u8F91\u4E66\u7B7E"}),new n.Setting(e).setName("\u6807\u9898").addText(t=>t.setPlaceholder("\u8F93\u5165\u4E66\u7B7E\u6807\u9898").setValue(this.title).onChange(r=>{this.title=r})),new n.Setting(e).setName("\u7F51\u5740").addText(t=>t.setPlaceholder("https://example.com").setValue(this.url).onChange(r=>{this.url=r})),new n.Setting(e).setName("\u6587\u4EF6\u5939").addDropdown(t=>{var r;t.addOption("__root__","\uFF08\u65E0\u6587\u4EF6\u5939\uFF09");for(let o of this.store.folders)t.addOption(o.id,this.getFolderPath(o));t.setValue((r=this.folderId)!=null?r:"__root__"),t.onChange(o=>{this.folderId=o==="__root__"?null:o})}),new n.Setting(e).addButton(t=>t.setButtonText("\u4FDD\u5B58").setCta().onClick(async()=>{if(!this.url.trim())return;this.title.trim()||(this.title=this.url);let r=this.url.trim();/^https?:\/\//i.test(r)||(r="https://"+r),await this.store.updateBookmark(this.bookmarkId,{title:this.title.trim(),url:r,folderId:this.folderId}),this.close()})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}getFolderPath(e){let t=[e.name],r=e;for(;r!=null&&r.parentId;)r=this.store.getFolder(r.parentId),r&&t.unshift(r.name);return t.join(" / ")}},v=class extends n.Modal{constructor(e,t,r=null){super(e),this.store=t,this.folderName="",this.parentId=r}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u65B0\u5EFA\u6587\u4EF6\u5939"}),new n.Setting(e).setName("\u6587\u4EF6\u5939\u540D\u79F0").addText(t=>t.setPlaceholder("\u8F93\u5165\u6587\u4EF6\u5939\u540D\u79F0").setValue(this.folderName).onChange(r=>{this.folderName=r})),new n.Setting(e).setName("\u7236\u6587\u4EF6\u5939").addDropdown(t=>{var r;t.addOption("__root__","\uFF08\u6839\u7EA7\u522B\uFF09");for(let o of this.store.folders)t.addOption(o.id,this.getFolderPath(o));t.setValue((r=this.parentId)!=null?r:"__root__"),t.onChange(o=>{this.parentId=o==="__root__"?null:o})}),new n.Setting(e).addButton(t=>t.setButtonText("\u521B\u5EFA").setCta().onClick(async()=>{this.folderName.trim()&&(await this.store.addFolder(this.folderName.trim(),this.parentId),this.close())})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}getFolderPath(e){let t=[e.name],r=e;for(;r!=null&&r.parentId;)r=this.store.getFolder(r.parentId),r&&t.unshift(r.name);return t.join(" / ")}},B=class extends n.Modal{constructor(e,t,r,o){super(e),this.store=t,this.folderId=r,this.folderName=o}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u7F16\u8F91\u6587\u4EF6\u5939"}),new n.Setting(e).setName("\u6587\u4EF6\u5939\u540D\u79F0").addText(t=>t.setPlaceholder("\u8F93\u5165\u6587\u4EF6\u5939\u540D\u79F0").setValue(this.folderName).onChange(r=>{this.folderName=r})),new n.Setting(e).addButton(t=>t.setButtonText("\u4FDD\u5B58").setCta().onClick(async()=>{this.folderName.trim()&&(await this.store.updateFolder(this.folderId,{name:this.folderName.trim()}),this.close())})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}},g=class extends n.Modal{constructor(e,t,r){super(e),this.message=t,this.onConfirm=r}onOpen(){let{contentEl:e}=this;e.empty(),e.addClass("side-bookmark-modal"),e.createEl("h3",{text:"\u786E\u8BA4\u5220\u9664"}),e.createEl("p",{text:this.message}),new n.Setting(e).addButton(t=>t.setButtonText("\u5220\u9664").setWarning().onClick(async()=>{await this.onConfirm(),this.close()})).addButton(t=>t.setButtonText("\u53D6\u6D88").onClick(()=>this.close()))}onClose(){let{contentEl:e}=this;e.empty()}};var E=class{constructor(e,t,r){this.collapsed=!1;this.unsubscribe=null;this.onNavigate=null;this.app=e,this.store=r,this.containerEl=t.createDiv({cls:"sb-bookmark-panel"}),this.headerEl=this.containerEl.createDiv({cls:"sb-bookmark-header"});let o=this.headerEl.createDiv({cls:"sb-bookmark-header-left"}),s=o.createDiv({cls:"sb-collapse-icon"});(0,d.setIcon)(s,"chevron-down"),o.createSpan({text:"\u4E66\u7B7E",cls:"sb-bookmark-title"}),o.addEventListener("click",()=>{this.toggleCollapse()});let l=this.headerEl.createDiv({cls:"sb-bookmark-header-right"}).createDiv({cls:"sb-add-btn-group"}),m=l.createDiv({cls:"sb-header-btn",attr:{"aria-label":"\u6DFB\u52A0\u4E66\u7B7E"}});(0,d.setIcon)(m,"plus"),m.addEventListener("click",P=>{P.stopPropagation(),new k(this.app,this.store).open()});let h=l.createDiv({cls:"sb-header-btn",attr:{"aria-label":"\u65B0\u5EFA\u6587\u4EF6\u5939"}});(0,d.setIcon)(h,"folder-plus"),h.addEventListener("click",P=>{P.stopPropagation(),new v(this.app,this.store).open()}),this.listEl=this.containerEl.createDiv({cls:"sb-bookmark-list"}),this.unsubscribe=this.store.onChange(()=>{this.renderList()}),this.renderList()}toggleCollapse(){this.collapsed=!this.collapsed,this.containerEl.toggleClass("sb-collapsed",this.collapsed);let e=this.headerEl.querySelector(".sb-collapse-icon");e&&(e.empty(),(0,d.setIcon)(e,this.collapsed?"chevron-right":"chevron-down"))}destroy(){this.unsubscribe&&this.unsubscribe(),this.containerEl.remove()}renderList(){if(this.listEl.empty(),this.store.getTreeItems(null).length===0){let t=this.listEl.createDiv({cls:"sb-empty-state"}),r=t.createDiv({cls:"sb-empty-icon"});(0,d.setIcon)(r,"bookmark"),t.createDiv({text:"\u6682\u65E0\u4E66\u7B7E",cls:"sb-empty-text"}),t.createDiv({text:"\u70B9\u51FB + \u6309\u94AE\u6216 \u2B50 \u6309\u94AE\u6DFB\u52A0\u4E66\u7B7E",cls:"sb-empty-hint"});return}this.renderTreeLevel(this.listEl,null,0)}renderTreeLevel(e,t,r){let o=this.store.getTreeItems(t);for(let s of o)s.type==="folder"?this.renderFolder(e,s,r):this.renderBookmark(e,s,r)}renderFolder(e,t,r){let o=e.createDiv({cls:"sb-tree-item sb-folder-item",attr:{"data-id":t.id,"data-type":"folder",draggable:"true"}});o.style.paddingLeft=`${r*16+4}px`;let s=o.createDiv({cls:"sb-tree-item-row"}),i=s.createDiv({cls:"sb-folder-collapse"});(0,d.setIcon)(i,t.collapsed?"chevron-right":"chevron-down");let l=s.createDiv({cls:"sb-item-icon"});(0,d.setIcon)(l,t.collapsed?"folder":"folder-open"),s.createSpan({text:t.name,cls:"sb-item-label"});let m=this.store.getBookmarksByFolder(t.id).length+this.store.getSubFolders(t.id).length;if(m>0&&s.createSpan({text:`${m}`,cls:"sb-count-badge"}),s.addEventListener("click",()=>{this.store.toggleFolder(t.id)}),s.addEventListener("contextmenu",h=>{h.preventDefault(),h.stopPropagation(),this.showFolderContextMenu(h,t)}),this.setupDragEvents(o,t),!t.collapsed){let h=e.createDiv({cls:"sb-folder-children"});this.renderTreeLevel(h,t.id,r+1)}}renderBookmark(e,t,r){let o=e.createDiv({cls:"sb-tree-item sb-bookmark-item",attr:{"data-id":t.id,"data-type":"bookmark",draggable:"true"}});o.style.paddingLeft=`${r*16+24}px`;let s=o.createDiv({cls:"sb-tree-item-row"}),i=s.createDiv({cls:"sb-item-icon"});(0,d.setIcon)(i,"globe"),s.createSpan({text:t.title,cls:"sb-item-label"}),s.addEventListener("click",()=>{this.onNavigate&&this.onNavigate(t.url)}),s.addEventListener("contextmenu",l=>{l.preventDefault(),l.stopPropagation(),this.showBookmarkContextMenu(l,t)}),this.setupDragEvents(o,t)}showBookmarkContextMenu(e,t){let r=new d.Menu;r.addItem(o=>{o.setTitle("\u6253\u5F00"),o.setIcon("external-link"),o.onClick(()=>{this.onNavigate&&this.onNavigate(t.url)})}),r.addSeparator(),r.addItem(o=>{o.setTitle("\u7F16\u8F91"),o.setIcon("pencil"),o.onClick(()=>{new b(this.app,this.store,t.id,t.title,t.url,t.folderId).open()})}),r.addItem(o=>{o.setTitle("\u79FB\u52A8\u5230..."),o.setIcon("folder-input"),o.onClick(()=>{this.showMoveMenu(e,t)})}),r.addSeparator(),r.addItem(o=>{o.setTitle("\u5220\u9664"),o.setIcon("trash-2"),o.onClick(()=>{new g(this.app,`\u786E\u5B9A\u8981\u5220\u9664\u4E66\u7B7E"${t.title}"\u5417\uFF1F`,async()=>{await this.store.removeBookmark(t.id)}).open()})}),r.showAtMouseEvent(e)}showFolderContextMenu(e,t){let r=new d.Menu;r.addItem(o=>{o.setTitle("\u6DFB\u52A0\u4E66\u7B7E\u5230\u6B64\u6587\u4EF6\u5939"),o.setIcon("plus"),o.onClick(()=>{new k(this.app,this.store,"","",t.id).open()})}),r.addItem(o=>{o.setTitle("\u6DFB\u52A0\u5B50\u6587\u4EF6\u5939"),o.setIcon("folder-plus"),o.onClick(()=>{new v(this.app,this.store,t.id).open()})}),r.addSeparator(),r.addItem(o=>{o.setTitle("\u91CD\u547D\u540D"),o.setIcon("pencil"),o.onClick(()=>{new B(this.app,this.store,t.id,t.name).open()})}),r.addSeparator(),r.addItem(o=>{o.setTitle("\u5220\u9664\u6587\u4EF6\u5939"),o.setIcon("trash-2"),o.onClick(()=>{let s=this.store.getBookmarksByFolder(t.id).length,i=this.store.getSubFolders(t.id).length,l=`\u786E\u5B9A\u8981\u5220\u9664\u6587\u4EF6\u5939"${t.name}"\u5417\uFF1F`;(s>0||i>0)&&(l+=` +\u5176\u4E2D\u5305\u542B ${s} \u4E2A\u4E66\u7B7E\u548C ${i} \u4E2A\u5B50\u6587\u4EF6\u5939\uFF0C\u5C06\u4E00\u5E76\u5220\u9664\u3002`),new g(this.app,l,async()=>{await this.store.removeFolder(t.id)}).open()})}),r.showAtMouseEvent(e)}showMoveMenu(e,t){let r=new d.Menu;t.folderId!==null&&(r.addItem(o=>{o.setTitle("\uFF08\u6839\u7EA7\u522B\uFF09"),o.setIcon("corner-left-up"),o.onClick(async()=>{await this.store.moveBookmark(t.id,null)})}),r.addSeparator());for(let o of this.store.folders)o.id!==t.folderId&&r.addItem(s=>{s.setTitle(o.name),s.setIcon("folder"),s.onClick(async()=>{await this.store.moveBookmark(t.id,o.id)})});r.showAtMouseEvent(e)}setupDragEvents(e,t){e.addEventListener("dragstart",r=>{r.dataTransfer&&(r.dataTransfer.setData("text/plain",JSON.stringify({id:t.id,type:t.type})),r.dataTransfer.effectAllowed="move"),e.addClass("sb-dragging")}),e.addEventListener("dragend",()=>{e.removeClass("sb-dragging"),this.listEl.querySelectorAll(".sb-drop-target").forEach(r=>r.removeClass("sb-drop-target"))}),e.addEventListener("dragover",r=>{r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="move"),e.addClass("sb-drop-target")}),e.addEventListener("dragleave",()=>{e.removeClass("sb-drop-target")}),e.addEventListener("drop",r=>{if(r.preventDefault(),e.removeClass("sb-drop-target"),!!r.dataTransfer)try{let o=JSON.parse(r.dataTransfer.getData("text/plain"));if(!o.id||!o.type)return;o.type==="bookmark"&&t.type==="folder"&&this.store.moveBookmark(o.id,t.id)}catch(o){}})}};var y=class extends D.ItemView{constructor(t,r){super(t);this.browserPanel=null;this.bookmarkPanel=null;this.plugin=r}getViewType(){return c}getDisplayText(){return"Side bookmark"}getIcon(){return"bookmark"}onOpen(){let t=this.contentEl;t.empty(),t.addClass("sb-container"),this.browserPanel=new w(t),this.browserPanel.onAddBookmark=(o,s)=>{new k(this.app,this.plugin.store,o,s,null,(i,l,m)=>{this.plugin.store.addBookmark(i,l,m)}).open()};let r=this.plugin.store.defaultUrl;return r&&this.browserPanel.navigate(r),this.bookmarkPanel=new E(this.app,t,this.plugin.store),this.bookmarkPanel.onNavigate=o=>{this.browserPanel&&this.browserPanel.navigate(o)},this.plugin.store.showBookmarkPanel||this.bookmarkPanel.toggleCollapse(),Promise.resolve()}onClose(){return this.browserPanel&&(this.browserPanel.destroy(),this.browserPanel=null),this.bookmarkPanel&&(this.bookmarkPanel.destroy(),this.bookmarkPanel=null),Promise.resolve()}navigateTo(t){this.browserPanel&&this.browserPanel.navigate(t)}};var p=require("obsidian"),I=class extends p.PluginSettingTab{constructor(e,t){super(e,t),this.plugin=t}display(){let{containerEl:e}=this;e.empty(),new p.Setting(e).setName("\u8BBE\u7F6E").setHeading(),new p.Setting(e).setName("\u9ED8\u8BA4\u9996\u9875").setDesc("\u6253\u5F00\u63D2\u4EF6\u65F6\u9ED8\u8BA4\u52A0\u8F7D\u7684\u7F51\u5740").addText(r=>r.setPlaceholder("https://www.google.com").setValue(this.plugin.store.defaultUrl).onChange(async o=>{this.plugin.store.defaultUrl=o,await this.plugin.store.save()})),new p.Setting(e).setName("\u9ED8\u8BA4\u663E\u793A\u4E66\u7B7E\u9762\u677F").setDesc("\u6253\u5F00\u63D2\u4EF6\u65F6\u662F\u5426\u9ED8\u8BA4\u5C55\u5F00\u4E66\u7B7E\u5217\u8868\u9762\u677F").addToggle(r=>r.setValue(this.plugin.store.showBookmarkPanel).onChange(async o=>{this.plugin.store.showBookmarkPanel=o,await this.plugin.store.save()})),new p.Setting(e).setName("\u62E6\u622A\u7B14\u8BB0\u94FE\u63A5").setDesc("\u5F00\u542F\u540E\uFF0C\u5355\u51FB\u7B14\u8BB0\u4E2D\u7684\u5916\u90E8\u94FE\u63A5\uFF08http/https\uFF09\u5C06\u81EA\u52A8\u5728\u5185\u7F6E\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\uFF0C\u800C\u975E\u4F7F\u7528\u7CFB\u7EDF\u6D4F\u89C8\u5668\u3002\u6309\u4F4F Cmd/Ctrl \u5355\u51FB\u53EF\u4E34\u65F6\u7ED5\u8FC7\uFF0C\u4ECD\u4F7F\u7528\u7CFB\u7EDF\u6D4F\u89C8\u5668\u6253\u5F00\u3002").addToggle(r=>r.setValue(this.plugin.store.interceptLinks).onChange(async o=>{this.plugin.store.interceptLinks=o,await this.plugin.store.save()})),new p.Setting(e).setName("\u7EDF\u8BA1").setHeading();let t=e.createDiv({cls:"sb-settings-stats"});t.createEl("p",{text:`\u4E66\u7B7E\u6570\u91CF: ${this.plugin.store.bookmarks.length}`}),t.createEl("p",{text:`\u6587\u4EF6\u5939\u6570\u91CF: ${this.plugin.store.folders.length}`})}};var T=class extends S.Plugin{constructor(){super(...arguments);this.modifierKeyPressed=!1}async onload(){this.store=new f(this),await this.store.load(),this.registerView(c,t=>new y(t,this)),this.addRibbonIcon("bookmark","Side bookmark",()=>{this.activateView()}),this.addCommand({id:"open",name:"\u6253\u5F00\u4FA7\u8FB9\u680F\u4E66\u7B7E",callback:()=>{this.activateView()}}),this.addSettingTab(new I(this.app,this)),this.registerDomEvent(document,"click",this.handleLinkClick.bind(this),!0),this.registerDomEvent(document,"keydown",t=>{(t.key==="Meta"||t.key==="Control"||t.metaKey||t.ctrlKey)&&(this.modifierKeyPressed=!0)}),this.registerDomEvent(document,"keyup",t=>{(t.key==="Meta"||t.key==="Control"||!t.metaKey&&!t.ctrlKey)&&(this.modifierKeyPressed=!1)}),this.registerDomEvent(window,"blur",()=>{this.modifierKeyPressed=!1}),this.originalWindowOpen=window.open,window.open=(t,r,o)=>{if(this.store.interceptLinks&&t&&!this.modifierKeyPressed){let s=t.toString();if(/^https?:\/\//i.test(s))return this.openUrlInSideBookmark(s),null}return this.originalWindowOpen.call(window,t,r,o)}}onunload(){this.originalWindowOpen&&(window.open=this.originalWindowOpen)}handleLinkClick(t){if(!this.store.interceptLinks)return;let o=t.target.closest("a");if(!o)return;let s=o.getAttribute("href")||o.href;!s||!/^https?:\/\//i.test(s)||t.metaKey||t.ctrlKey||o.closest(".sb-browser-panel")||o.closest("webview")||(t.preventDefault(),t.stopPropagation(),this.openUrlInSideBookmark(s))}async openUrlInSideBookmark(t){let{workspace:r}=this.app,o=r.getLeavesOfType(c);if(o.length===0)await this.activateView(),o=r.getLeavesOfType(c);else{let i=o[0];i&&r.revealLeaf(i)}let s=o[0];if(s){let i=s.view;typeof i.navigateTo=="function"&&i.navigateTo(t)}}async activateView(){let{workspace:t}=this.app,r=t.getLeavesOfType(c);if(r.length>0)t.revealLeaf(r[0]);else{let o=t.getRightLeaf(!1);o&&(await o.setViewState({type:c,active:!0}),t.revealLeaf(o))}}}; diff --git a/manifest.json b/manifest.json index 6e66586..60657aa 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "side-bookmark", "name": "Side Bookmark", - "version": "0.0.3", + "version": "0.0.4", "minAppVersion": "0.15.0", "description": "A sidebar bookmark browser. Browse websites and manage bookmarks right in the sidebar.", "author": "bcs1037", diff --git a/package-lock.json b/package-lock.json index e41e6e5..3df6c99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "side-bookmark", - "version": "0.0.2", + "version": "0.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "side-bookmark", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "dependencies": { "obsidian": "latest" diff --git a/package.json b/package.json index 266e17d..986f163 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "side-bookmark", - "version": "0.0.3", + "version": "0.0.4", "description": "A sidebar bookmark browser plugin for Obsidian", "main": "main.js", "type": "module", diff --git a/src/BookmarkPanel.ts b/src/BookmarkPanel.ts index cdbebb9..c28ce23 100644 --- a/src/BookmarkPanel.ts +++ b/src/BookmarkPanel.ts @@ -38,7 +38,7 @@ export class BookmarkPanel { const headerLeft = this.headerEl.createDiv({ cls: 'sb-bookmark-header-left' }); const collapseIcon = headerLeft.createDiv({ cls: 'sb-collapse-icon' }); setIcon(collapseIcon, 'chevron-down'); - headerLeft.createSpan({ text: '书签', cls: 'sb-bookmark-title' }); + headerLeft.createSpan({ text: 'Bookmarks', cls: 'sb-bookmark-title' }); headerLeft.addEventListener('click', () => { this.toggleCollapse(); @@ -51,7 +51,7 @@ export class BookmarkPanel { const addBookmarkBtn = addBtnGroup.createDiv({ cls: 'sb-header-btn', - attr: { 'aria-label': '添加书签' }, + attr: { 'aria-label': 'Add bookmark' }, }); setIcon(addBookmarkBtn, 'plus'); addBookmarkBtn.addEventListener('click', (e: MouseEvent) => { @@ -61,7 +61,7 @@ export class BookmarkPanel { const addFolderBtn = addBtnGroup.createDiv({ cls: 'sb-header-btn', - attr: { 'aria-label': '新建文件夹' }, + attr: { 'aria-label': 'New folder' }, }); setIcon(addFolderBtn, 'folder-plus'); addFolderBtn.addEventListener('click', (e: MouseEvent) => { @@ -111,9 +111,9 @@ export class BookmarkPanel { const emptyState = this.listEl.createDiv({ cls: 'sb-empty-state' }); const emptyIcon = emptyState.createDiv({ cls: 'sb-empty-icon' }); setIcon(emptyIcon, 'bookmark'); - emptyState.createDiv({ text: '暂无书签', cls: 'sb-empty-text' }); + emptyState.createDiv({ text: 'No bookmarks', cls: 'sb-empty-text' }); emptyState.createDiv({ - text: '点击 + 按钮或 ⭐ 按钮添加书签', + text: 'Click the + button or ⭐ icon to add a bookmark', cls: 'sb-empty-hint', }); return; @@ -225,7 +225,7 @@ export class BookmarkPanel { const menu = new Menu(); menu.addItem(item => { - item.setTitle('打开'); + item.setTitle('Open'); item.setIcon('external-link'); item.onClick(() => { if (this.onNavigate) { @@ -237,7 +237,7 @@ export class BookmarkPanel { menu.addSeparator(); menu.addItem(item => { - item.setTitle('编辑'); + item.setTitle('Edit'); item.setIcon('pencil'); item.onClick(() => { new EditBookmarkModal( @@ -253,7 +253,7 @@ export class BookmarkPanel { // Move to folder submenu menu.addItem(item => { - item.setTitle('移动到...'); + item.setTitle('Move to...'); item.setIcon('folder-input'); item.onClick(() => { this.showMoveMenu(event, bookmark); @@ -263,12 +263,12 @@ export class BookmarkPanel { menu.addSeparator(); menu.addItem(item => { - item.setTitle('删除'); + item.setTitle('Delete'); item.setIcon('trash-2'); item.onClick(() => { new ConfirmDeleteModal( this.app, - `确定要删除书签"${bookmark.title}"吗?`, + `Are you sure you want to delete bookmark "${bookmark.title}"?`, async () => { await this.store.removeBookmark(bookmark.id); } ).open(); }); @@ -282,7 +282,7 @@ export class BookmarkPanel { const menu = new Menu(); menu.addItem(item => { - item.setTitle('添加书签到此文件夹'); + item.setTitle('Add bookmark to this folder'); item.setIcon('plus'); item.onClick(() => { new AddBookmarkModal(this.app, this.store, '', '', folder.id).open(); @@ -290,7 +290,7 @@ export class BookmarkPanel { }); menu.addItem(item => { - item.setTitle('添加子文件夹'); + item.setTitle('Add sub-folder'); item.setIcon('folder-plus'); item.onClick(() => { new AddFolderModal(this.app, this.store, folder.id).open(); @@ -300,7 +300,7 @@ export class BookmarkPanel { menu.addSeparator(); menu.addItem(item => { - item.setTitle('重命名'); + item.setTitle('Rename'); item.setIcon('pencil'); item.onClick(() => { new EditFolderModal(this.app, this.store, folder.id, folder.name).open(); @@ -310,14 +310,14 @@ export class BookmarkPanel { menu.addSeparator(); menu.addItem(item => { - item.setTitle('删除文件夹'); + item.setTitle('Delete folder'); item.setIcon('trash-2'); item.onClick(() => { const bookmarkCount = this.store.getBookmarksByFolder(folder.id).length; const subFolderCount = this.store.getSubFolders(folder.id).length; - let msg = `确定要删除文件夹"${folder.name}"吗?`; + let msg = `Are you sure you want to delete folder "${folder.name}"?`; if (bookmarkCount > 0 || subFolderCount > 0) { - msg += `\n其中包含 ${bookmarkCount} 个书签和 ${subFolderCount} 个子文件夹,将一并删除。`; + msg += `\nIt contains ${bookmarkCount} bookmarks and ${subFolderCount} folders, which will all be deleted.`; } new ConfirmDeleteModal( this.app, @@ -337,7 +337,7 @@ export class BookmarkPanel { // Move to root if (bookmark.folderId !== null) { menu.addItem(item => { - item.setTitle('(根级别)'); + item.setTitle('(Root level)'); item.setIcon('corner-left-up'); item.onClick(async () => { await this.store.moveBookmark(bookmark.id, null); diff --git a/src/BrowserPanel.ts b/src/BrowserPanel.ts index 581e648..c70f17c 100644 --- a/src/BrowserPanel.ts +++ b/src/BrowserPanel.ts @@ -31,15 +31,15 @@ export class BrowserPanel { // Navigation buttons const navBtns = this.navBarEl.createDiv({ cls: 'sb-nav-buttons' }); - this.backBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': '后退' } }); + this.backBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': 'Back' } }); setIcon(this.backBtn, 'arrow-left'); this.backBtn.addEventListener('click', () => this.goBack()); - this.forwardBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': '前进' } }); + this.forwardBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': 'Forward' } }); setIcon(this.forwardBtn, 'arrow-right'); this.forwardBtn.addEventListener('click', () => this.goForward()); - this.refreshBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': '刷新' } }); + this.refreshBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': 'Reload' } }); setIcon(this.refreshBtn, 'refresh-cw'); this.refreshBtn.addEventListener('click', () => this.reload()); @@ -48,7 +48,7 @@ export class BrowserPanel { cls: 'sb-url-input', attr: { type: 'text', - placeholder: '输入网址...', + placeholder: 'Enter URL...', spellcheck: 'false', }, }); @@ -62,7 +62,7 @@ export class BrowserPanel { }); // Bookmark (star) button - this.bookmarkBtn = this.navBarEl.createDiv({ cls: 'sb-nav-btn sb-bookmark-btn', attr: { 'aria-label': '添加书签' } }); + this.bookmarkBtn = this.navBarEl.createDiv({ cls: 'sb-nav-btn sb-bookmark-btn', attr: { 'aria-label': 'Add bookmark' } }); setIcon(this.bookmarkBtn, 'star'); this.bookmarkBtn.addEventListener('click', () => { if (this.onAddBookmark && this.currentUrl) { diff --git a/src/main.ts b/src/main.ts index 2b48064..c56cb0c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,7 +32,7 @@ export default class SideBookmarkPlugin extends Plugin { this.addCommand({ id: 'open', - name: '打开侧边栏书签', + name: 'Open side bookmark', callback: () => { void this.activateView(); }, diff --git a/src/modals.ts b/src/modals.ts index 9fc4855..7a127fb 100644 --- a/src/modals.ts +++ b/src/modals.ts @@ -37,18 +37,18 @@ export class AddBookmarkModal extends Modal { contentEl.empty(); contentEl.addClass('side-bookmark-modal'); - contentEl.createEl('h3', { text: '添加书签' }); + contentEl.createEl('h3', { text: 'Add bookmark' }); new Setting(contentEl) - .setName('标题') + .setName('Title') .addText(text => text - .setPlaceholder('输入书签标题') + .setPlaceholder('Enter bookmark title') .setValue(this.title) .onChange(value => { this.title = value; }) ); new Setting(contentEl) - .setName('网址') + .setName('URL') .addText(text => text .setPlaceholder('https://example.com') .setValue(this.url) @@ -56,9 +56,9 @@ export class AddBookmarkModal extends Modal { ); new Setting(contentEl) - .setName('文件夹') + .setName('Folder') .addDropdown(dropdown => { - dropdown.addOption('__root__', '(无文件夹)'); + dropdown.addOption('__root__', '(No folder)'); for (const folder of this.store.folders) { dropdown.addOption(folder.id, this.getFolderPath(folder)); } @@ -70,7 +70,7 @@ export class AddBookmarkModal extends Modal { new Setting(contentEl) .addButton(btn => btn - .setButtonText('保存') + .setButtonText('Save') .setCta() .onClick(async () => { if (!this.url.trim()) { @@ -93,7 +93,7 @@ export class AddBookmarkModal extends Modal { }) ) .addButton(btn => btn - .setButtonText('取消') + .setButtonText('Cancel') .onClick(() => this.close()) ); } @@ -147,18 +147,18 @@ export class EditBookmarkModal extends Modal { contentEl.empty(); contentEl.addClass('side-bookmark-modal'); - contentEl.createEl('h3', { text: '编辑书签' }); + contentEl.createEl('h3', { text: 'Edit bookmark' }); new Setting(contentEl) - .setName('标题') + .setName('Title') .addText(text => text - .setPlaceholder('输入书签标题') + .setPlaceholder('Enter bookmark title') .setValue(this.title) .onChange(value => { this.title = value; }) ); new Setting(contentEl) - .setName('网址') + .setName('URL') .addText(text => text .setPlaceholder('https://example.com') .setValue(this.url) @@ -166,9 +166,9 @@ export class EditBookmarkModal extends Modal { ); new Setting(contentEl) - .setName('文件夹') + .setName('Folder') .addDropdown(dropdown => { - dropdown.addOption('__root__', '(无文件夹)'); + dropdown.addOption('__root__', '(No folder)'); for (const folder of this.store.folders) { dropdown.addOption(folder.id, this.getFolderPath(folder)); } @@ -180,7 +180,7 @@ export class EditBookmarkModal extends Modal { new Setting(contentEl) .addButton(btn => btn - .setButtonText('保存') + .setButtonText('Save') .setCta() .onClick(async () => { if (!this.url.trim()) return; @@ -200,7 +200,7 @@ export class EditBookmarkModal extends Modal { }) ) .addButton(btn => btn - .setButtonText('取消') + .setButtonText('Cancel') .onClick(() => this.close()) ); } @@ -242,20 +242,20 @@ export class AddFolderModal extends Modal { contentEl.empty(); contentEl.addClass('side-bookmark-modal'); - contentEl.createEl('h3', { text: '新建文件夹' }); + contentEl.createEl('h3', { text: 'New folder' }); new Setting(contentEl) - .setName('文件夹名称') + .setName('Folder name') .addText(text => text - .setPlaceholder('输入文件夹名称') + .setPlaceholder('Enter folder name') .setValue(this.folderName) .onChange(value => { this.folderName = value; }) ); new Setting(contentEl) - .setName('父文件夹') + .setName('Parent folder') .addDropdown(dropdown => { - dropdown.addOption('__root__', '(根级别)'); + dropdown.addOption('__root__', '(Root level)'); for (const folder of this.store.folders) { dropdown.addOption(folder.id, this.getFolderPath(folder)); } @@ -267,7 +267,7 @@ export class AddFolderModal extends Modal { new Setting(contentEl) .addButton(btn => btn - .setButtonText('创建') + .setButtonText('Create') .setCta() .onClick(async () => { if (!this.folderName.trim()) return; @@ -276,7 +276,7 @@ export class AddFolderModal extends Modal { }) ) .addButton(btn => btn - .setButtonText('取消') + .setButtonText('Cancel') .onClick(() => this.close()) ); } @@ -318,19 +318,19 @@ export class EditFolderModal extends Modal { contentEl.empty(); contentEl.addClass('side-bookmark-modal'); - contentEl.createEl('h3', { text: '编辑文件夹' }); + contentEl.createEl('h3', { text: 'Edit folder' }); new Setting(contentEl) - .setName('文件夹名称') + .setName('Folder name') .addText(text => text - .setPlaceholder('输入文件夹名称') + .setPlaceholder('Enter folder name') .setValue(this.folderName) .onChange(value => { this.folderName = value; }) ); new Setting(contentEl) .addButton(btn => btn - .setButtonText('保存') + .setButtonText('Save') .setCta() .onClick(async () => { if (!this.folderName.trim()) return; @@ -341,7 +341,7 @@ export class EditFolderModal extends Modal { }) ) .addButton(btn => btn - .setButtonText('取消') + .setButtonText('Cancel') .onClick(() => this.close()) ); } @@ -369,12 +369,12 @@ export class ConfirmDeleteModal extends Modal { contentEl.empty(); contentEl.addClass('side-bookmark-modal'); - contentEl.createEl('h3', { text: '确认删除' }); + contentEl.createEl('h3', { text: 'Confirm delete' }); contentEl.createEl('p', { text: this.message }); new Setting(contentEl) .addButton(btn => btn - .setButtonText('删除') + .setButtonText('Delete') .setWarning() .onClick(async () => { await this.onConfirm(); @@ -382,7 +382,7 @@ export class ConfirmDeleteModal extends Modal { }) ) .addButton(btn => btn - .setButtonText('取消') + .setButtonText('Cancel') .onClick(() => this.close()) ); } diff --git a/src/settings.ts b/src/settings.ts index 23df529..0e94ebc 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -18,11 +18,11 @@ export class SideBookmarkSettingTab extends PluginSettingTab { const { containerEl } = this; containerEl.empty(); - new Setting(containerEl).setName('设置').setHeading(); + new Setting(containerEl).setName('General').setHeading(); new Setting(containerEl) - .setName('默认首页') - .setDesc('打开插件时默认加载的网址') + .setName('Default homepage') + .setDesc('The URL to load when the plugin opens.') .addText(text => text .setPlaceholder('https://www.google.com') .setValue(this.plugin.store.defaultUrl) @@ -33,8 +33,8 @@ export class SideBookmarkSettingTab extends PluginSettingTab { ); new Setting(containerEl) - .setName('默认显示书签面板') - .setDesc('打开插件时是否默认展开书签列表面板') + .setName('Show bookmark panel by default') + .setDesc('Expand the bookmark list panel automatically when the plugin opens.') .addToggle(toggle => toggle .setValue(this.plugin.store.showBookmarkPanel) .onChange(async (value) => { @@ -44,8 +44,8 @@ export class SideBookmarkSettingTab extends PluginSettingTab { ); new Setting(containerEl) - .setName('拦截笔记链接') - .setDesc('开启后,单击笔记中的外部链接(http/https)将自动在内置浏览器中打开,而非使用系统浏览器。按住 Cmd/Ctrl 单击可临时绕过,仍使用系统浏览器打开。') + .setName('Intercept note links') + .setDesc('When enabled, clicking external links (http/https) in notes opens them in the built-in browser instead of the system browser. Hold Cmd/Ctrl while clicking to bypass and use the system browser.') .addToggle(toggle => toggle .setValue(this.plugin.store.interceptLinks) .onChange(async (value) => { @@ -55,14 +55,14 @@ export class SideBookmarkSettingTab extends PluginSettingTab { ); // Statistics section - new Setting(containerEl).setName('统计').setHeading(); + new Setting(containerEl).setName('Statistics').setHeading(); const stats = containerEl.createDiv({ cls: 'sb-settings-stats' }); stats.createEl('p', { - text: `书签数量: ${this.plugin.store.bookmarks.length}`, + text: `Bookmarks: ${this.plugin.store.bookmarks.length}`, }); stats.createEl('p', { - text: `文件夹数量: ${this.plugin.store.folders.length}`, + text: `Folders: ${this.plugin.store.folders.length}`, }); } } diff --git a/versions.json b/versions.json index ed555bf..b7e9153 100644 --- a/versions.json +++ b/versions.json @@ -1,5 +1,6 @@ { "0.0.1": "0.15.0", "0.0.2": "0.15.0", - "0.0.3": "0.15.0" + "0.0.3": "0.15.0", + "0.0.4": "0.15.0" }