mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-10-20 22:49:44 +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)
|
// Node string - allow dashes with lookahead to prevent conflicts with links (matches Jison pattern)
|
||||||
// Pattern: ([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|\-(?=[^\>\-\.])|=(?!=))+
|
// 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 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]+;
|
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 })[];
|
nodes: (string | { stmt: string; value: string })[];
|
||||||
}[] = [];
|
}[] = [];
|
||||||
private currentArrowText: string = '';
|
private currentArrowText: string = '';
|
||||||
|
private currentLinkData: any = null;
|
||||||
|
|
||||||
constructor(db: any) {
|
constructor(db: any) {
|
||||||
this.db = db;
|
this.db = db;
|
||||||
@@ -603,7 +604,9 @@ class FlowchartListener implements ParseTreeListener {
|
|||||||
const vertex = styledVertex.vertex();
|
const vertex = styledVertex.vertex();
|
||||||
if (vertex) {
|
if (vertex) {
|
||||||
const idCtx = vertex.idString();
|
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;
|
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)
|
// Handle arrow text (pipe-delimited edge text)
|
||||||
exitArrowText = (ctx: any) => {
|
exitArrowText = (ctx: any) => {
|
||||||
try {
|
try {
|
||||||
|
Reference in New Issue
Block a user