Skip to content

Commit 45ccfcf

Browse files
committed
Fix parsing block equations with leading/trailing newlines and update tests.
1 parent 48012d2 commit 45ccfcf

File tree

3 files changed

+92
-17
lines changed

3 files changed

+92
-17
lines changed

Sources/LaTeXSwiftUI/Models/Parser.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,28 @@ internal struct Parser {
4949

5050
/// An TeX-style block equation component.
5151
static let tex = EquationComponent(
52-
regex: #/\$\$(.*?)\$\$/#,
52+
regex: #/\$\$\s*(.*?)\s*\$\$/#,
5353
terminatingRegex: #/\$\$/#,
5454
equation: .texEquation,
5555
supportsRecursion: false)
5656

5757
/// A block equation.
5858
static let block = EquationComponent(
59-
regex: #/\\\[(.*?)\\\]/#,
59+
regex: #/\\\[\s*(.*?)\s*\\\]/#,
6060
terminatingRegex: #/\\\]/#,
6161
equation: .blockEquation,
6262
supportsRecursion: false)
6363

6464
/// A named equation component.
6565
static let named = EquationComponent(
66-
regex: #/\\begin{equation}(.*?)\\end{equation}/#,
66+
regex: #/\\begin{equation}\s*(.*?)\s*\\end{equation}/#,
6767
terminatingRegex: #/\\end{equation}/#,
6868
equation: .namedEquation,
6969
supportsRecursion: true)
7070

7171
/// A named no number equation component.
7272
static let namedNoNumber = EquationComponent(
73-
regex: #/\\begin{equation\*}(.*?)\\end{equation\*}/#,
73+
regex: #/\\begin{equation\*}\s*(.*?)\s*\\end{equation\*}/#,
7474
terminatingRegex: #/\\end{equation\*}/#,
7575
equation: .namedNoNumberEquation,
7676
supportsRecursion: true)

Tests/LaTeXSwiftUITests/LaTeXSwiftUITests.swift renamed to Tests/LaTeXSwiftUITests/GeometryTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import MathJaxSwift
22
import XCTest
33
@testable import LaTeXSwiftUI
44

5-
final class LaTeXSwiftUITests: XCTestCase {
5+
final class GeometryTests: XCTestCase {
66

77
func testSVGGeometry_parseAlignment() {
88
let input = "\"vertical-align: -1.602ex;\""

Tests/LaTeXSwiftUITests/ParserTests.swift

Lines changed: 87 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,30 @@ final class ParserTests: XCTestCase {
9292
assertComponent(components, 0, input, .text)
9393
}
9494

95+
func testParseDoubleDollarOnly_LeadingLineBreak() {
96+
let equation = "\nf(x)=5x+2"
97+
let input = "$$\(equation)$$"
98+
let components = Parser.parse(input)
99+
XCTAssertEqual(components.count, 1)
100+
assertComponent(components, 0, equation, .texEquation)
101+
}
102+
103+
func testParseDoubleDollarOnly_TrailingLineBreak() {
104+
let equation = "f(x)=5x+2\n"
105+
let input = "$$\(equation)$$"
106+
let components = Parser.parse(input)
107+
XCTAssertEqual(components.count, 1)
108+
assertComponent(components, 0, equation, .texEquation)
109+
}
110+
111+
func testParseDoubleDollarOnly_Whitespace() {
112+
let equation = " \nf(x)=5x+2\n "
113+
let input = "$$\(equation)$$"
114+
let components = Parser.parse(input)
115+
XCTAssertEqual(components.count, 1)
116+
assertComponent(components, 0, equation, .texEquation)
117+
}
118+
95119
func testParseBracketsOnly() {
96120
let input = "\\[\\TeX\\]"
97121
let components = Parser.parse(input)
@@ -122,11 +146,28 @@ final class ParserTests: XCTestCase {
122146
assertComponent(components, 0, input, .text)
123147
}
124148

125-
func testParseBracketsOnly_LineBreak() {
126-
let input = "Hello, \\[\\TeX\n\\\\]!"
149+
func testParseBracketsOnly_LeadingLineBreak() {
150+
let equation = "\n\\TeX"
151+
let input = "Hello, \\[\(equation)\\]!"
127152
let components = Parser.parse(input)
128-
XCTAssertEqual(components.count, 1)
129-
assertComponent(components, 0, input, .text)
153+
XCTAssertEqual(components.count, 3)
154+
assertComponent(components, 1, equation, .blockEquation)
155+
}
156+
157+
func testParseBracketsOnly_TrailingLineBreak() {
158+
let equation = "\\TeX\n"
159+
let input = "Hello, \\[\(equation)\\]!"
160+
let components = Parser.parse(input)
161+
XCTAssertEqual(components.count, 3)
162+
assertComponent(components, 1, equation, .blockEquation)
163+
}
164+
165+
func testParseBracketsOnly_Whitespace() {
166+
let equation = " \n\\TeX\n "
167+
let input = "Hello, \\[\(equation)\\]!"
168+
let components = Parser.parse(input)
169+
XCTAssertEqual(components.count, 3)
170+
assertComponent(components, 1, equation, .blockEquation)
130171
}
131172

132173
func testParseBeginEndOnly() {
@@ -159,11 +200,28 @@ final class ParserTests: XCTestCase {
159200
assertComponent(components, 0, input, .text)
160201
}
161202

162-
func testParseBeginEndOnly_LineBreak() {
163-
let input = "Hello, \\begin{equation}\\TeX\n\\\\end{equation}!"
203+
func testParseBeginEndOnly_LeadingLineBreak() {
204+
let equation = "\n\\TeX"
205+
let input = "Hello, \\begin{equation}\(equation)\\end{equation}!"
164206
let components = Parser.parse(input)
165-
XCTAssertEqual(components.count, 1)
166-
assertComponent(components, 0, input, .text)
207+
XCTAssertEqual(components.count, 3)
208+
assertComponent(components, 1, equation, .namedEquation)
209+
}
210+
211+
func testParseBeginEndOnly_TrailingLineBreak() {
212+
let equation = "\\TeX\n"
213+
let input = "Hello, \\begin{equation}\(equation)\\end{equation}!"
214+
let components = Parser.parse(input)
215+
XCTAssertEqual(components.count, 3)
216+
assertComponent(components, 1, equation, .namedEquation)
217+
}
218+
219+
func testParseBeginEndOnly_Whitespace() {
220+
let equation = " \n\\TeX\n "
221+
let input = "Hello, \\begin{equation}\(equation)\\end{equation}!"
222+
let components = Parser.parse(input)
223+
XCTAssertEqual(components.count, 3)
224+
assertComponent(components, 1, equation, .namedEquation)
167225
}
168226

169227
func testParseBeginEndStarOnly() {
@@ -196,11 +254,28 @@ final class ParserTests: XCTestCase {
196254
assertComponent(components, 0, input, .text)
197255
}
198256

199-
func testParseBeginEndStarOnly_LineBreak() {
200-
let input = "Hello, \\begin{equation*}\\TeX\n\\\\end{equation*}!"
257+
func testParseBeginEndStarOnly_LeadingLineBreak() {
258+
let equation = "\n\\TeX"
259+
let input = "Hello, \\begin{equation*}\(equation)\\end{equation*}!"
201260
let components = Parser.parse(input)
202-
XCTAssertEqual(components.count, 1)
203-
assertComponent(components, 0, input, .text)
261+
XCTAssertEqual(components.count, 3)
262+
assertComponent(components, 1, equation, .namedNoNumberEquation)
263+
}
264+
265+
func testParseBeginEndStarOnly_TrailingLineBreak() {
266+
let equation = "\\TeX\n"
267+
let input = "Hello, \\begin{equation*}\(equation)\\end{equation*}!"
268+
let components = Parser.parse(input)
269+
XCTAssertEqual(components.count, 3)
270+
assertComponent(components, 1, equation, .namedNoNumberEquation)
271+
}
272+
273+
func testParseBeginEndStarOnly_Whitespace() {
274+
let equation = " \n\\TeX\n "
275+
let input = "Hello, \\begin{equation*}\(equation)\\end{equation*}!"
276+
let components = Parser.parse(input)
277+
XCTAssertEqual(components.count, 3)
278+
assertComponent(components, 1, equation, .namedNoNumberEquation)
204279
}
205280

206281
}

0 commit comments

Comments
 (0)