@cms-panda/obsidian-project-reporter
Version:
A simple utility to report on all obisidan files within an Obsidian vault that are part of the Obsidian Projects plugin that utilize YAML formatting.
81 lines (61 loc) • 2.35 kB
JavaScript
import fs, { opendir } from 'fs/promises';
import path from 'path';
import { parseAllDocuments } from 'yaml';
import { generateTable, generateDashboard } from './converters/ArrayToMarkdown.js';
// TODO: Create Regex to get parent and up to sub-projects (check Arnimus for example);
const FOLDER_REGEX = /[\w\s]+\/[^\\]+\.[\w]{0,5}$/;
let allRecords = [];
const args = process.argv.slice(2);
let parseFolder = async (allRecords, folder) => {
try {
let files = await fs.readdir(folder);
for (let file of files) {
console.log(file);
let filePath = path.join(folder, file);
let stat = await fs.stat(filePath);
if (stat.isDirectory()) {
await parseFolder(allRecords, filePath);
} else {
allRecords.push(await parseFile(filePath));
}
}
} catch (err) {
console.log(`ERROR while processing: ${folder}`)
console.log(err);
}
}
let parseFile = async (fileName) => {
const file = await fs.readFile(fileName, 'utf8');
let folder = fileName.substring(FOLDER_REGEX.exec(fileName).index);
folder = folder.substring(0, folder.lastIndexOf(path.sep));
let record = { Project: folder };
record["Task"] = path.basename(fileName.replace(path.extname(fileName), ""));
let data = parseAllDocuments(file);
data[0].contents.items.forEach(item => {
let value = item.value.value;
if (item.value.items) {
let values = [];
for ( let i of item.value.items ) {
values.push(i.value);
}
value = values.join(',');
};
record[item.key.value] = value;
})
return record;
}
let saveMarkdownTable = async (output, contents) => {
let filePath = output.substring(0, output.lastIndexOf(path.sep));
try {
await opendir(filePath);
} catch (err) {
console.log(`Directory doesn't exist, creating new dir at ${filePath}`);
await fs.mkdir(filePath, { recursive: true });
}
await fs.writeFile(output, contents);
}
console.dir(args);
await parseFolder(allRecords, args[0]);
let dashboardmarkup = await generateDashboard(allRecords);
await saveMarkdownTable(args[1], `# PROJECT DASHBOARD \n\n${dashboardmarkup}`);