Auto organize notes
This commit is contained in:
+2
-1
@@ -2,5 +2,6 @@
|
||||
"obsidian-note-autocreator",
|
||||
"custom-font-loader",
|
||||
"calendar",
|
||||
"code-styler"
|
||||
"code-styler",
|
||||
"frontmatter-folder-organizer"
|
||||
]
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"frontmatterHierarchy": "character, category"
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/*
|
||||
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 d=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var w=(i,t)=>{for(var e in t)d(i,e,{get:t[e],enumerable:!0})},z=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of p(t))!y.call(i,r)&&r!==e&&d(i,r,{get:()=>t[r],enumerable:!(n=F(t,r))||n.enumerable});return i};var S=i=>z(d({},"__esModule",{value:!0}),i);var b={};w(b,{default:()=>m});module.exports=S(b);var g=require("obsidian");var l=require("obsidian"),f={frontmatterHierarchy:"Category, Faction"},h=class extends l.PluginSettingTab{constructor(t,e){super(t,e),this.plugin=e}display(){let{containerEl:t}=this;t.empty(),t.createEl("h2",{text:"Frontmatter Folder Organizer"}),new l.Setting(t).setName("Frontmatter hierarchy").setDesc("Enter frontmatter keys in order. Files will be organized into folders based on these values.").addTextArea(e=>e.setPlaceholder("category").setValue(this.plugin.settings.frontmatterHierarchy).onChange(async n=>{this.plugin.settings.frontmatterHierarchy=n,await this.plugin.saveSettings()})),new l.Setting(t).setName("Organize files now").setDesc("Create folders and move markdown files according to the configured frontmatter hierarchy.").addButton(e=>e.setButtonText("Organize now").onClick(async()=>{await this.plugin.organizeFilesByFrontmatter()}))}};var m=class extends g.Plugin{async onload(){await this.loadSettings(),this.addCommand({id:"organize-frontmatter-folders",name:"Organize markdown by frontmatter hierarchy",callback:async()=>{await this.organizeFilesByFrontmatter()}}),this.addSettingTab(new h(this.app,this))}async organizeFilesByFrontmatter(){let t=this.getHierarchyKeys();if(!t.length){new g.Notice("Set a frontmatter hierarchy in plugin settings before organizing files.");return}let e=this.app.vault.getFiles().filter(r=>r.extension==="md"),n=0;for(let r of e){let a=this.getFolderSegmentsForFile(r,t);if(!a||!a.length)continue;let s=a.join("/");if(`${s}/${r.name}`===r.path)continue;await this.ensureFolderExists(s);let c=await this.getAvailableTargetPath(s,r.name);await this.app.vault.rename(r,c),n+=1}new g.Notice(`Organized ${n} markdown file${n===1?"":"s"} by frontmatter folder hierarchy.`)}getHierarchyKeys(){return this.settings.frontmatterHierarchy.split(/[,\r\n]+/).map(t=>t.trim()).filter(Boolean)}getFolderSegmentsForFile(t,e){let n=this.app.metadataCache.getFileCache(t);if(!n?.frontmatter)return null;let r=[];for(let a of e){let s=this.getFrontmatterValueByKey(n.frontmatter,a),o=this.normalizeFrontmatterValue(s);if(o===null)break;r.push(this.sanitizeFolderName(o))}return r.length?r:null}getFrontmatterValueByKey(t,e){let n=e.trim().toLowerCase();for(let[r,a]of Object.entries(t))if(r.trim().toLowerCase()===n)return a}normalizeFrontmatterValue(t){if(t==null||typeof t=="object")return null;let e=String(t).trim();return e.length?e:null}sanitizeFolderName(t){return t.replace(/[<>:"/\\|?*]/g,"-").trim()}async ensureFolderExists(t){let e=t.replace(/\\/g,"/").split("/").filter(Boolean),n="";for(let r of e)n=n?`${n}/${r}`:r,this.app.vault.getAbstractFileByPath(n)||await this.app.vault.createFolder(n)}async getAvailableTargetPath(t,e){let n=t.replace(/\\/g,"/"),r=`${n}/${e}`;if(!this.app.vault.getAbstractFileByPath(r))return r;let a=e.lastIndexOf("."),s=a>=0?e.slice(0,a):e,o=a>=0?e.slice(a):"",c=1;for(;;){let u=`${n}/${s}-${c}${o}`;if(!this.app.vault.getAbstractFileByPath(u))return u;c+=1}}async loadSettings(){this.settings=Object.assign({},f,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}};
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "frontmatter-folder-organizer",
|
||||
"name": "Frontmatter Folder Organizer",
|
||||
"version": "1.0.0",
|
||||
"minAppVersion": "1.0.0",
|
||||
"description": "Organize markdown files into folders based on frontmatter hierarchy.",
|
||||
"author": "Obsidian",
|
||||
"authorUrl": "https://obsidian.md",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
|
||||
This CSS file will be included with your plugin, and
|
||||
available in the app when your plugin is enabled.
|
||||
|
||||
If your plugin does not need CSS, delete this file.
|
||||
|
||||
*/
|
||||
+42
-37
@@ -13,12 +13,12 @@
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Xavian/Omnistrike.md",
|
||||
"file": "Spells - 1. 2 - Dawnflare.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Omnistrike"
|
||||
"title": "Spells - 1. 2 - Dawnflare"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -192,52 +192,57 @@
|
||||
},
|
||||
"active": "cf07e32fae8559d4",
|
||||
"lastOpenFiles": [
|
||||
"Vigour/Avatar of Light.md",
|
||||
"Xavian/_Base.base",
|
||||
"Vigour/Avatar of Light Icon.png",
|
||||
"Spells - 4. Q - Dawnbreaker Orb.md",
|
||||
"Spells - 6. E - Greater Heal.md",
|
||||
"Xavian/Sky Crash.md",
|
||||
"Xavian/Solar Shield.md",
|
||||
"Xavian/Omega Reprieval.md",
|
||||
"Spells - 7. Shift+R - Luminous Barrier.md",
|
||||
"Spells - 8. Shift+T - Remove Magic.md",
|
||||
"Spells - Shift+Space - Avatar of Light.md",
|
||||
"Spells - 9. 3 - Rune of Renewal.md",
|
||||
"Xavian/Buff/Swift Reprival.md",
|
||||
"_Keyboard.canvas",
|
||||
"_Rime.canvas",
|
||||
"_Keyboard 1.canvas",
|
||||
"Xavian/Skill/Brilliant Flare.md",
|
||||
"Xavian/Character/Xavian.md",
|
||||
"Xavian/Skill/Brilliant Flash.md",
|
||||
"Xavian/Skill/Aura of Solace.md",
|
||||
"Xavian/Skill/Blinding Slash.md",
|
||||
"Vigour/Avatar of Light.md",
|
||||
"Images/Pasted image 20260605123320.png",
|
||||
"Xavian/Omnislash.md",
|
||||
"Xavian/_Keyboard 2.canvas",
|
||||
"Xavian/Taunt.md",
|
||||
"Xavian/Sun Struck.md",
|
||||
"Xavian/Xavian.md",
|
||||
"Xavian/Brilliant Flare.md",
|
||||
"Xavian/Brilliant Flash.md",
|
||||
"Xavian/Swift Reprival.md",
|
||||
"Xavian/Shinning Halo.md",
|
||||
"Xavian/Blind.md",
|
||||
"Xavian/Ruptured Dawn.md",
|
||||
"Xavian/Aura of Solace.md",
|
||||
"Xavian/Decree of the Sun.md",
|
||||
"Xavian/Interupt.md",
|
||||
"Xavian/Solar Blades.md",
|
||||
"Xavian/Blinding Slash.md",
|
||||
"Xavian/Omnistrike.md",
|
||||
"Xavian/Sun Strike.md",
|
||||
"Xavian/_Base.base",
|
||||
"Xavian/Skill/Decree of the Sun.md",
|
||||
"_Vigour.canvas",
|
||||
"Pasted image 20260605132922.png",
|
||||
"Q.md",
|
||||
"Keys/Shift + 1.md",
|
||||
"Shift.md",
|
||||
"Xavian/Skill/Solar Blades.md",
|
||||
"Rime/Brain Freeze.md",
|
||||
"Keys/C.md",
|
||||
"Images/Pasted image 20260223234556.png",
|
||||
"Images/Pasted image 20260223133526.png",
|
||||
"Rime/Skill",
|
||||
"Xavian/Debuff",
|
||||
"Xavian/Skill",
|
||||
"Xavian/Buff",
|
||||
"Xavian/Character",
|
||||
"Vigour/Throw Book.md",
|
||||
"Vigour/Throw Book.png",
|
||||
"Vigour/Throw Book Icon.png",
|
||||
"Vigour/Avatar of Light Icon.png",
|
||||
"Space.md",
|
||||
"Spells.md",
|
||||
"Shift.md",
|
||||
"Spells - 1. 2 - Dawnflare.md",
|
||||
"Hotkeys.md",
|
||||
"Xavian/Debuff/Blind.md",
|
||||
"Keys/Mouse 1.md",
|
||||
"Images/Pasted image 20260224121329.png",
|
||||
"Images/Pasted image 20260605113647.png",
|
||||
"Images/Pasted image 20260605112156.png",
|
||||
"Frost Bolt Icon.png",
|
||||
"Keys",
|
||||
"Images/Pasted image 20260605125121.png",
|
||||
"Images/Pasted image 20260605125057.png",
|
||||
"Images/Pasted image 20260605124858.png",
|
||||
"_.base",
|
||||
"_.canvas",
|
||||
"_Keyboard.canvas",
|
||||
"Xavian",
|
||||
"_Keyboard 1.canvas",
|
||||
"_Rime.canvas",
|
||||
"_Vigour.canvas",
|
||||
"Vigour",
|
||||
"Rime"
|
||||
"Vigour"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user