jekyll-template 0.20.0 → 0.21.0

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
  SHA1:
3
- metadata.gz: e825a6e87ee51a4f782dc7fdf87752f982fbd6c1
4
- data.tar.gz: 5adb4ad8fed2a3a215fe0ca8c026d0304a0b511e
3
+ metadata.gz: 4e8f60f5367a96ac7522046816cd83bd07c83e22
4
+ data.tar.gz: 380118afd1b0c1df088fc31dd6127197c062dc34
5
5
  SHA512:
6
- metadata.gz: 17496b834b6f8056e14a3d607d9f1af43d6b207065aa5504881678847ae06c581f2e9e9e9fd022ddf0376e918c8a9e99773f1bb995bd78b9615ee9750401a81c
7
- data.tar.gz: 877d6a3a2da8c97a1f0f30c3157ca9d742d79cd7c831b990233295c9295b7096abf1d50d145039e5afbaec91cdc94583b95b3766e4ca8b917e8334efcde1cef3
6
+ metadata.gz: 199a1af8eae5f9fd5fcecaf7cb69a0ee9f587c839a0fc4ff1e08bd718fd369f258e18e3bb8e3d97bfc8b3a45e4b1aa6b5a17e657239b6a56e030adfd50453366
7
+ data.tar.gz: d9c1287559431faaf3572706daf907879a4dc7253a9f1d20a7e09c78aa5a46807a2ec99b9de49535f2b59eabf7993ed0359315274ba9dca1940ccae0ee7931b4
@@ -6,9 +6,20 @@ module Jekyll
6
6
  module Tags
7
7
  class TemplateBlock < Liquid::Block
8
8
  include Liquid::StandardFilters
