Merge branch 'master' of https://github.com/jekyll/jekyll into _includes

Conflicts:
	bin/jekyll
This commit is contained in:
Fabio Niephaus 2015-08-09 16:22:33 +01:00
commit 2812341c37
39 changed files with 602 additions and 135 deletions

View File

@ -5,7 +5,10 @@ rvm:
- 2.2
- 2.1
- 2.0
- jruby-head
- jruby-9.0.0.0
matrix:
allow_failures:
- rvm: jruby-9.0.0.0
env:
matrix:
- TEST_SUITE=test

View File

@ -31,16 +31,25 @@ Test Dependencies
-----------------
To run the test suite and build the gem you'll need to install Jekyll's
dependencies. Jekyll uses Bundler, so a quick run of the bundle command and
you're all set!
dependencies. Simply run this command to get all setup:
$ bundle
$ script/bootstrap
Before you start, run the tests and make sure that they pass (to confirm your
environment is configured properly):
$ bundle exec rake test
$ bundle exec rake features
$ script/cibuild
If you are only updating a file in `test/`, you can use the command:
$ script/test test/blah_test.rb
If you are only updating a `.feature` file, you can use the command:
$ script/cucumber features/blah.feature
Both `script/test` and `script/cucumber` can be run without arguments to
run its entire respective suite.
Workflow
--------
@ -48,10 +57,10 @@ Workflow
Here's the most direct way to get your work merged into the project:
* Fork the project.
* Clone down your fork ( `git clone git@github.com:<username>/jekyll.git` ).
* Clone down your fork ( `git clone git@github.com:[username]/jekyll.git` ).
* Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ).
* Hack away, add tests. Not necessarily in that order.
* Make sure everything still passes by running `rake`.
* Make sure everything still passes by running `script/cibuild`.
* If necessary, rebase your commits into logical chunks, without errors.
* Push the branch up ( `git push origin my_awesome_feature` ).
* Create a pull request against jekyll/jekyll and describe what your change
@ -74,11 +83,16 @@ requests directed at another branch will not be accepted.
The [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) on GitHub
can be freely updated without a pull request as all GitHub users have access.
If you want to add your plugin to the
[list of plugins](http://jekyllrb.com/docs/plugins/#available-plugins),
please submit a pull request modifying the
[plugins page source file](site/_docs/plugins.md) by adding a
link to your plugin under the proper subheading depending upon its type.
Gotchas
-------
* If you want to bump the gem version, please put that in a separate commit.
This way, the maintainers can control when the gem gets released.
* Please do not bump the gem version in your pull requests.
* Try to keep your patch(es) based from the latest commit on jekyll/jekyll.
The easier it is to apply your work, the less work the maintainers have to do,
which is always a good thing.

79
Gemfile
View File

@ -1,47 +1,54 @@
source 'https://rubygems.org'
gemspec
gem 'pry'
gem 'toml', '~> 0.1.0'
gem 'rake', '~> 10.1'
group :development do
gem 'rdoc', '~> 4.2'
gem 'launchy', '~> 2.3'
gem 'toml', '~> 0.1.0'
gem 'pry'
end
group :test do
gem 'redgreen', '~> 1.2'
gem 'shoulda', '~> 3.5'
gem 'cucumber', '~> 2.0'
gem 'simplecov', '~> 0.9'
gem 'jekyll_test_plugin'
gem 'jekyll_test_plugin_malicious'
gem 'minitest-reporters'
gem 'minitest-profile'
gem 'minitest'
gem 'rspec-mocks'
if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2")
gem 'test-unit'
end
if ENV['PROOF']
gem 'html-proofer', '~> 2.0'
end
end
group :benchmark do
if ENV['BENCHMARK']
gem 'ruby-prof'
gem 'rbtrace'
gem 'stackprof'
gem 'benchmark-ips'
end
end
gem 'jekyll-paginate', '~> 1.0'
gem 'jekyll-gist', '~> 1.0'
gem 'jekyll-coffeescript', '~> 1.0'
gem 'jekyll-gist', '~> 1.0'
gem 'mime-types', '~> 2.6'
gem 'kramdown', '~> 1.8.0'
platform :ruby, :mswin, :mingw do
gem 'pygments.rb', '~> 0.6.0'
gem 'rdiscount', '~> 2.0'
gem 'classifier-reborn', '~> 2.0'
gem 'pygments.rb', '~> 0.6.0'
gem 'redcarpet', '~> 3.2', '>= 3.2.3'
gem 'classifier-reborn', '~> 2.0'
gem 'liquid-c', '~> 3.0'
end
if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2")
gem 'test-unit'
end
gem 'rake', '~> 10.1'
gem 'rdoc', '~> 3.11'
gem 'redgreen', '~> 1.2'
gem 'shoulda', '~> 3.5'
gem 'cucumber', '1.3.18'
gem 'launchy', '~> 2.3'
gem 'simplecov', '~> 0.9'
gem 'mime-types', '~> 1.5'
gem 'kramdown', '~> 1.7.0'
gem 'jekyll_test_plugin'
gem 'jekyll_test_plugin_malicious'
gem 'minitest-reporters'
gem 'minitest-profile'
gem 'minitest'
gem 'rspec-mocks'
if ENV['BENCHMARK']
gem 'ruby-prof'
gem 'rbtrace'
gem 'stackprof'
gem 'benchmark-ips'
end
if ENV['PROOF']
gem 'html-proofer', '~> 2.0'
end

View File

@ -2,11 +2,12 @@
### Major Enhancements
* Add basic support for JRuby (commit: 0f4477)
* Liquid profiler (i.e. know how fast or slow your templates render) (#3762)
* Incremental regeneration (#3116)
* Add Hooks: a new kind of plugin (#3553)
* Drop support for Ruby 1.9.3. (#3235)
* Upgrade to Liquid 3.0.0 (#3002)
* Add basic support for JRuby (commit: 0f4477)
* Drop support for Ruby 1.9.3. (#3235)
* Support Ruby v2.2 (#3234)
* Support RDiscount 2 (#2767)
* Remove most runtime deps (#3323)
@ -17,6 +18,7 @@
* Sunset (i.e. remove) Maruku (#3655)
* Remove support for relative permalinks (#3679)
* Iterate over `site.collections` as an array instead of a hash. (#3670)
* Adapt StaticFile for collections, config defaults (#3823)
### Minor Enhancements
@ -78,6 +80,8 @@
* Performance: Sort files only once (#3707)
* Performance: Marshal metadata (#3706)
* Upgrade highlight wrapper from `div` to `figure` (#3779)
* Upgrade mime-types to `~> 2.6` (#3795)
* Update windows.md with Ruby version info (#3818)
### Bug Fixes
@ -114,6 +118,13 @@
* Incremental regeneration: handle deleted, renamed, and moved dependencies (#3717)
* Fix typo on line 19 of pagination.md (#3760)
* Fix it so that 'blog.html' matches 'blog.html' (#3732)
* Remove occasionally-problematic `ensure` in `LiquidRenderer` (#3811)
* Fixed an unclear code comment in site template SCSS (#3837)
* Fix reading of binary metadata file (#3845)
* Remove var collision with site template header menu iteration variable (#3838)
* Change non-existent `hl_linenos` to `hl_lines` to allow passthrough in safe mode (#3787)
* Add missing flag to disable the watcher (#3820)
* Update CI guide to include more direct explanations of the flow (#3891)
### Development Fixes
@ -144,6 +155,13 @@
* Force minitest version to 5.5.1 (#3657)
* Update the way cucumber accesses Minitest assertions (#3678)
* Add `script/rubyprof` to generate cachegrind callgraphs (#3692)
* Upgrade cucumber to 2.x (#3795)
* Update Kramdown. (#3853)
* Updated the scripts shebang for portability (#3858)
* Update JRuby testing to 9K ([3ab386f](https://github.com/jekyll/jekyll/commit/3ab386f1b096be25a24fe038fc70fd0fb08d545d))
* Organize dependencies into dev and test groups. (#3852)
* Contributing.md should refer to `script/cucumber` (#3894)
* Update contributing documentation to reflect workflow updates (#3895)
### Site Enhancements
@ -210,6 +228,11 @@
* Update link for navbars with data attributes tutorial (#3728)
* Add `jekyll-asciinema` to list of third-party plugins (#3750)
* Update pagination example to be agnostic to first pagination dir (#3763)
* Detailed instructions for rsync deployment method (#3848)
* Add Jekyll Portfolio Generator to list of plugins (#3883)
* Add `site.html_files` to variables docs (#3880)
* Add Static Publisher tool to list of deployment methods (#3865)
* Fix a few typos. (#3897)
## 2.5.3 / 2014-12-22

View File

@ -24,6 +24,7 @@ Mercenary.program(:jekyll) do |p|
p.option 'safe', '--safe', 'Safe mode (defaults to false)'
p.option 'plugins_dir', '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)'
p.option 'layouts_dir', '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)'
p.option 'profile', '--profile', 'Generate a Liquid rendering profile'
Jekyll::Command.subclasses.each { |c| c.init_with_program(p) }

View File

@ -66,6 +66,7 @@ module Jekyll
autoload :Regenerator, 'jekyll/regenerator'
autoload :RelatedPosts, 'jekyll/related_posts'
autoload :Renderer, 'jekyll/renderer'
autoload :LiquidRenderer, 'jekyll/liquid_renderer'
autoload :Site, 'jekyll/site'
autoload :StaticFile, 'jekyll/static_file'
autoload :Stevenson, 'jekyll/stevenson'

View File

@ -108,8 +108,8 @@ module Jekyll
# info - the info for Liquid
#
# Returns the converted content
def render_liquid(content, payload, info, path = nil)
Liquid::Template.parse(content).render!(payload, info)
def render_liquid(content, payload, info, path)
site.liquid_renderer.file(path).parse(content).render(payload, info)
rescue Tags::IncludeTagError => e
Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || self.path}"
raise e
@ -243,7 +243,7 @@ module Jekyll
payload["highlighter_prefix"] = converters.first.highlighter_prefix
payload["highlighter_suffix"] = converters.first.highlighter_suffix
self.content = render_liquid(content, payload, info) if render_with_liquid?
self.content = render_liquid(content, payload, info, path) if render_with_liquid?
self.content = transform
# output keeps track of what will finally be written

View File

@ -0,0 +1,39 @@
require 'jekyll/liquid_renderer/file'
require 'jekyll/liquid_renderer/table'
module Jekyll
class LiquidRenderer
def initialize(site)
@site = site
reset
end
def reset
@stats = {}
end
def file(filename)
filename = @site.in_source_dir(filename).sub(/\A#{Regexp.escape(@site.source)}\//, '')
LiquidRenderer::File.new(self, filename).tap do |file|
@stats[filename] ||= {}
@stats[filename][:count] ||= 0
@stats[filename][:count] += 1
end
end
def increment_bytes(filename, bytes)
@stats[filename][:bytes] ||= 0
@stats[filename][:bytes] += bytes
end
def increment_time(filename, time)
@stats[filename][:time] ||= 0.0
@stats[filename][:time] += time
end
def stats_table(n = 50)
LiquidRenderer::Table.new(@stats).to_s(n)
end
end
end

View File

@ -0,0 +1,50 @@
module Jekyll
class LiquidRenderer
class File
def initialize(renderer, filename)
@renderer = renderer
@filename = filename
end
def parse(content)
measure_time do
@template = Liquid::Template.parse(content)
end
self
end
def render(*args)
measure_time do
measure_bytes do
@template.render(*args)
end
end
end
def render!(*args)
measure_time do
measure_bytes do
@template.render!(*args)
end
end
end
private
def measure_bytes
yield.tap do |str|
@renderer.increment_bytes(@filename, str.bytesize)
end
end
def measure_time
before = Time.now
yield
ensure
after = Time.now
@renderer.increment_time(@filename, after - before)
end
end
end
end

View File

@ -0,0 +1,94 @@
module Jekyll
class LiquidRenderer::Table
def initialize(stats)
@stats = stats
end
def to_s(n = 50)
data = data_for_table(n)
widths = table_widths(data)
generate_table(data, widths)
end
private
def generate_table(data, widths)
str = "\n"
table_head = data.shift
str << generate_row(table_head, widths)
str << generate_table_head_border(table_head, widths)
data.each do |row_data|
str << generate_row(row_data, widths)
end
str << "\n"
str
end
def generate_table_head_border(row_data, widths)
str = ""
row_data.each_index do |cell_index|
str << '-' * widths[cell_index]
str << '-+-' unless cell_index == row_data.length-1
end
str << "\n"
str
end
def generate_row(row_data, widths)
str = ''
row_data.each_with_index do |cell_data, cell_index|
if cell_index == 0
str << cell_data.ljust(widths[cell_index], ' ')
else
str << cell_data.rjust(widths[cell_index], ' ')
end
str << ' | ' unless cell_index == row_data.length-1
end
str << "\n"
str
end
def table_widths(data)
widths = []
data.each do |row|
row.each_with_index do |cell, index|
widths[index] = [ cell.length, widths[index] ].compact.max
end
end
widths
end
def data_for_table(n)
sorted = @stats.sort_by{ |filename, file_stats| -file_stats[:time] }
sorted = sorted.slice(0, n)
table = [[ 'Filename', 'Count', 'Bytes', 'Time' ]]
sorted.each do |filename, file_stats|
row = []
row << filename
row << file_stats[:count].to_s
row << format_bytes(file_stats[:bytes])
row << "%.3f" % file_stats[:time]
table << row
end
table
end
def format_bytes(bytes)
bytes /= 1024.0
"%.2fK" % bytes
end
end
end

View File

@ -130,9 +130,7 @@ module Jekyll
#
# Returns nothing.
def write_metadata
File.open(metadata_file, 'wb') do |f|
f.write(Marshal.dump(metadata))
end
File.binwrite(metadata_file, Marshal.dump(metadata))
end
# Produce the absolute path of the metadata file
@ -158,7 +156,7 @@ module Jekyll
# Returns the read metadata.
def read_metadata
@metadata = if !disabled? && File.file?(metadata_file)
content = File.read(metadata_file)
content = File.binread(metadata_file)
begin
Marshal.load(content)

View File

@ -49,7 +49,7 @@ module Jekyll
output = document.content
if document.render_with_liquid?
output = render_liquid(output, payload, info)
output = render_liquid(output, payload, info, document.path)
end
output = convert(output)
@ -92,7 +92,7 @@ module Jekyll
#
# Returns the content, rendered by Liquid.
def render_liquid(content, payload, info, path = nil)
Liquid::Template.parse(content).render!(payload, info)
site.liquid_renderer.file(path).parse(content).render!(payload, info)
rescue Tags::IncludeTagError => e
Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || document.relative_path}"
raise e

View File

@ -11,7 +11,7 @@ module Jekyll
:gems, :plugin_manager
attr_accessor :converters, :generators, :reader
attr_reader :regenerator
attr_reader :regenerator, :liquid_renderer
# Public: Initialize a new Site.
#
@ -33,6 +33,8 @@ module Jekyll
# Initialize incremental regenerator
@regenerator = Regenerator.new(self)
@liquid_renderer = LiquidRenderer.new(self)
self.plugin_manager = Jekyll::PluginManager.new(self)
self.plugins = plugin_manager.plugins_path
@ -57,6 +59,13 @@ module Jekyll
render
cleanup
write
print_stats
end
def print_stats
if @config['profile']
puts @liquid_renderer.stats_table
end
end
# Reset Site details.
@ -70,7 +79,8 @@ module Jekyll
self.static_files = []
self.data = {}
@collections = nil
@regenerator.clear_cache()
@regenerator.clear_cache
@liquid_renderer.reset
if limit_posts < 0
raise ArgumentError, "limit_posts must be a non-negative number"
@ -319,7 +329,6 @@ module Jekyll
end.to_a
end
def each_site_file
%w(posts pages static_files docs_to_write).each do |type|
send(type).each do |item|

View File

@ -37,7 +37,7 @@ module Jekyll
def destination_rel_dir
if @collection
@dir.gsub(/\A_/, '')
File.dirname(url)
else
@dir
end
@ -61,9 +61,10 @@ module Jekyll
# Whether to write the file to the filesystem
#
# Returns true.
# Returns true unless the defaults for the destination path from
# _config.yml contain `published: false`.
def write?
true
defaults.fetch('published', true)
end
# Write the static file to the destination directory (if modified).
@ -100,5 +101,41 @@ module Jekyll
"path" => File.join("", relative_path)
}
end
def placeholders
{
collection: @collection.label,
path: relative_path[
@collection.relative_directory.size..relative_path.size],
output_ext: '',
name: '',
title: '',
}
end
# Applies a similar URL-building technique as Jekyll::Document that takes
# the collection's URL template into account. The default URL template can
# be overriden in the collection's configuration in _config.yml.
def url
@url ||= if @collection.nil?
relative_path
else
::Jekyll::URL.new({
template: @collection.url_template,
placeholders: placeholders,
})
end.to_s.gsub /\/$/, ''
end
# Returns the type of the collection if present, nil otherwise.
def type
@type ||= @collection.nil? ? nil : @collection.label.to_sym
end
# Returns the front matter defaults defined for the file's URL and/or type
# as defined in _config.yml.
def defaults
@defaults ||= @site.frontmatter_defaults.all url, type
end
end
end

View File

@ -64,7 +64,7 @@ eos
if is_safe
Hash[[
[:startinline, opts.fetch(:startinline, nil)],
[:hl_linenos, opts.fetch(:hl_linenos, nil)],
[:hl_lines, opts.fetch(:hl_lines, nil)],
[:linenos, opts.fetch(:linenos, nil)],
[:encoding, opts.fetch(:encoding, 'utf-8')],
[:cssclass, opts.fetch(:cssclass, nil)]

View File

@ -94,7 +94,7 @@ eos
# Render the variable if required
def render_variable(context)
if @file.match(VARIABLE_SYNTAX)
partial = Liquid::Template.parse(@file)
partial = context.registers[:site].liquid_renderer.file("(variable)").parse(@file)
partial.render!(context)
end
end
@ -123,7 +123,7 @@ eos
end
begin
partial = Liquid::Template.parse(read_file(path, context))
partial = site.liquid_renderer.file(path).parse(read_file(path, context))
context.stack do
context['include'] = parse_params(context) if @params

View File

@ -1,3 +1,3 @@
module Jekyll
VERSION = '3.0.0.pre.beta6'
VERSION = '3.0.0.pre.beta8'
end

View File

@ -14,9 +14,9 @@
</a>
<div class="trigger">
{% for page in site.pages %}
{% if page.title %}
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
{% for my_page in site.pages %}
{% if my_page.title %}
<a class="page-link" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a>
{% endif %}
{% endfor %}
</div>

2
lib/site_template/css/main.scss Executable file → Normal file
View File

@ -30,7 +30,7 @@ $on-laptop: 800px;
// Using media queries with like this:
// Use media queries like this:
// @include media-query($on-palm) {
// .wrapper {
// padding-right: $spacing-unit / 2;

View File

@ -1,4 +1,4 @@
#!/bin/sh
#!/usr/bin/env bash
script/branding
bundle install -j8

View File

@ -1,4 +1,4 @@
#! /bin/bash
#!/usr/bin/env bash
echo " ---------------------------------------------------------- "
echo " _ ______ _ __ __ __ _ _ "

View File

@ -1,4 +1,4 @@
#! /bin/bash -e
#!/usr/bin/env bash
script/branding

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
if ruby --version | grep -q "jruby"
then

View File

@ -1,4 +1,4 @@
#! /bin/bash
#!/usr/bin/env bash
#
# Usage:
# script/proof

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
#
# rebund(1)
#

View File

@ -1,4 +1,5 @@
#!/usr/bin/env bash
export BENCHMARK=1
TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site', 'full_rebuild' => true})"

View File

@ -1,4 +1,5 @@
#! /bin/bash -e
#!/usr/bin/env bash
set -e
# Usage:
# script/test <test_file>

View File

@ -180,7 +180,7 @@ class="flag">flags</code> (specified on the command-line) that control them.
<p class="description">Enable auto-regeneration of the site when files are modified.</p>
</td>
<td class="align-center">
<p><code class="flag">-w, --watch</code></p>
<p><code class="flag">-w, --[no-]watch</code></p>
</td>
</tr>
<tr class="setting">

View File

@ -34,6 +34,8 @@ This tool checks your resulting site to ensure all links and images exist.
Utilize it either with the convenient `htmlproof` command-line executable,
or write a Ruby script which utilizes the gem.
Save the commands you want to run and succeed in a file: `./script/cibuild`
### The HTML Proofer Executable
{% highlight bash %}
@ -48,6 +50,12 @@ Some options can be specified via command-line switches. Check out the
`html-proofer` README for more information about these switches, or run
`htmlproof --help` locally.
For example to avoid testing external sites, use this command:
{% highlight bash %}
$ bundle exec htmlproof ./_site --disable-external
{% endhighlight %}
### The HTML Proofer Library
You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile):
@ -81,15 +89,21 @@ gem "jekyll"
gem "html-proofer"
{% endhighlight %}
Your `.travis.yml` file should look like this:
{% highlight yaml %}
language: ruby
rvm:
- 2.1
# Assume bundler is being used, install step will run `bundle install`.
before_script:
- chmod +x ./script/cibuild # or do this locally and commit
# Assume bundler is being used, therefore
# the `install` step will run `bundle install` by default.
script: ./script/cibuild
# branch whitelist
# branch whitelist, only for GitHub Pages
branches:
only:
- gh-pages # test the gh-pages branch
@ -118,6 +132,16 @@ RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This
directive tells Travis the Ruby version to use when running your test
script.
{% highlight yaml %}
before_script:
- chmod +x ./script/cibuild
{% endhighlight %}
The build script file needs to have the *executable* attribute set or
Travis will fail with a permission denied error. You can also run this
locally and commit the permissions directly, thus rendering this step
irrelevant.
{% highlight yaml %}
script: ./script/cibuild
{% endhighlight %}
@ -136,7 +160,7 @@ script: jekyll build && htmlproof ./_site
The `script` directive can be absolutely any valid shell command.
{% highlight yaml %}
# branch whitelist
# branch whitelist, only for GitHub Pages
branches:
only:
- gh-pages # test the gh-pages branch
@ -152,7 +176,8 @@ a pull request flow for proposing changes, you may wish to enforce a
convention for your builds such that all branches containing edits are
prefixed, exemplified above with the `/pages-(.*)/` regular expression.
The `branches` directive is completely optional.
The `branches` directive is completely optional. Travis will build from every
push to any branch of your repo if leave it out.
{% highlight yaml %}
env:
@ -177,10 +202,20 @@ environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`.
exclude: [vendor]
{% endhighlight %}
### Troubleshooting
**Travis error:** *"You are trying to install in deployment mode after changing
your Gemfile. Run bundle install elsewhere and add the updated Gemfile.lock
to version control."*
**Workaround:** Either run `bundle install` locally and commit your changes to
`Gemfile.lock`, or remove the `Gemfile.lock` file from your repository and add
an entry in the `.gitignore` file to avoid it from being checked in again.
### Questions?
This entire guide is open-source. Go ahead and [edit it][3] if you have a
fix or [ask for help][4] if you run into trouble and need some help.
[3]: https://github.com/jekyll/jekyll/edit/master/site/_docs/continuous-integration.md
[4]: https://github.com/jekyll/jekyll-help#how-do-i-ask-a-question
[4]: http://jekyllrb.com/help/

View File

@ -7,10 +7,12 @@ permalink: /docs/contributing/
So you've got an awesome idea to throw into Jekyll. Great! Please keep the
following in mind:
* **Use https://talk.jekyllrb.com for non-technical or indirect Jekyll questions that are not bugs.**
* **Contributions will not be accepted without tests or necessary documentation updates.**
* If you're creating a small fix or patch to an existing feature, just a simple
test will do. Please stay in the confines of the current test suite and use
[Shoulda](https://github.com/thoughtbot/shoulda/tree/master) and
[RSpec Mocks](https://github.com/rspec/rspec-mocks/).
[RSpec-Mocks](https://github.com/rspec/rspec-mocks).
* If it's a brand new feature, make sure to create a new
[Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps
where appropriate. Also, whipping up some documentation in your fork's `site`
@ -36,24 +38,30 @@ following in mind:
</p>
</div>
Test Dependencies
-----------------
To run the test suite and build the gem you'll need to install Jekyll's
dependencies. Jekyll uses Bundler, so a quick run of the `bundle` command and
you're all set!
dependencies. Simply run this command to get all setup:
{% highlight bash %}
$ bundle
{% endhighlight %}
$ script/bootstrap
Before you start, run the tests and make sure that they pass (to confirm your
environment is configured properly):
{% highlight bash %}
$ bundle exec rake test
$ bundle exec rake features
{% endhighlight %}
$ script/cibuild
If you are only updating a file in `test/`, you can use the command:
$ script/test test/blah_test.rb
If you are only updating a `.feature` file, you can use the command:
$ script/cucumber features/blah.feature
Both `script/test` and `script/cucumber` can be run without arguments to
run its entire respective suite.
Workflow
--------
@ -61,30 +69,14 @@ Workflow
Here's the most direct way to get your work merged into the project:
* Fork the project.
* Clone down your fork:
{% highlight bash %}
git clone git://github.com/<username>/jekyll.git
{% endhighlight %}
* Create a topic branch to contain your change:
{% highlight bash %}
git checkout -b my_awesome_feature
{% endhighlight %}
* Clone down your fork ( `git clone git@github.com:[username]/jekyll.git` ).
* Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ).
* Hack away, add tests. Not necessarily in that order.
* Make sure everything still passes by running `rake`.
* Make sure everything still passes by running `script/cibuild`.
* If necessary, rebase your commits into logical chunks, without errors.
* Push the branch up:
{% highlight bash %}
git push origin my_awesome_feature
{% endhighlight %}
* Create a pull request against jekyll/jekyll:master and describe what your
change does and the why you think it should be merged.
* Push the branch up ( `git push origin my_awesome_feature` ).
* Create a pull request against jekyll/jekyll and describe what your change
does and the why you think it should be merged.
Updating Documentation
----------------------
@ -101,8 +93,7 @@ All documentation pull requests should be directed at `master`. Pull
requests directed at another branch will not be accepted.
The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub
can be freely updated without a pull request as all
GitHub users have access.
can be freely updated without a pull request as all GitHub users have access.
If you want to add your plugin to the [list of plugins](/docs/plugins/#available-plugins),
please submit a pull request modifying the [plugins page source
@ -112,14 +103,15 @@ link to your plugin under the proper subheading depending upon its type.
Gotchas
-------
* If you want to bump the gem version, please put that in a separate commit.
This way, the maintainers can control when the gem gets released.
* Please do not bump the gem version in your pull requests.
* Try to keep your patch(es) based from the latest commit on jekyll/jekyll.
The easier it is to apply your work, the less work the maintainers have to
do, which is always a good thing.
* Please don't tag your GitHub issue with \[fix\], \[feature\], etc. The
maintainers actively read the issues and will label it once they come across
it.
The easier it is to apply your work, the less work the maintainers have to do,
which is always a good thing.
* Please don't tag your GitHub issue with [fix], [feature], etc. The maintainers
actively read the issues and will label it once they come across it.
Finally...
----------
<div class="note">
<h5>Let us know what could be better!</h5>

View File

@ -84,16 +84,82 @@ host your site directly on a CDN or file host like S3.
Setup steps are fully documented
[in the `jekyll-hook` repo](https://github.com/developmentseed/jekyll-hook).
### Static Publisher
[Static Publisher](https://github.com/static-publisher/static-publisher) is another automated deployment option with a server listening for webhook posts, though it's not tied to GitHub specifically. It has a one-click deploy to Heroku, it can watch multiple projects from one server, it has an easy to user admin interface and can publish to either S3 or to a git repository (e.g. gh-pages).
### Rake
Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimweirich/rake), [HighLine](https://github.com/JEG2/highline), and
[Net::SSH](https://github.com/net-ssh/net-ssh). A more complex example of deploying Jekyll with Rake that deals with multiple branches can be found in [Git Ready](https://github.com/gitready/gitready/blob/cdfbc4ec5321ff8d18c3ce936e9c749dbbc4f190/Rakefile).
### scp
Once youve generated the `_site` directory, you can easily scp it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy). Youd obviously need to change the values to reflect your sites details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run this script from within Textmate.
### rsync
Once youve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy). Youd obviously need to change the values to reflect your sites details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run
this script from within Textmate.
Once youve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/vitalyrepin/vrepinblog/blob/master/transfer.sh). Youd obviously need to change the values to reflect your sites details.
#### Step 1: Install rrsync to your home folder (server-side)
We will use certificate-based authorization to simplify the publishing process. It makes sense to restrict rsync access only to the directory which it is supposed to sync.
That's why rrsync wrapper shall be installed. If it is not already installed by your hoster you can do it yourself:
- [download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync)
- Put it to the bin subdirectory of your home folder (```~/bin```)
- Make it executable (```chmod +x```)
#### Step 2: Setup certificate-based ssh access (server side)
[This process is described in a lot of places in the net](https://wiki.gentoo.org/wiki/SSH#Passwordless_Authentication). We will not cover it here. What is different from usual approach is to put the restriction to certificate-based authorization in ```~/.ssh/authorized_keys```). We will launch ```rrsync``` utility and supply it with the folder it shall have read-write access to:
```
command="$HOME/bin/rrsync <folder>",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa <cert>
```
```<folder>``` is the path to your site. E.g., ```~/public_html/you.org/blog-html/```.
#### Step 3: Rsync! (client-side)
Add the script ```deploy``` to the web site source folder:
{% highlight bash %}
#!/bin/sh
rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded <folder> <user>@<site>:
{% endhighlight %}
Command line parameters are:
- ```--rsh='ssh -p2222'``` It is needed if your hoster provides ssh access using ssh port different from default one (e.g., this is what hostgator is doing)
- ```<folder>``` is the name of the local folder with generated web content. By default it is ```_site/``` for Jekyll
- ```<user>``` &mdash; ssh user name for your hosting account
- ```<site>``` &mdash; your hosting server
Example command line is:
{% highlight bash %}
rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@vrepin.org:
{% endhighlight %}
Don't forget column ':' after server name!
#### Optional step 4: exclude transfer.sh from being copied to the output folder by Jekyll
This step is recommended if you use this how-to to deploy Jekyll-based web site. If you put ```deploy``` script to the root folder of your project, Jekyll copies it to the output folder.
This behavior can be changed in ```_config.yml```. Just add the following line there:
{% highlight yaml %}
# Do not copy these file to the output directory
exclude: ["deploy"]
{% endhighlight %}
#### We are done!
Now it's possible to publish your web site by launching ```deploy``` script. If your ssh certificate is [passphrase-protected](https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html), you are asked to enter the password.
## Rack-Jekyll

View File

@ -711,6 +711,7 @@ LESS.js files during generation.
- [Jekyll::GitMetadata by Ivan Tse](https://github.com/ivantsepp/jekyll-git_metadata): Expose Git metadata for your templates.
- [Jekyll Http Basic Auth Plugin](https://gist.github.com/snrbrnjna/422a4b7e017192c284b3): Plugin to manage http basic auth for jekyll generated pages and directories.
- [Jekyll Auto Image by Merlos](https://github.com/merlos/jekyll-auto-image): Gets the first image of a post. Useful to list your posts with images or to add [twitter cards](https://dev.twitter.com/cards/overview) to your site.
- [Jekyll Portfolio Generator by Shannon Babincsak](https://github.com/codeinpink/jekyll-portfolio-generator): Generates project pages and computes related projects out of project data files.
#### Converters
@ -744,7 +745,7 @@ LESS.js files during generation.
- [Smilify](https://github.com/SaswatPadhi/jekyll_smilify) by [SaswatPadhi](https://github.com/SaswatPadhi): Convert text emoticons in your content to themeable smiley pics.
- [Read in X Minutes](https://gist.github.com/zachleat/5792681) by [zachleat](https://github.com/zachleat): Estimates the reading time of a string (for blog post content).
- [Jekyll-timeago](https://github.com/markets/jekyll-timeago): Converts a time value to the time ago in words.
- [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a gramatically-correct amount like “1 minute” or “2 minute**s**”.
- [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a grammatically-correct amount like “1 minute” or “2 minute**s**”.
- [reading_time](https://github.com/bdesham/reading_time): Count words and estimate reading time for a piece of text, ignoring HTML elements that are unlikely to contain running text.
- [Table of Content Generator](https://github.com/dafi/jekyll-toc-generator): Generate the HTML code containing a table of content (TOC), the TOC can be customized in many way, for example you can decide which pages can be without TOC.
- [jekyll-humanize](https://github.com/23maverick23/jekyll-humanize): This is a port of the Django app humanize which adds a "human touch" to data. Each method represents a Fluid type filter that can be used in your Jekyll site templates. Given that Jekyll produces static sites, some of the original methods do not make logical sense to port (e.g. naturaltime).

View File

@ -125,7 +125,15 @@ following is a reference of the available data.
<td><p><code>site.html_pages</code></p></td>
<td><p>
A list of all HTML Pages.
A subset of `site.pages` listing those which end in `.html`.
</p></td>
</tr>
<tr>
<td><p><code>site.html_files</code></p></td>
<td><p>
A subset of `site.static_files` listing those which end in `.html`.
</p></td>
</tr>

View File

@ -12,6 +12,8 @@ knowledge and lessons that have been unearthed by Windows users.
Julian Thilo has written up instructions to get
[Jekyll running on Windows][windows-installation] and it seems to work for most.
The instructions were written for Ruby 2.0.0, but should work for later versions
[prior to 2.2][hitimes-issue].
## Encoding
@ -28,6 +30,7 @@ $ chcp 65001
{% endhighlight %}
[windows-installation]: http://jekyll-windows.juthilo.com/
[hitimes-issue]: https://github.com/copiousfreetime/hitimes/issues/40
## Auto-regeneration

View File

@ -0,0 +1,26 @@
require 'helper'
class TestLiquidRenderer < JekyllUnitTest
context "profiler" do
setup do
@site = Site.new(site_configuration)
@renderer = @site.liquid_renderer
end
should "return a table with profiling results" do
@site.process
output = @renderer.stats_table
expected = [
/^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$/,
/^-+\++-+\++-+\++-+$/,
/^_posts\/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$/,
]
expected.each do |regexp|
assert_match regexp, output
end
end
end
end

View File

@ -49,7 +49,7 @@ class TestRegenerator < JekyllUnitTest
@regenerator = Regenerator.new(@site)
# these should pass, since nothing has changed, and the
# loop above made sure the desinations exist
# loop above made sure the designations exist
assert !@regenerator.regenerate?(@page)
assert !@regenerator.regenerate?(@post)
assert !@regenerator.regenerate?(@document)

View File

@ -310,7 +310,7 @@ class TestSite < JekyllUnitTest
custom_processor = "CustomMarkdown"
s = Site.new(site_configuration('markdown' => custom_processor))
assert !!s.process
s.process
# Do some cleanup, we don't like straggling stuff's.
Jekyll::Converters::Markdown.send(:remove_const, :CustomMarkdown)
@ -459,6 +459,17 @@ class TestSite < JekyllUnitTest
end
end
context "with liquid profiling" do
setup do
@site = Site.new(site_configuration('profile' => true))
end
should "print profile table" do
@site.liquid_renderer.should_receive(:stats_table)
@site.process
end
end
context "incremental build" do
setup do
@site = Site.new(site_configuration({

View File

@ -18,6 +18,16 @@ class TestStaticFile < JekyllUnitTest
StaticFile.new(@site, base, dir, name)
end
def setup_static_file_with_collection(base, dir, name, label, metadata)
site = fixture_site 'collections' => {label => metadata}
StaticFile.new(site, base, dir, name, site.collections[label])
end
def setup_static_file_with_defaults(base, dir, name, defaults)
site = fixture_site 'defaults' => defaults
StaticFile.new(site, base, dir, name)
end
context "A StaticFile" do
setup do
clear_dest
@ -46,7 +56,44 @@ class TestStaticFile < JekyllUnitTest
should "have a destination relative directory without a collection" do
static_file = setup_static_file("root", "dir/subdir", "file.html")
assert "dir/subdir", static_file.destination_rel_dir
assert_equal nil, static_file.type
assert_equal "dir/subdir/file.html", static_file.url
assert_equal "dir/subdir", static_file.destination_rel_dir
end
should "have a destination relative directory with a collection" do
static_file = setup_static_file_with_collection(
"root", "_foo/dir/subdir", "file.html", "foo", {"output" => true})
assert_equal :foo, static_file.type
assert_equal "/foo/dir/subdir/file.html", static_file.url
assert_equal "/foo/dir/subdir", static_file.destination_rel_dir
end
should "use its collection's permalink template for the destination relative directory" do
static_file = setup_static_file_with_collection(
"root", "_foo/dir/subdir", "file.html", "foo",
{"output" => true, "permalink" => "/:path/"})
assert_equal :foo, static_file.type
assert_equal "/dir/subdir/file.html", static_file.url
assert_equal "/dir/subdir", static_file.destination_rel_dir
end
should "be writable by default" do
static_file = setup_static_file("root", "dir/subdir", "file.html")
assert(static_file.write?,
"static_file.write? should return true by default")
end
should "use the _config.yml defaults to determine writability" do
defaults = [{
"scope" => {"path" => "private"},
"values" => {"published" => false}
}]
static_file = setup_static_file_with_defaults(
"root", "private/dir/subdir", "file.html", defaults)
assert(!static_file.write?,
"static_file.write? should return false when _config.yml sets " +
"`published: false`")
end
should "know its last modification time" do

View File

@ -114,9 +114,9 @@ CONTENT
assert_equal true, sanitized[:linenos]
end
should "allow hl_linenos" do
sanitized = @tag.sanitized_opts({:hl_linenos => %w[1 2 3 4]}, true)
assert_equal %w[1 2 3 4], sanitized[:hl_linenos]
should "allow hl_lines" do
sanitized = @tag.sanitized_opts({:hl_lines => %w[1 2 3 4]}, true)
assert_equal %w[1 2 3 4], sanitized[:hl_lines]
end
should "allow cssclass" do