ragerender 0.1.7 → 0.1.8

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: 152c14ba01c06c930b537a0e1c72a994e673fa8aea1176b82f92adfc912e5e77
4
- data.tar.gz: bfb9fa9e0e5d4e1dae45c3bdc7fc09fd7de45fdcbb3043fd45c26e11404b0d1d
3
+ metadata.gz: c3398336663640ad12e5ca290c96e61fd8fbb19e9851b8944a6434a3eca2c2d2
4
+ data.tar.gz: d00c31c1051eba512321b80e524c3d117f8d8970ebfd3fc8e9ad7ca4030b358d
5
5
  SHA512:
6
- metadata.gz: 78e6690eb005da5ac9604c4111612b3e3dcf2d68c52bb8b351dc6165d3fecf9acc8267cfb69d551a6ee8374bb6b660d812465e2bb14875e2d95199c5b1a81a6e
7
- data.tar.gz: 841b860abb04b124f88aa730ece8650fce559f08a889598f4121b503eb6d5c3ef03bb396f6afffe860ded22cffb92d887750cd597b170369dbc74e7660d8f1ea
6
+ metadata.gz: 5d7674505e282530b8e19ad5f085b8516888e206bf7a28fb1c9b3e27b127665ca5be9cc056841aca784b382a1eedf8c60d566003a27a851ce227698d55fd2647
7
+ data.tar.gz: d092d5d375481b8662ea97baa4cbf89e6c1d50347e132654a66af39599750a40dfc9531e1197d2e77761468666e78bd914a65472554254a4cd98e46772011bf7
data/README.rdoc CHANGED
@@ -92,6 +92,7 @@ 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
+ status: active
95
96
  genres:
96
97
  - Comedy
97
98
  - Romance
@@ -154,6 +155,8 @@ details of your author notes and blogs manually:
154
155
  date: "2025-03-05 16:20"
155
156
  image: "images/ghost.png"
156
157
  author: "Jane doe"
158
+ description: "Some spooky mouseover text"
159
+ keywords: [excellent, comic page, spooky]
157
160
  custom:
158
161
  # use yes and no for tickbox settings
159
162
  spooky: yes
@@ -164,6 +167,9 @@ details of your author notes and blogs manually:
164
167
  Testing webcomics
165
168
  Now easier than ever
166
169
  Thanks to RageRender
170
+ transcript: >
171
+ The transcript contains a machine-readable version
172
+ of all the text in your comic image.
167
173
  comments:
168
174
  - author: "Skippy"
169
175
  date: "13 Mar 2025, 3.45 PM"
