gen-nav.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env node
  2. const path = require('path');
  3. const glob = require('glob');
  4. const startCase = require('lodash.startcase');
  5. const baseDir = process.argv[2];
  6. const files = glob.sync(baseDir + '/**/*.adoc').map(f => path.relative(baseDir, f));
  7. console.log('.API');
  8. function getPageTitle(directory) {
  9. switch (directory) {
  10. case 'metatx':
  11. return 'Meta Transactions';
  12. default:
  13. return startCase(directory);
  14. }
  15. }
  16. const menuItems = files.reduce(
  17. (acc, file) => {
  18. let current = acc;
  19. const doc = file.replace(baseDir, '');
  20. const keys = doc
  21. .split('/')
  22. .filter(Boolean)
  23. .map(k => k.replace('.adoc', ''));
  24. for (let i = 0; i < keys.length; i++) {
  25. current = current.items[keys[i]] ??= {
  26. name: startCase(keys[i]),
  27. dir: keys[i],
  28. items: {},
  29. doc,
  30. };
  31. }
  32. return acc;
  33. },
  34. {
  35. items: {
  36. token: {
  37. name: 'tokens',
  38. dir: '',
  39. items: {},
  40. },
  41. },
  42. },
  43. );
  44. const arrayifyItems = items =>
  45. Object.entries(items).map(([k, v]) => {
  46. if (Object.keys(v.items ?? {}).length > 0) return [v, arrayifyItems(v.items)];
  47. return [k, v];
  48. });
  49. const isString = v => typeof v === 'string';
  50. const sortItems = items =>
  51. items.sort(([a], [b]) =>
  52. (isString(a) ? a : a.name).toLowerCase().localeCompare(isString(b) ? b : b.name, undefined, { numeric: true }),
  53. );
  54. const print = (items, level = 1) => {
  55. items.forEach(([k, v]) => {
  56. if (v.doc || k?.doc)
  57. console.log(`${'*'.repeat(level)} xref:${v.doc || k.doc}[${getPageTitle(isString(k) ? k : k.name)}]`);
  58. else console.log(`${'*'.repeat(level)} ${getPageTitle(isString(k) ? k : k.name)}`);
  59. if (Array.isArray(v)) print(v, level + 1);
  60. });
  61. };
  62. print(
  63. sortItems(arrayifyItems(menuItems.items)).map(([k, v]) => {
  64. if (v?.length > 0) return [k, sortItems(v)];
  65. return [k, v];
  66. }),
  67. );