Merge pull request #1495 from maul-esel/variable-include
Variable {% include %}
This commit is contained in:
commit
fef96d95e1
|
@ -33,3 +33,16 @@ Feature: Include tags
|
||||||
And I should see "<li>param1_or_2 = value</li>" in "_site/2013/04/12/parameter-syntax.html"
|
And I should see "<li>param1_or_2 = value</li>" in "_site/2013/04/12/parameter-syntax.html"
|
||||||
And I should see "<li>local = some text</li>" in "_site/2013/06/22/pass-a-variable.html"
|
And I should see "<li>local = some text</li>" in "_site/2013/06/22/pass-a-variable.html"
|
||||||
And I should see "<li>layout = default</li>" in "_site/2013/06/22/pass-a-variable.html"
|
And I should see "<li>layout = default</li>" in "_site/2013/06/22/pass-a-variable.html"
|
||||||
|
|
||||||
|
Scenario: Include a file from a variable
|
||||||
|
Given I have an _includes directory
|
||||||
|
And I have an "_includes/snippet.html" file that contains "a snippet"
|
||||||
|
And I have an "_includes/parametrized.html" file that contains "works with {{include.what}}"
|
||||||
|
And I have a configuration file with:
|
||||||
|
| key | value |
|
||||||
|
| include_file1 | snippet.html |
|
||||||
|
| include_file2 | parametrized.html |
|
||||||
|
And I have an "index.html" page that contains "{% include {{site.include_file1}} %} that {% include {{site.include_file2}} what='parameters' %}"
|
||||||
|
When I run jekyll
|
||||||
|
Then the _site directory should exist
|
||||||
|
And I should see "a snippet that works with parameters" in "_site/index.html"
|
||||||
|
|
|
@ -84,10 +84,18 @@ eos
|
||||||
context.registers[:site].file_read_opts
|
context.registers[:site].file_read_opts
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def retrieve_variable(context)
|
||||||
|
if /\{\{([\w\-\.]+)\}\}/ =~ @file
|
||||||
|
raise ArgumentError.new("No variable #{$1} was found in include tag") if context[$1].nil?
|
||||||
|
@file = context[$1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
dir = File.join(context.registers[:site].source, INCLUDES_DIR)
|
dir = File.join(context.registers[:site].source, INCLUDES_DIR)
|
||||||
validate_dir(dir, context.registers[:site].safe)
|
validate_dir(dir, context.registers[:site].safe)
|
||||||
|
|
||||||
|
retrieve_variable(context)
|
||||||
file = File.join(dir, @file)
|
file = File.join(dir, @file)
|
||||||
validate_file(file, context.registers[:site].safe)
|
validate_file(file, context.registers[:site].safe)
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,19 @@ Jekyll expects all include files to be placed in an `_includes` directory at the
|
||||||
root of your source directory. This will embed the contents of
|
root of your source directory. This will embed the contents of
|
||||||
`<source>/_includes/footer.html` into the calling file.
|
`<source>/_includes/footer.html` into the calling file.
|
||||||
|
|
||||||
|
<div class="note">
|
||||||
|
<h5>ProTip™: Use variables as file name</h5>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The name of the file you wish to embed can be literal (as in the example above),
|
||||||
|
or you can use a variable, using liquid-like variable syntax as in
|
||||||
|
<code>{% raw %}{% include {{my_variable}} %}{% endraw %}</code>.
|
||||||
|
|
||||||
|
Note that unlike usual liquid variable syntax, you cannot have spaces inside the curly braces.
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
You can also pass parameters to an include:
|
You can also pass parameters to an include:
|
||||||
|
|
||||||
{% highlight ruby %}
|
{% highlight ruby %}
|
||||||
|
|
Loading…
Reference in New Issue