WritingSpace/.obsidian/plugins/local-any-files/main.js

14 lines
28 KiB
JavaScript
Raw Normal View History

2025-01-22 08:00:25 +00:00
/*
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 U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var G=(d,e)=>{for(var t in e)B(d,t,{get:e[t],enumerable:!0})},X=(d,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of q(e))!Z.call(d,i)&&i!==t&&B(d,i,{get:()=>e[i],enumerable:!(s=U(e,i))||s.enumerable});return d};var K=d=>X(B({},"__esModule",{value:!0}),d);var J={};G(J,{default:()=>j});module.exports=K(J);var F=require("obsidian");var w={image:[".png",".jpg",".jpeg",".gif",".bmp",".svg",".webp",".tiff",".ico",".raw",".heic",".heif",".avif",".jfif"],officeFile:[".doc",".docx",".xls",".xlsx",".ppt",".pptx",".pdf",".odt",".ods",".odp",".rtf",".txt",".csv",".epub",".pages",".numbers",".key"],archivePackage:[".zip",".rar",".7z",".tar",".gz",".bz2",".xz",".iso",".tgz",".z",".bzip2",".cab"],music:[".mp3",".wav",".flac",".m4a",".ogg",".aac",".wma",".aiff",".alac",".mid",".midi",".opus",".amr"],video:[".mp4",".avi",".mkv",".mov",".wmv",".flv",".webm",".m4v",".mpg",".mpeg",".3gp",".ogv",".ts",".vob"],code:[".js",".ts",".jsx",".tsx",".html",".css",".scss",".json",".xml",".yaml",".yml",".md",".py",".java",".cpp",".c",".cs",".php",".rb",".go",".rs",".swift"],font:[".ttf",".otf",".woff",".woff2",".eot"],design:[".psd",".ai",".eps",".sketch",".fig",".xd",".blend",".obj",".fbx",".stl",".3ds",".dae"],database:[".sql",".db",".sqlite",".mdb",".accdb",".csv",".tsv"],ebook:[".epub",".mobi",".azw",".azw3",".fb2",".lit",".djvu"],academic:[".bib",".tex",".sty",".cls",".csl",".nb",".mat",".r",".rmd",".ipynb"]},H={tasks:["extract","download","replace"],scope:"currentFile",presetExtensions:["image","officeFile"],customExtensions:[],storePath:"assets/${path}",storeFileName:"${originalName}"};var k=require("obsidian");var u=require("obsidian");var h=class{constructor(e,t,s){this.containerEl=e;this.plugin=t;this.defaultScope=s}display(){let{containerEl:e}=this;e.empty(),new u.Setting(e).setName("Processing").setHeading(),this.addScopeDropdown(),this.addTasksDropdown(),new u.Setting(e).setName("File extensions").setHeading(),this.addPresetExtensions(),this.addCustomExtensions(),new u.Setting(e).setName("Storage").setHeading(),this.addStorePath()}addScopeDropdown(){let e={currentFile:"Current file only",currentFolder:"Current folder",allFiles:"All files in vault"};if(this.defaultScope==="singleItem"){new u.Setting(this.containerEl).setName("Scope").setDesc("Download single item").addDropdown(t=>{t.addOption("singleItem","Single item").setValue("singleItem").onChange(async s=>{this.plugin.settings.scope=s,await this.plugin.saveSettings()})});return}new u.Setting(this.containerEl).setName("Scope").setDesc("Select which files to process").addDropdown(t=>{Object.entries(e).forEach(([s,i])=>{t.addOption(s,i)}),t.setValue((()=>this.plugin.settings.scope==="singleItem"?"currentFile":this.defaultScope||this.plugin.settings.scope)()).onChange(async s=>{this.plugin.settings.scope=s,await this.plugin.saveSettings()})})}addTasksDropdown(){let t=new u.Setting(this.containerEl).setName("Tasks").setDesc("Select which tasks to perform").setClass("tasks-setting").settingEl.createDiv("tasks-container"),s={extract:"Extract links",download:"Download files",replace:"Replace links"},i={};Object.entries(s).forEach(([n,a])=>{new u.Setting(t).setClass("task-item").setName(a).addToggle(o=>{i[n]=o,o.setValue(this.plugin.settings.tasks.includes(n)).onChange(async r=>{if(r)n==="download"?this.plugin.settings.tasks.includes("extract")||(this.plugin.settings.tasks.push("extract"),i.extract.setValue(!0)):n==="replace"&&(this.plugin.settings.tasks.includes("extract")||(this.plugin.settings.tasks.push("extract"),i.extract.setValue(!0)),this.plugin.settings.tasks.includes("download")||(this.plugin.settings.tasks.push("download"),i.download.setValue(!0))),this.plugin.settings.tasks.includes(n)||this.plugin.settings.tasks.push(n);else if(n==="extract"&&(this.plugin.settings.tasks.includes("download")||this.plugin.settings.tasks.includes("replace"))){o.setValue(!0),new u.Notice("Cannot disable Extract links while Download files or Repla
`+t.errors.join(`
`),5e3);return}this.close(),this.onSubmit()}onClose(){let{contentEl:t}=this;t.empty()}};var _=require("obsidian"),L=class extends _.Modal{constructor(t,s,i){super(t);this.currentLogContainer=null;this.documentStats=new Map;this.progress=0;this.logs=[];this.currentTask=null;this.taskDisplayNames={extract:"Extract links",download:"Download files",replace:"Replace links"};this.stats={totalNotes:0,processedNotes:0,totalLinks:0,downloadedFiles:0,failedFiles:0};this.plugin=s,this.processCallback=i,this.titleEl.setText("Local any files > Processing")}onOpen(){let{contentEl:t}=this;t.empty(),this.statsContainer=t.createDiv({cls:"stats-container"}),this.updateStats();let s=t.createDiv({cls:"custom-progress-section"});this.progressBar=s.createDiv({cls:"custom-progress-bar"}),this.progressFill=this.progressBar.createDiv({cls:"custom-progress-fill"}),this.logsContainer=t.createDiv({cls:"logs-container"}),this.updateProgress(0),this.processCallback()}createCopyableText(t,s,i){let n=s.createSpan({cls:`copyable-text ${i||""}`,text:t});return n.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(t),n.addClass("copied"),setTimeout(()=>n.removeClass("copied"),1e3)}catch(a){console.error("Failed to copy text:",a)}}),n}isTaskEnabled(t){return this.plugin.settings.tasks.includes(t)}updateProgress(t){this.progress=t,this.progressFill&&this.progressFill.style.setProperty("--progress-width",`${t}%`)}updateStats(t){if(t&&(this.stats={...this.stats,...t}),this.statsContainer){this.statsContainer.empty();let s=(i,n,a)=>{let o=this.statsContainer.createDiv({cls:"stat-item"});o.createDiv({cls:`stat-value stat-value-${a}`,text:i.toString()}),o.createDiv({cls:"stat-label",text:n})};s(this.stats.processedNotes,"Notes Processed","processed"),s(this.stats.totalNotes,"Total Notes","total"),s(this.stats.totalLinks,"Links Found","found"),s(this.stats.downloadedFiles,"Downloads","downloads"),s(this.stats.failedFiles,"Failed","failed")}}startDocumentLog(t){let s=this.logsContainer.createDiv({cls:"log-document-container"}),i=s.createDiv({cls:"log-document-header"});i.createDiv({cls:"log-document-title",text:t}),i.createDiv({cls:"log-document-stats"}),this.documentStats.set(t,{links:0,success:0,failed:0}),this.updateDocumentStats(t);let n=s.createDiv({cls:"log-document-content"});return i.addEventListener("click",()=>{i.toggleClass("collapsed",!i.hasClass("collapsed")),n.toggleClass("collapsed",i.hasClass("collapsed"))}),this.currentLogContainer=n,n}updateDocumentStats(t,s){let i=this.documentStats.get(t);if(!i)return;let n=`Links: ${i.links} / Success: ${i.success} / Failed: ${i.failed}`;s&&s.setText(n)}addLog(t,s="info",i){if(i&&!this.isTaskEnabled(i))return;this.logs.push(t);let n=this.currentLogContainer||this.logsContainer,a=n.createDiv({cls:`log log-${s}`});if(t.startsWith("Link: ")){let o=t.substring(6);a.createSpan({text:"Link: "}),this.createCopyableText(o,a,"log-url")}else if(t.startsWith("File: ")){let o=t.substring(6);a.createSpan({text:"File: "}),this.createCopyableText(o,a,"log-url")}else if(t.startsWith("SavedPath: ")){let o=t.substring(t.indexOf(": ")+2);a.createSpan({text:"SavedPath: "}),this.createCopyableText(o.replace("\u2713 ",""),a,"log-saved-path")}else a.setText(t);n.scrollTop=n.scrollHeight}updateDocumentProgress(t,s,i,n){let a=this.documentStats.get(t);a&&(a.links=s,a.success=i,a.failed=n,this.updateDocumentStats(t))}addDivider(t=!1){(this.currentLogContainer||this.logsContainer).createDiv({cls:`log-divider${t?" thick":""}`})}onClose(){let{contentEl:t}=this;t.empty()}};var W=require("obsidian");function I(d){let e=0;for(let t=0;t<d.length;t++){let s=d.charCodeAt(t);e=(e<<5)-e+s,e=e&e}return Math.abs(e).toString(16).substring(0,8)}var D=class{constructor(e,t=[]){this.extensions=e.map(s=>s.toLowerCase()),this.allowImages=t.includes("image")}extractFromText(e){let t=[],s=/!\[([^\]]*)\]\(([^)]+)\)/g,i=/\[([^\]]*)\]\(([^)]+)\)/g,n=/(https?:\/\/[^\s<>)"]+)/g,a=new Set,o=l=>l.startsWith("http://")||l.startsWith("https://"),r;if(this.allowImages)for(;(r=s.exec(e))!==null;){let[l,,c]=r;!a.has(c)&&o(c)&&(a.add(c),t.push({
`+e.errors.join(`
`),5e3);return}let t=new L(this.app,this.plugin,async()=>{var s;try{let i=[],n=this.app.workspace.getActiveFile();switch(this.plugin.settings.scope){case"currentFile":i=n?[n]:[];break;case"allFiles":i=this.app.vault.getMarkdownFiles();break;case"currentFolder":if(n){let p=((s=n.parent)==null?void 0:s.path)||"";i=this.app.vault.getMarkdownFiles().filter(g=>{var S;return((S=g.parent)==null?void 0:S.path)===p})}break}let a=0,o=i.length;if(o===0){t.addLog("No documents found in the selected scope.","error");return}t.updateStats({totalNotes:o,processedNotes:0,totalLinks:0,downloadedFiles:0,failedFiles:0});let r=0,l=0,c=0;for(let p of i){t.startDocumentLog(p.path);let g=await this.app.vault.read(p),m=new D(this.plugin.getFinalProcessingExtensions(),this.plugin.settings.presetExtensions).extractFromText(g);if(r+=m.length,t.addLog(`Found ${m.length} links in ${p.path}`,"success","extract"),this.plugin.settings.tasks.length===1&&this.plugin.settings.tasks.includes("extract")){for(let x of m)t.addLog(`Link: ${x.originalLink}`,"info","extract"),t.addDivider();t.updateDocumentProgress(p.path,m.length,m.length,0)}if(this.plugin.settings.tasks.includes("download")){let x=0,z=0,C=new Map;for(let E of m){let b=new P(this.plugin,this.plugin.settings.storePath,O(p.path),this.plugin.settings.storeFileName);t.addDivider(),t.addLog(`File: ${E.originalLink}`,"info","download");let y=await b.downloadFile(E.originalLink,E.fileName,E.isMarkdownImage);y.success?(t.addLog("Status: \u2713 Success","success","download"),t.addLog(`SavedPath: ${y.localPath}`,"success","download"),l++,x++,C.set(E.originalLink,y.localPath)):(t.addLog("Status: \u2717 Failed","error","download"),t.addLog(`Error: ${y.error}`,"error","download"),c++,z++),t.updateDocumentProgress(p.path,m.length,x,z),t.updateStats({totalLinks:r,downloadedFiles:l,failedFiles:c})}if(this.plugin.settings.tasks.includes("replace")&&C.size>0){t.addDivider();let b=new M().replaceInText(g,C);await this.app.fileManager.processFrontMatter(p,y=>{}),await this.app.vault.modify(p,b),t.addLog(`Updated links in ${p.path}`,"success","replace")}}a++,t.updateProgress(a/o*100),t.updateStats({processedNotes:a})}t.addDivider(),t.addLog("Processing current document complete!","success")}catch(i){t.addLog(`Error: ${i.message}`,"error")}});t.open()}async handleSingleDownload(e){this.plugin.settings.scope="singleItem",await this.plugin.saveSettings();let t=h.validateSettings(this.plugin.settings);if(!t.isValid){new V.Notice(`Please fix the following issues:
`+t.errors.join(`
`),5e3);return}let s=new L(this.app,this.plugin,async()=>{s.startDocumentLog(e);let i=new P(this.plugin,this.plugin.settings.storePath,O(e),this.plugin.settings.storeFileName);try{let o=new D(this.plugin.getFinalProcessingExtensions(),this.plugin.settings.presetExtensions).extractFromText(e).length;if(o===0){s.addLog("Status: \u2717 Failed","error"),s.addLog("Error: No valid links found with target extensions","error"),s.updateDocumentProgress(e,0,0,0),s.updateStats({totalNotes:1,processedNotes:1,totalLinks:0,downloadedFiles:0,failedFiles:0});return}let r=await i.downloadFile(e,e.split("/").pop()||"untitled");r.success?(s.addLog("Status: \u2713 Success","success"),s.addLog(`SavedPath: \u2713 ${r.localPath}`,"success"),s.updateDocumentProgress(e,o,1,0),s.updateStats({totalNotes:1,processedNotes:1,totalLinks:o,downloadedFiles:1,failedFiles:0})):(s.addLog("Status: \u2717 Failed","error"),s.addLog(`Error: ${r.error}`,"error"),s.updateDocumentProgress(e,o,0,1),s.updateStats({totalNotes:1,processedNotes:1,totalLinks:o,downloadedFiles:0,failedFiles:1}))}catch(n){s.addLog(`Error downloading attachment: ${n.message}`,"error"),s.updateStats({totalNotes:1,processedNotes:1,totalLinks:0,downloadedFiles:0,failedFiles:1})}});s.open()}};var j=class extends F.Plugin{async onload(){await this.loadSettings(),this.downloadHandler=new R(this,this.app),this.addCommand({id:"local-anything",name:"Download attachments from links",callback:()=>this.downloadHandler.handleDownloadWithOptions()}),this.addCommand({id:"local-anything-use-previous-options",name:"Download attachments from links (use previous options)",callback:()=>this.downloadHandler.handleDownload()}),this.registerEvent(this.app.workspace.on("editor-menu",(t,s,i)=>{if(i instanceof F.MarkdownView){let n=s.getCursor(),a=s.getLine(n.line),o=a.match(/\[([^\]]*)\]\(([^)]+)\)/),r=a.match(/!\[([^\]]*)\]\(([^)]+)\)/);if(o||r){let l=o||r;if(l){let c=l[2],p="";try{let b=(new URL(c).pathname.split(/[?#]/)[0].split("/").pop()||"").match(/\.([^.]+)$/);p=b?"."+b[1].toLowerCase():""}catch(x){p="."+(c.split(".").pop()||"").toLowerCase().split(/[?#]/)[0]}let g=w.image.includes(p),S=this.getFinalProcessingExtensions(),m=S&&S.includes(p);console.debug("URL:",c,"Extension:",p,"Is Image:",g,"Is Preset:",m),(g||m)&&t.addItem(x=>{x.setTitle("Download to local").setIcon("download").onClick(async()=>{this.settings&&new T(this.app,this,c,async()=>{await this.downloadHandler.handleSingleDownload(c)}).open()})})}}}})),this.registerEvent(this.app.workspace.on("file-menu",(t,s)=>{s instanceof F.TFile&&s.extension==="md"&&t.addItem(i=>{i.setTitle("Download files (current note)").setIcon("download").onClick(()=>this.downloadHandler.handleDownloadWithOptions("currentFile"))})})),this.addSettingTab(new N(this.app,this))}async loadSettings(){let t=await this.loadData();this.settings={...H,...t,scope:(t==null?void 0:t.scope)||H.scope||"currentFile"}}async saveSettings(){await this.saveData(this.settings)}getFinalProcessingExtensions(){let t=this.settings.presetExtensions.flatMap(s=>w[s]);return[...new Set([...t,...this.settings.customExtensions])]}};
/* nosourcemap */