Skip to content

Commit d294b14

Browse files
committed
Merge branch 'dev'
* dev: fix: color of ruby annotation only generate furigana for kanji fix: crash while generating kanji annotation
2 parents 18c88be + 5acdf82 commit d294b14

File tree

5 files changed

+20
-12
lines changed

5 files changed

+20
-12
lines changed

LyricsX/Supporting Files/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<key>CFBundleShortVersionString</key>
2020
<string>1.4.3</string>
2121
<key>CFBundleVersion</key>
22-
<string>1973</string>
22+
<string>1984</string>
2323
<key>Fabric</key>
2424
<dict>
2525
<key>APIKey</key>

LyricsX/Utility/CFExtension.swift

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,12 @@ extension CFStringTokenizer {
9595
func currentFuriganaAnnotation(in string: NSString) -> (NSString, NSRange)? {
9696
let range = currentTokenRange()
9797
let tokenStr = string.substring(with: range)
98-
guard let latin = currentTokenAttribute(.latinTranscription),
98+
guard tokenStr.unicodeScalars.contains(where: CharacterSet.kanji.contains),
99+
let latin = currentTokenAttribute(.latinTranscription),
99100
let hiragana = latin.applyingTransform(.latinToHiragana, reverse: false),
100-
let katakana = latin.applyingTransform(.hiraganaToKatakana, reverse: false),
101-
!katakana.isEmpty,
102-
katakana != tokenStr,
103-
hiragana != tokenStr else {
101+
let (rangeToAnnotate, rangeInAnnotation) = rangeOfUncommonContent(tokenStr, hiragana) else {
104102
return nil
105103
}
106-
let (rangeToAnnotate, rangeInAnnotation) = rangeOfUncommonContent(tokenStr, hiragana)!
107104
let annotation = String(hiragana[rangeInAnnotation]) as NSString
108105
var nsrangeToAnnotate = NSRange(rangeToAnnotate, in: tokenStr)
109106
nsrangeToAnnotate.location += range.location
@@ -112,7 +109,7 @@ extension CFStringTokenizer {
112109
}
113110

114111
private func rangeOfUncommonContent(_ s1: String, _ s2: String) -> (Range<String.Index>, Range<String.Index>)? {
115-
guard s1 != s2 else {
112+
guard s1 != s2, !s1.isEmpty, !s2.isEmpty else {
116113
return nil
117114
}
118115
var (l1, l2) = (s1.startIndex, s2.startIndex)
@@ -125,15 +122,16 @@ private func rangeOfUncommonContent(_ s1: String, _ s2: String) -> (Range<String
125122
}
126123

127124
var (r1, r2) = (s1.endIndex, s2.endIndex)
128-
while s1[r1] == s2[r2] {
125+
repeat {
129126
guard let nr1 = s1.index(r1, offsetBy: -1, limitedBy: s1.startIndex),
130127
let nr2 = s2.index(r2, offsetBy: -1, limitedBy: s2.startIndex) else {
131128
break
132129
}
133130
(r1, r2) = (nr1, nr2)
134-
}
131+
} while s1[r1] == s2[r2]
132+
135133
let range1 = (l1...r1).relative(to: s1.indices)
136-
let range2 = (l2...r2).relative(to: s1.indices)
134+
let range2 = (l2...r2).relative(to: s2.indices)
137135
return (range1, range2)
138136
}
139137

LyricsX/Utility/CTExtension.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ extension NSAttributedStringKey {
2929

3030
/// kCTRubyAnnotationSizeFactorAttributeName
3131
static let rubyAnnotationSizeFactor = NSAttributedStringKey("CTRubyAnnotationSizeFactor")
32+
33+
static let ctForegroundColor = kCTForegroundColorAttributeName as NSAttributedStringKey
3234
}
3335

3436
extension CTRubyAnnotation {

LyricsX/Utility/StdExtension.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,11 @@ extension NSAttributedString {
9494
return NSRange(location: 0, length: length)
9595
}
9696
}
97+
98+
extension CharacterSet {
99+
100+
static let hiragana = CharacterSet(charactersIn: "\u{3040}"..<"\u{30a0}")
101+
static let katakana = CharacterSet(charactersIn: "\u{30a0}"..<"\u{3100}")
102+
static let kana = CharacterSet(charactersIn: "\u{3040}"..<"\u{3100}")
103+
static let kanji = CharacterSet(charactersIn: "\u{4e00}"..<"\u{9fc0}")
104+
}

LyricsX/View/KaraokeLabel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class KaraokeLabel: NSTextField {
8989
guard shouldDrawFurigana else { continue }
9090
if let (furigana, range) = tokenizer.currentFuriganaAnnotation(in: string) {
9191
var attr: [NSAttributedStringKey: Any] = [.rubyAnnotationSizeFactor: 0.5]
92-
attr[.foregroundColor] = textColor // Set ruby text color but it seems doesn't work.
92+
attr[.ctForegroundColor] = textColor
9393
let annotation = CTRubyAnnotation.create(furigana, attributes: attr)
9494
attrString.addAttribute(.rubyAnnotation, value: annotation, range: range)
9595
}

0 commit comments

Comments
 (0)