Sources/GuardianFonts/GuardianFonts.swift (125 lines of code) (raw):

import Foundation #if os(iOS) import UIKit #else import AppKit #endif /// An enumeration representing the various font styles used in the Guardian's digital platforms. /// Each case corresponds to a specific font style. /// /// - Note: The font files and the CDN URLs at which they are hosted may only be used for Guardian websites or apps. /// All fonts are the property of Schwartzco, Inc., t/a Commercial Type (https://commercialtype.com/), and may not be reproduced without permission. @objc public enum GuardianFontStyle: Int, CaseIterable { /// Titlepiece font style in bold. case titlepieceBold /// Headline font styles. case headlineLight case headlineLightItalic case headlineRegular case headlineRegularItalic case headlineMedium case headlineMediumItalic case headlineSemibold case headlineSemiboldItalic case headlineBold case headlineBoldItalic case headlineBlack case headlineBlackItalic /// Text Egyptian font styles. case textEgyptianRegular case textEgyptianRegularItalic case textEgyptianMedium case textEgyptianMediumItalic case textEgyptianBold case textEgyptianBoldItalic case textEgyptianBlack case textEgyptianBlackItalic /// Text Sans font styles. case textSansRegular case textSansRegularItalic case textSansMedium case textSansMediumItalic case textSansBold case textSansBoldItalic case textSansBlack case textSansBlackItalic /// The name of the font associated with the style. public var fontName: String { GuardianFonts.fontName(for: self) } } @objc public class GuardianFonts: NSObject { override public init() {} internal static var hasRegistered = false @objc public static func registerFonts() { if !hasRegistered { GuardianFontStyle.allCases.forEach { registerFont(bundle: Bundle.module, fileName: $0.fontName, fontExtension: "ttf") } hasRegistered = true } } /// Mapping from GuardianFontStyle to the font name fileprivate static func fontName(for style: GuardianFontStyle) -> String { switch style { case .headlineBold: return "GHGuardianHeadline-Bold" case .headlineRegularItalic: return "GHGuardianHeadline-RegularItalic" case .headlineLight: return "GHGuardianHeadline-Light" case .headlineMedium: return "GHGuardianHeadline-Medium" case .headlineRegular: return "GHGuardianHeadline-Regular" case .headlineSemibold: return "GHGuardianHeadline-Semibold" case .headlineLightItalic: return "GHGuardianHeadline-LightItalic" case .headlineMediumItalic: return "GHGuardianHeadline-MediumItalic" case .headlineSemiboldItalic: return "GHGuardianHeadline-SemiboldItalic" case .headlineBoldItalic: return "GHGuardianHeadline-BoldItalic" case .headlineBlack: return "GHGuardianHeadline-Black" case .headlineBlackItalic: return "GHGuardianHeadline-BlackItalic" case .textSansBold: return "GuardianTextSans-Bold" case .textSansBoldItalic: return "GuardianTextSans-BoldIt" case .textSansRegular: return "GuardianTextSans-Regular" case .textSansRegularItalic: return "GuardianTextSans-RegularIt" case .textSansMedium: return "GuardianTextSans-Medium" case .textSansMediumItalic: return "GuardianTextSans-MediumIt" case .textSansBlack: return "GuardianTextSans-Black" case .textSansBlackItalic: return "GuardianTextSans-BlackIt" case .textEgyptianRegular: return "GuardianTextEgyptian-Reg" case .textEgyptianRegularItalic: return "GuardianTextEgyptian-RegIt" case .textEgyptianMedium: return "GuardianTextEgyptian-Med" case .textEgyptianMediumItalic: return "GuardianTextEgyptian-MedIt" case .textEgyptianBold: return "GuardianTextEgyptian-Bold" case .textEgyptianBoldItalic: return "GuardianTextEgyptian-BoldIt" case .textEgyptianBlack: return "GuardianTextEgyptian-Black" case .textEgyptianBlackItalic: return "GuardianTextEgyptian-BlackIt" case .titlepieceBold: return "GTGuardianTitlepiece-Bold" } } /// Register font file with the application /// - Parameters: /// - bundle: Bundle containing the font file asset /// - fileName: Name of the font file /// - fontExtension: font file extension, eg. ttf fileprivate static func registerFont(bundle: Bundle, fileName: String, fontExtension: String) { guard let fontURL = bundle.url(forResource: fileName, withExtension: fontExtension), let fontDataProvider = CGDataProvider(url: fontURL as CFURL), let font = CGFont(fontDataProvider) else { fatalError("Couldn't create font from filename: \(fileName) with extension \(fontExtension)") } var error: Unmanaged<CFError>? // Register font with the Core Graphics Font Manager CTFontManagerRegisterGraphicsFont(font, &error) } }