Files
Morgan Pretty a32af018a7 Refactored the LintLocalizableStrings script
• Added new 'LintControl' mechanisms to allow for ignoring sections of code
• Added new 'MatchType' mechanisms for excluding unlocalized cases
• Updated the code to explicitly handle localized template strings (both single and multiline)
• Updated the code to process files across multiple threads to improve performance
• Updated the code to use Swift 5.7 regex and store in static variables to prevent reconstruction every time they are used
• Removed the list of individual files which are ignored (now just output a count)
• Fixed an issue where having a localized string on a subsequent line could result in an unlocalized (or incorrectly localized) string not being detected
• Fixed an issue where having multiple strings on a single line could result in an unlocalized string not being detected
• Fixed an issue where zero-width characters would result in the variable count comparison between translations failing
• Fixed a number of localization warnings
2024-10-18 10:19:38 +11:00

86 lines
2.1 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
public enum Hex {
// stringlint:ignore_contents
public static func isValid(_ string: String) -> Bool {
let allowedCharacters = CharacterSet(charactersIn: "0123456789ABCDEF")
return string.uppercased().unicodeScalars.allSatisfy { allowedCharacters.contains($0) }
}
}
// MARK: - Data
public extension Data {
var bytes: [UInt8] { return Array(self) }
func toHexString() -> String {
return bytes.toHexString()
}
init(hex: String) {
self.init(Array<UInt8>(hex: hex))
}
}
// MARK: - Array
public extension Array where Element == UInt8 {
// stringlint:ignore_contents
init(hex: String) {
self = Array<Element>()
self.reserveCapacity(hex.unicodeScalars.lazy.underestimatedCount)
var buffer: UInt8?
var skip = (hex.hasPrefix("0x") ? 2 : 0)
for char in hex.unicodeScalars.lazy {
guard skip == 0 else {
skip -= 1
continue
}
guard char.value >= 48 && char.value <= 102 else {
removeAll()
return
}
let v: UInt8
let c: UInt8 = UInt8(char.value)
switch c {
case let c where c <= 57: v = c - 48
case let c where c >= 65 && c <= 70: v = c - 55
case let c where c >= 97: v = c - 87
default:
removeAll()
return
}
if let b = buffer {
append(b << 4 | v)
buffer = nil
}
else {
buffer = v
}
}
if let b = buffer {
append(b)
}
}
// stringlint:ignore_contents
func toHexString() -> String {
return map { String(format: "%02x", $0) }.joined()
}
func toBase64(options: Data.Base64EncodingOptions = []) -> String {
Data(self).base64EncodedString(options: options)
}
}