collab/mermaid/packages/parser/src/language/treemap/valueConverter.tsblame
View source
6dd74de1import type { CstNode, GrammarAST, ValueType } from 'langium';
6dd74de2import { AbstractMermaidValueConverter } from '../common/index.js';
6dd74de3
6dd74de4// Regular expression to extract className and styleText from a classDef terminal
6dd74de5const classDefRegex = /classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/;
6dd74de6
6dd74de7export class TreemapValueConverter extends AbstractMermaidValueConverter {
6dd74de8 protected runCustomConverter(
6dd74de9 rule: GrammarAST.AbstractRule,
6dd74de10 input: string,
6dd74de11 _cstNode: CstNode
6dd74de12 ): ValueType | undefined {
6dd74de13 if (rule.name === 'NUMBER2') {
6dd74de14 // Convert to a number by removing any commas and converting to float
6dd74de15 return parseFloat(input.replace(/,/g, ''));
6dd74de16 } else if (rule.name === 'SEPARATOR') {
6dd74de17 // Remove quotes
6dd74de18 return input.substring(1, input.length - 1);
6dd74de19 } else if (rule.name === 'STRING2') {
6dd74de20 // Remove quotes
6dd74de21 return input.substring(1, input.length - 1);
6dd74de22 } else if (rule.name === 'INDENTATION') {
6dd74de23 return input.length;
6dd74de24 } else if (rule.name === 'ClassDef') {
6dd74de25 // Handle both CLASS_DEF terminal and ClassDef rule
6dd74de26 if (typeof input !== 'string') {
6dd74de27 // If we're dealing with an already processed object, return it as is
6dd74de28 return input;
6dd74de29 }
6dd74de30
6dd74de31 // Extract className and styleText from classDef statement
6dd74de32 const match = classDefRegex.exec(input);
6dd74de33 if (match) {
6dd74de34 // Use any type to avoid type issues
6dd74de35 return {
6dd74de36 $type: 'ClassDefStatement',
6dd74de37 className: match[1],
6dd74de38 styleText: match[2] || undefined,
6dd74de39 } as any;
6dd74de40 }
6dd74de41 }
6dd74de42 return undefined;
6dd74de43 }
6dd74de44}