72 lines
2.0 KiB
Swift
72 lines
2.0 KiB
Swift
import Foundation
|
|
|
|
extension Math {
|
|
final class Fraction: Atom {
|
|
var hasRule: Bool
|
|
var leftDelimiter: String
|
|
var rightDelimiter: String
|
|
var numerator: AtomList?
|
|
var denominator: AtomList?
|
|
|
|
var isContinuedFraction: Bool = false
|
|
var alignment: String // "l", "r", "c" for left, right, center
|
|
|
|
override var description: String {
|
|
[
|
|
hasRule ? "\\frac" : "\\atop",
|
|
leftDelimiter.isEmpty ? nil : "[\(leftDelimiter)]",
|
|
rightDelimiter.isEmpty ? nil : "[\(rightDelimiter)]",
|
|
"{\(numerator?.description ?? "placeholder")}",
|
|
"{\(denominator?.description ?? "placeholder")}",
|
|
superscript.map { "^{\($0)}" },
|
|
`subscript`.map { "_{\($0)}" },
|
|
]
|
|
.compactMap(\.self)
|
|
.joined()
|
|
}
|
|
|
|
override var finalized: Math.Atom {
|
|
let finalized = super.finalized
|
|
|
|
if let fraction = finalized as? Fraction {
|
|
fraction.numerator = fraction.numerator?.finalized
|
|
fraction.denominator = fraction.denominator?.finalized
|
|
}
|
|
|
|
return finalized
|
|
}
|
|
|
|
init(_ fraction: Fraction) {
|
|
self.hasRule = fraction.hasRule
|
|
self.leftDelimiter = fraction.leftDelimiter
|
|
self.rightDelimiter = fraction.rightDelimiter
|
|
self.numerator = fraction.numerator.map { AtomList($0) }
|
|
self.denominator = fraction.denominator.map { AtomList($0) }
|
|
self.isContinuedFraction = fraction.isContinuedFraction
|
|
self.alignment = fraction.alignment
|
|
|
|
super.init(fraction)
|
|
}
|
|
|
|
init(
|
|
hasRule: Bool = true,
|
|
leftDelimiter: String = "",
|
|
rightDelimiter: String = "",
|
|
numerator: AtomList? = nil,
|
|
denominator: AtomList? = nil,
|
|
isContinuedFraction: Bool = false,
|
|
alignment: String = "c"
|
|
) {
|
|
self.hasRule = hasRule
|
|
self.leftDelimiter = leftDelimiter
|
|
self.rightDelimiter = rightDelimiter
|
|
self.numerator = numerator
|
|
self.denominator = denominator
|
|
self.isContinuedFraction = isContinuedFraction
|
|
self.alignment = alignment
|
|
|
|
super.init(type: .fraction)
|
|
}
|
|
}
|
|
}
|