|
1 | 1 | require 'jekyll' |
2 | 2 |
|
3 | 3 | class RSSGenerator < Jekyll::Generator |
4 | | - ROW_MATCHER = /^-\s*\[(?<title>[^\]]+)\]\((?<url>[^)]+)\){:\s*.article(?<data>(\s*data-\w+="[^"]+")+)\s*}\s*$/ |
5 | | - DATA_MATCHER = /data-(?<key>\w+)="(?<value>[^"]+)"/ |
6 | 4 | def generate(site) |
7 | 5 | @index_page = site.pages.find { |page| page.name == "index.md" } |
8 | 6 | site.pages.each do |page| |
9 | 7 | page.data['articles'] = articles if %w(feed.xml rss.xml).include?(page.name) |
10 | 8 | end |
11 | 9 | end |
12 | 10 |
|
| 11 | + private |
13 | 12 | def articles |
14 | | - unless @articles |
15 | | - @articles = [] |
16 | | - rows.each do |row| |
17 | | - article = {} |
18 | | - m = row.match(ROW_MATCHER) |
19 | | - m[:data].scan(DATA_MATCHER) do |key, value| |
20 | | - article[key] = value |
21 | | - end |
22 | | - set_title(article, m) |
23 | | - article["url"] = m[:url] |
24 | | - @articles << article |
25 | | - end |
26 | | - end |
27 | | - @articles |
| 13 | + @articles ||= Article.all(rows) |
28 | 14 | end |
29 | 15 |
|
30 | | - private |
31 | 16 | def rows |
32 | 17 | @index_page.content.split(/#articles\s*}\n\n/).last.split(/## \[동영상\]/).first.split(/\n/) |
33 | 18 | end |
| 19 | +end |
34 | 20 |
|
35 | | - def set_title(article, m) |
36 | | - if article["tags"].include?("translated") |
37 | | - article["title"] = "[번역] #{m[:title]}" |
| 21 | +class Article |
| 22 | + ROW_MATCHER = /^-\s*\[(?<title>[^\]]+)\]\((?<url>[^)]+)\){:\s*.article(?<data>(\s*data-\w+="[^"]+")+)\s*}\s*$/ |
| 23 | + DATA_MATCHER = /data-(?<key>\w+)="(?<value>[^"]+)"/ |
| 24 | + InvalidRow = Class.new(RuntimeError) |
| 25 | + attr_reader :info |
| 26 | + |
| 27 | + def self.all(rows) |
| 28 | + rows.map { |row| new(row).to_h } |
| 29 | + end |
| 30 | + |
| 31 | + def initialize(row) |
| 32 | + m = row.match(ROW_MATCHER) |
| 33 | + raise InvalidRow, "invalid row: #{row}" unless m |
| 34 | + @info = { "url" => m[:url] } |
| 35 | + set_data(m) |
| 36 | + set_title(m) |
| 37 | + end |
| 38 | + |
| 39 | + def to_h |
| 40 | + @info |
| 41 | + end |
| 42 | + |
| 43 | + private |
| 44 | + def set_title(m) |
| 45 | + if @info["tags"].include?("translated") |
| 46 | + @info["title"] = "[번역] #{m[:title]}" |
38 | 47 | else |
39 | | - article["title"] = m[:title] |
| 48 | + @info["title"] = m[:title] |
| 49 | + end |
| 50 | + end |
| 51 | + |
| 52 | + def set_data(m) |
| 53 | + m[:data].scan(DATA_MATCHER) do |key, value| |
| 54 | + @info[key] = value |
40 | 55 | end |
41 | 56 | end |
42 | 57 | end |
0 commit comments