From 9fecdcf563f5fb51978ad3dbcdd0e4d22c7b0e69 Mon Sep 17 00:00:00 2001 From: Michael Griebling Date: Sat, 5 Oct 2024 13:52:35 -0400 Subject: [PATCH] Fix Mac version crashes on TextColor. Need at least v12. --- Package.swift | 2 +- .../MathRender/MTMathAtomFactory.swift | 5 -- Sources/SwiftMath/MathRender/MTMathList.swift | 59 +++++++++--------- .../MathRender/MTMathListBuilder.swift | 14 ++--- .../SwiftMath/MathRender/MTTypesetter.swift | 60 +++++++++---------- 5 files changed, 67 insertions(+), 73 deletions(-) diff --git a/Package.swift b/Package.swift index 96bbbb8..bae8301 100644 --- a/Package.swift +++ b/Package.swift @@ -6,7 +6,7 @@ import PackageDescription let package = Package( name: "SwiftMath", defaultLocalization: "en", - platforms: [.iOS(.v11), .macOS(.v11)], + platforms: [.iOS("11.0"), .macOS("12.0")], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( diff --git a/Sources/SwiftMath/MathRender/MTMathAtomFactory.swift b/Sources/SwiftMath/MathRender/MTMathAtomFactory.swift index 6588b08..8d00415 100644 --- a/Sources/SwiftMath/MathRender/MTMathAtomFactory.swift +++ b/Sources/SwiftMath/MathRender/MTMathAtomFactory.swift @@ -528,11 +528,6 @@ public class MTMathAtomFactory { case "\u{0410}"..."\u{044F}": return MTMathAtom(type: .ordinary, value: chStr) case _ where ch.utf32Char < 0x0021 || ch.utf32Char > 0x007E: -// // allow Chinese characters for testing -// if ((ch.utf32Char >= 0x4E00) && (ch.utf32Char <= 0x9FFF)) { -// // CJK support. But xits-math-cn font only has Chinese characters support. -// return MTMathAtom(type:.ordinary, value:chStr) -// } return nil case "$", "%", "#", "&", "~", "\'", "^", "_", "{", "}", "\\": return nil diff --git a/Sources/SwiftMath/MathRender/MTMathList.swift b/Sources/SwiftMath/MathRender/MTMathList.swift index 70907aa..8c99949 100644 --- a/Sources/SwiftMath/MathRender/MTMathList.swift +++ b/Sources/SwiftMath/MathRender/MTMathList.swift @@ -235,10 +235,10 @@ public class MTMathAtom: NSObject { return MTAccent(self as? MTAccent) case .space: return MTMathSpace(self as? MTMathSpace) - case .color, .textcolor: + case .color: return MTMathColor(self as? MTMathColor) -// case .textcolor: -// return MTMathTextColor(self as? MTMathTextColor) + case .textcolor: + return MTMathTextColor(self as? MTMathTextColor) case .colorBox: return MTMathColorbox(self as? MTMathColorbox) case .table: @@ -684,33 +684,32 @@ public class MTMathColor: MTMathAtom { Note: None of the usual fields of the `MTMathAtom` apply even though this class inherits from `MTMathAtom`. i.e. it is meaningless to have a value in the nucleus, subscript or superscript fields. */ -// FIXME: Removed due to crash -//public class MTMathTextColor: MTMathAtom { -// public var colorString:String="" -// public var innerList:MTMathList? -// -// init(_ color: MTMathTextColor?) { -// super.init(color) -// self.type = .textcolor -// self.colorString = color?.colorString ?? "" -// self.innerList = MTMathList(color?.innerList) -// } -// -// override init() { -// super.init() -// self.type = .textcolor -// } -// -// public override var string: String { -// "\\textcolor{\(self.colorString)}{\(self.innerList!.string)}" -// } -// -// override public var finalized: MTMathAtom { -// let newColor = super.finalized as! MTMathTextColor -// newColor.innerList = newColor.innerList?.finalized -// return newColor -// } -//} +public class MTMathTextColor: MTMathAtom { + public var colorString:String="" + public var innerList:MTMathList? + + init(_ color: MTMathTextColor?) { + super.init(color) + self.type = .textcolor + self.colorString = color?.colorString ?? "" + self.innerList = MTMathList(color?.innerList) + } + + override init() { + super.init() + self.type = .textcolor + } + + public override var string: String { + "\\textcolor{\(self.colorString)}{\(self.innerList!.string)}" + } + + override public var finalized: MTMathAtom { + let newColor = super.finalized as! MTMathTextColor + newColor.innerList = newColor.innerList?.finalized + return newColor + } +} // MARK: - MTMathColorbox /** An atom representing an colorbox element. diff --git a/Sources/SwiftMath/MathRender/MTMathListBuilder.swift b/Sources/SwiftMath/MathRender/MTMathListBuilder.swift index dcea908..3b146c9 100644 --- a/Sources/SwiftMath/MathRender/MTMathListBuilder.swift +++ b/Sources/SwiftMath/MathRender/MTMathListBuilder.swift @@ -587,18 +587,18 @@ public struct MTMathListBuilder { } let table = self.buildTable(env: env, firstList:nil, isRow:false) return table - } else if command == "color" || command == "textcolor" { + } else if command == "color" { // A color command has 2 arguments let mathColor = MTMathColor() mathColor.colorString = self.readColor()! mathColor.innerList = self.buildInternal(true) return mathColor -// } else if command == "textcolor" { -// // A textcolor command has 2 arguments -// let mathColor = MTMathTextColor() -// mathColor.colorString = self.readColor()! -// mathColor.innerList = self.buildInternal(true) -// return mathColor + } else if command == "textcolor" { + // A textcolor command has 2 arguments + let mathColor = MTMathTextColor() + mathColor.colorString = self.readColor()! + mathColor.innerList = self.buildInternal(true) + return mathColor } else if command == "colorbox" { // A color command has 2 arguments let mathColorbox = MTMathColorbox() diff --git a/Sources/SwiftMath/MathRender/MTTypesetter.swift b/Sources/SwiftMath/MathRender/MTTypesetter.swift index 25976e1..609767d 100644 --- a/Sources/SwiftMath/MathRender/MTTypesetter.swift +++ b/Sources/SwiftMath/MathRender/MTTypesetter.swift @@ -500,7 +500,7 @@ class MTTypesetter { // so we skip to the next node. continue - case .color, .textcolor: + case .color: // stash the existing layout if currentLine.length > 0 { self.addDisplayLine() @@ -512,35 +512,35 @@ class MTTypesetter { currentPosition.x += display!.width displayAtoms.append(display!) -// case .textcolor: -// // stash the existing layout -// if currentLine.length > 0 { -// self.addDisplayLine() -// } -// let colorAtom = atom as! MTMathTextColor -// let display = MTTypesetter.createLineForMathList(colorAtom.innerList, font: font, style: style) -// display!.localTextColor = MTColor(fromHexString: colorAtom.colorString) -// -// if prevNode != nil { -// let subDisplay: MTDisplay = display!.subDisplays[0] -// let subDisplayAtom = (subDisplay as? MTCTLineDisplay)!.atoms[0] -// let interElementSpace = self.getInterElementSpace(prevNode!.type, right:subDisplayAtom.type) -// if currentLine.length > 0 { -// if interElementSpace > 0 { -// // add a kerning of that space to the previous character -// currentLine.addAttribute(kCTKernAttributeName as NSAttributedString.Key, -// value:NSNumber(floatLiteral: interElementSpace), -// range:currentLine.mutableString.rangeOfComposedCharacterSequence(at: currentLine.length-1)) -// } -// } else { -// // increase the space -// currentPosition.x += interElementSpace -// } -// } -// -// display!.position = currentPosition -// currentPosition.x += display!.width -// displayAtoms.append(display!) + case .textcolor: + // stash the existing layout + if currentLine.length > 0 { + self.addDisplayLine() + } + let colorAtom = atom as! MTMathTextColor + let display = MTTypesetter.createLineForMathList(colorAtom.innerList, font: font, style: style) + display!.localTextColor = MTColor(fromHexString: colorAtom.colorString) + + if prevNode != nil { + let subDisplay: MTDisplay = display!.subDisplays[0] + let subDisplayAtom = (subDisplay as? MTCTLineDisplay)!.atoms[0] + let interElementSpace = self.getInterElementSpace(prevNode!.type, right:subDisplayAtom.type) + if currentLine.length > 0 { + if interElementSpace > 0 { + // add a kerning of that space to the previous character + currentLine.addAttribute(kCTKernAttributeName as NSAttributedString.Key, + value:NSNumber(floatLiteral: interElementSpace), + range:currentLine.mutableString.rangeOfComposedCharacterSequence(at: currentLine.length-1)) + } + } else { + // increase the space + currentPosition.x += interElementSpace + } + } + + display!.position = currentPosition + currentPosition.x += display!.width + displayAtoms.append(display!) case .colorBox: // stash the existing layout