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 +4 -4
- data/README.rdoc +6 -0
- data/inspector/.gitignore +2 -0
- data/inspector/Rakefile +51 -0
- data/inspector/_includes/field_row.html +8 -0
- data/inspector/_includes/field_rows.html +15 -0
- data/inspector/_includes/field_table.html +22 -0
- data/inspector/_templates/archive.html +3 -0
- data/inspector/_templates/blog-archive.html +3 -0
- data/inspector/_templates/blog-display.html +3 -0
- data/inspector/_templates/comic-page.html +3 -0
- data/inspector/_templates/error-page.html +3 -0
- data/inspector/_templates/overall.html +90 -0
- data/inspector/_templates/overview.html +3 -0
- data/inspector/_templates/search.html +10 -0
- data/inspector/layout.css +50 -0
- data/lib/ragerender/jekyll/chapter.rb +13 -2
- data/lib/ragerender/jekyll/comics.rb +74 -26
- data/lib/ragerender/jekyll/pipettes.rb +6 -0
- data/lib/ragerender/jekyll.rb +102 -6
- metadata +22 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c3398336663640ad12e5ca290c96e61fd8fbb19e9851b8944a6434a3eca2c2d2
|
|
4
|
+
data.tar.gz: d00c31c1051eba512321b80e524c3d117f8d8970ebfd3fc8e9ad7ca4030b358d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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"
|
data/inspector/Rakefile
ADDED
|
@@ -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,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}}[[v:l.aiteration]] → {{ 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,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
|
+
© [v:copyrights]<br />
|
|
87
|
+
</div>
|
|
88
|
+
</footer>
|
|
89
|
+
</body>
|
|
90
|
+
</html>
|
|
@@ -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
|
-
|
|
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
|
|
73
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
|
139
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
229
|
+
def_safe_delegator :prevcomicdrop, :url, :prevcomic
|
|
230
|
+
def_safe_delegator :prevcomicdrop, :permalink, :prevcomicpermalink
|
|
231
|
+
def_safe_delegator :prevcomicdrop, :title, :prevcomictitle
|
|
210
232
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
|
218
|
-
|
|
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
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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}"
|
|
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]
|
data/lib/ragerender/jekyll.rb
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
-
{
|
|
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.
|
|
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.
|
|
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-
|
|
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
|