mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
/*!
|
|
* @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);
|
|
},
|
|
};
|