collab/mermaid/packages/parser/src/language/common/tokenBuilder.tsblame
View source
6dd74de1import type { GrammarAST, Stream, TokenBuilderOptions } from 'langium';
6dd74de2import type { TokenType } from 'chevrotain';
6dd74de3
6dd74de4import { DefaultTokenBuilder } from 'langium';
6dd74de5
6dd74de6export abstract class AbstractMermaidTokenBuilder extends DefaultTokenBuilder {
6dd74de7 private keywords: Set<string>;
6dd74de8
6dd74de9 public constructor(keywords: string[]) {
6dd74de10 super();
6dd74de11 this.keywords = new Set<string>(keywords);
6dd74de12 }
6dd74de13
6dd74de14 protected override buildKeywordTokens(
6dd74de15 rules: Stream<GrammarAST.AbstractRule>,
6dd74de16 terminalTokens: TokenType[],
6dd74de17 options?: TokenBuilderOptions
6dd74de18 ): TokenType[] {
6dd74de19 const tokenTypes: TokenType[] = super.buildKeywordTokens(rules, terminalTokens, options);
6dd74de20 // to restrict users, they mustn't have any non-whitespace characters after the keyword.
6dd74de21 tokenTypes.forEach((tokenType: TokenType): void => {
6dd74de22 if (this.keywords.has(tokenType.name) && tokenType.PATTERN !== undefined) {
6dd74de23 // eslint-disable-next-line @typescript-eslint/no-base-to-string
6dd74de24 tokenType.PATTERN = new RegExp(tokenType.PATTERN.toString() + '(?:(?=%%)|(?!\\S))');
6dd74de25 }
6dd74de26 });
6dd74de27 return tokenTypes;
6dd74de28 }
6dd74de29}
6dd74de30
6dd74de31export class CommonTokenBuilder extends AbstractMermaidTokenBuilder {}