mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-29 12:19:41 +02:00
fix: ANTLR parser special character node ID handling
- Fixed NODE_STRING lexer pattern to use positive lookahead instead of consuming following characters - Dash character (-) now tokenizes correctly as single character instead of including trailing whitespace - All 12 special characters now work: ['#', ':', '0', '&', ',', '*', '.', '\', 'v', '-', '/', '_'] - Improved test pass rate from 97.4% to 97.6% (924/947 tests passing) - flow-singlenode.spec.js now passes 100% (148/148 tests) Technical changes: - Updated FlowLexer.g4 NODE_STRING pattern with semantic predicates for lookahead - Regenerated ANTLR parser files using antlr-ng - Removed debug logging from test files
This commit is contained in:
@@ -124,7 +124,8 @@ MINUS: '-';
|
||||
|
||||
// Node string - allow dashes with lookahead to prevent conflicts with links (matches Jison pattern)
|
||||
// Pattern: ([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|\-(?=[^\>\-\.])|=(?!=))+
|
||||
NODE_STRING: ([A-Za-z0-9!"#$%&'*+.`?\\/_] | '-' ~[>\-.] | '=' ~'=')+;
|
||||
// Fixed: Use positive lookahead instead of consuming the following character
|
||||
NODE_STRING: ([A-Za-z0-9!"#$%&'*+.`?\\/_] | '-' {this.inputStream.LA(1) != '>'.charCodeAt(0) && this.inputStream.LA(1) != '-'.charCodeAt(0) && this.inputStream.LA(1) != '.'.charCodeAt(0)}? | '=' ~'=')+;
|
||||
|
||||
// Unicode text support (simplified from Jison's extensive Unicode ranges)
|
||||
UNICODE_TEXT: [\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE]+;
|
||||
|
@@ -22,6 +22,7 @@ class FlowchartListener implements ParseTreeListener {
|
||||
nodes: (string | { stmt: string; value: string })[];
|
||||
}[] = [];
|
||||
private currentArrowText: string = '';
|
||||
private currentLinkData: any = null;
|
||||
|
||||
constructor(db: any) {
|
||||
this.db = db;
|
||||
@@ -603,7 +604,9 @@ class FlowchartListener implements ParseTreeListener {
|
||||
const vertex = styledVertex.vertex();
|
||||
if (vertex) {
|
||||
const idCtx = vertex.idString();
|
||||
return idCtx ? idCtx.getText() : null;
|
||||
const nodeId = idCtx ? idCtx.getText() : null;
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1383,6 +1386,16 @@ class FlowchartListener implements ParseTreeListener {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Handle link processing - this is the critical missing method
|
||||
exitLink = (ctx: any) => {
|
||||
try {
|
||||
// Store link data for use in vertexStatement processing
|
||||
this.currentLinkData = this.extractLinkData(ctx);
|
||||
} catch (_error) {
|
||||
// Error handling for link processing
|
||||
}
|
||||
};
|
||||
|
||||
// Handle arrow text (pipe-delimited edge text)
|
||||
exitArrowText = (ctx: any) => {
|
||||
try {
|
||||
|
Reference in New Issue
Block a user