diff options
| author | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-07-09 08:34:19 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-07-09 08:34:19 +0200 |
| commit | 1ec7f2c6deb64f5b13b32fae2bf74ae2d8aaaabb (patch) | |
| tree | 47b6addedf0bdb18d35774e9b027d07074929d4a /Map/Business/WmapParser/Parser.swift | |
| parent | 6926feead1a7fadb7f5f974996bef8c30b3bfdbe (diff) | |
Account for CRLF/CR/LF. Lex note text. Use Wmap Parser for renderer.
Diffstat (limited to 'Map/Business/WmapParser/Parser.swift')
| -rw-r--r-- | Map/Business/WmapParser/Parser.swift | 87 |
1 files changed, 45 insertions, 42 deletions
diff --git a/Map/Business/WmapParser/Parser.swift b/Map/Business/WmapParser/Parser.swift index f04998c..9418263 100644 --- a/Map/Business/WmapParser/Parser.swift +++ b/Map/Business/WmapParser/Parser.swift @@ -56,15 +56,15 @@ extension Wmap { case .vertexLabel: return try parseVertexOrEdge() case .noteKeyword: - return try parseNote() + return .note(try parseNote()) case .stageNumber: - return try parseStage() + return .stage(try parseStage()) case .groupKeyword: - return try parseGroup() + return .group(try parseGroup()) case .inertiaKeyword: - return try parseInertia() + return .inertia(try parseInertia()) case .evolutionKeyword: - return try parseEvolution() + return .evolution(try parseEvolution()) case .error: // Error tokens should cause the line to be ignored throw ParseError.invalidLine @@ -97,19 +97,20 @@ extension Wmap { vertexLabelMap[secondLabel.lowercased()] = secondLabel advance() - return Edge( - from: firstLabel, - to: secondLabel, - isDirected: isDirected, - position: startPos, - range: SourceRange( - start: startPos, end: endPos, - stringRange: firstLabelRange.stringRange - .lowerBound..<secondLabelRange.stringRange.upperBound), - fromLabelRange: firstLabelRange, - edgeTypeRange: edgeTypeRange, - toLabelRange: secondLabelRange - ) + return .edge( + Edge( + from: firstLabel, + to: secondLabel, + isDirected: isDirected, + position: startPos, + range: SourceRange( + start: startPos, end: endPos, + stringRange: firstLabelRange.stringRange + .lowerBound..<secondLabelRange.stringRange.upperBound), + fromLabelRange: firstLabelRange, + edgeTypeRange: edgeTypeRange, + toLabelRange: secondLabelRange + )) } else { // Parse vertex let (coordinates, coordRanges) = try parsePositionWithRanges() @@ -117,24 +118,25 @@ extension Wmap { let endPos = shapeRange?.end ?? coordRanges.rightParen.end - return Vertex( - label: firstLabel, - position: startPos, - coordinates: coordinates, - shape: shape, - range: SourceRange( - start: startPos, end: endPos, - stringRange: firstLabelRange.stringRange - .lowerBound..<(shapeRange?.stringRange.upperBound - ?? coordRanges.rightParen.stringRange.upperBound)), - labelRange: firstLabelRange, - leftParenRange: coordRanges.leftParen, - xCoordRange: coordRanges.xCoord, - commaRange: coordRanges.comma, - yCoordRange: coordRanges.yCoord, - rightParenRange: coordRanges.rightParen, - shapeRange: shapeRange - ) + return .vertex( + Vertex( + label: firstLabel, + position: startPos, + coordinates: coordinates, + shape: shape, + range: SourceRange( + start: startPos, end: endPos, + stringRange: firstLabelRange.stringRange + .lowerBound..<(shapeRange?.stringRange.upperBound + ?? coordRanges.rightParen.stringRange.upperBound)), + labelRange: firstLabelRange, + leftParenRange: coordRanges.leftParen, + xCoordRange: coordRanges.xCoord, + commaRange: coordRanges.comma, + yCoordRange: coordRanges.yCoord, + rightParenRange: coordRanges.rightParen, + shapeRange: shapeRange + )) } } @@ -145,12 +147,13 @@ extension Wmap { let (coordinates, coordRanges) = try parsePositionWithRanges() - // For notes, we need to scan the remaining text on the line - let textToken = lexer.scanText() - let text = textToken.value - let textRange = makeSourceRange(from: textToken) - let endPos = textToken.position - currentToken = lexer.nextToken() // Update current token after scanning text + guard currentToken.type == .text else { + throw ParseError.expectedText(actual: currentToken) + } + let text = currentToken.value + let textRange = makeSourceRange(from: currentToken) + let endPos = currentToken.position + advance() return Note( coordinates: coordinates, |