@@ -0,0 +1,2 @@
1
+ _layouts
2
+ test-layout.cflxml
@@ -0,0 +1,51 @@
1
+ require 'forwardable'
2
+ require 'liquid'
3
+ require_relative '../lib/ragerender/cflxml'
4
+ require_relative '../lib/ragerender/jekyll'
5
+
6
+ TEMPLATE_DROPS = {
7
+ 'archive' => RageRender::ArchiveDrop,
8
+ 'comic-page' => RageRender::ComicDrop,
9
+ 'error-page' => RageRender::ErrorDrop,
10
+ 'blog-archive' => RageRender::BlogArchiveDrop,
11
+ 'blog-display' => RageRender::BlogDrop,
12
+ 'overview' => RageRender::OverviewDrop,
13
+ 'search' => RageRender::SearchDrop,
14
+ }
15
+
16
+ Liquid::Template.error_mode = :strict
17
+ Liquid::Template.file_system = Liquid::LocalFileSystem.new('_includes', '%s.html')
18
+
19
+ directory '_layouts'
20
+
21
+ TEMPLATE_DROPS.each do |layout, drop|
22
+ file "_layouts/#{layout}.html" => ['_layouts', RageRender.const_source_location(drop.name).first, "_templates/#{layout}.html", __FILE__] do |t|
23
+ fields = Set.new(drop.invokable_methods) -
24
+ Set.new(Jekyll::Drops::DocumentDrop.invokable_methods)
25
+ all_fields = Set.new(RageRender::WebcomicDrop.invokable_methods) -
26
+ Set.new(Jekyll::Drops::DocumentDrop.invokable_methods)
27
+ template_name = "_templates/#{layout}.html"
28
+ template = Liquid::Template.parse File::read template_name, environment: ENV
29
+
30
+ rake_output_message "liquid ... >#{t.name} <#{template_name}"
31
+ File::write t.name, template.render!({
32
+ 'title' => "#{drop.name.rpartition(/[A-Z]/).first.split('::').last} Page",
33
+ 'all_fields' => all_fields.to_a.sort,
34
+ 'fields' => fields.to_a.sort,
35
+ 'loops' => [*drop.loops, *RageRender::WebcomicDrop.loops].map {|k, v| {"name" => k.to_s, "fields" => v.map(&:to_s)} },
36
+ }, strict_variables: true, strict_filters: true)
37
+ end
38
+ end
39
+
40
+ file '_layouts/overall.html' => '_templates/overall.html' do |t|
41
+ cp t.source, t.name
42
+ end
43
+
44
+ file 'test-layout.cflxml' => ['layout.css', '_layouts/overall.html', *TEMPLATE_DROPS.keys.map {|n| "_layouts/#{n}.html"}] do |t|
45
+ File.open t.name, 'w' do |f|
46
+ rake_output_message 'bundle exec jekyll pack'
47
+ RageRender.pack '_layouts', '.', f
48
+ end
49
+ end
50
+
51
+ task :default => 'test-layout.cflxml'
@@ -0,0 +1,8 @@
1
+ <tr>
2
+ <td>{{ name }}</td>
3
+ <td>[v:{{field}}]</td>
4
+ <td>
5
+ <script type="text/javascript">document.currentScript.parentElement.append(document.createTextNode([f:js|v:{{field}}]))</script>
6
+ </td>
7
+ <td>[c:{{field}}]true[/][c:!{{field}}]false[/]</td>
8
+ </tr>
@@ -0,0 +1,15 @@
1
+ {% assign looped_fields = loops | map: "name" %}
2
+ {% for field in fields -%}
3
+ {%- include "field_row", name: field, field: field -%}
4
+ {% if looped_fields contains field %}
5
+ {% assign field_obj = loops | where: "name", field %}
6
+ {% assign field_fields = field_obj[0].fields %}
7
+ [l:{{field}}]
8
+ {% for field_field in field_fields %}
9
+ {% capture name %}{{field}}&lbrack;[v:l.aiteration]&rbrack; → {{ field_field }}{% endcapture %}
10
+ {% assign field_name = field_field | prepend: "l." %}
11
+ {%- include "field_row", name: name, field: field_name %}
12
+ {% endfor %}
13
+ [/]
14
+ {% endif %}
15
+ {% endfor -%}
@@ -0,0 +1,22 @@
1
+ <table>
2
+ <thead>
3
+ <tr>
4
+ <th>Variable name</th>
5
+ <th>Value on this page</th>
6
+ <th>Value (escaped)</th>
7
+ <th>True or false in conditional</th>
8
+ </tr>
9
+ </thead>
10
+ <tbody>
11
+ <tr>
12
+ <th colspan=4>Unique to this page</th>
13
+ </tr>
14
+ {%- include "field_rows", fields: fields, loops: loops -%}
15
+ </tbody>
16
+ <tbody>
17
+ <tr>
18
+ <th colspan=4>On all pages</th>
19
+ </tr>
20
+ {%- include "field_rows", fields: all_fields, loops: loops -%}
21
+ </tbody>
22
+ </table>
@@ -0,0 +1,3 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,3 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,3 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,3 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,3 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,90 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
6
+
7
+ <meta property="og:type" content="website" />
8
+ <meta property="og:title" content="[v:webcomicname]" />
9
+ <meta property="og:description" content="[v:pagetitle]" />
10
+ [c:permalink]
11
+ <meta property="og:url" content="[v:permalink]" />
12
+ [/]
13
+ <meta name="twitter:card" content="summary_large_image" />
14
+ <meta name="twitter:title" content="[v:webcomicname]" />
15
+ <meta name="twitter:description" content="[v:pagetitle]" />
16
+
17
+ [c:previewimageurl]
18
+ <meta property="og:image" content="[v:previewimageurl]" />
19
+ <meta property="og:image:width" content="[v:previewimagewidth]" />
20
+ <meta property="og:image:height" content="[v:previewimageheight]" />
21
+ <meta name="twitter:image" content="[v:previewimageurl]" />
22
+ [/]
23
+
24
+ <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss/" />
25
+
26
+ <title>[v:webcomicname] - [v:pagetitle]</title>
27
+ [v:layoutcss]
28
+ </head>
29
+ <body>
30
+ <header>
31
+ <h1><a href="/">[v:webcomicname]</a></h1>
32
+ <div id="slogan">[v:webcomicslogan]</div>
33
+ </header>
34
+
35
+
36
+ <nav class="site-nav">
37
+ <ul id="navigation">
38
+ <li><a href="/">Home</a></li>
39
+ <li><a href="/comics/#content-start">Latest</a></li>
40
+ <li><a href="/comics/1/#content-start">First</a></li>
41
+ [c:searchon]
42
+ <li><a href="/search/">Search</a></li>
43
+ [/]
44
+ <li><a href="/archive/">Archive</a></li>
45
+ [c:infinitescrollenabled]
46
+ <li><a href="[v:infinitescrolllink]">Scroll View</a></li>
47
+ [/]
48
+ [c:hasblogs]
49
+ <li><a href="/blog/">Blog</a></li>
50
+ [/]
51
+ [c:!hidefromhost]
52
+ <li><a href="[v:addsubscriptionlink]">Subscribe</a></li>
53
+ [/]
54
+ [l:extrapages]
55
+ <li><a href="[v:l.link]">[v:l.title]</a></li>
56
+ [/]
57
+ </ul>
58
+ </nav>
59
+
60
+ <!--layout:[content]-->
61
+ <footer>
62
+ <div>
63
+ <ul>
64
+ <li>
65
+ <a href="/rss/">RSS</a>
66
+ </li>
67
+ [c:!hidefromhost]
68
+ <li>
69
+ <a href="[v:comicprofile]">Comic Profile</a>
70
+ </li>
71
+ [/]
72
+ <li>
73
+ <a href="#">Top</a>
74
+ </li>
75
+ </ul>
76
+ </div>
77
+
78
+ <div class="hostedby">
79
+ <span>Hosted by </span>
80
+ <a href="https://comicfury.com">
81
+ <img src="https://comicfury.com/images/gator-icon-black.png" height="22" style="height:22px; width:auto;" />
82
+ ComicFury
83
+ </a>
84
+ </div>
85
+ <div>
86
+ &copy; [v:copyrights]<br />
87
+ </div>
88
+ </footer>
89
+ </body>
90
+ </html>
@@ -0,0 +1,3 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,10 @@
1
+ <h2>{{ title }}</h2>
2
+
3
+ <form method="post" action="/search/" id="searchbox">
4
+ <div class="searchbar">
5
+ <input type="text" name="search" value="[v:searchterm]" placeholder="Search Term" id="bigsearchbox" />
6
+ <input type="submit" value="Search!" class="submit" />
7
+ </div>
8
+ </form>
9
+
10
+ {%- include "field_table", all_fields: all_fields, fields: fields, loops: loops -%}
@@ -0,0 +1,50 @@
1
+ body {
2
+ max-width: 1024px;
3
+ margin: 2em auto 0;
4
+
5
+ font-family: monospace;
6
+ }
7
+
8
+ body::before {
9
+ content: "";
10
+ display: block;
11
+ position: absolute;
12
+ left: 0;
13
+ top: 0;
14
+ right: 0;
15
+ height: 0;
16
+ background: yellow;
17
+ border-top: 1em black dashed;
18
+ transform: skewX(-35deg);
19
+ max-width: 99vw;
20
+ }
21
+
22
+ table td, table th {
23
+ background: white;
24
+ padding: 1ch;
25
+ }
26
+
27
+ table td:nth-child(2) {
28
+ max-width: 35vw;
29
+ overflow: scroll;
30
+ }
31
+
32
+ table td:nth-child(3) {
33
+ word-wrap: anywhere;
34
+ }
35
+
36
+ table tr:nth-child(even) {
37
+ filter: invert(0.1);
38
+ }
39
+
40
+ table th {
41
+ filter: invert(0.2);
42
+ }
43
+
44
+ td:empty::before {
45
+ content: 'blank';
46
+ display: inline-block;
47
+ background: rgba(0, 0, 0, 0.15);
48
+ padding: 0px 4px;
49
+ border-radius: 5px;
50
+ }
@@ -76,7 +76,6 @@ module RageRender
76
76
 