9
- Syntax = /(#{Liquid::QuotedFragment}+)?/
10
-
11
- # YAML REGEXP
9
+
10
+ CONTEXT_NAME = "template"
11
+ CONTEXT_CACHE_NAME = :cached_templates
12
+ CONTEXT_DATA_NAME = :template_data
13
+ CONTEXT_SCOPE_NAME = :template_data_scope
14
+ CONTEXT_STORE_NAME = :template_data_store
15
+
16
+ PROPS_NAME = "props"
17
+ TEMPLATE_DIR = "_templates"
18
+
19
+ LIQUID_SYNTAX_REGEXP = /(#{Liquid::QuotedFragment}+)?/
20
+ PROPS_REGEXP = /#{PROPS_NAME}\./
21
+ WHITESPACE_REGEXP = %r!^\s*!m
22
+ # Source
12
23
  # https://github.com/jekyll/jekyll/blob/35c5e073625100b0f8f8eab6f7da6cb6d5734930/lib/jekyll/document.rb
13
24
  YAML_FRONT_MATTER_REGEXP = %r!(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m
14
25
 
@@ -16,30 +27,34 @@ module Jekyll
16
27
  # Description: Extends Liquid's default initialize method.
17
28
  def initialize(tag_name, markup, tokens)
18
29
  super
19
- @site = false
20
-
21
- # @template_name = markup
22
- if markup =~ Syntax
23
30
 
24
- @template_name = $1.freeze
31
+ if markup =~ LIQUID_SYNTAX_REGEXP
25
32
  @attributes = {}
33
+ @context = false
34
+ @id = rand(36**8).to_s(36).freeze
35
+ @props = {}
26
36
  @sanitize = false
27
- @id = rand(36**8).to_s(36)
37
+ @site = false
38
+ @template_name = $1.freeze
39
+
40
+ @compressor = HtmlCompressor::Compressor.new({
41
+ :remove_comments => true
42
+ }).freeze
28
43
 
29
44
  # Parse parameters
30
45
  # Source: https://gist.github.com/jgatjens/8925165
31
46
  markup.scan(Liquid::TagAttributes) do |key, value|
32
- @attributes[key] = Liquid::Expression.parse(value)
47
+ if (value =~ PROPS_REGEXP) != nil
48
+ @attributes[key] = value
49
+ else
50
+ @attributes[key] = Liquid::Expression.parse(value)
51
+ end
33
52
  end
34
53
  else
35
54
  raise SyntaxError.new(options[:locale].t("errors.syntax.include".freeze))
36
55
  end
37
56
  end
38
57
 
39
- def id
40
- @id
41
- end
42
-
43
58
  # blank?
44
59
  # Description: Override's Liquid's default blank checker. This allows
45
60
  # for templates to be used without passing inner content.
@@ -47,42 +62,118 @@ module Jekyll
47
62
  false
48
63
  end
49
64
 
65
+ # template_store_data(data = Array)
66
+ # Description: Stores/updates the template data in cache
67
+ # Returns: Hash of the template store data
68
+ def template_store_data(data = {})
69
+ @context.registers[CONTEXT_STORE_NAME] ||= {}
70
+ unless @context.registers[CONTEXT_STORE_NAME].key?(@id)
71
+ @context.registers[CONTEXT_STORE_NAME][@id] = {
72
+ "id": @id,
73
+ "index": @context.registers[CONTEXT_STORE_NAME].length,
74
+ "template_name": @template_name
75
+ }
76
+ end
77
+ @context.registers[CONTEXT_STORE_NAME][@id] = @context.registers[CONTEXT_STORE_NAME][@id].merge(data)
78
+ end
79
+
80
+ # prop?
81
+ # Description: Determines if the variable is a template.props key
82
+ # Return: Boolean
83
+ def prop?(variable = "")
84
+ (variable =~ PROPS_REGEXP) != nil
85
+ end
86
+
87
+ # prop(data = Hash, value = String)
88
+ # Description: Returns the props value
89
+ def prop(data, value = "")
90
+ index = data[:index]
91
+ value = data[value.gsub(PROPS_REGEXP, "")]
92
+ if value and prop?(value) and index > 0
93
+ store = @context.registers[CONTEXT_STORE_NAME]
94
+ previous_scope = store[store.keys[index - 1]]
95
+ prop(previous_scope, value)
96
+ else
97
+ value
98
+ end
99
+ end
100
+
101
+ # evaluate_props
102
+ # Description: Evaluates props that are being passed into the template.
103
+ def evaluate_props()
104
+ store = @context.registers[CONTEXT_STORE_NAME]
105
+ data = store[@id]
106
+ index = data[:index]
107
+
108
+ if (index > 0)
109
+ parent = store[store.keys[index - 1]]
110
+ # Update the data scope
111
+ @context[CONTEXT_SCOPE_NAME] = parent
112
+ data.each do |key, value|
113
+ if prop?(value)
114
+ value = prop(parent, value)
115
+ if value
116
+ @props[key] = value
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+
50
123
  # render
51
124
  # Description: Extends Liquid's default render method. This method also
52
125
  # adds additional features:
53
126
  # - YAML front-matter parsing and handling
54
- # - properly handles indentation and whitespace (resolves renderin issues)
127
+ # - properly handles indentation and whitespace (resolves rendering issues)
55
128
  # - ability to parse content as markdown vs. html
56
129
  # - supports custom attributes to be used in template
57
130
  def render(context)
58
- content = super
59
- @site = context.registers[:site]
60
- # Remove leading whitespace
61
- # content = content.lstrip
62
- compressor = HtmlCompressor::Compressor.new({
63
- :remove_comments => true
64
- })
131
+ @context = context
132
+ @site = @context.registers[:site]
133
+
134
+ template_store_data(@attributes)
135
+
136
+ # This allows for Jekyll intelligently re-render markup during
137
+ # incremental builds.
138
+ add_template_to_dependency(@template_name)
139
+ # Loading the template from cache/template directory
140
+ template = load_cached_template(@template_name)
65
141
 
66
- add_template_to_dependency(@template_name, context)
67
- template = load_cached_template(@template_name, context)
142
+ # Props must be evaluated before super is initialized.
143
+ # This allows for props to be evaluated before they're parsed by Liquid.
144
+ evaluate_props()
68
145
 
146
+ content = super
147
+
148
+ # Return the parsed/normalized content
149
+ render_template(template, content)
150
+ end
151
+
152
+ # render_template(template = Liquid::Template, content = String)
153
+ # Description: Serializes the context to be rendered by Liquid. Also
154
+ # resets the context to ensure template data doesn't leak from
155
+ # the scope.
156
+ # Returns: String
157
+ def render_template(template, content)
69
158
  # Define the default template attributes
70
159
  # Source:
71
160
  # https://github.com/Shopify/liquid/blob/9a7778e52c37965f7b47673da09cfb82856a6791/lib/liquid/tags/include.rb
72
- context["template_name"] = @template_name
73
- context["partial"] = true
74
- context["template"] = Hash.new
161
+ @context[CONTEXT_NAME] = Hash.new
75
162
 
76
163
  # Parse and extend template's front-matter with content front-matter
77
164
  update_attributes(get_front_matter(content))
165
+ # Add props
166
+ update_attributes(@props)
167
+ # Update the template's store data
168
+ template_store_data(@attributes)
78
169
 
79
- # Setting template attributes from @attributes
170
+ # Setting context's template attributes from @attributes
80
171
  # This allows for @attributes to be used within the template as
81
172
  # {{ template.atttribute_name }}
82
- if @attributes
173
+ if @attributes.length
83
174
  @attributes.each do |key, value|
84
- val = context.evaluate(value)
85
- context["template"][key] = val
175
+ val = @context.evaluate(value)
176
+ @context[CONTEXT_NAME][key] = val
86
177
 
87
178
  # Adjust sanitize if parse: html
88
179
  if (key == "parse") && (val == "html")
@@ -90,69 +181,70 @@ module Jekyll
90
181
  end
91
182
  end
92
183
  end
93
-
94
- context["template"]["content"] = sanitize(strip_front_matter(content))
95
-
96
- store_template_data(context)
97
- content = compressor.compress(template.render(context))
98
- reset_template_data(context)
184
+
185
+ # puts @attributes
186
+ @context[CONTEXT_NAME]["content"] = sanitize(strip_front_matter(content))
187
+ store_template_data()
188
+ content = @compressor.compress(template.render(@context))
189
+ reset_template_data()
99
190
 
100
191
  content
101
192
  end
102
193
 
103
- # update_attributes(data)
194
+ # update_attributes(data = Hash)
104
195
  # Description: Merges data with @attributes.
105
- # @param data { hash }
106
196
  def update_attributes(data)
107
197
  if data
108
198
  @attributes.merge!(data)
109
199
  end
110
200
  end
111
201
 
112
- # store_template_data(context)
202
+ # store_template_data()
113
203
  # Description: Works with reset_template_data. This is a work-around
114
204
  # to ensure data stays in scope and isn't leaked from child->parent
115
205
  # template.
116
- def store_template_data(context)
117
- context.registers[:template_data_store] ||= {}
118
- store = context.registers[:template_data_store]
119
- unless store.key?(@id)
120
- store[@id] = context["template"]
206
+ def store_template_data()
207
+ @context.registers[CONTEXT_DATA_NAME] ||= {}
208
+ unless @context.registers[CONTEXT_DATA_NAME].key?(@id)
209
+ @context.registers[CONTEXT_DATA_NAME][@id] = @context[CONTEXT_NAME]
121
210
  end
122
211
  end
123
212
 
124
- # reset_template_data(context)
213
+ # reset_template_data()
125
214
  # Description: Works with store_template_data. This is a work-around
126
215
  # to ensure data stays in scope and isn't leaked from child->parent
127
216
  # template.
128
- def reset_template_data(context)
129
- context.registers[:template_data_store] ||= {}
130
- store = context.registers[:template_data_store]
131
- if store.keys.size
217
+ def reset_template_data()
218
+ @context.registers[CONTEXT_DATA_NAME] ||= {}
219
+ store = @context.registers[CONTEXT_DATA_NAME]
220
+ if store.keys.length
132
221
  if store.keys[0] == @id
133
- context.registers[:template_data_store] = false
222
+ # Resets template data
223
+ @context.registers[CONTEXT_DATA_NAME] = false
224
+ @context.registers[CONTEXT_SCOPE_NAME] = false
134
225
  else
135
- context["template"] = store[store.keys[0]]
226
+ @context[CONTEXT_NAME] = store[store.keys[0]]
136
227
  end
137
228
  end
138
229
  end
139
230
 
140
- # add_template_to_dependency(path, context)
231
+ # add_template_to_dependency(path = String)
141
232
  # source: https://github.com/jekyll/jekyll/blob/e509cf2139d1a7ee11090b09721344608ecf48f6/lib/jekyll/tags/include.rb
142
- def add_template_to_dependency(path, context)
143
- if context.registers[:page] && context.registers[:page].key?("path")
233
+ def add_template_to_dependency(path)
234
+ if @context.registers[:page] && @context.registers[:page].key?("path")
144
235
  @site.regenerator.add_dependency(
145
- @site.in_source_dir(context.registers[:page]["path"]),
146
- get_template_path(path)
236
+ @site.in_source_dir(@context.registers[:page]["path"]),
237
+ template_path(path)
147
238
  )
148
239
  end
149
240
  end
150
241
 
151
- # load_cached_template(path, context)
242
+ # load_cached_template(path = String)
152
243
  # source: https://github.com/jekyll/jekyll/blob/e509cf2139d1a7ee11090b09721344608ecf48f6/lib/jekyll/tags/include.rb
153
- def load_cached_template(path, context)
154
- context.registers[:cached_templates] ||= {}
155
- cached_templates = context.registers[:cached_templates]
244
+ # Returns: Liquid template from Jekyll's cache.
245
+ def load_cached_template(path)
246
+ @context.registers[CONTEXT_CACHE_NAME] ||= {}
247
+ cached_templates = @context.registers[CONTEXT_CACHE_NAME]
156
248
 
157
249
  unless cached_templates.key?(path)
158
250
  cached_templates[path] = load_template()
@@ -163,19 +255,17 @@ module Jekyll
163
255
  template["template"]
164
256
  end
165
257
 
166
- # get_template_path(path)
258
+ # template_path(path = String)
167
259
  # Returns: A full file path of the template
168
- # @param path { string }
169
- def get_template_path(path)
170
- File.join(@site.source.to_s, "_templates", path.to_s)
260
+ def template_path(path)
261
+ File.join(@site.source.to_s, TEMPLATE_DIR, path.to_s)
171
262
  end
172
263
 
173
- # get_template_content(template)
264
+ # template_content(template_name = String)
174
265
  # Description: Opens, reads, and returns template content as string.
175
266
  # Returns: Template content
176
- # @param template { string }
177
- def get_template_content(template)
178
- File.read(get_template_path(template).strip)
267
+ def template_content(template_name)
268
+ File.read(template_path(template_name).strip)
179
269
  end
180
270
 
181
271
  # load_template()
@@ -186,28 +276,27 @@ module Jekyll
186
276
  def load_template()
187
277
  file = @site
188
278
  .liquid_renderer
189
- .file(get_template_path(@template_name))
190
- # Set the template_content
191
- template_content = get_template_content(@template_name)
192
-
193
- template_obj = Hash.new
194
- data = get_front_matter(template_content)
195
- markup = strip_front_matter(template_content)
196
-
197
- if template_content
198
- template_obj["data"] = data
199
- template_obj["template"] = file.parse(markup)
200
- template_obj
279
+ .file(template_path(@template_name))
280
+
281
+ content = template_content(@template_name)
282
+
283
+ template = Hash.new
284
+ data = get_front_matter(content)
285
+ markup = strip_front_matter(content)
286
+
287
+ if content
288
+ template["data"] = data
289
+ template["template"] = file.parse(markup)
290
+ template
201
291
  else
202
292
  raise Liquid::SyntaxError, "Could not find #{file_path} in your templates"
203
293
  end
204
294
  end
205
295
 
206
- # sanitize(content)
296
+ # sanitize(content = String)
207
297
  # Description: Renders the content as markdown or HTML based on the
208
298
  # "parse" attribute.
209
299
  # Returns: Content (string).
210
- # @param content { string }
211
300
  def sanitize(content)
212
301
  unless @sanitize
213
302
  converter = @site.find_converter_instance(::Jekyll::Converters::Markdown)
@@ -217,27 +306,22 @@ module Jekyll
217
306
  end
218
307
  end
219
308
 
220
- # unindent(content)
309
+ # unindent(content = String)
221
310
  # Description: Removes initial indentation.
222
311
  # Returns: Content (string).
223
- # @param content { string }
224
312
  def unindent(content)
225
313
  # Remove initial whitespace
226
314
  content.gsub!(/\A^\s*\n/, "")
227
-
228
315
  # Remove indentations
229
- whitespace_regex = %r!^\s*!m
230
- if content =~ whitespace_regex
316
+ if content =~ WHITESPACE_REGEXP
231
317
  indentation = Regexp.last_match(0).length
232
318
  content.gsub!(/^\ {#{indentation}}/, "")
233
319
  end
234
-
235
320
  content
236
321
  end
237
322
 
238
- # get_front_matter(content)
323
+ # get_front_matter(content = String)
239
324
  # Returns: A hash of data parsed from the content's YAML
240
- # @param content { string }
241
325
  def get_front_matter(content)
242
326
  # Strip leading white-spaces
243
327
  content = unindent(content)
@@ -249,20 +333,17 @@ module Jekyll
249
333
  end
250
334
  end
251
335
 
252
- # strip_front_matter(content)
336
+ # strip_front_matter(content = String)
253
337
  # Description: Removes the YAML front-matter content.
254
338
  # Returns: Template content, with front-matter removed.
255
- # @param content { string }
256
339
  def strip_front_matter(content)
257
340
  # Strip leading white-spaces
258
341
  content = unindent(content)
259
-
260
342
  if content =~ YAML_FRONT_MATTER_REGEXP
261
343
  front_matter = Regexp.last_match(0)
262
344
  # Returns content with stripped front-matter
263
345
  content.gsub!(front_matter, "")
264
346
  end
265
-
266
347
  content
267
348
  end
268
349
 
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Template
3
- VERSION = "0.20.0"
3
+ VERSION = "0.21.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-template
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 0.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ItsJonQ
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-03 00:00:00.000000000 Z
11
+ date: 2017-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll