UNPKG

2.05 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3'use strict';
4
5// Load modules
6
7const Fs = require('fs');
8const Path = require('path');
9const Toc = require('markdown-toc');
10
11// Declare internals
12
13const 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
26internals.package = require(Path.join(internals.basePath, 'package.json'));
27internals.api = internals.defineFile('API.md');
28internals.readme = internals.defineFile('README.md');
29
30internals.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
62internals.generateLink = function () {
63 // create absolute URL for versioned docs
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
70internals.generateToc();
71internals.generateLink();