mirror of
https://github.com/samsonjs/samhuri.net.git
synced 2026-03-25 09:05:47 +00:00
* Publish on gemini in addition to the web * Publish gemini feeds, add link from web, tweak things
67 lines
2 KiB
Ruby
67 lines
2 KiB
Ruby
require "yaml"
|
|
require "pressa/utils/file_writer"
|
|
require "pressa/utils/gemtext_renderer"
|
|
|
|
module Pressa
|
|
module Utils
|
|
class GeminiMarkdownRenderer
|
|
def can_render_file?(filename:, extension:)
|
|
extension == "md"
|
|
end
|
|
|
|
def render(site:, file_path:, target_dir:)
|
|
content = File.read(file_path)
|
|
metadata, body_markdown = parse_content(content)
|
|
|
|
page_title = presence(metadata["Title"]) || File.basename(file_path, ".md").capitalize
|
|
show_extension = ["true", "yes", true].include?(metadata["Show extension"])
|
|
slug = File.basename(file_path, ".md")
|
|
|
|
relative_dir = File.dirname(file_path).sub(/^.*?\/public\/?/, "")
|
|
relative_dir = "" if relative_dir == "."
|
|
|
|
canonical_html_path = if show_extension
|
|
"/#{relative_dir}/#{slug}.html".squeeze("/")
|
|
else
|
|
"/#{relative_dir}/#{slug}/".squeeze("/")
|
|
end
|
|
|
|
rows = ["# #{page_title}", ""]
|
|
gemtext_body = GemtextRenderer.render(body_markdown)
|
|
rows << gemtext_body unless gemtext_body.empty?
|
|
rows << "" unless rows.last.to_s.empty?
|
|
rows << "=> #{site.url_for(canonical_html_path)} Read on the web"
|
|
rows << ""
|
|
|
|
output_filename = if show_extension
|
|
"#{slug}.gmi"
|
|
else
|
|
File.join(slug, "index.gmi")
|
|
end
|
|
|
|
output_path = File.join(target_dir, output_filename)
|
|
FileWriter.write(path: output_path, content: rows.join("\n"))
|
|
end
|
|
|
|
private
|
|
|
|
def parse_content(content)
|
|
if content =~ /\A---\s*\n(.*?)\n---\s*\n(.*)/m
|
|
yaml_content = Regexp.last_match(1)
|
|
markdown = Regexp.last_match(2)
|
|
metadata = YAML.safe_load(yaml_content) || {}
|
|
[metadata, markdown]
|
|
else
|
|
[{}, content]
|
|
end
|
|
end
|
|
|
|
def presence(value)
|
|
return value unless value.respond_to?(:strip)
|
|
|
|
stripped = value.strip
|
|
stripped.empty? ? nil : stripped
|
|
end
|
|
end
|
|
end
|
|
end
|