diff --git a/SiteGenerator/Sources/SiteGenerator/Generator/AnyPlugin.swift b/SiteGenerator/Sources/SiteGenerator/Generator/AnyPlugin.swift new file mode 100644 index 0000000..6596d0c --- /dev/null +++ b/SiteGenerator/Sources/SiteGenerator/Generator/AnyPlugin.swift @@ -0,0 +1,30 @@ +// +// AnyPlugin.swift +// SiteGenerator +// +// Created by Sami Samhuri on 2019-12-14. +// + +import Foundation + +struct AnyPlugin: Plugin { + private let _setUp: (Site, URL) throws -> Void + private let _render: (Site, URL, TemplateRenderer) throws -> Void + + init(_ plugin: PluginType) { + self._setUp = { site, sourceURL in + try plugin.setUp(site: site, sourceURL: sourceURL) + } + self._render = { site, targetURL, templateRenderer in + try plugin.render(site: site, targetURL: targetURL, templateRenderer: templateRenderer) + } + } + + func setUp(site: Site, sourceURL: URL) throws { + try _setUp(site, sourceURL) + } + + func render(site: Site, targetURL: URL, templateRenderer: TemplateRenderer) throws { + try _render(site, targetURL, templateRenderer) + } +} diff --git a/SiteGenerator/Sources/SiteGenerator/Generator/Plugin.swift b/SiteGenerator/Sources/SiteGenerator/Generator/Plugin.swift index 6cc5e18..785527b 100644 --- a/SiteGenerator/Sources/SiteGenerator/Generator/Plugin.swift +++ b/SiteGenerator/Sources/SiteGenerator/Generator/Plugin.swift @@ -8,8 +8,6 @@ import Foundation public protocol Plugin { - init(options: [String: Any]) - func setUp(site: Site, sourceURL: URL) throws func render(site: Site, targetURL: URL, templateRenderer: TemplateRenderer) throws diff --git a/SiteGenerator/Sources/SiteGenerator/Generator/SitePlugin.swift b/SiteGenerator/Sources/SiteGenerator/Generator/SitePlugin.swift index ad51853..3445a76 100644 --- a/SiteGenerator/Sources/SiteGenerator/Generator/SitePlugin.swift +++ b/SiteGenerator/Sources/SiteGenerator/Generator/SitePlugin.swift @@ -10,4 +10,16 @@ import Foundation public enum SitePlugin: String, Codable { case posts case projects + + func construct(options: [String: Any]) -> AnyPlugin { + switch self { + case .posts: + let plugin = PostsPlugin(options: options) + return AnyPlugin(plugin) + + case .projects: + let plugin = ProjectsPlugin(options: options) + return AnyPlugin(plugin) + } + } } diff --git a/SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift b/SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift index 9a506a3..7d32917 100644 --- a/SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift +++ b/SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift @@ -13,10 +13,10 @@ public final class SiteGenerator { let templateRenderer: TemplateRenderer // Site properties - let site: Site - let sourceURL: URL - var plugins: [Plugin] = [] - let renderers: [Renderer] + public let site: Site + public let sourceURL: URL + public private(set) var plugins: [Plugin] = [] + public let renderers: [Renderer] let ignoredFilenames = [".DS_Store", ".gitkeep"] @@ -39,17 +39,16 @@ public final class SiteGenerator { } private func initializePlugins() throws { - plugins = site.plugins.map { (sitePlugin, options) in - switch sitePlugin { - case .projects: - return ProjectsPlugin(options: options) - case .posts: - return PostsPlugin(options: options) - } - } - for plugin in plugins { - try plugin.setUp(site: site, sourceURL: sourceURL) + plugins = site.plugins.map { pair in + let (sitePlugin, options) = pair + return sitePlugin.construct(options: options) } + try plugins.forEach(addPlugin) + } + + public func addPlugin(_ plugin: Plugin) throws { + try plugin.setUp(site: site, sourceURL: sourceURL) + plugins.append(plugin) } public func generate(targetURL: URL) throws {