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