react-native-navigation的迁移库

MarkdownWriter.ts 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import * as _ from 'lodash';
  2. import * as Handlebars from 'handlebars';
  3. import * as fs from 'fs';
  4. import { ClassContext } from './ClassParser';
  5. import { EnumContext } from './EnumParser';
  6. export class MarkdownWriter {
  7. private classFn;
  8. private enumFn;
  9. private menuFn;
  10. constructor(private templatesDir: string, private outputDir: string) {
  11. this.classFn = this.setupClassHandlebars();
  12. this.enumFn = this.setupEnumHandlebars();
  13. this.menuFn = this.setupMenuHandlebars();
  14. }
  15. public writeClasses(classContexts: ClassContext[]) {
  16. classContexts.forEach((c) => {
  17. const markdown = this.classFn(c);
  18. fs.writeFileSync(`${this.outputDir}/${c.name}.md`, markdown, { encoding: 'utf8' });
  19. });
  20. }
  21. public writeEnums(enumContexts: EnumContext[]) {
  22. enumContexts.forEach((c) => {
  23. const markdown = this.enumFn(c);
  24. fs.writeFileSync(`${this.outputDir}/${c.name}.md`, markdown, { encoding: 'utf8' });
  25. });
  26. }
  27. public writeMenu(classContexts: ClassContext[], enumContexts: EnumContext[]) {
  28. const files = classContexts.map((c) => ({ name: c.name, path: `/api/${c.name}` }));
  29. const files2 = enumContexts.map((c) => ({ name: c.name, path: `/api/${c.name}` }));
  30. const menuMarkdown = this.menuFn({ files: _.concat(files, files2) });
  31. fs.writeFileSync(`${this.outputDir}/_sidebar.md`, menuMarkdown, { encoding: 'utf8' });
  32. fs.writeFileSync(`${this.outputDir}/README.md`, menuMarkdown, { encoding: 'utf8' });
  33. }
  34. private setupClassHandlebars() {
  35. const classTemplate = fs.readFileSync(`${this.templatesDir}/class.hbs`).toString();
  36. const methodTemplate = fs.readFileSync(`${this.templatesDir}/method.hbs`).toString();
  37. const propertyTemplate = fs.readFileSync(`${this.templatesDir}/property.hbs`).toString();
  38. Handlebars.registerPartial('class', classTemplate);
  39. Handlebars.registerPartial('method', methodTemplate);
  40. Handlebars.registerPartial('property', propertyTemplate);
  41. return Handlebars.compile('{{> class}}', { strict: true, noEscape: true });
  42. }
  43. private setupEnumHandlebars() {
  44. const enumTemplate = fs.readFileSync(`${this.templatesDir}/enum.hbs`).toString();
  45. return Handlebars.compile(enumTemplate, { strict: true, noEscape: true });
  46. }
  47. private setupMenuHandlebars() {
  48. const template = fs.readFileSync(`${this.templatesDir}/menu.hbs`).toString();
  49. return Handlebars.compile(template, { strict: true, noEscape: true });
  50. }
  51. }