- Created a new CSS file for font imports and defined font families for base, mono, strong, em, and h1 elements. - Added a new JavaScript file to extend the default VitePress theme, incorporating a custom layout and a Vue component for enhanced functionality. - Integrated Mermaid diagram support and included the necessary styles for it.
7 lines
10 KiB
JavaScript
7 lines
10 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
|
|
*/
|
|
|
|
var B=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var at=Object.prototype.hasOwnProperty;var nt=(f,t)=>{for(var e in t)B(f,e,{get:t[e],enumerable:!0})},it=(f,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of st(t))!at.call(f,s)&&s!==e&&B(f,s,{get:()=>t[s],enumerable:!(a=et(t,s))||a.enumerable});return f};var ot=f=>it(B({},"__esModule",{value:!0}),f);var rt={};nt(rt,{default:()=>E});module.exports=ot(rt);var g=require("obsidian");var x=require("obsidian"),V={docsPath:"docs",assetsPath:"docs/public",nestInFolder:!1,preserveFolderStructure:!1,transparentCanvas:!0,canvasEmbedTemplate:""},T=class extends x.PluginSettingTab{constructor(t,e){super(t,e),this.plugin=e}display(){let{containerEl:t}=this;t.empty(),new x.Setting(t).setName("Docs path").setDesc("Path to the docs directory (relative to vault root)").addText(e=>e.setPlaceholder("docs").setValue(this.plugin.settings.docsPath).onChange(async a=>{this.plugin.settings.docsPath=a,await this.plugin.saveSettings()})),new x.Setting(t).setName("Assets path").setDesc("Path to the assets directory (relative to vault root)").addText(e=>e.setPlaceholder("docs/public").setValue(this.plugin.settings.assetsPath).onChange(async a=>{this.plugin.settings.assetsPath=a,await this.plugin.saveSettings()})),new x.Setting(t).setName("Nest in folder").setDesc("Create a folder for each note (e.g., notes/some-note.md > docs/some-note/index.md)").addToggle(e=>e.setValue(this.plugin.settings.nestInFolder).onChange(async a=>{this.plugin.settings.nestInFolder=a,await this.plugin.saveSettings()})),new x.Setting(t).setName("Preserve folder structure").setDesc("Keep original folder structure (e.g., notes/some-note.md > docs/notes/some-note.md)").addToggle(e=>e.setValue(this.plugin.settings.preserveFolderStructure).onChange(async a=>{this.plugin.settings.preserveFolderStructure=a,await this.plugin.saveSettings()})),new x.Setting(t).setName("Transparent canvas background").setDesc("Export canvas with transparent background (hide dots pattern)").addToggle(e=>e.setValue(this.plugin.settings.transparentCanvas).onChange(async a=>{this.plugin.settings.transparentCanvas=a,await this.plugin.saveSettings()})),new x.Setting(t).setName("Canvas embed template").setDesc('Template for embedding canvas images. Use {url} as placeholder for the image path. Examples:  or <Viewer src="{url}" />').addText(e=>e.setPlaceholder("").setValue(this.plugin.settings.canvasEmbedTemplate).onChange(async a=>{this.plugin.settings.canvasEmbedTemplate=a,await this.plugin.saveSettings()}))}};var E=class extends g.Plugin{async onload(){await this.loadSettings(),this.addCommand({id:"export-to-docs",name:"Export current note to docs",callback:()=>{this.exportCurrentNote()}}),this.registerEvent(this.app.workspace.on("file-menu",(t,e)=>{(e.extension==="md"||e.extension==="canvas")&&t.addItem(a=>{a.setTitle("Export to docs").setIcon("upload").onClick(()=>{this.exportNote(e)})})})),this.addSettingTab(new T(this.app,this)),console.warn("Odox plugin loaded")}onunload(){console.warn("Odox plugin unloaded")}async loadSettings(){this.settings=Object.assign({},V,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}async exportCurrentNote(){let t=this.app.workspace.getActiveFile();if(!t){new g.Notice("No active file found");return}if(t.extension!=="md"&&t.extension!=="canvas"){new g.Notice("Current file is not a Markdown or canvas file");return}await this.exportNote(t)}async exportNote(t){if(t.extension==="canvas"){await this.exportCanvasFile(t);return}if(t.path.startsWith(this.settings.docsPath)){new g.Notice(`File is already in docs: ${t.path}`);return}let{vault:e}=this.app,a=await e.readBinary(t),s=new TextDecoder().decode(a),d=await this.processAssets(s,t),o,l=t.name.replace(".md",""),r=t.path.replace(".md","");this.settings.preserveFolderStructure&&this.settings.nestInFolder?o=`${this.settings.docsPath}/${r}/index.md`:this.settings.preserveFolderStructure?o=`${this.settings.docsPath}/${t.path}`:this.settings.nestInFolder?o=`${this.settings.docsPath}/${l}/index.md`:o=`${this.settings.docsPath}/${t.name}`;let i=o.substring(0,o.lastIndexOf("/"));await e.adapter.mkdir(i);let n=new TextEncoder().encode(d);await e.adapter.writeBinary(o,n.buffer),console.warn(`Exported ${t.name} to ${o}`)}async exportCanvasFile(t){if(t.path.startsWith(this.settings.docsPath)){new g.Notice(`File is already in docs: ${t.path}`);return}let{vault:e}=this.app,a=await this.renderCanvas(t,t);if(!a){new g.Notice(`Failed to render canvas: ${t.name}`);return}let s=t.name+".png",d=`${this.settings.assetsPath}/${s}`;await e.adapter.mkdir(this.settings.assetsPath),await e.adapter.writeBinary(d,a.buffer);let o=t.name.replace(".canvas",""),l=t.path.replace(".canvas",""),r;this.settings.preserveFolderStructure&&this.settings.nestInFolder?r=`${this.settings.docsPath}/${l}.canvas/index.md`:this.settings.preserveFolderStructure?r=`${this.settings.docsPath}/${l}.canvas.md`:this.settings.nestInFolder?r=`${this.settings.docsPath}/${o}.canvas/index.md`:r=`${this.settings.docsPath}/${o}.canvas.md`;let i=r.substring(0,r.lastIndexOf("/"));await e.adapter.mkdir(i);let n=this.settings.canvasEmbedTemplate.replace("{url}",`/${s}`),c=new TextEncoder().encode(n);await e.adapter.writeBinary(r,c.buffer),console.warn(`Exported ${t.name} to ${r}`),new g.Notice(`Exported ${t.name} to ${r}`)}async processAssets(t,e){let{vault:a,metadataCache:s}=this.app,d=s.getCache(e.path);if(!d)return t;let o=new Map,l=new Set;if(d.embeds)for(let i of d.embeds){let n=s.getFirstLinkpathDest(i.link,e.path);n&&(n.extension==="canvas"?l.add(n.path):o.set(n.path,i.link))}if(d.links)for(let i of d.links){let n=s.getFirstLinkpathDest(i.link,e.path);n&&n.extension!=="md"&&(o.has(n.path)||o.set(n.path,i.link))}let r=new Map;for(let i of l)try{let n=a.getAbstractFileByPath(i);if(n instanceof g.TFile){let c=await this.renderCanvas(n,e);if(c){let m=n.name+".png",h=`${this.settings.assetsPath}/${m}`;await a.adapter.mkdir(this.settings.assetsPath),await a.adapter.writeBinary(h,c.buffer),r.set(i,m)}}}catch(n){console.error(`Failed to render canvas ${i}:`,n)}t=this.updateCanvasInContent(t,r,e);for(let[i,n]of o)try{let c=a.getAbstractFileByPath(i);if(c instanceof g.TFile){let m=await a.readBinary(c),h=c.name,S=`${this.settings.assetsPath}/${h}`;await a.adapter.mkdir(this.settings.assetsPath),await a.adapter.writeBinary(S,m),t=this.updateLinksInContent(t,n,h)}}catch(c){console.error(`Failed to copy asset ${i}:`,c)}return t}updateLinksInContent(t,e,a){let s=`/${encodeURIComponent(a)}`,o=e.replace(/^.*\//,"").replace(/ /g,"%20"),l=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=new RegExp(`!\\[([^\\]]*)\\]\\([^)]*${l}\\)`,"g"),i=t.replace(r,``);i!==t&&console.log(`[Odox] Replaced markdown image link: ${o} -> ${s}`);let n=new RegExp(`!\\[\\[([^)]*${l})(\\|[^\\]]*)?\\]\\]`,"g");return i=i.replace(n,``),i}async renderCanvas(t,e=null){var o,l,r;let a=this.app.workspace.getLeaf();await a.openFile(t);let s=a.view.canvas;if(!s)return null;let d=1;try{let i=window,n=(o=i.electron)==null?void 0:o.remote,c=n==null?void 0:n.getCurrentWebContents(),m=(c==null?void 0:c.getZoomLevel())||0,h=Math.pow(1.2,m),S=i.devicePixelRatio||1,y=Math.round(S/h*1e5)/1e5,z=Array.from(s.nodes.values()),u=this.calculateBBox(z),A=u.maxX-u.minX,D=u.maxY-u.minY,q=Math.min(2,16284/y/A,16284/y/D),P=Math.min(d,q),w=s.wrapperEl;this.deselectAll(),w.addClass("is-screenshotting"),this.settings.transparentCanvas&&w.addClass("canvas-transparent-export"),s.screenshotting=!0;let R=[];this.settings.transparentCanvas&&(Array.from(document.body.children).forEach(p=>{p!==w&&p instanceof HTMLElement&&(p.classList.add("odox-hidden"),R.push(p))}),document.body.classList.add("odox-capturing")),document.body.appendChild(w);try{let p=5/h;w.setCssStyles({top:`${p}px`,left:`${p}px`,bottom:`${p}px`,right:`${p}px`,width:"auto",height:"auto"});let C=w.getBoundingClientRect(),G=Math.ceil(C.x*h+1),j=Math.ceil(C.y*h+1),L=Math.floor(C.width*h)-2,N=Math.floor(C.height*h)-2;s.zoom=Math.log2(P/h),s.tZoom=s.zoom,s.viewportChanged=!0,s.requestFrame(),await new Promise(v=>setTimeout(v,500)),await new Promise(v=>requestAnimationFrame(v));let I=L/P,M=N/P,O=Math.ceil((u.maxX-u.minX)/I),U=Math.ceil((u.maxY-u.minY)/M),H=u.minX+I/2,_=u.minY+M/2,b=document.createElement("canvas");b.width=Math.ceil(A*P*y),b.height=Math.ceil(D*P*y);let X=b.getContext("2d");if(!X)throw new Error("Failed to get 2d context");let Z=0,ct=O*U;for(let v=0;v<U;v++)for(let $=0;$<O;$++){s.x=s.tx=H+$*I,s.y=s.ty=_+v*M,s.viewportChanged=!0,s.requestFrame(),await new Promise(F=>setTimeout(F,100)),await new Promise(F=>requestAnimationFrame(F));let Q=(await c.capturePage({x:G,y:j,width:L,height:N})).toPNG(),J=new Blob([Q],{type:"image/png"}),W=URL.createObjectURL(J),k=document.createElement("img");await new Promise((F,tt)=>{k.onload=()=>F(),k.onerror=tt,k.src=W}),X.drawImage(k,$*L*y,v*N*y),URL.revokeObjectURL(W),Z++}let Y=await new Promise(v=>b.toBlob(v,"image/png"));if(!Y)throw new Error("Failed to create PNG blob");let K=await Y.arrayBuffer();return new Uint8Array(K)}finally{this.settings.transparentCanvas&&(document.body.classList.remove("odox-capturing"),R.forEach(p=>{p.classList.remove("odox-hidden")})),(r=(l=this.app.workspace.getLeaf().view)==null?void 0:l.contentEl)==null||r.appendChild(w),w.removeClass("is-screenshotting"),w.removeClass("canvas-transparent-export"),w.setCssStyles({top:"",left:"",bottom:"",right:"",width:"",height:""}),s.screenshotting=!1,await new Promise(p=>requestAnimationFrame(p)),s.zoomToFitQueued=!0,s.onResize(),e&&await a.openFile(e)}}catch(i){return console.error("Canvas render failed:",i),null}}calculateBBox(t){let e=1/0,a=1/0,s=-1/0,d=-1/0;for(let o of t){let l=o.x,r=o.y,i=o.width,n=o.height;e=Math.min(e,l),a=Math.min(a,r),s=Math.max(s,l+i),d=Math.max(d,r+n)}return{minX:e,minY:a,maxX:s,maxY:d}}deselectAll(){var e;let t=(e=this.app.workspace.getLeaf().view)==null?void 0:e.canvas;t&&t.deselectAll()}updateCanvasInContent(t,e,a){let{metadataCache:s}=this.app,d=r=>`/${r}`,o=/!\[([^\]]*)\]\(([^)]+)\)/g;t=t.replace(o,(r,i,n)=>{let c=s.getFirstLinkpathDest(n,a.path);if(c&&e.has(c.path)){let m=e.get(c.path);return this.settings.canvasEmbedTemplate.replace("{url}",d(m))}return r});let l=/!\[\[([^\]]+)\]\]/g;return t=t.replace(l,(r,i)=>{let n=i.split("|")[0].trim(),c=s.getFirstLinkpathDest(n,a.path);if(c&&e.has(c.path)){let m=e.get(c.path);return this.settings.canvasEmbedTemplate.replace("{url}",d(m))}return r}),t}};
|