Compare commits
4 Commits
ab91c1c277
...
504f006345
Author | SHA1 | Date | |
---|---|---|---|
504f006345 | |||
c9ea8ef9db | |||
950d6ec8a6 | |||
e4ada4b543 |
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@ -1,6 +1,6 @@
|
|||||||
library "openiumpipeline"
|
library "openiumpipeline"
|
||||||
|
|
||||||
env.DEVELOPER_DIR="/Applications/Xcode-15.4.0.app/Contents/Developer"
|
env.DEVELOPER_DIR="/Applications/Xcode-15.2.0.app/Contents/Developer"
|
||||||
//env.SIMULATOR_DEVICE_TYPES="iPad--7th-generation-"
|
//env.SIMULATOR_DEVICE_TYPES="iPad--7th-generation-"
|
||||||
env.IS_PACKAGE_SWIFT=1
|
env.IS_PACKAGE_SWIFT=1
|
||||||
env.TARGETS_MACOS=1
|
env.TARGETS_MACOS=1
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/krzyzanowskim/CryptoSwift.git",
|
"location" : "https://github.com/krzyzanowskim/CryptoSwift.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "c9c3df6ab812de32bae61fc0cd1bf6d45170ebf0",
|
"revision" : "db51c407d3be4a051484a141bf0bff36c43d3b1e",
|
||||||
"version" : "1.8.2"
|
"version" : "1.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -81,7 +81,7 @@ swift run -c release ResgenSwift strings twine $FORCE_FLAG "./Twine/strings.txt"
|
|||||||
2. Input translations file (must be Twine formatted)
|
2. Input translations file (must be Twine formatted)
|
||||||
3. `--langs`: langs to generate (string with space between each lang)
|
3. `--langs`: langs to generate (string with space between each lang)
|
||||||
4. `--default-lang`: default lang that will be in `Base.lproj`. It must be in `langs` as well
|
4. `--default-lang`: default lang that will be in `Base.lproj`. It must be in `langs` as well
|
||||||
5. `--extension-output-path`: path where to generate generated extension
|
4. `--extension-output-path`: path where to generate generated extension
|
||||||
|
|
||||||
### Stringium (recommended)
|
### Stringium (recommended)
|
||||||
|
|
||||||
@ -93,7 +93,6 @@ swift run -c release ResgenSwift strings stringium $FORCE_FLAG "./Strings/string
|
|||||||
--extension-output-path "./Strings/Generated" \
|
--extension-output-path "./Strings/Generated" \
|
||||||
--extension-name "AppString" \
|
--extension-name "AppString" \
|
||||||
--extension-suffix "GreatApp" \
|
--extension-suffix "GreatApp" \
|
||||||
--xcStrings true
|
|
||||||
--static-members true
|
--static-members true
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -106,7 +105,6 @@ swift run -c release ResgenSwift strings stringium $FORCE_FLAG "./Strings/string
|
|||||||
4. `--extension-output-path`: path where to generate generated extension
|
4. `--extension-output-path`: path where to generate generated extension
|
||||||
5. `--extension-name` *(optional)* : name of class to add the extension
|
5. `--extension-name` *(optional)* : name of class to add the extension
|
||||||
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppString+GreatApp.swift`)
|
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppString+GreatApp.swift`)
|
||||||
6. `--xcStrings`*(optional)* : generate string catalog
|
|
||||||
7. `--static-members` *(optional)*: generate static properties or not
|
7. `--static-members` *(optional)*: generate static properties or not
|
||||||
|
|
||||||
|
|
||||||
@ -243,7 +241,6 @@ swift run -c release ResgenSwift images $FORCE_FLAG "./Images/images.txt" \
|
|||||||
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppImage+GreatApp.swift`)
|
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppImage+GreatApp.swift`)
|
||||||
7. `--static-members` *(optional)*: generate static properties or not
|
7. `--static-members` *(optional)*: generate static properties or not
|
||||||
|
|
||||||
> ⚠️ Svg images will be copied in the assets and rendered as "Original", however if those images are not rendered correctly you can force the png generation by adding the key word "png" like this: id arrow_back 15 ? png
|
|
||||||
|
|
||||||
## All at once
|
## All at once
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ import Foundation
|
|||||||
|
|
||||||
enum GenerateError: Error {
|
enum GenerateError: Error {
|
||||||
case fileNotExists(String)
|
case fileNotExists(String)
|
||||||
case invalidConfigurationFile(String, String)
|
case invalidConfigurationFile(String)
|
||||||
case commandError([String], String)
|
case commandError([String], String)
|
||||||
case writeFile(String, String)
|
case writeFile(String, String)
|
||||||
|
|
||||||
@ -18,8 +18,8 @@ enum GenerateError: Error {
|
|||||||
case .fileNotExists(let filename):
|
case .fileNotExists(let filename):
|
||||||
return "error: [\(Generate.toolName)] File \(filename) does not exists"
|
return "error: [\(Generate.toolName)] File \(filename) does not exists"
|
||||||
|
|
||||||
case .invalidConfigurationFile(let filename, let underneathErrorDescription):
|
case .invalidConfigurationFile(let filename):
|
||||||
return "error: [\(Generate.toolName)] File \(filename) is not a valid configuration file. Underneath error: \(underneathErrorDescription)"
|
return "error: [\(Generate.toolName)] File \(filename) is not a valid configuration file"
|
||||||
|
|
||||||
case .commandError(let command, let terminationStatus):
|
case .commandError(let command, let terminationStatus):
|
||||||
let readableCommand = command
|
let readableCommand = command
|
||||||
|
@ -269,7 +269,6 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
let extensionName: String?
|
let extensionName: String?
|
||||||
let extensionSuffix: String?
|
let extensionSuffix: String?
|
||||||
private let staticMembers: Bool?
|
private let staticMembers: Bool?
|
||||||
private let xcStrings: Bool?
|
|
||||||
|
|
||||||
var staticMembersOptions: Bool {
|
var staticMembersOptions: Bool {
|
||||||
if let staticMembers = staticMembers {
|
if let staticMembers = staticMembers {
|
||||||
@ -278,13 +277,6 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
var xcStringsOptions: Bool {
|
|
||||||
if let xcStrings = xcStrings {
|
|
||||||
return xcStrings
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(inputFile: String,
|
internal init(inputFile: String,
|
||||||
outputPath: String,
|
outputPath: String,
|
||||||
langs: String,
|
langs: String,
|
||||||
@ -292,8 +284,7 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
extensionOutputPath: String,
|
extensionOutputPath: String,
|
||||||
extensionName: String?,
|
extensionName: String?,
|
||||||
extensionSuffix: String?,
|
extensionSuffix: String?,
|
||||||
staticMembers: Bool?,
|
staticMembers: Bool?) {
|
||||||
xcStrings: Bool?) {
|
|
||||||
self.inputFile = inputFile
|
self.inputFile = inputFile
|
||||||
self.outputPath = outputPath
|
self.outputPath = outputPath
|
||||||
self.langs = langs
|
self.langs = langs
|
||||||
@ -302,7 +293,6 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
self.extensionName = extensionName
|
self.extensionName = extensionName
|
||||||
self.extensionSuffix = extensionSuffix
|
self.extensionSuffix = extensionSuffix
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
self.xcStrings = xcStrings
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var debugDescription: String {
|
var debugDescription: String {
|
||||||
|
@ -16,15 +16,12 @@ class ConfigurationFileParser {
|
|||||||
Generate.exit(withError: error)
|
Generate.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
guard let configuration = try? YAMLDecoder().decode(ConfigurationFile.self, from: data) else {
|
||||||
return try YAMLDecoder().decode(ConfigurationFile.self, from: data)
|
let error = GenerateError.invalidConfigurationFile(configurationFile)
|
||||||
} catch {
|
|
||||||
let error = GenerateError.invalidConfigurationFile(
|
|
||||||
configurationFile,
|
|
||||||
error.localizedDescription.description
|
|
||||||
)
|
|
||||||
print(error.description)
|
print(error.description)
|
||||||
Generate.exit(withError: error)
|
Generate.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return configuration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,9 +26,7 @@ extension StringsConfiguration: Runnable {
|
|||||||
"--extension-output-path",
|
"--extension-output-path",
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
||||||
"--static-members",
|
"--static-members",
|
||||||
"\(staticMembersOptions)",
|
"\(staticMembersOptions)"
|
||||||
"--xc-strings",
|
|
||||||
"\(xcStringsOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName = extensionName {
|
if let extensionName = extensionName {
|
||||||
|
@ -8,13 +8,10 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import ToolCore
|
import ToolCore
|
||||||
|
|
||||||
enum OutputImageExtension: String {
|
|
||||||
case png
|
|
||||||
case svg
|
|
||||||
}
|
|
||||||
|
|
||||||
class XcassetsGenerator {
|
class XcassetsGenerator {
|
||||||
|
|
||||||
|
static let outputImageExtension = "png"
|
||||||
|
|
||||||
let forceGeneration: Bool
|
let forceGeneration: Bool
|
||||||
|
|
||||||
// MARK: - Init
|
// MARK: - Init
|
||||||
@ -63,20 +60,13 @@ class XcassetsGenerator {
|
|||||||
generatedAssetsPaths.append(imagesetName)
|
generatedAssetsPaths.append(imagesetName)
|
||||||
|
|
||||||
// Generate output images path
|
// Generate output images path
|
||||||
let output1x = "\(imagesetPath)/\(parsedImage.name).\(OutputImageExtension.png.rawValue)"
|
let output1x = "\(imagesetPath)/\(parsedImage.name).\(XcassetsGenerator.outputImageExtension)"
|
||||||
let output2x = "\(imagesetPath)/\(parsedImage.name)@2x.\(OutputImageExtension.png.rawValue)"
|
let output2x = "\(imagesetPath)/\(parsedImage.name)@2x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
let output3x = "\(imagesetPath)/\(parsedImage.name)@3x.\(OutputImageExtension.png.rawValue)"
|
let output3x = "\(imagesetPath)/\(parsedImage.name)@3x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
|
|
||||||
// Check if we need to convert image
|
// Check if we need to convert image
|
||||||
|
guard self.shouldGenerate(inputImagePath: imageData.path, xcassetImagePath: output1x) else {
|
||||||
var needToGenerateForSvg = false
|
//print("\(parsedImage.name) -> Not regenerating")
|
||||||
|
|
||||||
if imageData.ext == "svg" && !parsedImage.imageExtensions.contains(.png) {
|
|
||||||
needToGenerateForSvg = true
|
|
||||||
}
|
|
||||||
|
|
||||||
guard self.shouldGenerate(inputImagePath: imageData.path, xcassetImagePath: output1x, needToGenerateForSvg: needToGenerateForSvg) else {
|
|
||||||
print("\(parsedImage.name) -> Not regenerating")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,22 +80,11 @@ class XcassetsGenerator {
|
|||||||
print(error.description)
|
print(error.description)
|
||||||
Images.exit(withError: error)
|
Images.exit(withError: error)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
do {
|
|
||||||
let documentsDirectory = try fileManager.contentsOfDirectory(atPath: imagesetPath)
|
|
||||||
for filePath in documentsDirectory {
|
|
||||||
try fileManager.removeItem(atPath: "\(imagesetPath)/\(filePath)")
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
print("Error deleting previous assets")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert image
|
||||||
let convertArguments = parsedImage.convertArguments
|
let convertArguments = parsedImage.convertArguments
|
||||||
|
|
||||||
if imageData.ext == "svg" {
|
if imageData.ext == "svg" {
|
||||||
if parsedImage.imageExtensions.contains(.png) {
|
|
||||||
|
|
||||||
// /usr/local/bin/rsvg-convert path/to/image.png -w 200 -h 300 -o path/to/output.png
|
// /usr/local/bin/rsvg-convert path/to/image.png -w 200 -h 300 -o path/to/output.png
|
||||||
// /usr/local/bin/rsvg-convert path/to/image.png -w 200 -o path/to/output.png
|
// /usr/local/bin/rsvg-convert path/to/image.png -w 200 -o path/to/output.png
|
||||||
// /usr/local/bin/rsvg-convert path/to/image.png -h 300 -o path/to/output.png
|
// /usr/local/bin/rsvg-convert path/to/image.png -h 300 -o path/to/output.png
|
||||||
@ -124,21 +103,6 @@ class XcassetsGenerator {
|
|||||||
Shell.shell(command1x)
|
Shell.shell(command1x)
|
||||||
Shell.shell(command2x)
|
Shell.shell(command2x)
|
||||||
Shell.shell(command3x)
|
Shell.shell(command3x)
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
let output = "\(imagesetPath)/\(parsedImage.name).\(OutputImageExtension.svg.rawValue)"
|
|
||||||
let tempURL = URL(fileURLWithPath: output)
|
|
||||||
|
|
||||||
do {
|
|
||||||
if FileManager.default.fileExists(atPath: tempURL.path) {
|
|
||||||
try FileManager.default.removeItem(atPath: tempURL.path)
|
|
||||||
}
|
|
||||||
try FileManager.default.copyItem(atPath: imageData.path, toPath: tempURL.path)
|
|
||||||
} catch {
|
|
||||||
print(error.localizedDescription)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// convert path/to/image.png -resize 200x300 path/to/output.png
|
// convert path/to/image.png -resize 200x300 path/to/output.png
|
||||||
// convert path/to/image.png -resize 200x path/to/output.png
|
// convert path/to/image.png -resize 200x path/to/output.png
|
||||||
@ -155,7 +119,7 @@ class XcassetsGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write Content.json
|
// Write Content.json
|
||||||
guard let imagesetContentJson = parsedImage.generateContentJson(isVector: imageData.ext == "svg") else { return }
|
let imagesetContentJson = parsedImage.contentJson
|
||||||
let contentJsonFilePath = "\(imagesetPath)/Contents.json"
|
let contentJsonFilePath = "\(imagesetPath)/Contents.json"
|
||||||
|
|
||||||
let contentJsonFilePathURL = URL(fileURLWithPath: contentJsonFilePath)
|
let contentJsonFilePathURL = URL(fileURLWithPath: contentJsonFilePath)
|
||||||
@ -197,8 +161,8 @@ class XcassetsGenerator {
|
|||||||
|
|
||||||
// MARK: - Helpers: bypass generation
|
// MARK: - Helpers: bypass generation
|
||||||
|
|
||||||
private func shouldGenerate(inputImagePath: String, xcassetImagePath: String, needToGenerateForSvg: Bool) -> Bool {
|
private func shouldGenerate(inputImagePath: String, xcassetImagePath: String) -> Bool {
|
||||||
if forceGeneration || needToGenerateForSvg {
|
if forceGeneration {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
//
|
|
||||||
// ImageContent.swift
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Created by Quentin Bandera on 19/04/2024.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
enum TemplateRenderingIntent: String, Codable {
|
|
||||||
case template
|
|
||||||
case original
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AssetContent: Codable, Equatable {
|
|
||||||
let images: [AssetImageDescription]
|
|
||||||
let info: AssetInfo
|
|
||||||
let properties: AssetProperties?
|
|
||||||
|
|
||||||
init(
|
|
||||||
images: [AssetImageDescription],
|
|
||||||
info: AssetInfo,
|
|
||||||
properties: AssetProperties? = nil
|
|
||||||
) {
|
|
||||||
self.images = images
|
|
||||||
self.info = info
|
|
||||||
self.properties = properties
|
|
||||||
}
|
|
||||||
|
|
||||||
static func == (lhs: AssetContent, rhs: AssetContent) -> Bool {
|
|
||||||
guard lhs.images.count == rhs.images.count else { return false }
|
|
||||||
let lhsImages = lhs.images.sorted(by: { $0.filename < $1.filename })
|
|
||||||
let rhsImages = rhs.images.sorted(by: { $0.filename < $1.filename })
|
|
||||||
|
|
||||||
return lhsImages == rhsImages
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AssetImageDescription: Codable, Equatable {
|
|
||||||
let idiom: String
|
|
||||||
let scale: String?
|
|
||||||
let filename: String
|
|
||||||
|
|
||||||
init(
|
|
||||||
idiom: String,
|
|
||||||
scale: String? = nil,
|
|
||||||
filename: String
|
|
||||||
) {
|
|
||||||
self.idiom = idiom
|
|
||||||
self.scale = scale
|
|
||||||
self.filename = filename
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AssetInfo: Codable, Equatable {
|
|
||||||
let version: Int
|
|
||||||
let author: String
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AssetProperties: Codable, Equatable {
|
|
||||||
let preservesVectorRepresentation: Bool
|
|
||||||
let templateRenderingIntent: TemplateRenderingIntent?
|
|
||||||
|
|
||||||
init(
|
|
||||||
preservesVectorRepresentation: Bool,
|
|
||||||
templateRenderingIntent: TemplateRenderingIntent? = nil
|
|
||||||
) {
|
|
||||||
self.preservesVectorRepresentation = preservesVectorRepresentation
|
|
||||||
self.templateRenderingIntent = templateRenderingIntent
|
|
||||||
}
|
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey {
|
|
||||||
case preservesVectorRepresentation = "preserves-vector-representation"
|
|
||||||
case templateRenderingIntent = "template-rendering-intent"
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,30 +7,11 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum ImageExtension: String {
|
|
||||||
case png
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ParsedImage {
|
struct ParsedImage {
|
||||||
let name: String
|
let name: String
|
||||||
let tags: String
|
let tags: String
|
||||||
let width: Int
|
let width: Int
|
||||||
let height: Int
|
let height: Int
|
||||||
let imageExtensions: [ImageExtension]
|
|
||||||
|
|
||||||
init(
|
|
||||||
name: String,
|
|
||||||
tags: String,
|
|
||||||
width: Int,
|
|
||||||
height: Int,
|
|
||||||
imageExtensions: [ImageExtension] = []
|
|
||||||
) {
|
|
||||||
self.name = name
|
|
||||||
self.tags = tags
|
|
||||||
self.width = width
|
|
||||||
self.height = height
|
|
||||||
self.imageExtensions = imageExtensions
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Convert
|
// MARK: - Convert
|
||||||
|
|
||||||
@ -61,68 +42,33 @@ struct ParsedImage {
|
|||||||
|
|
||||||
// MARK: - Assets
|
// MARK: - Assets
|
||||||
|
|
||||||
func generateContentJson(isVector: Bool) -> String? {
|
var contentJson: String {
|
||||||
let encoder = JSONEncoder()
|
"""
|
||||||
encoder.outputFormatting = .prettyPrinted
|
{
|
||||||
|
"images" : [
|
||||||
let imageContent = generateImageContent(isVector: isVector)
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
guard let data = try? encoder.encode(imageContent) else {
|
"scale" : "1x",
|
||||||
let error = ImagesError.writeFile("Contents.json", "Error encoding json file")
|
"filename" : "\(name).\(XcassetsGenerator.outputImageExtension)"
|
||||||
print(error.description)
|
},
|
||||||
Images.exit(withError: error)
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x",
|
||||||
|
"filename" : "\(name)@2x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x",
|
||||||
|
"filename" : "\(name)@3x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
}
|
}
|
||||||
|
|
||||||
return String(data: data, encoding: .utf8)
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateImageContent(isVector: Bool) -> AssetContent {
|
|
||||||
|
|
||||||
if !imageExtensions.contains(.png) && isVector {
|
|
||||||
//Generate svg
|
|
||||||
return AssetContent(
|
|
||||||
images: [
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
filename: "\(name).\(OutputImageExtension.svg.rawValue)"
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
info: AssetInfo(
|
"info" : {
|
||||||
version: 1,
|
"version" : 1,
|
||||||
author: "ResgenSwift-Imagium"
|
"author" : "ResgenSwift-Imagium"
|
||||||
),
|
|
||||||
properties: AssetProperties(
|
|
||||||
preservesVectorRepresentation: true,
|
|
||||||
templateRenderingIntent: .original
|
|
||||||
)
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
//Generate png
|
|
||||||
return AssetContent(
|
|
||||||
images: [
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "1x",
|
|
||||||
filename: "\(name).\(OutputImageExtension.png.rawValue)"
|
|
||||||
),
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "2x",
|
|
||||||
filename: "\(name)@2x.\(OutputImageExtension.png.rawValue)"
|
|
||||||
),
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "3x",
|
|
||||||
filename: "\(name)@3x.\(OutputImageExtension.png.rawValue)"
|
|
||||||
)
|
|
||||||
],
|
|
||||||
info: AssetInfo(
|
|
||||||
version: 1,
|
|
||||||
author: "ResgenSwift-Imagium"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Extension property
|
// MARK: - Extension property
|
||||||
|
|
||||||
|
@ -39,20 +39,10 @@ class ImageFileParser {
|
|||||||
return Int(splittedLine[3])!
|
return Int(splittedLine[3])!
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var imageExtensions: [ImageExtension] = []
|
let image = ParsedImage(name: String(splittedLine[1]), tags: String(splittedLine[0]), width: width, height: height)
|
||||||
|
|
||||||
splittedLine.forEach { stringExtension in
|
|
||||||
if let imageExtension = ImageExtension(rawValue: String(stringExtension)) {
|
|
||||||
imageExtensions.append(imageExtension)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let image = ParsedImage(name: String(splittedLine[1]), tags: String(splittedLine[0]), width: width, height: height, imageExtensions: imageExtensions)
|
|
||||||
imagesToGenerate.append(image)
|
imagesToGenerate.append(image)
|
||||||
}
|
}
|
||||||
|
|
||||||
print(imagesToGenerate)
|
|
||||||
|
|
||||||
return imagesToGenerate.filter {
|
return imagesToGenerate.filter {
|
||||||
$0.tags.contains(platform.rawValue)
|
$0.tags.contains(platform.rawValue)
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ class StringsFileGenerator {
|
|||||||
tags: [String],
|
tags: [String],
|
||||||
outputPath: String,
|
outputPath: String,
|
||||||
inputFilenameWithoutExt: String) {
|
inputFilenameWithoutExt: String) {
|
||||||
|
|
||||||
var stringsFilesContent = [String: String]()
|
var stringsFilesContent = [String: String]()
|
||||||
for lang in langs {
|
for lang in langs {
|
||||||
stringsFilesContent[lang] = Self.generateStringsFileContent(lang: lang,
|
stringsFilesContent[lang] = Self.generateStringsFileContent(lang: lang,
|
||||||
@ -43,31 +42,6 @@ class StringsFileGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func writeXcStringsFiles(sections: [Section],
|
|
||||||
langs: [String],
|
|
||||||
defaultLang: String,
|
|
||||||
tags: [String],
|
|
||||||
outputPath: String,
|
|
||||||
inputFilenameWithoutExt: String) {
|
|
||||||
|
|
||||||
let fileContent: String = Self.generateXcStringsFileContent(
|
|
||||||
langs: langs,
|
|
||||||
defaultLang: defaultLang,
|
|
||||||
tags: tags,
|
|
||||||
sections: sections
|
|
||||||
)
|
|
||||||
|
|
||||||
let stringsFilePath = "\(outputPath)/\(inputFilenameWithoutExt).xcstrings"
|
|
||||||
let stringsFilePathURL = URL(fileURLWithPath: stringsFilePath)
|
|
||||||
do {
|
|
||||||
try fileContent.write(to: stringsFilePathURL, atomically: false, encoding: .utf8)
|
|
||||||
} catch let error {
|
|
||||||
let error = StringiumError.writeFile(error.localizedDescription, stringsFilePath)
|
|
||||||
print(error.description)
|
|
||||||
Stringium.exit(withError: error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static func generateStringsFileContent(lang: String,
|
static func generateStringsFileContent(lang: String,
|
||||||
defaultLang: String,
|
defaultLang: String,
|
||||||
tags inputTags: [String],
|
tags inputTags: [String],
|
||||||
@ -118,117 +92,6 @@ class StringsFileGenerator {
|
|||||||
return stringsFileContent
|
return stringsFileContent
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - XcStrings Generation
|
|
||||||
|
|
||||||
static func generateXcStringsFileContent(langs: [String],
|
|
||||||
defaultLang: String,
|
|
||||||
tags inputTags: [String],
|
|
||||||
sections: [Section]) -> String {
|
|
||||||
let rootObject = generateRootObject(langs: langs, defaultLang: defaultLang, tags: inputTags, sections: sections)
|
|
||||||
let file = generateXcStringsFileContentFromRootObject(rootObject: rootObject)
|
|
||||||
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
|
|
||||||
static func generateXcStringsFileContentFromRootObject(rootObject: Root) -> String {
|
|
||||||
do {
|
|
||||||
let encoder = JSONEncoder()
|
|
||||||
encoder.outputFormatting = [.prettyPrinted]
|
|
||||||
|
|
||||||
let json = try encoder.encode(rootObject)
|
|
||||||
|
|
||||||
if let jsonString = String(data: json, encoding: .utf8) {
|
|
||||||
return jsonString
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch {
|
|
||||||
debugPrint("Failed to encode: \(error)")
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
static func generateRootObject(langs: [String],
|
|
||||||
defaultLang: String,
|
|
||||||
tags inputTags: [String],
|
|
||||||
sections: [Section]) -> Root {
|
|
||||||
|
|
||||||
var xcStringDefinitionTab: [XCStringDefinition] = []
|
|
||||||
|
|
||||||
sections.forEach { section in
|
|
||||||
// Check that at least one string will be generated
|
|
||||||
guard section.hasOneOrMoreMatchingTags(tags: inputTags) else {
|
|
||||||
return // Go to next section
|
|
||||||
}
|
|
||||||
|
|
||||||
section.definitions.forEach { definition in
|
|
||||||
var skipDefinition = false
|
|
||||||
var isNoTranslation = false
|
|
||||||
|
|
||||||
var localizationTab: [XCStringLocalization] = []
|
|
||||||
|
|
||||||
if definition.hasOneOrMoreMatchingTags(inputTags: inputTags) == false {
|
|
||||||
skipDefinition = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if definition.tags.contains(Stringium.noTranslationTag) {
|
|
||||||
isNoTranslation = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if !skipDefinition {
|
|
||||||
if isNoTranslation {
|
|
||||||
// Search for langs in yaml
|
|
||||||
for lang in langs {
|
|
||||||
if let value = definition.translations[defaultLang], !value.isEmpty {
|
|
||||||
let localization = XCStringLocalization(
|
|
||||||
lang: lang,
|
|
||||||
content: XCStringLocalizationLangContent(
|
|
||||||
stringUnit: DefaultStringUnit(state: "translated", value: value)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
localizationTab.append(localization)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Search for langs in twine
|
|
||||||
for (lang, value) in definition.translations where !value.isEmpty {
|
|
||||||
|
|
||||||
let localization = XCStringLocalization(
|
|
||||||
lang: lang,
|
|
||||||
content: XCStringLocalizationLangContent(
|
|
||||||
stringUnit: DefaultStringUnit(state: "translated", value: value)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
localizationTab.append(localization)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let xcStringDefinition = XCStringDefinition(
|
|
||||||
title: definition.name,
|
|
||||||
content: XCStringDefinitionContent(
|
|
||||||
comment: definition.comment,
|
|
||||||
extractionState: "manual",
|
|
||||||
localizations: XCStringLocalizationContainer(
|
|
||||||
localizations: localizationTab
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
xcStringDefinitionTab.append(xcStringDefinition)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let xcStringContainer = XCStringDefinitionContainer(strings: xcStringDefinitionTab)
|
|
||||||
|
|
||||||
return Root(
|
|
||||||
sourceLanguage: defaultLang,
|
|
||||||
strings: xcStringContainer,
|
|
||||||
version: "1.0"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Extension file
|
// MARK: - Extension file
|
||||||
|
|
||||||
static func writeExtensionFiles(sections: [Section],
|
static func writeExtensionFiles(sections: [Section],
|
||||||
|
@ -84,29 +84,22 @@ class Definition {
|
|||||||
return (inputParameters: inputParameters, translationArguments: translationArguments)
|
return (inputParameters: inputParameters, translationArguments: translationArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getBaseProperty(lang: String, translation: String, isStatic: Bool, comment: String?) -> String {
|
private func getBaseProperty(lang: String, translation: String, isStatic: Bool) -> String {
|
||||||
"""
|
"""
|
||||||
/// Translation in \(lang) :
|
/// Translation in \(lang) :
|
||||||
/// \(translation)
|
/// \(translation)
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
|
||||||
\(isStatic ? "static ": "")var \(name): String {
|
\(isStatic ? "static ": "")var \(name): String {
|
||||||
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "\(comment ?? "")")
|
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getBaseMethod(lang: String, translation: String, isStatic: Bool, inputParameters: [String], translationArguments: [String], comment: String?) -> String {
|
private func getBaseMethod(lang: String, translation: String, isStatic: Bool, inputParameters: [String], translationArguments: [String]) -> String {
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
/// Translation in \(lang) :
|
/// Translation in \(lang) :
|
||||||
/// \(translation)
|
/// \(translation)
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
|
||||||
\(isStatic ? "static ": "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String {
|
\(isStatic ? "static ": "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String {
|
||||||
String(format: \(isStatic ? "Self" : "self").\(name), \(translationArguments.joined(separator: ", ")))
|
String(format: \(isStatic ? "Self" : "self").\(name), \(translationArguments.joined(separator: ", ")))
|
||||||
}
|
}
|
||||||
@ -121,12 +114,7 @@ class Definition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generate property
|
// Generate property
|
||||||
let property = getBaseProperty(
|
let property = getBaseProperty(lang: lang, translation: translation, isStatic: false)
|
||||||
lang: lang,
|
|
||||||
translation: translation,
|
|
||||||
isStatic: false,
|
|
||||||
comment: self.comment
|
|
||||||
)
|
|
||||||
|
|
||||||
// Generate method
|
// Generate method
|
||||||
var method = ""
|
var method = ""
|
||||||
@ -135,8 +123,7 @@ class Definition {
|
|||||||
translation: translation,
|
translation: translation,
|
||||||
isStatic: false,
|
isStatic: false,
|
||||||
inputParameters: parameters.inputParameters,
|
inputParameters: parameters.inputParameters,
|
||||||
translationArguments: parameters.translationArguments,
|
translationArguments: parameters.translationArguments)
|
||||||
comment: self.comment)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return property + method
|
return property + method
|
||||||
@ -150,12 +137,7 @@ class Definition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generate property
|
// Generate property
|
||||||
let property = getBaseProperty(
|
let property = getBaseProperty(lang: lang, translation: translation, isStatic: true)
|
||||||
lang: lang,
|
|
||||||
translation: translation,
|
|
||||||
isStatic: true,
|
|
||||||
comment: self.comment
|
|
||||||
)
|
|
||||||
|
|
||||||
// Generate method
|
// Generate method
|
||||||
var method = ""
|
var method = ""
|
||||||
@ -164,8 +146,7 @@ class Definition {
|
|||||||
translation: translation,
|
translation: translation,
|
||||||
isStatic: true,
|
isStatic: true,
|
||||||
inputParameters: parameters.inputParameters,
|
inputParameters: parameters.inputParameters,
|
||||||
translationArguments: parameters.translationArguments,
|
translationArguments: parameters.translationArguments)
|
||||||
comment: self.comment)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return property + method
|
return property + method
|
||||||
@ -183,10 +164,6 @@ class Definition {
|
|||||||
return """
|
return """
|
||||||
/// Translation in \(lang) :
|
/// Translation in \(lang) :
|
||||||
/// \(translation)
|
/// \(translation)
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
|
||||||
|
|
||||||
var \(name): String {
|
var \(name): String {
|
||||||
"\(translation)"
|
"\(translation)"
|
||||||
}
|
}
|
||||||
@ -203,9 +180,6 @@ class Definition {
|
|||||||
return """
|
return """
|
||||||
/// Translation in \(lang) :
|
/// Translation in \(lang) :
|
||||||
/// \(translation)
|
/// \(translation)
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
|
||||||
static var \(name): String {
|
static var \(name): String {
|
||||||
"\(translation)"
|
"\(translation)"
|
||||||
}
|
}
|
||||||
|
@ -1,109 +0,0 @@
|
|||||||
//
|
|
||||||
// XcString.swift
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Created by Quentin Bandera on 12/04/2024.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct DynamicKey: CodingKey {
|
|
||||||
var intValue: Int?
|
|
||||||
init?(intValue: Int) {
|
|
||||||
self.intValue = intValue
|
|
||||||
self.stringValue = "\(intValue)"
|
|
||||||
}
|
|
||||||
|
|
||||||
var stringValue: String
|
|
||||||
init?(stringValue: String) {
|
|
||||||
self.stringValue = stringValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Root: Codable, Equatable {
|
|
||||||
let sourceLanguage: String
|
|
||||||
let strings: XCStringDefinitionContainer
|
|
||||||
let version: String
|
|
||||||
}
|
|
||||||
|
|
||||||
struct XCStringDefinitionContainer: Codable, Equatable {
|
|
||||||
let strings: [XCStringDefinition]
|
|
||||||
|
|
||||||
func encode(to encoder: Encoder) throws {
|
|
||||||
var container = encoder.container(keyedBy: DynamicKey.self)
|
|
||||||
|
|
||||||
for str in strings {
|
|
||||||
if let codingKey = DynamicKey(stringValue: str.title) {
|
|
||||||
try container.encode(str.content, forKey: codingKey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static func == (lhs: XCStringDefinitionContainer, rhs: XCStringDefinitionContainer) -> Bool {
|
|
||||||
return lhs.strings.sorted(by: {
|
|
||||||
$0.title < $1.title
|
|
||||||
}) == rhs.strings.sorted(by: { $0.title < $1.title })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct XCStringDefinition: Codable, Equatable {
|
|
||||||
let title: String // json key -> custom encoding methods
|
|
||||||
let content: XCStringDefinitionContent
|
|
||||||
}
|
|
||||||
|
|
||||||
struct XCStringDefinitionContent: Codable, Equatable {
|
|
||||||
let comment: String?
|
|
||||||
let extractionState: String
|
|
||||||
var localizations: XCStringLocalizationContainer
|
|
||||||
|
|
||||||
init(comment: String? = nil, extractionState: String, localizations: XCStringLocalizationContainer) {
|
|
||||||
self.comment = comment
|
|
||||||
self.extractionState = extractionState
|
|
||||||
self.localizations = localizations
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct XCStringLocalizationContainer: Codable, Equatable {
|
|
||||||
let localizations: [XCStringLocalization]
|
|
||||||
|
|
||||||
func encode(to encoder: Encoder) throws {
|
|
||||||
var container = encoder.container(keyedBy: DynamicKey.self)
|
|
||||||
|
|
||||||
for loca in localizations {
|
|
||||||
if let codingKey = DynamicKey(stringValue: loca.lang) {
|
|
||||||
try container.encode(loca.content, forKey: codingKey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static func == (lhs: XCStringLocalizationContainer, rhs: XCStringLocalizationContainer) -> Bool {
|
|
||||||
return lhs.localizations.count == rhs.localizations.count && lhs.localizations.sorted(by: { $0.lang < $1.lang }) == rhs.localizations.sorted(by: { $0.lang < $1.lang })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct XCStringLocalization: Codable, Equatable {
|
|
||||||
let lang: String // json key -> custom encoding method
|
|
||||||
let content: XCStringLocalizationLangContent
|
|
||||||
}
|
|
||||||
|
|
||||||
struct XCStringLocalizationLangContent: Codable, Equatable {
|
|
||||||
let stringUnit: DefaultStringUnit
|
|
||||||
}
|
|
||||||
|
|
||||||
//enum VarationOrStringUnit: Encodable {
|
|
||||||
// case variations([Varation])
|
|
||||||
// case stringUnit: (DefaultStringUnit)
|
|
||||||
//
|
|
||||||
// func encode(to encoder: any Encoder) throws {
|
|
||||||
// if let varations {
|
|
||||||
//
|
|
||||||
// } else if let {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
struct DefaultStringUnit: Codable, Equatable {
|
|
||||||
let state: String
|
|
||||||
let value: String
|
|
||||||
}
|
|
@ -43,25 +43,12 @@ struct Stringium: ParsableCommand {
|
|||||||
let sections = TwineFileParser.parse(options.inputFile)
|
let sections = TwineFileParser.parse(options.inputFile)
|
||||||
|
|
||||||
// Generate strings files
|
// Generate strings files
|
||||||
print(options.xcStrings)
|
|
||||||
if !options.xcStrings {
|
|
||||||
print("[\(Self.toolName)] Will generate strings")
|
|
||||||
|
|
||||||
StringsFileGenerator.writeStringsFiles(sections: sections,
|
StringsFileGenerator.writeStringsFiles(sections: sections,
|
||||||
langs: options.langs,
|
langs: options.langs,
|
||||||
defaultLang: options.defaultLang,
|
defaultLang: options.defaultLang,
|
||||||
tags: options.tags,
|
tags: options.tags,
|
||||||
outputPath: options.stringsFileOutputPath,
|
outputPath: options.stringsFileOutputPath,
|
||||||
inputFilenameWithoutExt: options.inputFilenameWithoutExt)
|
inputFilenameWithoutExt: options.inputFilenameWithoutExt)
|
||||||
} else {
|
|
||||||
print("[\(Self.toolName)] Will generate xcStrings")
|
|
||||||
StringsFileGenerator.writeXcStringsFiles(sections: sections,
|
|
||||||
langs: options.langs,
|
|
||||||
defaultLang: options.defaultLang,
|
|
||||||
tags: options.tags,
|
|
||||||
outputPath: options.stringsFileOutputPath,
|
|
||||||
inputFilenameWithoutExt: options.inputFilenameWithoutExt)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate extension
|
// Generate extension
|
||||||
StringsFileGenerator.writeExtensionFiles(sections: sections,
|
StringsFileGenerator.writeExtensionFiles(sections: sections,
|
||||||
|
@ -12,7 +12,7 @@ struct StringiumOptions: ParsableArguments {
|
|||||||
@Flag(name: [.customShort("f"), .customShort("F")], help: "Should force generation")
|
@Flag(name: [.customShort("f"), .customShort("F")], help: "Should force generation")
|
||||||
var forceGeneration = false
|
var forceGeneration = false
|
||||||
|
|
||||||
@Argument(help: "Input files where strings are defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Argument(help: "Input files where strings ared defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
||||||
var inputFile: String
|
var inputFile: String
|
||||||
|
|
||||||
@Option(name: .customLong("output-path"), help: "Path where to strings file.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(name: .customLong("output-path"), help: "Path where to strings file.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
||||||
@ -33,9 +33,6 @@ struct StringiumOptions: ParsableArguments {
|
|||||||
@Option(help: "Tell if it will generate static properties or not")
|
@Option(help: "Tell if it will generate static properties or not")
|
||||||
var staticMembers: Bool = false
|
var staticMembers: Bool = false
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate xcStrings file or not")
|
|
||||||
var xcStrings: Bool = false
|
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an String extension.")
|
@Option(help: "Extension name. If not specified, it will generate an String extension.")
|
||||||
var extensionName: String = Stringium.defaultExtensionName
|
var extensionName: String = Stringium.defaultExtensionName
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ class ImageFileParserTests: XCTestCase {
|
|||||||
#
|
#
|
||||||
# SMAAS Support
|
# SMAAS Support
|
||||||
#
|
#
|
||||||
id image_one 25 ? png
|
id image_one 25 ?
|
||||||
di image_two ? 50 webp png
|
di image_two ? 50
|
||||||
d image_three 25 ?
|
d image_three 25 ?
|
||||||
d image_four 75 ?
|
d image_four 75 ?
|
||||||
"""
|
"""
|
||||||
@ -38,7 +38,6 @@ class ImageFileParserTests: XCTestCase {
|
|||||||
XCTAssertEqual(firstImage!.tags, "id")
|
XCTAssertEqual(firstImage!.tags, "id")
|
||||||
XCTAssertEqual(firstImage!.width, 25)
|
XCTAssertEqual(firstImage!.width, 25)
|
||||||
XCTAssertEqual(firstImage!.height, -1)
|
XCTAssertEqual(firstImage!.height, -1)
|
||||||
XCTAssertEqual(firstImage!.imageExtensions, [.png])
|
|
||||||
|
|
||||||
let secondImage = parsedImages.first {
|
let secondImage = parsedImages.first {
|
||||||
$0.name == "image_two"
|
$0.name == "image_two"
|
||||||
@ -47,6 +46,5 @@ class ImageFileParserTests: XCTestCase {
|
|||||||
XCTAssertEqual(secondImage!.tags, "di")
|
XCTAssertEqual(secondImage!.tags, "di")
|
||||||
XCTAssertEqual(secondImage!.width, -1)
|
XCTAssertEqual(secondImage!.width, -1)
|
||||||
XCTAssertEqual(secondImage!.height, 50)
|
XCTAssertEqual(secondImage!.height, 50)
|
||||||
XCTAssertEqual(firstImage!.imageExtensions, [.png])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,77 +127,35 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
height: 10)
|
height: 10)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.generateImageContent(isVector: false)
|
let property = parsedImage.contentJson
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = AssetContent(
|
let expect = """
|
||||||
images: [
|
{
|
||||||
AssetImageDescription(
|
"images" : [
|
||||||
idiom: "universal",
|
{
|
||||||
scale: "1x",
|
"idiom" : "universal",
|
||||||
filename: "\(parsedImage.name).\(OutputImageExtension.png.rawValue)"
|
"scale" : "1x",
|
||||||
),
|
"filename" : "\(imageName).\(XcassetsGenerator.outputImageExtension)"
|
||||||
AssetImageDescription(
|
},
|
||||||
idiom: "universal",
|
{
|
||||||
scale: "2x",
|
"idiom" : "universal",
|
||||||
filename: "\(parsedImage.name)@2x.\(OutputImageExtension.png.rawValue)"
|
"scale" : "2x",
|
||||||
),
|
"filename" : "\(imageName)@2x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
AssetImageDescription(
|
},
|
||||||
idiom: "universal",
|
{
|
||||||
scale: "3x",
|
"idiom" : "universal",
|
||||||
filename: "\(parsedImage.name)@3x.\(OutputImageExtension.png.rawValue)"
|
"scale" : "3x",
|
||||||
)
|
"filename" : "\(imageName)@3x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
info: AssetInfo(
|
"info" : {
|
||||||
version: 1,
|
"version" : 1,
|
||||||
author: "ResgenSwift-Imagium"
|
"author" : "ResgenSwift-Imagium"
|
||||||
)
|
}
|
||||||
)
|
}
|
||||||
|
"""
|
||||||
XCTAssertEqual(property, expect)
|
|
||||||
}
|
XCTAssertEqual(property.adaptForXCTest(), expect.adaptForXCTest())
|
||||||
|
|
||||||
func testAssetPng() {
|
|
||||||
// Given
|
|
||||||
let imageName = "the_name"
|
|
||||||
let parsedImage = ParsedImage(name: imageName,
|
|
||||||
tags: "id",
|
|
||||||
width: 10,
|
|
||||||
height: 10,
|
|
||||||
imageExtensions: [.png])
|
|
||||||
|
|
||||||
// When
|
|
||||||
let property = parsedImage.generateImageContent(isVector: false)
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
|
|
||||||
let expect = AssetContent(
|
|
||||||
images: [
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "1x",
|
|
||||||
filename: "\(parsedImage.name).\(OutputImageExtension.png.rawValue)"
|
|
||||||
),
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "2x",
|
|
||||||
filename: "\(parsedImage.name)@2x.\(OutputImageExtension.png.rawValue)"
|
|
||||||
),
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "3x",
|
|
||||||
filename: "\(parsedImage.name)@3x.\(OutputImageExtension.png.rawValue)"
|
|
||||||
)
|
|
||||||
],
|
|
||||||
info: AssetInfo(
|
|
||||||
version: 1,
|
|
||||||
author: "ResgenSwift-Imagium"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
debugPrint(property)
|
|
||||||
debugPrint(expect)
|
|
||||||
|
|
||||||
XCTAssertEqual(property, expect)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,64 +100,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// C'est la traduction francaise
|
/// C'est la traduction francaise
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "This is a comment")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "This is a comment")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "This is a comment")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGeneratedNSLocalizedStringPropertyWithEmptyComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.comment = ""
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
||||||
}
|
}
|
||||||
@ -166,9 +108,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEn = """
|
let expectEn = """
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
/// This is the english translation
|
/// This is the english translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
||||||
}
|
}
|
||||||
@ -177,9 +116,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEnUs = """
|
let expectEnUs = """
|
||||||
/// Translation in en-us :
|
/// Translation in en-us :
|
||||||
/// This is the english us translation
|
/// This is the english us translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
||||||
}
|
}
|
||||||
@ -190,62 +126,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGeneratedNSLocalizedStringPropertyWithNoComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - getNSLocalizedStringStaticProperty
|
|
||||||
|
|
||||||
func testGeneratedNSLocalizedStringStaticProperty() {
|
func testGeneratedNSLocalizedStringStaticProperty() {
|
||||||
// Given
|
// Given
|
||||||
let definition = Definition(name: "definition_name")
|
let definition = Definition(name: "definition_name")
|
||||||
@ -266,64 +146,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// C'est la traduction francaise
|
/// C'est la traduction francaise
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
static var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "This is a comment")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
static var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "This is a comment")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
static var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "This is a comment")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGeneratedNSLocalizedStringStaticPropertyWithEmptyComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.comment = ""
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
||||||
}
|
}
|
||||||
@ -332,9 +154,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEn = """
|
let expectEn = """
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
/// This is the english translation
|
/// This is the english translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
||||||
}
|
}
|
||||||
@ -343,63 +162,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEnUs = """
|
let expectEnUs = """
|
||||||
/// Translation in en-us :
|
/// Translation in en-us :
|
||||||
/// This is the english us translation
|
/// This is the english us translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGeneratedNSLocalizedStringStaticPropertyWithNoComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
||||||
}
|
}
|
||||||
@ -426,18 +188,12 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// Welcome "%@" !
|
/// Welcome "%@" !
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// Welcome "%@" !
|
/// Welcome "%@" !
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
func definition_name(arg0: String) -> String {
|
func definition_name(arg0: String) -> String {
|
||||||
String(format: self.definition_name, arg0)
|
String(format: self.definition_name, arg0)
|
||||||
}
|
}
|
||||||
@ -462,18 +218,12 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// Welcome "%@" ! Your age is %d :) Your weight is %f ;-)
|
/// Welcome "%@" ! Your age is %d :) Your weight is %f ;-)
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" ! Your age is %d :) Your weight is %f ;-)", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" ! Your age is %d :) Your weight is %f ;-)", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// Welcome "%@" ! Your age is %d :) Your weight is %f ;-)
|
/// Welcome "%@" ! Your age is %d :) Your weight is %f ;-)
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
func definition_name(arg0: String, arg1: Int, arg2: Double) -> String {
|
func definition_name(arg0: String, arg1: Int, arg2: Double) -> String {
|
||||||
String(format: self.definition_name, arg0, arg1, arg2)
|
String(format: self.definition_name, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
@ -499,18 +249,12 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// Vous %%: %1$@ %2$@ Age: %3$d
|
/// Vous %%: %1$@ %2$@ Age: %3$d
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Vous %%: %1$@ %2$@ Age: %3$d", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Vous %%: %1$@ %2$@ Age: %3$d", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// Vous %%: %1$@ %2$@ Age: %3$d
|
/// Vous %%: %1$@ %2$@ Age: %3$d
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
||||||
String(format: self.definition_name, arg0, arg1, arg2)
|
String(format: self.definition_name, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
@ -519,18 +263,12 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEn = """
|
let expectEn = """
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
/// You %%: %2$@ %1$@ Age: %3$d
|
/// You %%: %2$@ %1$@ Age: %3$d
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
/// You %%: %2$@ %1$@ Age: %3$d
|
/// You %%: %2$@ %1$@ Age: %3$d
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
||||||
String(format: self.definition_name, arg0, arg1, arg2)
|
String(format: self.definition_name, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
@ -562,9 +300,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// C'est la traduction francaise
|
/// C'est la traduction francaise
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
@ -573,9 +308,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEn = """
|
let expectEn = """
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
/// This is the english translation
|
/// This is the english translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
@ -584,9 +316,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEnUs = """
|
let expectEnUs = """
|
||||||
/// Translation in en-us :
|
/// Translation in en-us :
|
||||||
/// This is the english us translation
|
/// This is the english us translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
var definition_name: String {
|
var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
@ -597,117 +326,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGeneratedRawPropertyWithEmptyComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.comment = ""
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
"C'est la traduction francaise"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
"This is the english translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
"This is the english us translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGeneratedRawPropertyWithNoComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
"C'est la traduction francaise"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
"This is the english translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
var definition_name: String {
|
|
||||||
"This is the english us translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Raw static properties
|
|
||||||
|
|
||||||
func testGeneratedRawStaticProperty() {
|
func testGeneratedRawStaticProperty() {
|
||||||
// Given
|
// Given
|
||||||
let definition = Definition(name: "definition_name")
|
let definition = Definition(name: "definition_name")
|
||||||
@ -728,9 +346,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
/// C'est la traduction francaise
|
/// C'est la traduction francaise
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
static var definition_name: String {
|
static var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
@ -739,9 +354,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEn = """
|
let expectEn = """
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
/// This is the english translation
|
/// This is the english translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
static var definition_name: String {
|
static var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
@ -750,118 +362,6 @@ final class DefinitionTests: XCTestCase {
|
|||||||
let expectEnUs = """
|
let expectEnUs = """
|
||||||
/// Translation in en-us :
|
/// Translation in en-us :
|
||||||
/// This is the english us translation
|
/// This is the english us translation
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// This is a comment
|
|
||||||
static var definition_name: String {
|
|
||||||
"This is the english us translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGeneratedRawStaticPropertyWithEmptyComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.comment = ""
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getStaticProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getStaticProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getStaticProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
"C'est la traduction francaise"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
"This is the english translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
"This is the english us translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
XCTAssertEqual(propertyFr.adaptForXCTest(), expectFr.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEn.adaptForXCTest(), expectEn.adaptForXCTest())
|
|
||||||
XCTAssertEqual(propertyEnUs.adaptForXCTest(), expectEnUs.adaptForXCTest())
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGeneratedRawStaticPropertyWithNoComment() {
|
|
||||||
// Given
|
|
||||||
let definition = Definition(name: "definition_name")
|
|
||||||
definition.tags = ["ios","iosonly","notranslation"]
|
|
||||||
definition.translations = [
|
|
||||||
"fr": "C'est la traduction francaise",
|
|
||||||
"en": "This is the english translation",
|
|
||||||
"en-us": "This is the english us translation"
|
|
||||||
]
|
|
||||||
|
|
||||||
// When
|
|
||||||
let propertyFr = definition.getStaticProperty(forLang: "fr")
|
|
||||||
let propertyEn = definition.getStaticProperty(forLang: "en")
|
|
||||||
let propertyEnUs = definition.getStaticProperty(forLang: "en-us")
|
|
||||||
|
|
||||||
// Expect
|
|
||||||
let expectFr = """
|
|
||||||
/// Translation in fr :
|
|
||||||
/// C'est la traduction francaise
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
"C'est la traduction francaise"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEn = """
|
|
||||||
/// Translation in en :
|
|
||||||
/// This is the english translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
|
||||||
"This is the english translation"
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
let expectEnUs = """
|
|
||||||
/// Translation in en-us :
|
|
||||||
/// This is the english us translation
|
|
||||||
///
|
|
||||||
/// Comment :
|
|
||||||
/// No comment
|
|
||||||
static var definition_name: String {
|
static var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user