ragerender 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 313e3cd9c0ccd4c11ea547a565e2a1cfa77af1fda5e2fc2219c0da8046c6f27a
4
- data.tar.gz: 3911407ca12e719f71396099f73d70c6b19aeee29ccc38f796ef4c45b684d80d
3
+ metadata.gz: 152c14ba01c06c930b537a0e1c72a994e673fa8aea1176b82f92adfc912e5e77
4
+ data.tar.gz: bfb9fa9e0e5d4e1dae45c3bdc7fc09fd7de45fdcbb3043fd45c26e11404b0d1d
5
5
  SHA512:
6
- metadata.gz: 4ca0ef393683e910b68e9ffe41a5909511ec66da604b50bcb99fbd758cad371bdeafdd594e1a27394e461beb3e0e8f41c4c3033a28f4c7692a492b470251f8b2
7
- data.tar.gz: 5509097f24aa3df45416be46acb9d2f31710318b4227b190f9413dcec287d6c473793bff0fd08b3ecf7b1cc49617b9437739fc991d1c9bd2a309fcbd61eef199
6
+ metadata.gz: 78e6690eb005da5ac9604c4111612b3e3dcf2d68c52bb8b351dc6165d3fecf9acc8267cfb69d551a6ee8374bb6b660d812465e2bb14875e2d95199c5b1a81a6e
7
+ data.tar.gz: 841b860abb04b124f88aa730ece8650fce559f08a889598f4121b503eb6d5c3ef03bb396f6afffe860ded22cffb92d887750cd597b170369dbc74e7660d8f1ea
data/README.rdoc CHANGED
@@ -49,7 +49,7 @@ To set up a new site, open a terminal and type:
49
49
  mkdir mycomic && cd mycomic
50
50
  bundle init
51
51
  bundle add jekyll
52
- bundle add ragerender
52
+ bundle add ragerender --group=jekyll_plugins
53
53
 
54
54
  Now you can add comics! Add the image into an <tt>images</tt> folder:
55
55
 
@@ -92,6 +92,9 @@ Put something like this in your webcomic folder and call it
92
92
  description: >
93
93
  My epic story about how him and her
94
94
  fell into a romantic polycule with they and them
95
+ genres:
96
+ - Comedy
97
+ - Romance
95
98
 
96
99
  defaults:
97
100
  - scope:
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: Comic not found
3
+ layout: error-page
4
+ hidden: true
5
+ published: false
6
+ ---
7
+ This webcomic does not have any comic pages yet!
@@ -1,6 +1,7 @@
1
1
  require 'jekyll/generator'
2
2
  require 'jekyll/drops/drop'
3
3
  require_relative 'comics'
4
+ require_relative 'chapter'
4
5
  require_relative 'pagination'
5
6
  require_relative 'pipettes'
6
7
 
@@ -113,6 +114,7 @@ module RageRender
113
114
  !show_comic_list
114
115
  end
115
116
 
117
+ def_loop :chapters, *(RageRender::ChapterDrop.invokable_methods - Jekyll::Drops::DocumentDrop.invokable_methods)
116
118
  def chapters
117
119
  unless show_chapter_overview
118
120
  @obj.site.collections['chapters'].docs.reject do |page|
@@ -123,13 +125,14 @@ module RageRender
123
125
  end
124
126
  end
125
127
 
128
+ def_loop :comics_paginated, :number, :newchapter, :chapterend, *ComicDrop::PAGINATION_FIELDS, *ChapterDrop::PAGINATION_FIELDS
126
129
  def comics_paginated
127
130
  number = @obj.data['number']
128
131
  comics = if number
129
132
  selected_comics.to_a[number - 1]
130
133
  else
131
134
  selected_comics.to_a.flatten
132
- end.group_by {|c| c.data['chapter'] }
135
+ end&.group_by {|c| c.data['chapter'] } || []
133
136
 
134
137
  comics.map do |chapter, comics|
135
138
  chapter_data = ChapterDrop.new(@obj.site.collections['chapters'].docs.detect {|c| c.data['slug'] == chapter })
@@ -52,11 +52,40 @@ module RageRender
52
52
  end
53
53
  end
54
54
 
