samhuri.net/lib/pressa/posts/json_feed.rb
Sami Samhuri 007b1058b6
Migrate from Swift to Ruby (#33)
Replace the Swift site generator with a Ruby and Phlex implementation.
Loads site and projects from TOML, derive site metadata from posts.

Migrate from make to bake and add standardrb and code coverage tasks.

Update CI and docs to match the new workflow, and remove unused
assets/dependencies plus obsolete tooling.
2026-02-07 21:19:03 -08:00

76 lines
1.9 KiB
Ruby

require "json"
require "pressa/utils/file_writer"
require "pressa/views/feed_post_view"
module Pressa
module Posts
class JSONFeedWriter
FEED_VERSION = "https://jsonfeed.org/version/1.1"
def initialize(site:, posts_by_year:)
@site = site
@posts_by_year = posts_by_year
end
def write_feed(target_path:, limit: 30)
recent = @posts_by_year.recent_posts(limit)
feed = build_feed(recent)
json = JSON.pretty_generate(feed)
file_path = File.join(target_path, "feed.json")
Utils::FileWriter.write(path: file_path, content: json)
end
private
def build_feed(posts)
author = {
name: @site.author,
url: @site.url,
avatar: @site.image_url
}
items = posts.map { |post| feed_item(post) }
{
icon: icon_url,
favicon: favicon_url,
items: items,
home_page_url: @site.url,
author:,
version: FEED_VERSION,
authors: [author],
feed_url: @site.url_for("/feed.json"),
language: "en-CA",
title: @site.title
}
end
def icon_url
@site.url_for("/images/apple-touch-icon-300.png")
end
def favicon_url
@site.url_for("/images/apple-touch-icon-80.png")
end
def feed_item(post)
content_html = Views::FeedPostView.new(post:, site: @site).call
permalink = @site.url_for(post.path)
item = {}
item[:url] = permalink
item[:external_url] = post.link if post.link_post?
item[:tags] = post.tags unless post.tags.empty?
item[:content_html] = content_html
item[:title] = post.link_post? ? "#{post.title}" : post.title
item[:author] = {name: post.author}
item[:date_published] = post.date.iso8601
item[:id] = permalink
item
end
end
end
end