CutBox.app

Coverage Report

Created: 2024-03-12 03:40

.../Source/App/Preferences/ColorTheme/CutBoxThemeLoader.swift
Line
Count
Source
1
//
2
//  CutBoxThemeLoader.swift
3
//  CutBox
4
//
5
//  Created by Jason on 30/5/22.
6
//  Copyright © 2023 ocodo. All rights reserved.
7
//
8
9
import Foundation
10
11
class CutBoxThemeLoader {
12
13
    var cutBoxUserThemesLocation: String!
14
15
154
    func getBundledThemes() -> [CutBoxColorTheme] {
16
154
        let bundle = Bundle(for: Self.self)
17
154
18
154
        let themePaths: [String] = bundle
19
154
            .paths(forResourcesOfType: "cutboxTheme",
20
154
                   inDirectory: "themes")
21
154
22
154
        let themes: [CutBoxColorTheme] = themePaths.sorted()
23
1.84k
            .map { try? String(contentsOfFile: $0) }
24
1.84k
            .compactMap { $0 }
25
1.84k
            .map { CutBoxColorTheme($0) }
26
154
27
154
        return themes
28
154
    }
29
30
155
    func getUserThemes() -> [CutBoxColorTheme] {
31
155
        let jsonThemes = loadUserThemesFiles()
32
155
        let userThemeIdentifier = "*"
33
155
34
155
        return jsonThemes.map { let theme = CutBoxColorTheme($0)
35
1
            return CutBoxColorTheme(
36
1
                name: "\(theme.name) \(userThemeIdentifier)",
37
1
                theme: theme
38
1
            )
39
1
        }
40
155
    }
41
42
155
    func loadUserThemesFiles() -> [String] {
43
155
        let fileManager = FileManager.default
44
155
        let cutBoxConfig = String(NSString(
45
155
            string: cutBoxUserThemesLocation
46
155
        ).expandingTildeInPath)
47
155
48
155
        guard let themefiles = try?
49
155
                fileManager.contentsOfDirectory(atPath: cutBoxConfig) else { return [] }
50
1
51
1
        let jsonThemes: [String] = themefiles
52
117
            .filter { $0.hasSuffix(".cutboxTheme") }
53
1
            .sorted()
54
1
            .map { getStringFromFile("\(cutBoxConfig)/\($0)")! }
55
1
56
1
        return jsonThemes
57
155
    }
58
}