ragerender 0.1.4 → 0.1.5
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 -2
- data/lib/ragerender/functions.rb +9 -1
- data/lib/ragerender/jekyll/archive.rb +2 -2
- data/lib/ragerender/jekyll/blog.rb +10 -4
- data/lib/ragerender/jekyll/blog_archive.rb +2 -2
- data/lib/ragerender/jekyll/chapter.rb +6 -3
- data/lib/ragerender/jekyll/comics.rb +21 -30
- data/lib/ragerender/jekyll/error.rb +2 -2
- data/lib/ragerender/jekyll/pipettes.rb +53 -0
- data/lib/ragerender/jekyll.rb +29 -7
- data/lib/ragerender/language.rb +2 -2
- data/lib/ragerender/to_erb.rb +2 -12
- data/lib/ragerender/to_liquid.rb +23 -34
- metadata +9 -5
- data/lib/ragerender/jekyll/named_data_delegator.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aedbeb388659f01299aa3694a3f30bd1368e09e9f729caa31334fff4300c6b7c
|
4
|
+
data.tar.gz: 11e966fefecb160bf9992f6697ae8fc23dbe299095c1bc458af6395fb29903c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbdffe416a3edb68d95c256456341c19199d09d71cbc0ef8d3a2f3b41b362048ec81d67848982beca07d2560d4a164758861c152d9b24d71f76010ee45bfc793
|
7
|
+
data.tar.gz: 266d915e6744dd58bf1f5db3fe795105190f9a09081ed03b596d7c58420e258d0f3ff7e1546c209c051bfb936654583d528c5555835ce5340b2863f0158baf67
|
data/README.rdoc
CHANGED
@@ -60,10 +60,14 @@ The file name of the image will be the title of your comic page. And that's it,
|
|
60
60
|
you added your first comic!
|
61
61
|
|
62
62
|
If you want to add an author note, create a text file in a folder called
|
63
|
-
<tt>_comics</tt> that has the same file name, but with a <tt>.
|
63
|
+
<tt>_comics</tt> that has the same file name, but with a <tt>.txt</tt> extension:
|
64
64
|
|
65
65
|
mkdir _comics
|
66
|
-
echo "Check out my cool comic y'all!" > '_comics/My first page.
|
66
|
+
echo "Check out my cool comic y'all!" > '_comics/My first page.txt'
|
67
|
+
|
68
|
+
Or use HTML:
|
69
|
+
|
70
|
+
echo "This is my <strong>first</strong> page!" > '_comics/My first page.html'
|
67
71
|
|
68
72
|
Generate the site using:
|
69
73
|
|
data/lib/ragerender/functions.rb
CHANGED
@@ -1,17 +1,25 @@
|
|
1
1
|
require 'cgi'
|
2
|
+
require 'json'
|
2
3
|
|
3
4
|
# Include this module to get ComicFury intrinsic functions available in
|
4
5
|
# templates.
|
5
6
|
module RageRender
|
6
7
|
module TemplateFunctions
|
7
8
|
def js str
|
8
|
-
|
9
|
+
JSON.generate(str, script_safe: true, ascii_only: true).gsub(/[<>'&]|\\"/) do |m|
|
10
|
+
'\u' + sprintf('%04x', m.chars.last.ord).upcase
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
14
|
def randomnumber a, b
|
12
15
|
rand a.to_i..b.to_i
|
13
16
|
end
|
14
17
|
|
18
|
+
# Unescape all HTML entities in the input
|
19
|
+
def rawhtml str
|
20
|
+
CGI.unescape_html str
|
21
|
+
end
|
22
|
+
|
15
23
|
# https://github.com/Shopify/liquid/blob/9bb7fbf123e6e2bd61e00189b1c83159f375d3f3/lib/liquid/standardfilters.rb#L24-L29
|
16
24
|
# Used under the MIT License.
|
17
25
|
STRIP_HTML_BLOCKS = Regexp.union(
|
@@ -2,7 +2,7 @@ require 'jekyll/generator'
|
|
2
2
|
require 'jekyll/drops/drop'
|
3
3
|
require_relative 'comics'
|
4
4
|
require_relative 'pagination'
|
5
|
-
require_relative '
|
5
|
+
require_relative 'pipettes'
|
6
6
|
|
7
7
|
# Pass the right variables to archive pages. Note that this doesn't apply to
|
8
8
|
# chapter pages because they are not "pages"
|
@@ -98,7 +98,7 @@ module RageRender
|
|
98
98
|
# A Drop that provides all of the page variables for the archive pages.
|
99
99
|
class ArchiveDrop < Jekyll::Drops::Drop
|
100
100
|
private delegate_method_as :data, :fallback_data
|
101
|
-
extend
|
101
|
+
extend Pipettes
|
102
102
|
|
103
103
|
def ischapterarchive
|
104
104
|
@obj.type == :chapters
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'jekyll/hooks'
|
2
2
|
require 'jekyll/drops/document_drop'
|
3
3
|
require_relative '../date_formats'
|
4
|
-
require_relative '
|
4
|
+
require_relative 'pipettes'
|
5
5
|
|
6
6
|
Jekyll::Hooks.register :posts, :pre_render do |post, payload|
|
7
7
|
payload.merge! RageRender::BlogDrop.new(post).to_liquid
|
@@ -10,11 +10,17 @@ end
|
|
10
10
|
module RageRender
|
11
11
|
class BlogDrop < Jekyll::Drops::DocumentDrop
|
12
12
|
private delegate_method_as :data, :fallback_data
|
13
|
-
extend
|
13
|
+
extend Pipettes
|
14
14
|
|
15
|
-
def_data_delegator :title, :blogtitle
|
16
15
|
def_data_delegator :author, :authorname
|
17
|
-
|
16
|
+
|
17
|
+
def blogtitle
|
18
|
+
escape @obj.data['title']
|
19
|
+
end
|
20
|
+
|
21
|
+
def blog
|
22
|
+
maybe_escape @obj.content
|
23
|
+
end
|
18
24
|
|
19
25
|
def posttime
|
20
26
|
comicfury_date @obj.date
|
@@ -3,7 +3,7 @@ require 'jekyll/drops/drop'
|
|
3
3
|
require 'jekyll/drops/document_drop'
|
4
4
|
require_relative '../date_formats'
|
5
5
|
require_relative 'pagination'
|
6
|
-
require_relative '
|
6
|
+
require_relative 'pipettes'
|
7
7
|
|
8
8
|
# Pass the right variables to blog archive pages.
|
9
9
|
Jekyll::Hooks.register :pages, :pre_render do |page, payload|
|
@@ -90,7 +90,7 @@ module RageRender
|
|
90
90
|
# Data representing a single paginated blog entry, as available from
|
91
91
|
# [l:blogs_paginated].
|
92
92
|
class PaginatedBlogDrop < Jekyll::Drops::DocumentDrop
|
93
|
-
extend
|
93
|
+
extend Pipettes
|
94
94
|
|
95
95
|
def_data_delegator :title, :blogtitle
|
96
96
|
def_delegator :@obj, :url, :bloglink
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'jekyll/generator'
|
2
2
|
require 'jekyll/drops/document_drop'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'pipettes'
|
4
4
|
require_relative 'setup_collection'
|
5
5
|
|
6
6
|
# Add default values for the 'unchapter' which is used to hold all comics that
|
@@ -76,13 +76,16 @@ module RageRender
|
|
76
76
|
PAGINATION_FIELDS = %w[ chaptername chapterdescription ]
|
77
77
|
|
78
78
|
delegate_method_as :data, :fallback_data
|
79
|
-
extend
|
79
|
+
extend Pipettes
|
80
80
|
extend Forwardable
|
81
81
|
|
82
|
-
def_data_delegator :title, :chaptername
|
83
82
|
def_data_delegator :description, :chapterdescription
|
84
83
|
def_delegator :@obj, :url, :chapterarchiveurl
|
85
84
|
|
85
|
+
def chaptername
|
86
|
+
escape @obj.data['title']
|
87
|
+
end
|
88
|
+
|
86
89
|
def cover
|
87
90
|
cover_obj.url
|
88
91
|
end
|
@@ -2,7 +2,7 @@ require 'jekyll/generator'
|
|
2
2
|
require 'jekyll/document'
|
3
3
|
require 'jekyll/drops/document_drop'
|
4
4
|
require_relative '../date_formats'
|
5
|
-
require_relative '
|
5
|
+
require_relative 'pipettes'
|
6
6
|
|
7
7
|
Jekyll::Hooks.register :comics, :pre_render do |page, payload|
|
8
8
|
payload.merge! RageRender::ComicDrop.new(page).to_liquid
|
@@ -76,16 +76,19 @@ module RageRender
|
|
76
76
|
end
|
77
77
|
|
78
78
|
class ComicDrop < Jekyll::Drops::DocumentDrop
|
79
|
-
extend
|
79
|
+
extend Pipettes
|
80
80
|
|
81
81
|
PAGINATION_FIELDS = %w[ comicurl comictitle posttime ]
|
82
82
|
|
83
83
|
delegate_method_as :id, :comicid
|
84
|
-
def_data_delegator :title, :comictitle
|
85
84
|
def_delegator :@obj, :url, :comicurl
|
86
85
|
data_delegator 'rating'
|
87
86
|
data_delegator 'votecount'
|
88
87
|
|
88
|
+
def comictitle
|
89
|
+
escape @obj.data['title']
|
90
|
+
end
|
91
|
+
|
89
92
|
def posttime
|
90
93
|
comicfury_date(@obj.date)
|
91
94
|
end
|
@@ -99,11 +102,11 @@ module RageRender
|
|
99
102
|
end
|
100
103
|
|
101
104
|
def chaptername
|
102
|
-
chapter.data['title']
|
105
|
+
escape(chapter.data['title']) rescue nil
|
103
106
|
end
|
104
107
|
|
105
108
|
def chapterlink
|
106
|
-
chapter
|
109
|
+
chapter&.url
|
107
110
|
end
|
108
111
|
|
109
112
|
def dropdown
|
@@ -118,7 +121,7 @@ module RageRender
|
|
118
121
|
dropdown << {
|
119
122
|
'is_selected' => @obj == c,
|
120
123
|
'is_disabled' => false,
|
121
|
-
'title' => c.data['title'],
|
124
|
+
'title' => escape(c.data['title']),
|
122
125
|
'grouplabel' => c.data['chapter'],
|
123
126
|
'newgroup' => new_group,
|
124
127
|
'endgroup' => false,
|
@@ -141,7 +144,7 @@ module RageRender
|
|
141
144
|
def authornotes
|
142
145
|
@obj.data['authornotes'] || [{
|
143
146
|
'is_reply' => false,
|
144
|
-
'comment' => @obj.content,
|
147
|
+
'comment' => maybe_escape(@obj.content),
|
145
148
|
'isguest' => false,
|
146
149
|
'avatar' => nil,
|
147
150
|
'authorname' => @obj.data['author'],
|
@@ -152,8 +155,12 @@ module RageRender
|
|
152
155
|
end
|
153
156
|
|
154
157
|
def custom
|
155
|
-
|
158
|
+
chapter_data = chapter.nil? ? {} : chapter.data.fetch('custom', {})
|
159
|
+
comic_data = @obj.data.fetch('custom', {})
|
160
|
+
chapter_data.merge(comic_data).reject do |k, v|
|
156
161
|
v.nil? || (v.respond_to?(:empty?) && v.empty?)
|
162
|
+
end.transform_values do |v|
|
163
|
+
v.is_a?(String) ? escape(v) : v
|
157
164
|
end
|
158
165
|
end
|
159
166
|
|
@@ -173,18 +180,6 @@ module RageRender
|
|
173
180
|
@obj.next_doc&.url
|
174
181
|
end
|
175
182
|
|
176
|
-
def comicimageurl
|
177
|
-
File.join (@obj.site.baseurl || ''), image_relative_path
|
178
|
-
end
|
179
|
-
|
180
|
-
def comicwidth
|
181
|
-
image_obj.data['width'] ||= Dimensions.width image_path
|
182
|
-
end
|
183
|
-
|
184
|
-
def comicheight
|
185
|
-
image_obj.data['height'] ||= Dimensions.height image_path
|
186
|
-
end
|
187
|
-
|
188
183
|
# An HTML tag to print for the comic image. If there is a future image, then
|
189
184
|
# this is also a link to the next comic page.
|
190
185
|
def comicimage
|
@@ -215,16 +210,12 @@ module RageRender
|
|
215
210
|
@obj.site.collections['chapters'].docs.detect {|c| c.data['slug'] == @obj.data['chapter'] }
|
216
211
|
end
|
217
212
|
|
218
|
-
|
219
|
-
|
220
|
-
end
|
221
|
-
|
222
|
-
def image_path
|
223
|
-
image_obj.path
|
224
|
-
end
|
213
|
+
data_delegator 'image'
|
214
|
+
def_image_metadata :image
|
225
215
|
|
226
|
-
|
227
|
-
|
228
|
-
|
216
|
+
public
|
217
|
+
alias comicimageurl image_url
|
218
|
+
alias comicwidth image_width
|
219
|
+
alias comicheight image_height
|
229
220
|
end
|
230
221
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'pipettes'
|
2
2
|
|
3
3
|
Jekyll::Hooks.register :pages, :pre_render do |page, payload|
|
4
4
|
if page.data['layout'] == 'error-page'
|
@@ -9,7 +9,7 @@ end
|
|
9
9
|
module RageRender
|
10
10
|
class ErrorDrop < Jekyll::Drops::Drop
|
11
11
|
private delegate_method_as :data, :fallback_data
|
12
|
-
extend
|
12
|
+
extend Pipettes
|
13
13
|
extend Forwardable
|
14
14
|
|
15
15
|
def_data_delegator :title, :errortitle
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Pipettes help you make drops.
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module RageRender
|
5
|
+
module Pipettes
|
6
|
+
def def_data_delegator key, aliaz
|
7
|
+
define_method(aliaz.to_sym) do
|
8
|
+
@obj.data[key.to_s]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.extended mod
|
13
|
+
mod.define_method(:escape) do |str|
|
14
|
+
str.nil? ? nil : CGI.escapeHTML(str)
|
15
|
+
end
|
16
|
+
mod.send(:private, :escape)
|
17
|
+
|
18
|
+
mod.define_method(:maybe_escape) do |str|
|
19
|
+
Pathname.new(@obj.path).extname != '.html' ? escape(str) : str
|
20
|
+
end
|
21
|
+
mod.send(:private, :maybe_escape)
|
22
|
+
end
|
23
|
+
|
24
|
+
def def_image_metadata prefix
|
25
|
+
define_method(:"#{prefix}_relative_path") do
|
26
|
+
Pathname.new('/').join(send(prefix.to_sym)).to_path
|
27
|
+
end
|
28
|
+
|
29
|
+
define_method(:"#{prefix}_url") do
|
30
|
+
File.join (@obj.site.baseurl || ''), send(:"#{prefix}_relative_path")
|
31
|
+
end
|
32
|
+
|
33
|
+
define_method(:"#{prefix}_obj") do
|
34
|
+
unless instance_variable_defined? :"@#{prefix}_obj"
|
35
|
+
instance_variable_set(:"@#{prefix}_obj", @obj.site.static_files.detect {|f| f.relative_path == send(:"#{prefix}_relative_path") })
|
36
|
+
end
|
37
|
+
instance_variable_get(:"@#{prefix}_obj")
|
38
|
+
end
|
39
|
+
|
40
|
+
define_method(:"#{prefix}_path") do
|
41
|
+
send(:"#{prefix}_obj").path
|
42
|
+
end
|
43
|
+
|
44
|
+
define_method(:"#{prefix}_width") do
|
45
|
+
send(:"#{prefix}_obj").data['width'] ||= Dimensions.width(send(:"#{prefix}_path")) rescue nil
|
46
|
+
end
|
47
|
+
|
48
|
+
define_method(:"#{prefix}_height") do
|
49
|
+
send(:"#{prefix}_obj").data['height'] ||= Dimensions.height(send(:"#{prefix}_path")) rescue nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/ragerender/jekyll.rb
CHANGED
@@ -14,7 +14,7 @@ require_relative 'jekyll/chapter'
|
|
14
14
|
require_relative 'jekyll/overview'
|
15
15
|
require_relative 'jekyll/error'
|
16
16
|
require_relative 'jekyll/search'
|
17
|
-
require_relative 'jekyll/
|
17
|
+
require_relative 'jekyll/pipettes'
|
18
18
|
require_relative 'jekyll/setup_collection'
|
19
19
|
|
20
20
|
Jekyll::Hooks.register :site, :after_init do |site|
|
@@ -89,19 +89,25 @@ end
|
|
89
89
|
|
90
90
|
class RageRender::WebcomicDrop < Jekyll::Drops::Drop
|
91
91
|
extend Forwardable
|
92
|
-
extend RageRender::
|
92
|
+
extend RageRender::Pipettes
|
93
93
|
|
94
94
|
def self.def_config_delegator source, target
|
95
95
|
define_method(target) { @obj.site.config[source.to_s] }
|
96
96
|
end
|
97
97
|
|
98
|
-
def_config_delegator :title, :webcomicname
|
99
|
-
def_config_delegator :description, :webcomicslogan
|
100
98
|
def_config_delegator :search, :searchon
|
101
99
|
%w{bannerads allowratings showpermalinks showcomments allowcomments}.each do |var|
|
102
100
|
def_config_delegator var, var
|
103
101
|
end
|
104
102
|
|
103
|
+
def webcomicname
|
104
|
+
escape @obj.site.config['title']
|
105
|
+
end
|
106
|
+
|
107
|
+
def webcomicslogan
|
108
|
+
escape @obj.site.config['description']
|
109
|
+
end
|
110
|
+
|
105
111
|
def webcomicurl
|
106
112
|
@obj.site.baseurl
|
107
113
|
end
|
@@ -111,7 +117,7 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
|
|
111
117
|
end
|
112
118
|
|
113
119
|
def copyrights
|
114
|
-
@obj.site.config['copyrights'].gsub('[year]', Date.today.year.to_s)
|
120
|
+
escape @obj.site.config['copyrights'].gsub('[year]', Date.today.year.to_s)
|
115
121
|
end
|
116
122
|
|
117
123
|
def banner
|
@@ -122,6 +128,11 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
|
|
122
128
|
Pathname.new(@obj.site.baseurl || '/').join(@obj.site.config['webcomicavatar'] || '').to_path
|
123
129
|
end
|
124
130
|
|
131
|
+
def webcomicicon
|
132
|
+
@obj.site.config.fetch('webcomicavatar', '')
|
133
|
+
end
|
134
|
+
def_image_metadata :webcomicicon
|
135
|
+
|
125
136
|
def hasblogs
|
126
137
|
@obj.site.posts.docs.any?
|
127
138
|
end
|
@@ -132,7 +143,7 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
|
|
132
143
|
|
133
144
|
def extrapages
|
134
145
|
@obj.site.pages.reject {|page| page.data['hidden'] }.map do |page|
|
135
|
-
{'link' => page.url, 'title' => page.data['title']}
|
146
|
+
{'link' => page.url, 'title' => escape(page.data['title'])}
|
136
147
|
end
|
137
148
|
end
|
138
149
|
|
@@ -150,8 +161,19 @@ class RageRender::WebcomicDrop < Jekyll::Drops::Drop
|
|
150
161
|
css_files.map {|f| File.read f }.join
|
151
162
|
end
|
152
163
|
|
164
|
+
def layoutcss
|
165
|
+
<<~HTML
|
166
|
+
<style type="text/css">
|
167
|
+
#{css}
|
168
|
+
</style>
|
169
|
+
HTML
|
170
|
+
end
|
171
|
+
|
153
172
|
delegate_method_as :url, :permalink
|
154
|
-
|
173
|
+
|
174
|
+
def pagetitle
|
175
|
+
escape @obj.data['title']
|
176
|
+
end
|
155
177
|
|
156
178
|
def iscomicpage
|
157
179
|
@obj.type == :comics
|
data/lib/ragerender/language.rb
CHANGED
@@ -45,13 +45,13 @@ module RageRender
|
|
45
45
|
/!?/.r.map {|c| c == '!' },
|
46
46
|
PATH.map {|p| Variable.new(p) },
|
47
47
|
optional(OPERATOR),
|
48
|
-
optional(VARIABLE |
|
48
|
+
optional(VARIABLE | /[^\]]+/.r))
|
49
49
|
).map {|(reversed, lhs, operator, rhs)| Conditional.new reversed, lhs, operator, rhs }
|
50
50
|
|
51
51
|
# FUNCTION with no arguments: 'f:cowsay' => Function.new("cowsay", [])
|
52
52
|
# FUNCTION with a variable argument: 'f:js|v:foo' => Function.new('js', [Variable.new(['foo'])])
|
53
53
|
# FUNCTION with literal arguments: 'f:add|2|3' => Function.new('add', ['2', '3'])
|
54
|
-
FUNCTION = ('f:'.r >> seq(IDENT, ('|'.r >> (VARIABLE |
|
54
|
+
FUNCTION = ('f:'.r >> seq(IDENT, ('|'.r >> (VARIABLE | /[^\]\|]+/.r)).star)).map {|(name, params)| Function.new name, params }
|
55
55
|
|
56
56
|
# TAG matches variable tags: '[v:value]' => Variable.new(["value"])
|
57
57
|
# TAG matches loop tags: '[l:loop]' => Loop.new(["loop"])
|
data/lib/ragerender/to_erb.rb
CHANGED
@@ -20,7 +20,7 @@ module RageRender
|
|
20
20
|
elsif chunk.path == ['l', 'iteration']
|
21
21
|
'<%= index %>'
|
22
22
|
else
|
23
|
-
"<%= #{chunk.path.join('.')}
|
23
|
+
"<%= #{chunk.path.join('.')} rescue nil %>"
|
24
24
|
end
|
25
25
|
|
26
26
|
when Language::Conditional
|
@@ -70,23 +70,13 @@ module RageRender
|
|
70
70
|
when /^[0-9]+$/
|
71
71
|
param
|
72
72
|
else
|
73
|
-
"\"#{param}\""
|
73
|
+
"\"#{param.gsub(/['"]/) {|c| "\\" + c}}\""
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
if ERB_OPERATORS.include? chunk.name
|
78
78
|
"<%= #{params.join(ERB_OPERATORS[chunk.name])} %>"
|
79
|
-
elsif chunk.name == 'rawhtml'
|
80
|
-
"<%= #{params.first} %>"
|
81
79
|
else
|
82
|
-
params = params.zip(chunk.params).map do |param, old_param|
|
83
|
-
case old_param
|
84
|
-
when Language::Variable
|
85
|
-
param + ".to_s.gsub(/'/, ''').gsub(/\"/, '"')"
|
86
|
-
else
|
87
|
-
param
|
88
|
-
end
|
89
|
-
end
|
90
80
|
"<%= #{chunk.name}(#{params.join(', ')}) %>"
|
91
81
|
end
|
92
82
|
|
data/lib/ragerender/to_liquid.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'digest'
|
1
2
|
require_relative 'language'
|
2
3
|
|
3
4
|
module RageRender
|
@@ -6,37 +7,20 @@ module RageRender
|
|
6
7
|
'subtract' => proc {|f| [Language::Function.new('minus', f.params)] },
|
7
8
|
'multiply' => proc {|f| [Language::Function.new('times', f.params)] },
|
8
9
|
'divide' => proc {|f| [Language::Function.new('divided_by', f.params)] },
|
9
|
-
'removehtmltags' => proc {|f|
|
10
|
-
'rawhtml' => proc {|f| f.params }
|
10
|
+
'removehtmltags' => proc {|f| Language::Function.new('strip_html', f.params) },
|
11
11
|
}
|
12
12
|
|
13
|
-
|
14
|
-
'"' => '"',
|
15
|
-
"'" => ''',
|
16
|
-
}
|
17
|
-
|
18
|
-
REPLACE_QUOTES = ["replace: '\"', '"'", "replace: \"'\", '''"].join(' | ')
|
19
|
-
|
20
|
-
QUOTE_ESCAPER = proc do |f|
|
21
|
-
output = []
|
22
|
-
params = f.params.each_with_index do |param, index|
|
23
|
-
case param
|
24
|
-
when Language::Variable
|
25
|
-
new_name = param.path.join('_')
|
26
|
-
output << "{% assign #{new_name} = #{render_value(param)} | #{REPLACE_QUOTES} %}"
|
27
|
-
Language::Variable.new([new_name])
|
28
|
-
else
|
29
|
-
param
|
30
|
-
end
|
31
|
-
end
|
32
|
-
output << Language::Function.new(f.name, params)
|
33
|
-
output
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.render_value value
|
13
|
+
def self.render_value value, literals
|
37
14
|
case value
|
38
15
|
when String
|
39
|
-
|
16
|
+
case value
|
17
|
+
when /^[0-9]+$/
|
18
|
+
value
|
19
|
+
when /"'/
|
20
|
+
literals[value]
|
21
|
+
else
|
22
|
+
"\"#{value}\""
|
23
|
+
end
|
40
24
|
when Language::Variable
|
41
25
|
if value.path.first == 'l' && value.path.last == 'iteration'
|
42
26
|
'forloop.index0'
|
@@ -46,7 +30,7 @@ module RageRender
|
|
46
30
|
value.path.join('.')
|
47
31
|
end
|
48
32
|
when Language::Function
|
49
|
-
params = value.params.map {|p| render_value p }
|
33
|
+
params = value.params.map {|p| render_value p, literals }
|
50
34
|
args = params.drop(1).map {|p| "#{value.name}: #{p}" }.join(' | ')
|
51
35
|
[params.first, args.empty? ? value.name : args].join(' | ')
|
52
36
|
when nil
|
@@ -56,20 +40,21 @@ module RageRender
|
|
56
40
|
|
57
41
|
def self.to_liquid document
|
58
42
|
tag_stack = Array.new
|
43
|
+
literals = Hash.new {|cache, l| cache[l] = "str" + Digest::MD5.hexdigest(l)}
|
59
44
|
|
60
|
-
document.map do |chunk|
|
45
|
+
chunks = document.map do |chunk|
|
61
46
|
case chunk
|
62
47
|
when String
|
63
48
|
chunk
|
64
49
|
|
65
50
|
when Language::Variable
|
66
|
-
"{{ #{render_value chunk
|
51
|
+
"{{ #{render_value chunk, literals} }}"
|
67
52
|
|
68
53
|
when Language::Conditional
|
69
54
|
tag_stack << (chunk.reversed ? :endunless : :endif)
|
70
55
|
|
71
|
-
lhs = render_value chunk.lhs
|
72
|
-
rhs = render_value chunk.rhs
|
56
|
+
lhs = render_value chunk.lhs, literals
|
57
|
+
rhs = render_value chunk.rhs, literals
|
73
58
|
operator = chunk.operator
|
74
59
|
|
75
60
|
if chunk.lhs.is_a?(Language::Variable) && chunk.lhs.path.first == "l"
|
@@ -105,8 +90,8 @@ module RageRender
|
|
105
90
|
output.join
|
106
91
|
|
107
92
|
when Language::Function
|
108
|
-
*output, func = LIQUID_FUNCTIONS.fetch(chunk.name,
|
109
|
-
output << "{{ #{render_value(func)} }}"
|
93
|
+
*output, func = LIQUID_FUNCTIONS.fetch(chunk.name, proc{|f| f}).call(chunk)
|
94
|
+
output << "{{ #{render_value(func, literals)} }}"
|
110
95
|
output.join
|
111
96
|
|
112
97
|
when Language::Loop
|
@@ -124,6 +109,10 @@ module RageRender
|
|
124
109
|
end
|
125
110
|
end
|
126
111
|
end
|
112
|
+
|
113
|
+
literals.map do |(value, name)|
|
114
|
+
"{% capture #{name} %}#{value}{% endcapture %}"
|
115
|
+
end + chunks
|
127
116
|
end
|
128
117
|
end
|
129
118
|
|
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.5
|
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-
|
11
|
+
date: 2025-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rsec
|
@@ -138,10 +138,14 @@ description: |-
|
|
138
138
|
you added your first comic!
|
139
139
|
|
140
140
|
If you want to add an author note, create a text file in a folder called
|
141
|
-
<tt>_comics</tt> that has the same file name, but with a <tt>.
|
141
|
+
<tt>_comics</tt> that has the same file name, but with a <tt>.txt</tt> extension:
|
142
142
|
|
143
143
|
mkdir _comics
|
144
|
-
echo "Check out my cool comic y'all!" > '_comics/My first page.
|
144
|
+
echo "Check out my cool comic y'all!" > '_comics/My first page.txt'
|
145
|
+
|
146
|
+
Or use HTML:
|
147
|
+
|
148
|
+
echo "This is my <strong>first</strong> page!" > '_comics/My first page.html'
|
145
149
|
|
146
150
|
Generate the site using:
|
147
151
|
|
@@ -327,9 +331,9 @@ files:
|
|
327
331
|
- lib/ragerender/jekyll/chapter.rb
|
328
332
|
- lib/ragerender/jekyll/comics.rb
|
329
333
|
- lib/ragerender/jekyll/error.rb
|
330
|
-
- lib/ragerender/jekyll/named_data_delegator.rb
|
331
334
|
- lib/ragerender/jekyll/overview.rb
|
332
335
|
- lib/ragerender/jekyll/pagination.rb
|
336
|
+
- lib/ragerender/jekyll/pipettes.rb
|
333
337
|
- lib/ragerender/jekyll/search.rb
|
334
338
|
- lib/ragerender/jekyll/setup_collection.rb
|
335
339
|
- lib/ragerender/language.rb
|