@@ -11,12 +11,15 @@ import Foundation
11enum BracketStyle {
11enum BracketStyle {
12 case square
12 case square
13 case round
13 case round
14 var opening: Character {
15 var opening: Character {
15 switch self {
16 switch self {
16 case .round:
17 case .round:
17 return "("
18 return "("
18 case .square:
19 case .square:
19 return "["
20 return "["
22 var closing: Character {
25 var closing: Character {
@@ -25,6 +28,8 @@ enum BracketStyle {
25 return ")"
28 return ")"
26 case .square:
29 case .square:
27 return "]"
30 return "]"
@@ -60,6 +65,8 @@ default:
60 style = .square
65 style = .square
61 case "-r":
66 case "-r":
62 style = .round
67 style = .round
@@ -96,34 +103,75 @@ extension String.SubSequence {
96func process(mth: String) -> String {
103func process(mth: String) -> String {
97 let whitespace = CharacterSet.whitespaces
104 let whitespace = CharacterSet.whitespaces
106+ var seperated = false
107+ var afterSeparator: [String.SubSequence] = []
99 var out = "<math>"
109 var out = "<math>"
100 let lines = mth.split(separator: "\n", omittingEmptySubsequences: false)
110 let lines = mth.split(separator: "\n", omittingEmptySubsequences: false)
101 .map {$0.trimmingCharacters(in: .whitespaces)}
111 .map {$0.trimmingCharacters(in: .whitespaces)}
102 var insideMatrix = false
112 var insideMatrix = false
113+ func pureProcess(line: Substring) {
103− for line in lines {
115+ for element in line.split(
116+ whereSeparator: {c in whitespace.contains(c.unicodeScalars.first!)}) {
119+ out.append("<mtd><mspace height=\"0.8em\"/></mtd>")
121+ let eStyle = element.style
122+ out.append("<mtd><mn mathvariant=\"\(eStyle.rawValue)\" height=\"0.8em\">\(element.trimmingStyleCharecters())</mn></mtd>")
125+ out.append("</mtr>")
127+ func checkInsideMatrix() {
130+ out.append("</mtable><mo>|</mo><mtable>")
131+ for line in afterSeparator {
132+ pureProcess(line: line)
135+ out.append("</mtable><mo>\(style.closing)</mo></mrow>")
136+ insideMatrix = false
141+ func process(line: String.SubSequence) {
104 switch line {
142 switch line {
106− if insideMatrix {
144+ checkInsideMatrix()
107− out.append("</mtable><mo>\(style.closing)</mo></mrow>")
108− insideMatrix = false
111 if !insideMatrix {
146 if !insideMatrix {
112 out.append("<mrow><mo>\(style.opening)</mo><mtable>")
147 out.append("<mrow><mo>\(style.opening)</mo><mtable>")
113 insideMatrix = true
148 insideMatrix = true
115− out.append("<mtr>")
150+ pureProcess(line: line)
116− for element in line.split(
117− whereSeparator: {c in whitespace.contains(c.unicodeScalars.first!)}) {
118− let eStyle = element.style
119− out.append("<mtd><mn mathvariant=\"\(eStyle.rawValue)\">\(element.trimmingStyleCharecters())</mn></mtd>")
121− out.append("</mtr>")
124− if insideMatrix {
155+ if !insideMatrix {
125− out.append("</mtable><mo>\(style.closing)</mo></mrow>")
156+ if lines.first?.contains("|") == true {
161+ process(line: Substring(line))
162+ } else if seperated {
163+ let split = line.split(separator: "|", maxSplits: 1, omittingEmptySubsequences: false)
164+ if split.count != 2 {
165+ print("Inconsistent syntax")
168+ process(line: split[0])
169+ afterSeparator.append(split[1])
171+ process(line: Substring(line))
127 out.append("</math>")
175 out.append("</math>")
128 return out
176 return out