ragerender 0.1.3 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8f4de79ae989bb91629afddccfe914b06ac2a734bf1e3be4394e3be6377025d
4
- data.tar.gz: 22e88907930952d291a3a79868fb8927ce9592a8b30304ee2136d2fe347bda0d
3
+ metadata.gz: aedbeb388659f01299aa3694a3f30bd1368e09e9f729caa31334fff4300c6b7c
4
+ data.tar.gz: 11e966fefecb160bf9992f6697ae8fc23dbe299095c1bc458af6395fb29903c8
5
5
  SHA512:
6
- metadata.gz: 8bde6a8ebb2c8495ddc554d053088e0ae163250cd5ee24775e13d8322656c7c9578098852fcdf5527880edf41eaa5b6493fbe523321944850084a54c6df35bd2
7
- data.tar.gz: 55a5fed8c1912be039122714f98afe2c50c019ecc2687592ccf502ac98cb2b6931910f86e3c52c7384537e77bd7142b6865e487659a8ab328b026748d1864f93
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>.md</tt> extension:
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.md'
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
 
@@ -1,15 +1,38 @@
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
- '"' + CGI.escape_html(str) + '"'
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
- rand a..b
15
+ rand a.to_i..b.to_i
16
+ end
17
+
18
+ # Unescape all HTML entities in the input
19
+ def rawhtml str
20
+ CGI.unescape_html str
21
+ end
22
+
23
+ # https://github.com/Shopify/liquid/blob/9bb7fbf123e6e2bd61e00189b1c83159f375d3f3/lib/liquid/standardfilters.rb#L24-L29
24
+ # Used under the MIT License.
25
+ STRIP_HTML_BLOCKS = Regexp.union(
26
+ %r{<script.*?</script>}m,
27
+ /<!--.*?-->/m,
28
+ %r{<style.*?</style>}m,
29
+ )
30
+ STRIP_HTML_TAGS = /<.*?>/m
31
+
32
+ # This is only used for ERB – for Liquid, we use the native `strip_html`
33
+ # This pretty much mirrors the Liquid implementation.
34
+ def removehtmltags str
35
+ str.gsub(STRIP_HTML_BLOCKS, '').gsub(STRIP_HTML_TAGS, '')
13
36
  end
14
37
  end
15
38
  end
@@ -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 'named_data_delegator'
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 NamedDataDelegator
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 'named_data_delegator'
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 NamedDataDelegator
13
+ extend Pipettes
14
14
 
15
- def_data_delegator :title, :blogtitle
16
15
  def_data_delegator :author, :authorname
17
- delegate_method_as :content, :blog
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 'named_data_delegator'
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 NamedDataDelegator
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 'named_data_delegator'
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 NamedDataDelegator
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 'named_data_delegator'
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 NamedDataDelegator
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.url
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
- @obj.data.fetch('custom', {}).reject do |k, v|
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
- def image_obj
219
- @image_obj ||= @obj.site.static_files.detect {|f| f.relative_path == image_relative_path }
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
- def image_relative_path
227
- Pathname.new('/').join(@obj.data['image']).to_s
228
- end
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 'named_data_delegator'
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 NamedDataDelegator
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
@@ -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/named_data_delegator'
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::NamedDataDelegator
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
- def_data_delegator :title, :pagetitle
173
+
174
+ def pagetitle
175
+ escape @obj.data['title']
176
+ end
155
177
 
156
178
  def iscomicpage
157
179
  @obj.type == :comics
@@ -40,17 +40,18 @@ module RageRender
40
40
  # CONDITIONAL tests for equality: 'c:variable=My comic about bees' => Conditional.new(false, Variable.new(['variable']), '=', 'My comic about bees')
41
41
  # CONDITIONAL tests for inequality: 'c:variable!=My comic about bees' => Conditional.new(false, Variable.new(['variable']), '!=', 'My comic about bees')
42
42
  # CONDITIONAL tests for greater than: 'c:variable>=3' => Conditional.new(false, Variable.new(['variable']), '>=', '3')
43
+ # CONDITIONAL tests against two variables: 'c:variable=v:other' => Conditional.new(false, Variable.new(['variable']), '=', Variable.new(['other']))
43
44
  CONDITIONAL = ('c:'.r >> seq_(
44
45
  /!?/.r.map {|c| c == '!' },
45
46
  PATH.map {|p| Variable.new(p) },
46
47
  optional(OPERATOR),
47
- optional(VARIABLE | TEXT))
48
+ optional(VARIABLE | /[^\]]+/.r))
48
49
  ).map {|(reversed, lhs, operator, rhs)| Conditional.new reversed, lhs, operator, rhs }
49
50
 
50
51
  # FUNCTION with no arguments: 'f:cowsay' => Function.new("cowsay", [])
51
52
  # FUNCTION with a variable argument: 'f:js|v:foo' => Function.new('js', [Variable.new(['foo'])])
52
53
  # FUNCTION with literal arguments: 'f:add|2|3' => Function.new('add', ['2', '3'])
