Compare commits
1 Commits
d4afa9c9e9
...
stencil
Author | SHA1 | Date | |
---|---|---|---|
3f64e9682c |
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@ -1,6 +1,6 @@
|
|||||||
library "openiumpipeline"
|
library "openiumpipeline"
|
||||||
|
|
||||||
env.DEVELOPER_DIR="/Applications/Xcode-15.3.0.app/Contents/Developer"
|
env.DEVELOPER_DIR="/Applications/Xcode-15.0.1.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,17 @@
|
|||||||
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "pathkit",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/kylef/PathKit.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574",
|
||||||
|
"version" : "1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -27,6 +36,24 @@
|
|||||||
"version" : "0.34.1"
|
"version" : "0.34.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identity" : "spectre",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/kylef/Spectre.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "26cc5e9ae0947092c7139ef7ba612e34646086c7",
|
||||||
|
"version" : "0.10.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "stencil",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/stencilproject/Stencil.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "4f222ac85d673f35df29962fc4c36ccfdaf9da5b",
|
||||||
|
"version" : "0.15.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swift-argument-parser",
|
"identity" : "swift-argument-parser",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
|
@ -11,6 +11,7 @@ let package = Package(
|
|||||||
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
|
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
|
||||||
.package(url: "https://github.com/jpsim/Yams.git", from: "5.0.1"),
|
.package(url: "https://github.com/jpsim/Yams.git", from: "5.0.1"),
|
||||||
.package(url: "https://github.com/realm/SwiftLint.git", .upToNextMajor(from: "0.54.0")),
|
.package(url: "https://github.com/realm/SwiftLint.git", .upToNextMajor(from: "0.54.0")),
|
||||||
|
.package(url: "https://github.com/stencilproject/Stencil.git", .upToNextMajor(from: "0.15.1")),
|
||||||
],
|
],
|
||||||
targets: [
|
targets: [
|
||||||
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
|
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
|
||||||
@ -20,7 +21,8 @@ let package = Package(
|
|||||||
dependencies: [
|
dependencies: [
|
||||||
"ToolCore",
|
"ToolCore",
|
||||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||||
"Yams"
|
"Yams",
|
||||||
|
"Stencil",
|
||||||
],
|
],
|
||||||
plugins: [.plugin(name: "SwiftLintPlugin", package: "SwiftLint")]
|
plugins: [.plugin(name: "SwiftLintPlugin", package: "SwiftLint")]
|
||||||
),
|
),
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,18 +4,25 @@ import SwiftUI
|
|||||||
|
|
||||||
extension ColorYolo {
|
extension ColorYolo {
|
||||||
|
|
||||||
/// Color red is #FF0000 (light) or #FF0000 (dark)"
|
|
||||||
|
/// Color red is #FF0000 #FF0000 or #FF0000 #FF0000"
|
||||||
var red: Color {
|
var red: Color {
|
||||||
Color("red")
|
Color("red")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color green_alpha_50 is #A000FF00 (light) or #A000FF00 (dark)"
|
|
||||||
|
|
||||||
|
/// Color green_alpha_50 is #A000FF00 #A000FF00 or #A000FF00 #A000FF00"
|
||||||
var green_alpha_50: Color {
|
var green_alpha_50: Color {
|
||||||
Color("green_alpha_50")
|
Color("green_alpha_50")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color blue_light_dark is #0000FF (light) or #0000AA (dark)"
|
|
||||||
|
|
||||||
|
/// Color blue_light_dark is #0000FF #0000FF or #0000AA #0000AA"
|
||||||
var blue_light_dark: Color {
|
var blue_light_dark: Color {
|
||||||
Color("blue_light_dark")
|
Color("blue_light_dark")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,18 +4,25 @@ import UIKit
|
|||||||
|
|
||||||
extension UIColorYolo {
|
extension UIColorYolo {
|
||||||
|
|
||||||
/// Color red is #FF0000 (light) or #FF0000 (dark)"
|
|
||||||
|
/// Color red is #FF0000 #FF0000 or #FF0000 #FF0000"
|
||||||
@objc var red: UIColor {
|
@objc var red: UIColor {
|
||||||
UIColor(named: "red")!
|
UIColor(named: "red")!
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color green_alpha_50 is #A000FF00 (light) or #A000FF00 (dark)"
|
|
||||||
|
|
||||||
|
/// Color green_alpha_50 is #A000FF00 #A000FF00 or #A000FF00 #A000FF00"
|
||||||
@objc var green_alpha_50: UIColor {
|
@objc var green_alpha_50: UIColor {
|
||||||
UIColor(named: "green_alpha_50")!
|
UIColor(named: "green_alpha_50")!
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color blue_light_dark is #0000FF (light) or #0000AA (dark)"
|
|
||||||
|
|
||||||
|
/// Color blue_light_dark is #0000FF #0000FF or #0000AA #0000AA"
|
||||||
@objc var blue_light_dark: UIColor {
|
@objc var blue_light_dark: UIColor {
|
||||||
UIColor(named: "blue_light_dark")!
|
UIColor(named: "blue_light_dark")!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
// Generated by ResgenSwift.Color 1.2
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
|
||||||
|
extension UIhkjhkColorYolo {
|
||||||
|
|
||||||
|
|
||||||
|
/// Color red is #FF0000 #FF0000 or #FF0000 #FF0000"
|
||||||
|
@objc var red: UIColor {
|
||||||
|
UIColor(named: "red")!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Color green_alpha_50 is #A000FF00 #A000FF00 or #A000FF00 #A000FF00"
|
||||||
|
@objc var green_alpha_50: UIColor {
|
||||||
|
UIColor(named: "green_alpha_50")!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Color blue_light_dark is #0000FF #0000FF or #0000AA #0000AA"
|
||||||
|
@objc var blue_light_dark: UIColor {
|
||||||
|
UIColor(named: "blue_light_dark")!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -12,14 +12,14 @@ FORCE_FLAG="$1"
|
|||||||
#
|
#
|
||||||
#echo "\n-------------------------\n"
|
#echo "\n-------------------------\n"
|
||||||
#
|
#
|
||||||
## Color
|
# Color
|
||||||
#swift run -c release ResgenSwift colors $FORCE_FLAG "./Colors/sampleColors1.txt" \
|
swift run -c release ResgenSwift colors $FORCE_FLAG "./Colors/sampleColors1.txt" \
|
||||||
# --style all \
|
--style all \
|
||||||
# --xcassets-path "./Colors/colors.xcassets" \
|
--xcassets-path "./Colors/colors.xcassets" \
|
||||||
# --extension-output-path "./Colors/Generated/" \
|
--extension-output-path "./Colors/Generated/" \
|
||||||
# --extension-name "ColorYolo" \
|
--extension-name "ColorYolo" \
|
||||||
# --extension-name-ui-kit "UIhkjhkColorYolo" \
|
--extension-name-ui-kit "UIColorYolo" \
|
||||||
# --extension-suffix "GenAllScript"
|
--extension-suffix "GenAllScript"
|
||||||
#
|
#
|
||||||
#echo "\n-------------------------\n"
|
#echo "\n-------------------------\n"
|
||||||
#
|
#
|
||||||
@ -52,12 +52,12 @@ FORCE_FLAG="$1"
|
|||||||
|
|
||||||
#echo "\n-------------------------\n"
|
#echo "\n-------------------------\n"
|
||||||
|
|
||||||
# Analytics
|
## Analytics
|
||||||
swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \
|
#swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \
|
||||||
--target "matomo firebase" \
|
# --target "matomo firebase" \
|
||||||
--extension-output-path "./Tags/Generated" \
|
# --extension-output-path "./Tags/Generated" \
|
||||||
--extension-name "Analytics" \
|
# --extension-name "Analytics" \
|
||||||
--extension-suffix "GenAllScript"
|
# --extension-suffix "GenAllScript"
|
||||||
|
|
||||||
#echo "\n-------------------------\n"
|
#echo "\n-------------------------\n"
|
||||||
#
|
#
|
||||||
|
@ -41,12 +41,28 @@ struct ColorExtensionGenerator {
|
|||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
isSwiftUI: Bool) -> String {
|
isSwiftUI: Bool) -> String {
|
||||||
[
|
// [
|
||||||
Self.getHeader(extensionClassname: extensionName, isSwiftUI: isSwiftUI),
|
// Self.getHeader(extensionClassname: extensionName, isSwiftUI: isSwiftUI),
|
||||||
Self.getProperties(for: colors, withStaticVar: staticVar, isSwiftUI: isSwiftUI),
|
// Self.getProperties(for: colors, withStaticVar: staticVar, isSwiftUI: isSwiftUI),
|
||||||
Self.getFooter()
|
// Self.getFooter()
|
||||||
|
// ]
|
||||||
|
// .joined(separator: "\n")
|
||||||
|
do {
|
||||||
|
let context: [String: Any] = [
|
||||||
|
"colors": colors,
|
||||||
|
"isStatic": staticVar,
|
||||||
|
"isSwiftUI": isSwiftUI,
|
||||||
|
"toolName": Colors.toolName,
|
||||||
|
"resgenVersion": ResgenSwiftVersion,
|
||||||
|
"extensionClassname": extensionName
|
||||||
]
|
]
|
||||||
.joined(separator: "\n")
|
|
||||||
|
return try ResgenSwift.environment.renderTemplate(name: "Colors/main_template", context: context)
|
||||||
|
} catch {
|
||||||
|
// let error = ColorsToolError.writeExtension(extensionFilePath, error.localizedDescription)
|
||||||
|
// print(error.description)
|
||||||
|
Colors.exit(withError: error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getHeader(extensionClassname: String, isSwiftUI: Bool) -> String {
|
private static func getHeader(extensionClassname: String, isSwiftUI: Bool) -> String {
|
||||||
|
@ -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 {
|
||||||
|
@ -119,7 +119,7 @@ class XcassetsGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write Content.json
|
// Write Content.json
|
||||||
guard let imagesetContentJson = parsedImage.contentJson 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)
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
//
|
|
||||||
// ImageContent.swift
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Created by Quentin Bandera on 19/04/2024.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
struct AssetContent: Codable, Equatable {
|
|
||||||
let images: [AssetImageDescription]
|
|
||||||
let info: AssetInfo
|
|
||||||
|
|
||||||
static func == (lhs: AssetContent, rhs: AssetContent) -> Bool {
|
|
||||||
guard lhs.images.count == rhs.images.count else { return false }
|
|
||||||
let lhsImages = lhs.images.sorted(by: { $0.scale < $1.scale })
|
|
||||||
let rhsImages = rhs.images.sorted(by: { $0.scale < $1.scale })
|
|
||||||
|
|
||||||
return lhsImages == rhsImages
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AssetImageDescription: Codable, Equatable {
|
|
||||||
let idiom: String
|
|
||||||
let scale: String
|
|
||||||
let filename: String
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AssetInfo: Codable, Equatable {
|
|
||||||
let version: Int
|
|
||||||
let author: String
|
|
||||||
}
|
|
@ -42,43 +42,32 @@ struct ParsedImage {
|
|||||||
|
|
||||||
// MARK: - Assets
|
// MARK: - Assets
|
||||||
|
|
||||||
var contentJson: String? {
|
var contentJson: String {
|
||||||
let encoder = JSONEncoder()
|
"""
|
||||||
encoder.outputFormatting = .prettyPrinted
|
{
|
||||||
|
"images" : [
|
||||||
guard let data = try? encoder.encode(imageContent) else {
|
{
|
||||||
let error = ImagesError.writeFile("Contents.json", "Error encoding json file")
|
"idiom" : "universal",
|
||||||
print(error.description)
|
"scale" : "1x",
|
||||||
Images.exit(withError: error)
|
"filename" : "\(name).\(XcassetsGenerator.outputImageExtension)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x",
|
||||||
|
"filename" : "\(name)@2x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x",
|
||||||
|
"filename" : "\(name)@3x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
}
|
}
|
||||||
|
|
||||||
return String(data: data, encoding: .utf8)
|
|
||||||
}
|
|
||||||
|
|
||||||
var imageContent: AssetContent {
|
|
||||||
return AssetContent(
|
|
||||||
images: [
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "1x",
|
|
||||||
filename: "\(name).\(XcassetsGenerator.outputImageExtension)"
|
|
||||||
),
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "2x",
|
|
||||||
filename: "\(name)@2x.\(XcassetsGenerator.outputImageExtension)"
|
|
||||||
),
|
|
||||||
AssetImageDescription(
|
|
||||||
idiom: "universal",
|
|
||||||
scale: "3x",
|
|
||||||
filename: "\(name)@3x.\(XcassetsGenerator.outputImageExtension)"
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
info: AssetInfo(
|
"info" : {
|
||||||
version: 1,
|
"version" : 1,
|
||||||
author: "ResgenSwift-Imagium"
|
"author" : "ResgenSwift-Imagium"
|
||||||
)
|
}
|
||||||
)
|
}
|
||||||
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Extension property
|
// MARK: - Extension property
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
import ToolCore
|
import ToolCore
|
||||||
import Foundation
|
import Foundation
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
|
import Stencil
|
||||||
|
import PathKit
|
||||||
|
|
||||||
struct ResgenSwift: ParsableCommand {
|
struct ResgenSwift: ParsableCommand {
|
||||||
|
|
||||||
@ -32,6 +34,20 @@ struct ResgenSwift: ParsableCommand {
|
|||||||
// subcommand is not given on the command line.
|
// subcommand is not given on the command line.
|
||||||
//defaultSubcommand: Twine.self
|
//defaultSubcommand: Twine.self
|
||||||
)
|
)
|
||||||
|
|
||||||
|
static let projectDirectory = URL(fileURLWithPath: #file) // ProjectDir/Sources/ResgenSwift/main.swift
|
||||||
|
.deletingLastPathComponent() // ProjectDir/Sources/ResgenSwift/
|
||||||
|
.deletingLastPathComponent() // ProjectDir/Sources/
|
||||||
|
.deletingLastPathComponent() // ProjectDir/
|
||||||
|
|
||||||
|
static let environment = Environment(
|
||||||
|
loader: FileSystemLoader(
|
||||||
|
paths: [
|
||||||
|
Path("\(projectDirectory.path)/Templates/")
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print(ResgenSwift.projectDirectory.path)
|
||||||
ResgenSwift.main()
|
ResgenSwift.main()
|
||||||
|
0
Templates/Colors/json_template
Normal file
0
Templates/Colors/json_template
Normal file
21
Templates/Colors/main_template
Normal file
21
Templates/Colors/main_template
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Generated by ResgenSwift.{{ toolName }} {{ resgenVersion }}
|
||||||
|
{% if isSwiftUI %}
|
||||||
|
import SwiftUI
|
||||||
|
{% else %}
|
||||||
|
import UIKit
|
||||||
|
{% endif %}
|
||||||
|
extension {{ extensionClassname }} {
|
||||||
|
{% for color in colors %}
|
||||||
|
{% if isSwiftUI %}
|
||||||
|
/// Color {{ color.name }} is {{ color.light }} {{ color.light }} or {{ color.dark }} {{ color.dark }}"
|
||||||
|
{% if isStatic %}static {% endif %}var {{ color.name }}: Color {
|
||||||
|
Color("{{ color.name }}")
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
/// Color {{ color.name }} is {{ color.light }} {{ color.light }} or {{ color.dark }} {{ color.dark }}"
|
||||||
|
{% if isStatic %}static {% else %}@objc {% endif %}var {{ color.name }}: UIColor {
|
||||||
|
UIColor(named: "{{ color.name }}")!
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
4
Templates/Colors/swiftui_template
Normal file
4
Templates/Colors/swiftui_template
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/// Color {{ color.name }} is {{ color.light }} {{ color.light }} or {{ color.dark }} {{ color.dark }}"
|
||||||
|
{% if isStatic %}static {% endif %}var {{ color.name }}: Color {
|
||||||
|
Color("{{ color.name }}")
|
||||||
|
}
|
4
Templates/Colors/uikit_template
Normal file
4
Templates/Colors/uikit_template
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/// Color {{ color.name }} is {{ color.light }} {{ color.light }} or {{ color.dark }} {{ color.dark }}"
|
||||||
|
{% if isStatic %}static {% else %}@objc {% endif %}var {{ color.name }}: UIColor {
|
||||||
|
UIColor(named: "{{ color.name }}")!
|
||||||
|
}
|
@ -127,33 +127,35 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
height: 10)
|
height: 10)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.imageContent
|
let property = parsedImage.contentJson
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = AssetContent(
|
let expect = """
|
||||||
images: [
|
{
|
||||||
AssetImageDescription(
|
"images" : [
|
||||||
idiom: "universal",
|
{
|
||||||
scale: "1x",
|
"idiom" : "universal",
|
||||||
filename: "\(parsedImage.name).\(XcassetsGenerator.outputImageExtension)"
|
"scale" : "1x",
|
||||||
),
|
"filename" : "\(imageName).\(XcassetsGenerator.outputImageExtension)"
|
||||||
AssetImageDescription(
|
},
|
||||||
idiom: "universal",
|
{
|
||||||
scale: "2x",
|
"idiom" : "universal",
|
||||||
filename: "\(parsedImage.name)@2x.\(XcassetsGenerator.outputImageExtension)"
|
"scale" : "2x",
|
||||||
),
|
"filename" : "\(imageName)@2x.\(XcassetsGenerator.outputImageExtension)"
|
||||||
AssetImageDescription(
|
},
|
||||||
idiom: "universal",
|
{
|
||||||
scale: "3x",
|
"idiom" : "universal",
|
||||||
filename: "\(parsedImage.name)@3x.\(XcassetsGenerator.outputImageExtension)"
|
"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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
Reference in New Issue
Block a user