1 | #!/usr/bin/env node
|
2 |
|
3 | 'use strict';
|
4 |
|
5 |
|
6 |
|
7 | const Fs = require('fs');
|
8 | const Path = require('path');
|
9 | const Toc = require('markdown-toc');
|
10 |
|
11 |
|
12 |
|
13 | const internals = {
|
14 | basePath: process.cwd(),
|
15 | defineFile(filename) {
|
16 |
|
17 | const path = Path.join(internals.basePath, filename);
|
18 | return {
|
19 | filename,
|
20 | path,
|
21 | contents: Fs.readFileSync(path, 'utf8')
|
22 | };
|
23 | }
|
24 | };
|
25 |
|
26 | internals.package = require(Path.join(internals.basePath, 'package.json'));
|
27 | internals.api = internals.defineFile('API.md');
|
28 | internals.readme = internals.defineFile('README.md');
|
29 |
|
30 | internals.generateToc = function () {
|
31 |
|
32 | const seen = {};
|
33 | const tocOptions = {
|
34 | bullets: '-',
|
35 | slugify(text) {
|
36 |
|
37 | const customLink = /<a\s+name="([^"]+)"\s*\/>/;
|
38 | const match = customLink.exec(text);
|
39 | if (match) {
|
40 | return match[1];
|
41 | }
|
42 |
|
43 | seen[text] = seen[text] >= 0 ? seen[text] + 1 : 0;
|
44 |
|
45 | if (seen[text] > 1) {
|
46 | text += `-${(seen[text] - 1) / 2}`; // For some weird reason, slugify is called twice, so need a small trick to get the actual number
|
47 | }
|
48 |
|
49 | return text.toLowerCase()
|
50 | .replace(/<\/?[^>]+(>|$)/g, '')
|
51 | .replace(/\s/g, '-')
|
52 | .replace(/[^\w-]/g, '');
|
53 | }
|
54 | };
|
55 |
|
56 | const api = Toc.insert(internals.api.contents, tocOptions)
|
57 | .replace(/<!-- version -->(.|\n)*<!-- versionstop -->/, `<!-- version -->\n# ${internals.package.version} API Reference\n<!-- versionstop -->`);
|
58 |
|
59 | Fs.writeFileSync(internals.api.path, api);
|
60 | };
|
61 |
|
62 | internals.generateLink = function () {
|
63 |
|
64 | const readme = internals.readme.contents
|
65 | .replace(/\[API Reference\]\(.*\)/gi, `[API Reference](${internals.package.homepage || ''}/blob/v${internals.package.version}/${internals.api.filename})`);
|
66 |
|
67 | Fs.writeFileSync(internals.readme.path, readme);
|
68 | };
|
69 |
|
70 | internals.generateToc();
|
71 | internals.generateLink();
|