55
+ # Data representing a single paginated blog entry, as available from
56
+ # [l:blogs_paginated].
57
+ class PaginatedBlogDrop < Jekyll::Drops::DocumentDrop
58
+ extend Pipettes
59
+
60
+ def_data_delegator :title, :blogtitle
61
+ def_delegator :@obj, :url, :bloglink
62
+ def_data_delegator :author, :authorname
63
+ def_delegator :@obj, :content, :blog
64
+ # TODO profilelink
65
+
66
+ private delegate_method_as :data, :fallback_data
67
+
68
+ def posttime
69
+ comicfury_date(@obj.date)
70
+ end
71
+
72
+ def allowcomments
73
+ @obj.site.config['allowcomments']
74
+ end
75
+
76
+ def comments
77
+ (@obj.data['comments'] || []).size
78
+ end
79
+ end
80
+
55
81
  # Data to pass to a blog archive page.
56
82
  class BlogArchiveDrop < Jekyll::Drops::Drop
83
+ extend Pipettes
84
+
57
85
  private delegate_method_as :data, :fallback_data
58
86
  data_delegator 'number'
59
87
 
88
+ def_loop :blogs_paginated, *(RageRender::PaginatedBlogDrop.invokable_methods - Jekyll::Drops::DocumentDrop.invokable_methods)
60
89
  def blogs_paginated
61
90
  all_blogs[number-1]&.map {|blog| PaginatedBlogDrop.new(blog).to_liquid } || []
62
91
  end
@@ -81,36 +110,11 @@ module RageRender
81
110
  }
82
111
  end
83
112
  end
113
+ def_loop :pages, :page, :pagelink, :is_current, :skipped_ahead
84
114
 
85
115
  private
86
116
  def all_blogs
87
117
  @all_blogs = @obj.site.posts.docs.each_slice(BLOGS_PER_PAGE).to_a
88
118
  end
89
119
  end
90
-
91
- # Data representing a single paginated blog entry, as available from
92
- # [l:blogs_paginated].
93
- class PaginatedBlogDrop < Jekyll::Drops::DocumentDrop
94
- extend Pipettes
95
-
96
- def_data_delegator :title, :blogtitle
97
- def_delegator :@obj, :url, :bloglink
98
- def_data_delegator :author, :authorname
99
- def_delegator :@obj, :content, :blog
100
- # TODO profilelink
101
-
102
- private delegate_method_as :data, :fallback_data
103
-
104
- def posttime
105
- comicfury_date(@obj.date)
106
- end
107
-
108
- def allowcomments
109
- @obj.site.config['allowcomments']
110
- end
111
-
112
- def comments
113
- (@obj.data['comments'] || []).size
114
- end
115
- end
116
120
  end
@@ -74,7 +74,7 @@ module RageRender
74
74
  COVER_MAX_HEIGHT = 420
75
75
  COVER_MAX_WIDTH = 300
76
76
 
77
- PAGINATION_FIELDS = %w[ chaptername chapterdescription ]
77
+ PAGINATION_FIELDS = %w[ chaptername chapterdescription chapterid ]
78
78
 
79
79
  delegate_method_as :data, :fallback_data
80
80
  extend Pipettes
@@ -84,6 +84,10 @@ module RageRender
84
84
  def_data_delegator :image, :image
85
85
  def_delegator :@obj, :url, :chapterarchiveurl
86
86
 
87
+ def chapterid
88
+ @obj.collection.docs.index @obj
89
+ end
90
+
87
91
  def chaptername
88
92
  escape @obj.data['title']
89
93
  end
@@ -116,6 +120,7 @@ module RageRender
116
120
 
117
121
  private
118
122
  def_image_metadata :image
123
+ private :image_url, :image_width, :image_height
119
124
 
120
125
  def first_comic
121
126
  @obj.site.collections['comics'].docs.select {|c| c.data['chapter'] == @obj.data['slug'] }.first
@@ -1,5 +1,10 @@
1
+ require 'uri'
2
+ require 'liquid/drop'
3
+ require 'jekyll/hooks'
4
+ require 'jekyll/plugin'
1
5
  require 'jekyll/generator'
2
6
  require 'jekyll/document'
7
+ require 'jekyll/drops/drop'
3
8
  require 'jekyll/drops/document_drop'
4
9
  require_relative '../date_formats'
5
10
  require_relative 'pipettes'
@@ -12,6 +17,8 @@ end
12
17
  module RageRender