77
77
  PAGINATION_FIELDS = %w[ chaptername chapterdescription chapterid ]
78
78
 
79
- delegate_method_as :data, :fallback_data
80
79
  extend Pipettes
81
80
  extend Forwardable
82
81
 
@@ -93,6 +92,8 @@ module RageRender
93
92
  end
94
93
 
95
94
  def cover_width_small
95
+ return nil if cover_width.nil?
96
+
96
97
  if (cover_height.to_f / COVER_MAX_HEIGHT) > (cover_width.to_f / COVER_MAX_WIDTH)
97
98
  (cover_height_small * cover_width) / cover_height
98
99
  else
@@ -101,6 +102,8 @@ module RageRender
101
102
  end
102
103
 
103
104
  def cover_height_small
105
+ return nil if cover_height.nil?
106
+
104
107
  if (cover_height.to_f / COVER_MAX_HEIGHT) > (cover_width.to_f / COVER_MAX_WIDTH)
105
108
  [COVER_MAX_HEIGHT, cover_height].min
106
109
  else
@@ -122,8 +125,16 @@ module RageRender
122
125
  def_image_metadata :image
123
126
  private :image_url, :image_width, :image_height
124
127
 
128
+ def comics
129
+ @obj.site.collections['comics'].docs.select {|c| c.data['chapter'] == @obj.data['slug'] }
130
+ end
131
+
125
132
  def first_comic
