mirror of
https://github.com/nodejs/node.git
synced 2024-11-30 07:27:22 +01:00
6f64cda1ee
The processing of strings like `8.x` into a major version number and a minor version number results in minor versions that are `NaN`. In that situation, since the picker will link to the latest docs in the major version, include the version in the version picker. Fixes: https://github.com/nodejs/node/issues/23979 PR-URL: https://github.com/nodejs/node/pull/24638 Reviewed-By: Vse Mozhet Byt <vsemozhetbyt@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
130 lines
4.9 KiB
JavaScript
130 lines
4.9 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 {
|
|
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 }, 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 },
|
|
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>',
|
|
},
|
|
{
|
|
file: fixtures.path('altdocs.md'),
|
|
html: '<li><a href="https://nodejs.org/docs/latest-v8.x/api/foo.html">8.x',
|
|
},
|
|
];
|
|
|
|
const spaces = /\s/g;
|
|
|
|
testData.forEach(({ file, html }) => {
|
|
// Normalize expected data by stripping whitespace.
|
|
const expected = html.replace(spaces, '');
|
|
|
|
readFile(file, 'utf8', common.mustCall((err, input) => {
|
|
assert.ifError(err);
|
|
toHTML(
|
|
{
|
|
input: input,
|
|
filename: 'foo',
|
|
nodeVersion: process.version,
|
|
},
|
|
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),
|
|
`ACTUAL: ${actual}\nEXPECTED: ${expected}`);
|
|
})
|
|
);
|
|
}));
|
|
});
|