13
18
  SPECIAL_COMIC_SLUGS = %w{frontpage index}
14
19
 
20
+ BASE_DIR = File.join(File.dirname(__FILE__), '..', '..', '..')
21
+
15
22
  # Creates comics for each file found in the 'images' directory
16
23
  # that does not already have an associated comic object.
17
24
  class ComicFromImageGenerator < Jekyll::Generator
@@ -42,9 +49,14 @@ module RageRender
42
49
  def generate site
43
50
  comics = site.collections['comics']
44
51
  index = comics.docs.last.dup
52
+ collection = comics.docs
53
+ if index.nil?
54
+ index = site.pages.detect {|p| p.data["title"] == "Comic not found" }.dup
55
+ collection = site.pages
56
+ end
45
57
  index.instance_variable_set(:"@data", index.data.dup)
46
58
  index.data['slug'] = 'index'
47
- comics.docs << index
59
+ collection << index
48
60
  end
49
61
  end
50
62
 
@@ -91,10 +103,26 @@ module RageRender
91
103
  escape @obj.data['title']
92
104
  end
93
105
 
106
+ def comicnumber
107
+ 1 + all_comics.index(@obj)
108
+ end
109
+
110
+ def comicsnum
111
+ all_comics.size
112
+ end
113
+
94
114
  def posttime
95
115
  comicfury_date(@obj.date)
96
116
  end
97
117
 
118
+ def postyear
119
+ @obj.date.year
120
+ end
121
+
122
+ def postmonth
123
+ @obj.date.month
124
+ end
125
+
98
126
  def usechapters
99
127
  all_comics.any? {|comic| comic.data.include? 'chapter' }
100
128
  end
@@ -111,6 +139,7 @@ module RageRender
111
139
  chapter&.url
112
140
  end
113
141
 
142
+ def_loop :dropdown, :is_selected, :is_disabled, :title, :grouplabel, :newgroup, :endgroup, :url
114
143
  def dropdown
115
144
  all_comics.each_with_object([]) do |c, dropdown|
116
145
  new_group = dropdown.last.nil? ? true : dropdown.last['grouplabel'] != c.data['chapter']
@@ -143,6 +172,7 @@ module RageRender
143
172
  end
144
173
  end
145
174
 
175
+ def_loop :authornotes, :is_reply, :comment, :isguest, :avatar, :authorname, :commentanchor, :posttime, :profilelink
146
176
  def authornotes
