angular/adev/shared-docs/pipeline/guides/extensions/docs-code/docs-code-block.mts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

54 lines
1.5 KiB
TypeScript
Raw Normal View History

/*!
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import {TokenizerThis, RendererThis} from 'marked';
import {CodeToken, formatCode} from './format/index.mjs';
export interface DocsCodeBlock extends CodeToken {
type: 'docs-code-block';
// Nested code
code: string;
// Code language
language: string | undefined;
}
// TODO: use regex for code implemented in the marked package: https://github.com/markedjs/marked/blob/4e6acc8b8517eafe0036a914f58b6f53d4b12ca6/src/rules.ts#L72C1-L73C1
/**
* Regex for discovering code blocks, notably this is more limited than
* standard discovery of this as it only allows for exactly 3 ticks rather
* than three or more.
*/
const tripleTickCodeRule = /^\s*`{3}(\S+)[\r\n]+(.*?)[\r\n]+`{3}/s;
export const docsCodeBlockExtension = {
name: 'docs-code-block',
level: 'block' as const,
start(src: string) {
return src.match(/^(```)\s/)?.index;
},
tokenizer(this: TokenizerThis, src: string): DocsCodeBlock | undefined {
const match = tripleTickCodeRule.exec(src);
if (match) {
const token: DocsCodeBlock = {
raw: match[0],
type: 'docs-code-block',
code: match[2],
language: match[1],
};
return token;
}
return undefined;
},
renderer(this: RendererThis, token: DocsCodeBlock) {
if (token.language === 'mermaid') {
return token.code;
}
return formatCode(token);
},
};