feat(RES-58): Add new parameter "bundle" (#19)
All checks were successful
gitea-openium/resgen.swift/pipeline/head This commit looks good

Add bundle parameter to define if resource should be load from Bundle.main (app) or Bundle.module (SPM package)

Reviewed-on: #19
This commit is contained in:
2025-07-25 16:14:36 +02:00
parent 5ad219ae89
commit f329386ccf
37 changed files with 866 additions and 403 deletions

View File

@@ -247,23 +247,25 @@ enum StringsFileGenerator {
sections: [Section],
defaultLang lang: String,
tags: [String],
staticVar: Bool,
isStatic: Bool,
inputFilename: String,
extensionName: String,
extensionFilePath: String,
extensionSuffix: String,
visibility: ExtensionVisibility
visibility: ExtensionVisibility,
assetBundle: AssetBundle
) {
// Get extension content
let extensionFileContent = Self.getExtensionContent(
sections: sections,
defaultLang: lang,
tags: tags,
staticVar: staticVar,
isStatic: isStatic,
inputFilename: inputFilename,
extensionName: extensionName,
extensionSuffix: extensionSuffix,
visibility: visibility
visibility: visibility,
assetBundle: assetBundle
)
// Write content
@@ -283,11 +285,12 @@ enum StringsFileGenerator {
sections: [Section],
defaultLang lang: String,
tags: [String],
staticVar: Bool,
isStatic: Bool,
inputFilename: String,
extensionName: String,
extensionSuffix: String,
visibility: ExtensionVisibility
visibility: ExtensionVisibility,
assetBundle: AssetBundle
) -> String {
[
Self.getHeader(
@@ -305,8 +308,9 @@ enum StringsFileGenerator {
sections: sections,
defaultLang: lang,
tags: tags,
staticVar: staticVar,
visibility: visibility
isStatic: isStatic,
visibility: visibility,
assetBundle: assetBundle
),
Self.getFooter()
]
@@ -379,8 +383,9 @@ enum StringsFileGenerator {
sections: [Section],
defaultLang lang: String,
tags: [String],
staticVar: Bool,
visibility: ExtensionVisibility
isStatic: Bool,
visibility: ExtensionVisibility,
assetBundle: AssetBundle
) -> String {
sections.compactMap { section in
// Check that at least one string will be generated
@@ -394,19 +399,12 @@ enum StringsFileGenerator {
return nil // Go to next definition
}
let property: String = {
if staticVar {
definition.getNSLocalizedStringStaticProperty(
forLang: lang,
visibility: visibility
)
} else {
definition.getNSLocalizedStringProperty(
forLang: lang,
visibility: visibility
)
}
}()
let property = definition.getNSLocalizedStringProperty(
forLang: lang,
isStatic: isStatic,
visibility: visibility,
assetBundle: assetBundle
)
return "\n\(property)"
}

View File

@@ -15,7 +15,7 @@ enum TagsGenerator {
sections: [Section],
lang: String,
tags: [String],
staticVar: Bool,
isStatic: Bool,
extensionName: String,
extensionFilePath: String,
visibility: ExtensionVisibility
@@ -25,7 +25,7 @@ enum TagsGenerator {
sections: sections,
lang: lang,
tags: tags,
staticVar: staticVar,
isStatic: isStatic,
extensionName: extensionName,
visibility: visibility
)
@@ -47,20 +47,20 @@ enum TagsGenerator {
sections: [Section],
lang: String,
tags: [String],
staticVar: Bool,
isStatic: Bool,
extensionName: String,
visibility: ExtensionVisibility
) -> String {
[
Self.getHeader(
extensionClassname: extensionName,
staticVar: staticVar
isStatic: isStatic
),
Self.getProperties(
sections: sections,
lang: lang,
tags: tags,
staticVar: staticVar,
isStatic: isStatic,
visibility: visibility
),
Self.getFooter()
@@ -70,11 +70,11 @@ enum TagsGenerator {
// MARK: - Extension part
private static func getHeader(extensionClassname: String, staticVar: Bool) -> String {
private static func getHeader(extensionClassname: String, isStatic: Bool) -> String {
"""
// Generated by ResgenSwift.Strings.\(Tags.toolName) \(ResgenSwiftVersion)
\(staticVar ? "typelias Tags = String\n\n" : "")import UIKit
\(isStatic ? "typelias Tags = String\n\n" : "")import UIKit
extension \(extensionClassname) {
"""
@@ -84,7 +84,7 @@ enum TagsGenerator {
sections: [Section],
lang: String,
tags: [String],
staticVar: Bool,
isStatic: Bool,
visibility: ExtensionVisibility
) -> String {
sections
@@ -100,11 +100,12 @@ enum TagsGenerator {
return // Go to next definition
}
if staticVar {
res += "\n\n\(definition.getStaticProperty(forLang: lang, visibility: visibility))"
} else {
res += "\n\n\(definition.getProperty(forLang: lang, visibility: visibility))"
}
let property = definition.getProperty(
forLang: lang,
visibility: visibility,
isStatic: isStatic
)
res += "\n\n\(property)"
}
return res
}

View File

@@ -105,7 +105,8 @@ class Definition {
translation: String,
isStatic: Bool,
comment: String?,
visibility: ExtensionVisibility
visibility: ExtensionVisibility,
assetBundle: AssetBundle
) -> String {
"""
/// Translation in \(lang) :
@@ -114,7 +115,7 @@ class Definition {
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
\(visibility) \(isStatic ? "static " : "")var \(name): String {
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "\(comment ?? "")")
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.\(assetBundle), value: "\(translation)", comment: "\(comment ?? "")")
}
"""
}
@@ -141,7 +142,12 @@ class Definition {
"""
}
func getNSLocalizedStringProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
func getNSLocalizedStringProperty(
forLang lang: String,
isStatic: Bool,
visibility: ExtensionVisibility,
assetBundle: AssetBundle
) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
@@ -152,9 +158,10 @@ class Definition {
let property = getBaseProperty(
lang: lang,
translation: translation,
isStatic: false,
isStatic: isStatic,
comment: self.comment,
visibility: visibility
visibility: visibility,
assetBundle: assetBundle
)
// Generate method
@@ -163,40 +170,7 @@ class Definition {
method = getBaseMethod(
lang: lang,
translation: translation,
isStatic: false,
inputParameters: parameters.inputParameters,
translationArguments: parameters.translationArguments,
comment: self.comment,
visibility: visibility
)
}
return property + method
}
func getNSLocalizedStringStaticProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
Stringium.exit(withError: error)
}
// Generate property
let property = getBaseProperty(
lang: lang,
translation: translation,
isStatic: true,
comment: self.comment,
visibility: visibility
)
// Generate method
var method = ""
if let parameters = self.getStringParameters(input: translation) {
method = getBaseMethod(
lang: lang,
translation: translation,
isStatic: true,
isStatic: isStatic,
inputParameters: parameters.inputParameters,
translationArguments: parameters.translationArguments,
comment: self.comment,
@@ -209,7 +183,11 @@ class Definition {
// MARK: - Raw strings
func getProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
func getProperty(
forLang lang: String,
visibility: ExtensionVisibility,
isStatic: Bool
) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
@@ -222,26 +200,7 @@ class Definition {
///
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
\(visibility) var \(name): String {
"\(translation)"
}
"""
}
func getStaticProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
Stringium.exit(withError: error)
}
return """
/// Translation in \(lang) :
/// \(translation)
///
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
\(visibility) static var \(name): String {
\(visibility) \(isStatic ? "static " : "")var \(name): String {
"\(translation)"
}
"""

View File

@@ -68,12 +68,13 @@ struct Stringium: ParsableCommand {
sections: sections,
defaultLang: options.defaultLang,
tags: options.tags,
staticVar: options.staticMembers,
isStatic: options.staticMembers,
inputFilename: options.inputFilenameWithoutExt,
extensionName: extensionName,
extensionFilePath: extensionFilePath,
extensionSuffix: options.extensionSuffix ?? "",
visibility: options.extensionVisibility
visibility: options.extensionVisibility,
assetBundle: options.assetBundle
)
}

View File

@@ -57,6 +57,11 @@ struct StringiumOptions: ParsableArguments {
)
var extensionVisibility: ExtensionVisibility = .internal
@Option(
help: "Bundle where the asset are generated"
)
var assetBundle: AssetBundle = .main
@Option(
help: "Path where to generate the extension.",
transform: { $0.replaceTiltWithHomeDirectoryPath() }

View File

@@ -47,7 +47,7 @@ struct Tags: ParsableCommand {
sections: sections,
lang: options.lang,
tags: ["ios", "iosonly", Self.noTranslationTag],
staticVar: options.staticMembers,
isStatic: options.staticMembers,
extensionName: options.extensionName,
extensionFilePath: options.extensionFilePath,
visibility: options.extensionVisibility