147
177
  @obj.data['authornotes'] || [{
148
178
  'is_reply' => false,
@@ -178,10 +208,22 @@ module RageRender
178
208
  @obj.previous_doc&.url
179
209
  end
180
210
 
211
+ def prevcomicpermalink
212
+ unless @obj.previous_doc.nil?
213
+ URI.join(@obj.site.config["url"], @obj.site.baseurl || '/', @obj.previous_doc&.url).to_s
214
+ end
215
+ end
216
+
181
217
  def nextcomic
182
218
  @obj.next_doc&.url
183
219
  end
184
220
 
221
+ def nextcomicpermalink
222
+ unless @obj.next_doc.nil?
223
+ URI.join(@obj.site.config["url"], @obj.site.baseurl || '/', @obj.next_doc&.url).to_s
224
+ end
225
+ end
226
+
185
227
  # An HTML tag to print for the comic image. If there is a future image, then
186
228
  # this is also a link to the next comic page.
187
229
  def comicimage
@@ -197,6 +239,10 @@ module RageRender
197
239
  [linkopen, image, linkclose].join
198
240
  end
199
241
 
242
+ def keys
243
+ super.reject {|k| private_methods.include? k.to_sym }
244
+ end
245
+
200
246
  def to_liquid
201
247
  super.reject do |k, v|
202
248
  Jekyll::Drops::DocumentDrop::NESTED_OBJECT_FIELD_BLACKLIST.include? k
@@ -214,6 +260,7 @@ module RageRender
214
260
 
215
261
  data_delegator 'image'
216
262
  def_image_metadata :image
263
+ private :image, :image_url, :image_width, :image_height
217
264
 
218
265
  public
219
266
  alias comicimageurl image_url
@@ -7,17 +7,22 @@ require_relative 'blog_archive'
7
7
  Jekyll::Hooks.register :pages, :pre_render do |page, payload|
8
8
  if page.data['layout'] == 'overview'
9
9
  RageRender::Pipettes.clean_payload payload
10
- payload.merge! RageRender::ComicDrop.new(page.site.collections['comics'].docs.last).to_liquid
10
+ latest_comic = page.site.collections['comics'].docs.last
11
+ if latest_comic
12
+ payload.merge! RageRender::ComicDrop.new(latest_comic).to_liquid
13
+ end
11
14
  payload.merge! RageRender::OverviewDrop.new(page).to_liquid
12
15
  end
13
16
  end
14
17
 
15
18
  module RageRender
16
19
  class OverviewDrop < Jekyll::Drops::Drop
20
+ extend Pipettes
17
21
  private delegate_method_as :data, :fallback_data
18
22
 
23
+ def_loop :latestblogs, *(RageRender::PaginatedBlogDrop.invokable_methods - Jekyll::Drops::DocumentDrop.invokable_methods)
19
24
  def latestblogs
20
- @obj.site.posts.docs[-5..].map {|post| RageRender::PaginatedBlogDrop.new(post) }
25
+ @obj.site.posts.docs[-5..]&.map {|post| RageRender::PaginatedBlogDrop.new(post) } || []
21
26
  end
22
27
  end
23
28
  end
@@ -17,6 +17,14 @@ module RageRender
17
17
  end
18
18
  end
19
19
 
20
+ def def_loop method, *fields
21
+ (@loops ||= {})[method.to_sym] = fields
22
+ end
23
+
24
+ def loops
25
+ @loops || {}
26
+ end
27
+
20
28
  def self.extended mod
21
29
  mod.define_method(:escape) do |str|
22
30
  str.nil? ? nil : CGI.escapeHTML(str)
@@ -33,6 +41,7 @@ module RageRender
33
41
  define_method(:"#{prefix}_relative_path") do
34
42
  Pathname.new('/').join(send(prefix.to_sym)).to_path
35
43
  end
44
+ private :"#{prefix}_relative_path"
36
45
 
37
46
  define_method(:"#{prefix}_url") do
38
47
  File.join (@obj.site.baseurl || ''), send(:"#{prefix}_relative_path")
@@ -44,17 +53,19 @@ module RageRender
44
53
  end
45
54
  instance_variable_get(:"@#{prefix}_obj")
46
55
  end
56
+ private :"#{prefix}_obj"
47
57
 
48
58
  define_method(:"#{prefix}_path") do
49
59
  send(:"#{prefix}_obj").path
50
60
  end
61
+ private :"#{prefix}_path"
51
62
 
52
63
  define_method(:"#{prefix}_width") do
53
- send(:"#{prefix}_obj").data['width'] ||= Dimensions.width(send(:"#{prefix}_path")) rescue nil
64
+ send(:"#{prefix}_obj") && (send(:"#{prefix}_obj").data['width'] ||= Dimensions.width(send(:"#{prefix}_path")) rescue nil)
54
65
  end
55
66
 
56
67
  define_method(:"#{prefix}_height") do
57
- send(:"#{prefix}_obj").data['height'] ||= Dimensions.height(send(:"#{prefix}_path")) rescue nil
68
+ send(:"#{prefix}_obj") && (send(:"#{prefix}_obj").data['height'] ||= Dimensions.height(send(:"#{prefix}_path")) rescue nil)
58
69
  end
59
70
  end
60
71
  end
@@ -7,6 +7,8 @@ end
7
7
 
8
8
  module RageRender
9
9
  class SearchDrop < Jekyll::Drops::Drop
10
+ extend Pipettes
11
+
10
12
  private delegate_method_as :data, :fallback_data
11
13
  data_delegator 'searchterm'
12
14
 
@@ -14,6 +16,7 @@ module RageRender
14
16
  !searchterm.nil?
15
17
  end
16
18
 
19
+ def_loop :searchresults, :number, *ComicDrop::PAGINATION_FIELDS
17
20
  def searchresults
18
21
  return [] unless searched
19
22
  @results ||= @obj.site.collections['comics'].docs.select do |comic|
@@ -1,6 +1,10 @@
1
1
  require 'etc'
2
2
  require 'stringio'
3
- require 'jekyll'
3
+ require 'jekyll/command'
4
+ require 'jekyll/hooks'
5
+ require 'jekyll/plugin'
6
+ require 'jekyll/generator'
7
+ require 'liquid/drop'
4
8
  require_relative 'language'
5
9
  require_relative 'functions'
6
10
  require_relative 'to_liquid'
@@ -57,6 +61,7 @@ Jekyll::Hooks.register :site, :after_init do |site|
57
61
  site.config['theme'] ||= 'ragerender'
58
62
  site.config['title'] ||= File.basename(site.source)
59
63
  site.config['search'] ||= true
64
+ site.config['url'] ||= "https://#{File.basename(site.source)}.thecomicseries.com"
60
65
  site.config = site.config
61
66
 
62
67
  setup_collection site, :comics, '/:collection/:slug/', layout: 'comic-page', chapter: '0'
@@ -105,6 +110,10 @@ class RageRender::FrontpageGenerator < Jekyll::Generator
105
110
  collection = site.pages
106
111
  site.pages.detect {|p| p.data["slug"] == frontpage }
107
112
  end.dup
113
+ if index.nil?
114
+ collection = site.pages
115
+ index = site.pages.detect {|p| p.data['title'] == 'Comic not found' }.dup
116
+ end
108
117
  index.instance_variable_set(:"@data", index.data.dup)
109
118
  index.data['permalink'] = '/index.html'
110
119
  index.data['slug'] = 'frontpage'
@@ -142,6 +151,20 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
142
151
  escape @obj.site.config['description']
143
152
  end
144
153
 
154
+ def_loop :webcomicgenres, :genre_link, :genre_name
155
+ def webcomicgenres
156
+ (@obj.site.config['genres'] || []).map do |g|
157
+ {
158
+ 'genre_name' => escape(g),
159
+ 'genre_link' => "https://comicfury.com/search.php?vr=1&query=&tags=#{g.downcase.gsub(/[^a-z]/, '')}"
160
+ }
161
+ end
162
+ end
163
+
164
+ def webcomicgenre
165
+ (webcomicgenres.first || {})['genre_name']
166
+ end
167
+
145
168
  def webcomicurl
146
169
  @obj.site.baseurl
147
170
  end
@@ -151,7 +174,7 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
151
174
  end
152
175
 
153
176
  def copyrights
154
- escape @obj.site.config['copyrights'].gsub('[year]', Date.today.year.to_s)
177
+ escape @obj.site.config.fetch('copyrights', '').gsub('[year]', Date.today.year.to_s)
155
178
  end
156
179
 
157
180
  def banner
@@ -175,6 +198,7 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
175
198
  false
176
199
  end
177
200
 
201
+ def_loop :extrapages, :link, :title
178
202
  def extrapages
179
203
  @obj.site.pages.reject {|page| page.data['hidden'] }.map do |page|
180
204
  {'link' => page.url, 'title' => escape(page.data['title'])}
@@ -194,6 +218,7 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
194
218
  css_files << Pathname.new(@obj.site.theme.includes_path).join('layout.css') unless css_files.any?
195
219
  css_files.map {|f| File.read f }.join
196
220
  end
221
+ private :css
197
222
 
198
223
  def layoutcss
199
224
  <<~HTML
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ragerender
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Worthington
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-09-21 00:00:00.000000000 Z
11
+ date: 2026-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rsec
@@ -141,7 +141,7 @@ description: |-
141
141
  mkdir mycomic && cd mycomic
142
142
  bundle init
143
143
  bundle add jekyll
144
- bundle add ragerender
144
+ bundle add ragerender --group=jekyll_plugins
145
145
 
146
146
  Now you can add comics! Add the image into an <tt>images</tt> folder:
147
147
 
@@ -184,6 +184,9 @@ description: |-
184
184
  description: >
185
185
  My epic story about how him and her
186
186
  fell into a romantic polycule with they and them
187
+ genres:
188
+ - Comedy
189
+ - Romance
187
190
 
188
191
  defaults:
189
192
  - scope:
@@ -350,6 +353,7 @@ files:
350
353
  - assets/archive-comics.html
351
354
  - assets/archive.html
352
355
  - assets/blog.html
356
+ - assets/comic-not-found.html
353
357
  - assets/overview.html
354
358
  - assets/search.html
355
359
  - lib/ragerender.rb