UNPKG

15.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"MarkdownEmitter.js","sourceRoot":"","sources":["../../src/markdown/MarkdownEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport {\n DocNode,\n DocNodeKind,\n StringBuilder,\n DocPlainText,\n DocHtmlStartTag,\n DocHtmlEndTag,\n DocCodeSpan,\n DocLinkTag,\n DocParagraph,\n DocFencedCode,\n DocSection,\n DocNodeTransforms,\n DocEscapedText,\n DocErrorText,\n DocBlockTag\n} from '@microsoft/tsdoc';\nimport { InternalError } from '@rushstack/node-core-library';\n\nimport { IndentedWriter } from '../utils/IndentedWriter';\n\nexport interface IMarkdownEmitterOptions {}\n\nexport interface IMarkdownEmitterContext<TOptions = IMarkdownEmitterOptions> {\n writer: IndentedWriter;\n insideTable: boolean;\n\n boldRequested: boolean;\n italicRequested: boolean;\n\n writingBold: boolean;\n writingItalic: boolean;\n\n options: TOptions;\n}\n\n/**\n * Renders MarkupElement content in the Markdown file format.\n * For more info: https://en.wikipedia.org/wiki/Markdown\n */\nexport class MarkdownEmitter {\n public emit(stringBuilder: StringBuilder, docNode: DocNode, options: IMarkdownEmitterOptions): string {\n const writer: IndentedWriter = new IndentedWriter(stringBuilder);\n\n const context: IMarkdownEmitterContext = {\n writer,\n insideTable: false,\n\n boldRequested: false,\n italicRequested: false,\n\n writingBold: false,\n writingItalic: false,\n\n options\n };\n\n this.writeNode(docNode, context, false);\n\n writer.ensureNewLine(); // finish the last line\n\n return writer.toString();\n }\n\n protected getEscapedText(text: string): string {\n const textWithBackslashes: string = text\n .replace(/\\\\/g, '\\\\\\\\') // first replace the escape character\n .replace(/[*#[\\]_|`~]/g, (x) => '\\\\' + x) // then escape any special characters\n .replace(/---/g, '\\\\-\\\\-\\\\-') // hyphens only if it's 3 or more\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n return textWithBackslashes;\n }\n\n protected getTableEscapedText(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\|/g, '&#124;');\n }\n\n /**\n * @virtual\n */\n protected writeNode(docNode: DocNode, context: IMarkdownEmitterContext, docNodeSiblings: boolean): void {\n const writer: IndentedWriter = context.writer;\n\n switch (docNode.kind) {\n case DocNodeKind.PlainText: {\n const docPlainText: DocPlainText = docNode as DocPlainText;\n this.writePlainText(docPlainText.text, context);\n break;\n }\n case DocNodeKind.HtmlStartTag:\n case DocNodeKind.HtmlEndTag: {\n const docHtmlTag: DocHtmlStartTag | DocHtmlEndTag = docNode as DocHtmlStartTag | DocHtmlEndTag;\n // write the HTML element verbatim into the output\n writer.write(docHtmlTag.emitAsHtml());\n break;\n }\n case DocNodeKind.CodeSpan: {\n const docCodeSpan: DocCodeSpan = docNode as DocCodeSpan;\n if (context.insideTable) {\n writer.write('<code>');\n } else {\n writer.write('`');\n }\n if (context.insideTable) {\n const code: string = this.getTableEscapedText(docCodeSpan.code);\n const parts: string[] = code.split(/\\r?\\n/g);\n writer.write(parts.join('</code><br/><code>'));\n } else {\n writer.write(docCodeSpan.code);\n }\n if (context.insideTable) {\n writer.write('</code>');\n } else {\n writer.write('`');\n }\n break;\n }\n case DocNodeKind.LinkTag: {\n const docLinkTag: DocLinkTag = docNode as DocLinkTag;\n if (docLinkTag.codeDestination) {\n this.writeLinkTagWithCodeDestination(docLinkTag, context);\n } else if (docLinkTag.urlDestination) {\n this.writeLinkTagWithUrlDestination(docLinkTag, context);\n } else if (docLinkTag.linkText) {\n this.writePlainText(docLinkTag.linkText, context);\n }\n break;\n }\n case DocNodeKind.Paragraph: {\n const docParagraph: DocParagraph = docNode as DocParagraph;\n const trimmedParagraph: DocParagraph = DocNodeTransforms.trimSpacesInParagraph(docParagraph);\n if (context.insideTable) {\n if (docNodeSiblings) {\n writer.write('<p>');\n this.writeNodes(trimmedParagraph.nodes, context);\n writer.write('</p>');\n } else {\n // Special case: If we are the only element inside this table cell, then we can omit the <p></p> container.\n this.writeNodes(trimmedParagraph.nodes, context);\n }\n } else {\n this.writeNodes(trimmedParagraph.nodes, context);\n writer.ensureNewLine();\n writer.writeLine();\n }\n break;\n }\n case DocNodeKind.FencedCode: {\n const docFencedCode: DocFencedCode = docNode as DocFencedCode;\n writer.ensureNewLine();\n writer.write('```');\n writer.write(docFencedCode.language);\n writer.writeLine();\n writer.write(docFencedCode.code);\n writer.ensureNewLine();\n writer.writeLine('```');\n break;\n }\n case DocNodeKind.Section: {\n const docSection: DocSection = docNode as DocSection;\n this.writeNodes(docSection.nodes, context);\n break;\n }\n case DocNodeKind.SoftBreak: {\n if (!/^\\s?$/.test(writer.peekLastCharacter())) {\n writer.write(' ');\n }\n break;\n }\n case DocNodeKind.EscapedText: {\n const docEscapedText: DocEscapedText = docNode as DocEscapedText;\n this.writePlainText(docEscapedText.decodedText, context);\n break;\n }\n case DocNodeKind.ErrorText: {\n const docErrorText: DocErrorText = docNode as DocErrorText;\n this.writePlainText(docErrorText.text, context);\n break;\n }\n case DocNodeKind.InlineTag: {\n break;\n }\n case DocNodeKind.BlockTag: {\n const tagNode: DocBlockTag = docNode as DocBlockTag;\n console.warn('Unsupported block tag: ' + tagNode.tagName);\n break;\n }\n default:\n throw new InternalError('Unsupported DocNodeKind kind: ' + docNode.kind);\n }\n }\n\n /** @virtual */\n protected writeLinkTagWithCodeDestination(docLinkTag: DocLinkTag, context: IMarkdownEmitterContext): void {\n // The subclass needs to implement this to support code destinations\n throw new InternalError('writeLinkTagWithCodeDestination()');\n }\n\n /** @virtual */\n protected writeLinkTagWithUrlDestination(docLinkTag: DocLinkTag, context: IMarkdownEmitterContext): void {\n const linkText: string =\n docLinkTag.linkText !== undefined ? docLinkTag.linkText : docLinkTag.urlDestination!;\n\n const encodedLinkText: string = this.getEscapedText(linkText.replace(/\\s+/g, ' '));\n\n context.writer.write('[');\n context.writer.write(encodedLinkText);\n context.writer.write(`](${docLinkTag.urlDestination!})`);\n }\n\n protected writePlainText(text: string, context: IMarkdownEmitterContext): void {\n const writer: IndentedWriter = context.writer;\n\n // split out the [ leading whitespace, content, trailing whitespace ]\n const parts: string[] = text.match(/^(\\s*)(.*?)(\\s*)$/) || [];\n\n writer.write(parts[1]); // write leading whitespace\n\n const middle: string = parts[2];\n\n if (middle !== '') {\n switch (writer.peekLastCharacter()) {\n case '':\n case '\\n':\n case ' ':\n case '[':\n case '>':\n // okay to put a symbol\n break;\n default:\n // This is no problem: \"**one** *two* **three**\"\n // But this is trouble: \"**one***two***three**\"\n // The most general solution: \"**one**<!-- -->*two*<!-- -->**three**\"\n writer.write('<!-- -->');\n break;\n }\n\n if (context.boldRequested) {\n writer.write('<b>');\n }\n if (context.italicRequested) {\n writer.write('<i>');\n }\n\n writer.write(this.getEscapedText(middle));\n\n if (context.italicRequested) {\n writer.write('</i>');\n }\n if (context.boldRequested) {\n writer.write('</b>');\n }\n }\n\n writer.write(parts[3]); // write trailing whitespace\n }\n\n protected writeNodes(docNodes: ReadonlyArray<DocNode>, context: IMarkdownEmitterContext): void {\n for (const docNode of docNodes) {\n this.writeNode(docNode, context, docNodes.length > 1);\n }\n }\n}\n"]}
\No newline at end of file