@@ -149,63 +149,7 @@ func process(element: Element) -> String {
149149 }
150150 }
151151
152− func process(lineElement: Substring, withAttributes attributes: String = "", style: ElementStyle = .none) -> Substring {
153− func extractNextElement(from line: Substring) -> (element: Substring, left: Substring) {
154− if line.first != "(" {
155− var i = line.startIndex
156− var el: Substring = ""
157− while i < line.endIndex && CharacterSet.alphanumerics.contains(line[i].unicodeScalars.first!) {
158− el.append(line[i])
159− i = line.index(after: i)
160− }
161− return (el, line[i...])
162− } else {
163− var brackets = 0
164− var i = line.startIndex
165− var el: Substring = ""
166− while i < line.endIndex {
167− switch el[i] {
168− case "(":
169− brackets += 1
170− case ")":
171− brackets -= 1
172− default:
173− break
174− }
175− i = line.index(after: i)
176− if brackets == 0 {
177− break
178− }
179− el.append(el[i])
180− }
181− if brackets != 0 {
182− print("Mismatched brackets")
183− exit(0)
184− }
185− return (el.dropFirst(), line[i...])
186− }
187− }
188− var i = lineElement.startIndex
189− while i < lineElement.endIndex {
190− switch lineElement[i] {
191− case "^":
192− let parts = extractNextElement(from: lineElement[lineElement.index(after: i)...])
193− return "<mo mathvariant=\"\(style.rawValue)\" \(attributes)>\(lineElement[..<i].filter({$0 != "\\"}))</mo>" + "<msup><mo></mo><mn>\(parts.element)</mn></msup>" + process(lineElement: parts.left, withAttributes: attributes, style: style)
194− case "!":
195− let parts = extractNextElement(from: lineElement[lineElement.index(after: i)...])
196− return "<mo mathvariant=\"\(style.rawValue)\" \(attributes)>\(lineElement[..<i].filter({$0 != "\\"}))</mo>" + "<mover accent=\"true\"><mrow><mo>\(parts.element)</mo></mrow><mo>_</mo></mover>" + process(lineElement: parts.left, withAttributes: attributes, style: style)
197− case "\\":
198− i = lineElement.index(after: i)
199− case "/":
200− let parts = extractNextElement(from: lineElement[lineElement.index(after: i)...])
201− return "<mo mathvariant=\"\(style.rawValue)\" \(attributes)>\(lineElement[..<i].filter({$0 != "\\"}))</mo>" + "<msub><mo></mo><mn>\(parts.element)</mn></msub>" + process(lineElement: parts.left, withAttributes: attributes, style: style)
202− default:
203− break
204− }
205− i = lineElement.index(after: i)
206− }
207− return Substring("<mo mathvariant=\"\(style.rawValue)\" \(attributes)>\(lineElement.filter({$0 != "\\"}))</mo>")
208− }
152+
209153 func process(line: Substring) {
210154 out.append("<mtr>")
211155 for element in line.split(
@@ -215,7 +159,7 @@ func process(element: Element) -> String {
215159 out.append("<mtd><mspace height=\"0.8em\"/></mtd>")
216160 default:
217161 let eStyle = element.style
218− out.append("<mtd>\(process(lineElement: Substring(element.trimmingStyleCharecters()), withAttributes: "height=\"0.8em\"", style: eStyle))</mtd>")
162+ out.append("<mtd><mn mathvariant=\"\(eStyle.rawValue)\" height=\"0.8em\">\(element.trimmingStyleCharecters())</mn></mtd>")
219163 }
220164 }
221165 out.append("</mtr>")
@@ -266,10 +210,15 @@ func process(element: Element) -> String {
266210 out.append("\n\n<math><mtable>")
267211 break // TODO: Figure out what to do
268212 case "[":
269− out.append("<mtr><mtd><mrow><mo stretchy=\"true\">\(style.opening)</mo><mtable>")
270− inMatrix = true
271− first = true
272− continue
213+ if !inMatrix {
214+ out.append("<mtr><mtd><mrow><mo stretchy=\"true\">\(style.opening)</mo><mtable>")
215+ inMatrix = true
216+ first = true
217+ continue
218+ } else {
219+ print("Inconsistent syntax. Opening a matrix from within a matrix.")
220+ exit(0)
221+ }
273222 case "":
274223 if !first {
275224 out.append("</mtable><mtable>")
@@ -279,7 +228,7 @@ func process(element: Element) -> String {
279228 case let l where arrows.contains(l.first!.unicodeScalars.first!):
280229 out.append("<mtr><mtd><mo>\(line)</mo></mtd></mtr>")
281230 default:
282− out.append("<mtr><mtd>\(small ? "<mstyle scriptlevel=\"1\">" : "")\(process(lineElement: Substring(line)))\(small ? "</mstyle>" : "")</mtd></mtr>")
231+ out.append("<mtr><mtd>\(small ? "<mstyle scriptlevel=\"1\">" : "")<mo>\(line)</mo>\(small ? "</mstyle>" : "")</mtd></mtr>")
283232 }
284233 }
285234 first = false