126
- @obj.site.collections['comics'].docs.select {|c| c.data['chapter'] == @obj.data['slug'] }.first
133
+ comics.first
134
+ end
135
+
136
+ def fallback_data
137
+ {}
127
138
  end
128
139
 
129
140
  public
@@ -7,6 +7,7 @@ require 'jekyll/document'
7
7
  require 'jekyll/drops/drop'
8
8
  require 'jekyll/drops/document_drop'
9
9
  require_relative '../date_formats'
10
+ require_relative 'chapter'
10
11
  require_relative 'pipettes'
11
12
 
12
13
  Jekyll::Hooks.register :comics, :pre_render do |page, payload|
@@ -65,12 +66,16 @@ module RageRender
65
66
 
66
67
  def generate site
67
68
  site.collections['comics'].docs.each do |comic|
68
- comic.data['image'] ||= default_image_path(comic)
69
+ comic.data['image'] ||= default_image_path(site, comic)
69
70
  end
70
71
  end
71
72
 
72
- def default_image_path comic
73
- "images/#{comic.data['slug']}.jpg"
73
+ def images site
74
+ @images ||= site.static_files.select {|f| f.relative_path.start_with? '/images' }.map {|f| [f.basename, f] }.to_h
75
+ end
76
+
77
+ def default_image_path site, comic
78
+ images(site)[comic.data['slug']].relative_path
74
79
  end
75
80
  end
76
81
 
@@ -98,11 +103,24 @@ module RageRender
98
103
  def_delegator :@obj, :url, :permalink
99
104
  data_delegator 'rating'
100
105
  data_delegator 'votecount'
106
+ data_delegator 'comments'
101
107
 
102
108
  def comictitle
103
109
  escape @obj.data['title']
104
110
  end
105
111
 
112
+ def comicdescription
113
+ escape @obj.data['description']
114
+ end
115
+
116
+ def transcript
117
+ escape @obj.data['transcript']
118
+ end
119
+
120
+ def comickeywords
121
+ (@obj.data['keywords'] || []).map {|k| escape k }.join(', ')
122
+ end
123
+
106
124
  def comicnumber
