UNPKG

@mieweb/wikigdrive

Version:

Google Drive to MarkDown synchronization

50 lines (49 loc) 1.99 kB
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; } }