45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
| /* eslint-disable @typescript-eslint/no-var-requires */
 | |
| import type MarkdownIt from 'markdown-it';
 | |
| import type Token from 'markdown-it/lib/token';
 | |
| 
 | |
| const container = require('markdown-it-container');
 | |
| 
 | |
| export const containerPlugin = (md: MarkdownIt) => {
 | |
|   md.use(...createContainer('tip', 'TIP'))
 | |
|     .use(...createContainer('warning', 'WARNING'))
 | |
|     .use(...createContainer('danger', 'WARNING'))
 | |
|     // explicitly escape Vue syntax
 | |
|     .use(container, 'v-pre', {
 | |
|       render: (tokens: Token[], idx: number) =>
 | |
|         tokens[idx].nesting === 1 ? `<div v-pre>\n` : `</div>\n`,
 | |
|     });
 | |
| };
 | |
| 
 | |
| type ContainerArgs = [
 | |
|   typeof container,
 | |
|   string,
 | |
|   {
 | |
|     render(tokens: Token[], idx: number): string;
 | |
|   },
 | |
| ];
 | |
| 
 | |
| function createContainer(klass: string, defaultTitle: string): ContainerArgs {
 | |
|   return [
 | |
|     container,
 | |
|     klass,
 | |
|     {
 | |
|       render(tokens, idx) {
 | |
|         const token = tokens[idx];
 | |
|         const info = token.info?.trim().slice(klass.length)?.trim();
 | |
|         if (token.nesting === 1) {
 | |
|           return `<div class="${klass} custom-block"><p class="custom-block-title">${
 | |
|             info || defaultTitle
 | |
|           }</p>\n`;
 | |
|         } else {
 | |
|           return `</div>\n`;
 | |
|         }
 | |
|       },
 | |
|     },
 | |
|   ];
 | |
| }
 |