mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
60465700ed
Parse source code using acorn; extracting exports. When producing documentation, match exports to headers. When a match is found, add a [src] link. This first commit handles simple exported classes and functions, and does so without requiring any changes to the source code or markdown. Subsequent commits will attempt to match more headers, and some of these changes are likely to require changes to the source code and/or markdown. PR-URL: https://github.com/nodejs/node/pull/22405 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Vse Mozhet Byt <vsemozhetbyt@gmail.com>
140 lines
5.4 KiB
JavaScript
140 lines
5.4 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
// The doctool currently uses js-yaml from the tool/node_modules/eslint/ tree.
|
|
try {
|
|
require('../../tools/node_modules/eslint/node_modules/js-yaml');
|
|
} catch (e) {
|
|
common.skip('missing js-yaml (eslint not present)');
|
|
}
|
|
|
|
const assert = require('assert');
|
|
const { readFile } = require('fs');
|
|
const fixtures = require('../common/fixtures');
|
|
const html = require('../../tools/doc/html.js');
|
|
const path = require('path');
|
|
|
|
module.paths.unshift(
|
|
path.join(__dirname, '..', '..', 'tools', 'doc', 'node_modules'));
|
|
const unified = require('unified');
|
|
const markdown = require('remark-parse');
|
|
const remark2rehype = require('remark-rehype');
|
|
const raw = require('rehype-raw');
|
|
const htmlStringify = require('rehype-stringify');
|
|
|
|
function toHTML({ input, filename, nodeVersion, analytics }, cb) {
|
|
const content = unified()
|
|
.use(markdown)
|
|
.use(html.firstHeader)
|
|
.use(html.preprocessText)
|
|
.use(html.preprocessElements, { filename })
|
|
.use(html.buildToc, { filename, apilinks: {} })
|
|
.use(remark2rehype, { allowDangerousHTML: true })
|
|
.use(raw)
|
|
.use(htmlStringify)
|
|
.processSync(input);
|
|
|
|
html.toHTML(
|
|
{ input, content, filename, nodeVersion, analytics },
|
|
cb
|
|
);
|
|
}
|
|
|
|
// Test data is a list of objects with two properties.
|
|
// The file property is the file path.
|
|
// The html property is some HTML which will be generated by the doctool.
|
|
// This HTML will be stripped of all whitespace because we don't currently
|
|
// have an HTML parser.
|
|
const testData = [
|
|
{
|
|
file: fixtures.path('sample_document.md'),
|
|
html: '<ol><li>fish</li><li>fish</li></ol>' +
|
|
'<ul><li>Redfish</li><li>Bluefish</li></ul>'
|
|
},
|
|
{
|
|
file: fixtures.path('order_of_end_tags_5873.md'),
|
|
html: '<h3>ClassMethod: Buffer.from(array) <span> ' +
|
|
'<a class="mark" href="#foo_class_method_buffer_from_array" ' +
|
|
'id="foo_class_method_buffer_from_array">#</a> </span> </h3>' +
|
|
'<ul><li><code>array</code><a ' +
|
|
'href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/' +
|
|
'Reference/Global_Objects/Array" class="type"><Array></a></li></ul>'
|
|
},
|
|
{
|
|
file: fixtures.path('doc_with_yaml.md'),
|
|
html: '<h1>Sample Markdown with YAML info' +
|
|
'<span><a class="mark" href="#foo_sample_markdown_with_yaml_info" ' +
|
|
' id="foo_sample_markdown_with_yaml_info">#</a></span></h1>' +
|
|
'<h2>Foobar<span><a class="mark" href="#foo_foobar" ' +
|
|
'id="foo_foobar">#</a></span></h2>' +
|
|
'<div class="api_metadata"><span>Added in: v1.0.0</span></div> ' +
|
|
'<p>Describe <code>Foobar</code> in more detail here.</p>' +
|
|
'<h2>Foobar II<span><a class="mark" href="#foo_foobar_ii" ' +
|
|
'id="foo_foobar_ii">#</a></span></h2><div class="api_metadata">' +
|
|
'<details class="changelog"><summary>History</summary>' +
|
|
'<table><tbody><tr><th>Version</th><th>Changes</th></tr>' +
|
|
'<tr><td>v5.3.0, v4.2.0</td>' +
|
|
'<td><p><span>Added in: v5.3.0, v4.2.0</span></p></td></tr>' +
|
|
'<tr><td>v4.2.0</td><td><p>The <code>error</code> parameter can now be' +
|
|
'an arrow function.</p></td></tr></tbody></table></details></div> ' +
|
|
'<p>Describe <code>Foobar II</code> in more detail here.' +
|
|
'<a href="http://man7.org/linux/man-pages/man1/fg.1.html"><code>fg(1)' +
|
|
'</code></a></p><h2>Deprecated thingy<span><a class="mark" ' +
|
|
'href="#foo_deprecated_thingy" id="foo_deprecated_thingy">#</a>' +
|
|
'</span></h2><div class="api_metadata"><span>Added in: v1.0.0</span>' +
|
|
'<span>Deprecated since: v2.0.0</span></div><p>Describe ' +
|
|
'<code>Deprecated thingy</code> in more detail here.' +
|
|
'<a href="http://man7.org/linux/man-pages/man1/fg.1p.html"><code>fg(1p)' +
|
|
'</code></a></p><h2>Something<span><a class="mark" href="#foo_something' +
|
|
'" id="foo_something">#</a></span></h2> ' +
|
|
'<!-- This is not a metadata comment --> ' +
|
|
'<p>Describe <code>Something</code> in more detail here. </p>'
|
|
},
|
|
{
|
|
file: fixtures.path('sample_document.md'),
|
|
html: '<ol><li>fish</li><li>fish</li></ol>' +
|
|
'<ul><li>Red fish</li><li>Blue fish</li></ul>',
|
|
analyticsId: 'UA-67020396-1'
|
|
},
|
|
];
|
|
|
|
const spaces = /\s/g;
|
|
|
|
testData.forEach(({ file, html, analyticsId }) => {
|
|
// Normalize expected data by stripping whitespace.
|
|
const expected = html.replace(spaces, '');
|
|
const includeAnalytics = typeof analyticsId !== 'undefined';
|
|
|
|
readFile(file, 'utf8', common.mustCall((err, input) => {
|
|
assert.ifError(err);
|
|
toHTML(
|
|
{
|
|
input: input,
|
|
filename: 'foo',
|
|
nodeVersion: process.version,
|
|
analytics: analyticsId,
|
|
},
|
|
common.mustCall((err, output) => {
|
|
assert.ifError(err);
|
|
|
|
const actual = output.replace(spaces, '');
|
|
// Assert that the input stripped of all whitespace contains the
|
|
// expected markup.
|
|
assert(actual.includes(expected));
|
|
|
|
// Testing the insertion of Google Analytics script when
|
|
// an analytics id is provided. Should not be present by default.
|
|
const scriptDomain = 'google-analytics.com';
|
|
if (includeAnalytics) {
|
|
assert(actual.includes(scriptDomain),
|
|
`Google Analytics script was not present in "${actual}"`);
|
|
} else {
|
|
assert.strictEqual(actual.includes(scriptDomain), false,
|
|
'Google Analytics script was present in ' +
|
|
`"${actual}"`);
|
|
}
|
|
})
|
|
);
|
|
}));
|
|
});
|