@mieweb/wikigdrive
Version:
Google Drive to MarkDown synchronization
50 lines (49 loc) • 1.99 kB
JavaScript
import process from 'node:process';
import yaml from 'js-yaml';
import { FRONTMATTER_DUMP_OPTS } from './frontmatter.js';
import { DirectoryScanner } from '../DirectoryScanner.js';
export class TocGenerator {
async dirToMd(dir, level) {
let markdown = '';
const markDownScanner = new DirectoryScanner();
const files = await markDownScanner.scanDir(dir);
const realFileNames = Object.keys(files);
realFileNames.sort((fileName1, fileName2) => {
const file1 = files[fileName1];
const file2 = files[fileName2];
if (('directory' === file1.type) && !('directory' === file2.type)) {
return -1;
}
if (!('directory' === file1.type) && ('directory' === file2.type)) {
return 1;
}
return file1.title.toLocaleLowerCase().localeCompare(file2.title.toLocaleLowerCase());
});
for (const realFileName of realFileNames) {
const file = files[realFileName];
let lineStart = '*';
for (let i = 0; i <= level; i++) {
lineStart = ' ' + lineStart;
}
if (file.type === 'directory') {
markdown += lineStart + ' ' + file.title + '\n';
markdown += await this.dirToMd(await dir.getSubFileService(realFileName), level + 1);
}
if (file.type === 'md') {
markdown += lineStart + ' [' + file.title + '](gdoc:' + (file.id) + ')\n';
}
}
return markdown;
}
async generate(generatedFileService) {
const markdown = await this.dirToMd(generatedFileService, 0);
const fmt = yaml.dump({
type: 'page',
title: 'TOC',
autogenerated: true,
wikigdrive: process.env.GIT_SHA
}, FRONTMATTER_DUMP_OPTS);
const frontMatter = '---\n' + fmt + '---\n';
return frontMatter + markdown;
}
}