Obsidian์์ ๋ ธํธ๋ค์ ๋ชจ์์ ๋ณผํธ(Vault)๋ผ๊ณ ํฉ๋๋ค. ๋ณผํธ๋ ํ๋์ ํด๋์ ๊ทธ ํ์ ํด๋๋ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ ๋ค๋ฅธ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ฒ๋ผ ํ์ผ ์์คํ ์ ์ ๊ทผํ ์ ์์ง๋ง, Vault ๋ชจ๋์ ๋ณผํธ ๋ด์ ํ์ผ๊ณผ ํด๋๋ฅผ ๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ๋์์ค๋๋ค.
๋ค์ ์์ ๋ ๋ณผํธ ๋ด์ ๋ชจ๋ ๋งํฌ๋ค์ด ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ถ๋ ฅํฉ๋๋ค:
const files = this.app.vault.getMarkdownFiles()
for (let i = 0; i < files.length; i++) {
console.log(files[i].path);
}
Tip
๋งํฌ๋ค์ด ๋ฌธ์๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ํ์ผ์ ๋์ดํ๋ ค๋ฉด getFiles()๋ฅผ ์ฌ์ฉํ์ธ์.
ํ์ผ ์ฝ๊ธฐ
ํ์ผ ๋ด์ฉ์ ์ฝ๋ ๋ ๊ฐ์ง ๋ฉ์๋๊ฐ ์์ต๋๋ค: read()์ cachedRead().
- ๋ด์ฉ์ ์ฌ์ฉ์์๊ฒ ํ์๋ง ํ๋ ค๋ฉด
cachedRead()
๋ฅผ ์ฌ์ฉํ์ฌ ๋์คํฌ์์ ์ฌ๋ฌ ๋ฒ ์ฝ๋ ๊ฒ์ ํผํ์ธ์. - ๋ด์ฉ์ ์ฝ๊ณ ๋ณ๊ฒฝํ ํ ๋์คํฌ์ ๋ค์ ์ฐ๋ ค๋ฉด
read()
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋๋ ๋ณต์ฌ๋ณธ์ผ๋ก ํ์ผ์ ๋ฎ์ด์ฐ๋ ๊ฒ์ ํผํ์ธ์.
Info
cachedRead()
์read()
์ ์ ์ผํ ์ฐจ์ด์ ์ ํ๋ฌ๊ทธ์ธ์ด ํ์ผ์ ์ฝ๊ธฐ ์ง์ ์ Obsidian ์ธ๋ถ์์ ํ์ผ์ด ์์ ๋์์ ๋์ ๋๋ค. ํ์ผ ์์คํ ์ด Obsidian์ ์ธ๋ถ์์ ํ์ผ์ด ๋ณ๊ฒฝ๋์์์ ์๋ฆฌ์๋ง์cachedRead()
๋read()
์ ๋๊ฐ์ด ๋์ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Obsidian ๋ด์์ ํ์ผ์ ์ ์ฅํ๋ฉด ์ฝ๊ธฐ ์บ์๋ ํ๋ฌ์๋ฉ๋๋ค.
๋ค์ ์์ ๋ ๋ณผํธ ๋ด์ ๋ชจ๋ ๋งํฌ๋ค์ด ํ์ผ ๋ด์ฉ์ ์ฝ๊ณ ํ๊ท ๋ฌธ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํฉ๋๋ค:
import { Notice, Plugin } from 'obsidian';
export default class ExamplePlugin extends Plugin {
async onload() {
this.addRibbonIcon('info', 'ํ์ผ ํ๊ท ๊ธธ์ด ๊ณ์ฐ', async () => {
const fileLength = await this.averageFileLength();
new Notice(`ํ์ผ ํ๊ท ๊ธธ์ด๋ ${fileLength}์ ์
๋๋ค.`);
});
}
async averageFileLength(): Promise<number> {
const { vault } = this.app;
const fileContents: string[] = await Promise.all(
vault.getMarkdownFiles().map((file) => vault.cachedRead(file))
);
let totalLength = 0;
fileContents.forEach((content) => {
totalLength += content.length;
});
return totalLength / fileContents.length;
}
}
ํ์ผ ์์
๊ธฐ์กด ํ์ผ์ ํ ์คํธ ๋ด์ฉ์ ์ฐ๋ ค๋ฉด Vault.modify()๋ฅผ ์ฌ์ฉํ์ธ์.
function writeCurrentDate(vault: Vault, file: TFile): Promise<void> {
return vault.modify(file, `์ค๋์ ${new Intl.DateTimeFormat().format(new Date())}์
๋๋ค.`);
}
ํ์ผ์ ํ์ฌ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ๋ ค๋ฉด Vault.process()๋ฅผ ์ฌ์ฉํ์ธ์. ๋ ๋ฒ์งธ ์ธ์๋ ํ์ฌ ํ์ผ ๋ด์ฉ์ ์ ๊ณตํ๊ณ ์์ ๋ ๋ด์ฉ์ ๋ฐํํ๋ ์ฝ๋ฐฑ์ ๋๋ค.
// emojify๋ ๋ชจ๋ :)๋ฅผ ๐๋ก ๋ฐ๊ฟ๋๋ค.
function emojify(vault: Vault, file: TFile): Promise<string> {
return vault.process(file, (data) => {
return data.replace(':)', '๐');
})
}
Vault.process()
๋ Vault.read()์ Vault.modify() ์์ ๊ตฌ์ถ๋ ์ถ์ํ๋ก, ํ์ฌ ๋ด์ฉ์ ์ฝ๊ณ ์
๋ฐ์ดํธ๋ ๋ด์ฉ์ ์ฐ๋ ์ฌ์ด์ ํ์ผ์ด ๋ณ๊ฒฝ๋์ง ์์์ ๋ณด์ฅํฉ๋๋ค. ์๋ํ์ง ์์ ๋ฐ์ดํฐ ์์ค์ ํผํ๊ธฐ ์ํด ํญ์ Vault.process()
๋ฅผ Vault.read()
/Vault.modify()
๋ณด๋ค ์ ํธํ์ธ์.
๋น๋๊ธฐ ์์
Vault.process()๋ ๋๊ธฐ์ ์์ ๋ง ์ง์ํฉ๋๋ค. ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ:
- Vault.cachedRead()๋ก ํ์ผ์ ์ฝ์ผ์ธ์.
- ๋น๋๊ธฐ ์์ ์ ์ํํ์ธ์.
- Vault.process()๋ก ํ์ผ์ ์ ๋ฐ์ดํธํ์ธ์.
process()
์ฝ๋ฐฑ์ data
๊ฐ cachedRead()
๊ฐ ๋ฐํํ ๋ฐ์ดํฐ์ ๊ฐ์์ง ํ์ธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๊ฐ์ง ์๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํด ํ์ผ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ฏ๋ก ์ฌ์ฉ์์๊ฒ ํ์ธ์ ์์ฒญํ๊ฑฐ๋ ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
ํ์ผ ์ญ์
ํ์ผ์ ์ญ์ ํ๋ ๋ ๊ฐ์ง ๋ฉ์๋๊ฐ ์์ต๋๋ค: delete()์ trash(). ์ฌ์ฉ์๊ฐ ๋ง์์ ๋ฐ๊ฟ ์ ์๋๋ก ํ์ฉํ ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ฌ์ฉํ ๋ฉ์๋๊ฐ ๋ฌ๋ผ์ง๋๋ค.
delete()
๋ ํ์ ์์ด ํ์ผ์ ์ ๊ฑฐํฉ๋๋ค.trash()
๋ ํ์ผ์ ํด์งํต์ผ๋ก ์ด๋ํฉ๋๋ค.
trash()
๋ฅผ ์ฌ์ฉํ ๋๋ ์์คํ
์ ํด์งํต์ผ๋ก ์ด๋ํ ์ง, ์๋๋ฉด ์ฌ์ฉ์ ๋ณผํธ ๋ฃจํธ์ .trash
ํด๋๋ก ์ด๋ํ ์ง ์ ํํ ์ ์์ต๋๋ค.
ํ์ผ์ธ๊ฐ ํด๋์ธ๊ฐ?
์ผ๋ถ ์์
์ ํ์ผ์ด๋ ํด๋์ผ ์ ์๋ TAbstractFile ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ฐ์๋ค์
๋๋ค. TAbstractFile
์ ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ๊ตฌ์ฒด์ ์ธ ํ์
์ ํ์ธํ์ธ์.
const folderOrFile = this.app.vault.getAbstractFileByPath('folderOrFile');
if (folderOrFile instanceof TFile) {
console.log('ํ์ผ์
๋๋ค!');
} else if (folderOrFile instanceof TFolder) {
console.log('ํด๋์
๋๋ค!');
}