collab/mermaid/packages/parser/src/language/common/valueConverter.tsblame
View source
6dd74de1import type { CstNode, GrammarAST, ValueType } from 'langium';
6dd74de2import { DefaultValueConverter } from 'langium';
6dd74de3
6dd74de4import { accessibilityDescrRegex, accessibilityTitleRegex, titleRegex } from './matcher.js';
6dd74de5
6dd74de6const rulesRegexes: Record<string, RegExp> = {
6dd74de7 ACC_DESCR: accessibilityDescrRegex,
6dd74de8 ACC_TITLE: accessibilityTitleRegex,
6dd74de9 TITLE: titleRegex,
6dd74de10};
6dd74de11
6dd74de12export abstract class AbstractMermaidValueConverter extends DefaultValueConverter {
6dd74de13 /**
6dd74de14 * A method contains convert logic to be used by class.
6dd74de15 *
6dd74de16 * @param rule - Parsed rule.
6dd74de17 * @param input - Matched string.
6dd74de18 * @param cstNode - Node in the Concrete Syntax Tree (CST).
6dd74de19 * @returns converted the value if it's available or `undefined` if it's not.
6dd74de20 */
6dd74de21 protected abstract runCustomConverter(
6dd74de22 rule: GrammarAST.AbstractRule,
6dd74de23 input: string,
6dd74de24 cstNode: CstNode
6dd74de25 ): ValueType | undefined;
6dd74de26
6dd74de27 protected override runConverter(
6dd74de28 rule: GrammarAST.AbstractRule,
6dd74de29 input: string,
6dd74de30 cstNode: CstNode
6dd74de31 ): ValueType {
6dd74de32 let value: ValueType | undefined = this.runCommonConverter(rule, input, cstNode);
6dd74de33
6dd74de34 if (value === undefined) {
6dd74de35 value = this.runCustomConverter(rule, input, cstNode);
6dd74de36 }
6dd74de37 if (value === undefined) {
6dd74de38 return super.runConverter(rule, input, cstNode);
6dd74de39 }
6dd74de40
6dd74de41 return value;
6dd74de42 }
6dd74de43
6dd74de44 private runCommonConverter(
6dd74de45 rule: GrammarAST.AbstractRule,
6dd74de46 input: string,
6dd74de47 _cstNode: CstNode
6dd74de48 ): ValueType | undefined {
6dd74de49 const regex: RegExp | undefined = rulesRegexes[rule.name];
6dd74de50 if (regex === undefined) {
6dd74de51 return undefined;
6dd74de52 }
6dd74de53 const match = regex.exec(input);
6dd74de54 if (match === null) {
6dd74de55 return undefined;
6dd74de56 }
6dd74de57 // single line title, accTitle, accDescr
6dd74de58 if (match[1] !== undefined) {
6dd74de59 return match[1].trim().replace(/[\t ]{2,}/gm, ' ');
6dd74de60 }
6dd74de61 // multi line accDescr
6dd74de62 if (match[2] !== undefined) {
6dd74de63 return match[2]
6dd74de64 .replace(/^\s*/gm, '')
6dd74de65 .replace(/\s+$/gm, '')
6dd74de66 .replace(/[\t ]{2,}/gm, ' ')
6dd74de67 .replace(/[\n\r]{2,}/gm, '\n');
6dd74de68 }
6dd74de69 return undefined;
6dd74de70 }
6dd74de71}
6dd74de72
6dd74de73export class CommonValueConverter extends AbstractMermaidValueConverter {
6dd74de74 protected override runCustomConverter(
6dd74de75 _rule: GrammarAST.AbstractRule,
6dd74de76 _input: string,
6dd74de77 _cstNode: CstNode
6dd74de78 ): ValueType | undefined {
6dd74de79 return undefined;
6dd74de80 }
6dd74de81}