53
- FUNCTION = ('f:'.r >> seq(IDENT, ('|'.r >> (VARIABLE | TEXT)).star)).map {|(name, params)| Function.new name, params }
54
+ FUNCTION = ('f:'.r >> seq(IDENT, ('|'.r >> (VARIABLE | /[^\]\|]+/.r)).star)).map {|(name, params)| Function.new name, params }
54
55
 
55
56
  # TAG matches variable tags: '[v:value]' => Variable.new(["value"])
56
57
  # TAG matches loop tags: '[l:loop]' => Loop.new(["loop"])
@@ -70,7 +70,7 @@ 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
 
@@ -1,17 +1,26 @@
1
+ require 'digest'
1
2
  require_relative 'language'
2
3
 
3
4
  module RageRender
4
5
  LIQUID_FUNCTIONS = {
5
- 'add' => 'plus',
6
- 'subtract' => 'minus',
7
- 'multiply' => 'times',
8
- 'divide' => 'divided_by',
6
+ 'add' => proc {|f| [Language::Function.new('plus', f.params)] },
7
+ 'subtract' => proc {|f| [Language::Function.new('minus', f.params)] },
8
+ 'multiply' => proc {|f| [Language::Function.new('times', f.params)] },
9
+ 'divide' => proc {|f| [Language::Function.new('divided_by', f.params)] },
10
+ 'removehtmltags' => proc {|f| Language::Function.new('strip_html', f.params) },
9
11
  }
10
12
 
11
- def self.render_value value
13
+ def self.render_value value, literals
12
14
  case value
13
15
  when String
14
- value =~ /^[0-9]+$/ ? value : "\"#{value}\""
16
+ case value
17
+ when /^[0-9]+$/
18
+ value
19
+ when /"'/
20
+ literals[value]
21
+ else
22
+ "\"#{value}\""
23
+ end
15
24
  when Language::Variable
16
25
  if value.path.first == 'l' && value.path.last == 'iteration'
17
26
  'forloop.index0'
@@ -20,6 +29,10 @@ module RageRender
20
29
  else
21
30
  value.path.join('.')
22
31
  end
32
+ when Language::Function
33
+ params = value.params.map {|p| render_value p, literals }
34
+ args = params.drop(1).map {|p| "#{value.name}: #{p}" }.join(' | ')
35
+ [params.first, args.empty? ? value.name : args].join(' | ')
23
36
  when nil
24
37
  ""
25
38
  end
@@ -27,20 +40,21 @@ module RageRender
27
40
 
28
41
  def self.to_liquid document
29
42
  tag_stack = Array.new
43
+ literals = Hash.new {|cache, l| cache[l] = "str" + Digest::MD5.hexdigest(l)}
30
44
 
31
- document.map do |chunk|
45
+ chunks = document.map do |chunk|
32
46
  case chunk
33
47
  when String
34
48
  chunk
35
49
 
36
50
  when Language::Variable
37
- "{{ #{render_value chunk} }}"
51
+ "{{ #{render_value chunk, literals} }}"
38
52
 
39
53
  when Language::Conditional
40
54
  tag_stack << (chunk.reversed ? :endunless : :endif)
41
55
 
42
- lhs = render_value chunk.lhs
43
- rhs = render_value chunk.rhs
56
+ lhs = render_value chunk.lhs, literals
57
+ rhs = render_value chunk.rhs, literals
44
58
  operator = chunk.operator
45
59
 
46
60
  if chunk.lhs.is_a?(Language::Variable) && chunk.lhs.path.first == "l"
@@ -76,10 +90,9 @@ module RageRender
76
90
  output.join
77
91
 
78
92
  when Language::Function
79
- params = chunk.params.map {|p| render_value p }
80
- name = LIQUID_FUNCTIONS.fetch(chunk.name, chunk.name)
81
- args = params.drop(1).map {|p| "#{name}: #{p}" }.join(' | ')
82
- "{{ #{params.first} | #{args.empty? ? name : args} }}"
93
+ *output, func = LIQUID_FUNCTIONS.fetch(chunk.name, proc{|f| f}).call(chunk)
94
+ output << "{{ #{render_value(func, literals)} }}"
95
+ output.join
83
96
 
84
97
  when Language::Loop
85
98
  tag_stack << :endfor
@@ -96,6 +109,10 @@ module RageRender
96
109
  end
97
110
  end
98
111
  end
112
+
113
+ literals.map do |(value, name)|
114
+ "{% capture #{name} %}#{value}{% endcapture %}"
115
+ end + chunks
99
116
  end
100
117
  end
101
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.3
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-07-02 00:00:00.000000000 Z
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>.md</tt> extension:
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.md'
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
@@ -1,9 +0,0 @@
1
- module RageRender
2
- module NamedDataDelegator
3
- def def_data_delegator key, aliaz
4
- define_method(aliaz.to_sym) do
5
- @obj.data[key.to_s]
6
- end
7
- end
8
- end
9
- end