samhuri.net/lib/projects/plugin.rb

86 lines
2.2 KiB
Ruby

require_relative "../plugin"
require_relative "../utils/file_writer"
require_relative "../views/layout"
require_relative "../views/projects_view"
require_relative "../views/project_view"
require_relative "models"
module Pressa
module Projects
class Plugin < Pressa::Plugin
attr_reader :scripts, :styles
def initialize(projects: [], scripts: [], styles: [])
@projects = projects
@scripts = scripts
@styles = styles
end
def setup(site:, source_path:)
end
def render(site:, target_path:)
write_projects_index(site:, target_path:)
@projects.each do |project|
write_project_page(project:, site:, target_path:)
end
end
private
def write_projects_index(site:, target_path:)
content_view = Views::ProjectsView.new(projects: @projects, site:)
html = render_layout(
site:,
page_subtitle: "Projects",
canonical_url: site.url_for("/projects/"),
content: content_view
)
file_path = File.join(target_path, "projects", "index.html")
Utils::FileWriter.write(path: file_path, content: html)
end
def write_project_page(project:, site:, target_path:)
content_view = Views::ProjectView.new(project:, site:)
html = render_layout(
site:,
page_subtitle: project.title,
canonical_url: site.url_for(project.path),
content: content_view,
page_scripts: @scripts,
page_styles: @styles,
page_description: project.description
)
file_path = File.join(target_path, "projects", project.name, "index.html")
Utils::FileWriter.write(path: file_path, content: html)
end
def render_layout(
site:,
page_subtitle:,
canonical_url:,
content:,
page_scripts: [],
page_styles: [],
page_description: nil
)
layout = Views::Layout.new(
site:,
page_subtitle:,
canonical_url:,
page_scripts:,
page_styles:,
page_description:,
content:
)
layout.call
end
end
end
end