@microsoft/api-documenter
Version:
Read JSON files from api-extractor, generate documentation pages
150 lines • 6.64 kB
JavaScript
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomMarkdownEmitter = void 0;
const terminal_1 = require("@rushstack/terminal");
const CustomDocNodeKind_1 = require("../nodes/CustomDocNodeKind");
const MarkdownEmitter_1 = require("./MarkdownEmitter");
class CustomMarkdownEmitter extends MarkdownEmitter_1.MarkdownEmitter {
constructor(apiModel) {
super();
this._apiModel = apiModel;
}
emit(stringBuilder, docNode, options) {
return super.emit(stringBuilder, docNode, options);
}
/** @override */
writeNode(docNode, context, docNodeSiblings) {
const writer = context.writer;
switch (docNode.kind) {
case CustomDocNodeKind_1.CustomDocNodeKind.Heading: {
const docHeading = docNode;
writer.ensureSkippedLine();
let prefix;
switch (docHeading.level) {
case 1:
prefix = '##';
break;
case 2:
prefix = '###';
break;
case 3:
prefix = '###';
break;
default:
prefix = '####';
}
writer.writeLine(prefix + ' ' + this.getEscapedText(docHeading.title));
writer.writeLine();
break;
}
case CustomDocNodeKind_1.CustomDocNodeKind.NoteBox: {
const docNoteBox = docNode;
writer.ensureNewLine();
writer.increaseIndent('> ');
this.writeNode(docNoteBox.content, context, false);
writer.ensureNewLine();
writer.decreaseIndent();
writer.writeLine();
break;
}
case CustomDocNodeKind_1.CustomDocNodeKind.Table: {
const docTable = docNode;
// GitHub's markdown renderer chokes on tables that don't have a blank line above them,
// whereas VS Code's renderer is totally fine with it.
writer.ensureSkippedLine();
// Markdown table rows can have inconsistent cell counts. Size the table based on the longest row.
let columnCount = 0;
if (docTable.header) {
columnCount = docTable.header.cells.length;
}
for (const row of docTable.rows) {
if (row.cells.length > columnCount) {
columnCount = row.cells.length;
}
}
writer.write('<table>');
if (docTable.header) {
writer.write('<thead><tr>');
for (let i = 0; i < columnCount; ++i) {
writer.write('<th>');
writer.ensureNewLine();
writer.writeLine();
const cell = docTable.header.cells[i];
if (cell) {
this.writeNode(cell.content, context, false);
}
writer.ensureNewLine();
writer.writeLine();
writer.write('</th>');
}
writer.write('</tr></thead>');
}
writer.writeLine();
writer.write('<tbody>');
for (const row of docTable.rows) {
writer.write('<tr>');
for (const cell of row.cells) {
writer.write('<td>');
writer.ensureNewLine();
writer.writeLine();
this.writeNode(cell.content, context, false);
writer.ensureNewLine();
writer.writeLine();
writer.write('</td>');
}
writer.write('</tr>');
writer.writeLine();
}
writer.write('</tbody>');
writer.write('</table>');
writer.writeLine();
break;
}
case CustomDocNodeKind_1.CustomDocNodeKind.EmphasisSpan: {
const docEmphasisSpan = docNode;
const oldBold = context.boldRequested;
const oldItalic = context.italicRequested;
context.boldRequested = docEmphasisSpan.bold;
context.italicRequested = docEmphasisSpan.italic;
this.writeNodes(docEmphasisSpan.nodes, context);
context.boldRequested = oldBold;
context.italicRequested = oldItalic;
break;
}
default:
super.writeNode(docNode, context, docNodeSiblings);
}
}
/** @override */
writeLinkTagWithCodeDestination(docLinkTag, context) {
const options = context.options;
const result = this._apiModel.resolveDeclarationReference(docLinkTag.codeDestination, options.contextApiItem);
if (result.resolvedApiItem) {
const filename = options.onGetFilenameForApiItem(result.resolvedApiItem);
if (filename) {
let linkText = docLinkTag.linkText || '';
if (linkText.length === 0) {
// Generate a name such as Namespace1.Namespace2.MyClass.myMethod()
linkText = result.resolvedApiItem.getScopedNameWithinPackage();
}
if (linkText.length > 0) {
const encodedLinkText = this.getEscapedText(linkText.replace(/\s+/g, ' '));
context.writer.write('[');
context.writer.write(encodedLinkText);
context.writer.write(`](${filename})`);
}
else {
console.log(terminal_1.Colorize.yellow('WARNING: Unable to determine link text'));
}
}
}
else if (result.errorMessage) {
console.log(terminal_1.Colorize.yellow(`WARNING: Unable to resolve reference "${docLinkTag.codeDestination.emitAsTsdoc()}": ` +
result.errorMessage));
}
}
}
exports.CustomMarkdownEmitter = CustomMarkdownEmitter;
//# sourceMappingURL=CustomMarkdownEmitter.js.map
;