107
125
  1 + all_comics.index(@obj)
108
126
  end
@@ -123,20 +141,24 @@ module RageRender
123
141
  @obj.date.month
124
142
  end
125
143
 
126
- def usechapters
127
- all_comics.any? {|comic| comic.data.include? 'chapter' }
128
- end
129
-
130
144
  def haschapter
131
145
  @obj.data.include? 'chapter'
132
146
  end
133
147
 
134
- def chaptername
135
- escape(chapter.data['title']) rescue nil
148
+ def_safe_delegator :chapterdrop, :chapterid, :chapterid
149
+ def_safe_delegator :chapterdrop, :chaptername, :chaptername
150
+ def_safe_delegator :chapterdrop, :chapterdescription, :chapterdescription
151
+ def_safe_delegator :chapter, :url, :chapterlink
152
+
153
+ def_safe_delegator :prevchapterdrop, :url, :prevchapter
154
+ def_safe_delegator :nextchapterdrop, :url, :nextchapter
155
+
156
+ def isfirstcomicinchapter
157
+ (chapterdrop&.send(:comics) || []).first == @obj
136
158
  end
137
159
 
138
- def chapterlink
139
- chapter&.url
160
+ def islastcomicinchapter
161
+ (chapterdrop&.send(:comics) || []).last == @obj
140
162
  end
141
163
 
142
164
  def_loop :dropdown, :is_selected, :is_disabled, :title, :grouplabel, :newgroup, :endgroup, :url
@@ -204,24 +226,28 @@ module RageRender
204
226
  all_comics.last == @obj
205
227
  end
206
228
 
207
- def prevcomic
208
- @obj.previous_doc&.url
209
- end
229
+ def_safe_delegator :prevcomicdrop, :url, :prevcomic
230
+ def_safe_delegator :prevcomicdrop, :permalink, :prevcomicpermalink
231
+ def_safe_delegator :prevcomicdrop, :title, :prevcomictitle
210
232
 
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
233
+ def_safe_delegator :nextcomicdrop, :url, :nextcomic
234
+ def_safe_delegator :nextcomicdrop, :permalink, :nextcomicpermalink
235
+ def_safe_delegator :nextcomicdrop, :title, :nextcomictitle
216
236
 
217
- def nextcomic
218
- @obj.next_doc&.url
237
+ def prevcomicbychapter
238
+ if isfirstcomicinchapter
239
+ (prevchapterdrop&.send(:comics) || []).last
240
+ else
241
+ (chapterdrop&.send(:comics) || []).each_cons(2).detect {|_, this| this == @obj }&.first
242
+ end&.url
219
243
  end
220
244
 
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
245
+ def nextcomicbychapter
246
+ if islastcomicinchapter
247
+ nextchapterdrop&.send(:first_comic)
248
+ else
249
+ (chapterdrop&.send(:comics) || []).each_cons(2).detect {|this, _| this == @obj }&.last
250
+ end&.url
225
251
  end
226
252
 
227
253
  # An HTML tag to print for the comic image. If there is a future image, then
@@ -231,7 +257,9 @@ module RageRender
231
257
  <a href="#{nextcomic}">
232
258
  HTML
233
259
  image = <<~HTML
234
- <img id="comicimage" src="#{comicimageurl}" width="#{comicwidth}" height="#{comicheight}">
260
+ <img id="comicimage" src="#{comicimageurl}" alt="#{comictitle}"
261
+ width="#{comicwidth}" height="#{comicheight}"
262
+ title="#{comicdescription}">
235
263
  HTML
236
264
  linkclose = nextcomic ? <<~HTML : ''
237
265
  </a>
@@ -258,6 +286,26 @@ module RageRender
258
286
  @obj.site.collections['chapters'].docs.detect {|c| c.data['slug'] == @obj.data['chapter'] }
259
287
  end
260
288
 
