Skip to content

Commit

Permalink
Fix parsing block equations with leading/trailing newlines and update…
Browse files Browse the repository at this point in the history
… tests.
  • Loading branch information
colinc86 committed May 29, 2023
1 parent 48012d2 commit 45ccfcf
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 17 deletions.
8 changes: 4 additions & 4 deletions Sources/LaTeXSwiftUI/Models/Parser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,28 +49,28 @@ internal struct Parser {

/// An TeX-style block equation component.
static let tex = EquationComponent(
regex: #/\$\$(.*?)\$\$/#,
regex: #/\$\$\s*(.*?)\s*\$\$/#,
terminatingRegex: #/\$\$/#,
equation: .texEquation,
supportsRecursion: false)

/// A block equation.
static let block = EquationComponent(
regex: #/\\\[(.*?)\\\]/#,
regex: #/\\\[\s*(.*?)\s*\\\]/#,
terminatingRegex: #/\\\]/#,
equation: .blockEquation,
supportsRecursion: false)

/// A named equation component.
static let named = EquationComponent(
regex: #/\\begin{equation}(.*?)\\end{equation}/#,
regex: #/\\begin{equation}\s*(.*?)\s*\\end{equation}/#,
terminatingRegex: #/\\end{equation}/#,
equation: .namedEquation,
supportsRecursion: true)

/// A named no number equation component.
static let namedNoNumber = EquationComponent(
regex: #/\\begin{equation\*}(.*?)\\end{equation\*}/#,
regex: #/\\begin{equation\*}\s*(.*?)\s*\\end{equation\*}/#,
terminatingRegex: #/\\end{equation\*}/#,
equation: .namedNoNumberEquation,
supportsRecursion: true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import MathJaxSwift
import XCTest
@testable import LaTeXSwiftUI

final class LaTeXSwiftUITests: XCTestCase {
final class GeometryTests: XCTestCase {

func testSVGGeometry_parseAlignment() {
let input = "\"vertical-align: -1.602ex;\""
Expand Down
99 changes: 87 additions & 12 deletions Tests/LaTeXSwiftUITests/ParserTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,30 @@ final class ParserTests: XCTestCase {
assertComponent(components, 0, input, .text)
}

func testParseDoubleDollarOnly_LeadingLineBreak() {
let equation = "\nf(x)=5x+2"
let input = "$$\(equation)$$"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 1)
assertComponent(components, 0, equation, .texEquation)
}

func testParseDoubleDollarOnly_TrailingLineBreak() {
let equation = "f(x)=5x+2\n"
let input = "$$\(equation)$$"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 1)
assertComponent(components, 0, equation, .texEquation)
}

func testParseDoubleDollarOnly_Whitespace() {
let equation = " \nf(x)=5x+2\n "
let input = "$$\(equation)$$"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 1)
assertComponent(components, 0, equation, .texEquation)
}

func testParseBracketsOnly() {
let input = "\\[\\TeX\\]"
let components = Parser.parse(input)
Expand Down Expand Up @@ -122,11 +146,28 @@ final class ParserTests: XCTestCase {
assertComponent(components, 0, input, .text)
}

func testParseBracketsOnly_LineBreak() {
let input = "Hello, \\[\\TeX\n\\\\]!"
func testParseBracketsOnly_LeadingLineBreak() {
let equation = "\n\\TeX"
let input = "Hello, \\[\(equation)\\]!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 1)
assertComponent(components, 0, input, .text)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .blockEquation)
}

func testParseBracketsOnly_TrailingLineBreak() {
let equation = "\\TeX\n"
let input = "Hello, \\[\(equation)\\]!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .blockEquation)
}

func testParseBracketsOnly_Whitespace() {
let equation = " \n\\TeX\n "
let input = "Hello, \\[\(equation)\\]!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .blockEquation)
}

func testParseBeginEndOnly() {
Expand Down Expand Up @@ -159,11 +200,28 @@ final class ParserTests: XCTestCase {
assertComponent(components, 0, input, .text)
}

func testParseBeginEndOnly_LineBreak() {
let input = "Hello, \\begin{equation}\\TeX\n\\\\end{equation}!"
func testParseBeginEndOnly_LeadingLineBreak() {
let equation = "\n\\TeX"
let input = "Hello, \\begin{equation}\(equation)\\end{equation}!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 1)
assertComponent(components, 0, input, .text)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .namedEquation)
}

func testParseBeginEndOnly_TrailingLineBreak() {
let equation = "\\TeX\n"
let input = "Hello, \\begin{equation}\(equation)\\end{equation}!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .namedEquation)
}

func testParseBeginEndOnly_Whitespace() {
let equation = " \n\\TeX\n "
let input = "Hello, \\begin{equation}\(equation)\\end{equation}!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .namedEquation)
}

func testParseBeginEndStarOnly() {
Expand Down Expand Up @@ -196,11 +254,28 @@ final class ParserTests: XCTestCase {
assertComponent(components, 0, input, .text)
}

func testParseBeginEndStarOnly_LineBreak() {
let input = "Hello, \\begin{equation*}\\TeX\n\\\\end{equation*}!"
func testParseBeginEndStarOnly_LeadingLineBreak() {
let equation = "\n\\TeX"
let input = "Hello, \\begin{equation*}\(equation)\\end{equation*}!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 1)
assertComponent(components, 0, input, .text)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .namedNoNumberEquation)
}

func testParseBeginEndStarOnly_TrailingLineBreak() {
let equation = "\\TeX\n"
let input = "Hello, \\begin{equation*}\(equation)\\end{equation*}!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .namedNoNumberEquation)
}

func testParseBeginEndStarOnly_Whitespace() {
let equation = " \n\\TeX\n "
let input = "Hello, \\begin{equation*}\(equation)\\end{equation*}!"
let components = Parser.parse(input)
XCTAssertEqual(components.count, 3)
assertComponent(components, 1, equation, .namedNoNumberEquation)
}

}

0 comments on commit 45ccfcf

Please sign in to comment.