Files
Main/.obsidian/plugins/copy-url-in-preview/main.js
2024-12-02 15:11:30 +01:00

8 lines
11 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
"use strict";var P=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var S=(o,i)=>{for(var e in i)P(o,e,{get:i[e],enumerable:!0})},U=(o,i,e,t)=>{if(i&&typeof i=="object"||typeof i=="function")for(let n of D(i))!B.call(o,n)&&n!==e&&P(o,n,{get:()=>i[n],enumerable:!(t=N(i,n))||t.enumerable});return o};var R=o=>U(P({},"__esModule",{value:!0}),o);var O={};S(O,{default:()=>M});module.exports=R(O);var p=require("obsidian");var f=require("obsidian"),v={loadImageBlob:5e3,longTap:500,deleteTempFile:6e4,openPdfMenu:5e3,successNotice:1800};function H(o,i){let e=new Promise((t,n)=>setTimeout(()=>{n(new Error(`timed out after ${o} ms`))},o));return Promise.race([i,e])}async function W(o){let i=o instanceof ArrayBuffer?new Blob([o],{type:"image/png"}):await I(o);try{let e=new ClipboardItem({[i.type]:i});await navigator.clipboard.write([e]),new f.Notice("Image copied to the clipboard!",v.successNotice)}catch(e){console.error(e),new f.Notice("Error, could not copy the image!")}}async function I(o){let i=()=>new Promise((e,t)=>{let n=new Image;n.crossOrigin="anonymous",n.onload=()=>{let a=document.createElement("canvas");a.width=n.width,a.height=n.height,a.getContext("2d").drawImage(n,0,0),a.toBlob(d=>{e(d)})},n.onerror=async()=>{try{await fetch(n.src,{mode:"no-cors"});let a=await I(`https://api.allorigins.win/raw?url=${encodeURIComponent(o)}`);e(a)}catch(a){t(new Error)}},n.src=o});return H(v.loadImageBlob,i())}function g(o,i,e,t){return o.on(i,e,t),()=>{o.off(i,e,t)}}function E(o){let i=o.target;if(!(i instanceof HTMLImageElement))console.error("imageElement is supposed to be a HTMLImageElement. imageElement:",i);else return i}function k(o,i){let t=i.vault.adapter.getFilePath("").replace("file://",""),n=o.pathname;if(n.startsWith(t)){let a=n.substring(t.length+1);return decodeURI(a)}}function C(o,i){o.workspace.getLeaf(!0).openFile(i,{active:!0})}function x(o,i){let e=E(i);if(!e)return;let t=o.workspace.getActiveFile(),n=k(new URL(e.src),o);if(!n)return;let a=t?o.metadataCache.getFirstLinkpathDest(n,t.path):o.vault.getAbstractFileByPath(n);a&&a instanceof f.TFile&&C(o,a)}function L(o){let i=activeDocument;o.register(g(i,"keydown","*",e=>{e.key==="Escape"&&(e.preventDefault(),e.stopPropagation(),o.hide())}))}function m(o,i,e){let t={"copy-to-clipboard":{section:"info",icon:"image-file",title:"interface.label-copy"},"open-in-new-tab":{section:"open",icon:"file-plus",title:"interface.menu.open-in-new-tab"},"open-in-default-app":{section:"system",icon:"arrow-up-right",title:"plugins.open-with-default-app.action-open-file"},"show-in-explorer":{section:"system",icon:"arrow-up-right",title:"plugins.open-with-default-app.action-show-in-folder"+(f.Platform.isMacOS?"-mac":"")},"reveal-in-navigation":{section:"system",icon:"folder",title:"plugins.file-explorer.action-reveal-file"},"reveal-in-navigation-tree":{section:"system",icon:"folder",title:"Reveal in File Tree Alternative"},"open-pdf":{section:"system",icon:"arrow-up-right",title:"plugins.open-with-default-app.action-open-file"}};return i==="copy-to-clipboard"&&e&&o.onClick(async()=>{await W(typeof e=="string"?e:await e)}),o.setIcon(t[i].icon).setTitle(i18next.t(t[i].title)).setSection(t[i].section)}var w=require("obsidian"),A={pdfMenu:!1,middleClickNewTab:!0,revealInNavigation:!0,enableDefaultOnCanvas:!1},y=class extends w.PluginSettingTab{constructor(i,e){super(i,e),this.plugin=e}display(){let{containerEl:i}=this;i.empty(),i.createEl("h3",{text:"Image Context Menus settings"}),new w.Setting(i).setName("PDF context menu").addToggle(e=>{e.setValue(this.plugin.settings.pdfMenu).onChange(t=>{this.plugin.settings.pdfMenu=t,this.plugin.saveSettings()})}),new w.Setting(i).setName("Middle mouse click on image link to open in new tab").addToggle(e=>{e.setValue(this.plugin.settings.middleClickNewTab).onChange(t=>{this.plugin.settings.middleClickNewTab=t,this.plugin.saveSettings()})}),new w.Setting(i).setName("Reveal file in navigation menu item").setDesc("You might want to disable this if you use a plugin for replacing default Obsidian file navigation. This plugin supports File Tree Alternative by displaying a reveal menu item for it if installed.").addToggle(e=>{e.setValue(this.plugin.settings.revealInNavigation).onChange(t=>{this.plugin.settings.revealInNavigation=t,this.plugin.saveSettings()})}),new w.Setting(i).setName("Enable regular context menu on canvas").setDesc(`The regular context menu sometimes duplicates the context menu on the canvas, so it's disabled there by default.
There is a separate context menu for images directly on the canvas, but if that's not enough (for example for images in notes on canvas), you can enable the regular context menu here too.`).addToggle(e=>{e.setValue(this.plugin.settings.enableDefaultOnCanvas).onChange(t=>{this.plugin.settings.enableDefaultOnCanvas=t,this.plugin.saveSettings()})})}};var M=class extends p.Plugin{constructor(){super(...arguments);this.preventReopenPdfMenu=!1}async loadSettings(){this.settings=Object.assign({},A,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}async onload(){await this.loadSettings(),this.addSettingTab(new y(this.app,this)),this.registerDocument(document);let e=/(avif|bmp|gif|jpe?g|png|svg|webp)$/gi;this.app.workspace.on("window-open",(t,n)=>{this.registerDocument(n.document)}),this.registerEvent(this.app.workspace.on("file-menu",(t,n,a)=>{var r;a==="canvas-menu"&&n instanceof p.TFile&&((r=n.extension.match(e))!=null?r:n.extension==="pdf")&&(t.addItem(d=>m(d,"open-in-new-tab").onClick(()=>{C(this.app,n)})),t.addItem(d=>m(d,"copy-to-clipboard",this.app.vault.readBinary(n))))})),this.registerEvent(this.app.workspace.on("canvas:node-menu",(t,n)=>{let a=n.unknownData;if(a.type==="link"){let r=a.url;t.addItem(d=>m(d,"copy-to-clipboard",r).setSection("canvas"))}})),this.registerEvent(this.app.workspace.on("url-menu",(t,n)=>{n.match(e)&&t.addItem(a=>m(a,"copy-to-clipboard",n))}))}registerDocument(e){let t=[g(e,"mouseover",".pdf-embed iframe, .pdf-embed div.pdf-container, .workspace-leaf-content[data-type=pdf]",this.showOpenPdfMenu.bind(this)),g(e,"mousemove",".pdf-canvas",this.showOpenPdfMenu.bind(this))];p.Platform.isDesktop?t=t.concat([g(e,"contextmenu","img",this.onImageContextMenu.bind(this)),g(e,"mouseup","img",this.onImageMouseUp.bind(this)),g(e,"mouseover",".cm-link, .cm-hmd-internal-link",this.storeLastHoveredLinkInEditor.bind(this)),g(e,"mouseover","a.internal-link",this.storeLastHoveredLinkInPreview.bind(this))]):t=t.concat([g(e,"touchstart","img",this.startWaitingForLongTap.bind(this)),g(e,"touchend","img",this.stopWaitingForLongTap.bind(this)),g(e,"touchmove","img",this.stopWaitingForLongTap.bind(this))]),this.register(()=>{t.forEach(n=>{n()})})}storeLastHoveredLinkInEditor(e){var r;let t=(r=this.app.workspace.getActiveViewOfType(p.MarkdownView))==null?void 0:r.editor;if(!t)return;let n=t.posAtMouse(e),a=t.getClickableTokenAt(n);a&&(this.lastHoveredLinkTarget=a.text)}storeLastHoveredLinkInPreview(e,t){var n;this.lastHoveredLinkTarget=(n=t.getAttribute("data-href"))!=null?n:void 0}showOpenPdfMenu(e,t){var h,b;if(!this.settings.pdfMenu||this.openPdfMenu||this.preventReopenPdfMenu)return;let n=((h=this.app.workspace.getActiveFile())==null?void 0:h.extension)==="canvas";if(!this.settings.enableDefaultOnCanvas&&n)return;let a=t.getBoundingClientRect(),r=100;if(!n&&a.left+r<e.x&&e.x<a.right-r&&a.top+r<e.y&&e.y<a.bottom-r)return;let d=t.closest(".pdf-embed");if((d==null?void 0:d.className)==="canvas-node-content pdf-embed is-loaded")return;let c;if(d){let l;if(d.hasClass("popover")?l=this.lastHoveredLinkTarget:l=(b=d.getAttr("src"))!=null?b:this.lastHoveredLinkTarget,l){l=l.replace(/#page=\d+$/,"");let u=this.app.workspace.getActiveFile().path;c=this.app.metadataCache.getFirstLinkpathDest(l,u)}}else c=this.app.workspace.getActiveFile();if(n){let l=activeDocument.querySelector(".menu");l&&(l.style.display="none",this.canvasCardMenu=l)}let s=new p.Menu;L(s),s.onHide(()=>this.openPdfMenu=void 0),s.addItem(l=>m(l,"open-pdf").onClick(async()=>{this.preventReopenPdfMenu=!0,setTimeout(()=>{this.preventReopenPdfMenu=!1},v.openPdfMenu),this.hideOpenPdfMenu(),p.Platform.isDesktop?this.app.openWithDefaultApp(c.path):await this.app.vault.adapter.open(c.path)})),s.showAtMouseEvent(e),this.openPdfMenu=s,setTimeout(this.hideOpenPdfMenu.bind(this),v.openPdfMenu)}hideOpenPdfMenu(){this.openPdfMenu&&this.openPdfMenu.hide(),this.canvasCardMenu&&(this.canvasCardMenu.style.display="")}startWaitingForLongTap(e,t){t instanceof HTMLImageElement&&(this.longTapTimeoutId?(clearTimeout(this.longTapTimeoutId),this.longTapTimeoutId=void 0):e.targetTouches.length==1&&(this.longTapTimeoutId=window.setTimeout(()=>void this.processLongTap.bind(this,e,t)(),v.longTap)))}stopWaitingForLongTap(){this.longTapTimeoutId&&(clearTimeout(this.longTapTimeoutId),this.longTapTimeoutId=void 0)}async processLongTap(e,t){e.stopPropagation(),this.longTapTimeoutId=void 0;let n=this.app.vault.adapter,a=window,r=n.getFullPath(""),c=a.WEBVIEW_SERVER_URL+"/_capacitor_file_"+r;if(t.src.startsWith(c)){let s=t.src.replace(c,""),h=decodeURIComponent(s);await n.open(h)}else try{let s=await I(t.src);if(!s)throw new Error("blob was null");if(!s.type.startsWith("image/")){new p.Notice(`Unsupported mime type ${s.type}`);return}let h=s.type.replace("image/",""),l=`/.temp-${window.URL.createObjectURL(new Blob([])).split("/").pop()}.${h}`,u=await s.arrayBuffer();await n.writeBinary(l,u),setTimeout(()=>void n.remove(l),v.deleteTempFile),new p.Notice("Image was temporarily saved and will be removed in 1 minute"),await n.open(l)}catch(s){new p.Notice("Cannot open image"),console.error(s)}}onImageContextMenu(e){var h,b,l;let t=E(e);if(!t||!this.settings.enableDefaultOnCanvas&&((h=this.app.workspace.getActiveFile())==null?void 0:h.extension)==="canvas"||((l=(b=e.targetNode)==null?void 0:b.parentElement)==null?void 0:l.className)==="canvas-node-content media-embed image-embed is-loaded")return;let n=t.currentSrc,a=new URL(n),r=a.protocol;if(!["app:","data:","http:","https:"].includes(r)){new p.Notice(`no handler for ${r} protocol`);return}e.preventDefault();let c=new p.Menu,s=k(a,this.app);c.addSections(["open","info","system"]),r==="app:"&&s&&(c.addItem(u=>m(u,"open-in-new-tab").onClick(()=>{x(this.app,e)})),p.Platform.isDesktop&&(c.addItem(u=>m(u,"open-in-default-app").onClick(()=>{this.app.openWithDefaultApp(s)})),c.addItem(u=>m(u,"show-in-explorer").onClick(()=>{this.app.showInFolder(s)})),this.settings.revealInNavigation&&c.addItem(u=>m(u,"reveal-in-navigation").onClick(()=>{var F;let T=this.app.vault.getFileByPath(s);if(!T){console.warn(`getFileByPath returned null for ${s}`);return}(F=this.app.internalPlugins.getEnabledPluginById("file-explorer"))==null||F.revealInFolder(T)})),this.app.plugins.enabledPlugins.has("file-tree-alternative")&&c.addItem(u=>m(u,"reveal-in-navigation-tree").onClick(()=>{let T=this.app.vault.getFileByPath(s);if(!T){console.warn(`getFileByPath returned null for ${s}`);return}window.dispatchEvent(new CustomEvent("fta-reveal-file",{detail:{file:T}}))})))),c.addItem(u=>m(u,"copy-to-clipboard",n)),c.showAtPosition({x:e.pageX,y:e.pageY}),this.app.workspace.trigger("copy-url-in-preview:contextmenu",c)}onImageMouseUp(e){e.button==1&&this.settings.middleClickNewTab&&x(this.app,e)}};