289
+ def nextcomicdrop
290
+ @obj.next_doc.nil? ? nil : ComicDrop.new(@obj.next_doc)
291
+ end
292
+
293
+ def prevcomicdrop
294
+ @obj.previous_doc.nil? ? nil : ComicDrop.new(@obj.previous_doc)
295
+ end
296
+
297
+ def chapterdrop
298
+ chapter.nil? ? nil : ChapterDrop.new(chapter)
299
+ end
300
+
301
+ def prevchapterdrop
302
+ chapter&.previous_doc.nil? ? nil : ChapterDrop.new(chapter.previous_doc)
303
+ end
304
+
305
+ def nextchapterdrop
306
+ chapter&.next_doc.nil? ? nil : ChapterDrop.new(chapter.next_doc)
307
+ end
308
+
261
309
  data_delegator 'image'
262
310
  def_image_metadata :image
263
311
  private :image, :image_url, :image_width, :image_height
@@ -11,6 +11,12 @@ module RageRender
11
11
  payload.send(:fallback_data).delete_if {|k| methods.include? k}
12
12
  end
13
13
 
14
+ def def_safe_delegator obj, key, aliaz
15
+ define_method(aliaz.to_sym) do
16
+ send(obj.to_sym)&.send(key.to_sym)
17
+ end
18
+ end
19
+
14
20
  def def_data_delegator key, aliaz
15
21
  define_method(aliaz.to_sym) do
16
22
  @obj.data[key.to_s]
@@ -134,8 +134,8 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
134
134
  extend Forwardable
135
135
  extend RageRender::Pipettes
136
136
 
137
- def self.def_config_delegator source, target
138
- define_method(target) { @obj.site.config[source.to_s] }
137
+ def self.def_config_delegator source, target, default=nil
138
+ define_method(target) { @obj.site.config.fetch(source.to_s, default) }
139
139
  end
140
140
 
141
141
  def_config_delegator :search, :searchon
@@ -143,14 +143,38 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
143
143
  def_config_delegator var, var
144
144
  end
145
145
 
146
+ def webcomicid
147
+ @obj.site.config['id'] || @obj.site.hash
148
+ end
149
+
146
150
  def webcomicname
147
151
  escape @obj.site.config['title']
148
152
  end
149
153
 
150
154
  def webcomicslogan
155
+ escape @obj.site.config['slogan']
156
+ end
157
+
158
+ def webcomicdescription
151
159
  escape @obj.site.config['description']
152
160
  end
153
161
 
162
+ def webcomicactivitystatus
163
+ escape @obj.site.config['status']&.capitalize
164
+ end
165
+
166
+ def webcomicsub
167
+ URI.parse(@obj.site.config['url']).host.split.first
168
+ end
169
+
170
+ def comicprofile
171
+ "https://comicfury.com/comicprofile.php?url=#{webcomicsub}"
172
+ end
173
+
174
+ def addsubscriptionlink
175
+ "https://comicfury.com/comic.php?action=addsubscription&url=#{webcomicsub}"
176
+ end
177
+
154
178
  def_loop :webcomicgenres, :genre_link, :genre_name
155
179
  def webcomicgenres
156
180
  (@obj.site.config['genres'] || []).map do |g|
@@ -166,7 +190,15 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
166
190
  end
167
191
 
168
192
  def webcomicurl
169
- @obj.site.baseurl
193
+ @obj.site.config['url']
194
+ end
195
+
196
+ def webcomicrating
197
+ @obj.site.config['rating']
198
+ end
199
+
200
+ def lastupdate
201
+ comicfury_date Time.now
170
202
  end
171
203
 
172
204
  def lastupdatedmy
@@ -194,14 +226,34 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
194
226
  @obj.site.posts.docs.any?
195
227
  end
196
228
 
229
+ def hascomics
230
+ comicsnum > 0
231
+ end
232
+
233
+ def comicsnum
234
+ @obj.site.collections['comics'].docs.size
235
+ end
236
+
237
+ def usechapters
238
+ @obj.site.collections['comics'].docs.any? {|comic| comic.data.include? 'chapter' }
239
+ end
240
+
241
+ %w{subscriptions pageviewsnum visitsnum}.each do |var|
242
+ def_config_delegator var, var, 0
243
+ end
244
+
197
245
  def hidefromhost
198
246
  false
