1 Commits

Author SHA1 Message Date
3f64e9682c Add stencil on color
Some checks failed
gitea-openium/resgen.swift/pipeline/head There was a failure building this commit
PixeeBox/resgen.swift/pipeline/head There was a failure building this commit
2023-12-15 09:49:11 +01:00
17 changed files with 220 additions and 125 deletions

2
Jenkinsfile vendored
View File

@ -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

View File

@ -18,6 +18,15 @@
"version" : "1.8.0" "version" : "1.8.0"
} }
}, },
{
"identity" : "pathkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/kylef/PathKit.git",
"state" : {
"revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574",
"version" : "1.0.1"
}
},
{ {
"identity" : "sourcekitten", "identity" : "sourcekitten",
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
@ -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",

View File

@ -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")]
), ),

View File

@ -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")
} }
} }

View File

@ -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")!
} }
} }

View File

@ -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")!
}
}

View File

@ -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"
# #

View File

@ -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") // .joined(separator: "\n")
do {
let context: [String: Any] = [
"colors": colors,
"isStatic": staticVar,
"isSwiftUI": isSwiftUI,
"toolName": Colors.toolName,
"resgenVersion": ResgenSwiftVersion,
"extensionClassname": extensionName
]
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 {

View File

@ -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)

View File

@ -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
}

View File

@ -42,45 +42,34 @@ 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)"
}
],
"info" : {
"version" : 1,
"author" : "ResgenSwift-Imagium"
}
} }
"""
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(
version: 1,
author: "ResgenSwift-Imagium"
)
)
}
// MARK: - Extension property // MARK: - Extension property
func getImageProperty(isStatic: Bool, isSwiftUI: Bool) -> String { func getImageProperty(isStatic: Bool, isSwiftUI: Bool) -> String {

View File

@ -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()

View File

View 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 %}
}

View 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 }}")
}

View 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 }}")!
}

View File

@ -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( ],
version: 1, "info" : {
author: "ResgenSwift-Imagium" "version" : 1,
) "author" : "ResgenSwift-Imagium"
) }
}
XCTAssertEqual(property, expect) """
XCTAssertEqual(property.adaptForXCTest(), expect.adaptForXCTest())
} }
} }