samhuri.net/lib/pressa/utils/gemini_markdown_renderer.rb
Sami Samhuri 9a0b182879
Publish a Gemini site and link to it from the website (#36)
* Publish on gemini in addition to the web

* Publish gemini feeds, add link from web, tweak things
2026-02-14 17:18:09 -08:00

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