Auto organize notes

This commit is contained in:
2026-06-22 14:57:57 -04:00
parent 12dc012dce
commit 1f689230b5
84 changed files with 156 additions and 123 deletions
+2 -1
View File
@@ -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
View File
@@ -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"
]
}