in repo-scripts/api-documenter/src/markdown/MarkdownEmitter.ts [112:231]
protected writeNode(
docNode: DocNode,
context: IMarkdownEmitterContext,
docNodeSiblings: boolean
): void {
const writer: IndentedWriter = context.writer;
switch (docNode.kind) {
case DocNodeKind.PlainText: {
const docPlainText: DocPlainText = docNode as DocPlainText;
this.writePlainText(docPlainText.text, context);
break;
}
case DocNodeKind.HtmlStartTag:
case DocNodeKind.HtmlEndTag: {
const docHtmlTag: DocHtmlStartTag | DocHtmlEndTag = docNode as
| DocHtmlStartTag
| DocHtmlEndTag;
// write the HTML element verbatim into the output
writer.write(docHtmlTag.emitAsHtml());
break;
}
case DocNodeKind.CodeSpan: {
const docCodeSpan: DocCodeSpan = docNode as DocCodeSpan;
if (context.insideTable) {
writer.write('<code>');
} else {
writer.write('`');
}
if (context.insideTable) {
const code: string = this.getTableEscapedText(docCodeSpan.code);
const parts: string[] = code.split(/\r?\n/g);
writer.write(parts.join('</code><br/><code>'));
} else {
writer.write(docCodeSpan.code);
}
if (context.insideTable) {
writer.write('</code>');
} else {
writer.write('`');
}
break;
}
case DocNodeKind.LinkTag: {
const docLinkTag: DocLinkTag = docNode as DocLinkTag;
if (docLinkTag.codeDestination) {
this.writeLinkTagWithCodeDestination(docLinkTag, context);
} else if (docLinkTag.urlDestination) {
this.writeLinkTagWithUrlDestination(docLinkTag, context);
} else if (docLinkTag.linkText) {
this.writePlainText(docLinkTag.linkText, context);
}
break;
}
case DocNodeKind.Paragraph: {
const docParagraph: DocParagraph = docNode as DocParagraph;
const trimmedParagraph: DocParagraph =
DocNodeTransforms.trimSpacesInParagraph(docParagraph);
if (context.insideTable) {
if (docNodeSiblings) {
writer.write('<p>');
this.writeNodes(trimmedParagraph.nodes, context);
writer.write('</p>');
} else {
// Special case: If we are the only element inside this table cell, then we can omit the <p></p> container.
this.writeNodes(trimmedParagraph.nodes, context);
}
} else {
this.writeNodes(trimmedParagraph.nodes, context);
writer.ensureNewLine();
writer.writeLine();
}
break;
}
case DocNodeKind.FencedCode: {
const docFencedCode: DocFencedCode = docNode as DocFencedCode;
writer.ensureNewLine();
writer.write('```');
writer.write(docFencedCode.language);
writer.writeLine();
writer.write(docFencedCode.code);
writer.writeLine();
writer.writeLine('```');
break;
}
case DocNodeKind.Section: {
const docSection: DocSection = docNode as DocSection;
this.writeNodes(docSection.nodes, context);
break;
}
case DocNodeKind.SoftBreak: {
if (!/^\s?$/.test(writer.peekLastCharacter())) {
writer.write(' ');
}
break;
}
case DocNodeKind.EscapedText: {
const docEscapedText: DocEscapedText = docNode as DocEscapedText;
this.writePlainText(docEscapedText.decodedText, context);
break;
}
case DocNodeKind.ErrorText: {
const docErrorText: DocErrorText = docNode as DocErrorText;
this.writePlainText(docErrorText.text, context);
break;
}
case DocNodeKind.InlineTag: {
break;
}
case DocNodeKind.BlockTag: {
const tagNode: DocBlockTag = docNode as DocBlockTag;
console.warn('Unsupported block tag: ' + tagNode.tagName);
break;
}
default:
throw new InternalError(
'Unsupported DocNodeKind kind: ' + docNode.kind
);
}
}