// swiftlint:disable all // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen {% if families %} {% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %} {% set fontType %}{{param.fontTypeName|default:"FontConvertible"}}{% endset %} {% set fontAlias %}{{param.fontAliasName|default:"SystemFont"}}{% endset %} import SwiftUI #if os(OSX) import AppKit.NSFont #elseif os(iOS) || os(tvOS) || os(watchOS) import UIKit.UIFont #endif // Deprecated typealiases @available(*, deprecated, renamed: "{{fontType}}.Font", message: "This typealias will be removed in SwiftGen 7.0") {{accessModifier}} typealias {{fontAlias}} = {{fontType}}.{{fontAlias}} // swiftlint:disable superfluous_disable_command // swiftlint:disable file_length // MARK: - Fonts // swiftlint:disable identifier_name line_length type_body_length {% macro transformPath path %}{% filter removeNewlines %} {% if param.preservePath %} {{path}} {% else %} {{path|basename}} {% endif %} {% endfilter %}{% endmacro %} {{accessModifier}} enum {{param.enumName|default:"FontFamily"}} { {% for family in families %} {% set identifierName %}{{family.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %} {{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { {% for font in family.fonts %} {{accessModifier}} static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{fontType}}(name: "{{font.name}}", family: "{{family.name}}", path: "{% call transformPath font.path %}") {% endfor %} {{accessModifier}} static let all: [{{fontType}}] = [{% for font in family.fonts %}{{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{{ ", " if not forloop.last }}{% endfor %}] } {% endfor %} {{accessModifier}} static let allCustomFonts: [{{fontType}}] = [{% for family in families %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.all{{ ", " if not forloop.last }}{% endfor %}].flatMap { $0 } {{accessModifier}} static func registerAllCustomFonts() { allCustomFonts.forEach { $0.register() } } } // swiftlint:enable identifier_name line_length type_body_length // MARK: - Implementation Details {{accessModifier}} struct {{fontType}} { {{accessModifier}} let name: String {{accessModifier}} let family: String {{accessModifier}} let path: String #if os(OSX) {{accessModifier}} typealias {{fontAlias}} = NSFont #elseif os(iOS) || os(tvOS) || os(watchOS) {{accessModifier}} typealias {{fontAlias}} = UIFont #endif {{accessModifier}} func font(size: CGFloat) -> {{fontAlias}} { guard let font = {{fontAlias}}(font: self, size: size) else { fatalError("Unable to initialize font '\(name)' (\(family))") } return font } {{accessModifier}} func textStyle(_ textStyle: Font.TextStyle) -> Font { Font.mappedFont(name, textStyle: textStyle) } {{accessModifier}} func register() { // swiftlint:disable:next conditional_returns_on_newline guard let url = url else { return } CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } fileprivate var url: URL? { // swiftlint:disable:next implicit_return {% if param.lookupFunction %} return {{param.lookupFunction}}(name, family, path) {% else %} return {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil) {% endif %} } } {{accessModifier}} extension {{fontType}}.{{fontAlias}} { convenience init?(font: {{fontType}}, size: CGFloat) { #if os(iOS) || os(tvOS) || os(watchOS) if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { font.register() } #elseif os(OSX) if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { font.register() } #endif self.init(name: font.name, size: size) } } {% if not param.bundle and not param.lookupFunction %} // swiftlint:disable convenience_type private final class BundleToken { static let bundle: Bundle = { #if SWIFT_PACKAGE return Bundle.module #else return Bundle(for: BundleToken.self) #endif }() } fileprivate extension Font { static func mappedFont(_ name: String, textStyle: TextStyle) -> Font { let fontSize = UIFont.preferredFont(forTextStyle: self.mapToUIFontTextStyle(textStyle)).pointSize return Font.custom(name, size: fontSize, relativeTo: textStyle) } // swiftlint:disable:next cyclomatic_complexity static func mapToUIFontTextStyle(_ textStyle: SwiftUI.Font.TextStyle) -> UIFont.TextStyle { switch textStyle { case .largeTitle: return .largeTitle case .title: return .title1 case .title2: return .title2 case .title3: return .title3 case .headline: return .headline case .subheadline: return .subheadline case .callout: return .callout case .body: return .body case .caption: return .caption1 case .caption2: return .caption2 case .footnote: return .footnote @unknown default: fatalError("Missing a TextStyle mapping") } } } // swiftlint:enable convenience_type {% endif %} {% else %} // No fonts found {% endif %}