199
247
  end
200
248
 
201
- def_loop :extrapages, :link, :title
249
+ def_loop :extrapages, :link, :title, :foldername
202
250
  def extrapages
203
251
  @obj.site.pages.reject {|page| page.data['hidden'] }.map do |page|
204
- {'link' => page.url, 'title' => escape(page.data['title'])}
252
+ {
253
+ 'link' => page.url,
254
+ 'title' => escape(page.data['title']),
255
+ 'foldername' => File.basename(URI::parse(page.url).path, '.*'),
256
+ }
205
257
  end
206
258
  end
207
259
 
@@ -232,14 +284,58 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
232
284
  escape @obj.data['title']
233
285
  end
234
286
 
287
+ def isarchive
288
+ @obj.data['layout'] == 'archive'
289
+ end
290
+
291
+ def issearch
292
+ @obj.data['layout'] == 'search'
293
+ end
294
+
235
295
  def iscomicpage
236
- @obj.type == :comics
296
+ @obj.data['layout'] == 'comic-page'
297
+ end
298
+
299
+ def isblog
300
+ @obj.data['layout'] == 'blog-archive'
301
+ end
302
+
303
+ def isoverview
304
+ @obj.data['layout'] == 'overview'
305
+ end
306
+
307
+ def iserrorpage
308
+ @obj.data['layout'] == 'error-page'
309
+ end
310
+
311
+ def isfrontpage
312
+ @obj.data['slug'] == 'frontpage'
313
+ end
314
+
315
+ def iscomicrelatedpage
316
+ @obj.type == :comics || @obj.data['layout'] == 'overview'
237
317
  end
238
318
 
239
319
  def isextrapage
240
320
  @obj.type == :pages && @obj.data['hidden'] != true
241
321
  end
242
322
 
323
+ def currentdate
324
+ comicfury_date Date.today
325
+ end
326
+
327
+ def day
328
+ Date.today.day
329
+ end
330
+
331
+ def month
332
+ Date.today.month
333
+ end
334
+
335
+ def year
336
+ Date.today.year
337
+ end
338
+
243
339
  def fallback_data
244
340
  {}
245
341
  end
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.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Worthington
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-02-26 00:00:00.000000000 Z
11
+ date: 2026-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rsec
@@ -184,6 +184,7 @@ 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
+ status: active
187
188
  genres:
188
189
  - Comedy
189
190
  - Romance
@@ -246,6 +247,8 @@ description: |-
246
247
  date: "2025-03-05 16:20"
247
248
  image: "images/ghost.png"
248
249
  author: "Jane doe"
250
+ description: "Some spooky mouseover text"
251
+ keywords: [excellent, comic page, spooky]
249
252
  custom:
250
253
  # use yes and no for tickbox settings
251
254
  spooky: yes
@@ -256,6 +259,9 @@ description: |-
256
259
  Testing webcomics
257
260
  Now easier than ever
258
261
  Thanks to RageRender
262
+ transcript: >
263
+ The transcript contains a machine-readable version
264
+ of all the text in your comic image.
259
265
  comments:
260
266
  - author: "Skippy"
261
267
  date: "13 Mar 2025, 3.45 PM"
@@ -356,6 +362,20 @@ files:
356
362
  - assets/comic-not-found.html
357
363
  - assets/overview.html
358
364
  - assets/search.html
365
+ - inspector/.gitignore
366
+ - inspector/Rakefile
367
+ - inspector/_includes/field_row.html
368
+ - inspector/_includes/field_rows.html
369
+ - inspector/_includes/field_table.html
370
+ - inspector/_templates/archive.html
371
+ - inspector/_templates/blog-archive.html
372
+ - inspector/_templates/blog-display.html
373
+ - inspector/_templates/comic-page.html
374
+ - inspector/_templates/error-page.html
375
+ - inspector/_templates/overall.html
376
+ - inspector/_templates/overview.html
377
+ - inspector/_templates/search.html
378
+ - inspector/layout.css
359
379
  - lib/ragerender.rb
360
380
  - lib/ragerender/cflxml.rb
361
381
  - lib/ragerender/date_formats.rb