in apps/api-documenter/src/documenters/MarkdownDocumenter.ts [116:323]
private _writeApiItemPage(apiItem: ApiItem): void {
const configuration: TSDocConfiguration = this._tsdocConfiguration;
const output: DocSection = new DocSection({ configuration: this._tsdocConfiguration });
this._writeBreadcrumb(output, apiItem);
const scopedName: string = apiItem.getScopedNameWithinPackage();
switch (apiItem.kind) {
case ApiItemKind.Class:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} class` }));
break;
case ApiItemKind.Enum:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} enum` }));
break;
case ApiItemKind.Interface:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} interface` }));
break;
case ApiItemKind.Constructor:
case ApiItemKind.ConstructSignature:
output.appendNode(new DocHeading({ configuration, title: scopedName }));
break;
case ApiItemKind.Method:
case ApiItemKind.MethodSignature:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} method` }));
break;
case ApiItemKind.Function:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} function` }));
break;
case ApiItemKind.Model:
output.appendNode(new DocHeading({ configuration, title: `API Reference` }));
break;
case ApiItemKind.Namespace:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} namespace` }));
break;
case ApiItemKind.Package:
console.log(`Writing ${apiItem.displayName} package`);
const unscopedPackageName: string = PackageName.getUnscopedName(apiItem.displayName);
output.appendNode(new DocHeading({ configuration, title: `${unscopedPackageName} package` }));
break;
case ApiItemKind.Property:
case ApiItemKind.PropertySignature:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} property` }));
break;
case ApiItemKind.TypeAlias:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} type` }));
break;
case ApiItemKind.Variable:
output.appendNode(new DocHeading({ configuration, title: `${scopedName} variable` }));
break;
default:
throw new Error('Unsupported API item kind: ' + apiItem.kind);
}
if (ApiReleaseTagMixin.isBaseClassOf(apiItem)) {
if (apiItem.releaseTag === ReleaseTag.Beta) {
this._writeBetaWarning(output);
}
}
const decoratorBlocks: DocBlock[] = [];
if (apiItem instanceof ApiDocumentedItem) {
const tsdocComment: DocComment | undefined = apiItem.tsdocComment;
if (tsdocComment) {
decoratorBlocks.push(
...tsdocComment.customBlocks.filter(
(block) => block.blockTag.tagNameWithUpperCase === StandardTags.decorator.tagNameWithUpperCase
)
);
if (tsdocComment.deprecatedBlock) {
output.appendNode(
new DocNoteBox({ configuration: this._tsdocConfiguration }, [
new DocParagraph({ configuration: this._tsdocConfiguration }, [
new DocPlainText({
configuration: this._tsdocConfiguration,
text: 'Warning: This API is now obsolete. '
})
]),
...tsdocComment.deprecatedBlock.content.nodes
])
);
}
this._appendSection(output, tsdocComment.summarySection);
}
}
if (apiItem instanceof ApiDeclaredItem) {
if (apiItem.excerpt.text.length > 0) {
output.appendNode(
new DocParagraph({ configuration }, [
new DocEmphasisSpan({ configuration, bold: true }, [
new DocPlainText({ configuration, text: 'Signature:' })
])
])
);
output.appendNode(
new DocFencedCode({
configuration,
code: apiItem.getExcerptWithModifiers(),
language: 'typescript'
})
);
}
this._writeHeritageTypes(output, apiItem);
}
if (decoratorBlocks.length > 0) {
output.appendNode(
new DocParagraph({ configuration }, [
new DocEmphasisSpan({ configuration, bold: true }, [
new DocPlainText({ configuration, text: 'Decorators:' })
])
])
);
for (const decoratorBlock of decoratorBlocks) {
output.appendNodes(decoratorBlock.content.nodes);
}
}
let appendRemarks: boolean = true;
switch (apiItem.kind) {
case ApiItemKind.Class:
case ApiItemKind.Interface:
case ApiItemKind.Namespace:
case ApiItemKind.Package:
this._writeRemarksSection(output, apiItem);
appendRemarks = false;
break;
}
switch (apiItem.kind) {
case ApiItemKind.Class:
this._writeClassTables(output, apiItem as ApiClass);
break;
case ApiItemKind.Enum:
this._writeEnumTables(output, apiItem as ApiEnum);
break;
case ApiItemKind.Interface:
this._writeInterfaceTables(output, apiItem as ApiInterface);
break;
case ApiItemKind.Constructor:
case ApiItemKind.ConstructSignature:
case ApiItemKind.Method:
case ApiItemKind.MethodSignature:
case ApiItemKind.Function:
this._writeParameterTables(output, apiItem as ApiParameterListMixin);
this._writeThrowsSection(output, apiItem);
break;
case ApiItemKind.Namespace:
this._writePackageOrNamespaceTables(output, apiItem as ApiNamespace);
break;
case ApiItemKind.Model:
this._writeModelTable(output, apiItem as ApiModel);
break;
case ApiItemKind.Package:
this._writePackageOrNamespaceTables(output, apiItem as ApiPackage);
break;
case ApiItemKind.Property:
case ApiItemKind.PropertySignature:
break;
case ApiItemKind.TypeAlias:
break;
case ApiItemKind.Variable:
break;
default:
throw new Error('Unsupported API item kind: ' + apiItem.kind);
}
if (appendRemarks) {
this._writeRemarksSection(output, apiItem);
}
const filename: string = path.join(this._outputFolder, this._getFilenameForApiItem(apiItem));
const stringBuilder: StringBuilder = new StringBuilder();
stringBuilder.append(
'<!-- Do not edit this file. It is automatically generated by API Documenter. -->\n\n'
);
this._markdownEmitter.emit(stringBuilder, output, {
contextApiItem: apiItem,
onGetFilenameForApiItem: (apiItemForFilename: ApiItem) => {
return this._getLinkFilenameForApiItem(apiItemForFilename);
}
});
let pageContent: string = stringBuilder.toString();
if (this._pluginLoader.markdownDocumenterFeature) {
// Allow the plugin to customize the pageContent
const eventArgs: IMarkdownDocumenterFeatureOnBeforeWritePageArgs = {
apiItem: apiItem,
outputFilename: filename,
pageContent: pageContent
};
this._pluginLoader.markdownDocumenterFeature.onBeforeWritePage(eventArgs);
pageContent = eventArgs.pageContent;
}
FileSystem.writeFile(filename, pageContent, {
convertLineEndings: this._documenterConfig ? this._documenterConfig.newlineKind : NewlineKind.CrLf
});
}