123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- const stream = require('stream');
- const reader = require('./reader.js');
- const header = `
- ## Documentation
- `;
- class JSDocCGenerator extends stream.Transform {
- constructor() {
- super({ objectMode: true });
- this.push(header);
- this._previuseCategory = '';
- }
- _transform(data, encoding, done) {
- const {
- category, description,
- returnType, functionName, functionArgs
- } = data;
- // Check if there is extra data returned
- const extraReturn = functionArgs.some((arg) => arg.isPointer);
- //
- // Start code generation
- //
- let code = '';
- //
- // Add category header
- //
- if (this._previuseCategory !== category) {
- this._previuseCategory = category;
- code += `### ${category}\n`;
- code += '\n';
- }
- //
- // function header
- //
- // function name
- if (extraReturn) {
- code += `#### [${returnType}, extra] = cephes.${functionName}(`;
- } else {
- code += `#### ${returnType} = cephes.${functionName}(`;
- }
- // function arguments
- for (const {type, isPointer, isArray, fullType, name} of functionArgs) {
- if (isPointer) continue;
- if (isArray && type === 'double') {
- code += `${name}: Float64Array, `;
- } else if (!isArray) {
- code += `${name}: ${type}, `;
- } else {
- throw new Error(`unsupported type: ${fullType}`);
- }
- }
- // Remove training comma
- code = code.slice(0, -2);
- // finish function header
- code += ')\n';
- code += '\n';
- //
- // Documentation content
- //
- // Description
- code += `\`${functionName}\` is the "${description}". `;
- code += `You can read the full documentation at http://www.netlib.org/cephes/doubldoc.html#${functionName}.`;
- code += '\n';
- code += '\n';
- // Example
- code += '```js\n';
- if (extraReturn) {
- code += 'const [ret, extra] = ';
- } else {
- code += 'const ret = ';
- }
- code += `cephes.${functionName}(`;
- // function arguments
- for (const {type, isPointer, isArray, fullType, name} of functionArgs) {
- if (isPointer) continue;
- if (isArray && type === 'double') {
- code += `new Float64Array(${name}), `;
- } else if (!isArray) {
- code += `${name}, `;
- } else {
- throw new Error(`unsupported type: ${fullType}`);
- }
- }
- code = code.slice(0, -2);
- code += ');\n';
- code += '```\n';
- code += '\n';
- // extra return
- if (extraReturn) {
- code += 'The `extra` object contains the following values: \n';
- code += '\n';
- code += '```js\n';
- code += 'const {\n';
- for (const { isPointer, name, type } of functionArgs) {
- if (!isPointer) continue;
- code += ` ${name}: ${type},\n`;
- }
- code = code.slice(0, -2) + '\n';
- code += '} = extra;\n';
- code += '```\n';
- code += '\n';
- }
- done(null, code);
- }
- }
- process.stdin
- .pipe(reader())
- .pipe(new JSDocCGenerator())
- .pipe(process.stdout)
|