mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-24 10:38:59 +01:00
@@ -4,7 +4,6 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import type MarkdownIt = require('markdown-it');
|
||||
import type Token = require('markdown-it/lib/token');
|
||||
import * as vscode from 'vscode';
|
||||
import { ILogger } from './logging';
|
||||
import { MarkdownContributionProvider } from './markdownExtensions';
|
||||
@@ -50,9 +49,9 @@ class TokenCache {
|
||||
readonly version: number;
|
||||
readonly config: MarkdownItConfig;
|
||||
};
|
||||
private _tokens?: Token[];
|
||||
private _tokens?: MarkdownIt.Token[];
|
||||
|
||||
public tryGetCached(document: ITextDocument, config: MarkdownItConfig): Token[] | undefined {
|
||||
public tryGetCached(document: ITextDocument, config: MarkdownItConfig): MarkdownIt.Token[] | undefined {
|
||||
if (this._cachedDocument
|
||||
&& this._cachedDocument.uri.toString() === document.uri.toString()
|
||||
&& document.version >= 0 && this._cachedDocument.version === document.version
|
||||
@@ -64,7 +63,7 @@ class TokenCache {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
public update(document: ITextDocument, config: MarkdownItConfig, tokens: Token[]) {
|
||||
public update(document: ITextDocument, config: MarkdownItConfig, tokens: MarkdownIt.Token[]) {
|
||||
this._cachedDocument = {
|
||||
uri: document.uri,
|
||||
version: document.version,
|
||||
@@ -93,7 +92,7 @@ interface RenderEnv {
|
||||
export interface IMdParser {
|
||||
readonly slugifier: Slugifier;
|
||||
|
||||
tokenize(document: ITextDocument): Promise<Token[]>;
|
||||
tokenize(document: ITextDocument): Promise<MarkdownIt.Token[]>;
|
||||
}
|
||||
|
||||
export class MarkdownItEngine implements IMdParser {
|
||||
@@ -143,8 +142,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
const frontMatterPlugin = await import('markdown-it-front-matter');
|
||||
// Extract rules from front matter plugin and apply at a lower precedence
|
||||
let fontMatterRule: any;
|
||||
// eslint-disable-next-line local/code-no-any-casts
|
||||
frontMatterPlugin.default(<any>{
|
||||
frontMatterPlugin.default({
|
||||
block: {
|
||||
ruler: {
|
||||
before: (_id: any, _id2: any, rule: any) => { fontMatterRule = rule; }
|
||||
@@ -180,7 +178,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
document: ITextDocument,
|
||||
config: MarkdownItConfig,
|
||||
engine: MarkdownIt
|
||||
): Token[] {
|
||||
): MarkdownIt.Token[] {
|
||||
const cached = this._tokenCache.tryGetCached(document, config);
|
||||
if (cached) {
|
||||
this._resetSlugCount();
|
||||
@@ -228,7 +226,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
};
|
||||
}
|
||||
|
||||
public async tokenize(document: ITextDocument): Promise<Token[]> {
|
||||
public async tokenize(document: ITextDocument): Promise<MarkdownIt.Token[]> {
|
||||
const config = this._getConfig(document.uri);
|
||||
const engine = await this._getEngine(config);
|
||||
return this._tokenizeDocument(document, config, engine);
|
||||
@@ -249,7 +247,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
|
||||
private _addImageRenderer(md: MarkdownIt): void {
|
||||
const original = md.renderer.rules.image;
|
||||
md.renderer.rules.image = (tokens: Token[], idx: number, options, env: RenderEnv, self) => {
|
||||
md.renderer.rules.image = (tokens: MarkdownIt.Token[], idx: number, options, env: RenderEnv, self) => {
|
||||
const token = tokens[idx];
|
||||
const src = token.attrGet('src');
|
||||
if (src) {
|
||||
@@ -271,7 +269,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
|
||||
private _addFencedRenderer(md: MarkdownIt): void {
|
||||
const original = md.renderer.rules['fenced'];
|
||||
md.renderer.rules['fenced'] = (tokens: Token[], idx: number, options, env, self) => {
|
||||
md.renderer.rules['fenced'] = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => {
|
||||
const token = tokens[idx];
|
||||
if (token.map?.length) {
|
||||
token.attrJoin('class', 'hljs');
|
||||
@@ -313,7 +311,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
|
||||
private _addNamedHeaders(md: MarkdownIt): void {
|
||||
const original = md.renderer.rules.heading_open;
|
||||
md.renderer.rules.heading_open = (tokens: Token[], idx: number, options, env, self) => {
|
||||
md.renderer.rules.heading_open = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => {
|
||||
const title = this._tokenToPlainText(tokens[idx + 1]);
|
||||
let slug = this.slugifier.fromHeading(title);
|
||||
|
||||
@@ -335,7 +333,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
};
|
||||
}
|
||||
|
||||
private _tokenToPlainText(token: Token): string {
|
||||
private _tokenToPlainText(token: MarkdownIt.Token): string {
|
||||
if (token.children) {
|
||||
return token.children.map(x => this._tokenToPlainText(x)).join('');
|
||||
}
|
||||
@@ -353,7 +351,7 @@ export class MarkdownItEngine implements IMdParser {
|
||||
private _addLinkRenderer(md: MarkdownIt): void {
|
||||
const original = md.renderer.rules.link_open;
|
||||
|
||||
md.renderer.rules.link_open = (tokens: Token[], idx: number, options, env, self) => {
|
||||
md.renderer.rules.link_open = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => {
|
||||
const token = tokens[idx];
|
||||
const href = token.attrGet('href');
|
||||
// A string, including empty string, may be `href`.
|
||||
|
||||
Reference in New Issue
Block a user