on master help sign in
1 file changed+59−3
since splitsnapshots
unifiedsplit
Mathdown/Mathdown/main.swift+59−3
Mathdown/Mathdown/main.swift+59−3
@@ -149,7 +149,63 @@ func process(element: Element) -> String {
149149 }
150150 }
151151
152−
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+ }
153209 func process(line: Substring) {
154210 out.append("<mtr>")
155211 for element in line.split(
@@ -159,7 +215,7 @@ func process(element: Element) -> String {
159215 out.append("<mtd><mspace height=\"0.8em\"/></mtd>")
160216 default:
161217 let eStyle = element.style
162− out.append("<mtd><mn mathvariant=\"\(eStyle.rawValue)\" height=\"0.8em\">\(element.trimmingStyleCharecters())</mn></mtd>")
218+ out.append("<mtd>\(process(lineElement: Substring(element.trimmingStyleCharecters()), withAttributes: "height=\"0.8em\"", style: eStyle))</mtd>")
163219 }
164220 }
165221 out.append("</mtr>")
@@ -223,7 +279,7 @@ func process(element: Element) -> String {
223279 case let l where arrows.contains(l.first!.unicodeScalars.first!):
224280 out.append("<mtr><mtd><mo>\(line)</mo></mtd></mtr>")
225281 default:
226− out.append("<mtr><mtd>\(small ? "<mstyle scriptlevel=\"1\">" : "")<mo>\(line)</mo>\(small ? "</mstyle>" : "")</mtd></mtr>")
282+ out.append("<mtr><mtd>\(small ? "<mstyle scriptlevel=\"1\">" : "")\(process(lineElement: Substring(line)))\(small ? "</mstyle>" : "")</mtd></mtr>")
227283 }
228284 }
229285 first = false