jekyll-liquid-plus 1.1.0 → 1.2.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 +4 -4
- data/CHANGELOG.md +3 -0
- data/jekyll-liquid-plus.gemspec +1 -1
- data/lib/jekyll-liquid-plus.rb +3 -3
- data/lib/jekyll-liquid-plus/helpers/include.rb +2 -23
- data/lib/jekyll-liquid-plus/tags/include.rb +127 -5
- data/lib/jekyll-liquid-plus/tags/wrap.rb +2 -2
- data/lib/jekyll-liquid-plus/version.rb +1 -1
- data/test/source/_includes/custom/include_layout.html +1 -0
- data/test/source/_layouts/custom/render_layout.html +1 -0
- data/test/source/_layouts/include.html +1 -0
- data/test/source/_layouts/render.html +1 -0
- data/test/source/include.html +0 -1
- data/test/source/include_layout.html +4 -0
- data/test/source/render.html +1 -1
- data/test/source/render_layout.html +4 -0
- data/test/source/wrap.html +0 -1
- data/test/test.rb +42 -4
- metadata +10 -6
- data/lib/jekyll-liquid-plus/tags/render.rb +0 -132
- data/test/source/_layouts/default.html +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 050beadf8660b7b1e2067aa1ff5153d06bf8e85e
|
4
|
+
data.tar.gz: 9b2d3e942011d756f602a51bb63f412c36c814f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86414e474bc4521e42a450e3a315e501c95bcba4927832efce95403f6d13e1623e8aae3b15bab40719bcb182ff960f2c03578dc8c25fbc9bdb45824d56a29749
|
7
|
+
data.tar.gz: 42f11dbbbdfa82f461e68f602ef7ffe35ee979d0a11b09f712acbbd2228a54b31f0f830d4b486ecf6ee6c39034d517e66e0696b53d407eabd087ddb72e687784
|
data/CHANGELOG.md
CHANGED
data/jekyll-liquid-plus.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
|
-
spec.add_runtime_dependency "jekyll", "~> 1.
|
19
|
+
spec.add_runtime_dependency "jekyll", "~> 1.3.0"
|
20
20
|
spec.add_runtime_dependency "liquid", "~> 2.5.1"
|
21
21
|
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
data/lib/jekyll-liquid-plus.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'liquid'
|
2
|
+
require 'jekyll'
|
2
3
|
|
3
4
|
$:.unshift File.dirname(__FILE__)
|
4
5
|
|
@@ -8,17 +9,16 @@ module LiquidPlus
|
|
8
9
|
autoload :Cache, 'jekyll-liquid-plus/helpers/cache'
|
9
10
|
autoload :IncludeTag, 'jekyll-liquid-plus/tags/include'
|
10
11
|
autoload :WrapTag, 'jekyll-liquid-plus/tags/wrap'
|
11
|
-
autoload :RenderTag, 'jekyll-liquid-plus/tags/render'
|
12
12
|
autoload :AssignTag, 'jekyll-liquid-plus/tags/assign'
|
13
13
|
autoload :CaptureTag, 'jekyll-liquid-plus/tags/capture'
|
14
14
|
autoload :ReturnTag, 'jekyll-liquid-plus/tags/return'
|
15
15
|
end
|
16
16
|
|
17
17
|
Liquid::Template.register_tag('include', LiquidPlus::IncludeTag)
|
18
|
+
Liquid::Template.register_tag('render', LiquidPlus::IncludeTag)
|
18
19
|
Liquid::Template.register_tag('wrap', LiquidPlus::WrapTag)
|
19
20
|
Liquid::Template.register_tag('wrap_include', LiquidPlus::WrapTag)
|
20
|
-
Liquid::Template.register_tag('
|
21
|
-
Liquid::Template.register_tag('render_partial', LiquidPlus::RenderTag)
|
21
|
+
Liquid::Template.register_tag('render_partial', LiquidPlus::IncludeTag)
|
22
22
|
Liquid::Template.register_tag('assign', LiquidPlus::AssignTag)
|
23
23
|
Liquid::Template.register_tag('capture', LiquidPlus::CaptureTag)
|
24
24
|
Liquid::Template.register_tag('return', LiquidPlus::ReturnTag)
|
@@ -3,32 +3,11 @@ require File.join File.expand_path('../../', __FILE__), 'helpers/path'
|
|
3
3
|
module LiquidPlus
|
4
4
|
class Include
|
5
5
|
LOCALS = /(.*?)(([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)))(.*)?/
|
6
|
-
|
7
6
|
class << self
|
8
7
|
|
9
8
|
def render(markup, context)
|
10
|
-
|
11
|
-
|
12
|
-
file = Path.parse(markup, context, '_includes')
|
13
|
-
|
14
|
-
if file
|
15
|
-
if File.exist? Path.expand(File.join('_includes', file), context)
|
16
|
-
markup = file
|
17
|
-
markup += params if params
|
18
|
-
tag = Jekyll::Tags::IncludeTag.new('', markup, [])
|
19
|
-
tag.render(context)
|
20
|
-
else
|
21
|
-
dir = '_includes'
|
22
|
-
dir = File.join dir, File.dirname(file) unless File.dirname(file) == '.'
|
23
|
-
|
24
|
-
msg = "From #{context.registers[:page]['path']}: "
|
25
|
-
msg += "File '#{file}' not found"
|
26
|
-
msg += " in '#{dir}/' directory"
|
27
|
-
|
28
|
-
puts msg.red
|
29
|
-
return msg
|
30
|
-
end
|
31
|
-
end
|
9
|
+
tag = IncludeTag.new('include', markup, [])
|
10
|
+
tag.render(context)
|
32
11
|
end
|
33
12
|
|
34
13
|
def split_params(markup)
|
@@ -1,16 +1,138 @@
|
|
1
|
-
require File.join File.expand_path('../../', __FILE__), 'helpers/
|
1
|
+
require File.join File.expand_path('../../', __FILE__), 'helpers/path'
|
2
|
+
require File.join File.expand_path('../../', __FILE__), 'helpers/cache'
|
3
|
+
|
4
|
+
module Jekyll
|
5
|
+
|
6
|
+
# Create a new page class to allow partials to trigger Jekyll Page Hooks.
|
7
|
+
class ConvertiblePage
|
8
|
+
include Convertible
|
9
|
+
|
10
|
+
attr_accessor :name, :content, :site, :ext, :output, :data
|
11
|
+
|
12
|
+
def initialize(site, name, content)
|
13
|
+
@site = site
|
14
|
+
@name = name
|
15
|
+
@ext = File.extname(name)
|
16
|
+
@content = content
|
17
|
+
@data = { layout: "no_layout" } # hack
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def render(payload)
|
22
|
+
do_layout(payload, { no_layout: nil })
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
2
26
|
|
3
27
|
module LiquidPlus
|
4
|
-
class IncludeTag <
|
28
|
+
class IncludeTag < Jekyll::Tags::IncludeTag
|
29
|
+
LOCALS = /(.*?)(([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)))(.*)?/
|
30
|
+
|
31
|
+
alias_method :default_render, :render
|
32
|
+
|
5
33
|
|
6
34
|
def initialize(tag_name, markup, tokens)
|
35
|
+
@tag = tag_name.strip
|
7
36
|
@markup = markup.strip
|
8
|
-
|
9
|
-
|
37
|
+
# If raw, strip from the markup as not to confuse the Path syntax parsing
|
38
|
+
if @markup =~ /^(\s*raw\s)?(.+?)(\sraw\s*)?$/
|
39
|
+
@markup = $2.strip
|
40
|
+
@raw = true unless $1.nil? and $3.nil?
|
41
|
+
end
|
10
42
|
|
43
|
+
split_params
|
44
|
+
end
|
45
|
+
|
11
46
|
def render(context)
|
12
|
-
|
47
|
+
validate_params if @params
|
48
|
+
@file = get_path(context)
|
49
|
+
if @tag == 'include' && @file && Cache.exists(Path.expand(File.join(INCLUDES_DIR, @file), context))
|
50
|
+
include_tag(context)
|
51
|
+
elsif @tag =~ /render/ && @file && Cache.exists(@file)
|
52
|
+
render_tag(context)
|
53
|
+
elsif @file
|
54
|
+
not_found(context)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def include_tag(context)
|
59
|
+
@markup = @file
|
60
|
+
@markup += @params if @params
|
61
|
+
@page = context.registers[:page]['path']
|
62
|
+
content = default_render(context)
|
63
|
+
parse_convertible(content, context)
|
64
|
+
end
|
65
|
+
|
66
|
+
def render_tag(context)
|
67
|
+
@markup = @file
|
68
|
+
@markup += @params if @params
|
69
|
+
content = read_raw
|
70
|
+
|
71
|
+
unless @raw
|
72
|
+
partial = Liquid::Template.parse(content)
|
73
|
+
|
74
|
+
content = context.stack do
|
75
|
+
context['render'] = Jekyll::Tags::IncludeTag.new('include', @markup, []).parse_params(context) if @params
|
76
|
+
context['page'] = context['page'].deep_merge(@local_vars) if @local_vars and @local_vars.keys.size > 0
|
77
|
+
partial.render!(context)
|
78
|
+
end
|
79
|
+
content = parse_convertible(content, context)
|
80
|
+
end
|
81
|
+
content
|
82
|
+
end
|
83
|
+
|
84
|
+
def not_found(context)
|
85
|
+
@file = File.join(INCLUDES_DIR, @file) if @tag == 'include'
|
86
|
+
name = File.basename(@file)
|
87
|
+
dir = @file.to_s.sub(context.registers[:site].source + '/', '').sub(name, '')
|
88
|
+
msg = "File '#{name}' not found"
|
89
|
+
msg += " in '#{dir}'" if dir.length > 0 && name != dir
|
90
|
+
raise IOError.new msg
|
91
|
+
end
|
92
|
+
|
93
|
+
def parse_convertible(content, context)
|
94
|
+
page = Jekyll::ConvertiblePage.new(context.registers[:site], @file, content)
|
95
|
+
page.render({})
|
96
|
+
content = page.output.strip
|
97
|
+
end
|
98
|
+
|
99
|
+
def split_params
|
100
|
+
if @markup =~ LOCALS
|
101
|
+
@params = ' ' + $2
|
102
|
+
@markup = $1 + $7
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_path(context)
|
107
|
+
root = (@tag == 'include') ? INCLUDES_DIR : nil
|
108
|
+
if file = Path.parse(@markup, context, root)
|
109
|
+
file = Path.expand(file, context) if @tag =~ /render/
|
110
|
+
@markup = file
|
111
|
+
file
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
#Strip out yaml header from partials
|
116
|
+
def strip_yaml(content)
|
117
|
+
if content =~ /\A-{3}(.+[^\A])-{3}\n(.+)/m
|
118
|
+
$2.strip
|
119
|
+
end
|
120
|
+
content
|
121
|
+
end
|
122
|
+
|
123
|
+
def read_raw
|
124
|
+
path = Pathname.new @file
|
125
|
+
Dir.chdir(File.dirname(path)) do
|
126
|
+
content = path.read
|
127
|
+
if content =~ /\A-{3}(.+[^\A])-{3}\n(.+)/m
|
128
|
+
@local_vars = YAML.safe_load($1.strip)
|
129
|
+
content = $2.strip
|
130
|
+
end
|
131
|
+
content
|
132
|
+
end
|
13
133
|
end
|
14
134
|
end
|
15
135
|
end
|
16
136
|
|
137
|
+
|
138
|
+
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require File.join File.expand_path('../../', __FILE__), 'helpers/include'
|
2
|
-
require File.join File.expand_path('../../', __FILE__), 'tags/render'
|
3
2
|
|
4
3
|
module LiquidPlus
|
5
4
|
class WrapTag < Liquid::Block
|
@@ -17,7 +16,8 @@ module LiquidPlus
|
|
17
16
|
back = $3
|
18
17
|
|
19
18
|
partial = if @tag == 'wrap'
|
20
|
-
|
19
|
+
tag = IncludeTag.new('render', @markup, [])
|
20
|
+
tag.render(context)
|
21
21
|
elsif @tag == 'wrap_include'
|
22
22
|
Include.render(@markup, context)
|
23
23
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
*{{ content }}*
|
@@ -0,0 +1 @@
|
|
1
|
+
*{{ content }}*
|
@@ -0,0 +1 @@
|
|
1
|
+
{% include custom/include_layout.html %}
|
@@ -0,0 +1 @@
|
|
1
|
+
{% render _layouts/custom/render_layout.html %}
|
data/test/source/include.html
CHANGED
@@ -23,7 +23,6 @@ file.html → {% include (some_bool ? file.html : file2.html) %}
|
|
23
23
|
## Cascading include
|
24
24
|
file.html → {% include not_there.html || file.html %}
|
25
25
|
'' → '{% include not_there.html || none %}'
|
26
|
-
From include.html: File 'not_there.html' not found in '_includes/' directory → {% include nothing || not_there.html %}
|
27
26
|
|
28
27
|
## Complex includes
|
29
28
|
file2.html and variable → {% include (some_bool ? not_here : file.html) || file2.html var='variable' %}
|
data/test/source/render.html
CHANGED
@@ -27,7 +27,6 @@ file.html → {% render (some_bool ? f/file.html : f/file2.html) %}
|
|
27
27
|
## Cascading include
|
28
28
|
file.html → {% render not_there.html || f/file.html %}
|
29
29
|
'' → '{% render not_there.html or none %}'
|
30
|
-
From render.html: File 'not_there.html' not found → {% render nothing || not_there.html %}
|
31
30
|
|
32
31
|
## Complex includes
|
33
32
|
file2.html and variable → {% render (some_bool ? not_here : f/file.html) || f/file2.html var='variable' %}
|
@@ -39,3 +38,4 @@ file2.html and variable → {% render (some_bool ? not_here : f/file.html) || f/
|
|
39
38
|
|
40
39
|
## Render raw
|
41
40
|
{% raw %}**{{ page.test_var }}{{ render.foo }}**{% endraw %} → {% render raw f/file3.md %}
|
41
|
+
|
data/test/source/wrap.html
CHANGED
@@ -20,7 +20,6 @@ layout: nil
|
|
20
20
|
## Cascading wrap
|
21
21
|
[- file.html -] → {% wrap not_there.html || f/file.html %}[- {=yield} -]{% endwrap %}
|
22
22
|
'' → '{% wrap not_there.html || none %}[- {=yield} -]{% endwrap %}'
|
23
|
-
[- From wrap.html: File 'not_there.html' not found in '_includes/' directory -] → {% wrap_include nothing || not_there.html %}[- {=yield} -]{% endwrap_include %}
|
24
23
|
|
25
24
|
## Complex wraps
|
26
25
|
[- file2.html and variable -] → {% wrap (some_bool ? not_here : f/file.html) || f/file2.html var='variable' %}[- {=yield} -]{% endwrap %}
|
data/test/test.rb
CHANGED
@@ -7,7 +7,10 @@ has_failed = false
|
|
7
7
|
def test(path)
|
8
8
|
path = Pathname.new path + '.html'
|
9
9
|
failure = []
|
10
|
-
start =
|
10
|
+
start = 1
|
11
|
+
tests = ''
|
12
|
+
passed = 0
|
13
|
+
failed = 0
|
11
14
|
|
12
15
|
f = File.new("source/#{path}")
|
13
16
|
# Get the starting line (after the YAML FM) for source map
|
@@ -16,25 +19,57 @@ def test(path)
|
|
16
19
|
break start = f.lineno + 1
|
17
20
|
end
|
18
21
|
end
|
22
|
+
total = f.read.count('→')
|
19
23
|
|
20
24
|
Dir.chdir('_site') do
|
21
25
|
File.readlines(path).each_with_index do |line, i|
|
22
26
|
if line =~ /(.+?)→(.+)/
|
23
27
|
if $1.strip != $2.strip
|
28
|
+
failed += 1
|
29
|
+
tests << 'F'.red
|
24
30
|
failure << " - line #{i+start}: #{$1}!=#{$2}"
|
31
|
+
else
|
32
|
+
passed += 1
|
33
|
+
tests << '.'.green
|
25
34
|
end
|
26
35
|
end
|
27
36
|
end
|
28
37
|
end
|
29
|
-
if
|
30
|
-
puts "
|
38
|
+
if failed < 1 && passed < 1
|
39
|
+
puts "missed".yellow + ": #{path} " + "0/#{total}".yellow
|
40
|
+
has_failed = true
|
41
|
+
elsif failure.size > 0
|
42
|
+
puts "failed".red + ": #{path} #{tests} " + "#{passed}/#{total}".red
|
31
43
|
puts failure.join "\n"
|
32
44
|
has_failed = true
|
33
45
|
else
|
34
|
-
puts "passed".green + ": #{path}"
|
46
|
+
puts "passed".green + ": #{path} #{tests} " + "#{passed}/#{total}".green
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_layout(path)
|
51
|
+
path = Pathname.new path + '.html'
|
52
|
+
failure = []
|
53
|
+
start = 0
|
54
|
+
|
55
|
+
f = File.new("source/#{path}")
|
56
|
+
# Get the starting line (after the YAML FM) for source map
|
57
|
+
f.each do |line|
|
58
|
+
if line =~ /---/ and f.lineno > 1
|
59
|
+
break start = f.lineno + 1
|
60
|
+
end
|
61
|
+
end
|
62
|
+
Dir.chdir('_site') do
|
63
|
+
if path.read !~ /success/
|
64
|
+
puts "failed".red + ": #{path} 1/1".red
|
65
|
+
has_failed = true
|
66
|
+
else
|
67
|
+
puts "passed".green + ": #{path} " + "1/1".green
|
68
|
+
end
|
35
69
|
end
|
36
70
|
end
|
37
71
|
|
72
|
+
|
38
73
|
`rm -rf _site/; bundle exec jekyll build --trace`
|
39
74
|
|
40
75
|
# Test include
|
@@ -45,5 +80,8 @@ test 'wrap'
|
|
45
80
|
test 'assign'
|
46
81
|
test 'capture'
|
47
82
|
test 'return'
|
83
|
+
test_layout 'include_layout'
|
84
|
+
test_layout 'render_layout'
|
85
|
+
|
48
86
|
|
49
87
|
abort if has_failed
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-liquid-plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Mathis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: liquid
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,16 +90,18 @@ files:
|
|
90
90
|
- lib/jekyll-liquid-plus/tags/assign.rb
|
91
91
|
- lib/jekyll-liquid-plus/tags/capture.rb
|
92
92
|
- lib/jekyll-liquid-plus/tags/include.rb
|
93
|
-
- lib/jekyll-liquid-plus/tags/render.rb
|
94
93
|
- lib/jekyll-liquid-plus/tags/return.rb
|
95
94
|
- lib/jekyll-liquid-plus/tags/wrap.rb
|
96
95
|
- lib/jekyll-liquid-plus/version.rb
|
97
96
|
- test/_config.yml
|
98
97
|
- test/source/.gitignore
|
98
|
+
- test/source/_includes/custom/include_layout.html
|
99
99
|
- test/source/_includes/file.html
|
100
100
|
- test/source/_includes/file2.html
|
101
101
|
- test/source/_includes/file3.html
|
102
|
-
- test/source/_layouts/
|
102
|
+
- test/source/_layouts/custom/render_layout.html
|
103
|
+
- test/source/_layouts/include.html
|
104
|
+
- test/source/_layouts/render.html
|
103
105
|
- test/source/_plugins/liquid-plus.rb
|
104
106
|
- test/source/assign.html
|
105
107
|
- test/source/capture.html
|
@@ -109,7 +111,9 @@ files:
|
|
109
111
|
- test/source/f/file4.html
|
110
112
|
- test/source/f/file5.html
|
111
113
|
- test/source/include.html
|
114
|
+
- test/source/include_layout.html
|
112
115
|
- test/source/render.html
|
116
|
+
- test/source/render_layout.html
|
113
117
|
- test/source/return.html
|
114
118
|
- test/source/wrap.html
|
115
119
|
- test/test.rb
|
@@ -1,132 +0,0 @@
|
|
1
|
-
# Title: Render Partial Tag for Jekyll
|
2
|
-
# Author: Brandon Mathis
|
3
|
-
# Description: Import files on your filesystem into any blog post and render them inline.
|
4
|
-
# Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out.
|
5
|
-
#
|
6
|
-
# Syntax {% render_partial path/to/file %}
|
7
|
-
#
|
8
|
-
# Example 1:
|
9
|
-
# {% render_partial about/_bio.markdown %}
|
10
|
-
#
|
11
|
-
# This will import source/about/_bio.markdown and render it inline.
|
12
|
-
# In this example I used an underscore at the beginning of the filename to prevent Jekyll
|
13
|
-
# from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores)
|
14
|
-
#
|
15
|
-
# Example 2:
|
16
|
-
# {% render_partial ../README.markdown %}
|
17
|
-
#
|
18
|
-
# You can use relative pathnames, to include files outside of the source directory.
|
19
|
-
# This might be useful if you want to have a page for a project's README without having
|
20
|
-
# to duplicated the contents
|
21
|
-
#
|
22
|
-
#
|
23
|
-
|
24
|
-
require File.join File.expand_path('../../', __FILE__), 'helpers/path'
|
25
|
-
require File.join File.expand_path('../../', __FILE__), 'helpers/include'
|
26
|
-
require 'jekyll'
|
27
|
-
require 'yaml'
|
28
|
-
require 'pathname'
|
29
|
-
|
30
|
-
module Jekyll
|
31
|
-
|
32
|
-
# Create a new page class to allow partials to trigger Jekyll Page Hooks.
|
33
|
-
class ConvertiblePage
|
34
|
-
include Convertible
|
35
|
-
|
36
|
-
attr_accessor :name, :content, :site, :ext, :output, :data
|
37
|
-
|
38
|
-
def initialize(site, name, content)
|
39
|
-
@site = site
|
40
|
-
@name = name
|
41
|
-
@ext = File.extname(name)
|
42
|
-
@content = content
|
43
|
-
@data = { layout: "no_layout" } # hack
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
def render(payload, info)
|
48
|
-
do_layout(payload, { no_layout: nil })
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
module LiquidPlus
|
54
|
-
class RenderTag < Liquid::Tag
|
55
|
-
def initialize(tag_name, markup, tokens)
|
56
|
-
@markup = markup.strip
|
57
|
-
super
|
58
|
-
end
|
59
|
-
|
60
|
-
def parse_markup
|
61
|
-
# If raw, strip from the markup as not to confuse the Path syntax parsing
|
62
|
-
if @markup =~ /^(\s*raw\s)?(.+?)(\sraw\s*)?$/
|
63
|
-
@markup = $2.strip
|
64
|
-
@raw = true unless $1.nil? and $3.nil?
|
65
|
-
end
|
66
|
-
|
67
|
-
# Separate params from markup
|
68
|
-
@markup, @params = Include.split_params(@markup)
|
69
|
-
end
|
70
|
-
|
71
|
-
def get_path(context)
|
72
|
-
if file = Path.parse(@markup, context)
|
73
|
-
path = Pathname.new Path.expand(file, context)
|
74
|
-
@markup = file
|
75
|
-
path
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def render(context)
|
80
|
-
parse_markup
|
81
|
-
path = get_path(context)
|
82
|
-
if path and Cache.exists(path)
|
83
|
-
|
84
|
-
Dir.chdir(File.dirname(path)) do
|
85
|
-
content = path.read
|
86
|
-
|
87
|
-
#Strip out yaml header from partials
|
88
|
-
if content =~ /\A-{3}(.+[^\A])-{3}\n(.+)/m
|
89
|
-
@local_vars = YAML.safe_load($1.strip)
|
90
|
-
content = $2.strip
|
91
|
-
end
|
92
|
-
|
93
|
-
if @raw
|
94
|
-
content
|
95
|
-
else
|
96
|
-
content = parse_params(content, context) if @params or @local_vars
|
97
|
-
|
98
|
-
page = Jekyll::ConvertiblePage.new(context.registers[:site], path, content)
|
99
|
-
payload = { 'page' => context.registers[:page] }.merge(context.registers[:site].site_payload)
|
100
|
-
page.render(payload, { registers: context.registers })
|
101
|
-
page.output.strip
|
102
|
-
end
|
103
|
-
end
|
104
|
-
elsif path
|
105
|
-
name = File.basename(path)
|
106
|
-
dir = path.to_s.sub(context.registers[:site].source + '/', '')
|
107
|
-
|
108
|
-
msg = "From #{context.registers[:page]['path']}: "
|
109
|
-
msg += "File '#{name}' not found"
|
110
|
-
msg += " in '#{dir}' directory" unless name == dir
|
111
|
-
|
112
|
-
puts msg.red
|
113
|
-
return msg
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def parse_params(content, context)
|
118
|
-
if @params
|
119
|
-
markup = @markup + @params
|
120
|
-
end
|
121
|
-
partial = Liquid::Template.parse(content)
|
122
|
-
|
123
|
-
context.stack do
|
124
|
-
context['render'] = Jekyll::Tags::IncludeTag.new('', markup, []).parse_params(context) if @params
|
125
|
-
context['page'] = context['page'].deep_merge(@local_vars) if @local_vars and @local_vars.keys.size > 0
|
126
|
-
content = partial.render(context)
|
127
|
-
end
|
128
|
-
content
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|