ethanolivertroy_obsidian-ma.../main.js

23 lines
39 KiB
JavaScript
Raw Normal View History

/*
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 xt=Object.create;var B=Object.defineProperty;var Pt=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Ct=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var Dt=(c,n)=>{for(var t in n)B(c,t,{get:n[t],enumerable:!0})},at=(c,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of Et(n))!Tt.call(c,s)&&s!==t&&B(c,s,{get:()=>n[s],enumerable:!(e=Pt(n,s))||e.enumerable});return c};var k=(c,n,t)=>(t=c!=null?xt(Ct(c)):{},at(n||!c||!c.__esModule?B(t,"default",{value:c,enumerable:!0}):t,c)),St=c=>at(B({},"__esModule",{value:!0}),c);var At={};Dt(At,{default:()=>Z});module.exports=St(At);var v=require("obsidian"),b=k(require("path")),R=k(require("fs"));var K={pythonPath:"python",enablePlugins:!1,pluginArgs:[],docintelEndpoint:"",outputPath:"",imageExtractionEnabled:!1,imageSubfolderTemplate:"{filename}-images",enableBatchProgress:!0,enableContextMenu:!0,enableRecursiveConversion:!1,outputFilenameTemplate:"{filename}",enableDragDrop:!0,enableAutoFrontmatter:!1,autoTags:"",conversionHistory:[]};var M=k(require("fs"));var Q=require("child_process"),lt=k(require("path"));function _(c,n,t,e){return new Promise((s,a)=>{let o=(0,Q.spawn)(c,[n,...t],{shell:!1,env:{...process.env,PYTHONUTF8:"1",...e},stdio:["ignore","pipe","pipe"]}),l="",r="";o.stdout.on("data",i=>{l+=i.toString()}),o.stderr.on("data",i=>{r+=i.toString()}),o.on("error",i=>{a(i)}),o.on("close",i=>{s({stdout:l.trim(),stderr:r.trim(),exitCode:i??1})})})}function L(c,n){return lt.join(n,"python",c)}async function tt(c,n){let t={pythonInstalled:!1,pythonVersion:null,markitdownInstalled:!1,markitdownVersion:null},e=[],s=c.trim();if(!s)return e.push({path:c||"(empty)",error:"Path is empty or whitespace-only"}),{status:t,resolvedPythonPath:c,triedPaths:e};let a=L("check_install.py",n),o=[s];if(s==="python"||s==="python3")if(process.platform==="win32"){s==="python"&&o.push("python3");let u=process.env.LOCALAPPDATA||"";if(u){for(let d of["313","312","311","310","39"])o.push(`${u}\\Programs\\Python\\Python${d}\\python.exe`);o.push(`${u}\\Microsoft\\WindowsApps\\python3.exe`)}}else{s==="python"?o.push("python3"):o.push("python"),o.push("/opt/homebrew/bin/python3"),o.push("/usr/local/bin/python3");for(let u of["3.13","3.12","3.11","3.10","3.9"])o.push(`/Library/Frameworks/Python.framework/Versions/${u}/bin/python3`);o.push("/usr/bin/python3")}let l=new Set,r=o.filter(p=>l.has(p)?!1:(l.add(p),!0)),i=null;for(let p of r)try{let u=await _(p,a,["--check","all"]);if(u.exitCode===0&&u.stdout){let d=JSON.parse(u.stdout),f={pythonInstalled:!0,pythonVersion:d.python_version??null,markitdownInstalled:!1,markitdownVersion:null};if(d.packages?.markitdown&&(f.markitdownInstalled=d.packages.markitdown.installed,f.markitdownVersion=d.packages.markitdown.version??null),f.markitdownInstalled)return e.push({path:p,error:""}),{status:f,resolvedPythonPath:p,triedPaths:e};e.push({path:p,error:"Python found but markitdown not installed"}),i||(i={status:f,resolvedPythonPath:p})}else{let d=u.stderr||`exit code ${u.exitCode}`;e.push({path:p,error:`Check script failed: ${d}`})}}catch(u){let d=u instanceof Error?u.message:String(u);e.push({path:p,error:d}),console.debug(`markitdown: ${p} failed:`,u);continue}return i?{...i,triedPaths:e}:{status:t,resolvedPythonPath:c,triedPaths:e}}async function ct(c,n,t,e){return c.trim()?new Promise((s,a)=>{let o=L("install_package.py",n),l=(0,Q.spawn)(c,[o,"--package",t],{shell:!1,env:{...process.env,PYTHONUTF8:"1"},stdio:["ignore","pipe","pipe"]}),r="";l.stdout.on("data",i=>{let p=i.toString().split(`
`);for(let u of p)u.trim()&&(r=u.trim(),e?.(u.trim()))}),l.stderr.on("data",i=>{let p=i.toString().split(`
`);for(let u of p)u.trim()&&e?.(u.trim())}),l.on("error",i=>{a(i)}),l.on("close",i=>{if(i===0)try{let p=JSON.parse(r);s(p.success===!0)}catch{s(!0)}else s(!1)})}):!1}var V=["pdf","docx","pptx","xlsx","xls","html","htm","txt","csv","json","xml","jpg","jpeg","png","gif","wav","mp3","zip","epub"],pt=V.map(c=>`.${c}`).join(","),ut=[{name:"PDF files",extensions:".pdf"},{name:"Word documents",extensions:".docx"},{name:"PowerPoint presentations",extensions:".pptx"},{name:"Excel spreadsheets",extensions:".xlsx,.xls"},{name:"Web pages",extensions:".html,.htm"},{name:"Text files",extensions:".txt"},{name:"Data files",extensions:".csv,.json,.xml"},{name:"Images",extensions:".jpg,.jpeg,.png,.gif"},{name:"Audio files",extensions:".wav,.mp3"},{name:"Archives & eBooks",extensions:".zip,.epub"}];function et(c){let n=c.toLowerCase().replace(/^\./,"");return V.includes(n)}var ht=k(require("path"));function dt(c){return/[:#\[\]{}&*!|>'"`,@%\\]/.test(c)||c.trim()!==c?`"${c.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:c}function Ft(c,n){let t={};if(n.enableAutoFrontmatter){let e=ht.basename(c),s=new Date,a=s.getFullYear(),o=String(s.getMonth()+1).padStart(2,"0"),l=String(s.getDate()).padStart(2,"0");t.source=e,t.converted=`${a}-${o}-${l}`,t.converter="markitdown"}if(n.autoTags.trim()){let e=n.autoTags.split(",").map(s=>s.trim()).filter(s=>s.length>0);e.length>0&&(t.tags=e)}return t}function gt(c){let n=[];for(let[t,e]of Object.entries(c))if(Array.isArray(e)){n.push(`${t}:`);for(let s of e)n.push(` - ${dt(s)}`)}else n.push(`${t}: ${dt(e)}`);return n.join(`
`)}function Mt(c){if(!c.startsWith("---"))return null;let n=c.indexOf(`
---`,3);if(n===-1)return null;let t=c.substring(4,n).trim(),e=n+4,s=c.substring(e);return{yaml:t,body:s}}function $t(c,n){let t=new Set;for(let a of c.split(`
`)){let o=a.match(/^(\w[\w-]*)\s*:/);o&&t.add(o[1])}let e={};for(let[a,o]of Object.entries(n))t.has(a)||(e[a]=o);if(Object.keys(e).length===0)return c;let s=gt(e);return c+`
`+s}function mt(c,n,t){let e=Ft(n,t);if(Object.keys(e).length===0)return c;let s=Mt(c);return s?`---
${$t(s.yaml,e)}
---${s.body}`:`---
${gt(e)}
---
${c}`}var $=class{constructor(n,t){this.pythonPath=n;this.pluginDir=t}getSupportedExtensions(){return V.map(n=>`.${n}`)}canConvert(n){let t=n.startsWith(".")?n.toLowerCase():`.${n.toLowerCase()}`;return this.getSupportedExtensions().includes(t)}async convertUrl(n,t,e){let s=Date.now(),a=L("markitdown_wrapper.py",this.pluginDir),o=["--url",n,"--output",t];e?.enablePlugins&&o.push("--enable-plugins"),e?.pluginArgs&&Object.keys(e.pluginArgs).length>0&&o.push("--plugin-args",JSON.stringify(e.pluginArgs)),e?.docintelEndpoint&&o.push("--docintel-endpoint",e.docintelEndpoint);try{let l=await _(this.pythonPath,a,o);if(l.exitCode!==0){let r="Unknown error";try{r=JSON.parse(l.stderr).error||"Unknown error"}catch{r=l.stderr||"Unknown error"}return r=r.replace(/(?:\/[\w.-]+)+\//g,"\u2026/"),{success:!1,error:`Conversion failed: ${r}`,processingTime:Date.now()-s}}return M.existsSync(t)?{success:!0,outputPath:t,processingTime:Date.now()-s}:{success:!1,error:"Output file was not created",processingTime:Date.now()-s}}catch(l){return{success:!1,error:`Conversion error: ${(l instanceof Error?l.message:String(l)).replace(/(?:\/[\w.-]+)+\//g,"\u2026/")}`,processingTime:Date.now()-s}}}async convert(n,t,e){let s=Date.now(),a=L("markitdown_wrapper.py",this.pluginDir),o=["--input",n,"--output",t];e?.enablePlugins&&o.push("--enable-plugins"),e?.pluginArgs&&Object.keys(e.pluginArgs).length>0&&o.push("--plugin-args",JSON.stringify(e.pluginArgs)),e?.docintelEndpoint&&o.push("--docintel-endpoint",e.docintelEndpoint),e?.extractImages&&e?.imageDir&&o.push("--extract-images","--image-dir",e.imageDir);try{let l=await _(this.pythonPath,a,o);if(l.exitCode!==0){let i="Unknown error";try{i=JSON.parse(l.stderr).error||"Unknown error"}catch{i=l.stderr||"Unknown error"}return i=i.replace(/(?:\/[\w.-]+)+\//g,"\u2026/"),{success:!1,error:`Conversion failed: ${i}`,processingTime:Date.now()-s}}if(!M.existsSync(t))return{success:!1,error:"Output file was not created",processingTime:Date.now()-s};if(e?.postProcess)try{let i=M.readFileSync(t,"utf-8"),p=mt(i,e.postProcess.inputPath,e.postProcess.settings);p!==i&&M.writeFileSync(t,p,"utf-8")}catch(i){console.warn("markitdown: post-conversion hook error:",i)}let r=0;try{r=JSON.parse(l.stdout).images_extracted??0}catch{}return{success:!0,outputPath:t,processingTime:Date.now()-s,imagesExtracted:r}}catch(l){return{success:!1,error:`Conversion error: ${(l instanceof Error?l.message:String(l)).replace(/(?:\/[\w.-]+)+\//g,"\u2026/")}`,processingTime:Date.now()-s}}}};var ft=require("obsidian"),g=k(require("path")),H=k(require("fs"));function x(c){return c.vault.adapter instanceof ft.FileSystemAdapter?c.vault.adapter.getBasePath():null}function E(c,n){let t;n?t=g.resolve(c,n):t=g.join(c,"markitdown-output");let e=g.resolve(c);return!t.startsWith(e+g.sep)&&t!==e&&(t=g.join(c,"markitdown-output")),H.existsSync(t)||H.mkdirSync(t,{recursive:!0}),t}function I(c,n){let t=g.basename(n,g.extname(n)),e=g.extname(n).replace(/^\./,""),s=new Date,a=i=>String(i).padStart(2,"0"),o=`${s.getFullYear()}-${a(s.getMonth()+1)}-${a(s.getDate())}`,l=`${o}_${a(s.getHours())}${a(s.getMinutes())}${a(s.getSeconds())}`,r=c.replace(/\{filename\}/g,t).replace(/\{ext\}/g,e).replace(/\{date\}/g,o).replace(/\{datetime\}/g,l);return r=r.replace(/[/\\:*?"<>|]/g,""),r.trim()||(r=t),r}function vt(c,n){let t=g.dirname(c),e=g.basename(c,".md"),a=n.replace(/[/\\]/g,"-").replace("{filename}",e);return g.join(t,a)}function nt(c,n){return g.relative(n,c).replace(/\\/g,"/")}var It=100;function st(c,n){return c.conversionHistory=[n,...c.conversionHistory].slice(0,It),c.conversionHistory}var h=require("obsidian");var j=class{constructor(n,t,e){this.containerEl=n;this.entries=t;this.onChange=e}render(){this.containerEl.empty();for(let t=0;t<this.entries.length;t++){let e=this.containerEl.createDiv("markitdown-plugin-arg-row"),s=e.createEl("input",{attr:{type:"text",placeholder:"Argument name"},cls:"markitdown-plugin-arg-key"});s.value=this.entries[t].key,s.addEventListener("input",()=>{this.entries[t].key=s.value,this.onChange(this.entries)});let a=e.createEl("input",{att
`),s=e.length>it,a=s?e.slice(0,it).join(`
`):this.content;s&&n.createEl("div",{text:`Showing first ${it} of ${e.length} lines`,cls:"markitdown-preview-truncation-note"}),n.createDiv("markitdown-preview-content").createEl("pre",{text:a});let l=n.createDiv("markitdown-button-container"),r=l.createEl("button",{text:"Cancel"});r.addEventListener("click",async()=>{await this.onCancel(),this.close()});let i=l.createEl("button",{text:"Save",cls:"mod-cta"});i.addEventListener("click",async()=>{i.disabled=!0,i.setText("Saving..."),r.disabled=!0;try{await this.onSave()}finally{this.close()}})}onClose(){this.contentEl.empty()}};var W=class extends P.Modal{constructor(n,t){super(n),this.plugin=t}onOpen(){let{contentEl:n}=this;n.addClass("markitdown-modal"),n.createEl("h2",{text:"Convert file to Markdown"}),n.createEl("p",{text:"Select a file to convert:"});let e=n.createDiv("markitdown-file-input-container").createEl("input",{attr:{type:"file",accept:pt}}),a=n.createDiv("markitdown-button-container").createEl("button",{text:"Convert",cls:"mod-cta"});a.addEventListener("click",async()=>{if(!e.files||e.files.length===0){new P.Notice("Please select a file first");return}let o=e.files[0];a.disabled=!0,a.setText("Converting...");try{let l=x(this.app);if(!l){new P.Notice("Could not determine vault path. This plugin requires a local vault."),a.disabled=!1,a.setText("Convert");return}let r=E(l,this.plugin.settings.outputPath),i=I(this.plugin.settings.outputFilenameTemplate||"{filename}",o.name),p=rt.join(r,`${i}.md`),u=o.name.replace(/[^a-zA-Z0-9._-]/g,"_"),d=rt.join(r,`tmp_${Date.now()}_${u}`),f=await o.arrayBuffer();await N.promises.writeFile(d,Buffer.from(f));try{let w=await this.plugin.convertExternalFile(d,p);if(w.success){let y;try{y=await N.promises.readFile(p,"utf-8")}catch{new P.Notice("Conversion succeeded but could not read output file"),a.disabled=!1,a.setText("Convert");return}this.close(),new A(this.app,{content:y,outputPath:p,processingTime:w.processingTime??0,onSave:async()=>{let m=w.imagesExtracted?`Converted successfully (${w.imagesExtracted} images extracted)`:"Converted successfully";new P.Notice(m),await this.plugin.openConvertedFile(p,l)},onCancel:async()=>{await N.promises.unlink(p).catch(()=>{}),new P.Notice("Conversion discarded")}}).open()}else new P.Notice(`Conversion failed: ${w.error}`),a.disabled=!1,a.setText("Convert")}finally{await N.promises.unlink(d).catch(()=>{})}}catch(l){let r=l instanceof Error?l.message:String(l);new P.Notice(`Error: ${r}`),a.disabled=!1,a.setText("Convert")}})}onClose(){this.contentEl.empty()}};var C=require("obsidian"),S=k(require("path")),O=k(require("fs"));var yt=require("obsidian"),Y=class extends yt.Modal{constructor(n,t){super(n),this.totalFiles=t}onOpen(){let{contentEl:n}=this;n.addClass("markitdown-modal"),n.createEl("h2",{text:"Converting files"});let t=n.createDiv("markitdown-progress-bar");this.progressFill=t.createDiv("markitdown-progress-fill"),this.progressFill.style.width="0%",this.statusEl=n.createDiv("markitdown-progress-status"),this.statusEl.setText(`0 / ${this.totalFiles} files converted`),this.currentFileEl=n.createDiv("markitdown-progress-current"),this.currentFileEl.setText("Preparing...")}updateProgress(n,t,e,s){let a=this.totalFiles>0?Math.round(n/this.totalFiles*100):0;this.progressFill.style.width=`${a}%`,this.statusEl.setText(`${n} / ${this.totalFiles} files converted (${e} successful, ${s} failed)`),this.currentFileEl.setText(`Converting: ${t}`)}complete(n,t){this.progressFill.style.width="100%",this.statusEl.setText(`Conversion complete: ${n} successful, ${t} failed`),this.currentFileEl.setText("Done!"),setTimeout(()=>this.close(),2e3)}onClose(){this.contentEl.empty()}};var z=class extends C.Modal{constructor(n,t){super(n),this.plugin=t}onOpen(){let{contentEl:n}=this;n.addClass("markitdown-modal"),n.createEl("h2",{text:"Convert folder contents to Markdown"}),n.createEl("p",{text:"Select a folder to process:"});let e=n.createDiv("markitdown-file-input-container").createEl("input",{attr:{type:"file",webkitdirectory:"",directory:""}}),s=this.plugin.settings.enableRecursiveConversion,o=n.createDiv("
`+l.join(`
`)),new C.Notice(r)}}onClose(){this.contentEl.empty()}};var T=require("obsidian"),bt=k(require("path"));var J=class extends T.Modal{constructor(n,t){super(n),this.plugin=t}onOpen(){let{contentEl:n}=this;n.addClass("markitdown-modal"),n.createEl("h2",{text:"Convert URL to Markdown"}),n.createEl("p",{text:"Enter a URL to convert (e.g. YouTube):"});let e=n.createDiv("markitdown-url-input-container").createEl("input",{attr:{type:"url",placeholder:"https://www.youtube.com/watch?v=..."}});e.style.width="100%";let a=n.createDiv("markitdown-button-container").createEl("button",{text:"Convert",cls:"mod-cta"});a.addEventListener("click",async()=>{let o=e.value.trim();if(!o){new T.Notice("Please enter a URL");return}if(!o.startsWith("http://")&&!o.startsWith("https://")){new T.Notice("URL must start with http:// or https://");return}a.disabled=!0,a.setText("Converting...");try{let l=x(this.app);if(!l){new T.Notice("Could not determine vault path. This plugin requires a local vault."),a.disabled=!1,a.setText("Convert");return}let r=E(l,this.plugin.settings.outputPath),i=this.deriveFilename(o),p=bt.join(r,`${i}.md`),u=this.plugin.buildConversionOptions(p),d=await this.plugin.converter.convertUrl(o,p,u);d.success?(new T.Notice("URL converted successfully"),this.close(),await this.plugin.openConvertedFile(p,l)):(new T.Notice(`Conversion failed: ${d.error}`),a.disabled=!1,a.setText("Convert"))}catch(l){let r=l instanceof Error?l.message:String(l);new T.Notice(`Error: ${r}`),a.disabled=!1,a.setText("Convert")}})}deriveFilename(n){try{let t=new URL(n);if(t.hostname==="www.youtube.com"||t.hostname==="youtube.com"||t.hostname==="m.youtube.com"){let s=t.searchParams.get("v");if(s)return`youtube-${s}`}if(t.hostname==="youtu.be"){let s=t.pathname.slice(1);if(s)return`youtube-${s}`}return`${t.hostname}${t.pathname}`.replace(/[^a-zA-Z0-9._-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"url-conversion"}catch{return`url-${Date.now()}`}}onClose(){this.contentEl.empty()}};var G=require("obsidian"),q=class extends G.Modal{constructor(n,t){super(n),this.plugin=t}onOpen(){let{contentEl:n}=this;n.addClass("markitdown-modal"),n.createEl("h2",{text:"Conversion history"});let t=this.plugin.settings.conversionHistory;if(t.length===0){n.createEl("p",{text:"No conversions have been recorded yet.",cls:"markitdown-history-empty"});return}let e=n.createDiv("markitdown-history-list");for(let o of t)this.renderEntry(e,o);n.createDiv("markitdown-button-container").createEl("button",{text:"Clear history",cls:"markitdown-history-clear-btn"}).addEventListener("click",async()=>{this.plugin.settings.conversionHistory=[],await this.plugin.saveSettings(),new G.Notice("Conversion history cleared"),this.close()})}renderEntry(n,t){let e=n.createDiv("markitdown-history-entry"),s=e.createDiv("markitdown-history-entry-header"),a=new Date(t.timestamp);s.createSpan({text:a.toLocaleString(),cls:"markitdown-history-timestamp"});let o=t.success?"markitdown-history-badge-success":"markitdown-history-badge-fail";s.createSpan({text:t.success?"Success":"Failed",cls:`markitdown-history-badge ${o}`});let l=t.inputFile.split("/").pop()?.split("\\").pop()??t.inputFile;e.createDiv({text:l,cls:"markitdown-history-filename"});let r=[];t.processingTimeMs!==void 0&&r.push(`${t.processingTimeMs}ms`),t.imagesExtracted!==void 0&&t.imagesExtracted>0&&r.push(`${t.imagesExtracted} image${t.imagesExtracted!==1?"s":""} extracted`),r.length>0&&e.createDiv({text:r.join(" \xB7 "),cls:"markitdown-history-details"}),!t.success&&t.error&&e.createDiv({text:t.error,cls:"markitdown-history-error"})}onClose(){this.contentEl.empty()}};var X=require("obsidian"),F=class extends X.Modal{constructor(n,t){super(n),this.plugin=t}onOpen(){let{contentEl:n}=this;if(n.addClass("markitdown-modal"),n.createEl("h2",{text:"Markitdown setup"}),!this.plugin.dependencyStatus.pythonInstalled){this.showPythonNotFound(n);return}if(this.plugin.dependencyStatus.markitdownInstalled){this.showAlreadyInstalled(n);return}this.showInstallPrompt(n)}showPythonNotFound(n){n.createEl("p",{text:"Python is not installed or not found at the c