mirror of
https://github.com/apple/swift-foundation.git
synced 2025-05-24 14:46:13 +08:00
* rdar://107955097 (FoundationPreview: Batch move string API (continued)) - Move localized uppercase and lowercase to FoundationLocalization - if-def out of CharacterSet from FoundationPreview. It's not implemented at all there, and having a no-op stub is misleading * rdar://107955097 (FoundationPreview: Batch move string API (continued)) - Move components separated by string and range of string functions * rdar://107955097 (FoundationPreview: Batch move string API (continued)) Enable snake case options for JSON encoder and decoder. We haven't been able to enable this option because it needed `CharacterSet`, which hasn't been properly implemented for FoundationPreview. Now that we have `BuiltInUnicodeScalarSet`, which mirrors `CharacterSet`, we can switch to that and enable the options. * rdar://107955097 (FoundationPreview: Batch move string API (continued)) - Move `StringProtocol.lineRange(for:)` and `paragraphRange(for:)` to FoundationEssentials - Rename String+Regex.swift to RegexPatternCache.swift - Consolidate extensions on various String family members and remove one redundant swift file --------- Co-authored-by: I-Ting Tina Liu <iting_liu@apple.com>
74 lines
2.3 KiB
Swift
74 lines
2.3 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2022 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if FOUNDATION_FRAMEWORK
|
|
@_spi(_Unicode) import Swift
|
|
@_implementationOnly import CoreFoundation_Private.CFString
|
|
#endif // FOUNDATION_FRAMEWORK
|
|
|
|
extension UnicodeScalar {
|
|
func _toHalfWidth() -> Self {
|
|
#if FOUNDATION_FRAMEWORK // TODO: Implement `CFUniCharCompatibilityDecompose` in Swift
|
|
if value >= 0xFF00 && value < 0xFFEF {
|
|
var halfWidth = value
|
|
CFUniCharCompatibilityDecompose(&halfWidth, 1, 1)
|
|
return UnicodeScalar(halfWidth)!
|
|
} else {
|
|
return self
|
|
}
|
|
#else
|
|
fatalError("_toHalfWidth is not implemented yet")
|
|
#endif
|
|
}
|
|
|
|
var _isGraphemeExtend: Bool {
|
|
return BuiltInUnicodeScalarSet.graphemeExtends.contains(self)
|
|
}
|
|
|
|
var _isCanonicalDecomposable: Bool {
|
|
return BuiltInUnicodeScalarSet.canonicalDecomposables.contains(self)
|
|
}
|
|
|
|
func _stripDiacritics() -> Self {
|
|
guard _isCanonicalDecomposable else {
|
|
return self
|
|
}
|
|
|
|
#if FOUNDATION_FRAMEWORK // TODO: Implement `CFUniCharDecomposeCharacter` in Swift
|
|
var stripped: UInt32? = nil
|
|
withUnsafeTemporaryAllocation(of: UTF32Char.self, capacity: 64) { ptr in
|
|
guard let base = ptr.baseAddress else {
|
|
return
|
|
}
|
|
let len = CFUniCharDecomposeCharacter(value, base, ptr.count)
|
|
if len > 0 {
|
|
if ptr[0] < 0x0510 {
|
|
stripped = ptr[0]
|
|
}
|
|
}
|
|
}
|
|
|
|
return stripped != nil ? UnicodeScalar(stripped!)! : self
|
|
#else
|
|
fatalError("_stripDiacritics is not implemented yet")
|
|
#endif // FOUNDATION_FRAMEWORK
|
|
}
|
|
|
|
var _caseFoldMapping : String {
|
|
#if FOUNDATION_FRAMEWORK // TODO: Expose Case Mapping Data without @_spi(_Unicode)
|
|
return self.properties._caseFolded
|
|
#else
|
|
fatalError("_caseFoldMapping is not implemented yet")
|
|
#endif
|
|
}
|
|
}
|